{"versions":{"0.0.1":{"name":"@webfansplz/vuedoc-parser","version":"0.0.1","description":"Generate a JSON documentation for a Vue file","type":"module","exports":{".":"./esm/index.js","./types":"./types/index.d.ts","./enum":"./esm/lib/Enum.js","./entity/computed":"./esm/entity/ComputedEntry.js","./entity/data":"./esm/entity/DataEntry.js","./entity/description":"./esm/entity/DescriptionEntry.js","./entity/event":"./esm/entity/EventEntry.js","./entity/inheritAttrs":"./esm/entity/InheritAttrsEntry.js","./entity/keyword":"./esm/entity/Keyword.js","./entity/keywords":"./esm/entity/KeywordsEntry.js","./entity/method":"./esm/entity/MethodEntry.js","./entity/model":"./esm/entity/ModelEntry.js","./entity/name":"./esm/entity/NameEntry.js","./entity/prop":"./esm/entity/PropEntry.js","./entity/rest":"./esm/entity/RestValue.js","./entity/slot":"./esm/entity/SlotEntry.js","./entity/value":"./esm/entity/Value.js","./jsdoc":"./esm/lib/JSDoc.js","./loader":"./esm/lib/Loader.js","./loaders/html":"./esm/loaders/html.js","./loaders/javascript":"./esm/loaders/javascript.js","./loaders/pug":"./esm/loaders/pug.js","./loaders/typescript":"./esm/loaders/typescript.js","./loaders/vue":"./esm/loaders/vue.js","./parser":"./esm/parsers/VuedocParser.js","./plugins/vue-router":"./esm/plugins/VueRouterPlugin.js","./plugins/vuex":"./esm/plugins/VuexPlugin.js","./schema/options":"./esm/schema/options.js","./test-utils":"./esm/test/utils.js","./utils/KeywordsUtils":"./esm/utils/KeywordsUtils.js"},"main":"./esm/index.js","types":"./types/index.d.ts","scripts":{"preversion":"yarn test","build":"tsc","prepack":"yarn build","test":"vitest","testui":"vitest --ui","coverage":"vitest run --coverage","examples":"UPDATE_EXAMPLES_RESULTS=true node_modules/.bin/vitest --run Compatibility.spec.js","lint":"eslint .","gimtoc":"gimtoc -f README.md -s 'Table of Contents' -o README.md"},"keywords":["vuedoc","vuefile","vue","doc","parser"],"license":"MIT","dependencies":{"@b613/utils":"^1.0.0-beta21","@babel/parser":"^7.18.11","@babel/traverse":"^7.18.11","resolve":"^1.22.1","vue-template-compiler":"^2.6.14"},"devDependencies":{"@types/pug":"^2.0.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","@vitest/coverage-c8":"^0.22.0","@vitest/ui":"^0.22.0","eslint":"^8.20.0","eslint-config-airbnb":"^19.0.4","eslint-config-airbnb-base":"^15.0.0","eslint-import-resolver-typescript":"^3.3.0","eslint-plugin-import":"^2.26.0","eslint-plugin-security":"^1.5.0","eslint-plugin-unused-imports":"^2.0.0","gimtoc":"^2.0.0","pug":"^3.0.2","typescript":"^4.7.4","vite":"^3.0.2","vitest":"^0.22.0"},"peerDependencies":{"@types/node":"^18.6.3","pug":"^3.0.2"},"engines":{"node":">=16.6"},"gitHead":"03eb19064625c65223d48f71cc9ff3be2d8ba3df","_id":"@webfansplz/vuedoc-parser@0.0.1","_nodeVersion":"18.12.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-zsP6MIsQwgP36XcaGQiqcgWWEQ849Vi/bQc0YymqGrpBpfEnsYaY9TSGpR7UwFj5K9fDpIQzGniFKDntZ622wQ==","shasum":"96cd2929132dfec25312866ee29b1b755330b909","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@webfansplz/vuedoc-parser/-/vuedoc-parser-0.0.1.tgz","fileCount":185,"unpackedSize":801937,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCyIeGm0sckDBcIxoUv1let6NbocF+EMLzyeykZkdQVTgIgJ6W9enuEYlEzC43i3nSTMZXRIHlEwLcNooWwsftVVHE="}]},"_npmUser":{"name":"anonymous","email":"308241863@qq.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"308241863@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vuedoc-parser_0.0.1_1686471048839_0.09259928965451736"},"_hasShrinkwrap":false,"contributors":[]},"0.0.2":{"name":"@webfansplz/vuedoc-parser","version":"0.0.2","description":"Generate a JSON documentation for a Vue file","type":"module","exports":{".":"./esm/index.js","./types":"./types/index.d.ts","./enum":"./esm/lib/Enum.js","./entity/computed":"./esm/entity/ComputedEntry.js","./entity/data":"./esm/entity/DataEntry.js","./entity/description":"./esm/entity/DescriptionEntry.js","./entity/event":"./esm/entity/EventEntry.js","./entity/inheritAttrs":"./esm/entity/InheritAttrsEntry.js","./entity/keyword":"./esm/entity/Keyword.js","./entity/keywords":"./esm/entity/KeywordsEntry.js","./entity/method":"./esm/entity/MethodEntry.js","./entity/model":"./esm/entity/ModelEntry.js","./entity/name":"./esm/entity/NameEntry.js","./entity/prop":"./esm/entity/PropEntry.js","./entity/rest":"./esm/entity/RestValue.js","./entity/slot":"./esm/entity/SlotEntry.js","./entity/value":"./esm/entity/Value.js","./jsdoc":"./esm/lib/JSDoc.js","./loader":"./esm/lib/Loader.js","./loaders/html":"./esm/loaders/html.js","./loaders/javascript":"./esm/loaders/javascript.js","./loaders/pug":"./esm/loaders/pug.js","./loaders/typescript":"./esm/loaders/typescript.js","./loaders/vue":"./esm/loaders/vue.js","./parser":"./esm/parsers/VuedocParser.js","./plugins/vue-router":"./esm/plugins/VueRouterPlugin.js","./plugins/vuex":"./esm/plugins/VuexPlugin.js","./schema/options":"./esm/schema/options.js","./test-utils":"./esm/test/utils.js","./utils/KeywordsUtils":"./esm/utils/KeywordsUtils.js"},"main":"./esm/index.js","types":"./types/index.d.ts","scripts":{"preversion":"yarn test","build":"tsc","prepack":"yarn build","test":"vitest","testui":"vitest --ui","coverage":"vitest run --coverage","examples":"UPDATE_EXAMPLES_RESULTS=true node_modules/.bin/vitest --run Compatibility.spec.js","lint":"eslint .","gimtoc":"gimtoc -f README.md -s 'Table of Contents' -o README.md"},"keywords":["vuedoc","vuefile","vue","doc","parser"],"license":"MIT","dependencies":{"@b613/utils":"^1.0.0-beta21","@babel/parser":"^7.18.11","@babel/traverse":"^7.18.11","resolve":"^1.22.1","vue-template-compiler":"^2.6.14"},"devDependencies":{"@types/pug":"^2.0.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","@vitest/coverage-c8":"^0.22.0","@vitest/ui":"^0.22.0","eslint":"^8.20.0","eslint-config-airbnb":"^19.0.4","eslint-config-airbnb-base":"^15.0.0","eslint-import-resolver-typescript":"^3.3.0","eslint-plugin-import":"^2.26.0","eslint-plugin-security":"^1.5.0","eslint-plugin-unused-imports":"^2.0.0","gimtoc":"^2.0.0","pug":"^3.0.2","typescript":"^4.7.4","vite":"^3.0.2","vitest":"^0.22.0"},"peerDependencies":{"@types/node":"^18.6.3","pug":"^3.0.2"},"engines":{"node":">=16.6"},"gitHead":"3383296568f363a6bd00d8af2f5f797a408046e4","_id":"@webfansplz/vuedoc-parser@0.0.2","_nodeVersion":"18.12.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-BN2KseGCVzRl2Rd5m5m54dTA+DqiFMEjPl1wUTvS79feWaj/aMaUUttGFbxXqaIGtFMhGk/Hux77Sqc2N4LOHw==","shasum":"680535aca1c9e218819fb3ae3ab9a533a5eeaf2e","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@webfansplz/vuedoc-parser/-/vuedoc-parser-0.0.2.tgz","fileCount":185,"unpackedSize":801949,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICNhCQWpthVnS1kQaX3J2cLR1jpikv0o18z0hZ5AVaOdAiEAoLaayhwYhNYTGlCVGB2/dU251H35dY3czxwFL2j21xM="}]},"_npmUser":{"name":"anonymous","email":"308241863@qq.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"308241863@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vuedoc-parser_0.0.2_1686488541978_0.3381662189123915"},"_hasShrinkwrap":false,"contributors":[]},"0.0.3":{"name":"@webfansplz/vuedoc-parser","version":"0.0.3","description":"Generate a JSON documentation for a Vue file","type":"module","exports":{".":"./esm/index.js","./types":"./types/index.d.ts","./enum":"./esm/lib/Enum.js","./entity/computed":"./esm/entity/ComputedEntry.js","./entity/data":"./esm/entity/DataEntry.js","./entity/description":"./esm/entity/DescriptionEntry.js","./entity/event":"./esm/entity/EventEntry.js","./entity/inheritAttrs":"./esm/entity/InheritAttrsEntry.js","./entity/keyword":"./esm/entity/Keyword.js","./entity/keywords":"./esm/entity/KeywordsEntry.js","./entity/method":"./esm/entity/MethodEntry.js","./entity/model":"./esm/entity/ModelEntry.js","./entity/name":"./esm/entity/NameEntry.js","./entity/prop":"./esm/entity/PropEntry.js","./entity/rest":"./esm/entity/RestValue.js","./entity/slot":"./esm/entity/SlotEntry.js","./entity/value":"./esm/entity/Value.js","./jsdoc":"./esm/lib/JSDoc.js","./loader":"./esm/lib/Loader.js","./loaders/html":"./esm/loaders/html.js","./loaders/javascript":"./esm/loaders/javascript.js","./loaders/pug":"./esm/loaders/pug.js","./loaders/typescript":"./esm/loaders/typescript.js","./loaders/vue":"./esm/loaders/vue.js","./parser":"./esm/parsers/VuedocParser.js","./plugins/vue-router":"./esm/plugins/VueRouterPlugin.js","./plugins/vuex":"./esm/plugins/VuexPlugin.js","./schema/options":"./esm/schema/options.js","./test-utils":"./esm/test/utils.js","./utils/KeywordsUtils":"./esm/utils/KeywordsUtils.js"},"main":"./esm/index.js","types":"./types/index.d.ts","scripts":{"preversion":"yarn test","build":"tsc","prepack":"yarn build","test":"vitest","testui":"vitest --ui","coverage":"vitest run --coverage","examples":"UPDATE_EXAMPLES_RESULTS=true node_modules/.bin/vitest --run Compatibility.spec.js","lint":"eslint .","gimtoc":"gimtoc -f README.md -s 'Table of Contents' -o README.md"},"keywords":["vuedoc","vuefile","vue","doc","parser"],"license":"MIT","dependencies":{"@babel/parser":"^7.18.11","@babel/traverse":"^7.18.11","resolve":"^1.22.1","vue-template-compiler":"^2.6.14"},"devDependencies":{"@types/pug":"^2.0.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","@vitest/coverage-c8":"^0.22.0","@vitest/ui":"^0.22.0","eslint":"^8.20.0","eslint-config-airbnb":"^19.0.4","eslint-config-airbnb-base":"^15.0.0","eslint-import-resolver-typescript":"^3.3.0","eslint-plugin-import":"^2.26.0","eslint-plugin-security":"^1.5.0","eslint-plugin-unused-imports":"^2.0.0","gimtoc":"^2.0.0","pug":"^3.0.2","typescript":"^4.7.4","vite":"^3.0.2","vitest":"^0.22.0"},"peerDependencies":{"@types/node":"^18.6.3","pug":"^3.0.2"},"engines":{"node":">=16.6"},"gitHead":"e10d69b438047af44842c3d709326710fdb68c2a","_id":"@webfansplz/vuedoc-parser@0.0.3","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-7Ocz5C7GBwc33yrp8US4WZHG7U+kpBex7jtOEsm3f1414A/r5D4O3/cPsb6dEV6aO/4Sx6YWRcubcAuKL79+ig==","shasum":"1c62fc2eaf11bd9741b644628bcd8894f548c64f","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@webfansplz/vuedoc-parser/-/vuedoc-parser-0.0.3.tgz","fileCount":191,"unpackedSize":828319,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHBtRhncMul2Nj8Kz63by0AyrGIUP/6MDxgksmlsif3GAiEA6FauDUNWAW6XwKCv9UjgjOtUXwOhZ5ad7ubOdqIVPJM="}]},"_npmUser":{"name":"anonymous","email":"308241863@qq.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"308241863@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vuedoc-parser_0.0.3_1686908553417_0.0011295360087641981"},"_hasShrinkwrap":false,"contributors":[]},"0.0.4":{"name":"@webfansplz/vuedoc-parser","version":"0.0.4","description":"Generate a JSON documentation for a Vue file","type":"module","exports":{".":"./esm/index.js","./types":"./types/index.d.ts","./enum":"./esm/lib/Enum.js","./entity/computed":"./esm/entity/ComputedEntry.js","./entity/data":"./esm/entity/DataEntry.js","./entity/description":"./esm/entity/DescriptionEntry.js","./entity/event":"./esm/entity/EventEntry.js","./entity/inheritAttrs":"./esm/entity/InheritAttrsEntry.js","./entity/keyword":"./esm/entity/Keyword.js","./entity/keywords":"./esm/entity/KeywordsEntry.js","./entity/method":"./esm/entity/MethodEntry.js","./entity/model":"./esm/entity/ModelEntry.js","./entity/name":"./esm/entity/NameEntry.js","./entity/prop":"./esm/entity/PropEntry.js","./entity/rest":"./esm/entity/RestValue.js","./entity/slot":"./esm/entity/SlotEntry.js","./entity/value":"./esm/entity/Value.js","./jsdoc":"./esm/lib/JSDoc.js","./loader":"./esm/lib/Loader.js","./loaders/html":"./esm/loaders/html.js","./loaders/javascript":"./esm/loaders/javascript.js","./loaders/pug":"./esm/loaders/pug.js","./loaders/typescript":"./esm/loaders/typescript.js","./loaders/vue":"./esm/loaders/vue.js","./parser":"./esm/parsers/VuedocParser.js","./plugins/vue-router":"./esm/plugins/VueRouterPlugin.js","./plugins/vuex":"./esm/plugins/VuexPlugin.js","./schema/options":"./esm/schema/options.js","./test-utils":"./esm/test/utils.js","./utils/KeywordsUtils":"./esm/utils/KeywordsUtils.js"},"main":"./esm/index.js","types":"./types/index.d.ts","scripts":{"preversion":"yarn test","build":"tsc","prepack":"yarn build","test":"vitest","testui":"vitest --ui","coverage":"vitest run --coverage","examples":"UPDATE_EXAMPLES_RESULTS=true node_modules/.bin/vitest --run Compatibility.spec.js","lint":"eslint .","gimtoc":"gimtoc -f README.md -s 'Table of Contents' -o README.md"},"keywords":["vuedoc","vuefile","vue","doc","parser"],"license":"MIT","dependencies":{"@babel/parser":"^7.18.11","@babel/traverse":"^7.18.11","resolve":"^1.22.1","vue-template-compiler":"^2.6.14"},"devDependencies":{"@types/node":"^18.6.3","@types/pug":"^2.0.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","@vitest/coverage-c8":"^0.22.0","@vitest/ui":"^0.22.0","eslint":"^8.20.0","eslint-config-airbnb":"^19.0.4","eslint-config-airbnb-base":"^15.0.0","eslint-import-resolver-typescript":"^3.3.0","eslint-plugin-import":"^2.26.0","eslint-plugin-security":"^1.5.0","eslint-plugin-unused-imports":"^2.0.0","gimtoc":"^2.0.0","pug":"^3.0.2","typescript":"^4.7.4","vite":"^3.0.2","vitest":"^0.22.0"},"peerDependencies":{"pug":"^3.0.2"},"engines":{"node":">=16.6"},"gitHead":"037300e285aa776e7209cefb6ffe4ee2cef157d9","_id":"@webfansplz/vuedoc-parser@0.0.4","_nodeVersion":"18.12.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-OnJxUtZOvKHonA9wmW1F0E+UkjP4RZdNRZyUWF1Nrh0TAm4uzX4a99EgHH33Rc2dJgkhMdtaZ9P+ekVJ42Y0kg==","shasum":"cfefa70becbdc9c8c9e196a15510fffa40d82a56","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@webfansplz/vuedoc-parser/-/vuedoc-parser-0.0.4.tgz","fileCount":191,"unpackedSize":828319,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE3V5jo5xpzLQLCnSTqFi89zi0ue3HSvFwwO4P9IQ01FAiBu6+64kS5EmwPzA9uJgt3ESOsdX/dN/mo1NbS6RIkwhQ=="}]},"_npmUser":{"name":"anonymous","email":"308241863@qq.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"308241863@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vuedoc-parser_0.0.4_1691919302568_0.662424125166855"},"_hasShrinkwrap":false,"contributors":[]}},"dist-tags":{"latest":"0.0.4"},"name":"@webfansplz/vuedoc-parser","time":{"created":"2023-06-11T08:10:55.317Z","0.0.1":"2023-06-11T08:10:49.069Z","modified":"2023-08-13T09:36:07.149Z","0.0.2":"2023-06-11T13:02:22.223Z","0.0.3":"2023-06-16T09:42:33.645Z","0.0.4":"2023-08-13T09:35:02.875Z"},"readme":"# The Vuedoc Parser\n\nGenerate a JSON documentation for a Vue file component.\n\n[![npm](https://img.shields.io/npm/v/@vuedoc/parser.svg)](https://www.npmjs.com/package/@vuedoc/parser)\n[![Build status](https://gitlab.com/vuedoc/parser/badges/main/pipeline.svg)](https://gitlab.com/vuedoc/parser/pipelines?ref=main)\n[![Test coverage](https://gitlab.com/vuedoc/parser/badges/main/coverage.svg)](https://gitlab.com/vuedoc/parser/-/jobs)\n[![Buy me a beer](https://img.shields.io/badge/Buy%20me-a%20beer-1f425f.svg)](https://www.buymeacoffee.com/demsking)\n\n## Table of Contents\n\n- [Install](#install)\n- [Features](#features)\n- [Options](#options)\n- [Usage](#usage)\n- [Syntax](#syntax)\n  * [Add component name](#add-component-name)\n  * [Add component description](#add-component-description)\n  * [Annotate props](#annotate-props)\n    + [Annotate a `v-model` prop](#annotate-a-v-model-prop)\n    + [Annotate Vue Array String Props](#annotate-vue-array-string-props)\n    + [Special tags for props](#special-tags-for-props)\n    + [Prop Entry Interface](#prop-entry-interface)\n  * [Annotate data](#annotate-data)\n  * [Annotate computed properties](#annotate-computed-properties)\n  * [Annotate methods](#annotate-methods)\n  * [Annotate events](#annotate-events)\n  * [Annotate slots](#annotate-slots)\n  * [Ignore items from parsing](#ignore-items-from-parsing)\n- [Tags Extraction](#tags-extraction)\n- [Supported Tags](#supported-tags)\n- [Working with Mixins](#working-with-mixins)\n- [Parsing control with `options.features`](#parsing-control-with-optionsfeatures)\n- [Using Plugins](#using-plugins)\n  * [Adding a Plugin](#adding-a-plugin)\n  * [Official Plugins](#official-plugins)\n  * [Building Plugins](#building-plugins)\n- [Language Processing](#language-processing)\n  * [Loader API](#loader-api)\n  * [Built-in loaders](#built-in-loaders)\n  * [Create a custom loader](#create-a-custom-loader)\n- [Parsing Output Interface](#parsing-output-interface)\n- [Generate Markdown Documentation](#generate-markdown-documentation)\n- [Contribute](#contribute)\n- [Versioning](#versioning)\n- [License](#license)\n\n## Install\n\nThis package is [ESM only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c)\n: Node 16+ is needed to use it and it must be imported instead of required.\n\n```sh\nnpm install --save @vuedoc/parser\n```\n\n## Features\n\n- Extract the component name (from the `name` field or from the filename)\n- Extract the component description\n- [Keywords support](#keywords-extraction)\n- Extract component `model`, `props`, `data`, `computed properties`,\n  `events`, `slots` and `methods`\n- Vue 3 support with Composition API\n- JSX support\n- [Class Component](https://www.npmjs.com/package/vue-class-component) support\n- [Vue Property Decorator](https://www.npmjs.com/package/vue-property-decorator) support\n- [Prop Types](https://github.com/znck/prop-types) support\n- [JSDoc](https://jsdoc.app/) support\n  ([`@type`](http://usejsdoc.org/tags-type.html),\n   [`@param`](http://usejsdoc.org/tags-param.html),\n   [`@returns`](http://usejsdoc.org/tags-returns.html),\n   [`@version`](http://usejsdoc.org/tags-version.html),\n   [`@since`](http://usejsdoc.org/tags-since.html),\n   [`@deprecated`](http://usejsdoc.org/tags-deprecated.html),\n   [`@see`](http://usejsdoc.org/tags-deprecated.html),\n   [`@kind`](http://usejsdoc.org/tags-kind.html),\n   [`@author`](http://usejsdoc.org/tags-author.html) and\n   [`@ignore`](http://usejsdoc.org/tags-ignore.html) tags)\n- [TypeDoc tags](https://typedoc.org/guides/doccomments/#supported-tags)\n  support (`@param <param name>`, `@return(s)`, `@hidden`, `@category`)\n\n## Options\n\n| Name                  | Description                                                                                                                                                                 |\n| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `filename`            | The filename to parse. *Required* unless `filecontent` is passed                                                                                                            |\n| `filecontent`         | The file content to parse. *Required* unless `filename` is passed                                                                                                           |\n| `encoding`            | The file encoding. Default is `'utf8'`                                                                                                                                      |\n| `features`            | The component features to parse and extract.<br/>Default features: `['name', 'description', 'slots', 'props', 'data', 'computed', 'events', 'methods']`                     |\n| `loaders`             | Use this option to define [custom loaders](https://gitlab.com/vuedoc/parser/blob/main/README.md#language-processing) for specific languages                                 |\n| `ignoredVisibilities` | List of ignored visibilities. Default: `['protected', 'private']`                                                                                                           |\n| `composition`         | Additional composition tokens for advanced components.<br/>Default value: `{ data: [], methods: [], computed: [], props: [] }`                                              |\n| `resolver`            | A resolver object used to resolve imports statements. See definition file [types/ImportResolver.d.ts](https://gitlab.com/vuedoc/parser/blob/main/types/ImportResolver.d.ts) |\n| `plugins`             | An array of plugins to activate. See [Using Plugins](#using-plugins) section                                                                                                |\n| `jsx`                 | Set to `true` to enable JSX parsing. Default `false`                                                                                                                        |\n\nFound [TypeScript definition here](https://gitlab.com/vuedoc/parser/blob/main/types/index.d.ts).\n\n## Usage\n\nGiven the folowing SFC file [test/examples/circle-drawer/circle-drawer-composition.vue](https://gitlab.com/vuedoc/parser/blob/main/test/examples/circle-drawer/circle-drawer-composition.vue), the parsing usage would be:\n\n```js\nimport { parseComponent } from '@vuedoc/parser';\n\nconst options = {\n  filename: 'test/examples/circle-drawer/circle-drawer-composition.vue',\n};\n\nparseComponent(options)\n  .then((component) => console.log(component))\n  .catch((err) => console.error(err));\n```\n\nThis will print this JSON output:\n\n```js\n{\n  \"name\": \"CircleDrawer\",\n  \"description\": \"Circle Drawer’s goal is, among other things, to test how good the common\\nchallenge of implementing an undo/redo functionality for a GUI application\\ncan be solved.\",\n  \"see\": \"https://eugenkiss.github.io/7guis/tasks/#circle\",\n  \"inheritAttrs\": true,\n  \"errors\": [],\n  \"warnings\": [],\n  \"keywords\": [\n    {\n      \"name\": \"usage\",\n      \"description\": \"Click on the canvas to draw a circle. Click on a circle to select it.\\nRight-click on the canvas to adjust the radius of the selected circle.\"\n    }\n  ],\n  \"props\": [ /* ... */ ],\n  \"data\": [ /* ... */ ],\n  \"computed\": [ /* ... */ ],\n  \"slots\": [ /* ... */ ],\n  \"events\": [ /* ... */ ],\n  \"methods\": [ /* ... */ ]\n}\n```\n\n> Found the complete result here: [test/examples/circle-drawer/parsing-result.json](https://gitlab.com/vuedoc/parser/blob/main/test/examples/circle-drawer/parsing-result.json)\n\n> Found more examples here: [test/examples](https://gitlab.com/vuedoc/parser/blob/main/test/examples)\n\n## Syntax\n\n### Add component name\n\nBy default, Vuedoc Parser uses the component's filename to generate the\ncomponent name.\n\nTo set a custom name, use the [`name` option](https://vuejs.org/api/options-misc.html#name):\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  export default {\n    name: 'my-checkbox',\n  };\n</script>\n```\n\nYou can also use the `@name` tag:\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  /**\n   * @name my-checkbox\n   */\n  export default {\n    // ...\n  };\n</script>\n```\n\n**Composition usage**\n\nWhen using `<script setup>`, you need to define a comment block as a first\nnode of your script.\n\n```html\n<!-- CheckboxInput.vue -->\n<script setup>\n  /**\n   * @name my-checkbox\n   */\n\n  import { ref } from 'vue';\n\n  const checked = ref(false);\n</script>\n```\n\n### Add component description\n\nTo add a component description, just add a comment before the `export default`\nstatement like:\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  /**\n   * My awesome custom checkbox component\n   */\n  export default {\n    // ...\n  };\n</script>\n```\n\nWhen using `<script setup>`, you need to define a comment block as a first\nnode of your script.\n\n```html\n<!-- CheckboxInput.vue -->\n<script setup>\n  /**\n   * My awesome custom checkbox component\n   * @name my-checkbox\n   */\n\n  import { ref } from 'vue';\n\n  const checked = ref(false);\n</script>\n```\n\n### Annotate props\n\nTo document props, annotate your code like:\n\n**Legacy usage**\n\n```html\n<!-- CustomInput.vue -->\n<script>\n  export default {\n    props: {\n      /**\n       * Element ID\n       */\n      id: {\n        type: String,\n        required: true,\n      },\n      /**\n       * Element initial value\n       */\n      value: {\n        type: String,\n        default: '',\n      },\n    },\n  };\n</script>\n```\n\nVuedoc Parser will automatically extract `type`, `required` and `default` values for\nproperties.\n\n**Composition usage**\n\n```html\n<!-- CustomInput.vue -->\n<script setup>\n  const props = defineProps({\n    /**\n     * Element ID\n     */\n    id: {\n      type: String,\n      required: true,\n    },\n    /**\n     * Element initial value\n     */\n    value: {\n      type: String,\n      default: '',\n    },\n  });\n</script>\n```\n\nVuedoc Parser will automatically extract `type`, `required` and `default` values for\nproperties.\n\n**Composition usage with TypeScript**\n\n```html\n<!-- CustomInput.vue -->\n<script lang=\"ts\" setup>\n  type Props = {\n    /**\n     * Element ID\n     */\n    id: string;\n    /**\n     * Element initial value\n     */\n    value?: string;\n  };\n\n  const props = withDefaults(defineProps<Props>(), {\n    value: '',\n  });\n</script>\n```\n\nVuedoc Parser will automatically extract `type`, `required` and `default` values from\nthe type definition.\n\n#### Annotate a `v-model` prop\n\n**Legacy usage**\n\n```html\n<!-- CustomInput.vue -->\n<script>\n  export default {\n    props: [\n      /**\n      * The input model value\n      */\n      'modelValue',\n    ],\n    emits: ['update:modelValue'],\n  };\n</script>\n```\n\n**Composition usage**\n\nTo document a `v-model` prop using Composition API, use\n[defineProps()](https://vuejs.org/guide/components/events.html#usage-with-v-model)\nmacro.\n\n```html\n<!-- CustomInput.vue -->\n<script setup>\n  const props = defineProps([\n    /**\n    * The input model value\n    */\n    'modelValue',\n  ]);\n\n  const emit = defineEmits(['update:modelValue']);\n</script>\n```\n\n**Vue 2 usage**\n\nTo document a `v-model` prop legacy Vue, use the Vue's\n[model field](https://v2.vuejs.org/v2/api/#model).\n\n```html\n<!-- CustomInput.vue -->\n<script>\n  export default {\n    /**\n    * Use `v-model` to define a reactive value of the checkbox\n    */\n    model: {\n      prop: 'checked',\n      event: 'change',\n    },\n    props: {\n      checked: Boolean,\n    },\n  };\n</script>\n```\n\n#### Annotate Vue Array String Props\n\nTo document Vue array string props, just attach a Vuedoc comment to each prop:\n\n**Legacy usage**\n\n```html\n<!-- CustomInput.vue -->\n<script>\n  export default {\n    props: [\n      /**\n       * ELement ID\n       */\n      'id',\n\n      /**\n       * The element model value\n       */\n      'value',\n    ],\n  };\n</script>\n```\n\n**Composition usage**\n\n```html\n<script setup>\n  const props = defineProps([\n    /**\n     * ELement ID\n     */\n    'id',\n\n    /**\n     * The element model value\n     */\n    'value',\n  ]);\n</script>\n```\n\n#### Special tags for props\n\n- `@type {typeName}`<br>\n  Commented prop will use provided type name as type instead of type in source\n  code. This option may be helpful in case the prop type is a complex object or\n  a function\n- `@default {value}`<br>\n  Commented prop will use the provided value as default prop value. This option\n  may be helpful in case the prop type is a complex object or function\n- `@kind function`<br>\n  Force parsing of a prop as a function\n\n```html\n<!-- NumberInput.vue -->\n<script>\n  export default {\n    props: {\n      /**\n       * Custom default value\n       * @type Complex.Object\n       * @default { anything: 'custom default value' }\n       */\n      custom: {\n        type: Object,\n        default: () => {\n          // complex code\n          return anythingExpression();\n        },\n      },\n      /**\n       * The input validation function\n       * @kind function\n       * @param {any} value - User input value to validate\n       * @returns {boolean} - `true` if validation succeeds; `false` otherwise.\n       */\n      validator: {\n        type: Function,\n        default: (value) => !Number.isNaN(value),\n      },\n    },\n  };\n</script>\n```\n\n#### Prop Entry Interface\n\n```ts\ninterface PropEntry {\n  kind: 'prop';\n  name: string;\n  type: string | string[];\n  default: string;\n  required: boolean;\n  description?: string;\n  describeModel: boolean;\n  keywords: Keyword[];\n  category?: string;\n  version?: string;\n  since?: string;\n  visibility: 'public' | 'protected' | 'private';\n}\n\ntype Keyword = {\n  name: string;\n  description?: string;\n};\n```\n\n### Annotate data\n\nTo document data, annotate your code like:\n\n**Legacy usage**\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  export default {\n    data() {\n      return {\n        /**\n         * Indicates that the control is checked\n         */\n        checked: false,\n      };\n    },\n  };\n</script>\n```\n\n**Composition usage**\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  import { ref } from 'vue';\n\n  export default {\n    setup() {\n      return {\n        /**\n         * Indicates that the control is checked\n         */\n        checked: ref(false),\n      };\n    },\n  };\n</script>\n```\n\nVuedoc Parser will automatically detect type for each defined data field and\ncatch their initial value.\n\n**Special tags for data**\n\n- `@type {typeName}`<br>\n  Commented data will use provided type name as type instead of type in source\n  code. This option may be helpful in case the data type is a complex object or\n  a function\n- `@initialValue {value}`<br>\n  Commented data will use the provided value as initial data value. This option\n  may be helpful in case the data type is a complex object or function\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  export default {\n    data() {\n      return {\n        /**\n         * A data with a complex expression\n         * @type boolean\n         * @initialValue false\n         */\n        checked: ExternalHelper.getDefaultValue(),\n      };\n    },\n  };\n</script>\n```\n\n**Data Entry Interface**\n\n```ts\ninterface DataEntry {\n  kind: 'data';\n  name: string;\n  type: string;\n  initialValue: string;\n  description?: string;\n  keywords: Keyword[];\n  category?: string;\n  version?: string;\n  since?: string;\n  visibility: 'public' | 'protected' | 'private';\n}\n\ntype Keyword = {\n  name: string;\n  description?: string;\n};\n```\n\n### Annotate computed properties\n\nTo document computed properties, annotate your code like:\n\n**Legacy usage**\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  export default {\n    props: {\n      checked: Boolean,\n    },\n    computed: {\n      /**\n       * Indicates that the control is selected\n       */\n      selected () {\n        return this.checked;\n      },\n    },\n  };\n</script>\n```\n\nVuedoc Parser will automatically extract computed properties dependencies.\n\n**Composition usage**\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  import { computed } from 'vue';\n\n  export default {\n    props: {\n      checked: Boolean,\n    },\n    setup(props) {\n      return {\n        /**\n         * Indicates that the control is selected\n         */\n        selected: computed(() => props.checked),\n      };\n    },\n  };\n</script>\n```\n\n**Usage with `<script setup>`**\n\n```html\n<!-- CheckboxInput.vue -->\n<script setup>\n  import { computed } from 'vue';\n\n  const props = defineProps({\n    checked: Boolean,\n  });\n\n  /**\n   * Indicates that the control is selected\n   */\n  const selected = computed(() => props.checked);\n</script>\n```\n\n**Computed Property Entry Interface**\n\n```ts\ninterface ComputedEntry {\n  kind: 'computed';\n  name: string;\n  type: string;\n  dependencies: string[];\n  description?: string;\n  keywords: Keyword[];\n  category?: string;\n  version?: string;\n  since?: string;\n  visibility: 'public' | 'protected' | 'private';\n}\n\ntype Keyword = {\n  name: string;\n  description?: string;\n};\n```\n\n### Annotate methods\n\nTo document methods, simply use JSDoc tags\n[`@param`](http://usejsdoc.org/tags-param.html) and\n[`@returns`](http://usejsdoc.org/tags-returns.html):\n\n**Legacy usage**\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  export default {\n    methods: {\n      /**\n       * Submit form\n       *\n       * @param {object} data - Data to submit\n       * @returns {boolean} true on success; otherwise, false\n       */\n      submit(data) {\n        return true;\n      },\n    },\n  };\n</script>\n```\n\n**Composition usage**\n\n```html\n<!-- CheckboxInput.vue -->\n<script setup>\n  /**\n   * Submit form\n   *\n   * @param {object} data - Data to submit\n   * @returns {boolean} true on success; otherwise, false\n   */\n  function submit(data) {\n    return true;\n  }\n</script>\n```\n\n**Special tags for methods**\n\n- `@method <method name>`<br>\n  You can use special tag `@method` for non primitive name:\n  \n  ```html\n  <script>\n    const METHODS = {\n      CLOSE: 'closeModal',\n    };\n  \n    export default {\n      methods: {\n        /**\n          * Close modal\n          * @method closeModal\n          */\n        [METHODS.CLOSE] () {},\n      },\n    };\n  </script>\n  ```\n\n- `@syntax <custom method syntax>`<br>\n  By default, Vuedoc Parser automatically generates method syntax with typing.\n  For example, the previous example will generate:\n  \n  ```js\n  {\n    kind: 'method',\n    name: 'closeModal',\n    params: [],\n    returns: { type: 'void', description: undefined },\n    syntax: [\n      'closeModal(): void'\n    ],\n    category: undefined,\n    version: undefined,\n    description: undefined,\n    keywords: [],\n    visibility: 'public'\n  }\n  ```\n  \n  You can overwrite syntax generation by using tag `@syntax`. You can also\n  define multiple syntax examples:\n  \n  ```html\n  <script>\n    export default {\n      methods: {\n        /**\n         * @syntax target.addEventListener(type, listener [, options]);\n        * @syntax target.addEventListener(type, listener [, useCapture]);\n        * @syntax target.addEventListener(type, listener [, useCapture, wantsUntrusted  ]); // Gecko/Mozilla only\n        */\n        addEventListener(type, listener, options, useCapture) {},\n      },\n    };\n  </script>\n  ```\n\n**Method Entry Interface**\n\n```ts\ninterface MethodEntry {\n  kind: 'method';\n  name: string;\n  params: MethodParam[];\n  returns: MethodReturn;\n  syntax: string[];\n  description?: string;\n  keywords: Keyword[];\n  category?: string;\n  version?: string;\n  since?: string;\n  visibility: 'public' | 'protected' | 'private';\n}\n\ntype Keyword = {\n  name: string;\n  description?: string;\n};\n\ntype MethodParam = {\n  name: string;\n  type: NativeTypeEnum | string;\n  description?: string;\n  defaultValue?: string;\n  rest: boolean;\n};\n\ntype MethodReturn = {\n  type: string;\n  description?: string;\n};\n```\n\n### Annotate events\n\n**Legacy usage**\n\nTo document events using the legacy syntax, use the\n[emits](https://vuejs.org/api/options-state.html#emits)\nfield and tags `@arg` or `@argument` to define arguments:\n\nArray syntax:\n\n```html\n<script>\n  export default {\n    emits: [\n      /**\n       * Emit the `loading` event on submit\n       *\n       * @arg {boolean} status - The loading status\n       */\n      'loading',\n      /**\n       * Emit the `input` event on submit\n       */\n      'input',\n    ],\n  };\n</script>\n```\n\nObject syntax with validation:\n\n```html\n<script>\n  export default {\n    emits: {\n      /**\n       * Emit the `loading` event on submit\n       *\n       * @arg {boolean} status - The loading status\n       */\n      loading: null, // no validation\n\n      /**\n       * Emit the `input` event on submit\n       */\n      input: (payload) => {\n        if (payload.email && payload.password) {\n          return true\n        } else {\n          console.warn(`Invalid submit event payload!`)\n          return false\n        }\n      },\n    },\n  };\n</script>\n```\n\n**Composition usage**\n\nArray syntax:\n\n```html\n<script setup>\n  const emit = defineEmits([\n    /**\n     * Emit the `loading` event on submit\n     *\n     * @arg {boolean} status - The loading status\n     */\n    'loading',\n    /**\n     * Emit the `input` event on submit\n     */\n    'input',\n  ]);\n</script>\n```\n\nObject syntax with validation:\n\n```html\n<script setup>\n  const emit = defineEmits({\n    /**\n     * Emit the `loading` event on submit\n     *\n     * @arg {boolean} status - The loading status\n     */\n    loading: null, // no validation\n\n    /**\n     * Emit the `input` event on submit\n     */\n    input: (payload) => {\n      if (payload.email && payload.password) {\n        return true\n      } else {\n        console.warn(`Invalid submit event payload!`)\n        return false\n      }\n    },\n  });\n</script>\n```\n\n**Composition usage with TypeScript**\n\n```html\n<script setup>\n  const emit = defineEmits<{\n    /**\n     * Emit the `loading` event on submit\n     *\n     * @arg {boolean} status - The loading status\n     */\n    (e: 'loading', value: boolean): void\n\n    /**\n     * Emit the `input` event on submit\n     */\n    (e: 'input', value: boolean): void\n  }>()\n</script>\n```\n\n**Vue 2 usage**\n\nVuedoc Parser automatically extracts events from component template, hooks and\nmethods when using Vue 2:\n\n```html\n<script>\n  export default {\n    created() {\n      /**\n       * Emit the `loading` event on submit\n       * @arg {boolean} status - The loading status\n       */\n      this.$emit('loading', true);\n    },\n    methods: {\n      submit() {\n        /**\n        * Emit the `input` event on submit\n        */\n        this.$emit('input', true);\n      },\n    },\n  };\n</script>\n\n<template>\n  <div>\n    <!-- Emit the `click` event on submit -->\n    <button @click=\"$emit('click', $event)\">Submit</button>\n  </div>\n</template>\n```\n\nYou can use special keyword `@event` for non primitive name:\n\n```html\n<script>\n  const EVENTS = {\n    CLOSE: 'close',\n  };\n\n  export default {\n    methods: {\n      closeModal() {\n        /**\n          * Emit the `close` event on click\n          * @event close\n          */\n        this.$emit(EVENTS.CLOSE, true);\n      },\n    },\n  };\n</script>\n```\n\n**Event Entry Interface**\n\n```ts\ninterface EventEntry {\n  kind: 'event';\n  name: string;\n  description?: string;\n  arguments: EventArgument[];\n  keywords: Keyword[];\n  category?: string;\n  version?: string;\n  since?: string;\n  visibility: 'public' | 'protected' | 'private';\n}\n\ntype Keyword = {\n  name: string;\n  description?: string;\n};\n\ntype EventArgument = {\n  name: string;\n  type: NativeTypeEnum | string;\n  description?: string;\n  rest: boolean;\n};\n```\n\n### Annotate slots\n\nVuedoc Parser automatically extracts slots from template. You must use `@prop`\ntag to define properties of a slot:\n\n```html\n<template>\n  <div>\n    <!-- Default slot -->\n    <slot></slot>\n    <!-- Use this slot to set the checkbox label -->\n    <slot name=\"label\">Unnamed checkbox</slot>\n    <!--\n      Slot with keywords and\n      multiline description\n\n      @prop {User} user - The current user\n      @prop {UserProfile} profile - The current user's profile\n    -->\n    <slot name=\"header\" v-bind:user=\"user\" v-bind:profile=\"profile\"/>\n  </div>\n</template>\n```\n\n**Annotate slots defined in Render Functions**\n\nTo annotate slots defined in Render Functions, just attach the tag `@slot`\nto the component definition:\n\n```html\n<script>\n  /**\n   * A functional component with slots defined in render function\n   * @slot title - A title slot\n   * @slot default - A default slot\n   */\n  export default {\n    functional: true,\n    render(h, { slots }) {\n      return h('div', [\n        h('h1', slots().title),\n        h('p', slots().default),\n      ]);\n    },\n  };\n</script>\n```\n\nYou can also use the tag `@slot` to define dynamic slots on template:\n\n```html\n<template>\n  <div>\n    <template v-for=\"name in ['title', 'default']\">\n      <!--\n        @slot title - A title slot\n        @slot default - A default slot\n      -->\n      <slot :name=\"name\"></slot>\n    </template>\n  </div>\n</template>\n```\n\n**Slot Entry Interface**\n\n```ts\ninterface SlotEntry {\n  kind: 'slot';\n  name: string;\n  description?: string;\n  props: SlotProp[];\n  keywords: Keyword[];\n  category?: string;\n  version?: string;\n  since?: string;\n  visibility: 'public' | 'protected' | 'private';\n}\n\ntype Keyword = {\n  name: string;\n  description?: string;\n};\n\ntype SlotProp = {\n  name: string;\n  type: string;\n  description?: string;\n};\n```\n\n### Ignore items from parsing\n\nUse the [JSDoc's tag `@ignore`](https://jsdoc.app/tags-ignore.html) to keeps the\nsubsequent code from being documented.\n\n```html\n<!-- CheckboxInput.vue -->\n<script>\n  export default {\n    data: () => ({\n      /**\n       * This will be ignored on parsing\n       * @ignore\n       */\n      checked: false,\n    }),\n  };\n</script>\n```\n\nYou can also use the [TypeDoc's tag `@hidden`](https://typedoc.org/guides/doccomments/#hidden-and-ignore).\n\n## Tags Extraction\n\nYou can attach keywords (or tags) to any comment and then extract them using\nthe parser.\n\n**Usage**\n\n```html\n<script>\n  /**\n   * Component description\n   *\n   * @license MIT\n   */\n  export default { /* ... */ };\n</script>\n```\n\n> Note that the description must always appear before keywords definition.\n\nParsing result:\n\n```json\n{\n  \"name\": \"my-checkbox\",\n  \"description\": \"Component description\",\n  \"keywords\": [\n    {\n      \"name\": \"license\",\n      \"description\": \"MIT\"\n    }\n  ]\n}\n```\n\n## Supported Tags\n\n| Tag                   | Scope                       | Description                                                                                |\n| --------------------- | --------------------------- | ------------------------------------------------------------------------------------------ |\n| `@name`               | `component`                 | Provide a custom name of the component                                                     |\n| `@type`               | `props`, `data`, `computed` | Provide a type expression identifying the type of value that a prop or a data may contain  |\n| `@default`            | `props`                     | Provide a default value of a prop                                                          |\n| `@kind`               | `props`                     | Used to document what kind of symbol is being documented                                   |\n| `@initialValue`       | `data`                      | Provide an initial value of a data                                                         |\n| `@method`             | `methods`                   | Force the name of a specific method                                                        |\n| `@syntax`             | `methods`                   | Provide the custom method syntax                                                           |\n| `@param`              | `methods`                   | Provide the name, type, and description of a function parameter                            |\n| `@returns`, `@return` | `methods`                   | Document the value that a function returns                                                 |\n| `@event`              | `events`                    | Force the name of a specific event                                                         |\n| `@arg`, `@argument`   | `events`                    | Provide the name, type, and description of an event argument                               |\n| `@slot`               | `slots`                     | Document slot defined in render function                                                   |\n| `@prop`               | `slots`                     | Provide the name, type, and description of a slot prop                                     |\n| `@mixin` *deprecated* | `component`                 | Force parsing of the exported item as a mixin component. This is deprecated since `v4.0.0` |\n| `@version`            | `all`                       | Assign a version to an item                                                                |\n| `@since`              | `all`                       | Indicate that an item was added in a specific version                                      |\n| `@author`             | `all`                       | Identify authors of an item                                                                |\n| `@deprecated`         | `all`                       | Mark an item as being deprecated                                                           |\n| `@see`                | `all`                       | Allow to refer to a resource that may be related to the item being documented              |\n| `@ignore`             | `*`                         | Keep the subsequent code from being documented                                             |\n| **TypeDoc**           |                             |                                                                                            |\n| `@category`           | `all`                       | Attach a category to an item                                                               |\n| `@hidden`             | `*`                         | Keep the subsequent code from being documented                                             |\n| **Visibilities**      |                             |                                                                                            |\n| `@public`             | `*`                         | Mark a symbol as public                                                                    |\n| `@protected`          | `*`                         | Mark a symbol as private                                                                   |\n| `@private`            | `*`                         | Mark a symbol as protected                                                                 |\n\n> `*` stand for `props`, `data`, `methods`, `events`, `slots`\n\n## Working with Mixins\n\nStarting `v4.0.0`, Vuedoc Parser implements a mechanism to automatically\nload needed import declarations to parse and extract metadata.\n\nWith this new capability, Vuedoc Parser is now able to handle Vue mixins\nautomatically.\n\n## Parsing control with `options.features`\n\n`options.features` lets you select which Vue Features you want to parse and\nextract.\n\nThe default value is defined by `VuedocParser.SUPPORTED_FEATURES` array.\n\n**Usage**\n\nOnly parse `name`, `props`, `computed properties`, `slots` and `events`:\n\n```js\nimport { parseComponent } from '@vuedoc/parser';\n\nconst options = {\n  filename: 'test/examples/circle-drawer/circle-drawer-composition.vue',\n  features: [ 'name', 'props', 'computed', 'slots', 'events' ],\n};\n\nparseComponent(options)\n  .then((component) => Object.keys(component))\n  .then((keys) => console.log(keys));\n  // => [ 'name', 'props', 'computed', 'slots', 'events' ]\n```\n\nParse all features except `data`:\n\n```js\nimport { parseComponent, VuedocParser } from '@vuedoc/parser';\n\nconst options = {\n  filename: 'test/examples/circle-drawer/circle-drawer-composition.vue',\n  features: VuedocParser.SUPPORTED_FEATURES.filter((feature) => feature !== 'data'),\n};\n\nparseComponent(options)\n  .then((component) => Object.keys(component))\n  .then((keys) => console.log(keys));\n  // => [ 'name', 'description', 'keywords', 'model',\n  //      'props', 'computed', 'events', 'methods', 'slots' ]\n```\n\n## Using Plugins\n\nVuedoc can be extended using plugins.\n\n### Adding a Plugin\n\nTo use a plugin, it needs to be added to the `devDependencies` of the project\nand included in the plugins array `options.plugins`. For example, to provide\nsupport of Vue Router, the official [`@vuedoc/plugin-vue-router`](https://gitlab.com/vuedoc/plugin-vue-router)\ncan be used:\n\n```sh\n$ npm add -D @vuedoc/plugin-vue-router\n```\n\n```js\n// main.js\nimport { parseComponent } from '@vuedoc/parser';\nimport { VueRouterPlugin } from '@vuedoc/plugin-vue-router';\n\nconst component = await parseComponent({\n  plugins: [\n    VueRouterPlugin,\n  ],\n  // ...\n});\n```\n\n### Official Plugins\n\n| Name              | Description                      | Documentation                                                              |\n| ----------------- | -------------------------------- | -------------------------------------------------------------------------- |\n| Vue Router Plugin | The Vue Router plugin for Vuedoc | [`@vuedoc/plugin-vue-router`](https://gitlab.com/vuedoc/plugin-vue-router) |\n| Vuex Plugin       | The Vuex plugin for Vuedoc       | [`@vuedoc/plugin-vuex`](https://gitlab.com/vuedoc/plugin-vuex)             |\n\n### Building Plugins\n\n**Plugins Overview**\n\nA Vuedoc plugin is an object with one or more of the properties, parsing hooks\ndescribed below, and which follows our conventions.\nA plugin should be distributed as a package which exports a function \nthat can be called with plugin specific options and returns such an \nobject.\n\nPlugins allow you to customise Vuedoc's behaviour by, for example, \nhandling and parse parsing result object before sending the final result, or\nadding support of a third-party modules in your `node_modules` folder.\n\n**Conventions**\n\n- Plugins should have a clear name with `vuedoc-plugin-` prefix.\n- Include `vuedoc-plugin` keyword in `package.json`.\n- Plugins should be tested.\n- Document your plugin in English.\n\n**Interface**\n\n```ts\ntype Plugin = (parser: Parser) => PluginDefinition;\n\ninterface PluginDefinition {\n  /**\n   * Custom import resolver\n   */\n  resolver?: ImportResolver;\n\n  /**\n   * List of resource files to preload before parsing\n   */\n  preload?: string[];\n\n  /**\n   * Additional composition tokens for advanced components\n   */\n  composition?: Partial<ParsingComposition>;\n\n  /**\n   * Handle parsing result\n   */\n  handleParsingResult?(component: ParseResult): void;\n}\n\ninterface Parser extends EventTarget {\n  /**\n   * Resolved options\n   */\n  readonly options: ResolvedOptions;\n\n  addEventListener(\n    type: EventType,\n    callback: EventListener<EntryEvent<EventType>>,\n    options?: boolean | AddEventListenerOptions\n  ): void;\n\n  addEventListener<T extends MessageEventType>(\n    type: EventType,\n    callback: EventListener<MessageEvent<EventType>>,\n    options?: boolean | AddEventListenerOptions\n  ): void;\n\n  addEventListener(\n    type: 'end',\n    callback: EventListener<EndEvent>,\n    options?: boolean | AddEventListenerOptions\n  ): void;\n}\n\ntype EventType = 'computed' | 'data' | 'description' | 'event' | 'inheritAttrs' | 'keyword' | 'method' | 'model' | 'name' | 'prop';\n```\n\nPlease see [PluginInterface from types/index.d.ts from detailled types](https://gitlab.com/vuedoc/parser/blob/main/types/index.d.ts).\n\n## Language Processing\n\n### Loader API\n\nPlease see [TypeScript definition file for the Loader class](https://gitlab.com/vuedoc/parser/blob/main/types/Loader.d.ts).\n\n### Built-in loaders\n\n| Language   | Load by default? | Module                                                                                                    |\n| ---------- | ---------------- | --------------------------------------------------------------------------------------------------------- |\n| HTML       | Yes              | [@vuedoc/parser/loaders/html](https://gitlab.com/vuedoc/parser/blob/main/src/loaders/html.ts)             |\n| JavaScript | Yes              | [@vuedoc/parser/loaders/javascript](https://gitlab.com/vuedoc/parser/blob/main/src/loaders/javascript.ts) |\n| Pug        | No               | [@vuedoc/parser/loaders/pug](https://gitlab.com/vuedoc/parser/blob/main/src/loaders/pug.ts)               |\n| TypeScript | Yes              | [@vuedoc/parser/loaders/typescript](https://gitlab.com/vuedoc/parser/blob/main/src/loaders/typescript.ts) |\n| Vue        | Yes              | [@vuedoc/parser/loaders/vue](https://gitlab.com/vuedoc/parser/blob/main/src/loaders/vue.ts)               |\n\n### Create a custom loader\n\nThe example below uses the abstract `Vuedoc.Loader` class to create a\nspecialized class to handle a template with the\n[CoffeeScript](https://www.npmjs.com/package/coffeescript) language.\nIt uses the built-in `PugLoader` to load Pug template:\n\n```js\nimport { parseComponent, Loader } from '@vuedoc/parser';\nimport { PugLoader } from '@vuedoc/parser/loaders/pug';\nimport { compile } from 'coffeescript';\n\nclass CoffeeScriptLoader extends Loader {\n  load (source) {\n    const outputText = compile(source);\n\n    this.emitScript(outputText);\n  }\n}\n\nconst options = {\n  filecontent: `\n    <template lang=\"pug\">\n      div.page\n        h1 Vuedoc Parser with Pug\n        // Use this slot to define a subtitle\n        slot(name='subtitle')\n    </template>\n\n    <script lang=\"coffee\">\n      ###\n      # Description of MyInput component\n      ###\n      export default\n        name: 'MyInput'\n    </script>\n  `,\n  loaders: [\n    /**\n     * Register CoffeeScriptLoader\n     * Note that the name of the loader is either the extension\n     * of the file or the value of the attribute `lang`\n     */\n    Loader.extend('coffee', CoffeeScriptLoader),\n\n    // Register the built-in Pug loader\n    Loader.extend('pug', PugLoader),\n  ],\n};\n\nparseComponent(options).then((component) => {\n  console.log(component);\n});\n```\n\n**Output**\n\n```js\n{\n  name: 'MyInput',\n  description: 'Description of MyInput component',\n  slots: [\n    {\n      kind: 'slot',\n      visibility: 'public',\n      description: 'Use this slot to define a subtitle',\n      keywords: [],\n      name: 'subtitle',\n      props: []\n    }\n  ],\n  // ...\n}\n```\n\n## Parsing Output Interface\n\nPlease see [TypeScript definition file](https://gitlab.com/vuedoc/parser/blob/main/types/index.d.ts).\n\n## Generate Markdown Documentation\n\nTo generate a markdown documentation, please use the [@vuedoc/md](https://gitlab.com/vuedoc/md) package.\n\n## Contribute\n\nPlease follow [CONTRIBUTING.md](https://gitlab.com/vuedoc/parser/blob/main/CONTRIBUTING.md).\n\n## Versioning\n\nGiven a version number `MAJOR.MINOR.PATCH`, increment the:\n\n- `MAJOR` version when you make incompatible API changes,\n- `MINOR` version when you add functionality in a backwards-compatible manner,\n  and\n- `PATCH` version when you make backwards-compatible bug fixes.\n\nAdditional labels for pre-release and build metadata are available as extensions\nto the `MAJOR.MINOR.PATCH` format.\n\nSee [SemVer.org](https://semver.org/) for more details.\n\n## License\n\nUnder the MIT license.\nSee [LICENSE](https://gitlab.com/vuedoc/parser/blob/main/LICENSE) file for\nmore details.","users":{}}