Full Code of esdoc/esdoc-plugins for AI

master 2de5022baa56 cached
605 files
543.1 KB
170.0k tokens
669 symbols
1 requests
Download .txt
Showing preview only (685K chars total). Download the full file or copy to clipboard to get everything.
Repository: esdoc/esdoc-plugins
Branch: master
Commit: 2de5022baa56
Files: 605
Total size: 543.1 KB

Directory structure:
gitextract_msrci168/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── _template/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-accessor-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-brand-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   └── publish-html-mock-plugin.js
│       ├── package.json
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-coverage-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-ecmascript-proposal-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── AsyncGenerators.js
│       │   ├── ClassProperties.js
│       │   ├── Decorators.js
│       │   ├── DoExpressions.js
│       │   ├── DynamicImport.js
│       │   ├── ECMAScriptProposal.test.js
│       │   ├── ExportExtensions.js
│       │   ├── FunctionBind.js
│       │   ├── FunctionSent.js
│       │   └── ObjectRestSpread.js
│       └── util.js
├── esdoc-exclude-source-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-external-ecmascript-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   └── external-ecmascript.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-external-nodejs-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   └── external-nodejs.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-external-webapi-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   └── external-webapi.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-flow-type-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── FlowType.js
│       │   └── FlowType.test.js
│       └── util.js
├── esdoc-importpath-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── package.json
│       ├── src/
│       │   ├── Index.js
│       │   ├── MyClass1.js
│       │   ├── MyClass2.js
│       │   └── all.test.js
│       └── util.js
├── esdoc-inject-gtm-plugin/
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   └── publish-html-mock-plugin.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-inject-script-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   ├── inject.js
│       │   └── publish-html-mock-plugin.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-inject-style-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   ├── inject.css
│       │   └── publish-html-mock-plugin.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-integrate-manual-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── CHANGELOG.md
│       ├── esdoc.json
│       ├── init.js
│       ├── manual/
│       │   ├── advanced.md
│       │   ├── all.test.js
│       │   ├── configuration.md
│       │   ├── design.md
│       │   ├── example.md
│       │   ├── faq.md
│       │   ├── index.md
│       │   ├── installation.md
│       │   ├── overview.md
│       │   ├── tutorial.md
│       │   ├── usage1.md
│       │   └── usage2.md
│       ├── src/
│       │   └── Dummy.js
│       └── util.js
├── esdoc-integrate-test-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   ├── TestDoc.js
│   │   ├── TestDocFactory.js
│   │   └── TestFileDoc.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   └── Dummy.js
│       ├── test/
│       │   ├── Test.js
│       │   └── Test.test.js
│       └── util.js
├── esdoc-jsx-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-lint-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyArrowFunction.js
│           ├── MyClass.js
│           └── results.test.js
├── esdoc-publish-html-plugin/
│   ├── .babelrc
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Builder/
│   │   │   ├── ClassDocBuilder.js
│   │   │   ├── DocBuilder.js
│   │   │   ├── DocResolver.js
│   │   │   ├── FileDocBuilder.js
│   │   │   ├── IdentifiersDocBuilder.js
│   │   │   ├── IndexDocBuilder.js
│   │   │   ├── ManualDocBuilder.js
│   │   │   ├── SearchIndexBuilder.js
│   │   │   ├── SingleDocBuilder.js
│   │   │   ├── SourceDocBuilder.js
│   │   │   ├── StaticFileBuilder.js
│   │   │   ├── TestDocBuilder.js
│   │   │   ├── TestFileDocBuilder.js
│   │   │   ├── template/
│   │   │   │   ├── class.html
│   │   │   │   ├── css/
│   │   │   │   │   ├── github.css
│   │   │   │   │   ├── identifiers.css
│   │   │   │   │   ├── manual.css
│   │   │   │   │   ├── prettify-tomorrow.css
│   │   │   │   │   ├── search.css
│   │   │   │   │   ├── source.css
│   │   │   │   │   ├── style.css
│   │   │   │   │   └── test.css
│   │   │   │   ├── details.html
│   │   │   │   ├── file.html
│   │   │   │   ├── identifiers.html
│   │   │   │   ├── index.html
│   │   │   │   ├── layout.html
│   │   │   │   ├── manual.html
│   │   │   │   ├── manualCardIndex.html
│   │   │   │   ├── manualIndex.html
│   │   │   │   ├── nav.html
│   │   │   │   ├── properties.html
│   │   │   │   ├── script/
│   │   │   │   │   ├── inherited-summary.js
│   │   │   │   │   ├── inner-link.js
│   │   │   │   │   ├── manual.js
│   │   │   │   │   ├── patch-for-local.js
│   │   │   │   │   ├── prettify/
│   │   │   │   │   │   ├── Apache-License-2.0.txt
│   │   │   │   │   │   └── prettify.js
│   │   │   │   │   ├── pretty-print.js
│   │   │   │   │   ├── search.js
│   │   │   │   │   └── test-summary.js
│   │   │   │   ├── single.html
│   │   │   │   ├── source.html
│   │   │   │   ├── summary.html
│   │   │   │   ├── test.html
│   │   │   │   └── testInterface.html
│   │   │   └── util.js
│   │   └── Plugin.js
│   └── test/
│       ├── fixture/
│       │   ├── CHANGELOG.md
│       │   ├── README.md
│       │   ├── esdoc.json
│       │   ├── manual/
│       │   │   ├── advanced.md
│       │   │   ├── configuration.md
│       │   │   ├── design.md
│       │   │   ├── example.md
│       │   │   ├── faq.md
│       │   │   ├── index.md
│       │   │   ├── installation.md
│       │   │   ├── overview.md
│       │   │   ├── tutorial.md
│       │   │   ├── usage1.md
│       │   │   └── usage2.md
│       │   ├── package.json
│       │   ├── src/
│       │   │   ├── Abstract/
│       │   │   │   ├── Definition.js
│       │   │   │   └── Override.js
│       │   │   ├── Access/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── Method.js
│       │   │   │   ├── Property.js
│       │   │   │   └── Variable.js
│       │   │   ├── Async/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Class/
│       │   │   │   └── Definition.js
│       │   │   ├── ClassProperty/
│       │   │   │   └── Definition.js
│       │   │   ├── Computed/
│       │   │   │   ├── Method.js
│       │   │   │   └── Property.js
│       │   │   ├── Decorator/
│       │   │   │   └── Definition.js
│       │   │   ├── Deprecated/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Desc/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── Markdown.js
│       │   │   │   ├── MultiLine.js
│       │   │   │   └── Variable.js
│       │   │   ├── Destructuring/
│       │   │   │   ├── Array.js
│       │   │   │   └── Object.js
│       │   │   ├── Duplication/
│       │   │   │   └── Definition.js
│       │   │   ├── Emits/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Example/
│       │   │   │   ├── Caption.js
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Experimental/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── ExponentiationOperator/
│       │   │   │   └── Definition.js
│       │   │   ├── Export/
│       │   │   │   ├── AnonymousClass.js
│       │   │   │   ├── AnonymousFunction.js
│       │   │   │   ├── ArrowFunction.js
│       │   │   │   ├── Class.js
│       │   │   │   ├── ClassIndirectDefault.js
│       │   │   │   ├── Default.js
│       │   │   │   ├── Extends.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── FunctionIndirectDefault.js
│       │   │   │   ├── Multiple.js
│       │   │   │   ├── Named.js
│       │   │   │   ├── NewExpression.js
│       │   │   │   ├── NewExpressionIndirect.js
│       │   │   │   ├── NewExpressionProperty.js
│       │   │   │   ├── Variable.js
│       │   │   │   └── VariableIndirectDefault.js
│       │   │   ├── Extends/
│       │   │   │   ├── Builtin.js
│       │   │   │   ├── Deep.js
│       │   │   │   ├── Expression.js
│       │   │   │   ├── Inner.js
│       │   │   │   ├── Mixin.js
│       │   │   │   ├── Outer.js
│       │   │   │   └── Property.js
│       │   │   ├── External/
│       │   │   │   └── Definition.js
│       │   │   ├── Generator/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Ignore/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Interface/
│       │   │   │   ├── Definition.js
│       │   │   │   └── Implements.js
│       │   │   ├── Invalid/
│       │   │   │   ├── CodeSyntax.js
│       │   │   │   └── DocSyntax.js
│       │   │   ├── Link/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Listens/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Param/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Property/
│       │   │   │   └── Return.js
│       │   │   ├── Return/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── See/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Since/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Throws/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Todo/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── TrailingComma/
│       │   │   │   └── Definition.js
│       │   │   ├── Type/
│       │   │   │   ├── Array.js
│       │   │   │   ├── Class.js
│       │   │   │   ├── Complex.js
│       │   │   │   ├── Default.js
│       │   │   │   ├── External.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── Generics.js
│       │   │   │   ├── Literal.js
│       │   │   │   ├── Nullable.js
│       │   │   │   ├── Object.js
│       │   │   │   ├── Optional.js
│       │   │   │   ├── Record.js
│       │   │   │   ├── Spread.js
│       │   │   │   ├── Typedef.js
│       │   │   │   └── Union.js
│       │   │   ├── Typedef/
│       │   │   │   └── Definition.js
│       │   │   ├── Undocument/
│       │   │   │   └── Definition.js
│       │   │   ├── Unknown/
│       │   │   │   └── Definition.js
│       │   │   ├── Variable/
│       │   │   │   ├── ArrayPattern.js
│       │   │   │   ├── Definition.js
│       │   │   │   └── ObjectPattern.js
│       │   │   └── Version/
│       │   │       ├── Class.js
│       │   │       ├── Function.js
│       │   │       └── Variable.js
│       │   └── test/
│       │       └── DescTest.js
│       └── src/
│           ├── DocumentTest/
│           │   ├── AbstractTest/
│           │   │   ├── DefinitionTest.js
│           │   │   └── OverrideTest.js
│           │   ├── AsyncTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── ClassPropertyTest/
│           │   │   └── DefinitionTest.js
│           │   ├── ClassTest/
│           │   │   └── DefinitionTest.js
│           │   ├── ComputedTest/
│           │   │   ├── MethodTest.js
│           │   │   └── PropertyTest.js
│           │   ├── DecoratorTest/
│           │   │   └── DefinitionTest.js
│           │   ├── DeprecatedTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── DescTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   ├── MarkdownTest.js
│           │   │   ├── MultiLineTest.js
│           │   │   └── VariableTest.js
│           │   ├── DestructuringTest/
│           │   │   ├── ArrayTest.js
│           │   │   └── ObjectTest.js
│           │   ├── DuplicationTest/
│           │   │   └── DefinitionTest.js
│           │   ├── EmitsTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── ExamleTest/
│           │   │   ├── CaptionTest.js
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ExperimentalTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ExponentialOperatorTest/
│           │   │   └── DefinitionTest.js
│           │   ├── ExportTest/
│           │   │   ├── AnonymousClassTest.js
│           │   │   ├── AnonymousFunctionTest.js
│           │   │   ├── ArrowFunctionTest.js
│           │   │   ├── ClassIndirectDefaultTest.js
│           │   │   ├── ClassTest.js
│           │   │   ├── DefaultTest.js
│           │   │   ├── ExtendTest.js
│           │   │   ├── FunctionIndirectDefaultTest.js
│           │   │   ├── FunctionTest.js
│           │   │   ├── MultipleTest.js
│           │   │   ├── NamedTest.js
│           │   │   ├── NewExpressionIndirectTest.js
│           │   │   ├── NewExpressionPropertyTest.js
│           │   │   ├── NewExpressionTest.js
│           │   │   ├── VariableIndirectDefaultTest.js
│           │   │   └── VariableTest.js
│           │   ├── ExtendsTest/
│           │   │   ├── BuiltinTest.js
│           │   │   ├── DeepTest.js
│           │   │   ├── ExpressionTest.js
│           │   │   ├── InnerTest.js
│           │   │   ├── MixinTest.js
│           │   │   ├── OuterTest.js
│           │   │   └── PropertyTest.js
│           │   ├── ExternalTest/
│           │   │   └── DefinitionTest.js
│           │   ├── GeneratorTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── IgnoreTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── InterfaceTest/
│           │   │   ├── DefinitionTest.js
│           │   │   └── ImplementsTest.js
│           │   ├── LinkTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ListensTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── ParamTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── PropertyTest/
│           │   │   └── ReturnTest.js
│           │   ├── ReturnTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── SeeTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── SinceTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ThrowsTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── TodoTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── TrailingCommaTest/
│           │   │   └── DefinitionTest.js
│           │   ├── TypeTest/
│           │   │   ├── ArrayTest.js
│           │   │   ├── ClassTest.js
│           │   │   ├── ComplexTest.js
│           │   │   ├── DefaultTest.js
│           │   │   ├── ExternalTest.js
│           │   │   ├── FunctionTest.js
│           │   │   ├── GenericsTest.js
│           │   │   ├── LiteralTest.js
│           │   │   ├── NullableTest.js
│           │   │   ├── ObjectTest.js
│           │   │   ├── OptionalTest.js
│           │   │   ├── RecordTest.js
│           │   │   ├── SpreadTest.js
│           │   │   ├── TypedefTest.js
│           │   │   └── UnionTest.js
│           │   ├── TypedefTest/
│           │   │   └── DefinitionTest.js
│           │   ├── UndocumentTest/
│           │   │   └── DefinitionTest.js
│           │   ├── VariableTest/
│           │   │   ├── ArrayPatterTest.js
│           │   │   ├── DefinitionTest.js
│           │   │   └── ObjectPatterTest.js
│           │   └── VersionTest/
│           │       ├── ClassTest.js
│           │       ├── FunctionTest.js
│           │       └── VariableTest.js
│           ├── FileTest/
│           │   └── FileTest.js
│           ├── IdentifiersTest/
│           │   └── IdentifiersTest.js
│           ├── IndexTest/
│           │   └── IndexTest.js
│           ├── ManualTest/
│           │   └── ManualTest.js
│           ├── NavTest/
│           │   └── NavTest.js
│           ├── SearchTest/
│           │   └── SearchTest.js
│           ├── TestTest/
│           │   ├── TestLinkTest.js
│           │   └── TestTest.js
│           ├── init.js
│           └── util.js
├── esdoc-publish-markdown-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── misc/
│   │   └── index.md
│   ├── package.json
│   ├── src/
│   │   ├── AbstractBuilder.js
│   │   ├── ClassBuilder.js
│   │   ├── FunctionBuilder.js
│   │   ├── Plugin.js
│   │   └── template/
│   │       ├── class.html
│   │       └── function.html
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   ├── MyClass.test.js
│       │   ├── myFunction.js
│       │   └── myFunction.test.js
│       └── util.js
├── esdoc-react-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-standard-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── README.md
│       ├── esdoc.json
│       ├── init.js
│       ├── manual/
│       │   └── overview.md
│       ├── package.json
│       ├── spy-plugin.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── Plugin.test.js
│       └── test/
│           └── MyClassTest.js
├── esdoc-type-inference-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── Getter.js
│       │   ├── Getter.test.js
│       │   ├── Member.js
│       │   ├── Member.test.js
│       │   ├── Param.js
│       │   ├── Param.test.js
│       │   ├── Return.js
│       │   ├── Return.test.js
│       │   ├── Variable.js
│       │   └── Variable.test.js
│       └── util.js
├── esdoc-typescript-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── TypeScript.test.js
│       │   └── TypeScript.ts
│       └── util.js
├── esdoc-undocumented-identifier-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-unexported-identifier-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
└── script/
    ├── check.sh
    ├── install.sh
    └── test.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
node_modules
out
npm-debug.log


================================================
FILE: .travis.yml
================================================
language: node_js
sudo: false
node_js:
  - "6"
script:
  - ./script/test.sh
install:
  - ./script/install.sh


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: README.md
================================================
[![](https://travis-ci.org/esdoc/esdoc-plugins.svg?branch=master)](https://travis-ci.org/esdoc/esdoc-plugins)
# ESDoc Plugins

This repository is official plugins for ESDoc.

**In most case, we recommend [esdoc-standard-plugin](./esdoc-standard-plugin)**

## Each Plugins

**Publisher**
- [esdoc-publish-html-plugin](./esdoc-publish-html-plugin)
- [esdoc-publish-markdown-plugin](./esdoc-publish-markdown-plugin) [PoC]

**Integration**
- [esdoc-integrate-manual-plugin](./esdoc-integrate-manual-plugin)
- [esdoc-integrate-test-plugin](./esdoc-integrate-test-plugin)

**Transform**
- [esdoc-accessor-plugin](./esdoc-accessor-plugin)
- [esdoc-brand-plugin](./esdoc-brand-plugin)
- [esdoc-exclude-source-plugin](./esdoc-exclude-source-plugin)
- [esdoc-importpath-plugin](./esdoc-importpath-plugin)
- [esdoc-inject-script-plugin](./esdoc-inject-script-plugin)
- [esdoc-inject-style-plugin](./esdoc-inject-style-plugin)
- [esdoc-undocumented-identifier-plugin](./esdoc-undocumented-identifier-plugin)
- [esdoc-unexported-identifier-plugin](./esdoc-unexported-identifier-plugin)

**Inspection**
- [esdoc-coverage-plugin](./esdoc-coverage-plugin)
- [esdoc-lint-plugin](./esdoc-lint-plugin)
- [esdoc-type-inference-plugin](./esdoc-type-inference-plugin) 

**External Identifier**
- [esdoc-external-ecmascript-plugin](./esdoc-external-ecmascript-plugin)
- [esdoc-external-nodejs-plugin](./esdoc-external-nodejs-plugin)
- [esdoc-external-webapi-plugin](./esdoc-external-webapi-plugin)

**Language**
- [esdoc-ecmascript-proposal-plugin](./esdoc-ecmascript-proposal-plugin)
- [esdoc-flow-type-plugin](./esdoc-flow-type-plugin) [PoC]
- [esdoc-typescript-plugin](./esdoc-typescript-plugin) [PoC]

**React**
- [esdoc-jsx-plugin](./esdoc-jsx-plugin)
- [esdoc-react-plugin](./esdoc-react-plugin) [PoC]



================================================
FILE: _template/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: _template/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: _template/README.md
================================================
# ESDoc Template Plugin
## Install
```bash
npm install esdoc-template-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-template-plugin", "option": {"foo": true}}
  ]
}
```

- `foo` is default `true`

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: _template/package.json
================================================
{
  "name": "esdoc-template-plugin",
  "version": "0.0.1",
  "description": "A __TEMPLATE__ plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "alpha",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: _template/src/Plugin.js
================================================
class Plugin {
  onHandleDocs(ev) {
    this._docs = ev.data.docs;
  }
}

module.exports = new Plugin();


================================================
FILE: _template/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js", "option": {"foo": true}}
  ]
}


================================================
FILE: _template/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: _template/test/src/MyClass.js
================================================
export default class MyClass {
  method1(){}
}


================================================
FILE: _template/test/src/MyClass.test.js
================================================
const assert = require('assert');
const {find, file} = require('../util');

describe('test/MyClass.js:', ()=> {
  it('has method doc', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#method1');
    assert(doc);
  });
});



================================================
FILE: _template/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-accessor-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-accessor-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-accessor-plugin/README.md
================================================
# ESDoc Accessor Plugin
## Install
```bash
npm install esdoc-accessor-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-accessor-plugin", "option": {"access": ["public", "protected", "private"], "autoPrivate": true}}
  ]
}
```

- `access` is default `["public", "protected", "private"]`
- `autoPrivate` is default `true`

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-accessor-plugin/package.json
================================================
{
  "name": "esdoc-accessor-plugin",
  "version": "1.0.0",
  "description": "A accessor plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "accessor",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-accessor-plugin/src/Plugin.js
================================================
class Plugin {
  constructor() {
    this._docs = null;
    this._option = null;
  }

  onHandleDocs(ev) {
    const option = ev.data.option || {};
    if (!('access' in option)) option.access = ['public', 'protected', 'private'];
    if (!('autoPrivate' in option)) option.autoPrivate = true;

    const access = option.access;
    const autoPrivate = option.autoPrivate;
    for (const doc of ev.data.docs) {
      if (!doc.access) {
        if (autoPrivate && doc.name.charAt(0) === '_') {
          doc.access = 'private';
        } else {
          doc.access = 'public';
        }
      }

      if (!access.includes(doc.access)) doc.ignore = true;
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-accessor-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js", "option": {"access": ["public", "protected"], "autoPrivate": true}}
  ]
}


================================================
FILE: esdoc-accessor-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-accessor-plugin/test/src/MyClass.js
================================================
export default class MyClass {
  /**
   * method1 is default access.
   */
  method1(){}

  /**
   * method2 is public.
   * @public
   */
  method2(){}

  /**
   * method3 is protected.
   * @protected
   */
  method3(){}

  /**
   * method4 is private.
   * @private
   */
  method4(){}

  /**
   * method5 is auto private.
   */
  _method5(){}
}


================================================
FILE: esdoc-accessor-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const {find} = require('../util');

describe('test/MyClass.js:', ()=> {
  it('has default access', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#method1');
    assert.equal(doc.access, 'public');
    assert.equal(doc.ignore, undefined);
  });

  it('has public access', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#method2');
    assert.equal(doc.access, 'public');
    assert.equal(doc.ignore, undefined);
  });

  it('has protected access', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#method3');
    assert.equal(doc.access, 'protected');
    assert.equal(doc.ignore, undefined);
  });

  it('has private access and is ignored', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#method4');
    assert.equal(doc.access, 'private');
    assert.equal(doc.ignore, true);
  });

  it('has auto private access and is ignored', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#_method5');
    assert.equal(doc.access, 'private');
    assert.equal(doc.ignore, true);
  });
});



================================================
FILE: esdoc-accessor-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-brand-plugin/CHANGELOG.md
================================================
# Changelog

## Next
- **Fix**
  - Use the same as original logo file type ([#43](https://github.com/esdoc/esdoc-plugins/pull/43)). Thanks [@bencevans](https://github.com/bencevans)

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-brand-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-brand-plugin/README.md
================================================
# ESDoc Brand Plugin
## Install
```bash
npm install esdoc-brand-plugin
```

## Config
This plugin takes a title and a repository from `package.json (name, repsitory)`.
```json
{
  "source": "./src",
  "destination": "./doc",
  "package.json": "./package.json",
  "plugins": [
    {
      "name": "esdoc-brand-plugin",
      "option": {
        "logo": "./logo.png",
        "title": "My Library",
        "description": "this is awesome library",
        "repository": "https://github.com/foo/bar",
        "site": "http://my-library.org",
        "author": "https://twitter.com/foo",
        "image": "http://my-library.org/logo.png"
      }
    }
  ]
}
```

- `logo` default is `null`
- `title` default is `name` of `package.json`
- `description` default is `description` of `package.json`
- `repository` default is `repository` of `package.json`
- `site` default is `homepage` of `package.json`
- `author` default is `author` of `package.json`
- `image` default is `null`. support an aspect ratio of 1:1

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-brand-plugin/package.json
================================================
{
  "name": "esdoc-brand-plugin",
  "version": "1.0.0",
  "description": "A brand plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "cheerio": "0.22.0"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "brand",
    "title",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-brand-plugin/src/Plugin.js
================================================
const fs = require('fs');
const path = require('path');
const cheerio = require('cheerio');

class Plugin {
  onHandleConfig(ev) {
    const config = ev.data.config;
    const option = ev.data.option || {};

    // get package.json
    let packageObj = {};
    try {
      const packagePath = config.package || './package.json';
      const tmp = fs.readFileSync(packagePath).toString();
      packageObj = JSON.parse(tmp);
    } catch (e) {
      // ignore
    }

    this._logo = option.logo;
    this._description = option.description || packageObj.description;
    this._title = option.title || packageObj.name;
    this._repository = option.repository || this._getRepositoryURL(packageObj);
    this._site = option.site || packageObj.homepage;
    this._image = option.image;
    this._author = option.author || this._getAuthor(packageObj);
  }

  onPublish(ev) {
    if (this._repository && this._repository.indexOf('https://github.com/') === 0) {
      const srcPath = path.resolve(__dirname, 'github.png');
      ev.data.copyFile(srcPath, 'image/github.png');
    }

    if (this._logo) {
      const srcPath = path.resolve(this._logo);
      ev.data.copyFile(srcPath, 'image/brand_logo' + path.extname(this._logo));
    }
  }

  onHandleContent(ev) {
    const content = ev.data.content;
    const fileName = ev.data.fileName;

    if (path.extname(fileName) !== '.html') return content;

    const $ = cheerio.load(content);

    // logo
    if (this._logo) {
      const $el = $('header a[href="./"]');
      $el.text('');
      $el.css({display: 'flex', 'align-items': 'center'});
      $el.append('<img src="./image/brand_logo' + path.extname(this._logo) + '" style="width:34px;">');
    }

    // title
    if (this._title) {
      const $title = $('title');
      const original = $title.text();
      $title.text(`${original} | ${this._title}`);
    }

    // repository
    if (this._repository) {
      if (this._repository.indexOf('https://github.com/') === 0) {
        const style = 'style="position:relative; top:3px;"';
        $('header').append(`<a ${style} href="${this._repository}"><img width="20px" src="./image/github.png"/></a>`);
      } else {
        $('header').append(`<a href="${this._repository}">Repository</a>`);
      }
    }

    // meta tag
    this._addMetaTag($);

    ev.data.content = $.html();
  }

  _getRepositoryURL(packageObj) {
    if (!packageObj.repository) return null;

    let url = packageObj.repository.url || packageObj.repository;
    if (typeof url !== 'string') return null;

    if (url.indexOf('git@github.com:') === 0) { // url: git@github.com:foo/bar.git
      const matched = url.match(/^git@github\.com:(.*)\.git$/);
      return `https://github.com/${matched[1]}`;
    } else if (url.match(/^[\w\d\-_]+\/[\w\d\-_]+$/)) { // url: foo/bar
      return `https://github.com/${url}`;
    } else if (url.match(/^git\+https:\/\/github.com\/.*\.git$/)) { // git+https://github.com/foo/bar.git
      const matched = url.match(/^git\+(https:\/\/github.com\/.*)\.git$/);
      return matched[1];
    } else if (url.match(/(https?:\/\/.*$)/)) { // other url
      const matched = url.match(/(https?:\/\/.*$)/);
      return matched[1];
    }

    return null;
  }

  _getAuthor(packageObj) {
    if (!packageObj.author) return null;

    if (typeof packageObj.author === 'string') {
      return packageObj.author;
    } else {
      return packageObj.author.url || packageObj.author.name;
    }
  }

  _addMetaTag($) {
    const metaProps = [];

    // normal
    if (this._description){
      metaProps.push({name: 'description', content: this._description});
    }

    // og tag http://ogp.me/#metadata
    if (this._title && this._image && this._site){
      metaProps.push({property: 'og:type', content: 'website'});
      metaProps.push({property: 'og:url', content: this._site});
      metaProps.push({property: 'og:site_name', content: this._title});
      metaProps.push({property: 'og:title', content: this._title});
      metaProps.push({property: 'og:image', content: this._image});

      if (this._description) metaProps.push({property: 'og:description', content: this._description});
      if (this._author) metaProps.push({property: 'og:author', content: this._author});
    }

    // twitter card https://dev.twitter.com/cards/types/summary
    if (this._title && this._description){
      metaProps.push({property: 'twitter:card', content: 'summary'});
      metaProps.push({property: 'twitter:title', content: this._title});
      metaProps.push({property: 'twitter:description', content: this._description});

      if (this._image) metaProps.push({property: 'twitter:image', content: this._image});
      if (this._site && this._site.indexOf('https://twitter.com/') === 0) {
        const twitterName = this._site.replace('https://twitter.com/', '@');
        metaProps.push({property: 'twitter:site', content: twitterName});
        metaProps.push({property: 'twitter:creator', content: twitterName});
      }
    }

    const $head = $('head');
    for (const metaProp of metaProps) {
      const prop = Object.keys(metaProp).map((key) => `${key}="${metaProp[key]}"`).join(' ');
      const metaTag = `<meta ${prop}>`;
      $head.append(metaTag);
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-brand-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "package": "./test/package.json",
  "plugins": [
    {"name": "./test/misc/publish-html-mock-plugin.js"},
    {"name": "./src/Plugin.js", "option": {"logo": "./test/misc/logo.png", "image": "https://esdoc.org/manual/asset/image/logo.png"}}
  ]
}


================================================
FILE: esdoc-brand-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-brand-plugin/test/misc/publish-html-mock-plugin.js
================================================
exports.onPublish = function(ev) {
  const html = `
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<header>
  <a href="./">Home</a>
</header>
</body>
</html>
`;
  ev.data.writeFile('index.html', html);
};


================================================
FILE: esdoc-brand-plugin/test/package.json
================================================
{
  "name": "esdoc-brand-plugin-test",
  "description": "this is esdoc-brand-plugin test",
  "repository": "https://github.com/esdoc/esdoc-optional-plugins",
  "homepage": "https://esdoc.org",
  "author": {
    "name": "h13i32maru",
    "url": "http://h13i32maru.jp"
  }
}


================================================
FILE: esdoc-brand-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-brand-plugin/test/src/MyClass.test.js
================================================
const fs = require('fs');
const assert = require('assert');
const cheerio = require('cheerio');

describe('test/MyClass.js:', ()=> {
  const $ = cheerio.load(fs.readFileSync('./test/out/index.html'));

  it('has brand logo', ()=>{
    assert.equal($('header a[href="./"] img[src="./image/brand_logo.png"]').length, 1);
    assert(fs.readFileSync('./test/out/image/brand_logo.png'));
  });

  it('has brand title', ()=>{
    assert.equal($('title').text(), 'Home | esdoc-brand-plugin-test');
  });

  it('has repository link', ()=>{
    assert.equal($('header a[href="https://github.com/esdoc/esdoc-optional-plugins"]').length, 1);
    assert.equal($('header img[src="./image/github.png"]').length, 1);
    assert(fs.readFileSync('./test/out/image/github.png'));
  });

  it('has meta tag', ()=>{
    // normal
    assert.equal($('meta[name="description"]').attr('content'), 'this is esdoc-brand-plugin test');

    // og
    assert.equal($('meta[property="og:type"]').attr('content'), 'website');
    assert.equal($('meta[property="og:url"]').attr('content'), 'https://esdoc.org');
    assert.equal($('meta[property="og:site_name"]').attr('content'), 'esdoc-brand-plugin-test');
    assert.equal($('meta[property="og:title"]').attr('content'), 'esdoc-brand-plugin-test');
    assert.equal($('meta[property="og:image"]').attr('content'), 'https://esdoc.org/manual/asset/image/logo.png');
    assert.equal($('meta[property="og:description"]').attr('content'), 'this is esdoc-brand-plugin test');
    assert.equal($('meta[property="og:author"]').attr('content'), 'http://h13i32maru.jp');

    // twitter
    assert.equal($('meta[property="twitter:card"]').attr('content'), 'summary');
    assert.equal($('meta[property="twitter:title"]').attr('content'), 'esdoc-brand-plugin-test');
    assert.equal($('meta[property="twitter:description"]').attr('content'), 'this is esdoc-brand-plugin test');
    assert.equal($('meta[property="twitter:image"]').attr('content'), 'https://esdoc.org/manual/asset/image/logo.png');
  });
});



================================================
FILE: esdoc-coverage-plugin/CHANGELOG.md
================================================
# Changelog

## 1.1.0 (2017-09-09)
- **Feat**
  - Add `kind` option ([#7](https://github.com/esdoc/esdoc-plugins/pull/7)) Thanks [@jaxx2104](https://github.com/jaxx2104)

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-coverage-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-coverage-plugin/README.md
================================================
# ESDoc Coverage Plugin
## Install
```
npm install esdoc-coverage-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {
      "name": "esdoc-coverage-plugin", 
      "option": {
        "enable": true,
        "kind": ["class", "method", "member", "get", "set", "constructor", "function", "variable"]
      }
    }
  ]
}
```

`enable` is default `true`.

`kind` is default `["class", "method", "member", "get", "set", "constructor", "function", "variable"]`.

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-coverage-plugin/package.json
================================================
{
  "name": "esdoc-coverage-plugin",
  "version": "1.1.0",
  "description": "A coverage plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "coverage",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-coverage-plugin/src/Plugin.js
================================================
const fs = require('fs');
const path = require('path');

class Plugin {
  onHandleDocs(ev) {
    this._docs = ev.data.docs;
  }

  onPublish(ev) {
    const option = ev.data.option || {};
    if (!('enable' in option)) option.enable = true;
    if (!option.enable) return;
    if (!('kind' in option)) option.kind = ['class', 'method', 'member', 'get', 'set', 'constructor', 'function', 'variable'];
    if (!option.kind) return;
    const docs = this._docs.filter(v => option.kind.includes(v.kind));
    const expectCount = docs.length;
    let actualCount = 0;
    const files = {};

    for (const doc of docs) {
      const filePath = doc.longname.split('~')[0];
      if (!files[filePath]) files[filePath] = {expectCount: 0, actualCount: 0, undocumentLines: []};
      files[filePath].expectCount++;

      if (doc.undocument) {
        files[filePath].undocumentLines.push(doc.lineNumber);
      } else {
        actualCount++;
        files[filePath].actualCount++;
      }
    }

    const coveragePercent = (expectCount === 0 ? 0 : Math.floor(10000 * actualCount / expectCount) / 100);

    const coverage = {
      coverage: `${coveragePercent}%`,
      expectCount: expectCount,
      actualCount: actualCount,
      files: files
    };

    ev.data.writeFile('coverage.json', JSON.stringify(coverage, null, 2));

    // create badge
    const ratio = Math.floor(100 * actualCount / expectCount);
    let color;
    if (ratio < 50) {
      color = '#db654f';
    } else if (ratio < 90) {
      color = '#dab226';
    } else {
      color = '#4fc921';
    }

    const filePath = path.resolve(__dirname, 'badge.svg');
    let badge = fs.readFileSync(filePath, {encoding: 'utf-8'});
    badge = badge.replace(/@ratio@/g, `${ratio}%`);
    badge = badge.replace(/@color@/g, color);

    ev.data.writeFile('badge.svg', badge);
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-coverage-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-coverage-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-coverage-plugin/test/src/MyClass.js
================================================
/**
 * this is MyClass class.
 */
export default class MyClass {
  /**
   * this is constructor.
   */
  constructor(){
    /**
     * this is p property.
     * @type {number}
     */
    this.p = 100;
  }

  /**
   * this is method.
   */
  method(){}

  undocumentMethod(){}
}


================================================
FILE: esdoc-coverage-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const fs = require('fs');

describe('test/MyClass.js:', ()=> {
  it('has coverage', ()=>{
    const tmp = fs.readFileSync('./test/out/coverage.json').toString();
    const coverage = JSON.parse(tmp);

    assert.equal(coverage.coverage, '80%');
    assert.equal(coverage.expectCount, 5);
    assert.equal(coverage.actualCount, 4);
    assert.deepEqual(coverage.files, {
      'src/MyClass.js': {
        expectCount: 5,
        actualCount: 4,
        undocumentLines: [21]
      }
    });
  });

  it('has coverage badge', ()=> {
    const badge = fs.readFileSync('./test/out/badge.svg').toString();
    assert(badge.includes('80%'));
  });
});



================================================
FILE: esdoc-ecmascript-proposal-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-ecmascript-proposal-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-ecmascript-proposal-plugin/README.md
================================================
# ESDoc ECMAScript Proposal Plugin
## Install
```
npm install esdoc-ecmascript-proposal-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-ecmascript-proposal-plugin", "option": {"all": true}}
  ]
}
```

If you want to enable each proposals,
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {
      "name": "esdoc-ecmascript-proposal-plugin",
      "option": {
        "classProperties": true,
        "objectRestSpread": true,
        "doExpressions": true,
        "functionBind": true,
        "functionSent": true,
        "asyncGenerators": true,
        "decorators": true,
        "exportExtensions": true,
        "dynamicImport": true
      }
    }
  ]
}
```

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-ecmascript-proposal-plugin/package.json
================================================
{
  "name": "esdoc-ecmascript-proposal-plugin",
  "version": "1.0.0",
  "description": "A ECMAScript proposal plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "^1.1.0",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "ecmascript",
    "proposal",
    "experimental",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/src/Plugin.js
================================================
class Plugin {
  onHandleCodeParser(ev) {
    const option = ev.data.option;
    const plugins = ev.data.parserOption.plugins;

    if (option.all || option.classProperties) plugins.push('classProperties');
    if (option.all || option.objectRestSpread) plugins.push('objectRestSpread');
    if (option.all || option.doExpressions) plugins.push('doExpressions');
    if (option.all || option.functionBind) plugins.push('functionBind');
    if (option.all || option.functionSent) plugins.push('functionSent');
    if (option.all || option.asyncGenerators) plugins.push('asyncGenerators');
    if (option.all || option.decorators) plugins.push('decorators');
    if (option.all || option.exportExtensions) plugins.push('exportExtensions');
    if (option.all || option.dynamicImport) plugins.push('dynamicImport');
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js", "option": {"all": true}}
  ]
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/AsyncGenerators.js
================================================
export default class AsyncGenerators {
  async *method() {
    const stream = [ Promise.resolve(4), Promise.resolve(9), Promise.resolve(12) ];
    let total = 0;
    for await (const val of stream) {
      total += await val;
      yield total;
    }
  }
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/ClassProperties.js
================================================
export default class ClassProperties {
  /** @type {number} */
  static p1 = 123;

  /** @type {number} */
  p1 = 123;
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/Decorators.js
================================================
@annotation1
export default class Decorators {
  @annotation1
  static method1(){}

  @annotation1
  get value1(){}

  @annotation1
  set value2(v){}

  @annotation1
  @annotation2(true)
  method1(){}

  @annotation1.bar
  @annotation1.foo(1, 2)
  method2() {}
}

export function annotation1(){}

export function annotation2(){}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/DoExpressions.js
================================================
export default class DoExpressions {
  method1(){
    const a = do {
      if(x > 10) {
        'big';
      } else {
        'small';
      }
    };
  }
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/DynamicImport.js
================================================
export default class DynamicImport {
  method() {
    for (let i = 0; i < 10; i++) {
      import(`mod${$i}.js`)
        .then(module => console.log(module))
        .catch(err => console.log(err));
    }
  }
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/ECMAScriptProposal.test.js
================================================
const assert = require('assert');
const {find, file} = require('../util');

describe('test ecmascript proposal result:', ()=> {
  it('parses AsyncGenerators', ()=>{
    const doc = find('longname', 'src/AsyncGenerators.js~AsyncGenerators#method');
    assert(doc);
  });

  it('parses ClassProperties', ()=>{
    let doc = find('longname', 'src/ClassProperties.js~ClassProperties.p1');
    assert.equal(doc.static, true);
    assert.equal(doc.type.types[0], 'number');

    doc = find('longname', 'src/ClassProperties.js~ClassProperties#p1');
    assert.equal(doc.static, false);
    assert.equal(doc.type.types[0], 'number');
  });

  it('parses Decorators', ()=>{
    let doc = find('longname', 'src/Decorators.js~Decorators');
    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);

    doc = find('longname', 'src/Decorators.js~Decorators.method1');
    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);

    doc = find('longname', 'src/Decorators.js~Decorators#value1');
    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);

    doc = find('longname', 'src/Decorators.js~Decorators#value2');
    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);

    doc = find('longname', 'src/Decorators.js~Decorators#method1');
    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}, {name: 'annotation2', arguments: '(true)'}]);

    doc = find('longname', 'src/Decorators.js~Decorators#method2');
    assert.deepEqual(doc.decorators, [{name: 'annotation1.bar', arguments: null}, {name: 'annotation1.foo', arguments: '(1, 2)'}]);
  });

  it('parses DoExpressions', ()=>{
    const doc = find('longname', 'src/DoExpressions.js~DoExpressions');
    assert(doc);
  });

  it('parses DynamicImport', ()=>{
    const doc = find('longname', 'src/DynamicImport.js~DynamicImport');
    assert(doc);
  });

  it('parses ExportExtensions', ()=>{
    const doc = find('longname', 'src/ExportExtensions.js~ExportExtensions');
    assert(doc);
  });

  it('parses FunctionBind', ()=>{
    const doc = find('longname', 'src/FunctionBind.js~FunctionBind');
    assert(doc);
  });

  it('parses FunctionSent', ()=>{
    const doc = find('longname', 'src/FunctionSent.js~FunctionSent');
    assert(doc);
  });

  it('parses ObjectRestSpread', ()=>{
    let doc = find('longname', 'src/ObjectRestSpread.js~ObjectRestSpread#method1');
    assert.deepEqual(doc.params, [
      {
        "nullable": null,
        "types": [
          "Object"
        ],
        "spread": false,
        "optional": false,
        "name": "config",
        "description": "this is config."
      },
      {
        "nullable": null,
        "types": [
          "number"
        ],
        "spread": false,
        "optional": false,
        "name": "config.x",
        "description": "this is number x."
      },
      {
        "nullable": null,
        "types": [
          "string"
        ],
        "spread": false,
        "optional": false,
        "name": "config.y",
        "description": "this is string y."
      },
      {
        "nullable": null,
        "types": [
          "number[]"
        ],
        "spread": false,
        "optional": false,
        "name": "config.a",
        "description": "thi is number[] a."
      },
      {
        "nullable": null,
        "types": [
          "string[]"
        ],
        "spread": false,
        "optional": false,
        "name": "config.b",
        "description": "thi is number[] b."
      }
    ]);

    doc = find('longname', 'src/ObjectRestSpread.js~ObjectRestSpread#method2');
    assert.deepEqual(doc.return, {
      "nullable": null,
      "types": [
        "{a: number, b: string, c: boolean}"
      ],
      "spread": false,
      "description": ""
    });
  });
});



================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/ExportExtensions.js
================================================
export * as ns from 'mod'
export v from "mod"
export vv, {x, y as w} from "mod"
export default from "mod"

export class ExportExtensions {
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/FunctionBind.js
================================================
function foo(){}

export default class FunctionBind {
  method() {
    this::foo();
  }
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/FunctionSent.js
================================================
export default class FunctionSent {
  *method() {
    console.log(function.sent);
  }
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/src/ObjectRestSpread.js
================================================
export default class ObjectRestSpread {
  /**
   * this is method1.
   * @param {Object} config - this is config.
   * @param {number} config.x - this is number x.
   * @param {string} config.y - this is string y.
   * @param {number[]} config.a - thi is number[] a.
   * @param {string[]} config.b - thi is number[] b.
   */
  method1({x, y, ...z}){}

  /**
   * @returns {{a: number, b: string, c: boolean}}
   */
  method2(){
    const a = 1;
    const obj = {b: 'text', c: true};
    return {a, ...obj};
  }
}


================================================
FILE: esdoc-ecmascript-proposal-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-exclude-source-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-exclude-source-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-exclude-source-plugin/README.md
================================================
# ESDoc Exclude Source Plugin
## Install
```bash
npm install esdoc-exclude-source-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-exclude-source-plugin"}
  ]
}
```

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-exclude-source-plugin/package.json
================================================
{
  "name": "esdoc-exclude-source-plugin",
  "version": "1.0.0",
  "description": "A exclude source plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "exclude",
    "source",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-exclude-source-plugin/src/Plugin.js
================================================
class Plugin {
  onHandleDocs(ev) {
    for (const doc of ev.data.docs) {
      if (doc.kind === 'file' || doc.kind === 'testFile') doc.content = '';
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-exclude-source-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-exclude-source-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-exclude-source-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-exclude-source-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const fs = require('fs');

describe('test/MyClass.js:', ()=> {
  const tmp = fs.readFileSync('./test/out/index.json').toString();
  const docs = JSON.parse(tmp);

  it('does not have source code.', ()=>{
    docs.forEach((doc) => {
      if (doc.kind === 'file' || doc.kind === 'testFile')  {
        assert.equal(doc.content, '');
      }
    });
  });
});



================================================
FILE: esdoc-external-ecmascript-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-external-ecmascript-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-external-ecmascript-plugin/README.md
================================================
# ESDoc External ECMAScript Plugin
## Install
```bash
npm install esdoc-external-ecmascript-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-external-ecmascript-plugin", "option": {"enable": true}}
  ]
}
```

`enable` is default `true`.

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-external-ecmascript-plugin/package.json
================================================
{
  "name": "esdoc-external-ecmascript-plugin",
  "version": "1.0.0",
  "description": "A external ECMAScript plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "fs-extra": "1.0.0"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "external",
    "ecmascript",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-external-ecmascript-plugin/src/Plugin.js
================================================
const fs = require('fs-extra');
const path = require('path');

class Plugin {
  onHandleConfig(ev) {
    this._config = ev.data.config;
    this._option = ev.data.option || {};
    if (!('enable' in this._option)) this._option.enable = true;

    if (!this._option.enable) return;

    const srcPath = path.resolve(__dirname, 'external-ecmascript.js');
    const outPath = path.resolve(this._config.source, '.external-ecmascript.js');

    fs.copySync(srcPath, outPath);
  }

  onHandleDocs(ev) {
    if (!this._option.enable) return;

    const outPath = path.resolve(this._config.source, '.external-ecmascript.js');
    fs.removeSync(outPath);

    const name = path.basename(path.resolve(this._config.source)) + '/.external-ecmascript.js';
    for (const doc of ev.data.docs) {
      if (doc.kind === 'external' && doc.memberof === name) doc.builtinExternal = true;
    }

    const tagIndex = ev.data.docs.findIndex(doc => doc.kind === 'file' && doc.name === name);
    ev.data.docs.splice(tagIndex, 1);
  }

}

module.exports = new Plugin();


================================================
FILE: esdoc-external-ecmascript-plugin/src/external-ecmascript.js
================================================
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects

// Value properties
/**
 * @external {Infinity} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity
 */

/**
 * @external {NaN} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN
 */

/**
 * @external {undefined} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
 */

/**
 * @external {null} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
 */

// Fundamental objects
/**
 * @external {Object} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
 */
/**
 * @external {object} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
 */

/**
 * @external {Function} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
 */
/**
 * @external {function} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
 */

/**
 * @external {Boolean} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean
 */
/**
 * @external {boolean} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean
 */

/**
 * @external {Symbol} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
 */

/**
 * @external {Error} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
 */

/**
 * @external {EvalError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError
 */

/**
 * @external {InternalError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError
 */

/**
 * @external {RangeError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError
 */

/**
 * @external {ReferenceError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError
 */

/**
 * @external {SyntaxError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError
 */

/**
 * @external {TypeError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError
 */

/**
 * @external {URIError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError
 */

// Numbers and dates
/**
 * @external {Number} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
 */
/**
 * @external {number} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
 */

/**
 * @external {Date} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
 */

// Text processing
/**
 * @external {String} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String
 */
/**
 * @external {string} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String
 */

/**
 * @external {RegExp} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
 */

// Indexed collections
/**
 * @external {Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
 */

/**
 * @external {Int8Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array
 */
/**
 * @external {Uint8Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
 */

/**
 * @external {Uint8ClampedArray} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray
 */

/**
 * @external {Int16Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array
 */

/**
 * @external {Uint16Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array
 */

/**
 * @external {Int32Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array
 */

/**
 * @external {Uint32Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array
 */

/**
 * @external {Float32Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array
 */

/**
 * @external {Float64Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array
 */

// Keyed collections
/**
 * @external {Map} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
 */

/**
 * @external {Set} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
 */

/**
 * @external {WeakMap} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
 */

/**
 * @external {WeakSet} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
 */

// Structured data
/**
 * @external {ArrayBuffer} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
 */

/**
 * @external {DataView} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView
 */

/**
 * @external {JSON} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
 */

// Control abstraction objects
/**
 * @external {Promise} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
 */

/**
 * @external {Generator} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator
 */

/**
 * @external {GeneratorFunction} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction
 */

// Reflection
/**
 * @external {Reflect} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
 */

/**
 * @external {Proxy} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
 */


================================================
FILE: esdoc-external-ecmascript-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-external-ecmascript-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-external-ecmascript-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-external-ecmascript-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const path = require('path');
const fs = require('fs');

describe('test external ecmascript results:', ()=>{
  const tmp = fs.readFileSync('./test/out/index.json').toString();
  const tags = JSON.parse(tmp);

  it('has external ecmascript.', ()=>{
    const tag = tags.find(tag => tag.kind === 'external' && tag.name === 'number');
    assert.equal(tag.externalLink, "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number");
  });

  it('removed external-ecmascript.js', ()=>{
    assert.throws(()=>{
      fs.readFileSync('./test/src/.external-ecmascript.js');
    });
  });
});


================================================
FILE: esdoc-external-nodejs-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-external-nodejs-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-external-nodejs-plugin/README.md
================================================
# ESDoc External Node.js Plugin
## Install
```bash
npm install esdoc-external-nodejs-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-external-nodejs-plugin", "option": {"enable": true}}
  ]
}
```

`enable` is default `true`.

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-external-nodejs-plugin/package.json
================================================
{
  "name": "esdoc-external-nodejs-plugin",
  "version": "1.0.0",
  "description": "A external Node.js plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "fs-extra": "1.0.0"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "external",
    "nodejs",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-external-nodejs-plugin/src/Plugin.js
================================================
const fs = require('fs-extra');
const path = require('path');

class Plugin {
  onHandleConfig(ev) {
    this._config = ev.data.config;
    this._option = ev.data.option || {};
    if (!('enable' in this._option)) this._option.enable = true;

    if (!this._option.enable) return;

    const srcPath = path.resolve(__dirname, 'external-nodejs.js');
    const outPath = path.resolve(this._config.source, '.external-nodejs.js');

    fs.copySync(srcPath, outPath);
  }

  onHandleDocs(ev) {
    if (!this._option.enable) return;

    const outPath = path.resolve(this._config.source, '.external-nodejs.js');
    fs.removeSync(outPath);

    const name = path.basename(path.resolve(this._config.source)) + '/.external-nodejs.js';
    for (const doc of ev.data.docs) {
      if (doc.kind === 'external' && doc.memberof === name) doc.builtinExternal = true;
    }

    const docIndex = ev.data.docs.findIndex(doc => doc.kind === 'file' && doc.name === name);
    ev.data.docs.splice(docIndex, 1);
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-external-nodejs-plugin/src/external-nodejs.js
================================================
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects

// Value properties
/**
 * @external {http~ClientRequest} https://nodejs.org/dist/latest/docs/api/http.html#http_class_http_clientrequest
 */


================================================
FILE: esdoc-external-nodejs-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-external-nodejs-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-external-nodejs-plugin/test/src/MyClass.js
================================================
export default class MyClass {
  /**
   * @param {http~ClientRequest} p
   */
  method(p){}
}


================================================
FILE: esdoc-external-nodejs-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const fs = require('fs');
const {find} = require('../util');

describe('test/MyClass.js:', ()=>{
  it('has external Node.js.', ()=>{
    const doc = find('name', 'http~ClientRequest');
    assert.equal(doc.externalLink, "https://nodejs.org/dist/latest/docs/api/http.html#http_class_http_clientrequest");
  });

  it('removed external-nodejs.js', ()=>{
    assert.throws(()=>{
      fs.readFileSync('./test/src/.external-nodejs.js');
    });
  });
});


================================================
FILE: esdoc-external-nodejs-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-external-webapi-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-external-webapi-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-external-webapi-plugin/README.md
================================================
# ESDoc External WebAPI Plugin
## Install
```bash
npm install esdoc-external-webapi-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-external-webapi-plugin", "option": {"enable": true}}
  ]
}
```

`enable` is default `true`.

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-external-webapi-plugin/package.json
================================================
{
  "name": "esdoc-external-webapi-plugin",
  "version": "1.0.0",
  "description": "A external Web API plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "fs-extra": "1.0.0"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "external",
    "webapi",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-external-webapi-plugin/src/Plugin.js
================================================
const fs = require('fs-extra');
const path = require('path');

class Plugin {
  onHandleConfig(ev) {
    this._config = ev.data.config;
    this._option = ev.data.option || {};
    if (!('enable' in this._option)) this._option.enable = true;

    if (!this._option.enable) return;

    const srcPath = path.resolve(__dirname, 'external-webapi.js');
    const outPath = path.resolve(this._config.source, '.external-webapi.js');

    fs.copySync(srcPath, outPath);
  }

  onHandleDocs(ev) {
    if (!this._option.enable) return;

    const outPath = path.resolve(this._config.source, '.external-webapi.js');
    fs.removeSync(outPath);

    const name = path.basename(path.resolve(this._config.source)) + '/.external-webapi.js';
    for (const doc of ev.data.docs) {
      if (doc.kind === 'external' && doc.memberof === name) doc.builtinExternal = true;
    }

    const docIndex = ev.data.docs.findIndex(doc => doc.kind === 'file' && doc.name === name);
    ev.data.docs.splice(docIndex, 1);
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-external-webapi-plugin/src/external-webapi.js
================================================
// https://developer.mozilla.org/en-US/docs/Web/API

/**
 * @external {CanvasRenderingContext2D} https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D
 */

/**
 * @external {DocumentFragment} https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
 */

/**
 * @external {Element} https://developer.mozilla.org/en-US/docs/Web/API/Element
 */

/**
 * @external {Event} https://developer.mozilla.org/en-US/docs/Web/API/Event
 */

/**
 * @external {Node} https://developer.mozilla.org/en-US/docs/Web/API/Node
 */

/**
 * @external {NodeList} https://developer.mozilla.org/en-US/docs/Web/API/NodeList
 */

/**
 * @external {XMLHttpRequest} https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest
 */

/**
 * @external {AudioContext} https://developer.mozilla.org/en/docs/Web/API/AudioContext
 */


================================================
FILE: esdoc-external-webapi-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-external-webapi-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-external-webapi-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-external-webapi-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const {find} = require('../util');

describe('test/MyClass.js:', ()=>{

  it('has external web api.', ()=>{
    const doc = find('name', 'XMLHttpRequest');
    assert.equal(doc.externalLink, 'https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest');
  });

  it('removed external-webapi.js', ()=>{
    assert.throws(()=>{
      fs.readFileSync('./test/src/.external-webapi.js');
    });
  });
});


================================================
FILE: esdoc-external-webapi-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-flow-type-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.2 (2018-04-29)
- **Fix**
  - Broken `@type {type} desc` ([#30](https://github.com/esdoc/esdoc-plugins/pull/30)) Thanks [@samskivert](https://github.com/samskivert)

## 1.0.1 (2017-09-03)
- **Fix**
  - [esdoc-flow-type-plugin] Broken `@return {type} desc` ([#23](https://github.com/esdoc/esdoc-plugins/pull/23)) Thanks [@samskivert](https://github.com/samskivert)

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-flow-type-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-flow-type-plugin/README.md
================================================
# ESDoc Flow Type Plugin (PoC)
**This plugin is proof of concept.**

## Install
```bash
npm install esdoc-flow-type-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-flow-type-plugin", "option": {"enable": true}}
  ]
}
```

- `enable` is default `true`

## Example
```js
export class Foo {
  // without document
  member: number;
  
  // without document
  method1(n: number): string {
  }
  
  // without @param and @return
  /**
   * this is method2.
   */
  method2(n: number): string {
  }
  
  // without type in @param and @return
  /**
   * this is method3.
   * @param n - this is param desc.
   * @return this is return desc. 
   */
  method3(n: number): string {
  }
}
```

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-flow-type-plugin/package.json
================================================
{
  "name": "esdoc-flow-type-plugin",
  "version": "1.0.2",
  "description": "A flow type plugin for ESDoc [PoC]",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3",
    "esdoc-standard-plugin": "latest"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "flow",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-flow-type-plugin/src/Plugin.js
================================================
const ASTUtil = require('esdoc/out/src/Util/ASTUtil').default;
const CommentParser = require('esdoc/out/src/Parser/CommentParser').default;
const InvalidCodeLogger = require('esdoc/out/src/Util/InvalidCodeLogger').default;

function formatExpression(expr) {
  switch (expr.type) {
  case 'ObjectExpression':
    return `{${expr.properties.map(formatExpression)}}`;
  default: // XLiteral
    return expr.value ? String(expr.value) : undefined;
  }
}

function formatTypeId(id) {
  switch (id.type) {
  case 'QualifiedTypeIdentifier':
    return `${formatTypeId(id.qualification)}.${formatTypeId(id.id)}`;
  case 'Identifier':
    return id.name;
  default:
    return id.type;
  }
}

function isOptional(type) {
  // TODO: should detect 'foo | void' here as well...
  return type.type === 'NullableTypeAnnotation';
}

function formatTypeAnnotation(type) {
  switch (type.type) {
  case 'GenericTypeAnnotation':
    return type.typeParameters ?
      `${formatTypeId(type.id)}<${formatTypeAnnotations(type.typeParameters.params, ', ')}>` :
      formatTypeId(type.id);
  case 'TupleTypeAnnotation':
    return `[${formatTypeAnnotations(type.types, ', ')}]`;
  case 'NullableTypeAnnotation':
    return `?${formatTypeAnnotation(type.typeAnnotation)}`;
  case 'UnionTypeAnnotation':
    return formatTypeAnnotations(type.types, '|');
  case 'ArrayTypeAnnotation':
    return `${formatTypeAnnotation(type.elementType)}[]`;
  default:
    return type.type.replace('TypeAnnotation', '').toLowerCase();
  }
}

function formatTypeAnnotations(types, sep) {
  return types.map(formatTypeAnnotation).join(sep);
}

class FlowTypePlugin {
  constructor() {
    this._enable = true;
  }

  onStart(ev) {
    if (!ev.data.option) return;
    if ('enable' in ev.data.option) this._enable = ev.data.option.enable;
  }

  onHandleCodeParser(ev) {
    if (this._enable) ev.data.parserOption.plugins.push('flow');
  }

  onHandleAST(ev) {
    if (!this._enable) return;

    ASTUtil.traverse(ev.data.ast, (node, parent, path) =>{
      try {
        this._dispatch(node, parent, path);
      } catch (e) {
        console.log(`${e.message}`);
        InvalidCodeLogger.show(ev.data.filePath, node);
      }
    });
  }

  _dispatch(node, parent, path) {
    switch (node.type) {
      case 'ClassMethod':
        switch (node.kind) {
          case 'constructor':
            this._applyCallableParam(node);
            break;
          case 'method':
            this._applyCallableParam(node);
            this._applyCallableReturn(node);
            break;
          case 'get':
            this._applyClassMethodGetter(node);
            break;
          case 'set':
            this._applyClassMethodSetter(node);
            break;
          default:
            console.warn(`Unknown ClassMethod kind: ${node.kind}`);
            break;
        }
        break;
      case 'ClassProperty':
        this._applyClassProperty(node);
        break;
      case 'FunctionDeclaration':
        this._applyCallableParam(node);
        this._applyCallableReturn(node);
        break;
    }
  }

  _applyCallableParam(node) {
    if (!node.params) return;

    // get comments
    const {tags, commentNode} = CommentParser.parseFromNode(node);

    // get types
    const types = node.params.map(param => {
      switch (param.type) {
      case 'Identifier':
        return {
          type: this._getTypeFromAnnotation(param.typeAnnotation),
          name: param.name,
          tagName: param.typeAnnotation && isOptional(param.typeAnnotation) ?
            `[${param.name}]` : param.name,
        };
      case 'AssignmentPattern':
        return {
          type: this._getTypeFromAnnotation(param.left.typeAnnotation),
          name: param.name,
          tagName: `[${param.left.name}=${formatExpression(param.right)}]`,
        };
      case 'RestElement':
        return {
          type: `...${this._getTypeFromAnnotation(param.typeAnnotation)}`,
          name: param.argument.name,
          tagName: param.argument.name,
        };
      default:
        console.warn(`Unhandled method parameter type: ${param.type}`);
        console.dir(param);
        return {
          type: '*',
          name: param.name,
          tagName: param.name,
        };
      }
    });
    const paramTags = tags.filter(tag => tag.tagName === '@param');

    // merge
    // case: params without comments
    if (paramTags.length === 0 && types.length) {
      const tmp = types.map(({type, tagName}) => {
        return {
          tagName: '@param',
          tagValue: `{${type}} ${tagName}`
        };
      });
      tags.push(...tmp);

      commentNode.value = CommentParser.buildComment(tags);
      return;
    }

    // case: params with comments
    if (paramTags.length === types.length) {
      for (let i = 0; i < paramTags.length; i++) {
        const paramTag = paramTags[i];
        const type = types[i];
        let text = paramTag.tagValue;
        if (text.charAt(0) !== '{') { // does not have type
          if (text.charAt(0) !== '[') { // does not have attrs
            text = `${type.tagName} ${text.substring(text.indexOf(' ')+1)}`;
          }
          paramTag.tagValue = `{${type.type}} ${text}`;
        }
      }

      commentNode.value = CommentParser.buildComment(tags);
      return;
    }

    // case: mismatch params and comments
    throw new Error('mismatch params and comments');
  }

  _applyCallableReturn(node) {
    if (!node.returnType) return;

    // get type
    const type = this._getTypeFromAnnotation(node.returnType);
    if (!type) return;

    // get comments
    const {tags, commentNode} = CommentParser.parseFromNode(node);
    const returnTag = tags.find(tag => tag.tagName === '@return' || tag.tagName === '@returns');

    // merge
    if (returnTag) {
      if (returnTag.tagValue.charAt(0) !== '{') { // return with comment but does not have tpe
        returnTag.tagValue = `{${type}} ${returnTag.tagValue}`;
      }
      // otherwise @return already has type annotation, leave as is
    } else {
      tags.push({tagName: '@return', tagValue: `{${type}}`});
    }

    commentNode.value = CommentParser.buildComment(tags);
  }

  _applyClassMethodGetter(classMethodNode) {
    if (classMethodNode.kind !== 'get') return;
    if (!classMethodNode.returnType) return;

    // get type
    const type = this._getTypeFromAnnotation(classMethodNode.returnType);
    if (!type) return;

    // get comments
    const {tags, commentNode} = CommentParser.parseFromNode(classMethodNode);
    const typeComment = tags.find(tag => tag.tagName === '@type');

    if (typeComment) {
      if (typeComment.tagValue.charAt(0) !== '{') { // type with comment but does not have tpe
        typeComment.tagValue = `{${type}}`;
      }
      // otherwise getter already has type annotation, leave as is
    } else {
      tags.push({tagName: '@type', tagValue: `{${type}}`});
    }

    commentNode.value = CommentParser.buildComment(tags);
  }

  _applyClassMethodSetter(classMethodNode) {
    if (classMethodNode.kind !== 'set') return;
    if (!classMethodNode.params) return;

    // get type
    const type = this._getTypeFromAnnotation(classMethodNode.params[0].typeAnnotation);
    if (!type) return;

    // get comment
    const {tags, commentNode} = CommentParser.parseFromNode(classMethodNode);
    const typeComment = tags.find(tag => tag.tagName === '@type');
    if (typeComment) return;

    // merge
    // case: param without comment
    tags.push({tagName: '@type', tagValue: `{${type}}`});
    commentNode.value = CommentParser.buildComment(tags);
  }

  _applyClassProperty(classPropertyNode) {
    if (!classPropertyNode.typeAnnotation) return;

    // get type
    const type = this._getTypeFromAnnotation(classPropertyNode.typeAnnotation);
    if (!type) return;

    // get comments
    const {tags, commentNode} = CommentParser.parseFromNode(classPropertyNode);
    const typeComment = tags.find(tag => tag.tagName === '@type');

    if (typeComment) {
      if (typeComment.tagValue.charAt(0) !== '{') { // type with comment but does not have tpe
        typeComment.tagValue = `{${type}}`;
      }
      // otherwise property already has type annotation, leave as is
    } else {
      tags.push({tagName: '@type', tagValue: `{${type}}`});
    }

    commentNode.value = CommentParser.buildComment(tags);
  }

  _getTypeFromAnnotation(typeAnnotation) {
    if (!typeAnnotation) return '*';

    return formatTypeAnnotation(typeAnnotation.typeAnnotation);
  }
}

module.exports = new FlowTypePlugin();


================================================
FILE: esdoc-flow-type-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js"],
  "plugins": [
    {"name": "./src/Plugin.js"},
    {"name": "esdoc-standard-plugin"}
  ]
}


================================================
FILE: esdoc-flow-type-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-flow-type-plugin/test/src/FlowType.js
================================================
// @flow
export class TestFlowTypeClass {
  member1: number;

  get getter1(): string {}

  set setter1(v: number) {}

  method1(n: number, x: Foo): string {
    return 'Hello'.repeat(n);
  }

  /**
   * this is method2.
   */
  method2(n: number, x: Foo): string {
    return 'Hello'.repeat(n);
  }

  /**
   * this is method3.
   * @param n - this is n
   * @param x - this is x
   * @return this is return
   */
  method3(n: number, x: Foo): string {
    return 'Hello'.repeat(n);
  }

  /**
   * this is method4.
   * @param t - this is t
   * @param x - this is x
   * @param o - this is o
   * @param q - this is q
   * @return this is return
   */
  method4(t: [number, number], x: Foo<string>, o: string|void, q: THREE.Vector3): ?string {
    return 'Hello'.repeat(t[0]);
  }
}

export function testFlowTypeFunction(n: number, x: Foo): string{}


================================================
FILE: esdoc-flow-type-plugin/test/src/FlowType.test.js
================================================
const assert = require('assert');
const {find, file} = require('../util');

describe('test/FlowType.js:', ()=> {
  it('has type of method, without comment', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method1');

    assert.equal(doc.params.length, 2);
    assert.deepEqual(doc.params[0].types, ['number']);
    assert.deepEqual(doc.params[1].types, ['Foo']);

    assert.deepEqual(doc.return.types, ['string']);
  });

  it('has type of method, without tags', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method2');
    assert.equal(doc.params.length, 2);
    assert.deepEqual(doc.params[0].types, ['number']);
    assert.deepEqual(doc.params[1].types, ['Foo']);

    assert.deepEqual(doc.return.types, ['string']);
  });

  it('has type of method, without type', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method3');
    assert.equal(doc.params.length, 2);
    assert.deepEqual(doc.params[0].types, ['number']);
    assert.deepEqual(doc.params[1].types, ['Foo']);

    assert.deepEqual(doc.return.types, ['string']);
  });

  it('has type of method, extracting proper argument types', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method4');
    assert.equal(doc.params.length, 4);
    assert.deepEqual(doc.params[0].types, ['[number, number]']);
    assert.deepEqual(doc.params[1].types, ['Foo<string>']);
    assert.deepEqual(doc.params[2].types, ['string' , 'void']);
    assert.deepEqual(doc.params[3].types, ['THREE.Vector3']);

    assert.deepEqual(doc.return.types, ['string']);
    assert.equal(doc.return.nullable, true);
  });

  it('has type of getter, without comment', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#getter1');
    assert.deepEqual(doc.type.types, ['string']);
  });

  it('has type of setter, without comment', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#setter1');
    assert.deepEqual(doc.type.types, ['number']);
  });

  it('has type of member, without comment', ()=>{
    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#member1');
    assert.deepEqual(doc.type.types, ['number']);
  });

  it('has type of function, without comment', ()=>{
    const doc = find('longname', 'src/FlowType.js~testFlowTypeFunction');

    assert.equal(doc.params.length, 2);
    assert.deepEqual(doc.params[0].types, ['number']);
    assert.deepEqual(doc.params[1].types, ['Foo']);

    assert.deepEqual(doc.return.types, ['string']);
  });
});



================================================
FILE: esdoc-flow-type-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-importpath-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.2 (2018-04-29)
- **Fix**
  - Strip last slash ([#37](https://github.com/esdoc/esdoc-plugins/pull/37)) Thanks [@LestaD](https://github.com/LestaD)

## 1.0.1 (2017-09-09)
- **Feat**
  - Add `option.stripPackageName` ([#21](https://github.com/esdoc/esdoc-plugins/pull/21)) Thanks [@BKcore](https://github.com/BKcore)

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-importpath-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-importpath-plugin/README.md
================================================
# ESDoc Import Path Plugin
This is a plugin that converts the import path in documentation.
ESDoc displays the import path of class/function into the document.
However, the import path may be different from real import path because usually ES2015 is transpiled to use it.

For example, ``src/MyClass.js`` will be referred to as ``import MyClass from 'my-module/src/MyClass.js'`` in the documentation.
However, in practice it is different from the real import path when you use because it is transpiled
(for example, ``import MyClass from 'my-module/lib/MyClass.js'``).

Therefore, convert the import path by using following setting.

```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {
      "name": "esdoc-importpath-plugin",
      "option": {
        "stripPackageName": false,
        "replaces": [
          {"from": "^src/", "to": "lib/"}
        ]
      }
    }
  ]
}
```

``from`` is regular expression and ``to``is letter. In the internal ``from`` and ``to`` are used with ``String#replace(new RegExp (from), to)``.

When writing multi rules, it will also be carried out transformation many times.
For example, ``[{from: "^src/", to: "lib/"}, {from: "MyFooClass", to: "my-foo"}]`` converted as follows:

- `` my-module/src/MyFooClass.js`` => `` my-module/lib/MyFooClass.js`` => ``my-module/lib/my-foo``

``stripPackageName`` is a boolean that when set to ``true`` will strip the package name from the import path.

This is useful for projects that have custom module resolvers where you want to be able to replace the whole path.

## Install
```sh
npm install esdoc-importpath-plugin
```

## Config

```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {
      "name": "esdoc-importpath-plugin",
      "option": {
        "replaces": [
          {"from": "^src/", "to": "lib"}
        ]
      }
    }
  ]
}
```

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://twitter.com/h13i32maru)


================================================
FILE: esdoc-importpath-plugin/package.json
================================================
{
  "name": "esdoc-importpath-plugin",
  "version": "1.0.2",
  "description": "A import path plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "import",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-importpath-plugin/src/Plugin.js
================================================
const fs = require('fs');

class Plugin {
  onHandleConfig(ev) {
    this._config = ev.data.config;
  }

  onHandleDocs(ev) {
    const packagePath = this._config.package || './package.json';
    const option = ev.data.option;

    for (let item of option.replaces) {
      item.from = new RegExp(item.from);
    }

    // get package.json
    let packageName = '';
    let mainPath = '';
    try {
      const packageJSON = fs.readFileSync(packagePath).toString();
      const packageObj = JSON.parse(packageJSON);
      packageName = packageObj.name;
      if(packageObj.main) mainPath = packageObj.main;
    } catch (e) {
      // ignore
    }

    for (const doc of ev.data.docs) {
      if (!doc.importPath) continue;

      let importPath = doc.importPath;
      if (packageName) importPath = importPath.replace(new RegExp(`^${packageName}/`), '');

      for (let item of option.replaces) {
        importPath = importPath.replace(item.from, item.to);
      }

      if (importPath === mainPath || importPath.trim().length === 0) {
        doc.importPath = packageName;
      } else if (packageName && option.stripPackageName !== true) {
        doc.importPath = `${packageName}/${importPath}`;
      } else {
        doc.importPath = importPath;
      }
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-importpath-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "package": "./test/package.json",
  "plugins": [
    {
      "name": "./src/Plugin.js",
      "option": {
        "replaces": [
          {"from": "^src/", "to": "lib/"},
          {"from": "^lib/MyClass2.js", "to": "lib/foo"}
        ]
      }
    }
  ]
}


================================================
FILE: esdoc-importpath-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-importpath-plugin/test/package.json
================================================
{
  "name": "esdoc-importpath-plugin",
  "main": "lib/Index.js"
}


================================================
FILE: esdoc-importpath-plugin/test/src/Index.js
================================================
export default class Index {
}


================================================
FILE: esdoc-importpath-plugin/test/src/MyClass1.js
================================================
export default class MyClass1 {
}


================================================
FILE: esdoc-importpath-plugin/test/src/MyClass2.js
================================================
export default class MyClass2 {
}


================================================
FILE: esdoc-importpath-plugin/test/src/all.test.js
================================================
const assert = require('assert');
const {find} = require('../util');

describe('test/MyClass.js:', ()=> {

  it('converts simply', ()=> {
    const doc = find('name', 'MyClass1');
    assert.equal(doc.importPath, 'esdoc-importpath-plugin/lib/MyClass1.js');
  });

  it('converts multiple', ()=>{
    const doc = find('name', 'MyClass2');
    assert.equal(doc.importPath, 'esdoc-importpath-plugin/lib/foo');
  });

  it('converts with package name', ()=>{
    const doc = find('name', 'Index');
    assert.equal(doc.importPath, 'esdoc-importpath-plugin');
  });
});


================================================
FILE: esdoc-importpath-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-inject-gtm-plugin/CHANGELOG.md
================================================
# Changelog


================================================
FILE: esdoc-inject-gtm-plugin/README.md
================================================
# ESDoc Inject GTM Plugin

## Install

```bash
npm install esdoc-inject-gtm-plugin
```

## Config

```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-inject-script-plugin", "option": {"enable": true, "id": "GTM-XXXXX"}}
  ]
}
```

`enable` is default `true`.

## LICENSE

MIT

## Author

[9renpoto](https://github.com/9renpoto)


================================================
FILE: esdoc-inject-gtm-plugin/package.json
================================================
{
  "name": "esdoc-inject-gtm-plugin",
  "description": "A inject google-tag-manager plugin for ESDoc",
  "version": "0.0.1",
  "author": "9renpoto",
  "dependencies": {
    "cheerio": "^1.0.0-rc.2",
    "fs-extra": "^4.0.1"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "^3.5.0"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "files": [
    "src",
    "README.md"
  ],
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "keywords": [
    "esdoc",
    "inject",
    "plugin",
    "script"
  ],
  "license": "MIT",
  "main": "src/Plugin.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  }
}


================================================
FILE: esdoc-inject-gtm-plugin/src/Plugin.js
================================================
const fs = require("fs-extra")
const path = require("path")
const cheerio = require("cheerio")

const toSnippet = id => {
  return `<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','${id}');</script>`
}

class Plugin {
  onStart(ev) {
    this._option = ev.data.option || {}
    if (!("enable" in this._option)) this._option.enable = true
  }

  onHandleContent(ev) {
    if (!this._option.enable) return

    const fileName = ev.data.fileName
    if (path.extname(fileName) !== ".html") return

    const $ = cheerio.load(ev.data.content)

    $("head").append(toSnippet(this._option.id))

    ev.data.content = $.html()
  }

  onPublish(ev) {
    if (!this._option.enable) return
    ev.data.writeFile("gtm.js", toSnippet(this._option.id))
  }
}

module.exports = new Plugin()


================================================
FILE: esdoc-inject-gtm-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./test/misc/publish-html-mock-plugin.js"},
    {"name": "./src/Plugin.js", "option": {"id": "GTM-XXXXX"}}
  ]
}


================================================
FILE: esdoc-inject-gtm-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-inject-gtm-plugin/test/misc/publish-html-mock-plugin.js
================================================
exports.onPublish = function(ev) {
  const html = `
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<header></header>
</body>
</html>
`;
  ev.data.writeFile('index.html', html);
};


================================================
FILE: esdoc-inject-gtm-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-inject-gtm-plugin/test/src/MyClass.test.js
================================================
const assert = require("assert")
const path = require("path")
const fs = require("fs")
const cheerio = require("cheerio")

describe("test inject script result:", () => {
  it("has injected script tag title", () => {
    const html = fs.readFileSync("./test/out/index.html").toString()
    const $ = cheerio.load(html)
    assert.equal($("script").length, 1)
  })
})


================================================
FILE: esdoc-inject-script-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-inject-script-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-inject-script-plugin/README.md
================================================
# ESDoc Inject Script Plugin
## Install
```bash
npm install esdoc-inject-script-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-inject-script-plugin", "option": {"enable": true, "scripts": ["./foo.js"]}}
  ]
}
```

`enable` is default `true`.

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-inject-script-plugin/package.json
================================================
{
  "name": "esdoc-inject-script-plugin",
  "version": "1.0.0",
  "description": "A inject script plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "cheerio": "0.22.0",
    "fs-extra": "1.0.0"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "inject",
    "script",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-inject-script-plugin/src/Plugin.js
================================================
const fs = require('fs-extra');
const path = require('path');
const cheerio = require('cheerio');

class Plugin {
  onStart(ev) {
    this._option = ev.data.option || {};
    if (!('enable' in this._option)) this._option.enable = true;
  }

  onHandleContent(ev) {
    if (!this._option.enable) return;

    const fileName = ev.data.fileName;
    if (path.extname(fileName) !== '.html') return;

    const $ = cheerio.load(ev.data.content);

    let i = 0;
    for (const script of this._option.scripts) {
      const src = `./inject/script/${i}-${path.basename(script)}`;
      $('head').append(`<script src="${src}"></script>`);
    }

    ev.data.content = $.html();
  }

  onPublish(ev) {
    if (!this._option.enable) return;

    let i = 0;
    for (const script of this._option.scripts) {
      const outPath = `inject/script/${i}-${path.basename(script)}`;
      const content = fs.readFileSync(script).toString();
      ev.data.writeFile(outPath, content);
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-inject-script-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./test/misc/publish-html-mock-plugin.js"},
    {"name": "./src/Plugin.js", "option": {"scripts": ["./test/misc/inject.js"]}}
  ]
}


================================================
FILE: esdoc-inject-script-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-inject-script-plugin/test/misc/inject.js
================================================
console.log('this is injected script');


================================================
FILE: esdoc-inject-script-plugin/test/misc/publish-html-mock-plugin.js
================================================
exports.onPublish = function(ev) {
  const html = `
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<header></header>
</body>
</html>
`;
  ev.data.writeFile('index.html', html);
};


================================================
FILE: esdoc-inject-script-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-inject-script-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const path = require('path');
const fs = require('fs');
const cheerio = require('cheerio');

describe('test inject script result:', ()=> {
  it('has injected script tag title', ()=>{
    const html = fs.readFileSync('./test/out/index.html').toString();
    const $ = cheerio.load(html);
    assert.equal($('script[src="./inject/script/0-inject.js"]').length, 1);
  });

  it('has injected script', ()=>{
    const script = fs.readFileSync('./test/out/inject/script/0-inject.js').toString();
    assert.equal(script, "console.log('this is injected script');\n");

  });
});



================================================
FILE: esdoc-inject-style-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-inject-style-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-inject-style-plugin/README.md
================================================
# ESDoc Inject Style Plugin
## Install
```bash
npm install esdoc-inject-style-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-inject-style-plugin", "option": {"enable": true, "styles": ["./foo.css"]}}
  ]
}
```

`enable` is default `true`.

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-inject-style-plugin/package.json
================================================
{
  "name": "esdoc-inject-style-plugin",
  "version": "1.0.0",
  "description": "A inject style plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "cheerio": "0.22.0",
    "fs-extra": "1.0.0"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "inject",
    "style",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-inject-style-plugin/src/Plugin.js
================================================
const fs = require('fs');
const path = require('path');
const cheerio = require('cheerio');

class Plugin {
  onStart(ev) {
    this._option = ev.data.option || {};
    if (!('enable' in this._option)) this._option.enable = true;
  }

  onHandleContent(ev) {
    if (!this._option.enable) return;
    if (path.extname(ev.data.fileName) !== '.html') return;

    const $ = cheerio.load(ev.data.content);

    let i = 0;
    for (const style of this._option.styles) {
      const src = `./inject/css/${i}-${path.basename(style)}`;
      $('head').append(`<link rel="stylesheet" href="${src}"/>`);
    }

    ev.data.content = $.html();
  }

  onPublish(ev) {
    if (!this._option.enable) return;

    let i = 0;
    for (const style of this._option.styles) {
      const outPath = `inject/css/${i}-${path.basename(style)}`;
      const content = fs.readFileSync(style).toString();
      ev.data.writeFile(outPath, content);
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-inject-style-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./test/misc/publish-html-mock-plugin.js"},
    {"name": "./src/Plugin.js", "option": {"styles": ["./test/misc/inject.css"]}}
  ]
}


================================================
FILE: esdoc-inject-style-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-inject-style-plugin/test/misc/inject.css
================================================
body { background: #eee; }


================================================
FILE: esdoc-inject-style-plugin/test/misc/publish-html-mock-plugin.js
================================================
exports.onPublish = function(ev) {
  const html = `
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<header></header>
</body>
</html>
`;
  ev.data.writeFile('index.html', html);
};


================================================
FILE: esdoc-inject-style-plugin/test/src/MyClass.js
================================================
export default class MyClass {
}


================================================
FILE: esdoc-inject-style-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const path = require('path');
const fs = require('fs');
const cheerio = require('cheerio');

describe('test inject style result:', ()=> {
  it('has injected style tag title', ()=>{
    const html = fs.readFileSync('./test/out/index.html').toString();
    const $ = cheerio.load(html);
    assert.equal($('link[href="./inject/css/0-inject.css"]').length, 1);
  });

  it('has injected style', ()=>{
    const style = fs.readFileSync('./test/out/inject/css/0-inject.css').toString();
    assert.equal(style, "body { background: #eee; }\n");

  });
});



================================================
FILE: esdoc-integrate-manual-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-integrate-manual-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-integrate-manual-plugin/README.md
================================================
# ESDoc Integrate Manual Plugin
## Install
```bash
npm install esdoc-integrate-manual-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {
      "name": "esdoc-integrate-manual-plugin",
      "option": {
        "index": "./manual/index.md",
        "globalIndex": true,
        "asset": "./manual/asset",
        "files": [
          "./manual/overview.md",
          "./manual/design.md",
          "./manual/installation.md",
          "./manual/usage1.md",
          "./manual/usage2.md",
          "./manual/tutorial.md",
          "./manual/configuration.md",
          "./manual/example.md",
          "./manual/advanced.md",
          "./manual/faq.md",
          "./CHANGELOG.md"
        ]
      }
    }
  ]
}
```

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-integrate-manual-plugin/package.json
================================================
{
  "name": "esdoc-integrate-manual-plugin",
  "version": "1.0.0",
  "description": "A integrate manual plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "manual",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-integrate-manual-plugin/src/Plugin.js
================================================
const fs = require('fs');
const path = require('path');
const assert = require('assert');

class Plugin {
  onHandleDocs(ev) {
    this._docs = ev.data.docs;
    this._option = ev.data.option;

    this._exec();
  }

  _exec(){
    this._setDefault();

    const docs = this._generateDocs();
    this._docs.push(...docs);
  }

  _setDefault() {
    if (!this._option) return;

    assert(this._option.files);
    if (!('coverage' in this._option)) this._option.coverage = true;
  }

  _generateDocs() {
    const manual = this._option;
    const results = [];

    if (!this._option) return results;

    if (manual.index) {
      results.push({
        kind: 'manualIndex',
        globalIndex: manual.globalIndex,
        content: fs.readFileSync(manual.index).toString(),
        longname: path.resolve(manual.index),
        name: manual.index,
        static: true,
        access: 'public'
      });
    } else {
      results.push({
        kind: 'manualIndex',
        globalIndex: false,
        content: null,
        longname: '', // longname does not must be null.
        name: manual.index,
        static: true,
        access: 'public'
      });
    }

    if (manual.asset) {
      results.push({
        kind: 'manualAsset',
        longname: path.resolve(manual.asset),
        name: manual.asset,
        static: true,
        access: 'public'
      });
    }

    for (const filePath of manual.files) {
      results.push({
        kind: 'manual',
        longname: path.resolve(filePath),
        name: filePath,
        content: fs.readFileSync(filePath).toString(),
        static: true,
        access: 'public'
      });
    }

    return results;
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-integrate-manual-plugin/test/CHANGELOG.md
================================================
# Changelog

## 0.0.1
- **Fix**
  - fix a bug


================================================
FILE: esdoc-integrate-manual-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {
      "name": "./src/Plugin.js",
      "option": {
        "index": "./test/manual/index.md",
        "globalIndex": true,
        "asset": "./test/manual/asset",
        "files": [
          "./test/manual/overview.md",
          "./test/manual/design.md",
          "./test/manual/installation.md",
          "./test/manual/usage1.md",
          "./test/manual/usage2.md",
          "./test/manual/tutorial.md",
          "./test/manual/configuration.md",
          "./test/manual/example.md",
          "./test/manual/advanced.md",
          "./test/manual/faq.md",
          "./test/CHANGELOG.md"
        ]
      }
    }
  ]
}


================================================
FILE: esdoc-integrate-manual-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/advanced.md
================================================
# Advanced
foo


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/all.test.js
================================================
const assert = require('assert');
const {find, file} = require('../util');

describe('test/manual:', ()=>{
  it('has manual index', ()=>{
    const doc = find('longname', /manual\/index.md$/);
    assert.equal(doc.content, file(doc.name));
    assert.equal(doc.globalIndex, true);
  });

  it('has manual asset', ()=>{
    const doc = find('longname', /manual\/asset$/);
    assert(doc);
  });

  it('has manual overview', ()=>{
    const doc = find('longname', /manual\/overview.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual design', ()=>{
    const doc = find('longname', /manual\/design.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual installation', ()=>{
    const doc = find('longname', /manual\/installation.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual usage', ()=>{
    const [doc1, doc2] = find('longname', /manual\/usage1.md$/, /manual\/usage2.md$/);
    assert.equal(doc1.content, file(doc1.name));
    assert.equal(doc2.content, file(doc2.name));
  });

  it('has manual tutorial', ()=>{
    const doc = find('longname', /manual\/tutorial.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual configuration', ()=>{
    const doc = find('longname', /manual\/configuration.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual example', ()=>{
    const doc = find('longname', /manual\/example.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual advanced', ()=>{
    const doc = find('longname', /manual\/advanced.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual faq', ()=>{
    const doc = find('longname', /manual\/faq.md$/);
    assert.equal(doc.content, file(doc.name));
  });

  it('has manual changelog', ()=>{
    const doc = find('longname', /CHANGELOG.md$/);
    assert.equal(doc.content, file(doc.name));
  });
});


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/configuration.md
================================================
# Configuration
this is configuration.


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/design.md
================================================
# Design
## Concept
foo

## Architecture
foo


## Model
foo


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/example.md
================================================
# Example

## Minimum Config
```json
{
  "source": "./src",
  "destination": "./doc"
}
```

## Integration Test Code Into Documentation
```json
{
  "source": "./src",
  "destination": "./doc",
  "test": {
    "type": "mocha",
    "source": "./test"
  }
}
```


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/faq.md
================================================
# FAQ

- [Goal](#goal)

## Goal
ESDoc has two goals.
The first goal is reducing the cost to write an documentation, it is able to continuously maintenance.
The second goal is without looking the source code of a library, it is to be able to use the library.


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/index.md
================================================
# ESDoc Manual
tbd


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/installation.md
================================================
# Installation

```sh
npm install -g esdoc
```

## indent 2
### indent 3
#### indent 4
##### indent 5


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/overview.md
================================================
# Overview

ESDoc is a documentation generator for JavaScript(ES6).

<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);">

## Feature
- Generates detailed document.
- Measures document coverage.
- Integrate test codes into documentation.
- [ESDoc Hosting Service](https://doc.esdoc.org)

## Demo
- [ESDoc](https://esdoc.org/esdoc) is self-hosting &#x1F604;

## License
MIT

## Author
[Ryo Maruyama@h13i32maru](https://twitter.com/h13i32maru)


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/tutorial.md
================================================
# Tutorial
this is tutorial.


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/usage1.md
================================================
# Usage

```sh
esdoc -c esdoc.json
```

``esdoc.json``

```json
{
  "source": "./src",
  "destination": "./doc"
}
```


================================================
FILE: esdoc-integrate-manual-plugin/test/manual/usage2.md
================================================
# Usage2
this is usage2

## h2 in usage2
this is h2 in usage2

### h3 in usage2
this is h2 in usage3


================================================
FILE: esdoc-integrate-manual-plugin/test/src/Dummy.js
================================================
export default class TestDummy {}


================================================
FILE: esdoc-integrate-manual-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-integrate-test-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-integrate-test-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-integrate-test-plugin/README.md
================================================
# ESDoc Integrate Test Plugin
## Install
```bash
npm install esdoc-integrate-test-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./docs",
  "plugins": [
    {
      "name": "esdoc-integrate-test-plugin",
      "option": {
        "source": "./test/",
        "interfaces": ["describe", "it", "context", "suite", "test"],
        "includes": ["(spec|Spec|test|Test)\\.js$"],
        "excludes": ["\\.config\\.js$"]
      }
    }
  ]
}
```

- `source` is required
- `interfaces` default is `["describe", "it", "context", "suite", "test"]`
- `includes` default is `["(spec|Spec|test|Test)\\.js$"]`
- `excludes` default is `["\\.config\\.js$"]`

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-integrate-test-plugin/package.json
================================================
{
  "name": "esdoc-integrate-test-plugin",
  "version": "1.0.0",
  "description": "A integrate test plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "test",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-integrate-test-plugin/src/Plugin.js
================================================
const assert = require('assert');
const path = require('path');
const fs = require('fs');
const TestDocFactory = require('./TestDocFactory');

// hack
const ESParser = require('esdoc/out/src/Parser/ESParser').default;
const InvalidCodeLogger = require('esdoc/out/src/Util/InvalidCodeLogger').default;
const PathResolver = require('esdoc/out/src/Util/PathResolver').default;
const ASTUtil = require('esdoc/out/src/Util/ASTUtil').default;

class Plugin {
  onHandleDocs(ev) {
    this._docs = ev.data.docs;
    this._option = ev.data.option;

    this._exec();
  }

  _exec() {
    this._setDefault();

    const docs = this._generateDocs();
    this._docs.push(...docs);
  }

  _setDefault() {
    if (!this._option) return;

    const option = this._option;
    assert(option.source);
    if (!option.interfaces) option.interfaces = ['describe', 'it', 'context', 'suite', 'test'];
    if (!option.includes) option.includes = ['(spec|Spec|test|Test)\\.js$'];
    if (!option.excludes) option.excludes = ['\\.config\\.js$'];
  }

  /**
   * Generate document from test code.
   */
  _generateDocs() {
    const option = this._option;
    const results = [];

    if (!option) return results;

    const includes = option.includes.map((v) => new RegExp(v));
    const excludes = option.excludes.map((v) => new RegExp(v));
    const sourceDirPath = path.resolve(option.source);

    this._walk(option.source, (filePath)=>{
      const relativeFilePath = path.relative(sourceDirPath, filePath);
      let match = false;
      for (const reg of includes) {
        if (relativeFilePath.match(reg)) {
          match = true;
          break;
        }
      }
      if (!match) return;

      for (const reg of excludes) {
        if (relativeFilePath.match(reg)) return;
      }

      console.log(`parse: ${filePath}`);
      const temp = this._traverse(option.interfaces, option.source, filePath);
      if (!temp) return;
      results.push(...temp.results);

      // todo: enable work
      // asts.push({filePath: `test${path.sep}${relativeFilePath}`, ast: temp.ast});
    });

    return results;
  }

  /**
   * walk recursive in directory.
   * @param {string} dirPath - target directory path.
   * @param {function(entryPath: string)} callback - callback for find file.
   * @private
   */
  _walk(dirPath, callback) {
    const entries = fs.readdirSync(dirPath);

    for (const entry of entries) {
      const entryPath = path.resolve(dirPath, entry);
      const stat = fs.statSync(entryPath);

      if (stat.isFile()) {
        callback(entryPath);
      } else if (stat.isDirectory()) {
        this._walk(entryPath, callback);
      }
    }
  }

  /**
   * traverse doc comment in test code file.
   * @param {string[]} interfaces - test interface names.
   * @param {string} inDirPath - root directory path.
   * @param {string} filePath - target test code file path.
   * @returns {Object} return document info that is traversed.
   * @property {DocObject[]} results - this is contained test code.
   * @property {AST} ast - this is AST of test code.
   * @private
   */
  _traverse(interfaces, inDirPath, filePath) {
    let ast;
    try {
      ast = ESParser.parse(filePath);
    } catch (e) {
      InvalidCodeLogger.showFile(filePath, e);
      return null;
    }
    const pathResolver = new PathResolver(inDirPath, filePath);
    const factory = new TestDocFactory(interfaces, ast, pathResolver);

    ASTUtil.traverse(ast, (node, parent)=>{
      try {
        factory.push(node, parent);
      } catch (e) {
        InvalidCodeLogger.show(filePath, node);
        throw e;
      }
    });

    return {results: factory.results, ast: ast};
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-integrate-test-plugin/src/TestDoc.js
================================================
// hack: depends on esdoc internal class
const AbstractDoc = require('esdoc/out/src/Doc/AbstractDoc').default;
const ParamParser = require('esdoc/out/src/Parser/ParamParser').default;

/**
 * Doc Class from test code file.
 */
class TestDoc extends AbstractDoc {
  /**
   * apply own tag.
   * @private
   */
  _apply() {
    super._apply();

    this._$testTarget();

    Reflect.deleteProperty(this._value, 'export');
    Reflect.deleteProperty(this._value, 'importPath');
    Reflect.deleteProperty(this._value, 'importStyle');
  }

  /** use name property of self node. */
  _$kind() {
    super._$kind();

    this._value.kind = 'test';
  }

  /** set name and testId from special esdoc property. */
  _$name() {
    super._$name();

    this._value.name = this._node._esdocTestName;
    this._value.testId = this._node._esdocTestId;
  }

  /** set memberof to use parent test nod and file path. */
  _$memberof() {
    super._$memberof();

    const chain = [];
    let parent = this._node.parent;
    while (parent) {
      if (parent._esdocTestName) chain.push(parent._esdocTestName);
      parent = parent.parent;
    }

    const filePath = this._pathResolver.filePath;

    if (chain.length) {
      this._value.memberof = `${filePath}~${chain.reverse().join('.')}`;
      this._value.testDepth = chain.length;
    } else {
      this._value.memberof = filePath;
      this._value.testDepth = 0;
    }
  }

  /** set describe by using test node arguments. */
  _$desc() {
    super._$desc();
    if (this._value.description) return;

    this._value.description = this._node.arguments[0].value;
  }

  /** for @testTarget. */
  _$testTarget() {
    const values = this._findAllTagValues(['@test', '@testTarget']);
    if (!values) return;

    this._value.testTargets = [];
    for (const value of values) {
      const {typeText} = ParamParser.parseParamValue(value, true, false, false);
      this._value.testTargets.push(typeText);
    }
  }

  _$test() {
    // alias of testTarget
  }
}

module.exports = TestDoc;


================================================
FILE: esdoc-integrate-test-plugin/src/TestDocFactory.js
================================================
const assert = require('assert');
const TestDoc = require('./TestDoc');
const TestFileDoc = require('./TestFileDoc');
// hack: depends on ESDoc internal class
const CommentParser = require('esdoc/out/src/Parser/CommentParser').default;

const already = Symbol('already');

/**
 * Test doc factory class.
 * @example
 * let factory = new TestDocFactory('mocha', ast, pathResolver);
 * factory.push(node, parentNode);
 * let results = factory.results;
 */
class TestDocFactory {
  /**
   * get unique id.
   * @returns {number} unique id.
   * @private
   */
  static _getUniqueId() {
    if (!this._sequence) /** @type {number} */ this._sequence = 0;

    return this._sequence++;
  }

  /**
   * @type {DocObject[]}
   */
  get results() {
    return [...this._results];
  }

  /**
   * create instance.
   * @param {string[]} interfaces - test interface names.
   * @param {AST} ast - AST of test code.
   * @param {PathResolver} pathResolver - path resolver of test code.
   */
  constructor(interfaces, ast, pathResolver) {
    /** @type {string} */
    this._interfaces = interfaces;

    /** @type {AST} */
    this._ast = ast;

    /** @type {PathResolver} */
    this._pathResolver = pathResolver;

    /** @type {DocObject[]} */
    this._results = [];

    // file doc
    const doc = new TestFileDoc(ast, ast, pathResolver, []);
    this._results.push(doc.value);
  }

  /**
   * push node, and factory process the node.
   * @param {ASTNode} node - target node.
   * @param {ASTNode} parentNode - parent node of target node.
   */
  push(node, parentNode) {
    if (node[already]) return;

    node[already] = true;
    Reflect.defineProperty(node, 'parent', {value: parentNode});

    this._push(node);
  }

  /**
   * push node as mocha test code.
   * @param {ASTNode} node - target node.
   * @private
   */
  _push(node) {
    if (node.type !== 'ExpressionStatement') return;

    const expression = node.expression;
    if (expression.type !== 'CallExpression') return;

    if (!this._interfaces.includes(expression.callee.name)) return;

    expression[already] = true;
    Reflect.defineProperty(expression, 'parent', {value: node});

    let tags = [];
    if (node.leadingComments && node.leadingComments.length) {
      const comment = node.leadingComments[node.leadingComments.length - 1];
      tags = CommentParser.parse(comment);
    }

    const uniqueId = this.constructor._getUniqueId();
    expression._esdocTestId = uniqueId;
    expression._esdocTestName = expression.callee.name + uniqueId;

    const testDoc = new TestDoc(this._ast, expression, this._pathResolver, tags);

    this._results.push(testDoc.value);
  }
}

module.exports = TestDocFactory;


================================================
FILE: esdoc-integrate-test-plugin/src/TestFileDoc.js
================================================
// hack: depends on esdoc internal class
const FileDoc = require('esdoc/out/src/Doc/FileDoc').default;

/**
 * Doc class for test code file.
 */
class TestFileDoc extends FileDoc {
  /** set ``testFile`` to kind. */
  _$kind() {
    this._value.kind = 'testFile';
  }
}

module.exports = TestFileDoc;


================================================
FILE: esdoc-integrate-test-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {
      "name": "./src/Plugin.js",
      "option": {
        "source": "./test/test",
        "excludes": ["\\.test\\.js$"]
      }
    }
  ]
}


================================================
FILE: esdoc-integrate-test-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-integrate-test-plugin/test/src/Dummy.js
================================================
export default class Dummy {
}


================================================
FILE: esdoc-integrate-test-plugin/test/test/Test.js
================================================
/**
 * @test {TestTarget1}
 */
describe('describe/', ()=>{
  /**
   * @test {TestTarget2}
   */
  it('describe/it', ()=>{});

  /**
   * @test {TestTarget3}
   */
  describe('describe/describe/', ()=>{
    /**
     * @test {TestTarget4}
     */
    it('describe/describe/it', ()=>{});
  });

  /**
   * @test {TestTarget5}
   */
  context('describe/context/', ()=>{
    /**
     * @test {TestTarget6}
     */
    it('describe/context/it', ()=>{});
  });
});

/**
 * @test {TestTarget7}
 */
suite('suite/', ()=>{
  /**
   * @test {TestTarget8}
   */
  test('suite/test', ()=>{});

  /**
   * @test {TestTarget9}
   */
  suite('suite/suite/', ()=>{
    /**
     * @test {TestTarget10}
     */
    test('suite/suite/test', ()=>{});
  })
});


================================================
FILE: esdoc-integrate-test-plugin/test/test/Test.test.js
================================================
const assert = require('assert');
const {find} = require('../util');

describe('test/Test.js:', ()=>{
  it('has describe/', ()=>{
    const doc = find('longname', 'test/Test.js~describe0');
    assert.equal(doc.testId, 0);
    assert.equal(doc.testDepth, 0);
    assert.equal(doc.description, 'describe/');
    assert.deepEqual(doc.testTargets, ['TestTarget1']);
  });

  it('has describe/it', ()=>{
    const doc = find('longname', 'test/Test.js~describe0.it1');
    assert.equal(doc.testId, 1);
    assert.equal(doc.testDepth, 1);
    assert.equal(doc.description, 'describe/it');
    assert.deepEqual(doc.testTargets, ['TestTarget2']);
  });

  it('has describe/describe', ()=>{
    const doc = find('longname', 'test/Test.js~describe0.describe2');
    assert.equal(doc.testId, 2);
    assert.equal(doc.testDepth, 1);
    assert.equal(doc.description, 'describe/describe/');
    assert.deepEqual(doc.testTargets, ['TestTarget3']);
  });

  it('has describe/describe/it', ()=>{
    const doc = find('longname', 'test/Test.js~describe0.describe2.it3');
    assert.equal(doc.testId, 3);
    assert.equal(doc.testDepth, 2);
    assert.equal(doc.description, 'describe/describe/it');
    assert.deepEqual(doc.testTargets, ['TestTarget4']);
  });

  it('has describe/context/it', ()=>{
    const doc = find('longname', 'test/Test.js~describe0.context4.it5');
    assert.equal(doc.testId, 5);
    assert.equal(doc.testDepth, 2);
    assert.equal(doc.description, 'describe/context/it');
    assert.deepEqual(doc.testTargets, ['TestTarget6']);
  });

  it('has suite/', ()=>{
    const doc = find('longname', 'test/Test.js~suite6');
    assert.equal(doc.testId, 6);
    assert.equal(doc.testDepth, 0);
    assert.equal(doc.description, 'suite/');
    assert.deepEqual(doc.testTargets, ['TestTarget7']);
  });

  it('has suite/test', ()=>{
    const doc = find('longname', 'test/Test.js~suite6.test7');
    assert.equal(doc.testId, 7);
    assert.equal(doc.testDepth, 1);
    assert.equal(doc.description, 'suite/test');
    assert.deepEqual(doc.testTargets, ['TestTarget8']);
  });

  it('has suite/suite/', ()=>{
    const doc = find('longname', 'test/Test.js~suite6.suite8');
    assert.equal(doc.testId, 8);
    assert.equal(doc.testDepth, 1);
    assert.equal(doc.description, 'suite/suite/');
    assert.deepEqual(doc.testTargets, ['TestTarget9']);
  });

  it('has suite/suite/test', ()=>{
    const doc = find('longname', 'test/Test.js~suite6.suite8.test9');
    assert.equal(doc.testId, 9);
    assert.equal(doc.testDepth, 2);
    assert.equal(doc.description, 'suite/suite/test');
    assert.deepEqual(doc.testTargets, ['TestTarget10']);
  });
});




================================================
FILE: esdoc-integrate-test-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-jsx-plugin/CHANGELOG.md
================================================
# Changelog

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-jsx-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-jsx-plugin/README.md
================================================
# ESDoc JSX Plugin
## Install
```bash
npm install esdoc-jsx-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-jsx-plugin", "option": {"enable": true}}
  ]
}
```

- `enable` is default `true`

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-jsx-plugin/package.json
================================================
{
  "name": "esdoc-jsx-plugin",
  "version": "1.0.0",
  "description": "A JSX plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "jsx",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-jsx-plugin/src/Plugin.js
================================================
class Plugin {
  onHandleCodeParser(ev) {
    const option = ev.data.option || {};
    const plugins = ev.data.parserOption.plugins;

    if (!('enable' in option)) option.enable = true;

    if (option.enable) plugins.push('jsx');
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-jsx-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-jsx-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-jsx-plugin/test/src/MyClass.js
================================================
export default class MyClass {
  method(){
    return <div>hello</div>;
  }
}


================================================
FILE: esdoc-jsx-plugin/test/src/MyClass.test.js
================================================
const assert = require('assert');
const {find} = require('../util');

describe('test/MyClass.js:', ()=> {
  it('can parse jsx', ()=>{
    const doc = find('longname', 'src/MyClass.js~MyClass#method');
    assert(doc);
  });
});



================================================
FILE: esdoc-jsx-plugin/test/util.js
================================================
const fs = require('fs');

exports.find = function(key, ...values) {
  if (values.length === 1) {
    return global.docs.find((doc) => {
      if (typeof values[0] === 'string') return doc[key] === values[0];
      if (values[0] instanceof RegExp) return doc[key].match(values[0]);
    });
  }

  const results = [];
  for (const value of values) {
    const result = global.docs.find(doc => {
      if (typeof value === 'string') return doc[key] === value;
      if (value instanceof RegExp) return doc[key].match(value);
    });

    results.push(result);
  }

  return results;
};

exports.file = function (filePath) {
  return fs.readFileSync(filePath).toString();
};



================================================
FILE: esdoc-lint-plugin/CHANGELOG.md
================================================
# Changelog

## Next
- **Fix**
  - 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)

## 1.0.1 (2017-09-09)
- **Fix**
  - 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)

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-lint-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-lint-plugin/README.md
================================================
# ESDoc Lint Plugin
## Install
```bash
npm install esdoc-lint-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-lint-plugin", "option": {"enable": true}}
  ]
}
```

`enable` is default `true`

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)



================================================
FILE: esdoc-lint-plugin/package.json
================================================
{
  "name": "esdoc-lint-plugin",
  "version": "1.0.1",
  "description": "A lint plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "devDependencies": {
    "esdoc": "latest",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "test": "rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec"
  },
  "keywords": [
    "esdoc",
    "lint",
    "plugin"
  ],
  "files": [
    "src",
    "README.md"
  ],
  "main": "src/Plugin.js"
}


================================================
FILE: esdoc-lint-plugin/src/Plugin.js
================================================
const path = require('path');
const fs = require('fs');
// hack: using a internal code of esdoc.
const ASTNodeContainer = require('esdoc/out/src/Util/ASTNodeContainer.js').default;

/**
 * Lint Output Builder class.
 */
class Plugin {
  onHandleDocs(ev) {
    this._docs = ev.data.docs;
    this._option = ev.data.option || {};
    this._results = null;
    if (!('enable' in this._option)) this._option.enable = true;
  }

  onPublish(ev) {
    if (!this._option.enable) return;

    const tmpResults = [];
    const docs = this._docs.filter(v => ['method', 'function'].includes(v.kind));
    for (const doc of docs) {
      if (doc.undocument) continue;

      const node = ASTNodeContainer.getNode(doc.__docId__);
      const codeParams = this._getParamsFromNode(node);
      const docParams = this._getParamsFromDoc(doc);
      if (this._match(codeParams, docParams)) continue;

      tmpResults.push({node, doc, codeParams, docParams});
    }

    const results = this._formatResult(tmpResults);

    ev.data.writeFile('lint.json', JSON.stringify(results, null, 2));

    this._results = results;
  }

  onComplete() {
    if (!this._option.enable) return;

    this._showResult();
  }

  /**
   * get variable names of method argument.
   * @param {ASTNode} node - target node.
   * @returns {string[]} variable names.
   * @private
   */
  _getParamsFromNode(node) {
    let params;
    switch (node.type) {
      case 'FunctionExpression':
      case 'FunctionDeclaration':
        params = node.params || [];
        break;
      case 'ClassMethod':
        params = node.params || [];
        break;
      case 'ArrowFunctionExpression':
        params = node.params || [];
        break;
      default:
        throw new Error(`unknown node type. type = ${node.type}`);
    }

    const result = [];
    for (const param of params) {
      switch (param.type) {
        case 'Identifier':
          result.push(param.name);
          break;
        case 'AssignmentPattern':
          if (param.left.type === 'Identifier') {
            result.push(param.left.name);
          } else if (param.left.type === 'ObjectPattern') {
            result.push('*');
          }
          break;
        case 'RestElement':
          result.push(param.argument.name);
          break;
        case 'ObjectPattern':
          result.push('*');
          break;
        case 'ArrayPattern':
          result.push('*');
          break;
        default:
          throw new Error(`unknown param type: ${param.type}`);
      }
    }

    return result;
  }

  /**
   * get variable names of method argument.
   * @param {DocObject} doc - target doc object.
   * @returns {string[]} variable names.
   * @private
   */
  _getParamsFromDoc(doc) {
    const params = doc.params || [];
    return params.map(v => v.name).filter(v => !v.includes('.')).filter(v => !v.includes('['));
  }

  _match(codeParams, docParams) {
    if (codeParams.length !== docParams.length) return false;

    for (let i = 0; i < codeParams.length; i++) {
      if (codeParams[i] === '*') {
        // nothing
      } else if (codeParams[i] !== docParams[i]) {
        return false;
      }
    }

    return true;
  }

  /**
   * show invalid lint code.
   * @param {Object[]} tmpResults - target results.
   * @param {DocObject} tmpResults[].doc
   * @param {ASTNode} tmpResults[].node
   * @param {string[]} tmpResults[].codeParams
   * @param {string[]} tmpResults[].docParams
   * @private
   */
  _formatResult(tmpResults) {
    const results = [];
    for (const result of tmpResults) {
      const doc = result.doc;
      const node = result.node;
      const filePath = doc.longname.split('~')[0];
      const name = doc.longname.split('~')[1];

      let startLineNumber;

      if (node.leadingComments) {
        const comment = node.leadingComments[node.leadingComments.length - 1];
        startLineNumber = comment.loc.start.line;
      } else if (node.parent.leadingComments) {
        const comment = node.parent.leadingComments[node.parent.leadingComments.length - 1];
        startLineNumber = comment.loc.start.line;
      } else {
        // Missing leadingComments fallback: will report the node start line instead of the comment one
        startLineNumber = node.loc.start.line;
      }

      const endLineNumber = node.loc.start.line;
      const fileDoc = this._docs.find(tag => tag.kind === 'file' && tag.name === filePath);
      const lines = fileDoc.content.split('\n');
      const targetLines = [];

      for (let i = startLineNumber - 1; i < endLineNumber; i++) {
        targetLines.push({lineNumber: i, line: lines[i]});
      }

      results.push({
        name: name,
        filePath: filePath,
        lines: targetLines,
        codeParams: result.codeParams,
        docParams: result.docParams,
      });
    }

    return results;
  }

  _showResult() {
    if (!this._option.enable) return;
    for (const result of this._results) {
      console.log(`warning: signature mismatch: ${result.name} ${result.filePath}#${result.lines[0].lineNumber}`);
      for (const line of result.lines) {
        console.log(`${line.lineNumber}| ${line.line}`);
      }
      console.log('');
    }
  }
}

module.exports = new Plugin();


================================================
FILE: esdoc-lint-plugin/test/esdoc.json
================================================
{
  "source": "./test/src",
  "destination": "./test/out",
  "excludes": ["\\.test\\.js$"],
  "plugins": [
    {"name": "./src/Plugin.js"}
  ]
}


================================================
FILE: esdoc-lint-plugin/test/init.js
================================================
const path = require('path');
const fs = require('fs');
const ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;

function cli() {
  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');
  const argv = ['node', cliPath, '-c', './test/esdoc.json'];
  const cli = new ESDocCLI(argv);
  cli.exec();
  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());
}

cli();


================================================
FILE: esdoc-lint-plugin/test/src/MyArrowFunction.js
================================================

/**
 * this is arrowFunction1 with a good import
 * @param p1
 * @param p2
 */
export const arrowFunction1 = (p1, p2) => {};

/**
 * this is arrowFunction2 with a bad import
 * necessary to tests the missing leadingComments
 * @param p1
 */
export const arrowFunction2 = (p1, p2) => {};


================================================
FILE: esdoc-lint-plugin/test/src/MyClass.js
================================================
/**
 * this is MyClass.
 */
export default class MyClass {
  /**
   * this is method1.
   * @param {number} x
   */
  method1(p){}

  /**
   * this is method2.
   * @param {number} x1
   * @param {number[]} x2
   * @param {Object} x3
   */
  method2(p1 = 10, p2 = [1,2,3], p3 = {foo:1, bar: 2}){}

  /**
   * this is method3.
   * @param {number[]} x
   */
  method3(...p){}

  /**
   * this is method4.
   * @param {Object} o
   */
  method4({p1, p2}, {p3, p4}){}
}


================================================
FILE: esdoc-lint-plugin/test/src/results.test.js
================================================
const assert = require('assert');
const fs = require('fs');
const path = require('path');

describe('test/results.js:', ()=>{
  const tmp = fs.readFileSync('./test/out/lint.json').toString();
  const lintResults = JSON.parse(tmp);

  it('has 5 lint errors.', ()=>{
    assert.equal(lintResults.length, 5);
    assert.equal(lintResults[0].name, 'arrowFunction2');
    assert.equal(lintResults[1].name, 'MyClass#method1');
    assert.equal(lintResults[2].name, 'MyClass#method2');
    assert.equal(lintResults[3].name, 'MyClass#method3');
    assert.equal(lintResults[4].name, 'MyClass#method4');
  });
});


================================================
FILE: esdoc-publish-html-plugin/.babelrc
================================================
{
  "plugins": [
    "transform-es2015-modules-commonjs"
  ]
}


================================================
FILE: esdoc-publish-html-plugin/CHANGELOG.md
================================================
# Changelog

## Next
- **Fix**
  - Crash if object key includes a comma ([#49](https://github.com/esdoc/esdoc-plugins/pull/49)). Thanks [@josephschmitt](https://github.com/josephschmitt)

## 1.1.1 (2018-04-29)
- **Chore**
  - Update `marked`

## 1.1.0 (2017-09-10)
- **Feat**
  - Support custom template ([#12](https://github.com/esdoc/esdoc-plugins/pull/12)) Thanks [@andersevenrud](https://github.com/andersevenrud)

## 1.0.0 (2017-07-30)
- Release


================================================
FILE: esdoc-publish-html-plugin/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Ryo Maruyama

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: esdoc-publish-html-plugin/README.md
================================================
# ESDoc Publish HTML Plugin
## Install
```bash
npm install esdoc-publish-html-plugin
```

## Config
```json
{
  "source": "./src",
  "destination": "./doc",
  "plugins": [
    {"name": "esdoc-publish-html-plugin"}
  ]
}
```

## Custom Template
To use a custom template (ex `my-template` placed in the working directory):
```json
    {"name": "esdoc-publish-html-plugin", "option": {"template": "my-template"}}
```

We recommend that you base on [the original template](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-publish-html-plugin/src/Builder/template).

## LICENSE
MIT

## Author
[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)


================================================
FILE: esdoc-publish-html-plugin/package.json
================================================
{
  "name": "esdoc-publish-html-plugin",
  "version": "1.1.1",
  "description": "A publish HTML plugin for ESDoc",
  "author": "h13i32maru",
  "homepage": "https://github.com/esdoc/esdoc-plugins",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/esdoc/esdoc-plugins"
  },
  "dependencies": {
    "cheerio": "0.22.0",
    "fs-extra": "1.0.0",
    "escape-html": "1.0.3",
    "babel-generator": "6.11.4",
    "ice-cap": "0.0.4",
    "marked": "0.3.19",
    "taffydb": "2.7.2"
  },
  "devDependencies": {
    "babel-cli": "6.11.4",
    "babel-plugin-transform-es2015-modules-commonjs": "6.11.5",
    "babel-register": "6.11.6",
    "esdoc": "^1.1.0",
    "esdoc-accessor-plugin": "^1.0.0",
    "esdoc-brand-plugin": "^1.0.0",
    "esdoc-coverage-plugin": "^1.1.0",
    "esdoc-ecmascript-proposal-plugin": "^1.0.0",
    "esdoc-external-ecmascript-plugin": "^1.0.0",
    "esdoc-integrate-manual-plugin": "^1.0.0",
    "esdoc-integrate-test-plugin": "^1.0.0",
    "esdoc-type-inference-plugin": "^1.0.1",
    "esdoc-undocumented-identifier-plugin": "^1.0.0",
    "esdoc-unexported-identifier-plugin": "^1.0.0",
    "mocha": "2.5.3"
  },
  "engines": {
    "node": ">= 6.0.0"
  },
  "scripts": {
    "build": "rm -rf ./out/src && babel --out-dir out/src --ignore 'Builder/template' src && cp -a src/Builder/template out/src/Builder/",
    "test": "rm -rf ./test/fixture/out && mocha -t 10000 --require ./node_modules/babel-register --require ./test/src/init.js --recursive ./test/src -R spec"
  },
  "keywords": [
    "esdoc",
    "publish",
    "html",
    "plugin"
  ],
  "files": [
    "out/src",
    "README.md"
  ],
  "main": "out/src/Plugin.js"
}


================================================
FILE: esdoc-publish-html-plugin/src/Builder/ClassDocBuilder.js
================================================
import IceCap from 'ice-cap';
import DocBuilder from './DocBuilder.js';
import {parseExample} from './util.js';

/**
 * Class Output Builder class.
 */
export default class ClassDocBuilder extends DocBuilder {
  exec(writeFile) {
    const ice = this._buildLayoutDoc();
    ice.autoDrop = false;
    const docs = this._find({kind: ['class']});
    for (const doc of docs) {
      const fileName = this._getOutputFileName(doc);
      const baseUrl = this._getBaseUrl(fileName);
      const title = this._getTitle(doc);
      ice.load('content', this._buildClassDoc(doc), IceCap.MODE_WRITE);
      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);
      ice.text('title', title, IceCap.MODE_WRITE);
      writeFile(fileName, ice.html);
    }
  }

  /**
   * build class output.
   * @param {DocObject} doc - class doc object.
   * @returns {IceCap} built output.
   * @private
   */
  _buildClassDoc(doc) {
    const expressionExtends = this._buildExpressionExtendsHTML(doc);
    const mixinClasses = this._buildMixinClassesHTML(doc);
    const extendsChain = this._buildExtendsChainHTML(doc);
    const directSubclass = this._buildDirectSubclassHTML(doc);
    const indirectSubclass = this._buildIndirectSubclassHTML(doc);
    const instanceDocs = this._find({kind: 'variable'}).filter((v)=> {
      return v.type && v.type.types.includes(doc.longname);
    });

    const ice = new IceCap(this._readTemplate('class.html'));

    // header
    if (doc.export && doc.importPath && doc.importStyle) {
      const link = this._buildFileDocLinkHTML(doc, doc.importPath);
      ice.into('importPath', `import ${doc.importStyle} from '${link}'`, (code, ice)=>{
        ice.load('importPathCode', code);
      });
    }
    ice.text('access', doc.access);
    ice.text('kind', doc.interface ? 'interface' : 'class');
    ice.load('source', this._buildFileDocLinkHTML(doc, 'source'), 'append');
    ice.text('since', doc.since, 'append');
    ice.text('version', doc.version, 'append');
    ice.load('variation', this._buildVariationHTML(doc), 'append');

    ice.into('expressionExtends', expressionExtends, (expressionExtends, ice)=> ice.load('expressionExtendsCode', expressionExtends));
    ice.load('mixinExtends', mixinClasses, 'append');
    ice.load('extendsChain', extendsChain, 'append');
    ice.load('directSubclass', directSubclass, 'append');
    ice.load('indirectSubclass', indirectSubclass, 'append');
    ice.load('implements', this._buildDocsLinkHTML(doc.implements, null, false, ', '), 'append');
    ice.load('indirectImplements', this._buildDocsLinkHTML(doc._custom_indirect_implements, null, false, ', '), 'append');
    ice.load('directImplemented', this._buildDocsLinkHTML(doc._custom_direct_implemented, null, false, ', '), 'append');
    ice.load('indirectImplemented', this._buildDocsLinkHTML(doc._custom_indirect_implemented, null, false, ', '), 'append');

    // self
    ice.text('name', doc.name);
    ice.load('description', doc.description);
    ice.load('deprecated', this._buildDeprecatedHTML(doc));
    ice.load('experimental', this._buildExperimentalHTML(doc));
    ice.load('see', this._buildDocsLinkHTML(doc.see), 'append');
    ice.load('todo', this._buildDocsLinkHTML(doc.todo), 'append');
    ice.load('decorator', this._buildDecoratorHTML(doc), 'append');

    ice.into('instanceDocs', instanceDocs, (instanceDocs, ice)=>{
      ice.loop('instanceDoc', instanceDocs, (i, instanceDoc, ice)=>{
        ice.load('instanceDoc', this._buildDocLinkHTML(instanceDoc.longname));
      });
    });

    ice.into('exampleDocs', doc.examples, (examples, ice)=>{
      ice.loop('exampleDoc', examples, (i, example, ice)=>{
        const parsed = parseExample(example);
        ice.text('exampleCode', parsed.body);
        ice.text('exampleCaption', parsed.caption);
      });
    });

    ice.into('tests', doc._custom_tests, (tests, ice)=>{
      ice.loop('test', tests, (i, test, ice)=>{
        const testDoc = this._find({longname: test})[0];
        ice.load('test', this._buildFileDocLinkHTML(testDoc, testDoc.testFullDescription));
      });
    });

    // summary
    ice.load('staticMemberSummary', this._buildSummaryHTML(doc, 'member', 'Members', true));
    ice.load('staticMethodSummary', this._buildSummaryHTML(doc, 'method', 'Methods', true));
    ice.load('constructorSummary', this._buildSummaryHTML(doc, 'constructor', 'Constructor', false));
    ice.load('memberSummary', this._buildSummaryHTML(doc, 'member', 'Members', false));
    ice.load('methodSummary', this._buildSummaryHTML(doc, 'method', 'Methods', false));

    ice.load('inheritedSummary', this._buildInheritedSummaryHTML(doc), 'append');

    // detail
    ice.load('staticMemberDetails', this._buildDetailHTML(doc, 'member', 'Members', true));
    ice.load('staticMethodDetails', this._buildDetailHTML(doc, 'method', 'Methods', true));
    ice.load('constructorDetails', this._buildDetailHTML(doc, 'constructor', 'Constructors', false));
    ice.load('memberDetails', this._buildDetailHTML(doc, 'member', 'Members', false));
    ice.load('methodDetails', this._buildDetailHTML(doc, 'method', 'Methods', false));

    return ice;
  }

  /**
   * build variation of doc.
   * @param {DocObject} doc - target doc object.
   * @returns {string} variation links html.
   * @private
   * @experimental
   */
  _buildVariationHTML(doc) {
    const variationDocs = this._find({memberof: doc.memberof, name: doc.name});
    const html = [];
    for (const variationDoc of variationDocs) {
      if (variationDoc.variation === doc.variation) continue;

      html.push(this._buildDocLinkHTML(variationDoc.longname, `(${variationDoc.variation || 1})`));
    }

    return html.join(', ');
  }

  /**
   * build mixin extends html.
   * @param {DocObject} doc - target class doc.
   * @return {string} mixin extends html.
   */
  _buildMixinClassesHTML(doc) {
    if (!doc.extends) return '';
    if (doc.extends.length <= 1) return '';

    const links = [];
    for (const longname of doc.extends) {
      links.push(this._buildDocLinkHTML(longname));
    }

    return `<div>${links.join(', ')}</div>`;
  }

  /**
   * build expression extends html.
   * @param {DocObject} doc - target class doc.
   * @return {string} expression extends html.
   */
  _buildExpressionExtendsHTML(doc) {
    if (!doc.expressionExtends) return '';

    const html = doc.expressionExtends.replace(/[A-Z_$][a-zA-Z0-9_$]*/g, (v)=>{
      return this._buildDocLinkHTML(v);
    });

    return `class ${doc.name} extends ${html}`;
  }

  /**
   * build class ancestor extends chain.
   * @param {DocObject} doc - target class doc.
   * @returns {string} extends chain links html.
   * @private
   */
  _buildExtendsChainHTML(doc) {
    if (!doc._custom_extends_chains) return '';
    if (doc.extends.length > 1) return '';

    const links = [];
    for (const longname of doc._custom_extends_chains) {
      links.push(this._buildDocLinkHTML(longname));
    }

    links.push(doc.name);

    return `<div>${links.join(' → ')}</div>`;
  }

  /**
   * build in-direct subclass list.
   * @param {DocObject} doc - target class doc.
   * @returns {string} html of in-direct subclass links.
   * @private
   */
  _buildIndirectSubclassHTML(doc) {
    if (!doc._custom_indirect_subclasses) return '';

    const links = [];
    for (const longname of doc._custom_indirect_subclasses) {
      links.push(this._buildDocLinkHTML(longname));
    }

    return `<div>${links.join(', ')}</div>`;
  }

  /**
   * build direct subclass list.
   * @param {DocObject} doc - target class doc.
   * @returns {string} html of direct subclass links.
   * @private
   */
  _buildDirectSubclassHTML(doc) {
    if (!doc._custom_direct_subclasses) return '';

    const links = [];
    for (const longname of doc._custom_direct_subclasses) {
      links.push(this._buildDocLinkHTML(longname));
    }

    return `<div>${links.join(', ')}</div>`;
  }

  /**
   * build inherited method/member summary.
   * @param {DocObject} doc - target class doc.
   * @returns {string} html of inherited method/member from ancestor classes.
   * @private
   */
  _buildInheritedSummaryHTML(doc) {
    if (['class', 'interface'].indexOf(doc.kind) === -1) return '';

    const longnames = [
      ...doc._custom_extends_chains || []
      // ...doc.implements || [],
      // ...doc._custom_indirect_implements || [],
    ];

    const html = [];
    for (const longname of longnames) {
      const superDoc = this._find({longname})[0];

      if (!superDoc) continue;

      const targetDocs = this._find({memberof: longname, kind: ['member', 'method', 'get', 'set']});

      targetDocs.sort((a, b)=>{
        if (a.static !== b.static) return -(a.static - b.static);

        let order = {get: 0, set: 0, member: 1, method: 2};
        if (order[a.kind] !== order[b.kind]) {
          return order[a.kind] - order[b.kind];
        }

        order = {public: 0, protected: 1, private: 2};
        if (a.access !== b.access) return order[a.access] - order[b.access];

        if (a.name !== b.name) return a.name < b.name ? -1 : 1;

        order = {get: 0, set: 1, member: 2};
        return order[a.kind] - order[b.kind];
      });

      const title = `<span class="toggle closed"></span> From ${superDoc.kind} ${this._buildDocLinkHTML(longname, superDoc.name)}`;
      const result = this._buildSummaryDoc(targetDocs, '----------');
      if (result) {
        result.load('title', title, IceCap.MODE_WRITE);
        html.push(result.html);
      }
    }

    return html.join('\n');
  }
}


================================================
FILE: esdoc-publish-html-plugin/src/Builder/DocBuilder.js
================================================
/* eslint-disable max-lines */
import fs from 'fs';
import path from 'path';
import escape from 'escape-html';
import IceCap from 'ice-cap';
import {shorten, parseExample, escapeURLHash} from './util.js';
import DocResolver from './DocResolver.js';
import NPMUtil from 'esdoc/out/src/Util/NPMUtil.js';

/**
 * Builder base class.
 */
export default class DocBuilder {
  /**
   * create instance.
   * @param {String} template - template absolute path
   * @param {Taffy} data - doc object database.
   */
  constructor(template, data, tags) {
    this._template = template;
    this._data = data;
    this._tags = tags;
    new DocResolver(this).resolve();
  }

  /* eslint-disable no-unused-vars */
  /**
   * execute building output.
   * @abstract
   * @param {function(html: string, filePath: string)} writeFile - is called each manual.
   * @param {function(src: string, dest: string)} copyDir - is called asset.
   */
  exec(writeFile, copyDir) {
  }

  /**
   * find doc object.
   * @param {...Object} cond - find condition.
   * @returns {DocObject[]} found doc objects.
   * @private
   */
  _find(...cond) {
    return this._orderedFind(null, ...cond);
  }

  /**
   * find all identifiers with kind grouping.
   * @returns {{class: DocObject[], interface: DocObject[], function: DocObject[], variable: DocObject[], typedef: DocObject[], external: DocObject[]}} found doc objects.
   * @private
   */
  _findAllIdentifiersKindGrouping() {
    const result = {
      class: this._find([{kind: 'class', interface: false}]),
      interface: this._find([{kind: 'class', interface: true}]),
      function: this._find([{kind: 'function'}]),
      variable: this._find([{kind: 'variable'}]),
      typedef: this._find([{kind: 'typedef'}]),
      external: this._find([{kind: 'external'}]).filter(v => !v.builtinExternal)
    };
    return result;
  }

  /**
   * fuzzy find doc object by name.
   * - equal with longname
   * - equal with name
   * - include in longname
   * - include in ancestor
   *
   * @param {string} name - target identifier name.
   * @param {string} [kind] - target kind.
   * @returns {DocObject[]} found doc objects.
   * @private
   */
  _findByName(name, kind = null) {
    let docs;

    if (kind) {
      docs = this._orderedFind(null, {longname: name, kind: kind});
    } else {
      docs = this._orderedFind(null, {longname: name});
    }
    if (docs.length) return docs;

    if (kind) {
      docs = this._orderedFind(null, {name: name, kind: kind});
    } else {
      docs = this._orderedFind(null, {name: name});
    }
    if (docs.length) return docs;

    const regexp = new RegExp(`[~]${name.replace('*', '\\*')}$`); // if name is `*`, need to escape.
    if (kind) {
      docs = this._orderedFind(null, {longname: {regex: regexp}, kind: kind});
    } else {
      docs = this._orderedFind(null, {longname: {regex: regexp}});
    }
    if (docs.length) return docs;

    // inherited method?
    const matched = name.match(/(.*)[.#](.*)$/); // instance method(Foo#bar) or static method(Foo.baz)
    if (matched) {
      const parent = matched[1];
      const childName = matched[2];
      const parentDoc = this._findByName(parent, 'class')[0];
      if (parentDoc && parentDoc._custom_extends_chains) {
        for (const superLongname of parentDoc._custom_extends_chains) {
          const docs = this._find({memberof: superLongname, name: childName});
          if (docs.length) return docs;
        }
      }
    }

    return [];
  }

  /**
   * find doc objects that is ordered.
   * @param {string} order - doc objects order(``column asec`` or ``column desc``).
   * @param {...Object} cond - condition objects
   * @returns {DocObject[]} found doc objects.
   * @private
   */
  _orderedFind(order, ...cond) {
    const data = this._data(...cond);

    if (order) {
      return data.order(`${order}, name asec`).map(v => v);
    } else {
      return data.order('name asec').map(v => v);
    }
  }

  /**
   * read html template.
   * @param {string} fileName - template file name.
   * @return {string} html of template.
   * @protected
   */
  _readTemplate(fileName) {
    const filePath = path.resolve(this._template, `./${fileName}`);
    return fs.readFileSync(filePath, {encoding: 'utf-8'});
  }


  /**
   * build common layout output.
   * @return {IceCap} layout output.
   * @private
   */
  _buildLayoutDoc() {
    const ice = new IceCap(this._readTemplate('layout.html'), {autoClose: false});

    const packageObj = NPMUtil.findPackage();
    if (packageObj) {
      ice.text('esdocVersion', `(${packageObj.version})`);
    } else {
      ice.drop('esdocVersion');
    }

    const existTest = this._tags.find(tag => tag.kind.indexOf('test') === 0);
    ice.drop('testLink', !existTest);

    const existManual = this._tags.find(tag => tag.kind.indexOf('manual') === 0);
    ice.drop('manualHeaderLink', !existManual);

    const manualIndex = this._tags.find(tag => tag.kind === 'manualIndex');
    if (manualIndex && manualIndex.globalIndex) {
      ice.drop('manualHeaderLink');
    }

    ice.load('nav', this._buildNavDoc());
    return ice;
  }

  /**
   * build common navigation output.
   * @return {IceCap} navigation output.
   * @private
   */
  _buildNavDoc() {
    const html = this._readTemplate('nav.html');
    const ice = new IceCap(html);

    const kinds = ['class', 'function', 'variable', 'typedef', 'external'];
    const allDocs = this._find({kind: kinds}).filter(v => !v.builtinExternal);
    const kindOrder = {class: 0, interface: 1, function: 2, variable: 3, typedef: 4, external: 5};

    // see: IdentifiersDocBuilder#_buildIdentifierDoc
    allDocs.sort((a, b)=>{
      const filePathA = a.longname.split('~')[0];
      const filePathB = b.longname.split('~')[0];
      const dirPathA = path.dirname(filePathA);
      const dirPathB = path.dirname(filePathB);
      const kindA = a.interface ? 'interface' : a.kind;
      const kindB = b.interface ? 'interface' : b.kind;
      if (dirPathA === dirPathB) {
        if (kindA === kindB) {
          return a.longname > b.longname ? 1 : -1;
        } else {
          return kindOrder[kindA] > kindOrder[kindB] ? 1 : -1;
        }
      } else {
        return dirPathA > dirPathB ? 1 : -1;
      }
    });
    let lastDirPath = '.';
    ice.loop('doc', allDocs, (i, doc, ice)=>{
      const filePath = doc.longname.split('~')[0].replace(/^.*?[/]/, '');
      const dirPath = path.dirname(filePath);
      const kind = doc.interface ? 'interface' : doc.kind;
      const kindText = kind.charAt(0).toUpperCase();
      const kindClass = `kind-${kind}`;
      ice.load('name', this._buildDocLinkHTML(doc.longname));
      ice.load('kind', kindText);
      ice.attr('kind', 'class', kindClass);
      ice.text('dirPath', dirPath);
      ice.attr('dirPath', 'href', `identifiers.html#${escapeURLHash(dirPath)}`);
      ice.drop('dirPath', lastDirPath === dirPath);
      lastDirPath = dirPath;
    });

    return ice;
  }

  /**
   * find doc object for each access.
   * @param {DocObject} doc - parent doc object.
   * @param {string} kind - kind property condition.
   * @param {boolean} isStatic - static property condition
   * @returns {Array[]} found doc objects.
   * @property {Array[]} 0 - ['Public', DocObject[]]
   * @property {Array[]} 1 - ['Protected', DocObject[]]
   * @property {Array[]} 2 - ['Private', DocObject[]]
   * @private
   */
  _findAccessDocs(doc, kind, isStatic = true) {
    const cond = {kind: kind, static: isStatic};

    if (doc) cond.memberof = doc.longname;

    /* eslint-disable default-case */
    switch (kind) {
      case 'class':
        cond.interface = false;
        break;
      case 'interface':
        cond.kind = 'class';
        cond.interface = true;
        break;
      case 'member':
        cond.kind = ['member', 'get', 'set'];
        break;
    }

    const publicDocs = this._find(cond, {access: 'public'}).filter(v => !v.builtinExternal);
    const protectedDocs = this._find(cond, {access: 'protected'}).filter(v => !v.builtinExternal);
    const privateDocs = this._find(cond, {access: 'private'}).filter(v => !v.builtinExternal);
    const accessDocs = [['Public', publicDocs], ['Protected', protectedDocs], ['Private', privateDocs]];

    return accessDocs;
  }

  /**
   * build summary output html by parent doc.
   * @param {DocObject} doc - parent doc object.
   * @param {string} kind - target kind property.
   * @param {string} title - summary title.
   * @param {boolean} [isStatic=true] - target static property.
   * @returns {string} html of summary.
   * @private
   */
  _buildSummaryHTML(doc, kind, title, isStatic = true) {
    const accessDocs = this._findAccessDocs(doc, kind, isStatic);
    let html = '';
    for (const accessDoc of accessDocs) {
      const docs = accessDoc[1];
      if (!docs.length) continue;

      let prefix = '';
      if (docs[0].static) prefix = 'Static ';
      const _title = `${prefix}${accessDoc[0]} ${title}`;

      const result = this._buildSummaryDoc(docs, _title);
      if (result) {
        html += result.html;
      }
    }

    return html;
  }

  /**
   * build summary output html by docs.
   * @param {DocObject[]} docs - target docs.
   * @param {string} title - summary title.
   * @param {boolean} innerLink - if true, link in summary is inner link.
   * @param {boolean} kindIcon - use kind icon.
   * @return {IceCap} summary output.
   * @protected
   */
  _buildSummaryDoc(docs, title, innerLink = false, kindIcon = false) {
    if (docs.length === 0) return null;

    const ice = new IceCap(this._readTemplate('summary.html'));

    ice.text('title', title);
    ice.loop('target', docs, (i, doc, ice)=>{
      ice.text('generator', doc.generator ? '*' : '');
      ice.text('async', doc.async ? 'async' : '');
      ice.load('name', this._buildDocLinkHTML(doc.longname, null, innerLink, doc.kind));
      ice.load('signature', this._buildSignatureHTML(doc));
      ice.load('description', shorten(doc, true));
      ice.text('abstract', doc.abstract ? 'abstract' : '');
      ice.text('access', doc.access);
      if (['get', 'set'].includes(doc.kind)) {
        ice.text('kind', doc.kind);
      } else {
        ice.drop('kind');
      }

      if (['member', 'method', 'get', 'set'].includes(doc.kind)) {
        ice.text('static', doc.static ? 'static' : '');
      } else {
        ice.drop('static');
      }

      if (kindIcon) {
        const kind = doc.interface ? 'interface' : doc.kind;
        ice.text('kind-icon', kind.charAt(0).toUpperCase());
        ice.attr('kind-icon', 'class', `kind-${kind}`, IceCap.MODE_APPEND);
      } else {
        ice.drop('kind-icon');
      }

      ice.text('since', doc.since);
      ice.load('deprecated', this._buildDeprecatedHTML(doc));
      ice.load('experimental', this._buildExperimentalHTML(doc));
      ice.text('version', doc.version);
    });

    return ice;
  }

  /**
   * build detail output html by parent doc.
   * @param {DocObject} doc - parent doc object.
   * @param {string} kind - target kind property.
   * @param {string} title - detail title.
   * @param {boolean} [isStatic=true] - target static property.
   * @returns {string} html of detail.
   * @private
   */
  _buildDetailHTML(doc, kind, title, isStatic = true) {
    const accessDocs = this._findAccessDocs(doc, kind, isStatic);
    let html = '';
    for (const accessDoc of accessDocs) {
      const docs = accessDoc[1];
      if (!docs.length) continue;

      let prefix = '';
      if (docs[0].static) prefix = 'Static ';
      const _title = `${prefix}${accessDoc[0]} ${title}`;

      const result = this._buildDetailDocs(docs, _title);
      if (result) html += result.html;
    }

    return html;
  }

  /* eslint-disable max-statements */
  /**
   * build detail output html by docs.
   * @param {DocObject[]} docs - target docs.
   * @param {string} title - detail title.
   * @return {IceCap} detail output.
   * @private
Download .txt
gitextract_msrci168/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── _template/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-accessor-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-brand-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   └── publish-html-mock-plugin.js
│       ├── package.json
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-coverage-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-ecmascript-proposal-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── AsyncGenerators.js
│       │   ├── ClassProperties.js
│       │   ├── Decorators.js
│       │   ├── DoExpressions.js
│       │   ├── DynamicImport.js
│       │   ├── ECMAScriptProposal.test.js
│       │   ├── ExportExtensions.js
│       │   ├── FunctionBind.js
│       │   ├── FunctionSent.js
│       │   └── ObjectRestSpread.js
│       └── util.js
├── esdoc-exclude-source-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-external-ecmascript-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   └── external-ecmascript.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-external-nodejs-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   └── external-nodejs.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-external-webapi-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   └── external-webapi.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-flow-type-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── FlowType.js
│       │   └── FlowType.test.js
│       └── util.js
├── esdoc-importpath-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── package.json
│       ├── src/
│       │   ├── Index.js
│       │   ├── MyClass1.js
│       │   ├── MyClass2.js
│       │   └── all.test.js
│       └── util.js
├── esdoc-inject-gtm-plugin/
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   └── publish-html-mock-plugin.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-inject-script-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   ├── inject.js
│       │   └── publish-html-mock-plugin.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-inject-style-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── misc/
│       │   ├── inject.css
│       │   └── publish-html-mock-plugin.js
│       └── src/
│           ├── MyClass.js
│           └── MyClass.test.js
├── esdoc-integrate-manual-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── CHANGELOG.md
│       ├── esdoc.json
│       ├── init.js
│       ├── manual/
│       │   ├── advanced.md
│       │   ├── all.test.js
│       │   ├── configuration.md
│       │   ├── design.md
│       │   ├── example.md
│       │   ├── faq.md
│       │   ├── index.md
│       │   ├── installation.md
│       │   ├── overview.md
│       │   ├── tutorial.md
│       │   ├── usage1.md
│       │   └── usage2.md
│       ├── src/
│       │   └── Dummy.js
│       └── util.js
├── esdoc-integrate-test-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Plugin.js
│   │   ├── TestDoc.js
│   │   ├── TestDocFactory.js
│   │   └── TestFileDoc.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   └── Dummy.js
│       ├── test/
│       │   ├── Test.js
│       │   └── Test.test.js
│       └── util.js
├── esdoc-jsx-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-lint-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       └── src/
│           ├── MyArrowFunction.js
│           ├── MyClass.js
│           └── results.test.js
├── esdoc-publish-html-plugin/
│   ├── .babelrc
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── Builder/
│   │   │   ├── ClassDocBuilder.js
│   │   │   ├── DocBuilder.js
│   │   │   ├── DocResolver.js
│   │   │   ├── FileDocBuilder.js
│   │   │   ├── IdentifiersDocBuilder.js
│   │   │   ├── IndexDocBuilder.js
│   │   │   ├── ManualDocBuilder.js
│   │   │   ├── SearchIndexBuilder.js
│   │   │   ├── SingleDocBuilder.js
│   │   │   ├── SourceDocBuilder.js
│   │   │   ├── StaticFileBuilder.js
│   │   │   ├── TestDocBuilder.js
│   │   │   ├── TestFileDocBuilder.js
│   │   │   ├── template/
│   │   │   │   ├── class.html
│   │   │   │   ├── css/
│   │   │   │   │   ├── github.css
│   │   │   │   │   ├── identifiers.css
│   │   │   │   │   ├── manual.css
│   │   │   │   │   ├── prettify-tomorrow.css
│   │   │   │   │   ├── search.css
│   │   │   │   │   ├── source.css
│   │   │   │   │   ├── style.css
│   │   │   │   │   └── test.css
│   │   │   │   ├── details.html
│   │   │   │   ├── file.html
│   │   │   │   ├── identifiers.html
│   │   │   │   ├── index.html
│   │   │   │   ├── layout.html
│   │   │   │   ├── manual.html
│   │   │   │   ├── manualCardIndex.html
│   │   │   │   ├── manualIndex.html
│   │   │   │   ├── nav.html
│   │   │   │   ├── properties.html
│   │   │   │   ├── script/
│   │   │   │   │   ├── inherited-summary.js
│   │   │   │   │   ├── inner-link.js
│   │   │   │   │   ├── manual.js
│   │   │   │   │   ├── patch-for-local.js
│   │   │   │   │   ├── prettify/
│   │   │   │   │   │   ├── Apache-License-2.0.txt
│   │   │   │   │   │   └── prettify.js
│   │   │   │   │   ├── pretty-print.js
│   │   │   │   │   ├── search.js
│   │   │   │   │   └── test-summary.js
│   │   │   │   ├── single.html
│   │   │   │   ├── source.html
│   │   │   │   ├── summary.html
│   │   │   │   ├── test.html
│   │   │   │   └── testInterface.html
│   │   │   └── util.js
│   │   └── Plugin.js
│   └── test/
│       ├── fixture/
│       │   ├── CHANGELOG.md
│       │   ├── README.md
│       │   ├── esdoc.json
│       │   ├── manual/
│       │   │   ├── advanced.md
│       │   │   ├── configuration.md
│       │   │   ├── design.md
│       │   │   ├── example.md
│       │   │   ├── faq.md
│       │   │   ├── index.md
│       │   │   ├── installation.md
│       │   │   ├── overview.md
│       │   │   ├── tutorial.md
│       │   │   ├── usage1.md
│       │   │   └── usage2.md
│       │   ├── package.json
│       │   ├── src/
│       │   │   ├── Abstract/
│       │   │   │   ├── Definition.js
│       │   │   │   └── Override.js
│       │   │   ├── Access/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── Method.js
│       │   │   │   ├── Property.js
│       │   │   │   └── Variable.js
│       │   │   ├── Async/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Class/
│       │   │   │   └── Definition.js
│       │   │   ├── ClassProperty/
│       │   │   │   └── Definition.js
│       │   │   ├── Computed/
│       │   │   │   ├── Method.js
│       │   │   │   └── Property.js
│       │   │   ├── Decorator/
│       │   │   │   └── Definition.js
│       │   │   ├── Deprecated/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Desc/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── Markdown.js
│       │   │   │   ├── MultiLine.js
│       │   │   │   └── Variable.js
│       │   │   ├── Destructuring/
│       │   │   │   ├── Array.js
│       │   │   │   └── Object.js
│       │   │   ├── Duplication/
│       │   │   │   └── Definition.js
│       │   │   ├── Emits/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Example/
│       │   │   │   ├── Caption.js
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Experimental/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── ExponentiationOperator/
│       │   │   │   └── Definition.js
│       │   │   ├── Export/
│       │   │   │   ├── AnonymousClass.js
│       │   │   │   ├── AnonymousFunction.js
│       │   │   │   ├── ArrowFunction.js
│       │   │   │   ├── Class.js
│       │   │   │   ├── ClassIndirectDefault.js
│       │   │   │   ├── Default.js
│       │   │   │   ├── Extends.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── FunctionIndirectDefault.js
│       │   │   │   ├── Multiple.js
│       │   │   │   ├── Named.js
│       │   │   │   ├── NewExpression.js
│       │   │   │   ├── NewExpressionIndirect.js
│       │   │   │   ├── NewExpressionProperty.js
│       │   │   │   ├── Variable.js
│       │   │   │   └── VariableIndirectDefault.js
│       │   │   ├── Extends/
│       │   │   │   ├── Builtin.js
│       │   │   │   ├── Deep.js
│       │   │   │   ├── Expression.js
│       │   │   │   ├── Inner.js
│       │   │   │   ├── Mixin.js
│       │   │   │   ├── Outer.js
│       │   │   │   └── Property.js
│       │   │   ├── External/
│       │   │   │   └── Definition.js
│       │   │   ├── Generator/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Ignore/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Interface/
│       │   │   │   ├── Definition.js
│       │   │   │   └── Implements.js
│       │   │   ├── Invalid/
│       │   │   │   ├── CodeSyntax.js
│       │   │   │   └── DocSyntax.js
│       │   │   ├── Link/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Listens/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Param/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Property/
│       │   │   │   └── Return.js
│       │   │   ├── Return/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── See/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Since/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── Throws/
│       │   │   │   ├── Function.js
│       │   │   │   └── Method.js
│       │   │   ├── Todo/
│       │   │   │   ├── Class.js
│       │   │   │   ├── Function.js
│       │   │   │   └── Variable.js
│       │   │   ├── TrailingComma/
│       │   │   │   └── Definition.js
│       │   │   ├── Type/
│       │   │   │   ├── Array.js
│       │   │   │   ├── Class.js
│       │   │   │   ├── Complex.js
│       │   │   │   ├── Default.js
│       │   │   │   ├── External.js
│       │   │   │   ├── Function.js
│       │   │   │   ├── Generics.js
│       │   │   │   ├── Literal.js
│       │   │   │   ├── Nullable.js
│       │   │   │   ├── Object.js
│       │   │   │   ├── Optional.js
│       │   │   │   ├── Record.js
│       │   │   │   ├── Spread.js
│       │   │   │   ├── Typedef.js
│       │   │   │   └── Union.js
│       │   │   ├── Typedef/
│       │   │   │   └── Definition.js
│       │   │   ├── Undocument/
│       │   │   │   └── Definition.js
│       │   │   ├── Unknown/
│       │   │   │   └── Definition.js
│       │   │   ├── Variable/
│       │   │   │   ├── ArrayPattern.js
│       │   │   │   ├── Definition.js
│       │   │   │   └── ObjectPattern.js
│       │   │   └── Version/
│       │   │       ├── Class.js
│       │   │       ├── Function.js
│       │   │       └── Variable.js
│       │   └── test/
│       │       └── DescTest.js
│       └── src/
│           ├── DocumentTest/
│           │   ├── AbstractTest/
│           │   │   ├── DefinitionTest.js
│           │   │   └── OverrideTest.js
│           │   ├── AsyncTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── ClassPropertyTest/
│           │   │   └── DefinitionTest.js
│           │   ├── ClassTest/
│           │   │   └── DefinitionTest.js
│           │   ├── ComputedTest/
│           │   │   ├── MethodTest.js
│           │   │   └── PropertyTest.js
│           │   ├── DecoratorTest/
│           │   │   └── DefinitionTest.js
│           │   ├── DeprecatedTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── DescTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   ├── MarkdownTest.js
│           │   │   ├── MultiLineTest.js
│           │   │   └── VariableTest.js
│           │   ├── DestructuringTest/
│           │   │   ├── ArrayTest.js
│           │   │   └── ObjectTest.js
│           │   ├── DuplicationTest/
│           │   │   └── DefinitionTest.js
│           │   ├── EmitsTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── ExamleTest/
│           │   │   ├── CaptionTest.js
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ExperimentalTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ExponentialOperatorTest/
│           │   │   └── DefinitionTest.js
│           │   ├── ExportTest/
│           │   │   ├── AnonymousClassTest.js
│           │   │   ├── AnonymousFunctionTest.js
│           │   │   ├── ArrowFunctionTest.js
│           │   │   ├── ClassIndirectDefaultTest.js
│           │   │   ├── ClassTest.js
│           │   │   ├── DefaultTest.js
│           │   │   ├── ExtendTest.js
│           │   │   ├── FunctionIndirectDefaultTest.js
│           │   │   ├── FunctionTest.js
│           │   │   ├── MultipleTest.js
│           │   │   ├── NamedTest.js
│           │   │   ├── NewExpressionIndirectTest.js
│           │   │   ├── NewExpressionPropertyTest.js
│           │   │   ├── NewExpressionTest.js
│           │   │   ├── VariableIndirectDefaultTest.js
│           │   │   └── VariableTest.js
│           │   ├── ExtendsTest/
│           │   │   ├── BuiltinTest.js
│           │   │   ├── DeepTest.js
│           │   │   ├── ExpressionTest.js
│           │   │   ├── InnerTest.js
│           │   │   ├── MixinTest.js
│           │   │   ├── OuterTest.js
│           │   │   └── PropertyTest.js
│           │   ├── ExternalTest/
│           │   │   └── DefinitionTest.js
│           │   ├── GeneratorTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── IgnoreTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── InterfaceTest/
│           │   │   ├── DefinitionTest.js
│           │   │   └── ImplementsTest.js
│           │   ├── LinkTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ListensTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── ParamTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── PropertyTest/
│           │   │   └── ReturnTest.js
│           │   ├── ReturnTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── SeeTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── SinceTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── ThrowsTest/
│           │   │   ├── FunctionTest.js
│           │   │   └── MethodTest.js
│           │   ├── TodoTest/
│           │   │   ├── ClassTest.js
│           │   │   ├── FunctionTest.js
│           │   │   └── VariableTest.js
│           │   ├── TrailingCommaTest/
│           │   │   └── DefinitionTest.js
│           │   ├── TypeTest/
│           │   │   ├── ArrayTest.js
│           │   │   ├── ClassTest.js
│           │   │   ├── ComplexTest.js
│           │   │   ├── DefaultTest.js
│           │   │   ├── ExternalTest.js
│           │   │   ├── FunctionTest.js
│           │   │   ├── GenericsTest.js
│           │   │   ├── LiteralTest.js
│           │   │   ├── NullableTest.js
│           │   │   ├── ObjectTest.js
│           │   │   ├── OptionalTest.js
│           │   │   ├── RecordTest.js
│           │   │   ├── SpreadTest.js
│           │   │   ├── TypedefTest.js
│           │   │   └── UnionTest.js
│           │   ├── TypedefTest/
│           │   │   └── DefinitionTest.js
│           │   ├── UndocumentTest/
│           │   │   └── DefinitionTest.js
│           │   ├── VariableTest/
│           │   │   ├── ArrayPatterTest.js
│           │   │   ├── DefinitionTest.js
│           │   │   └── ObjectPatterTest.js
│           │   └── VersionTest/
│           │       ├── ClassTest.js
│           │       ├── FunctionTest.js
│           │       └── VariableTest.js
│           ├── FileTest/
│           │   └── FileTest.js
│           ├── IdentifiersTest/
│           │   └── IdentifiersTest.js
│           ├── IndexTest/
│           │   └── IndexTest.js
│           ├── ManualTest/
│           │   └── ManualTest.js
│           ├── NavTest/
│           │   └── NavTest.js
│           ├── SearchTest/
│           │   └── SearchTest.js
│           ├── TestTest/
│           │   ├── TestLinkTest.js
│           │   └── TestTest.js
│           ├── init.js
│           └── util.js
├── esdoc-publish-markdown-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── misc/
│   │   └── index.md
│   ├── package.json
│   ├── src/
│   │   ├── AbstractBuilder.js
│   │   ├── ClassBuilder.js
│   │   ├── FunctionBuilder.js
│   │   ├── Plugin.js
│   │   └── template/
│   │       ├── class.html
│   │       └── function.html
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   ├── MyClass.test.js
│       │   ├── myFunction.js
│       │   └── myFunction.test.js
│       └── util.js
├── esdoc-react-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-standard-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── README.md
│       ├── esdoc.json
│       ├── init.js
│       ├── manual/
│       │   └── overview.md
│       ├── package.json
│       ├── spy-plugin.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── Plugin.test.js
│       └── test/
│           └── MyClassTest.js
├── esdoc-type-inference-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── Getter.js
│       │   ├── Getter.test.js
│       │   ├── Member.js
│       │   ├── Member.test.js
│       │   ├── Param.js
│       │   ├── Param.test.js
│       │   ├── Return.js
│       │   ├── Return.test.js
│       │   ├── Variable.js
│       │   └── Variable.test.js
│       └── util.js
├── esdoc-typescript-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── TypeScript.test.js
│       │   └── TypeScript.ts
│       └── util.js
├── esdoc-undocumented-identifier-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
├── esdoc-unexported-identifier-plugin/
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   └── Plugin.js
│   └── test/
│       ├── esdoc.json
│       ├── init.js
│       ├── src/
│       │   ├── MyClass.js
│       │   └── MyClass.test.js
│       └── util.js
└── script/
    ├── check.sh
    ├── install.sh
    └── test.sh
Download .txt
SYMBOL INDEX (669 symbols across 209 files)

FILE: _template/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandleDocs (line 2) | onHandleDocs(ev) {

FILE: _template/test/init.js
  function cli (line 5) | function cli() {

FILE: _template/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {
    method method1 (line 2) | method1(){}

FILE: esdoc-accessor-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method constructor (line 2) | constructor() {
    method onHandleDocs (line 7) | onHandleDocs(ev) {

FILE: esdoc-accessor-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-accessor-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {
    method method1 (line 5) | method1(){}
    method method2 (line 11) | method2(){}
    method method3 (line 17) | method3(){}
    method method4 (line 23) | method4(){}
    method _method5 (line 28) | _method5(){}

FILE: esdoc-brand-plugin/src/Plugin.js
  class Plugin (line 5) | class Plugin {
    method onHandleConfig (line 6) | onHandleConfig(ev) {
    method onPublish (line 29) | onPublish(ev) {
    method onHandleContent (line 41) | onHandleContent(ev) {
    method _getRepositoryURL (line 80) | _getRepositoryURL(packageObj) {
    method _getAuthor (line 102) | _getAuthor(packageObj) {
    method _addMetaTag (line 112) | _addMetaTag($) {

FILE: esdoc-brand-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-brand-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-coverage-plugin/src/Plugin.js
  class Plugin (line 4) | class Plugin {
    method onHandleDocs (line 5) | onHandleDocs(ev) {
    method onPublish (line 9) | onPublish(ev) {

FILE: esdoc-coverage-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-coverage-plugin/test/src/MyClass.js
  class MyClass (line 4) | class MyClass {
    method constructor (line 8) | constructor(){
    method method (line 19) | method(){}
    method undocumentMethod (line 21) | undocumentMethod(){}

FILE: esdoc-ecmascript-proposal-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandleCodeParser (line 2) | onHandleCodeParser(ev) {

FILE: esdoc-ecmascript-proposal-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-ecmascript-proposal-plugin/test/src/AsyncGenerators.js
  class AsyncGenerators (line 1) | class AsyncGenerators {
    method method (line 2) | async *method() {

FILE: esdoc-ecmascript-proposal-plugin/test/src/ClassProperties.js
  class ClassProperties (line 1) | class ClassProperties {

FILE: esdoc-ecmascript-proposal-plugin/test/src/Decorators.js
  class Decorators (line 2) | class Decorators {
    method method1 (line 3) | @annotation1
    method value1 (line 6) | @annotation1
    method value2 (line 9) | @annotation1
    method method1 (line 12) | @annotation1
    method method2 (line 16) | @annotation1.bar
  function annotation1 (line 21) | function annotation1(){}
  function annotation2 (line 23) | function annotation2(){}

FILE: esdoc-ecmascript-proposal-plugin/test/src/DoExpressions.js
  class DoExpressions (line 1) | class DoExpressions {
    method method1 (line 2) | method1(){

FILE: esdoc-ecmascript-proposal-plugin/test/src/DynamicImport.js
  class DynamicImport (line 1) | class DynamicImport {
    method method (line 2) | method() {

FILE: esdoc-ecmascript-proposal-plugin/test/src/ExportExtensions.js
  class ExportExtensions (line 6) | class ExportExtensions {

FILE: esdoc-ecmascript-proposal-plugin/test/src/FunctionBind.js
  function foo (line 1) | function foo(){}
  class FunctionBind (line 3) | class FunctionBind {
    method method (line 4) | method() {

FILE: esdoc-ecmascript-proposal-plugin/test/src/FunctionSent.js
  class FunctionSent (line 1) | class FunctionSent {
    method method (line 2) | *method() {

FILE: esdoc-ecmascript-proposal-plugin/test/src/ObjectRestSpread.js
  class ObjectRestSpread (line 1) | class ObjectRestSpread {
    method method1 (line 10) | method1({x, y, ...z}){}
    method method2 (line 15) | method2(){

FILE: esdoc-exclude-source-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandleDocs (line 2) | onHandleDocs(ev) {

FILE: esdoc-exclude-source-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-exclude-source-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-external-ecmascript-plugin/src/Plugin.js
  class Plugin (line 4) | class Plugin {
    method onHandleConfig (line 5) | onHandleConfig(ev) {
    method onHandleDocs (line 18) | onHandleDocs(ev) {

FILE: esdoc-external-ecmascript-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-external-ecmascript-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-external-nodejs-plugin/src/Plugin.js
  class Plugin (line 4) | class Plugin {
    method onHandleConfig (line 5) | onHandleConfig(ev) {
    method onHandleDocs (line 18) | onHandleDocs(ev) {

FILE: esdoc-external-nodejs-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-external-nodejs-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {
    method method (line 5) | method(p){}

FILE: esdoc-external-webapi-plugin/src/Plugin.js
  class Plugin (line 4) | class Plugin {
    method onHandleConfig (line 5) | onHandleConfig(ev) {
    method onHandleDocs (line 18) | onHandleDocs(ev) {

FILE: esdoc-external-webapi-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-external-webapi-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-flow-type-plugin/src/Plugin.js
  function formatExpression (line 5) | function formatExpression(expr) {
  function formatTypeId (line 14) | function formatTypeId(id) {
  function isOptional (line 25) | function isOptional(type) {
  function formatTypeAnnotation (line 30) | function formatTypeAnnotation(type) {
  function formatTypeAnnotations (line 49) | function formatTypeAnnotations(types, sep) {
  class FlowTypePlugin (line 53) | class FlowTypePlugin {
    method constructor (line 54) | constructor() {
    method onStart (line 58) | onStart(ev) {
    method onHandleCodeParser (line 63) | onHandleCodeParser(ev) {
    method onHandleAST (line 67) | onHandleAST(ev) {
    method _dispatch (line 80) | _dispatch(node, parent, path) {
    method _applyCallableParam (line 112) | _applyCallableParam(node) {
    method _applyCallableReturn (line 189) | _applyCallableReturn(node) {
    method _applyClassMethodGetter (line 213) | _applyClassMethodGetter(classMethodNode) {
    method _applyClassMethodSetter (line 237) | _applyClassMethodSetter(classMethodNode) {
    method _applyClassProperty (line 256) | _applyClassProperty(classPropertyNode) {
    method _getTypeFromAnnotation (line 279) | _getTypeFromAnnotation(typeAnnotation) {

FILE: esdoc-flow-type-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-flow-type-plugin/test/src/FlowType.js
  method getter1 (line 5) | get getter1(): string {}
  method setter1 (line 7) | set setter1(v: number) {}
  method method1 (line 9) | method1(n: number, x: Foo): string {
  method method2 (line 16) | method2(n: number, x: Foo): string {
  method method3 (line 26) | method3(n: number, x: Foo): string {
  function testFlowTypeFunction (line 43) | function testFlowTypeFunction(n: number, x: Foo): string{}

FILE: esdoc-importpath-plugin/src/Plugin.js
  class Plugin (line 3) | class Plugin {
    method onHandleConfig (line 4) | onHandleConfig(ev) {
    method onHandleDocs (line 8) | onHandleDocs(ev) {

FILE: esdoc-importpath-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-importpath-plugin/test/src/Index.js
  class Index (line 1) | class Index {

FILE: esdoc-importpath-plugin/test/src/MyClass1.js
  class MyClass1 (line 1) | class MyClass1 {

FILE: esdoc-importpath-plugin/test/src/MyClass2.js
  class MyClass2 (line 1) | class MyClass2 {

FILE: esdoc-inject-gtm-plugin/src/Plugin.js
  class Plugin (line 13) | class Plugin {
    method onStart (line 14) | onStart(ev) {
    method onHandleContent (line 19) | onHandleContent(ev) {
    method onPublish (line 32) | onPublish(ev) {

FILE: esdoc-inject-gtm-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-inject-gtm-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-inject-script-plugin/src/Plugin.js
  class Plugin (line 5) | class Plugin {
    method onStart (line 6) | onStart(ev) {
    method onHandleContent (line 11) | onHandleContent(ev) {
    method onPublish (line 28) | onPublish(ev) {

FILE: esdoc-inject-script-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-inject-script-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-inject-style-plugin/src/Plugin.js
  class Plugin (line 5) | class Plugin {
    method onStart (line 6) | onStart(ev) {
    method onHandleContent (line 11) | onHandleContent(ev) {
    method onPublish (line 26) | onPublish(ev) {

FILE: esdoc-inject-style-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-inject-style-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {

FILE: esdoc-integrate-manual-plugin/src/Plugin.js
  class Plugin (line 5) | class Plugin {
    method onHandleDocs (line 6) | onHandleDocs(ev) {
    method _exec (line 13) | _exec(){
    method _setDefault (line 20) | _setDefault() {
    method _generateDocs (line 27) | _generateDocs() {

FILE: esdoc-integrate-manual-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-integrate-manual-plugin/test/src/Dummy.js
  class TestDummy (line 1) | class TestDummy {}

FILE: esdoc-integrate-test-plugin/src/Plugin.js
  class Plugin (line 12) | class Plugin {
    method onHandleDocs (line 13) | onHandleDocs(ev) {
    method _exec (line 20) | _exec() {
    method _setDefault (line 27) | _setDefault() {
    method _generateDocs (line 40) | _generateDocs() {
    method _walk (line 83) | _walk(dirPath, callback) {
    method _traverse (line 108) | _traverse(interfaces, inDirPath, filePath) {

FILE: esdoc-integrate-test-plugin/src/TestDoc.js
  class TestDoc (line 8) | class TestDoc extends AbstractDoc {
    method _apply (line 13) | _apply() {
    method _$kind (line 24) | _$kind() {
    method _$name (line 31) | _$name() {
    method _$memberof (line 39) | _$memberof() {
    method _$desc (line 61) | _$desc() {
    method _$testTarget (line 69) | _$testTarget() {
    method _$test (line 80) | _$test() {

FILE: esdoc-integrate-test-plugin/src/TestDocFactory.js
  class TestDocFactory (line 16) | class TestDocFactory {
    method _getUniqueId (line 22) | static _getUniqueId() {
    method results (line 31) | get results() {
    method constructor (line 41) | constructor(interfaces, ast, pathResolver) {
    method push (line 64) | push(node, parentNode) {
    method _push (line 78) | _push(node) {

FILE: esdoc-integrate-test-plugin/src/TestFileDoc.js
  class TestFileDoc (line 7) | class TestFileDoc extends FileDoc {
    method _$kind (line 9) | _$kind() {

FILE: esdoc-integrate-test-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-integrate-test-plugin/test/src/Dummy.js
  class Dummy (line 1) | class Dummy {

FILE: esdoc-jsx-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandleCodeParser (line 2) | onHandleCodeParser(ev) {

FILE: esdoc-jsx-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-jsx-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {
    method method (line 2) | method(){

FILE: esdoc-lint-plugin/src/Plugin.js
  class Plugin (line 9) | class Plugin {
    method onHandleDocs (line 10) | onHandleDocs(ev) {
    method onPublish (line 17) | onPublish(ev) {
    method onComplete (line 40) | onComplete() {
    method _getParamsFromNode (line 52) | _getParamsFromNode(node) {
    method _getParamsFromDoc (line 105) | _getParamsFromDoc(doc) {
    method _match (line 110) | _match(codeParams, docParams) {
    method _formatResult (line 133) | _formatResult(tmpResults) {
    method _showResult (line 175) | _showResult() {

FILE: esdoc-lint-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-lint-plugin/test/src/MyClass.js
  class MyClass (line 4) | class MyClass {
    method method1 (line 9) | method1(p){}
    method method2 (line 17) | method2(p1 = 10, p2 = [1,2,3], p3 = {foo:1, bar: 2}){}
    method method3 (line 23) | method3(...p){}
    method method4 (line 29) | method4({p1, p2}, {p3, p4}){}

FILE: esdoc-publish-html-plugin/src/Builder/ClassDocBuilder.js
  class ClassDocBuilder (line 8) | class ClassDocBuilder extends DocBuilder {
    method exec (line 9) | exec(writeFile) {
    method _buildClassDoc (line 30) | _buildClassDoc(doc) {
    method _buildVariationHTML (line 122) | _buildVariationHTML(doc) {
    method _buildMixinClassesHTML (line 139) | _buildMixinClassesHTML(doc) {
    method _buildExpressionExtendsHTML (line 156) | _buildExpressionExtendsHTML(doc) {
    method _buildExtendsChainHTML (line 172) | _buildExtendsChainHTML(doc) {
    method _buildIndirectSubclassHTML (line 192) | _buildIndirectSubclassHTML(doc) {
    method _buildDirectSubclassHTML (line 209) | _buildDirectSubclassHTML(doc) {
    method _buildInheritedSummaryHTML (line 226) | _buildInheritedSummaryHTML(doc) {

FILE: esdoc-publish-html-plugin/src/Builder/DocBuilder.js
  class DocBuilder (line 13) | class DocBuilder {
    method constructor (line 19) | constructor(template, data, tags) {
    method exec (line 33) | exec(writeFile, copyDir) {
    method _find (line 42) | _find(...cond) {
    method _findAllIdentifiersKindGrouping (line 51) | _findAllIdentifiersKindGrouping() {
    method _findByName (line 75) | _findByName(name, kind = null) {
    method _orderedFind (line 124) | _orderedFind(order, ...cond) {
    method _readTemplate (line 140) | _readTemplate(fileName) {
    method _buildLayoutDoc (line 151) | _buildLayoutDoc() {
    method _buildNavDoc (line 181) | _buildNavDoc() {
    method _findAccessDocs (line 237) | _findAccessDocs(doc, kind, isStatic = true) {
    method _buildSummaryHTML (line 273) | _buildSummaryHTML(doc, kind, title, isStatic = true) {
    method _buildSummaryDoc (line 302) | _buildSummaryDoc(docs, title, innerLink = false, kindIcon = false) {
    method _buildDetailHTML (line 354) | _buildDetailHTML(doc, kind, title, isStatic = true) {
    method _buildDetailDocs (line 380) | _buildDetailDocs(docs, title) {
    method _getTitle (line 512) | _getTitle(doc = '') {
    method _getBaseUrl (line 528) | _getBaseUrl(fileName) {
    method _getURL (line 539) | _getURL(doc) {
    method _getOutputFileName (line 561) | _getOutputFileName(doc) {
    method _buildFileDocLinkHTML (line 599) | _buildFileDocLinkHTML(doc, text = null) {
    method _buildTypeDocLinkHTML (line 628) | _buildTypeDocLinkHTML(typeName) {
    method _buildDocLinkHTML (line 758) | _buildDocLinkHTML(longname, text = null, inner = false, kind = null) {
    method _buildDocsLinkHTML (line 797) | _buildDocsLinkHTML(longnames, text = null, inner = false, separator = ...
    method _buildSignatureHTML (line 819) | _buildSignatureHTML(doc) {
    method _buildProperties (line 877) | _buildProperties(properties = [], title = 'Properties:') {
    method _buildDeprecatedHTML (line 926) | _buildDeprecatedHTML(doc) {
    method _buildExperimentalHTML (line 942) | _buildExperimentalHTML(doc) {
    method _buildOverrideMethod (line 958) | _buildOverrideMethod(doc) {
    method _buildOverrideMethodDescription (line 983) | _buildOverrideMethodDescription(doc) {
    method _buildDecoratorHTML (line 1002) | _buildDecoratorHTML(doc) {

FILE: esdoc-publish-html-plugin/src/Builder/DocResolver.js
  class DocResolver (line 6) | class DocResolver {
    method constructor (line 11) | constructor(builder) {
    method resolve (line 19) | resolve() {
    method _resolveIgnore (line 48) | _resolveIgnore() {
    method _resolveMarkdown (line 66) | _resolveMarkdown() {
    method _resolveLink (line 94) | _resolveLink() {
    method _resolveExtendsChain (line 158) | _resolveExtendsChain() {
    method _resolveNecessary (line 292) | _resolveNecessary() {
    method _resolveTestRelation (line 320) | _resolveTestRelation() {

FILE: esdoc-publish-html-plugin/src/Builder/FileDocBuilder.js
  class FileDocBuilder (line 7) | class FileDocBuilder extends DocBuilder {
    method exec (line 8) | exec(writeFile, copyDir) {
    method _buildFileDoc (line 29) | _buildFileDoc(doc) {

FILE: esdoc-publish-html-plugin/src/Builder/IdentifiersDocBuilder.js
  class IdentifiersDocBuilder (line 9) | class IdentifiersDocBuilder extends DocBuilder {
    method exec (line 10) | exec(writeFile, copyDir) {
    method _buildIdentifierDoc (line 23) | _buildIdentifierDoc() {
    method _buildDirTree (line 71) | _buildDirTree(dirPaths) {

FILE: esdoc-publish-html-plugin/src/Builder/IndexDocBuilder.js
  class IndexDocBuilder (line 9) | class IndexDocBuilder extends DocBuilder {
    method exec (line 10) | exec(writeFile, copyDir) {
    method _buildIndexDoc (line 23) | _buildIndexDoc() {

FILE: esdoc-publish-html-plugin/src/Builder/ManualDocBuilder.js
  class ManualDocBuilder (line 11) | class ManualDocBuilder extends DocBuilder {
    method exec (line 12) | exec(writeFile, copyDir, readFile) {
    method _writeBadge (line 64) | _writeBadge(manuals, writeFile) {
    method _buildManualNav (line 104) | _buildManualNav(manuals) {
    method _buildManual (line 142) | _buildManual(manual) {
    method _buildManualCardIndex (line 176) | _buildManualCardIndex(manuals, manualIndex, badgeFlag) {
    method _getManualOutputFileName (line 228) | _getManualOutputFileName(filePath) {

FILE: esdoc-publish-html-plugin/src/Builder/SearchIndexBuilder.js
  class SearchIndexBuilder (line 6) | class SearchIndexBuilder extends DocBuilder {
    method exec (line 7) | exec(writeFile, copyDir) {

FILE: esdoc-publish-html-plugin/src/Builder/SingleDocBuilder.js
  class SingleDocBuilder (line 8) | class SingleDocBuilder extends DocBuilder {
    method exec (line 9) | exec(writeFile, copyDir) {
    method _buildSingleDoc (line 35) | _buildSingleDoc(kind) {

FILE: esdoc-publish-html-plugin/src/Builder/SourceDocBuilder.js
  class SourceDocBuilder (line 9) | class SourceDocBuilder extends DocBuilder {
    method exec (line 10) | exec(writeFile, copyDir, coverage) {
    method _buildSourceHTML (line 29) | _buildSourceHTML() {

FILE: esdoc-publish-html-plugin/src/Builder/StaticFileBuilder.js
  class StaticFileBuilder (line 7) | class StaticFileBuilder extends DocBuilder {
    method exec (line 8) | exec(writeFile, copyDir) {

FILE: esdoc-publish-html-plugin/src/Builder/TestDocBuilder.js
  class TestDocBuilder (line 7) | class TestDocBuilder extends DocBuilder {
    method exec (line 8) | exec(writeFile, copyDir) {
    method _buildTestDocHTML (line 28) | _buildTestDocHTML() {
    method _buildTestInterfaceDocHTML (line 42) | _buildTestInterfaceDocHTML(depth = 0, memberof = null) {

FILE: esdoc-publish-html-plugin/src/Builder/TestFileDocBuilder.js
  class TestFileDocBuilder (line 7) | class TestFileDocBuilder extends DocBuilder {
    method exec (line 8) | exec(writeFile, copyDir) {
    method _buildFileDoc (line 29) | _buildFileDoc(doc) {

FILE: esdoc-publish-html-plugin/src/Builder/template/script/inherited-summary.js
  function toggle (line 2) | function toggle(ev) {

FILE: esdoc-publish-html-plugin/src/Builder/template/script/inner-link.js
  function adjust (line 7) | function adjust() {

FILE: esdoc-publish-html-plugin/src/Builder/template/script/prettify/prettify.js
  function T (line 18) | function T(a){function d(e){var b=e.charCodeAt(0);if(92!==b)return b;var...
  function U (line 22) | function U(a,d){function f(a){var c=a.nodeType;if(1==c){if(!b.test(a.cla...
  function J (line 23) | 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...
  function V (line 23) | function V(a){for(var d=void 0,f=a.firstChild;f;f=f.nextSibling)var b=f....
  function G (line 23) | function G(a,d){function f(a){for(var l=a.i,m=a.h,c=[l,"pln"],p=0,w=a.a....
  function y (line 25) | function y(a){var d=[],f=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\...
  function L (line 29) | function L(a,d,f){function b(a){var c=a.nodeType;if(1==c&&!A.test(a.clas...
  function t (line 31) | function t(a,d){for(var f=d.length;0<=--f;){var b=d[f];I.hasOwnProperty(...
  function K (line 31) | function K(a,d){a&&I.hasOwnProperty(a)||(a=/^\s*</.test(d)?
  function M (line 32) | 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...
  function f (line 43) | function f(){for(var b=E.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity...

FILE: esdoc-publish-html-plugin/src/Builder/template/script/test-summary.js
  function toggle (line 2) | function toggle(ev) {

FILE: esdoc-publish-html-plugin/src/Builder/util.js
  function shorten (line 13) | function shorten(doc, asMarkdown = false) {
  function markdown (line 62) | function markdown(text, breaks = false) {
  function dateForUTC (line 111) | function dateForUTC(date) {
  function parseExample (line 134) | function parseExample(example) {
  function escapeURLHash (line 154) | function escapeURLHash(hash) {

FILE: esdoc-publish-html-plugin/src/Plugin.js
  class Plugin (line 17) | class Plugin {
    method onHandleDocs (line 18) | onHandleDocs(ev) {
    method onPublish (line 22) | onPublish(ev) {
    method _exec (line 30) | _exec(tags, writeFile, copyDir, readFile) {

FILE: esdoc-publish-html-plugin/test/fixture/src/Abstract/Definition.js
  class TestAbstractDefinition (line 4) | class TestAbstractDefinition {
    method method1 (line 9) | method1(){}
    method method2 (line 15) | method2(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Abstract/Override.js
  class TestAbstractOverride (line 6) | class TestAbstractOverride extends TestAbstractDefinition {
    method method1 (line 11) | method1(){}
    method method2 (line 16) | method2(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Access/Class.js
  class TestAccessClassPublic (line 5) | class TestAccessClassPublic {}
  class TestAccessClassProtected (line 11) | class TestAccessClassProtected {}
  class TestAccessClassPrivate (line 17) | class TestAccessClassPrivate {}
  class _TestAccessClassAutoPrivate (line 22) | class _TestAccessClassAutoPrivate {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Access/Function.js
  function testAccessFunctionPublic (line 5) | function testAccessFunctionPublic(){}
  function testAccessFunctionProtected (line 11) | function testAccessFunctionProtected(){}
  function testAccessFunctionPrivate (line 17) | function testAccessFunctionPrivate(){}
  function _testAccessFunctionAutoPrivate (line 22) | function _testAccessFunctionAutoPrivate(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Access/Method.js
  class TestAccessMethod (line 4) | class TestAccessMethod {
    method method1 (line 9) | method1(){}
    method method2 (line 15) | method2(){}
    method method3 (line 21) | method3(){}
    method _method4 (line 26) | _method4(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Access/Property.js
  class TestAccessProperty (line 4) | class TestAccessProperty {
    method constructor (line 5) | constructor() {

FILE: esdoc-publish-html-plugin/test/fixture/src/Async/Function.js
  function testAsyncFunction (line 4) | async function testAsyncFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Async/Method.js
  class TestAsyncMethod (line 4) | class TestAsyncMethod {
    method method1 (line 8) | async method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Class/Definition.js
  class TestClassDefinition (line 4) | class TestClassDefinition {
    method method1 (line 8) | static method1(){
    method value1 (line 20) | get value1(){}
    method value2 (line 26) | set value2(v){}
    method constructor (line 31) | constructor(){
    method method1 (line 42) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/ClassProperty/Definition.js
  class TestClassPropertyDefinition (line 5) | class TestClassPropertyDefinition {

FILE: esdoc-publish-html-plugin/test/fixture/src/Computed/Method.js
  class TestComputedMethod (line 4) | class TestComputedMethod {
    method ['foo'] (line 8) | ['foo'](){}
    method [foo] (line 18) | [foo](){}
    method [foo + bar] (line 28) | [foo + bar](){}
    method [foo()] (line 38) | [foo()](){}
    method [`${foo}`] (line 48) | [`${foo}`](){}
  method [Symbol.iterator] (line 13) | [Symbol.iterator]() { }
  method [foo.bar.baz] (line 23) | [foo.bar.baz](){}
  method [foo.p + bar] (line 33) | [foo.p + bar](){}
  method [foo.bar()] (line 43) | [foo.bar()](){}
  method [foo.bar] (line 53) | *[foo.bar](){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Computed/Property.js
  class TestComputedProperty (line 4) | class TestComputedProperty {
    method constructor (line 8) | constructor(){

FILE: esdoc-publish-html-plugin/test/fixture/src/Decorator/Definition.js
  class TestDecoratorDefinition (line 5) | class TestDecoratorDefinition {
    method method1 (line 9) | @testDecoratorAnnotation1
    method value1 (line 16) | @testDecoratorAnnotation1
    method value2 (line 23) | @testDecoratorAnnotation1
    method method1 (line 29) | @testDecoratorAnnotation1
  function testDecoratorAnnotation1 (line 37) | function testDecoratorAnnotation1(){}
  function testDecoratorAnnotation2 (line 42) | function testDecoratorAnnotation2(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Deprecated/Class.js
  class TestDeprecatedClass (line 5) | class TestDeprecatedClass {
    method constructor (line 6) | constructor() {
    method method1 (line 19) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Deprecated/Function.js
  function testDeprecatedFunction (line 5) | function testDeprecatedFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Desc/Class.js
  class TestDescClass (line 4) | class TestDescClass {
    method constructor (line 8) | constructor() {
    method method1 (line 19) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Desc/Function.js
  function testDescFunction (line 4) | function testDescFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Desc/Markdown.js
  class TestDescMarkdown (line 29) | class TestDescMarkdown {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Desc/MultiLine.js
  class TestDescMultiLine (line 4) | class TestDescMultiLine {
    method method1 (line 9) | method1(){}
    method method2 (line 14) | method2(){}
    method method3 (line 20) | method3(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Destructuring/Array.js
  class TestDestructuringArray (line 4) | class TestDestructuringArray {
    method method1 (line 11) | method1([p1, p2]){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Destructuring/Object.js
  class TestDestructuringObject (line 4) | class TestDestructuringObject {
    method method1 (line 11) | method1({p1, p2}){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Duplication/Definition.js
  class TestDuplicationDefinition (line 4) | class TestDuplicationDefinition {
    method constructor (line 8) | constructor() {
    method value (line 18) | set value(v){}
    method value (line 24) | get value(){}
    method onClick (line 30) | onClick(p){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Emits/Function.js
  function testEmitsFunction (line 5) | function testEmitsFunction(){}
  class TestEmitsFunctionEvent (line 7) | class TestEmitsFunctionEvent {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Emits/Method.js
  class TestEmitsMethod (line 4) | class TestEmitsMethod {
    method method1 (line 10) | method1(){}
  class TestEmitsMethodEvent1 (line 13) | class TestEmitsMethodEvent1 {}
  class TestEmitsMethodEvent2 (line 15) | class TestEmitsMethodEvent2 {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Example/Caption.js
  class TestExampleCaption (line 7) | class TestExampleCaption {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Example/Class.js
  class TestExampleClass (line 11) | class TestExampleClass {
    method constructor (line 17) | constructor() {
    method method1 (line 32) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Example/Function.js
  function testExampleFunction (line 6) | function testExampleFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Experimental/Class.js
  class TestExperimentalClass (line 5) | class TestExperimentalClass {
    method constructor (line 9) | constructor(){
    method method1 (line 22) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Experimental/Function.js
  function testExperimentalFunction (line 5) | function testExperimentalFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/ExponentiationOperator/Definition.js
  class TestExponentiationOperatorDefinition (line 4) | class TestExponentiationOperatorDefinition {
    method method1 (line 9) | method1(){

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/Class.js
  class TestExportClass1 (line 4) | class TestExportClass1 {}
  class TestExportClass2 (line 9) | class TestExportClass2 {}
  class TestExportClass3 (line 14) | class TestExportClass3 {}
  class TestExportClass5 (line 24) | class TestExportClass5 {}
  class TestExportClass6 (line 29) | class TestExportClass6 {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/ClassIndirectDefault.js
  class TestExportClassIndirectDefault (line 4) | class TestExportClassIndirectDefault {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/Default.js
  class TestExportDefault (line 4) | class TestExportDefault {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/Extends.js
  class TestExportExtendsInner (line 4) | class TestExportExtendsInner {}
  class TestExportExtends (line 9) | class TestExportExtends extends TestExportExtendsInner {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/Function.js
  function testExportFunction1 (line 4) | function testExportFunction1(){}
  function testExportFunction2 (line 9) | function testExportFunction2(){}
  function testExportFunction4 (line 19) | function testExportFunction4(){}
  function testExportFunction7 (line 32) | function testExportFunction7(){}
  function testExportFunction8 (line 37) | function testExportFunction8() {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/FunctionIndirectDefault.js
  function testExportFunctionIndirectDefault (line 4) | function testExportFunctionIndirectDefault() {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/Multiple.js
  class TestExportMultiple (line 4) | class TestExportMultiple {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/Named.js
  class TestExportNamed (line 4) | class TestExportNamed {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/NewExpression.js
  class TestExportNewExpression (line 4) | class TestExportNewExpression {}
  class TestExportNewExpression2 (line 14) | class TestExportNewExpression2 {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/NewExpressionIndirect.js
  class TestExportNewExpressionIndirect (line 4) | class TestExportNewExpressionIndirect {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Export/NewExpressionProperty.js
  class TestExportNewExpressionProperty (line 4) | class TestExportNewExpressionProperty {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Builtin.js
  class TestExtendsBuiltin (line 4) | class TestExtendsBuiltin extends Array {
    method method1 (line 5) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Deep.js
  class TestExtendsDeepShape (line 1) | class TestExtendsDeepShape extends Array {
    method staticValueShape (line 2) | static get staticValueShape(){}
    method staticValueShape (line 4) | static set staticValueShape(v){}
    method staticMethodShape (line 6) | static staticMethodShape(){
    method valueShape (line 10) | get valueShape(){}
    method valueShape (line 12) | set valueShape(v){}
    method methodShape (line 14) | methodShape() {
  class TestExtendsDeepRectangle (line 19) | class TestExtendsDeepRectangle extends TestExtendsDeepShape {
    method staticValueRectangle (line 20) | static get staticValueRectangle(){}
    method staticValueRectangle (line 22) | static set staticValueRectangle(v){}
    method staticMethodRectangle (line 24) | static staticMethodRectangle(){
    method valueRectangle (line 28) | get valueRectangle(){}
    method valueRectangle (line 30) | set valueRectangle(v){}
    method methodRectangle (line 32) | methodRectangle(){
  class TestExtendsDeepSquare (line 37) | class TestExtendsDeepSquare extends TestExtendsDeepRectangle {
    method staticValueSquare (line 38) | static get staticValueSquare(){}
    method staticValueSquare (line 40) | static set staticValueSquare(v){}
    method staticMethodSquare (line 42) | static staticMethodSquare(){
    method valueSquare (line 46) | get valueSquare(){}
    method valueSquare (line 48) | set valueSquare(v){}
    method methodSquare (line 50) | methodSquare(){

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Expression.js
  function TestExtendsExpressionInner (line 4) | function TestExtendsExpressionInner(){}
  class TestExtendsExpression (line 9) | class TestExtendsExpression extends TestExtendsExpressionInner(123) {
    method method1 (line 10) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Inner.js
  class _TestExtendsInner (line 1) | class _TestExtendsInner {
    method method1 (line 5) | method1(){}
    method method2 (line 10) | method2(){}
  class TestExtendsInner (line 16) | class TestExtendsInner extends _TestExtendsInner {
    method method1 (line 20) | method1(){}
    method method3 (line 25) | method3(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Mixin.js
  function mixin (line 6) | function mixin(a, b){}
  class TestExtendsMixinInner1 (line 8) | class TestExtendsMixinInner1 {
    method method1 (line 12) | method1(){}
  class TestExtendsMixinInner2 (line 15) | class TestExtendsMixinInner2 {
    method method2 (line 19) | method2(){}
  class TestExtendsMixin (line 25) | class TestExtendsMixin extends mixin(TestExtendsMixinInner1, TestExtends...
    method method3 (line 29) | method3(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Outer.js
  class TestExtendsOuter (line 6) | class TestExtendsOuter extends  TestExtendsBuiltin {
    method method1 (line 10) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Extends/Property.js
  class TestExtendsProperty (line 6) | class TestExtendsProperty extends obj.TestExtendsPropertyInner {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Generator/Method.js
  class TestGeneratorMethod (line 4) | class TestGeneratorMethod {
    method method1 (line 8) | *method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Ignore/Class.js
  class TestIgnoreClass1 (line 5) | class TestIgnoreClass1 {
    method method1 (line 6) | method1(){}
  class TestIgnoreClass2 (line 12) | class TestIgnoreClass2 {
    method constructor (line 16) | constructor(){
    method method1 (line 29) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Ignore/Function.js
  function testIgnoreFunction (line 5) | function testIgnoreFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Interface/Definition.js
  class TestInterfaceDefinition (line 5) | class TestInterfaceDefinition {
    method method1 (line 9) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Interface/Implements.js
  class TestInterfaceImplements (line 6) | class TestInterfaceImplements {
    method method1 (line 10) | method1(){}
    method method2 (line 15) | method2(){}
  class TestInterfaceImplementsInner (line 22) | class TestInterfaceImplementsInner {
    method method2 (line 26) | method2(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Invalid/DocSyntax.js
  function testInvalidCodeSyntax (line 4) | function testInvalidCodeSyntax(p){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Link/Class.js
  class TestLinkClass (line 5) | class TestLinkClass {
    method constructor (line 10) | constructor(){
    method method1 (line 23) | method1(){}
  class TestLinkClass2 (line 26) | class TestLinkClass2 extends TestLinkClass {
  class TestLinkClass3 (line 29) | class TestLinkClass3 extends TestLinkClass2 {
    method method1FooBar (line 33) | method1FooBar() {

FILE: esdoc-publish-html-plugin/test/fixture/src/Link/Function.js
  function testLinkFunction (line 7) | function testLinkFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Listens/Function.js
  function testListensFunction (line 5) | function testListensFunction(){}
  class TestListensFunctionEvent (line 10) | class TestListensFunctionEvent {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Listens/Method.js
  class TestListensMethod (line 4) | class TestListensMethod {
    method method1 (line 10) | method1(){}
  class TestListensMethodEvent1 (line 16) | class TestListensMethodEvent1 {}
  class TestListensMethodEvent2 (line 21) | class TestListensMethodEvent2 {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Param/Function.js
  function testParamFunction (line 6) | function testParamFunction(p1, p2){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Param/Method.js
  class TestParamMethod (line 4) | class TestParamMethod {
    method method1 (line 10) | method1(p1, p2){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Property/Return.js
  class TestPropertyReturn (line 4) | class TestPropertyReturn {
    method method1 (line 11) | method1(){

FILE: esdoc-publish-html-plugin/test/fixture/src/Return/Function.js
  function testReturnFunction1 (line 5) | function testReturnFunction1(){}
  function testReturnFunction2 (line 11) | function testReturnFunction2(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Return/Method.js
  class TestReturnMethod (line 4) | class TestReturnMethod {
    method method1 (line 9) | method1(){
    method method2 (line 17) | method2(){

FILE: esdoc-publish-html-plugin/test/fixture/src/See/Class.js
  class TestSeeClass (line 6) | class TestSeeClass {
    method constructor (line 11) | constructor(){
    method method1 (line 24) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/See/Function.js
  function testSeeFunction (line 5) | function testSeeFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Since/Class.js
  class TestSinceClass (line 5) | class TestSinceClass {
    method constructor (line 10) | constructor() {
    method method1 (line 23) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Since/Function.js
  function testSinceFunction (line 5) | function testSinceFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Throws/Function.js
  function testThrowsFunction (line 5) | function testThrowsFunction(){}
  class TestThrowsFunctionError (line 10) | class TestThrowsFunctionError {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Throws/Method.js
  class TestThrowsMethod (line 4) | class TestThrowsMethod {
    method method1 (line 10) | method1(){}
  class TestThrowsMethodError1 (line 16) | class TestThrowsMethodError1 {}
  class TestThrowsMethodError2 (line 21) | class TestThrowsMethodError2 {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Todo/Class.js
  class TestTodoClass (line 6) | class TestTodoClass {
    method constructor (line 11) | constructor() {
    method method1 (line 24) | method1() {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Todo/Function.js
  function testTodoFunction (line 5) | function testTodoFunction(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/TrailingComma/Definition.js
  class TestTrailingCommaDefinition (line 4) | class TestTrailingCommaDefinition {
    method method1 (line 10) | method1(p1, p2,) {}
    method method2 (line 15) | method2(){

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Array.js
  class TestTypeArray (line 4) | class TestTypeArray {
    method method1 (line 9) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Class.js
  class TestTypeClass (line 1) | class TestTypeClass {
    method method1 (line 6) | method1(p1){}
  class TestTypeClassInner (line 9) | class TestTypeClassInner {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Complex.js
  class TestTypeComplex (line 1) | class TestTypeComplex {
    method method1 (line 7) | method1(p1){}
    method method2 (line 14) | method2(p1){}
    method method3 (line 21) | method3(p1){}
    method method4 (line 29) | method4(p1, p2){}
    method method5 (line 36) | method5(p1){}
    method method6 (line 43) | method6(...p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Default.js
  class TestTypeDefault (line 4) | class TestTypeDefault {
    method method1 (line 10) | method1(p1 = 123, p2 = []){}
    method method2 (line 16) | method2(p1 = new Foo()){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/External.js
  class TestTypeExternal (line 4) | class TestTypeExternal {
    method method1 (line 9) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Function.js
  class TestTypeFunction (line 4) | class TestTypeFunction {
    method method1 (line 9) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Generics.js
  class TestTypeGenerics (line 4) | class TestTypeGenerics {
    method method1 (line 11) | method1(p1, p2, p3){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Literal.js
  class TestTypeLiteral (line 4) | class TestTypeLiteral {
    method method1 (line 11) | method1(p1, p2, p3){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Nullable.js
  class TypeTestNullable (line 1) | class TypeTestNullable {
    method method1 (line 7) | method1(p1, p2){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Object.js
  class TestTypeObject (line 4) | class TestTypeObject {
    method method1 (line 10) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Optional.js
  class TestTypeOptional (line 4) | class TestTypeOptional {
    method method1 (line 9) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Record.js
  class TestTypeRecord (line 4) | class TestTypeRecord {
    method method1 (line 9) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Spread.js
  class TestTypeSpread (line 4) | class TestTypeSpread {
    method method1 (line 9) | method1(...p1){}
    method method2 (line 19) | method2({x, y, ...z}){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Typedef.js
  class TestTypeTypedef (line 8) | class TestTypeTypedef {
    method method1 (line 13) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Type/Union.js
  class TestTypeUnion (line 4) | class TestTypeUnion {
    method method1 (line 9) | method1(p1){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Undocument/Definition.js
  class TestUndocumentDefinition (line 2) | class TestUndocumentDefinition {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Unknown/Definition.js
  class TestUnknownDefinition (line 5) | class TestUnknownDefinition {}

FILE: esdoc-publish-html-plugin/test/fixture/src/Version/Class.js
  class TestVersionClass (line 5) | class TestVersionClass {
    method constructor (line 10) | constructor(){
    method method1 (line 23) | method1(){}

FILE: esdoc-publish-html-plugin/test/fixture/src/Version/Function.js
  function testVersionFunction (line 5) | function testVersionFunction(){}

FILE: esdoc-publish-html-plugin/test/src/SearchTest/SearchTest.js
  function find (line 9) | function find(searchIndex, url) {

FILE: esdoc-publish-html-plugin/test/src/init.js
  function cli (line 4) | function cli() {

FILE: esdoc-publish-html-plugin/test/src/util.js
  function readDoc (line 23) | function readDoc(fileName, dirName = './test/fixture/out') {
  function find (line 29) | function find($el, selector, callback) {
  function findParent (line 37) | function findParent($el, selector, parentSelector, callback) {
  function getActual (line 48) | function getActual($el, selector, attr) {

FILE: esdoc-publish-markdown-plugin/src/AbstractBuilder.js
  class AbstractBuilder (line 4) | class AbstractBuilder {
    method constructor (line 5) | constructor(docs) {
    method makeHTML (line 9) | makeHTML() {
    method _findAll (line 13) | _findAll(cond = {}) {
    method _find (line 21) | _find(cond = {}) {
    method _makeSignature (line 25) | _makeSignature(doc) {
    method _makeParamAttribute (line 39) | _makeParamAttribute(param) {
    method _readTemplate (line 48) | _readTemplate(fileName) {

FILE: esdoc-publish-markdown-plugin/src/ClassBuilder.js
  class ClassBuilder (line 4) | class ClassBuilder extends AbstractBuilder {
    method makeHTML (line 5) | makeHTML() {
    method _applyBody (line 23) | _applyBody(classDoc, ice) {
    method _applyConstructor (line 28) | _applyConstructor(classDoc, ice) {
    method _applyMember (line 36) | _applyMember(classDoc, ice) {
    method _applyMethod (line 44) | _applyMethod(classDoc, ice) {

FILE: esdoc-publish-markdown-plugin/src/FunctionBuilder.js
  class FunctionBuilder (line 4) | class FunctionBuilder extends AbstractBuilder {
    method makeHTML (line 5) | makeHTML() {
    method _applyBody (line 19) | _applyBody(doc, ice) {
    method _applyParam (line 24) | _applyParam(doc, ice) {

FILE: esdoc-publish-markdown-plugin/src/Plugin.js
  class Plugin (line 5) | class Plugin {
    method onHandleDocs (line 6) | onHandleDocs(ev) {
    method onPublish (line 10) | onPublish(ev) {
    method _toMarkdown (line 29) | _toMarkdown(html) {

FILE: esdoc-publish-markdown-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-publish-markdown-plugin/test/src/MyClass.js
  class MyClass (line 4) | class MyClass {
    method constructor (line 8) | constructor() {
    method method1 (line 27) | method1(...p1){}
    method method2 (line 33) | method2(p1 = 10){}

FILE: esdoc-publish-markdown-plugin/test/src/myFunction.js
  function myFunction (line 6) | function myFunction(p1){}

FILE: esdoc-react-plugin/src/Plugin.js
  class Plugin (line 6) | class Plugin {
    method constructor (line 7) | constructor() {
    method onHandleDocs (line 12) | onHandleDocs(ev) {
    method onHandleContent (line 33) | onHandleContent(ev) {

FILE: esdoc-react-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-react-plugin/test/src/MyClass.js
  class MyClass (line 6) | class MyClass extends React.Component {
  class NonReactClass (line 12) | class NonReactClass {

FILE: esdoc-standard-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandlePlugins (line 2) | onHandlePlugins(ev) {

FILE: esdoc-standard-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-standard-plugin/test/src/MyClass.js
  class MyClass (line 1) | class MyClass {
    method invalidMeethod (line 6) | invalidMeethod(p){}
    method method1 (line 11) | method1(p){}
    method method2 (line 16) | method2(){}
    method method3 (line 21) | method3(){}
    method _method4 (line 23) | _method4(p = 1){}

FILE: esdoc-type-inference-plugin/src/Plugin.js
  class Plugin (line 4) | class Plugin {
    method onHandleDocs (line 5) | onHandleDocs(ev) {
    method _exec (line 14) | _exec() {
    method _inferenceMethod (line 25) | _inferenceMethod() {
    method _inferenceFunction (line 35) | _inferenceFunction() {
    method _inferenceGetter (line 45) | _inferenceGetter() {
    method _inferenceSetter (line 54) | _inferenceSetter() {
    method _inferenceMember (line 64) | _inferenceMember() {
    method _inferenceVariable (line 73) | _inferenceVariable() {
    method _inferenceParam (line 140) | _inferenceParam(node) {
    method _inferenceReturn (line 268) | _inferenceReturn(node) {
    method _inferenceType (line 294) | _inferenceType(right) {

FILE: esdoc-type-inference-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-type-inference-plugin/test/src/Getter.js
  class TestGetter (line 1) | class TestGetter {
    method getLiteral (line 2) | get getLiteral () {
    method getArray (line 6) | get getArray () {
    method getObject (line 10) | get getObject() {
    method getTemplateLiteral (line 14) | get getTemplateLiteral() {

FILE: esdoc-type-inference-plugin/test/src/Member.js
  class TestMember (line 1) | class TestMember {
    method constructor (line 2) | constructor() {

FILE: esdoc-type-inference-plugin/test/src/Param.js
  class TestParam (line 1) | class TestParam {
    method methodLiteral (line 3) | methodLiteral(p1 = 123){}
    method methodIdentifier (line 6) | methodIdentifier(p1 = value){}
    method methodNewExpression (line 9) | methodNewExpression(p1 = new Foo()){}
    method methodArray (line 12) | methodArray(p1 = [123, 456]){}
    method methodArrayDestructuring (line 15) | methodArrayDestructuring([p1, p2]){}
    method methodArrayAndDestructuring (line 18) | methodArrayAndDestructuring([p1, p2] = [123, 456]){}
    method methodArraySparseDestructuring (line 21) | methodArraySparseDestructuring([, p2]) {}
    method methodObject (line 24) | methodObject(p1 = {x1: "text", x2: true}){}
    method methodObjectDestructuring (line 27) | methodObjectDestructuring({x1, x2}){}
    method methodObjectAndDestructuring (line 30) | methodObjectAndDestructuring({x1, x2} = {x1: 123, x2: "text"}){}
    method methodSpread (line 33) | methodSpread(...p1){}
    method methodArrayDestructuringAndPartialDefault (line 36) | methodArrayDestructuringAndPartialDefault([p1, p2 = 10, p3 = null, p4 ...

FILE: esdoc-type-inference-plugin/test/src/Return.js
  class TestReturn (line 1) | class TestReturn {
    method methodLiteral (line 3) | methodLiteral(){
    method methodArray (line 8) | methodArray(){
    method methodObject (line 13) | methodObject(){
    method methodTemplateLiteral (line 18) | methodTemplateLiteral(){

FILE: esdoc-type-inference-plugin/test/src/Variable.js
  class TestVariableNewExpression (line 14) | class TestVariableNewExpression {}

FILE: esdoc-typescript-plugin/src/Plugin.js
  class Plugin (line 5) | class Plugin {
    method constructor (line 6) | constructor() {
    method onStart (line 10) | onStart(ev) {
    method onHandleConfig (line 15) | onHandleConfig(ev) {
    method onHandleCodeParser (line 22) | onHandleCodeParser(ev) {
    method _tsParser (line 41) | _tsParser(esParser, esParserOption, filePath, code) {
    method _getTargetTSNodes (line 67) | _getTargetTSNodes(sourceFile) {
    method _getJSDocNode (line 88) | _getJSDocNode(node) {
    method _transpileComment (line 94) | _transpileComment(node, comment, code) {
    method _applyLOC (line 126) | _applyLOC(node, tags, code) {
    method _applyCallableParam (line 135) | _applyCallableParam(node, tags) {
    method _applyCallableReturn (line 174) | _applyCallableReturn(node, tags) {
    method _applyClassMethodGetter (line 192) | _applyClassMethodGetter(node, tags) {
    method _applyClassMethodSetter (line 209) | _applyClassMethodSetter(node, tags) {
    method _applyClassProperty (line 225) | _applyClassProperty(node, tags) {
    method _getTypeFromAnnotation (line 242) | _getTypeFromAnnotation(typeNode) {
    method _transpileTS2ES (line 255) | _transpileTS2ES(tsCode) {

FILE: esdoc-typescript-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-typescript-plugin/test/src/TypeScript.ts
  class TestTypeScriptClass (line 4) | class TestTypeScriptClass {
    method getter1 (line 7) | get getter1(): string { return 'Hello'; }
    method setter1 (line 9) | set setter1(v: number) {}
    method method1 (line 11) | method1(n: number, x: Foo): string {
    method method2 (line 18) | method2(n: number, x: Foo): string {
    method method3 (line 28) | method3(n: number, x: Foo): string {
  function testTypeScriptFunction (line 33) | function testTypeScriptFunction(n: number, x: Foo): string{ return 'Hell...
  class Foo (line 35) | class Foo{}

FILE: esdoc-undocumented-identifier-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandleDocs (line 2) | onHandleDocs(ev) {

FILE: esdoc-undocumented-identifier-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-undocumented-identifier-plugin/test/src/MyClass.js
  class MyClass1 (line 1) | class MyClass1 {
  class MyClass2 (line 8) | class MyClass2 {

FILE: esdoc-unexported-identifier-plugin/src/Plugin.js
  class Plugin (line 1) | class Plugin {
    method onHandleDocs (line 2) | onHandleDocs(ev) {

FILE: esdoc-unexported-identifier-plugin/test/init.js
  function cli (line 5) | function cli() {

FILE: esdoc-unexported-identifier-plugin/test/src/MyClass.js
  class MyClass1 (line 1) | class MyClass1 {
  class MyClass2 (line 7) | class MyClass2 {
  class MyClass3 (line 10) | class MyClass3 {
Condensed preview — 605 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (633K chars).
[
  {
    "path": ".gitignore",
    "chars": 31,
    "preview": "node_modules\nout\nnpm-debug.log\n"
  },
  {
    "path": ".travis.yml",
    "chars": 109,
    "preview": "language: node_js\nsudo: false\nnode_js:\n  - \"6\"\nscript:\n  - ./script/test.sh\ninstall:\n  - ./script/install.sh\n"
  },
  {
    "path": "LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "README.md",
    "chars": 1786,
    "preview": "[![](https://travis-ci.org/esdoc/esdoc-plugins.svg?branch=master)](https://travis-ci.org/esdoc/esdoc-plugins)\n# ESDoc Pl"
  },
  {
    "path": "_template/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "_template/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "_template/README.md",
    "chars": 348,
    "preview": "# ESDoc Template Plugin\n## Install\n```bash\nnpm install esdoc-template-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src"
  },
  {
    "path": "_template/package.json",
    "chars": 670,
    "preview": "{\n  \"name\": \"esdoc-template-plugin\",\n  \"version\": \"0.0.1\",\n  \"description\": \"A __TEMPLATE__ plugin for ESDoc\",\n  \"author"
  },
  {
    "path": "_template/src/Plugin.js",
    "chars": 105,
    "preview": "class Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "_template/test/esdoc.json",
    "chars": 170,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "_template/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "_template/test/src/MyClass.js",
    "chars": 47,
    "preview": "export default class MyClass {\n  method1(){}\n}\n"
  },
  {
    "path": "_template/test/src/MyClass.test.js",
    "chars": 237,
    "preview": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('ha"
  },
  {
    "path": "_template/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-accessor-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-accessor-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-accessor-plugin/README.md",
    "chars": 469,
    "preview": "# ESDoc Accessor Plugin\n## Install\n```bash\nnpm install esdoc-accessor-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src"
  },
  {
    "path": "esdoc-accessor-plugin/package.json",
    "chars": 683,
    "preview": "{\n  \"name\": \"esdoc-accessor-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A accessor plugin for ESDoc\",\n  \"author\": \""
  },
  {
    "path": "esdoc-accessor-plugin/src/Plugin.js",
    "chars": 699,
    "preview": "class Plugin {\n  constructor() {\n    this._docs = null;\n    this._option = null;\n  }\n\n  onHandleDocs(ev) {\n    const opt"
  },
  {
    "path": "esdoc-accessor-plugin/test/esdoc.json",
    "chars": 213,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-accessor-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/src/MyClass.js",
    "chars": 349,
    "preview": "export default class MyClass {\n  /**\n   * method1 is default access.\n   */\n  method1(){}\n\n  /**\n   * method2 is public.\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/src/MyClass.test.js",
    "chars": 1087,
    "preview": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has defa"
  },
  {
    "path": "esdoc-accessor-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-brand-plugin/CHANGELOG.md",
    "chars": 215,
    "preview": "# Changelog\n\n## Next\n- **Fix**\n  - Use the same as original logo file type ([#43](https://github.com/esdoc/esdoc-plugins"
  },
  {
    "path": "esdoc-brand-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-brand-plugin/README.md",
    "chars": 1091,
    "preview": "# ESDoc Brand Plugin\n## Install\n```bash\nnpm install esdoc-brand-plugin\n```\n\n## Config\nThis plugin takes a title and a re"
  },
  {
    "path": "esdoc-brand-plugin/package.json",
    "chars": 736,
    "preview": "{\n  \"name\": \"esdoc-brand-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A brand plugin for ESDoc\",\n  \"author\": \"h13i32"
  },
  {
    "path": "esdoc-brand-plugin/src/Plugin.js",
    "chars": 5275,
    "preview": "const fs = require('fs');\nconst path = require('path');\nconst cheerio = require('cheerio');\n\nclass Plugin {\n  onHandleCo"
  },
  {
    "path": "esdoc-brand-plugin/test/esdoc.json",
    "chars": 340,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"package\": \"./test/package"
  },
  {
    "path": "esdoc-brand-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-brand-plugin/test/misc/publish-html-mock-plugin.js",
    "chars": 223,
    "preview": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<he"
  },
  {
    "path": "esdoc-brand-plugin/test/package.json",
    "chars": 273,
    "preview": "{\n  \"name\": \"esdoc-brand-plugin-test\",\n  \"description\": \"this is esdoc-brand-plugin test\",\n  \"repository\": \"https://gith"
  },
  {
    "path": "esdoc-brand-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-brand-plugin/test/src/MyClass.test.js",
    "chars": 2023,
    "preview": "const fs = require('fs');\nconst assert = require('assert');\nconst cheerio = require('cheerio');\n\ndescribe('test/MyClass."
  },
  {
    "path": "esdoc-coverage-plugin/CHANGELOG.md",
    "chars": 203,
    "preview": "# Changelog\n\n## 1.1.0 (2017-09-09)\n- **Feat**\n  - Add `kind` option ([#7](https://github.com/esdoc/esdoc-plugins/pull/7)"
  },
  {
    "path": "esdoc-coverage-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-coverage-plugin/README.md",
    "chars": 589,
    "preview": "# ESDoc Coverage Plugin\n## Install\n```\nnpm install esdoc-coverage-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n "
  },
  {
    "path": "esdoc-coverage-plugin/package.json",
    "chars": 683,
    "preview": "{\n  \"name\": \"esdoc-coverage-plugin\",\n  \"version\": \"1.1.0\",\n  \"description\": \"A coverage plugin for ESDoc\",\n  \"author\": \""
  },
  {
    "path": "esdoc-coverage-plugin/src/Plugin.js",
    "chars": 1872,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.do"
  },
  {
    "path": "esdoc-coverage-plugin/test/esdoc.json",
    "chars": 145,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-coverage-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-coverage-plugin/test/src/MyClass.js",
    "chars": 280,
    "preview": "/**\n * this is MyClass class.\n */\nexport default class MyClass {\n  /**\n   * this is constructor.\n   */\n  constructor(){\n"
  },
  {
    "path": "esdoc-coverage-plugin/test/src/MyClass.test.js",
    "chars": 681,
    "preview": "const assert = require('assert');\nconst fs = require('fs');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has coverage', ()"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/README.md",
    "chars": 842,
    "preview": "# ESDoc ECMAScript Proposal Plugin\n## Install\n```\nnpm install esdoc-ecmascript-proposal-plugin\n```\n\n## Config\n```json\n{\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/package.json",
    "chars": 743,
    "preview": "{\n  \"name\": \"esdoc-ecmascript-proposal-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A ECMAScript proposal plugin for"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/src/Plugin.js",
    "chars": 851,
    "preview": "class Plugin {\n  onHandleCodeParser(ev) {\n    const option = ev.data.option;\n    const plugins = ev.data.parserOption.pl"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/esdoc.json",
    "chars": 170,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/AsyncGenerators.js",
    "chars": 257,
    "preview": "export default class AsyncGenerators {\n  async *method() {\n    const stream = [ Promise.resolve(4), Promise.resolve(9), "
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ClassProperties.js",
    "chars": 121,
    "preview": "export default class ClassProperties {\n  /** @type {number} */\n  static p1 = 123;\n\n  /** @type {number} */\n  p1 = 123;\n}"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/Decorators.js",
    "chars": 329,
    "preview": "@annotation1\nexport default class Decorators {\n  @annotation1\n  static method1(){}\n\n  @annotation1\n  get value1(){}\n\n  @"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/DoExpressions.js",
    "chars": 156,
    "preview": "export default class DoExpressions {\n  method1(){\n    const a = do {\n      if(x > 10) {\n        'big';\n      } else {\n  "
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/DynamicImport.js",
    "chars": 211,
    "preview": "export default class DynamicImport {\n  method() {\n    for (let i = 0; i < 10; i++) {\n      import(`mod${$i}.js`)\n       "
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ECMAScriptProposal.test.js",
    "chars": 3832,
    "preview": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test ecmascript proposal result:',"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ExportExtensions.js",
    "chars": 141,
    "preview": "export * as ns from 'mod'\nexport v from \"mod\"\nexport vv, {x, y as w} from \"mod\"\nexport default from \"mod\"\n\nexport class "
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/FunctionBind.js",
    "chars": 90,
    "preview": "function foo(){}\n\nexport default class FunctionBind {\n  method() {\n    this::foo();\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/FunctionSent.js",
    "chars": 88,
    "preview": "export default class FunctionSent {\n  *method() {\n    console.log(function.sent);\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ObjectRestSpread.js",
    "chars": 514,
    "preview": "export default class ObjectRestSpread {\n  /**\n   * this is method1.\n   * @param {Object} config - this is config.\n   * @"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-exclude-source-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-exclude-source-plugin/README.md",
    "chars": 314,
    "preview": "# ESDoc Exclude Source Plugin\n## Install\n```bash\nnpm install esdoc-exclude-source-plugin\n```\n\n## Config\n```json\n{\n  \"sou"
  },
  {
    "path": "esdoc-exclude-source-plugin/package.json",
    "chars": 708,
    "preview": "{\n  \"name\": \"esdoc-exclude-source-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A exclude source plugin for ESDoc\",\n "
  },
  {
    "path": "esdoc-exclude-source-plugin/src/Plugin.js",
    "chars": 194,
    "preview": "class Plugin {\n  onHandleDocs(ev) {\n    for (const doc of ev.data.docs) {\n      if (doc.kind === 'file' || doc.kind === "
  },
  {
    "path": "esdoc-exclude-source-plugin/test/esdoc.json",
    "chars": 145,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-exclude-source-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/test/src/MyClass.test.js",
    "chars": 393,
    "preview": "const assert = require('assert');\nconst fs = require('fs');\n\ndescribe('test/MyClass.js:', ()=> {\n  const tmp = fs.readFi"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/README.md",
    "chars": 386,
    "preview": "# ESDoc External ECMAScript Plugin\n## Install\n```bash\nnpm install esdoc-external-ecmascript-plugin\n```\n\n## Config\n```jso"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/package.json",
    "chars": 772,
    "preview": "{\n  \"name\": \"esdoc-external-ecmascript-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A external ECMAScript plugin for"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/src/Plugin.js",
    "chars": 1047,
    "preview": "const fs = require('fs-extra');\nconst path = require('path');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = "
  },
  {
    "path": "esdoc-external-ecmascript-plugin/src/external-ecmascript.js",
    "chars": 6058,
    "preview": "// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\n\n// Value properties\n/**\n * @externa"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/esdoc.json",
    "chars": 145,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/src/MyClass.test.js",
    "chars": 648,
    "preview": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\n\ndescribe('test external ecmas"
  },
  {
    "path": "esdoc-external-nodejs-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-external-nodejs-plugin/README.md",
    "chars": 375,
    "preview": "# ESDoc External Node.js Plugin\n## Install\n```bash\nnpm install esdoc-external-nodejs-plugin\n```\n\n## Config\n```json\n{\n  \""
  },
  {
    "path": "esdoc-external-nodejs-plugin/package.json",
    "chars": 761,
    "preview": "{\n  \"name\": \"esdoc-external-nodejs-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A external Node.js plugin for ESDoc\""
  },
  {
    "path": "esdoc-external-nodejs-plugin/src/Plugin.js",
    "chars": 1030,
    "preview": "const fs = require('fs-extra');\nconst path = require('path');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = "
  },
  {
    "path": "esdoc-external-nodejs-plugin/src/external-nodejs.js",
    "chars": 227,
    "preview": "// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\n\n// Value properties\n/**\n * @externa"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/esdoc.json",
    "chars": 145,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/src/MyClass.js",
    "chars": 94,
    "preview": "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",
    "chars": 485,
    "preview": "const assert = require('assert');\nconst fs = require('fs');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.j"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-external-webapi-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-external-webapi-plugin/README.md",
    "chars": 374,
    "preview": "# ESDoc External WebAPI Plugin\n## Install\n```bash\nnpm install esdoc-external-webapi-plugin\n```\n\n## Config\n```json\n{\n  \"s"
  },
  {
    "path": "esdoc-external-webapi-plugin/package.json",
    "chars": 761,
    "preview": "{\n  \"name\": \"esdoc-external-webapi-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A external Web API plugin for ESDoc\""
  },
  {
    "path": "esdoc-external-webapi-plugin/src/Plugin.js",
    "chars": 1030,
    "preview": "const fs = require('fs-extra');\nconst path = require('path');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = "
  },
  {
    "path": "esdoc-external-webapi-plugin/src/external-webapi.js",
    "chars": 826,
    "preview": "// https://developer.mozilla.org/en-US/docs/Web/API\n\n/**\n * @external {CanvasRenderingContext2D} https://developer.mozil"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/esdoc.json",
    "chars": 145,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-external-webapi-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/src/MyClass.test.js",
    "chars": 437,
    "preview": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=>{\n\n  it('has exte"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-flow-type-plugin/CHANGELOG.md",
    "chars": 416,
    "preview": "# Changelog\n\n## 1.0.2 (2018-04-29)\n- **Fix**\n  - Broken `@type {type} desc` ([#30](https://github.com/esdoc/esdoc-plugin"
  },
  {
    "path": "esdoc-flow-type-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-flow-type-plugin/README.md",
    "chars": 831,
    "preview": "# ESDoc Flow Type Plugin (PoC)\n**This plugin is proof of concept.**\n\n## Install\n```bash\nnpm install esdoc-flow-type-plug"
  },
  {
    "path": "esdoc-flow-type-plugin/package.json",
    "chars": 726,
    "preview": "{\n  \"name\": \"esdoc-flow-type-plugin\",\n  \"version\": \"1.0.2\",\n  \"description\": \"A flow type plugin for ESDoc [PoC]\",\n  \"au"
  },
  {
    "path": "esdoc-flow-type-plugin/src/Plugin.js",
    "chars": 8564,
    "preview": "const ASTUtil = require('esdoc/out/src/Util/ASTUtil').default;\nconst CommentParser = require('esdoc/out/src/Parser/Comme"
  },
  {
    "path": "esdoc-flow-type-plugin/test/esdoc.json",
    "chars": 183,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js\"],\n  \"plugins\": [\n    {\"name\": \""
  },
  {
    "path": "esdoc-flow-type-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-flow-type-plugin/test/src/FlowType.js",
    "chars": 853,
    "preview": "// @flow\nexport class TestFlowTypeClass {\n  member1: number;\n\n  get getter1(): string {}\n\n  set setter1(v: number) {}\n\n "
  },
  {
    "path": "esdoc-flow-type-plugin/test/src/FlowType.test.js",
    "chars": 2554,
    "preview": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/FlowType.js:', ()=> {\n  it('h"
  },
  {
    "path": "esdoc-flow-type-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-importpath-plugin/CHANGELOG.md",
    "chars": 367,
    "preview": "# Changelog\n\n## 1.0.2 (2018-04-29)\n- **Fix**\n  - Strip last slash ([#37](https://github.com/esdoc/esdoc-plugins/pull/37)"
  },
  {
    "path": "esdoc-importpath-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-importpath-plugin/README.md",
    "chars": 1953,
    "preview": "# ESDoc Import Path Plugin\nThis is a plugin that converts the import path in documentation.\nESDoc displays the import pa"
  },
  {
    "path": "esdoc-importpath-plugin/package.json",
    "chars": 686,
    "preview": "{\n  \"name\": \"esdoc-importpath-plugin\",\n  \"version\": \"1.0.2\",\n  \"description\": \"A import path plugin for ESDoc\",\n  \"autho"
  },
  {
    "path": "esdoc-importpath-plugin/src/Plugin.js",
    "chars": 1306,
    "preview": "const fs = require('fs');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = ev.data.config;\n  }\n\n  onHandleDocs("
  },
  {
    "path": "esdoc-importpath-plugin/test/esdoc.json",
    "chars": 318,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"package\": \"./test/package.json\",\n  \"plugins\": [\n    {\n    "
  },
  {
    "path": "esdoc-importpath-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/package.json",
    "chars": 66,
    "preview": "{\n  \"name\": \"esdoc-importpath-plugin\",\n  \"main\": \"lib/Index.js\"\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/Index.js",
    "chars": 31,
    "preview": "export default class Index {\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/MyClass1.js",
    "chars": 34,
    "preview": "export default class MyClass1 {\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/MyClass2.js",
    "chars": 34,
    "preview": "export default class MyClass2 {\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/all.test.js",
    "chars": 565,
    "preview": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n\n  it('convert"
  },
  {
    "path": "esdoc-importpath-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-inject-gtm-plugin/CHANGELOG.md",
    "chars": 12,
    "preview": "# Changelog\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/README.md",
    "chars": 369,
    "preview": "# 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\":"
  },
  {
    "path": "esdoc-inject-gtm-plugin/package.json",
    "chars": 793,
    "preview": "{\n  \"name\": \"esdoc-inject-gtm-plugin\",\n  \"description\": \"A inject google-tag-manager plugin for ESDoc\",\n  \"version\": \"0."
  },
  {
    "path": "esdoc-inject-gtm-plugin/src/Plugin.js",
    "chars": 1064,
    "preview": "const fs = require(\"fs-extra\")\nconst path = require(\"path\")\nconst cheerio = require(\"cheerio\")\n\nconst toSnippet = id => "
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/esdoc.json",
    "chars": 233,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/misc/publish-html-mock-plugin.js",
    "chars": 198,
    "preview": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<he"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/src/MyClass.test.js",
    "chars": 366,
    "preview": "const assert = require(\"assert\")\nconst path = require(\"path\")\nconst fs = require(\"fs\")\nconst cheerio = require(\"cheerio\""
  },
  {
    "path": "esdoc-inject-script-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-inject-script-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-inject-script-plugin/README.md",
    "chars": 393,
    "preview": "# ESDoc Inject Script Plugin\n## Install\n```bash\nnpm install esdoc-inject-script-plugin\n```\n\n## Config\n```json\n{\n  \"sourc"
  },
  {
    "path": "esdoc-inject-script-plugin/package.json",
    "chars": 779,
    "preview": "{\n  \"name\": \"esdoc-inject-script-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A inject script plugin for ESDoc\",\n  \""
  },
  {
    "path": "esdoc-inject-script-plugin/src/Plugin.js",
    "chars": 1010,
    "preview": "const fs = require('fs-extra');\nconst path = require('path');\nconst cheerio = require('cheerio');\n\nclass Plugin {\n  onSt"
  },
  {
    "path": "esdoc-inject-script-plugin/test/esdoc.json",
    "chars": 252,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-inject-script-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/misc/inject.js",
    "chars": 40,
    "preview": "console.log('this is injected script');\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/misc/publish-html-mock-plugin.js",
    "chars": 198,
    "preview": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<he"
  },
  {
    "path": "esdoc-inject-script-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/src/MyClass.test.js",
    "chars": 608,
    "preview": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\nconst cheerio = require('cheer"
  },
  {
    "path": "esdoc-inject-style-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-inject-style-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-inject-style-plugin/README.md",
    "chars": 390,
    "preview": "# ESDoc Inject Style Plugin\n## Install\n```bash\nnpm install esdoc-inject-style-plugin\n```\n\n## Config\n```json\n{\n  \"source\""
  },
  {
    "path": "esdoc-inject-style-plugin/package.json",
    "chars": 776,
    "preview": "{\n  \"name\": \"esdoc-inject-style-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A inject style plugin for ESDoc\",\n  \"au"
  },
  {
    "path": "esdoc-inject-style-plugin/src/Plugin.js",
    "chars": 967,
    "preview": "const fs = require('fs');\nconst path = require('path');\nconst cheerio = require('cheerio');\n\nclass Plugin {\n  onStart(ev"
  },
  {
    "path": "esdoc-inject-style-plugin/test/esdoc.json",
    "chars": 252,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-inject-style-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/misc/inject.css",
    "chars": 27,
    "preview": "body { background: #eee; }\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/misc/publish-html-mock-plugin.js",
    "chars": 198,
    "preview": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<he"
  },
  {
    "path": "esdoc-inject-style-plugin/test/src/MyClass.js",
    "chars": 33,
    "preview": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/src/MyClass.test.js",
    "chars": 585,
    "preview": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\nconst cheerio = require('cheer"
  },
  {
    "path": "esdoc-integrate-manual-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-integrate-manual-plugin/README.md",
    "chars": 854,
    "preview": "# ESDoc Integrate Manual Plugin\n## Install\n```bash\nnpm install esdoc-integrate-manual-plugin\n```\n\n## Config\n```json\n{\n  "
  },
  {
    "path": "esdoc-integrate-manual-plugin/package.json",
    "chars": 697,
    "preview": "{\n  \"name\": \"esdoc-integrate-manual-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A integrate manual plugin for ESDoc"
  },
  {
    "path": "esdoc-integrate-manual-plugin/src/Plugin.js",
    "chars": 1712,
    "preview": "const fs = require('fs');\nconst path = require('path');\nconst assert = require('assert');\n\nclass Plugin {\n  onHandleDocs"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/CHANGELOG.md",
    "chars": 46,
    "preview": "# Changelog\n\n## 0.0.1\n- **Fix**\n  - fix a bug\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/esdoc.json",
    "chars": 744,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\n      \""
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/advanced.md",
    "chars": 15,
    "preview": "# Advanced\nfoo\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/all.test.js",
    "chars": 1931,
    "preview": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/manual:', ()=>{\n  it('has man"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/configuration.md",
    "chars": 39,
    "preview": "# Configuration\nthis is configuration.\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/design.md",
    "chars": 60,
    "preview": "# Design\n## Concept\nfoo\n\n## Architecture\nfoo\n\n\n## Model\nfoo\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/example.md",
    "chars": 259,
    "preview": "# Example\n\n## Minimum Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\"\n}\n```\n\n## Integration Test Code Int"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/faq.md",
    "chars": 258,
    "preview": "# FAQ\n\n- [Goal](#goal)\n\n## Goal\nESDoc has two goals.\nThe first goal is reducing the cost to write an documentation, it i"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/index.md",
    "chars": 19,
    "preview": "# ESDoc Manual\ntbd\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/installation.md",
    "chars": 102,
    "preview": "# 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",
    "chars": 569,
    "preview": "# Overview\n\nESDoc is a documentation generator for JavaScript(ES6).\n\n<img class=\"screen-shot\" src=\"https://esdoc.org/ima"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/tutorial.md",
    "chars": 29,
    "preview": "# Tutorial\nthis is tutorial.\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/usage1.md",
    "chars": 118,
    "preview": "# 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",
    "chars": 101,
    "preview": "# 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",
    "chars": 34,
    "preview": "export default class TestDummy {}\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-integrate-test-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-integrate-test-plugin/README.md",
    "chars": 749,
    "preview": "# ESDoc Integrate Test Plugin\n## Install\n```bash\nnpm install esdoc-integrate-test-plugin\n```\n\n## Config\n```json\n{\n  \"sou"
  },
  {
    "path": "esdoc-integrate-test-plugin/package.json",
    "chars": 691,
    "preview": "{\n  \"name\": \"esdoc-integrate-test-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A integrate test plugin for ESDoc\",\n "
  },
  {
    "path": "esdoc-integrate-test-plugin/src/Plugin.js",
    "chars": 3699,
    "preview": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\nconst TestDocFactory = require"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/TestDoc.js",
    "chars": 2030,
    "preview": "// hack: depends on esdoc internal class\nconst AbstractDoc = require('esdoc/out/src/Doc/AbstractDoc').default;\nconst Par"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/TestDocFactory.js",
    "chars": 2688,
    "preview": "const assert = require('assert');\nconst TestDoc = require('./TestDoc');\nconst TestFileDoc = require('./TestFileDoc');\n//"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/TestFileDoc.js",
    "chars": 301,
    "preview": "// hack: depends on esdoc internal class\nconst FileDoc = require('esdoc/out/src/Doc/FileDoc').default;\n\n/**\n * Doc class"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/esdoc.json",
    "chars": 255,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\n      \""
  },
  {
    "path": "esdoc-integrate-test-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/src/Dummy.js",
    "chars": 31,
    "preview": "export default class Dummy {\n}\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/test/Test.js",
    "chars": 738,
    "preview": "/**\n * @test {TestTarget1}\n */\ndescribe('describe/', ()=>{\n  /**\n   * @test {TestTarget2}\n   */\n  it('describe/it', ()=>"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/test/Test.test.js",
    "chars": 2654,
    "preview": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Test.js:', ()=>{\n  it('has describe"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/util.js",
    "chars": 673,
    "preview": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs"
  },
  {
    "path": "esdoc-jsx-plugin/CHANGELOG.md",
    "chars": 45,
    "preview": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-jsx-plugin/LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "esdoc-jsx-plugin/README.md",
    "chars": 339,
    "preview": "# ESDoc JSX Plugin\n## Install\n```bash\nnpm install esdoc-jsx-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"dest"
  },
  {
    "path": "esdoc-jsx-plugin/package.json",
    "chars": 668,
    "preview": "{\n  \"name\": \"esdoc-jsx-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A JSX plugin for ESDoc\",\n  \"author\": \"h13i32maru"
  },
  {
    "path": "esdoc-jsx-plugin/src/Plugin.js",
    "chars": 270,
    "preview": "class Plugin {\n  onHandleCodeParser(ev) {\n    const option = ev.data.option || {};\n    const plugins = ev.data.parserOpt"
  },
  {
    "path": "esdoc-jsx-plugin/test/esdoc.json",
    "chars": 145,
    "preview": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": "
  },
  {
    "path": "esdoc-jsx-plugin/test/init.js",
    "chars": 409,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\n"
  }
]

// ... and 405 more files (download for full content)

About this extraction

This page contains the full source code of the esdoc/esdoc-plugins GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 605 files (543.1 KB), approximately 170.0k tokens, and a symbol index with 669 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!