[
  {
    "path": ".config/mocha.fast.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/mocharc.json\",\n    \"exclude\": [\"src/test/packages/**\", \"src/test/slow/**\"],\n    \"extension\": [\"ts\", \"cts\", \"mts\", \"tsx\"],\n    \"spec\": [\"src/test/**/*.test.ts\", \"src/test/**/*.test.tsx\"],\n    \"timeout\": 5000,\n    \"watch-files\": [\"src/**/*.ts\", \"src/**/*.tsx\"],\n    \"node-option\": [\"import=tsx\", \"conditions=typedoc-ts\"]\n}\n"
  },
  {
    "path": ".config/mocha.full.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/mocharc.json\",\n    \"timeout\": 0,\n    \"spec\": [\"src/test/**/*.test.ts\", \"src/test/**/*.test.tsx\"],\n    \"exclude\": [\"src/test/packages/**\"],\n    \"node-option\": [\"import=tsx\", \"conditions=typedoc-ts\"]\n}\n"
  },
  {
    "path": ".config/mocha.test-explorer.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/mocharc.json\",\n    \"extension\": [\"ts\"],\n    \"ignore\": [],\n    \"package\": \"./package.json\",\n    \"node-option\": [\"import=tsx\", \"conditions=typedoc-ts\"],\n    \"slow\": 500,\n    \"spec\": [\"src/**/*.test.ts\", \"src/**/*.test.tsx\"],\n    \"timeout\": 0,\n    \"watch-files\": [\"src/**/*.ts\", \"src/**/*.tsx\"]\n}\n"
  },
  {
    "path": ".config/regconfig.json",
    "content": "{\n    \"core\": {\n        \"workingDir\": \"dist/tmp/.reg\",\n        \"actualDir\": \"dist/tmp/__screenshots__\",\n        \"thresholdRate\": 0.001,\n        \"addIgnore\": true,\n        \"ximgdiff\": {\n            \"invocationType\": \"client\"\n        }\n    }\n}\n"
  },
  {
    "path": ".config/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"intentionallyNotExported\": [\n        \"SORT_STRATEGIES\",\n        \"_ModelToObject\",\n        \"EventHooksMomento\",\n        \"MarkedPlugin\",\n        \"MeaningKeywords\"\n    ],\n    \"sort\": [\n        \"kind\",\n        \"instance-first\",\n        \"required-first\",\n        \"alphabetical-ignoring-documents\"\n    ],\n    \"name\": \"TypeDoc API\",\n\n    // Don't document the debug entry point\n    \"entryPoints\": [\"../src/index.ts\"],\n    \"outputs\": [\n        {\n            \"name\": \"html\",\n            \"path\": \"../docs\"\n        },\n        {\n            \"name\": \"json\",\n            \"path\": \"../docs/docs.json\"\n        }\n    ],\n\n    \"excludeExternals\": true,\n    \"externalPattern\": [\"**/node_modules/**\", \"../src/lib/types/**\"],\n    \"excludeInternal\": false,\n    \"excludePrivate\": true,\n    // \"excludeReferences\": true,\n    \"groupReferencesByType\": true,\n    \"jsDocCompatibility\": false,\n    \"treatWarningsAsErrors\": false,\n    \"categorizeByGroup\": false,\n    \"categoryOrder\": [\"Reflections\", \"Types\", \"Comments\", \"*\"],\n    \"groupOrder\": [\"Common\", \"Namespaces\", \"*\"],\n    \"hostedBaseUrl\": \"https://typedoc.org/example/\",\n    \"navigationLinks\": {\n        \"Docs\": \"https://typedoc.org\",\n        \"Example\": \"https://typedoc.org/example/index.html\",\n        \"GitHub\": \"https://github.com/TypeStrong/typedoc\"\n    },\n    \"validation\": {\n        \"notExported\": true,\n        \"invalidLink\": true,\n        \"notDocumented\": false\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": false,\n        \"@internal\": false\n    },\n    \"searchInComments\": true,\n    \"searchInDocuments\": true,\n    \"searchGroupBoosts\": {\n        \"Classes\": 5.0,\n        \"Interfaces\": 2.0,\n        \"Enumerations\": 2.0,\n        \"Type Aliases\": 2.0\n    },\n    \"navigation\": {\n        \"includeCategories\": true,\n        \"includeGroups\": false,\n        \"excludeReferences\": true\n    },\n    \"includeVersion\": true,\n    \"logLevel\": \"Verbose\",\n    \"externalSymbolLinkMappings\": {\n        \"@types/markdown-it\": {\n            \"MarkdownIt\": \"https://markdown-it.github.io/markdown-it/#MarkdownIt\"\n        }\n    },\n\n    // Saves a couple seconds when generating docs\n    \"skipErrorChecking\": true\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 4\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[package.json]\nindent_size = 2\n\n[src/test/converter2/issues/gh2631/crlf.md]\nend_of_line = crlf\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Disable core.autocrlf's line ending conversion behavior to prevent test failures on Windows\n* text=auto eol=lf\nsrc/test/converter2/issues/gh2631/crlf.md text=auto eol=crlf\n\n*.png binary\n*.psd binary\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n- Demonstrating empathy and kindness toward other people\n- Being respectful of differing opinions, viewpoints, and experiences\n- Giving and gracefully accepting constructive feedback\n- Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n- Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n- The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n- Trolling, insulting or derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\ntypedoc@gerritbirkeland.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\n[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][mozilla coc].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][faq]. Translations are available\nat [https://www.contributor-covenant.org/translations][translations].\n\n[homepage]: https://www.contributor-covenant.org\n[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html\n[mozilla coc]: https://github.com/mozilla/diversity\n[faq]: https://www.contributor-covenant.org/faq\n[translations]: https://www.contributor-covenant.org/translations\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing to TypeDoc\n\nThanks for taking the time to contribute! TypeDoc is a volunteer-run project and we couldn't do it without your help.\n\nThis document includes a set of guidelines for contributing to TypeDoc. These are guidelines, not rules. If something seems off, please feel free to propose changes to this document in a pull request.\n\n## Table of Contents\n\n- [Contributing to TypeDoc](#contributing-to-typedoc)\n  - [Table of Contents](#table-of-contents)\n  - [How Can I Contribute?](#how-can-i-contribute)\n    - [Bug Reports](#bug-reports)\n    - [Suggestions](#suggestions)\n    - [Documentation](#documentation)\n    - [Code](#code)\n  - [Setup - Git, GitHub, and Node](#setup---git-github-and-node)\n    - [Installation](#installation)\n  - [Linting, Building, and Testing](#linting-building-and-testing)\n    - [Linting](#linting)\n    - [Building](#building)\n    - [Testing](#testing)\n  - [Pull Requests](#pull-requests)\n  - [Updating Your Branch](#updating-your-branch)\n\n## How Can I Contribute?\n\n### Bug Reports\n\nThis section guides you through submitting a bug report for TypeDoc. Following these guidelines helps others understand your report and resolve the issue.\n\nBefore creating a bug report please check [this list][bugs] to see if it has already been reported. If the issue is closed, please open a new issue and link it to the original issue.\n\nWhen creating a bug report, explain the problem and include as much additional information as necessary to help maintainers to reproduce it. Ideally, provide an example project which highlights the problem.\n\n- **Use a clear and descriptive title** for the issue to identify the problem\n- **Describe your project setup**. The easier it is for maintainers to reproduce your problem, the more likely it is to be quickly fixed.\n- **Explain what you expected to see instead and why**\n\n### Suggestions\n\nThis section guides you through submitting an enhancement suggestion for Typedoc.\n\nBefore creating a feature request, please check [this list][suggestions] to see if it has already been requested.\n\nWhen creating an enhancement request, explain your use case and ultimate goal. This will make it possible for contributors to suggest existing alternatives which may already meet your requirements.\n\n- **Use a clear and descriptive title** for the issue to identify the suggestion.\n- **Provide an example where this enhancement would improve TypeDoc**\n- **If possible, list another documentation generator where this feature exists**\n\n### Documentation\n\nTypeDoc is documented in 4 primary areas.\n\n- This repo's [README.md](https://github.com/TypeStrong/typedoc/blob/master/README.md)\n- The website guides hosted at [TypeStrong/typedoc-site](https://github.com/TypeStrong/typedoc-site/)\n- Doc comments of source files which are rendered in the [api docs](https://typedoc.org/api/)\n- The [option descriptions](https://github.com/TypeStrong/typedoc/blob/ce0654295698e2bb2badf5f93d388bd977da3c46/src/lib/application.ts#L66) used by the `--help` command\n\nIf you would like to improve the documentation in any of these areas, please open an issue if there isn't one already to discuss what you would like to improve. Then submit a [Pull Request](#pull-requests) to this repo, (or to [TypeStrong/typedoc-site](https://github.com/TypeStrong/typedoc-site/) in the case of guides).\n\n### Code\n\nUnsure of where to begin contributing to TypeDoc? You can start by looking through the issues labeled [good-first-issue] and [help-wanted]. Issues labeled with [good-first-issue] should only require changing a few lines of code and a test or two. Issues labeled with [help-wanted] can be considerably more involved and may require changing multiple files.\n\nFor instructions on setting up your environment, see the [setup](#setup---git-github-and-node) instructions in this document.\nOnce set up, you may find the [development](https://typedoc.org/guides/development/) page useful for an overview of TypeDoc's architecture.\n\nIf you have started work on an issue and get stuck or want a second opinion on your implementation feel free to reach out through [Discord].\n\n## Setup - Git, GitHub, and Node\n\nIf you don't already have [Git] installed, install it first. You will need it to contribute to TypeDoc. You will also need to install [Node] and pnpm.\n\n#### Installation\n\n1. Fork the TypeDoc repository - https://github.com/TypeStrong/typedoc/fork\n1. Open a terminal, or \"Git Bash\" on Windows.\n1. Use `cd` to move to the directory that you want to work in.\n1. Clone your repository, replace USER with your GitHub username:\n   ```bash\n   git clone https://github.com/USER/typedoc\n   ```\n1. Add the TypeDoc repo as a remote repository\n   ```bash\n   git remote add typedoc https://github.com/TypeStrong/typedoc\n   ```\n1. Install dependencies:\n   ```bash\n   pnpm install\n   ```\n1. Build:\n   ```bash\n   pnpm build\n   ```\n1. Open the typedoc folder in your favorite editor. If you don't have one, try [Visual Studio Code][vscode]\n\n## Linting, Building, and Testing\n\nOnce you have cloned TypeDoc, you can lint, build, and test the code from your terminal.\n\n#### Linting\n\nTo lint the TypeDoc code, run `pnpm run lint`. This will start eslint and check all files for stylistic problems. You can also install an eslint plugin for your editor to show most style problems as you type.\n\nYou can automatically fix some style problems by running `pnpx dprint fmt`.\n\n#### Building\n\nTo compile the TypeDoc source, run `pnpm build`. This will start the TypeScript compiler and output the compiled JavaScript to the `dist` folder.\n\n#### Testing\n\nTypeDoc includes an extensive set of tests that describe its output. To validate any changes you have made run `pnpm test`.\nThis will run a subset of TypeDoc's tests intended for quick development checks.\nTests which take more than half a second are located in `src/test/slow`, and will only be run if you run `pnpm run test:full`.\n\nIf you have changed the TypeDoc output, it will cause tests to fail. Once you have validated that the introduced changes were intended, run `pnpm run rebuild_specs` to update the spec files for the new output.\n\nAdditional tests are contained within the `converter2` directory that look for specific issues with previous\nbuilds and may be more appropriate for adding a test for a bugfix.\n\n#### Visual Regression Testing\n\nThere is also a script to visually compare the differences between changes. To set this up, build the code, then run `node scripts/visual_regression.js`. This will create a baseline which future runs will be compared against after making changes, compiling, and running the visual regression script again.\n\n## Pull Requests\n\nOnce you have finished working on an issue, you can submit a pull request to have your changes merged into the TypeDoc repository and included in the next release.\n\nBefore submitting a pull request, make sure that there are no linting problems (`pnpm run lint`), all tests pass (`pnpm test`), and your branch is up to date. Its also a good idea to join the TypeScript [discord] and visit the `#typedoc` channel to discuss how best to implement changes.\n\nIf your change is user facing, consider updating `CHANGELOG.md` to describe the change you have made. If you don't, the maintainer who merges your pull request will do it for you.\n\nPlease do not change the project version number in a pull request unless submitting a patch to the `lts` branch.\n\n## Updating Your Branch\n\nIf the TypeDoc repository has changed since you originally forked it, you will need to update your repository with the latest changes before submitting a pull request. To pull the latest changes from the TypeDoc repo, run `git pull typedoc master`.\n\n[bugs]: https://github.com/TypeStrong/typedoc/labels/bug\n[suggestions]: https://github.com/TypeStrong/typedoc/labels/enhancement\n[good-first-issue]: https://github.com/TypeStrong/typedoc/labels/good%20first%20issue\n[help-wanted]: https://github.com/TypeStrong/typedoc/labels/help%20wanted\n[discord]: https://discord.com/invite/typescript\n[github]: https://github.com\n[git]: https://git-scm.com\n[node]: https://nodejs.org/en/\n[vscode]: https://code.visualstudio.com/\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: gerrit0\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug Report\nabout: Report a bug in TypeDoc\ntype: Bug\n---\n\n## Search terms\n\n<!-- Include keywords that might help others with the same problem find this issue -->\n\n## Expected Behavior\n\n<!-- How did you expect Typedoc to work? -->\n\n## Actual Behavior\n\n<!-- What does Typedoc fail to do? -->\n\n## Steps to reproduce the bug\n\n<!--\nNote: Turn off skipErrorChecks before reporting a crash. Bug reports for crashes with that option\non are out of scope.\n\nNote: Please try to reproduce the issue WITHOUT any plugins enabled before reporting a bug.\n\nIf possible, please create a *minimal* repo reproducing your problem.\nIf it is more than a single small file, please submit a pull request to\nhttps://github.com/TypeStrong/typedoc-repros\nwhich changes the files necessary to reproduce your bug.\n\nIf this is not possible, include at least:\n    1. Installed packages + versions\n    2. The code TypeDoc doesn't work on\n    3. tsconfig.json\n    4. How you are running TypeDoc + any relevant configuration files\n-->\n\n## Environment\n\n- TypeDoc version:\n- TypeScript version:\n- Node.js version:\n- OS:\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "contact_links:\n    - name: Discussions\n      url: https://github.com/TypeStrong/typedoc/discussions\n      about: Please ask questions here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature Request\nabout: Suggest improvements or new features\ntype: Feature\n---\n\n## Search Terms\n\n<!-- Include keywords that might help others with the same problem find this issue -->\n\n## Problem\n\n<!-- What is missing or inconvenient without this improvement or feature? -->\n\n## Suggested Solution\n\n<!-- How do you suggest fixing the problem? Do any other tools already do it? -->\n"
  },
  {
    "path": ".github/SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nThe TypeDoc team supports the latest minor version. For one minor version prior to the latest,\npull requests providing patches to fix security vulnerabilities will be accepted. Support for the\nprevious minor version relies completely on community pull requests.\n\nSee https://typedoc.org/documents/Overview.html for the current status.\n\n## Patching LTS Versions\n\nIf you depend on the prior minor version of TypeDoc and want to submit a fix, submit a pull request\nto the `lts` branch. When merged, a new version will be automatically published with your patch.\n\nBe sure to include an update to the version field in `package.json`.\n\nNote: Only pull requests which fix security vulnerabilities will be accepted. Additional features and bug fixes are out of scope for old versions.\n"
  },
  {
    "path": ".github/workflows/build-site.yml",
    "content": "name: Build Site\non:\n    push:\n    pull_request:\n    schedule:\n        - cron: \"0 5 * * *\"\njobs:\n    build:\n        runs-on: ubuntu-latest\n        name: Build Site\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n              with:\n                  fetch-depth: 0\n            - name: Set up Node\n              uses: actions/setup-node@v4\n              with:\n                  node-version: 20\n            - name: Set up pnpm\n              run: npm i -g pnpm@10\n            - name: Install\n              run: pnpm install\n            - name: Build\n              run: pnpm run build\n            - name: Build Site\n              run: ./scripts/build_site.sh\n            - name: Upload static files as artifact\n              id: deployment\n              uses: actions/upload-pages-artifact@v3\n              with:\n                  path: docs-site/\n    deploy:\n        needs: build\n        if: github.ref == 'refs/heads/master'\n        name: Deploy\n        permissions:\n            pages: write\n            id-token: write\n        environment:\n            name: github-pages\n            url: ${{ steps.deployment.outputs.page_url }}\n\n        runs-on: ubuntu-latest\n        steps:\n            - name: Deploy to GitHub Pages\n              id: deployment\n              uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\non: [push, pull_request]\njobs:\n    build:\n        runs-on: ubuntu-latest\n        strategy:\n            matrix:\n                node: [\"18\", \"20\", \"22.4.1\", \"23\"]\n        name: Node ${{ matrix.node }}\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n            - name: Set up Node\n              uses: actions/setup-node@v4\n              with:\n                  node-version: ${{ matrix.node }}\n            - name: Set up pnpm\n              run: npm i -g pnpm@10\n            - name: Install\n              run: pnpm install\n            - name: Build\n              run: pnpm run build\n            - name: Test\n              run: |\n                  if node -e \"process.exit(Number(+process.versions.node.slice(0, 2) < 23))\"; then\n                    export NODE_OPTIONS=\"--no-experimental-strip-types\"\n                  fi\n                  pnpm run test:full\n            - name: Lint\n              run: pnpm run lint\n            - name: Circular dependency check\n              uses: gerrit0/circular-dependency-check@v2.0.2\n              with:\n                  entry: |\n                    dist/index.js\n                    dist/lib/models/index.js\n                    dist/browser-utils.js\n    build-release:\n        runs-on: ubuntu-latest\n        name: Node 22 Release\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n            - name: Set up Node\n              uses: actions/setup-node@v4\n              with:\n                  node-version: 22.4.1\n            - name: Set up pnpm\n              run: npm i -g pnpm@10\n            - name: Install\n              run: pnpm install\n            - name: Build\n              run: |\n                  node scripts/set_strict.js false\n                  pnpm run build\n            - name: Test\n              run: pnpm run test:full\n            - name: Lint\n              run: pnpm run lint\n    build-windows:\n        runs-on: windows-latest\n        name: Node 18 Windows\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n            - name: Set up Node\n              uses: actions/setup-node@v4\n              with:\n                  node-version: 18\n            - name: Set up pnpm\n              run: npm i -g pnpm@10\n            - name: Install\n              run: pnpm install\n            - name: Build\n              run: pnpm run build\n            - name: Test\n              run: pnpm run test:full\n            - name: Lint\n              run: pnpm run lint\n"
  },
  {
    "path": ".github/workflows/publish-beta.yml",
    "content": "name: Publish Beta\non:\n    push:\n        branches:\n            - beta\njobs:\n    npm-publish:\n        name: npm-publish\n        runs-on: ubuntu-latest\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n            - id: check\n              uses: EndBug/version-check@v2.1.4\n              with:\n                  diff-search: true\n            - name: Set up Node\n              if: steps.check.outputs.changed == 'true' && contains(steps.check.outputs.version, 'beta')\n              uses: actions/setup-node@v4\n              with:\n                  node-version: \"18\"\n            - name: Setup pnpm\n              if: steps.check.outputs.changed == 'true' && contains(steps.check.outputs.version, 'beta')\n              run: npm i -g pnpm@10\n            - name: Install\n              if: steps.check.outputs.changed == 'true' && contains(steps.check.outputs.version, 'beta')\n              run: pnpm install\n            - name: Test\n              if: steps.check.outputs.changed == 'true' && contains(steps.check.outputs.version, 'beta')\n              run: pnpm test\n            - name: Publish\n              if: steps.check.outputs.changed == 'true' && contains(steps.check.outputs.version, 'beta')\n              # We need --no-git-checks because we swap a boolean to allow more lax types\n              # in the published package.\n              run: pnpm publish --tag beta --no-git-checks\n              env:\n                npm_config_//registry.npmjs.org/:_authToken: ${{ secrets.NPM_AUTH_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/publish-lts.yml",
    "content": "name: Publish LTS\non:\n    push:\n        branches:\n            - lts\njobs:\n    npm-publish:\n        name: npm-publish\n        runs-on: ubuntu-latest\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n            - id: check\n              uses: EndBug/version-check@v2.1.4\n              with:\n                  diff-search: true\n            - name: Set up Node\n              if: steps.check.outputs.changed == 'true'\n              uses: actions/setup-node@v4\n              with:\n                  node-version: \"18\"\n            - name: Set up pnpm\n              if: steps.check.outputs.changed == 'true'\n              run: npm i -g pnpm@10\n            - name: Install\n              if: steps.check.outputs.changed == 'true'\n              run: pnpm install\n            - name: Test\n              if: steps.check.outputs.changed == 'true'\n              run: pnpm test\n            - name: Publish\n              if: steps.check.outputs.changed == 'true'\n              # We need --no-git-checks because we swap a boolean to allow more lax types\n              # in the published package.\n              run: pnpm publish --tag lts --no-git-checks\n              env:\n                npm_config_//registry.npmjs.org/:_authToken: ${{ secrets.NPM_AUTH_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish\non:\n    push:\n        branches:\n            - master\n\npermissions:\n    id-token: write # Required for OIDC\n    contents: write # Required for git tag\n\njobs:\n    npm-publish:\n        name: npm-publish\n        runs-on: ubuntu-latest\n        steps:\n            - name: Checkout repository\n              uses: actions/checkout@v4\n              with:\n                  fetch-depth: 0\n            - id: check\n              uses: EndBug/version-check@v2.1.4\n              with:\n                  diff-search: true\n            - name: Set up Node\n              if: steps.check.outputs.changed == 'true'\n              uses: actions/setup-node@v4\n              with:\n                  node-version: \"24\"\n            - name: Set up pnpm\n              if: steps.check.outputs.changed == 'true'\n              run: npm i -g pnpm@10\n            - name: Install\n              if: steps.check.outputs.changed == 'true'\n              run: pnpm install\n            - name: Test\n              if: steps.check.outputs.changed == 'true'\n              run: pnpm test\n            - name: Publish\n              if: steps.check.outputs.changed == 'true'\n              # We need --no-git-checks because we swap a boolean to allow more lax types\n              # in the published package and generate some files for publishing.\n              run: pnpm publish --no-git-checks\n            - name: Generate Release\n              if: steps.check.outputs.changed == 'true'\n              run: |\n                  git config user.email \"typedoc@gerritbirkeland.com\"\n                  git config user.name \"TypeDoc Bot\"\n                  node scripts/create_release.js\n              env:\n                  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.idea\n.vs\n.tscache\n.baseDir.js\n.baseDir.ts\n*.swp\nyarn.lock\n.nyc_output\nyarn-error.log\ntypedoc-config.schema.json\n\n/src/test/renderer/*/doc\n/src/test/renderer/testProject/json.json\n**/node_modules/\n!src/test/converter2/behavior/node_modules/\n!src/test/converter2/renderer/node_modules/\n/coverage/\n/dist/\n/docs\n/docs2\n/docs-*\n/td*.json\n\ntypedoc*.tgz\ntmp\n/*.0x/\n\nsrc/test/renderer/specs/assets/*\nsrc/test/renderer/specs/specs.json\n\n# Built theme JS\nstatic/main.js\n\n/example/docs/\n"
  },
  {
    "path": ".npmrc",
    "content": "# If these were only for production, we'd care, but there's no\n# way to ask pnpm to only report production audit findings when doing\n# an install, so just turn it off. We can still check for findings\n# with pnpm audit --production.\naudit = false\n\n# While we're on the TS beta, need this flag.\nlegacy-peer-deps = true\n\n# This breaks some of the scripts in the scripts directory\nupdate-notifier = false\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n    \"recommendations\": [\n        \"hbenl.vscode-test-explorer\",\n        \"hbenl.vscode-mocha-test-adapter\",\n        \"dprint.dprint\"\n    ]\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible Node.js debug attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"args\": [\n                \"--import=tsx\",\n                \"--timeout\",\n                \"0\",\n                \"--config\",\n                \"${workspaceFolder}/.config/mocha.fast.json\"\n            ],\n            \"internalConsoleOptions\": \"openOnSessionStart\",\n            \"name\": \"Debug Tests\",\n            \"program\": \"${workspaceFolder}/node_modules/mocha/bin/mocha.js\",\n            \"request\": \"launch\",\n            \"skipFiles\": [\"<node_internals>/**\"],\n            \"type\": \"node\"\n        },\n        {\n            \"name\": \"Attach\",\n            \"port\": 9229,\n            \"request\": \"attach\",\n            \"internalConsoleOptions\": \"openOnSessionStart\",\n            \"skipFiles\": [\"<node_internals>/**\"],\n            \"type\": \"node\",\n            \"sourceMaps\": true\n        }\n    ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"files.associations\": {\n        \"tsdoc.json\": \"jsonc\", // TSDoc allows comments.\n        \"typedoc.json\": \"jsonc\" // TypeDoc uses the JSONC parser for its configuration files.\n    },\n\n    \"typescript.tsdk\": \"./node_modules/typescript/lib\",\n    \"dprint.path\": \"./node_modules/dprint/dprint\",\n\n    // Automatically run the formatter when certain files are saved.\n    \"[javascript]\": {\n        \"editor.defaultFormatter\": \"dprint.dprint\",\n        \"editor.formatOnSave\": true,\n        \"editor.tabSize\": 4\n    },\n    \"[typescript]\": {\n        \"editor.defaultFormatter\": \"dprint.dprint\",\n        \"editor.formatOnSave\": true,\n        \"editor.tabSize\": 4\n    },\n    \"[typescriptreact]\": {\n        \"editor.defaultFormatter\": \"dprint.dprint\",\n        \"editor.formatOnSave\": true,\n        \"editor.tabSize\": 4\n    },\n    \"[json]\": {\n        \"editor.defaultFormatter\": \"dprint.dprint\",\n        \"editor.formatOnSave\": true,\n        \"editor.tabSize\": 4\n    },\n    \"[jsonc]\": {\n        \"editor.defaultFormatter\": \"dprint.dprint\",\n        \"editor.formatOnSave\": true,\n        \"editor.tabSize\": 4\n    },\n    \"[css]\": {\n        \"editor.defaultFormatter\": \"dprint.dprint\",\n        \"editor.formatOnSave\": true,\n        \"editor.tabSize\": 4\n    },\n\n    \"mochaExplorer.nodeArgv\": [\"--import=tsx\", \"--conditions=typedoc-ts\"],\n\n    \"eslint.workingDirectories\": [\".\", \"./example\"],\n    \"mochaExplorer.configFile\": \".config/mocha.test-explorer.json\",\n    \"cSpell.ignoreRegExpList\": [\n        // Ignore usernames in the Thanks sections of the changelog\n        \"/^- +@[A-Z0-9_-]+/igm\",\n        // Ignore combined hashes in JSON output for rendering testing\n        \"/#[a-z0-9_]+\\\"/\"\n    ],\n    \"cSpell.words\": [\n        \"callouts\",\n        \"cname\",\n        \"Combinatorially\",\n        \"deconfliction\",\n        \"deserializers\",\n        \"dprint\",\n        \"frontmatter\",\n        \"githubprivate\",\n        \"hideconstructor\",\n        \"linkcode\",\n        \"linkify\",\n        \"linkplain\",\n        \"momento\",\n        \"Msys\",\n        \"nodoc\",\n        \"shiki\",\n        \"srcset\",\n        \"tsbuildinfo\",\n        \"tsdoc\",\n        \"typedoc\",\n        \"typeof\",\n        \"typestrong\",\n        \"uncategorized\",\n        \"WCAG\"\n    ]\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n    // See https://go.microsoft.com/fwlink/?LinkId=733558\n    // for the documentation about the tasks.json format\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build-tsc\",\n            \"type\": \"npm\",\n            \"script\": \"build:tsc\",\n            \"problemMatcher\": [\"$tsc\"],\n            \"detail\": \"Build TypeDoc w/ tsc\",\n            \"presentation\": {\n                \"group\": \"build\",\n                \"panel\": \"dedicated\"\n            },\n            \"group\": {\n                \"kind\": \"build\"\n            }\n        },\n        {\n            \"label\": \"build-themes\",\n            \"type\": \"npm\",\n            \"script\": \"build:themes\",\n            \"problemMatcher\": [\"$esbuild\"],\n            \"detail\": \"Build TypeDoc themes\",\n            \"presentation\": {\n                \"group\": \"build\",\n                \"panel\": \"dedicated\"\n            },\n            \"group\": {\n                \"kind\": \"build\"\n            }\n        },\n        {\n            \"label\": \"dev-build-tsc\",\n            \"type\": \"shell\",\n            \"command\": \"pnpm build:tsc --watch\",\n            \"problemMatcher\": [\"$tsc-watch\"],\n            \"detail\": \"Build TypeDoc w/ tsc in watch mode\",\n            \"isBackground\": true,\n            \"presentation\": {\n                \"group\": \"dev\",\n                \"panel\": \"dedicated\"\n            },\n            \"group\": {\n                \"kind\": \"build\"\n            }\n        },\n        {\n            \"label\": \"dev-build-themes\",\n            \"type\": \"shell\",\n            \"command\": \"pnpm build:themes --watch\",\n            \"problemMatcher\": [\"$esbuild-watch\"],\n            \"detail\": \"Build TypeDoc themes in watch mode\",\n            \"isBackground\": true,\n            \"presentation\": {\n                \"group\": \"dev\",\n                \"panel\": \"dedicated\"\n            },\n            \"group\": {\n                \"kind\": \"build\"\n            }\n        },\n        {\n            \"label\": \"dev\",\n            \"dependsOn\": [\"dev-build-tsc\", \"dev-build-themes\"],\n            \"detail\": \"Build TypeDoc in watch mode\",\n            \"problemMatcher\": [],\n            \"group\": {\n                \"kind\": \"build\"\n            }\n        },\n        {\n            \"label\": \"build\",\n            \"dependsOn\": [\"build-tsc\", \"build-themes\"],\n            \"detail\": \"Build TypeDoc\",\n            \"problemMatcher\": [],\n            \"group\": {\n                \"kind\": \"build\",\n                \"isDefault\": true\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "---\ntitle: Changelog\n---\n\n## Unreleased\n\n## v0.28.17 (2026-02-13)\n\n### Bug Fixes\n\n- Improved handling of comments for type aliases which have been declaration merged with functions, #3064.\n- Fixed anchor link generation to members named `$`, #3065.\n- Corrected typing of the `plugin` option to permit functions, #3066.\n- Warnings about unused `@param` tags will now be properly suppressed when they come from declaration files and\n  the suppressCommentWarningsInDeclarationFiles option is enabled, #3070.\n- Fixed conversion of types referencing type parameters on functions, #3071.\n\n### Thanks!\n\n- @pjeby\n\n## v0.28.16 (2026-01-12)\n\n### Bug Fixes\n\n- Fixed an issue causing TypeDoc to fail to generate documentation when implementing interfaces, #3052.\n- Fixed an issue preventing automatic entry point discovery on Windows, #3057.\n- Improved vertical positioning of text icons, #3056.\n- TypeDoc no longer includes source location information for type literal reflections. This could sometimes\n  cause TypeDoc to infer the wrong path when resolving base paths for display.\n- Adjusted markdown rendering to allow `markdownItLoader` to override more rendering #3055.\n\n### Features\n\n- Added support for regions for `@include` in `.tsx`, `.cjs`, and `.mjs` file references #3048.\n- Comments for TS-in-JS `@typedef` tags may now specify modifier tags with the inline tag syntax `{@mod}`.\n  This makes it possible to add modifier tags to these members, which previously was not possible as\n  TypeScript's parsing stops for these members at the next non-braced tag, #2916 and #3050.\n- A `typedoc-config.schema.json` is now included in the root of the package with a JSON schema for TypeDoc's\n  configuration file. The schema for the latest version is also published at https://typedoc.org/schema.json\n  and will automatically be picked up when writing typedoc.json files if you are using VSCode, #3054.\n\n### Thanks!\n\n- @a10nik\n- @kozi\n- @Lakuna\n\n## v0.28.15 (2025-11-29)\n\n### Features\n\n- The `gitRevision` option now accepts the special value `{branch}`, which indicates source links should use\n  the current git branch for links, #3041.\n- Introduced `validation.invalidPath` for suppressing warnings caused by referencing relative paths which\n  do not exist when building the documentation, #3033.\n- API: Introduced `Logger.validationWarning` for validation which occurs during conversion rather than\n  during TypeDoc's normal validation step, #3033.\n\n## v0.28.14 (2025-10-11)\n\n### Features\n\n- Introduced the `preservedTypeAnnotationTags` option to specify tags whose type annotations should\n  be copied to the output documentation, #3020.\n  API: Introduced `typeAnnotation` on `CommentTag`\n- Added `excludePrivateClassFields` option to hide `#private` members while allowing `private` members, #3017.\n- Added support for TypeScript's `@this` tag for JS files which describe `this` parameters, #3026.\n- API: Re-introduced `relevanceBoost` on `DeclarationReflection` for plugin use, #3036.\n\n### Bug Fixes\n\n- Fixed conversion of auto-accessor types on properties with the `accessor` keyword, #3019.\n- Improved handling of HTML tags within headers for anchor generation, #3023.\n- Improved support for detecting destructured parameters and renaming them to the name used in the doc comment, #3026.\n- Constructor type parameters will now inherit their class's type parameter descriptions if not otherwise specified, #3031.\n- Fixed compatibility with `@microsoft/tsdoc-config` version 0.18.0, #3035.\n- Custom theme icons will now be used in the \"On This Page\" sidebar, #3039.\n\n### Thanks!\n\n- @iclanton\n- @jonchardy\n\n## v0.28.13 (2025-09-14)\n\n### Features\n\n- The `basePath` option now also affects relative link resolution, TypeDoc will also check for\n  paths relative to the provided base path. If you instead want TypeDoc to only change the rendered\n  base path for sources, use the `displayBasePath` option, #3009.\n\n### Bug Fixes\n\n- Fixed bug introduced in 0.28.8 where TypeDoc could not render docs with some mixin classes, #3007.\n- `@inheritDoc` will now correctly overwrite `@remarks` and `@returns` blocks on the target comment, #3012.\n- The `externalSymbolLinkMappings` option now works properly on links pointing to inherited/overwritten signatures, #3014.\n\n## v0.28.12 (2025-09-01)\n\n### Bug Fixes\n\n- Variables marked with `@enum` now work for symbols imported from another module, #3003.\n- Improved magic introduced with #2999 to work with imported symbols, #3003.\n- Fixed relative link resolution to file names containing percent encoded URLs, #3006.\n- Linking to the project's README file with a relative link will now behave as expected, #3006.\n- Reduced unnecessary HTML element rendering in default theme.\n  API: `Reflection.hasComment` and `Comment.hasVisibleComponent` now accepts an optional `notRenderedTags` parameter.\n\n## v0.28.11 (2025-08-25)\n\n### Features\n\n- Object properties declared with shorthand property assignment will now use the variable's comment\n  if they do not have their own comment, #2999.\n\n### Bug Fixes\n\n- Fixed link resolution not working correctly in first comment on the file in some cases, #2994.\n- Optional methods are now rendered with a trailing `?` in the reflection preview and signature, #2995.\n- The `compilerOptions` option now functions properly with non-boolean options, #3000.\n- Configuration errors within the `compilerOptions` option are now handled gracefully, #3000.\n- Fixed improper casing of \"Type Declaration\" header, #3002.\n\n## v0.28.10 (2025-08-10)\n\n### Bug Fixes\n\n- Fixed inconsistent anchors on module pages for re-exports, #2990.\n- Markdown references which appear to be footnotes will no longer be checked for links, #2991.\n\n## v0.28.9 (2025-08-01)\n\n### Features\n\n- Add support for TypeScript 5.9, #2989.\n\n### Bug Fixes\n\n- Fixed bug introduced in 0.28.8 where TypeDoc could not render docs when members inherited from a complex type alias, #2982.\n- Fixed automatic discovery of entry points when not running in packages mode, #2988.\n- Fixed discovery of package.json file when running with entry points containing a glob, #2985.\n\n## v0.28.8 (2025-07-28)\n\n### Features\n\n- If using JS config files, the `plugin` function can now be given plugin functions to load.\n- Permit `-` within tag names to support `typescript-json-schema`'s `@TJS-type` tag, #2972.\n- Exposed `Context.createSymbolId` for use by plugins.\n\n### Bug Fixes\n\n- Relative links in `<img srcset>` will now be discovered by TypeDoc, #2975.\n- Relative links in `<source src>` and `<source srcset>` elements will now be discovered by TypeDoc, #2975.\n- Improved inherited from/overwrites link discovery to point to parent properties in more cases, #2978\n\n### Thanks!\n\n- @jonathanhefner\n- @laymonage\n\n## v0.28.7 (2025-06-30)\n\n### Features\n\n- Introduced the `@sortStrategy` tag to override the `sort` option on a specific reflection, #2965.\n\n### Bug Fixes\n\n- Classes and functions exported with `export { type X }` are no longer missing comments, #2970.\n- Setting `locale` to an unknown value will now cause TypeDoc to operate in English instead of a debug locale.\n- Array options will now report an error if set to a non-array/non-string value.\n\n## v0.28.6 (2025-06-27)\n\n### Features\n\n- TypeDoc now supports resolving relative paths in links to the package directory as belonging to the project, #2961.\n- Declarations without comments will now check for comments on their export specifier, #2964.\n\n### Bug Fixes\n\n- Attempting to highlight a supported language which is not enabled is now a warning, not an error, #2956.\n- Improved compatibility with CommonMark's link parsing, #2959.\n- Classes, variables, and functions exported with `export { type X }` are now detected and converted as interfaces/type aliases, #2962.\n- Improved warning messaging for links to symbols which were resolved, but the symbols were not included in the documentation, #2967.\n- Fixed an issue preventing nested documents from being deserialized from TypeDoc's JSON output or used in packages mode, #2969.\n\n### Thanks!\n\n- @yGuy\n\n## v0.28.5 (2025-05-26)\n\n### Bug Fixes\n\n- References to type aliases defined as mapped types will now correctly create a reference to the type alias, #2954.\n- `ignoredHighlightLanguages` can now be used to prevent warnings for codeblocks containing languages\n  which are supported by Shiki but are not loaded, #2956.\n\n## v0.28.4 (2025-05-04)\n\n### Features\n\n- The navigation in the default theme will now attempt to break long names onto multiple lines, #2940.\n- Added German (de) localization, #2941.\n\n### Bug Fixes\n\n- TypeDoc's default theme now uses the same chevron for all collapsible elements, #2924\n  The `chevronSmall` helper is now deprecated and will be removed with v0.29.0.\n- Classes/interfaces marked with `@hidden` will no longer appear in the\n  \"Hierarchy\" section of the docs.\n- TypeDoc now handles wildcard JSDoc types, #2949.\n\n### Thanks!\n\n- @blutorange\n- @bkeepers\n\n## v0.28.3 (2025-04-20)\n\n### Bug Fixes\n\n- `@inline` now functions when referencing tuple types, #2932.\n- `@link` links to the current page are now rendered, #2934.\n- `@includeCode` now supports regions in TypeScript files with `.mts` and `.cts` file extensions, #2935.\n- Aliased symbols (re-exports) are now resolved before checking if they are excluded/external, #2937.\n- Improved error reporting when paths including Windows separators are provided as globs, #2938.\n\n## v0.28.2 (2025-04-07)\n\n### Features\n\n- `@group none` and `@category none` will now render their children without a section\n  heading in the default theme, #2922.\n- Added `@disableGroups` tag to completely disable the grouping mechanism for a\n  given reflection, #2922.\n\n### Bug Fixes\n\n- Variables using `@class` now correctly handle `@category`, #2914.\n- Variables using `@class` now include constructor parameters, #2914.\n- Variables using `@class` with a generic first constructor function now adopt\n  that function's type parameters as the class type parameters, #2914.\n- When printing entry point globs which fail to match any paths, TypeDoc will no longer normalize the glob, #2918.\n- Inlining types can now handle more type variants, #2920.\n- Fixed behavior of `externalSymbolLinkMappings` option when URL is set to `#`, #2921.\n- Fixed broken links within module pages when structure-dir router was used, #2928.\n- Type parameters on JS classes defined with `@typedef` now correctly handle the constraint, #2929.\n- API: `toString` on types containing index signatures now behave correctly, #2917.\n- Added `@inlineType` to the list of tags excluded by default.\n\n## v0.28.1 (2025-03-20)\n\n### Features\n\n- The `TypeDocOptions` interface now marks options as optional so it no longer has to be wrapped in `Partial`\n  for use in config files, #2901.\n- API: Expose control methods for deferred conversion for plugin use (typedoc-plugin-missing-exports)\n- API: Expose method to disable TypeDoc usage of `localStorage` without clearing it, #2908.\n\n### Bug Fixes\n\n- `--watch` can now infer entry points from `package.json` as supported in non-watch mode, #2899.\n- `@include` with regions now works on files with CRLF line endings, #2902.\n- Generated page names now correctly handles UTF-8 characters requiring more than 16 bits #2905.\n- Fixed a crash when converting `module.exports = []`, #2909.\n- Fixed URL generation which introduced a superfluous `./` in relative links, #2910.\n\n### Thanks!\n\n- @jsmith2-coveo\n- @romainmnr\n\n## v0.28.0 (2025-03-15)\n\n### Breaking Changes\n\n- TypeDoc now expects all input globs paths to be specified with `/` path separators, #2825.\n- TypeDoc's `--entryPointStrategy merge` mode now requires JSON from at least version 0.28.0.\n- Removed `jp` translations from `lang`, to migrate switch to `ja`.\n- File name references in `intentionallyNotExported` now use a package name/package relative path instead of an absolute path for matching.\n- The `source-order` sort ordering now considers package names / package relative paths instead of using the absolute paths to a file.\n- TypeDoc will only check for a project README file next to the discovered `package.json` file if `--readme` is not set\n  this change improves handling of monorepo setups where some packages have readme files and others do not, #2875.\n- Function-like variable exports will now only be automatically converted as function types if\n  they are initialized with a function expression. TypeDoc can be instructed to convert them as functions\n  with the `@function` tag, #2881.\n- Object literal type alias types will now be converted in a way which causes them to be rendered more similarly\n  to how interfaces are rendered, #2817.\n\n### API Breaking Changes\n\n- `ProjectReflection.getReflectionFromSymbol` and `ProjectReflection.getSymbolFromReflection` have been moved to `Context`\n- `Path` and `PathArray` parameter types now always contain normalized paths.\n- Introduced a `Router` which is used for URL creation. `Reflection.url`,\n  `Reflection.anchor`, and `Reflection.hasOwnDocument` have been removed.\n- `Deserializer.reviveProject(s)` no longer accepts an option to add project documents.\n- `Deserializer.reviveProjects` now requires an `alwaysCreateEntryPointModule` option.\n- `Comment.serializeDisplayParts` no longer requires a serializer argument.\n- `ReflectionSymbolId.fileName` is now optional, TypeDoc now stores a combination of a package name and package relative path instead.\n  The `fileName` property will be present when initially created, but is not serialized.\n- Removed `DeclarationReflection.relevanceBoost` attribute which was added for plugins, but never used.\n- `i18n` proxy is no longer passed to many functions, instead, reference `i18n` exported from the module directly.\n- `ReflectionKind.singularString` and `ReflectionKind.pluralString` now returns translated strings.\n  The methods on `Internationalization` to do this previously have been removed.\n- The HTML output structure for the search box has changed to support the new modal.\n- `DefaultThemeRenderContext`'s `typeDeclaration` and `typeDetailsIfUseful`\n  methods now require both a reflection and a type in order to support\n  `@expandType`\n\n### Features\n\n- Add support for TypeScript 5.8.x\n- The search modal in the HTML output has been rewritten to provide better mobile support\n- Added a `--router` option which can be used to modify TypeDoc's output folder\n  structure. This can be extended with plugins, #2111.\n- Introduced the `@primaryExport` modifier tag to provide more fine grained\n  control over export conversion order, #2856\n- Introduced `packagesRequiringDocumentation` option for `validation.notDocumented`, TypeDoc will expect comments to be present for symbols in the specified packages.\n- TypeDoc now exports a `typedoc/browser` entrypoint for parsing and using serialized JSON files, #2528.\n- Type `packageOptions` as `Partial<TypeDocOptions>`, #2878.\n- TypeDoc will now warn if an option which should only be set at the root level is set in `packageOptions`, #2878.\n- Introduced `@function` tag to force TypeDoc to convert variable declarations with a type annotation as functions, #2881.\n- Exposed a `TypeDoc` global object in the HTML theme which can be used to prevent TypeDoc from using `localStorage`, #2872.\n- Introduced `@preventInline` and `@inlineType` tags for further control extending the `@inline` tag, #2862.\n- Introduced `@preventExpand` and `@expandType` tags for further control extending the `@expand` tag, #2862.\n- API: Introduced `DefaultThemeRenderContext.reflectionIcon` for more granular control over displayed reflection icons.\n\n### Bug Fixes\n\n- TypeDoc will now only create references for symbols re-exported from modules.\n- Variable-functions will now prefer placing the comment on the signature if there is only one signature present, #2824.\n- User filter settings will no longer sometimes cause the search to have fewer visible results than expected.\n- Fixed handling of expando functions which were also merged with a namespace, #2876.\n- Fixed rendering of function types within arrays and union types, #2892.\n- Fixed an issue where if the theme JS didn't load, the page wouldn't be shown, #2894.\n\n### Thanks!\n\n- @crimx\n- @jsmith2-coveo\n- @phoneticallySAARTHaK\n- @XeroAlpha\n\n## v0.27.9 (2025-02-25)\n\nThis will be the last v0.27.x release, see #2868 for discussion on the 0.28 beta.\n\n### Features\n\n- Added support for TypeScript 5.8\n\n## v0.27.8 (2025-02-21)\n\n### Features\n\n- The `visibilityFilter` option now supports individual signatures, #2846.\n- The `favicon` option may now be given a link starting with `https?://` instead of a path, #2851.\n- TypeDoc now supports specifying `#` as the link in `externalSymbolLinkMappings` to indicate the type should not be linked to, #2853.\n\n### Bug Fixes\n\n- Fixed an issue where unrecognized languages would incorrectly be listed in the list of languages with translations, #2852.\n- Unresolved external type references will no longer incorrectly linked to `undefined`, #2854.\n\n### Thanks!\n\n- @pjeby\n- @XeroAlpha\n\n## v0.27.7 (2025-02-09)\n\n### Features\n\n- `@includeCode` and `@inline` can now inject parts of files using region\n  names or line numbers, #2816.\n- Introduced `ja` translation options, deprecated `jp` in favor of `ja`, #2843.\n- Improved TypeDoc's `--watch` option to support watching files not caught by\n  TypeScript's watch mode, #2675.\n- The `@inline` tag now works in more places for generic types.\n- Visibility filters now consider individual signatures, #2846.\n\n### Bug Fixes\n\n- Fixed an issue where TypeDoc would incorrectly ignore type arguments in references, #2823.\n- Improved narrator support for labeling icons, #2832.\n- Fixed an issue with `@class` incorrectly handling mapped types, #2842.\n- TypeDoc will now consider symbols to be external only if all of their declarations are external\n  so that declaration merged members with global symbols can be documented, #2844.\n- Fixed an issue where TypeDoc would constantly rebuild, #2844.\n- Fixed an issue where the dropdown arrow in the index group would not respect the state of the dropdown, #2845.\n\n### Thanks!\n\n- @pjeby\n- @shawninder\n- @tats-u\n- @XeroAlpha\n\n## v0.27.6 (2024-12-26)\n\n### Features\n\n- Added `ignoredHighlightLanguages` option to specify languages which will be\n  allowed in code blocks but not highlighted, #2819.\n\n### Bug Fixes\n\n- `@include` and `@includeCode` now work in the readme file, #2814.\n- TypeDoc will now avoid making references to references, #2811.\n- Fixed output specific option specification, #2818.\n- Improved type reference conversion to avoid including defaulted type arguments, #2820.\n- Fixed parsing of declaration references which include a module and a local reference, #2810.\n- Improved link resolution logic to prioritize type alias properties with the\n  same symbol over type literal properties within function parameters.\n\n## v0.27.5 (2024-12-14)\n\n### Bug Fixes\n\n- Possibly Breaking: TypeDoc will no longer render anchors within the page for\n  deeply nested properties. This only affects links to properties of\n  properties of types, which did not have a clickable link exposed so are\n  unlikely to have been linked to. Furthermore, these links were not always\n  created by TypeDoc, only being created if all parent properties contained\n  comments, #2808.\n- TypeDoc will now warn if a property which does not have a URL within the\n  rendered document and the parent property/page will be linked to instead,\n  #2808. These warnings can be disabled with the `validation.rewrittenLink`\n  option.\n- Fix restoration of groups/categories including documents, #2801.\n- Fixed missed relative paths within markdown link references in documents.\n- Improved handling of incomplete inline code blocks within markdown.\n- Direct `https://` links under the `hostedBaseUrl` option's URL will no\n  longer be treated as external, #2809.\n\n### Thanks!\n\n- @SacDeNoeuds\n\n## v0.27.4 (2024-12-09)\n\n### Features\n\n- API: Introduced new `Converter.EVENT_CREATE_PROJECT` event which fires when a project is created by the converter, #2800.\n\n### Bug Fixes\n\n- Switch from gzip to deflate for compressing assets to make output consistent across different operating systems, #2796.\n- `@include` and `@includeCode` now work for comments on the entry point for projects with a single entry point, #2800.\n- Cascaded modifier tags will no longer be copied into type literals, #2802.\n- `@summary` now works to describe functions within modules, #2803.\n- Corrected navigation showing module link as current when not on module page, #2805.\n\n## v0.27.3 (2024-12-04)\n\n### Features\n\n- Added support for PNG favicons, #2790.\n- Improved support for hosting TypeDoc with strict Content Security Policy rules, #2794.\n\n### Bug Fixes\n\n- Add special handling for import types with type errors discarded with ts-expect-error, #2792.\n- Fixed low contrast in default colors for properties/accessors in light mode, #2795.\n- The `highlightLanguages` option now permits Shiki aliases to be specified rather than just the language ID, #2798.\n\n### Thanks!\n\n- @mikalai-snap\n- @mistic100\n\n## v0.27.2 (2024-11-29)\n\n### Bug Fixes\n\n- Fix crash with TypeScript 5.5.x, #2789.\n\n## v0.27.1 (2024-11-28)\n\n### Bug Fixes\n\n- Include classes which inherit from another package in class hierarchy in packages mode, #2467.\n- Fixed handling of `@categoryDescription` and `@groupDescription` on module pages, #2787.\n- Fixed automatic discovery of entry points in packages mode.\n- Reverted accidental style change for hierarchy page introduced in 0.27.0\n- The hierarchy Expand/Collapse link will now only appear if the hierarchies are different.\n\n## v0.27.0 (2024-11-27)\n\n### Breaking Changes\n\n- Convert to ESM to enable easier use of ESM-only dependencies.\n- Drop support for TypeScript <5.0, no longer supported by DefinitelyTyped\n- Relaxed requirements for file names and generated url fragments. This may\n  result in a different file name structure, #2714.\n- Anchors to document headings and reflections within a HTML generated pages\n  have changed. They can be partially restored to the previous format by\n  setting `--sluggerConfiguration.lowercase false`. This change was made to\n  more closely match the default behavior of GitHub's markdown rendering and\n  VSCode's autocomplete when creating a relative link to an external markdown\n  file.\n- Removed the `hideParameterTypesInTitle` option, this was originally added as\n  a workaround for many signatures overflowing the available horizontal space\n  in rendered pages. TypeDoc now has logic to wrap types/signatures smartly,\n  so this option is no longer necessary.\n- Changed the default `kindSortOrder` to put references last.\n- Changed the default `sort` order to use `alphabetical-ignoring-documents`\n  instead of `alphabetical`.\n- Changed default of `suppressCommentWarningsInDeclarationFiles` to `true`\n- API: Constructor signatures now use the parent class name as their name\n  (e.g. `X`, not `new X`)\n- API: `@group`, `@category`, `@groupDescription` and `@categoryDescription`\n  will no longer be removed from the reflections they are present on. They are\n  skipped during rendering with the `notRenderedTags` option.\n\n### Features\n\n- Add support for TypeScript 5.7\n- TypeDoc will now discover entry points from `package.json` exports if they\n  are not provided manually, #1937.\n- Relative links to markdown files may now include `#anchor` links to\n  reference a heading within them.\n- Improved support for `@param` comments with nested object types, #2555.\n- Improved support for `@param` comments which reference a type\n  alias/interface. Important properties on the referenced type can now be\n  highlighted with `@param options.foo`, which will result in the additional\n  note being included under the documentation for that parameter, #2147. Note:\n  This feature is limited to references. It is not supported on other types of\n  types.\n- Added a new `outputs` option which is an array of outputs. This can be used\n  to render the documentation multiple times with different rendering options\n  or output types, #2597.\n- Added support for rendering alerts (or callouts) in markdown.\n- Add support for an `@expand` tag which can be placed on type aliases and\n  interfaces. When a type with `@expand` is referenced and TypeDoc has a place\n  to include additional details about the type, the properties of the type\n  will be included in the page where `@expand` is found. Note that use of this\n  tag can _significantly_ increase the size of your generated documentation if\n  it is applied to commonly used types as it will result in inlining the\n  comments for those types everywhere they are referenced, #2303.\n- Add support for an `@inline` tag which can be placed on type aliases and\n  interfaces. When a type with `@inline` is referenced, TypeDoc will resolve\n  the referenced type and convert the type as if it was included directly\n  within the referencing type. Note that use of this tag can _significantly_\n  increase the size of your generated documentation if it is applied to\n  commonly used types as it will result in inlining the comments for those\n  types everywhere they are referenced, #2303.\n- Introduced a new `@useDeclaredType` tag for type aliases which can sometimes\n  improve their documentation, #2654.\n- Added a new `@mergeModuleWith` tag which can be used to tell TypeDoc to\n  place a module/namespace's children under a different module/namespace and\n  remove the real parent, #2281.\n- Added new `@include` and `@includeCode` inline tags to include files within\n  comments/documents.\n- Add `notRenderedTags` option. This option is similar to the `excludeTags`\n  option, but while `excludeTags` will result in the tag being completely\n  removed from the documentation, `notRenderedTags` only prevents it from\n  being included when rendering.\n- Added `groupReferencesByType` option.\n- Added `navigation.excludeReferences` option\n- Added `useFirstParagraphOfCommentAsSummary` option to configure how TypeDoc\n  handles comments for module members without the `@summary` tag.\n- Introduced `favicon` option to specify a `.ico` or `.svg` favicon to reference.\n- Sections within the page and in the \"On This Page\" navigation are now tied\n  together and will expand/collapse together, #2335.\n- API: Introduced a new `app.outputs` object for defining new output strategies.\n- API: TypeDoc's CSS is now wrapped in `@layer typedoc`, #2782.\n\n### Bug Fixes\n\n- TypeDoc now properly flags `readonly` index signatures.\n- TypeDoc will now use the first signature's comment for later signatures in\n  overloads if present, #2718.\n- Fixed handling of `@enum` if the type was declared before the variable, #2719.\n- Fixed empty top level modules page in packages mode, #2753.\n- TypeDoc can now link to type alias properties, #2524.\n- TypeDoc will now document the merged symbol type when considering globals\n  declared inside `declare global`, #2774\n- TypeDoc now converts `declare module \"foo\"` as a module rather than a namespace, #2778.\n- Import types in type aliases now use module member references if present, #2779.\n- Fixed an issue where properties were not properly marked optional in some\n  cases. This primarily affected destructured parameters.\n- Added `yaml` to the highlight languages supported by default.\n- TypeDoc now recognizes `txt` as an alias of `text` to indicate a code block\n  should not be highlighted.\n- Items which are hidden with `@ignore` or `@hidden` but still referenced by\n  other types will no longer produce warnings about not being exported.\n- If a project only has one module within it, TypeDoc will now consider that\n  module when resolving `@link` tags.\n- The arrows to indicate whether or not a section is open now work when\n  JavaScript is disabled.\n- Group/category search boosts are now applied when writing the search index\n  rather than when converting. This prevents issues where boosts used by just\n  one package were incorrectly reported as unused when running with\n  entryPointStrategy set to packages.\n\n### Thanks!\n\n- @Huxpro\n- @mrfigg\n- @tgreyuk\n- @XeroAlpha\n\n## v0.26.11 (2024-11-01)\n\n### Features\n\n- If `hostedBaseUrl` is set to the root page on a website, TypeDoc will now include `WebSite` structured data, #2760.\n\n### Bug Fixes\n\n- Fix support for ESM config files with Node 23, #2752.\n- Fix type errors when using `\"module\": \"ESNext\"` and importing TypeDoc, #2747.\n- Inherited comments on overloaded methods now consider the overload position when inheriting a comment, #2755.\n\n## v0.26.10 (2024-10-16)\n\n### Bug Fixes\n\n- Fixed missing space on page headers, #2748.\n\n## v0.26.9 (2024-10-11)\n\n### Features\n\n- Added `headings` option to control optional headings, #2729.\n- Updated Chinese translations, #2739.\n- Added a folder icon to page navigation elements which are not links, #2741.\n\n### Bug Fixes\n\n- `externalSymbolLinkMappings` now uses the TypeScript reported link target if available, #2725.\n- TypeDoc will no longer omit the modules page if a project contains only modules/documents, #2730.\n- Fixed missing breadcrumbs on project page, #2728.\n- TypeDoc will no longer render an empty readme page if no readme was found.\n\n### Thanks!\n\n- @lriggle-strib\n- @mrfigg\n- @XeroAlpha\n\n## v0.26.8 (2024-10-04)\n\n### Features\n\n- Updated Chinese translations, #2706.\n- Exported constants no longer render the type and default value if they are the same, #2717.\n- The HTML output now wraps tag blocks with `<div>` tags and includes the tag name in a class name, #2723.\n\n### Bug Fixes\n\n- Correctly handle external link resolver link text when referencing an external symbol, #2700.\n- Big integer literals are now supported as default values, #2721.\n- Corrected handling of `@link` tags present in comments at the start of source files.\n- The index will now display when a module only contains documents, #2722.\n- `ReflectionSymbolId.pos` no longer references the position _before_ any doc comments for a symbol.\n  This could cause typedoc-plugin-dt-links to produce links which didn't go to the expected location in a file.\n\n### Thanks!\n\n- @Corso02\n- @lriggle-strib\n- @XeroAlpha\n\n## v0.26.7 (2024-09-09)\n\n### Features\n\n- Support TypeScript 5.6, #2699.\n- Added `customJs` option to include a script tag in generated HTML output, #2650.\n- Added `markdownLinkExternal` option to treat `http[s]://` links in markdown documents and comments as external to be opened in a new tab, #2679.\n- Added `navigation.excludeReferences` option to prevent re-exports from appearing in the left hand navigation, #2685.\n- Added support for the `@abstract` tag, #2692.\n\n### Bug Fixes\n\n- Fixed an issue where links in packages mode would be resolved incorrectly, #2680.\n- `@link` tags to symbols which are not included in the documentation will produce invalid link warnings again, #2681.\n- Fixed handling of `@param` tags on comments attached to function callback parameters, #2683.\n- The `alphabetical` and `alphabetical-ignoring-documents` sort options now use `localeCompare` to sort, #2684.\n- Fixed incorrect placement of parameter default values in some signatures with a `this` parameter, #2698.\n\n### Thanks!\n\n- @Aryakoste\n- @waynemwashuma\n\n## v0.26.6 (2024-08-18)\n\n### Features\n\n- Use of the `@extends` block tag no longer produces warnings, #2659.\n  This tag should only be used in JavaScript projects to specify the type parameters used when extending a parent class. It will not be rendered.\n- Added new `navigation.compactFolders` option to prevent TypeDoc from compacting folders, similar to the VSCode option. #2667.\n\n### Bug Fixes\n\n- The `suppressCommentWarningsInDeclarationFiles` option now correctly ignores warnings in `.d.cts` and `.d.mts` files, #2647.\n- Restored re-exports in the page navigation menu, #2671.\n- JSON serialized projects will no longer contain reflection IDs for other projects created in the same run. Gerrit0/typedoc-plugin-zod#6.\n- In packages mode the reflection ID counter will no longer be reset when converting projects. This previously could result in links to files not working as expected.\n\n## v0.26.5 (2024-07-21)\n\n### Features\n\n- TypeDoc now exposes array option defaults under `OptionDefaults`, #2640.\n\n### Bug Fixes\n\n- Constructor parameters which share a name with a property on a parent class will no longer inherit the comment on the parent class, #2636.\n- Packages mode will now attempt to use the comment declared in the comment class for inherited members, #2622.\n- TypeDoc no longer crashes when `@document` includes an empty file, #2638.\n- API: Event listeners added later with the same priority will be called later, #2643.\n\n### Thanks!\n\n- @bladerunner2020\n\n## v0.26.4 (2024-07-10)\n\n### Bug Fixes\n\n- The page navigation sidebar no longer incorrectly includes re-exports if the same member is exported with multiple names #2625.\n- Page navigation now ensures the current page is visible when the page is first loaded, #2626.\n- If a relative linked image is referenced multiple times, TypeDoc will no longer sometimes produce invalid links to the image #2627.\n- `@link` tags will now be validated in referenced markdown documents, #2629.\n- `@link` tags are now resolved in project documents, #2629.\n- HTML/JSON output generated by TypeDoc now contains a trailing newline, #2632.\n- TypeDoc now correctly handles markdown documents with CRLF line endings, #2628.\n- `@hidden` is now properly applied when placed in a function implementation comment, #2634.\n- Comments on re-exports are now rendered.\n\n### Thanks!\n\n- @bukowa\n- @garrett-hopper\n\n## v0.26.3 (2024-06-28)\n\n### Features\n\n- \"On This Page\" navigation now includes the page groups in collapsible sections, #2616.\n\n### Bug Fixes\n\n- `mailto:` links are no longer incorrectly recognized as relative paths, #2613.\n- Added `@since` to the default list of recognized tags, #2614.\n- Relative paths to directories will no longer cause the directory to be copied into the media directory, #2617.\n\n## v0.26.2 (2024-06-24)\n\n### Features\n\n- Added a `--suppressCommentWarningsInDeclarationFiles` option to disable warnings from\n  parsing comments in declaration files, #2611.\n- Improved comment discovery to more closely match TypeScript's discovery when getting comments\n  for members of interfaces/classes, #2084, #2545.\n\n### Bug Fixes\n\n- The `text` non-highlighted language no longer causes warnings when rendering, #2610.\n- If a comment on a method is inherited from a parent class, and the child class does not\n  use an `@param` tag from the parent, TypeDoc will no longer warn about the `@param` tag.\n\n## v0.26.1 (2024-06-22)\n\n### Features\n\n- Improved Korean translation coverage, #2602.\n\n### Bug Fixes\n\n- Added `@author` to the default list of recognized tags, #2603.\n- Anchor links are no longer incorrectly checked for relative paths, #2604.\n- Fixed an issue where line numbers reported in error messages could be incorrect, #2605.\n- Fixed relative link detection for markdown links containing code in their label, #2606.\n- Fixed an issue with packages mode where TypeDoc would use (much) more memory than required, #2607.\n- TypeDoc will no longer crash when asked to render highlighted code for an unsupported language, #2609.\n- Fixed an issue where relatively-linked files would not be copied to the output directory in packages mode.\n- Fixed an issue where modifier tags were not applied to top level modules in packages mode.\n- Fixed an issue where excluded tags were not removed from top level modules in packages mode.\n- `.jsonc` configuration files are now properly read as JSONC, rather than being passed to `require`.\n\n### Thanks!\n\n- @KNU-K\n\n## v0.26.0 (2024-06-22)\n\n### Breaking Changes\n\n- Drop support for Node 16.\n- Moved from `marked` to `markdown-it` for parsing as marked has moved to an async model which supporting would significantly complicate TypeDoc's rendering code.\n  This means that any projects setting `markedOptions` needs to be updated to use `markdownItOptions`.\n  Unlike `marked@4`, `markdown-it` pushes lots of functionality to plugins. To use plugins, a JavaScript config file must be used with the `markdownItLoader` option.\n- Updated Shiki from 0.14 to 1.x. This should mostly be a transparent update which adds another 23 supported languages and 13 supported themes.\n  As Shiki adds additional languages, the time it takes to load the highlighter increases linearly. To avoid rendering taking longer than necessary,\n  TypeDoc now only loads a few common languages. Additional languages can be loaded by setting the `--highlightLanguages` option.\n- Changed default of `--excludePrivate` to `true`.\n- Renamed `--sitemapBaseUrl` to `--hostedBaseUrl` to reflect that it can be used for more than just the sitemap.\n- Removed deprecated `navigation.fullTree` option.\n- Removed `--media` option, TypeDoc will now detect image links within your comments and markdown documents and automatically copy them to the site.\n- Removed `--includes` option, use the `@document` tag instead.\n- Removed `--stripYamlFrontmatter` option, TypeDoc will always do this now.\n- Renamed the `--htmlLang` option to `--lang`.\n- Removed the `--gaId` option for Google Analytics integration and corresponding `analytics` theme member, #2600.\n- All function-likes may now have comments directly attached to them. This is a change from previous versions of TypeDoc where functions comments\n  were always moved down to the signature level. This mostly worked, but caused problems with type aliases, so was partially changed in 0.25.13.\n  This change was extended to apply not only to type aliases, but also other function-likes declared with variables and callable properties.\n  As a part of this change, comments on the implementation signature of overloaded functions will now be added to the function reflection, and will\n  not be inherited by signatures of that function, #2521.\n- API: TypeDoc now uses a typed event emitter to provide improved type safety, this found a bug where `Converter.EVENT_CREATE_DECLARATION`\n  was emitted for `ProjectReflection` in some circumstances.\n- API: `MapOptionDeclaration.mapError` has been removed.\n- API: Deprecated `BindOption` decorator has been removed.\n- API: `DeclarationReflection.indexSignature` has been renamed to `DeclarationReflection.indexSignatures`.\n  Note: This also affects JSON serialization. TypeDoc will support JSON output from 0.25 through at least 0.26.\n- API: `JSONOutput.SignatureReflection.typeParameter` has been renamed to `typeParameters` to match the JS API.\n- API: `DefaultThemeRenderContext.iconsCache` has been removed as it is no longer needed.\n- API: `DefaultThemeRenderContext.hook` must now be passed `context` if required by the hook.\n\n### Features\n\n- Added support for TypeScript 5.5.\n- Added new `--projectDocuments` option to specify additional Markdown documents to be included in the generated site #247, #1870, #2288, #2565.\n- TypeDoc now has the architecture in place to support localization. No languages besides English\n  are currently shipped in the package, but it is now possible to add support for additional languages, #2475.\n- Added support for a `packageOptions` object which specifies options that should be applied to each entry point when running with `--entryPointStrategy packages`, #2523.\n- `--hostedBaseUrl` will now be used to generate a `<link rel=\"canonical\">` element in the project root page, #2550.\n- Added support for documenting individual elements of a union type, #2585.\n  Note: This feature is only available on type aliases directly containing unions.\n- TypeDoc will now log the number of errors/warnings errors encountered, if any, after a run, #2581.\n- New option, `--customFooterHtml` to add custom HTML to the generated page footer, #2559.\n- TypeDoc will now copy modifier tags to children if specified in the `--cascadedModifierTags` option, #2056.\n- TypeDoc will now warn if mutually exclusive modifier tags are specified for a comment (e.g. both `@alpha` and `@beta`), #2056.\n- Groups and categories can now be collapsed in the page body, #2330.\n- Added support for JSDoc `@hideconstructor` tag.\n  This tag should only be used to work around TypeScript#58653, prefer the more general `@hidden`/`@ignore` tag to hide members normally, #2577.\n- Added `--useHostedBaseUrlForAbsoluteLinks` option to use the `--hostedBaseUrl` option to produce absolute links to pages on a site, #940.\n- Tag headers now generate permalinks in the default theme, #2308.\n- TypeDoc now attempts to use the \"most likely name\" for a symbol if the symbol is not present in the documentation, #2574.\n- Fixed an issue where the \"On This Page\" section would include markdown if the page contained headings which contained markdown.\n- TypeDoc will now warn if a block tag is used which is not defined by the `--blockTags` option.\n- Added three new sort strategies `documents-first`, `documents-last`, and `alphabetical-ignoring-documents` to order markdown documents.\n- Added new `--alwaysCreateEntryPointModule` option. When set, TypeDoc will always create a `Module` for entry points, even if only one is provided.\n  If `--projectDocuments` is used to add documents, this option defaults to `true`, otherwise, defaults to `false`.\n- Added new `--highlightLanguages` option to control what Shiki language packages are loaded.\n- TypeDoc will now render union elements on new lines if there are more than 3 items in the union.\n- TypeDoc will now only render the \"Type Declaration\" section if it will provide additional information not already presented in the page.\n  This results in significantly smaller documentation pages in many cases where that section would just repeat what has already been presented in the rendered type.\n- Added `comment.beforeTags` and `comment.afterTags` hooks for plugin use.\n  Combined with `CommentTag.skipRendering` this can be used to provide custom tag handling at render time.\n\n### Bug Fixes\n\n- TypeDoc now supports objects with multiple index signatures, #2470.\n- Header anchor links in rendered markdown are now more consistent with headers generated by TypeDoc, #2546.\n- Types rendered in the `Returns` header are now properly colored, #2546.\n- Links added with the `navigationLinks` option are now moved into the pull out navigation on mobile displays, #2548.\n- `@license` and `@import` comments will be ignored at the top of files, #2552.\n- Fixed issue in documentation validation where constructor signatures where improperly considered not documented, #2553.\n- Keyboard focus is now visible on dropdowns and checkboxes in the default theme, #2556.\n- The color theme label in the default theme now has an accessible name, #2557.\n- Fixed issue where search results could not be navigated while Windows Narrator was on, #2563.\n- `charset` is now correctly cased in `<meta>` tag generated by the default theme, #2568.\n- Fixed very slow conversion on Windows where Msys git was used by typedoc to discover repository links, #2586.\n- Validation will now be run in watch mode, #2584.\n- Fixed an issue where custom themes which added dependencies in the `<head>` element could result in broken icons, #2589.\n- `@default` and `@defaultValue` blocks are now recognized as regular blocks if they include inline tags, #2601.\n- Navigation folders sharing a name will no longer be saved with a shared key to `localStorage`.\n- The `--hideParameterTypesInTitle` option no longer applies when rendering function types.\n- Broken `@link` tags in readme files will now cause a warning when link validation is enabled.\n- Fixed `externalSymbolLinkMappings` option's support for [meanings](https://typedoc.org/guides/declaration-references/#meaning) in declaration references.\n- Buttons to copy code now have the `type=button` attribute set to avoid being treated as submit buttons.\n- `--hostedBaseUrl` will now implicitly add a trailing slash to the generated URL.\n\n### Thanks!\n\n- @Aryakoste\n- @bladerunner2020\n- @Dinnerbone\n- @HarelM\n- @kraenhansen\n- @Nil2000\n- @steve02081504\n- @tristanzander\n\n## v0.25.13 (2024-04-07)\n\n### Features\n\n- Added `gitRevision:short` placeholder option to `--sourceLinkTemplate` option, #2529.\n  Links generated by TypeDoc will now default to using the non-short git revision.\n- Moved \"Generated by TypeDoc\" footer into a `<footer>` tag, added `footer.begin` and `footer.end`\n  render hooks for use by custom plugins, #2532.\n\n### Bug Fixes\n\n- Fixed conversion of `NoInfer` missing type parameter reference, #2539.\n- Linking to a member on a page no longer incorrectly claims that\n  \"This member is normally hidden due to your filter settings\" for every member.\n\n### Thanks!\n\n- @xuhdev\n\n## v0.25.12 (2024-03-10)\n\n### Features\n\n- Added support for TypeScript 5.4, #2517.\n\n### Bug Fixes\n\n- Updated page font to work around issues with Mac rendering, #2518.\n\n### Thanks!\n\n- @docmattman\n\n## v0.25.11 (2024-03-06)\n\n### Bug Fixes\n\n- Fixed an issue introduced with 0.25.10 which causes the page index to initially render empty, #2514.\n- \"On This Page\" section is now smarter when handling page headings which do not follow the normal `h1>h2>h3` process, #2515.\n\n## v0.25.10 (2024-03-03)\n\n### Bug Fixes\n\n- Constructed references to enum types will be properly linked with `@interface`, #2508.\n- Comments on property-methods will no longer be duplicated in generated documentation, #2509.\n- Reduced rendered docs size by writing icons to a referenced SVG asset, #2505.\n  For TypeDoc's docs, this reduced the rendered documentation size by ~30%.\n- The HTML docs now attempt to reduce repaints caused by dynamically loading the navigation, #2491.\n- When navigating to a link that contains an anchor, the page will now be properly highlighted in the page navigation.\n\n## v0.25.9 (2024-02-26)\n\n### Features\n\n- Literal numeric unions will now be sorted during conversion, #2502.\n\n### Bug Fixes\n\n- Module readmes will now be included in JSON output, #2500.\n- Fixed crash when `--excludeNotDocumented` was used and the project contained a reference to a removed signature, #2496.\n- Fixed crash when converting an infinitely recursive type via a new `--maxTypeConversionDepth` option, #2507.\n- Type links in \"Parameters\" and \"Type Parameters\" sections of the page will now be correctly colored.\n\n### Thanks!\n\n- @JMBeresford\n\n## v0.25.8 (2024-02-09)\n\n### Features\n\n- Added a new `--sitemapBaseUrl` option. When specified, TypeDoc will generate a `sitemap.xml` in your output folder that describes the site, #2480.\n- Added support for the `@class` tag. When added to a comment on a variable or function, TypeDoc will convert the member as a class, #2479.\n  Note: This should only be used on symbols which actually represent a class, but are not declared as a class for some reason.\n- Added support for `@groupDescription` and `@categoryDescription` to provide a description of groups and categories, #2494.\n- API: Exposed `Context.getNodeComment` for plugin use, #2498.\n\n### Bug Fixes\n\n- Fixed an issue where a namespace would not be created for merged function-namespaces which are declared as variables, #2478.\n- A class which implements itself will no longer cause a crash when rendering HTML, #2495.\n- Variable functions which have construct signatures will no longer be converted as functions, ignoring the construct signatures.\n- The class hierarchy page will now include classes whose base class is not included in the documentation, #2486.\n- Fixed an issue where, if the index section was collapsed when loading the page, all content within it would be hidden until expanded, and a member visibility checkbox was changed.\n- API: `Context.programs` will no longer contain duplicates, #2498.\n\n## v0.25.7 (2024-01-08)\n\n### Bug Fixes\n\n- Fixed an issue where a namespace would not be created for merged function-namespaces only containing types, #2476.\n- Fixed an infinite loop when converting a union type which directly contained another union type which refers to itself, #2469.\n\n## v0.25.6 (2024-01-01)\n\n### Bug Fixes\n\n- Fixed infinite loop caused by a fix for some complicated union/intersection types, #2468.\n- Improved infinite loop detection in type converter to reduce false positives.\n\n## v0.25.5 (2024-01-01)\n\n## Features\n\n- Added a new hierarchy.html page to HTML output which displays the full inheritance hierarchy for classes included in the documentation, #182.\n- Added a `--navigation.includeFolders` (default: `true`) option to create nested navigation for projects which include many entry points, #2388.\n- Type parameters on functions/classes can will now link to the \"Type Parameters\" section, #2322.\n  Type parameters have also been changed to have a distinct color from type aliases when rendering, which can be changed with custom CSS.\n- TypeDoc now provides warnings if a signature comment is directly specified on a signature and contains `@param` tags which do not apply, #2368.\n- Extended reflection preview view for interfaces to include type parameters, #2455.\n- Added special cases for converting methods which are documented as returning `this` or accepting `this` as a parameter, #2458.\n  Note: This will only happen if a method is declared as `method(): this`, it will not happen if the method implicitly returns `this`\n  as the compiler strips that information when creating types for a class instance.\n- Improved handling of functions with properties. Previous TypeDoc versions would always create a separate\n  namespace for properties, now, TypeDoc will create a separate namespace if the function is declaration merged\n  with a namespace. If the properties are added via `Object.assign` or via property assignment on the function\n  TypeDoc will now instead add the properties to the function's page, #2461.\n\n### Bug Fixes\n\n- If both an interface and a variable share a name/symbol, TypeDoc will no longer link to the variable when referenced in a type position, #2106.\n- `notDocumented` validation will no longer require documentation for data within parameters that cannot be documented via `@param`, #2291.\n- \"defined in\" locations for signatures will now always be contained within the function declaration's location. This prevents defined in sometimes pointing to node_modules, #2307.\n- Type parameters will now be resolved for arrow-methods on classes like regular class methods, #2320.\n- TypeDoc now inherits `typedocOptions` fields from extended tsconfig files, #2334.\n- Methods which return function types no longer have duplicated comments, #2336.\n- Comments on function-like type aliases will now show up under the type alias, rather than nested within the type declaration, #2372.\n- Improved detection of default values for parameters with destructured values, #2430.\n- Fix crash when converting some complicated union/intersection types, #2451.\n- Navigation triangle markers should no longer display on a separate line with some font settings, #2457.\n- `@group` and `@category` organization is now applied later to allow inherited comments to create groups/categories, #2459.\n- Conversion order should no longer affect link resolution for classes with properties whose type does not rely on `this`, #2466.\n- Keyword syntax highlighting introduced in 0.25.4 was not always applied to keywords.\n- Module reflections now have a custom `M` icon rather than sharing with the namespace icon.\n  Note: The default CSS still colors both modules and namespaces the same, as it is generally uncommon to have both in a generated site.\n- If all members in a group are hidden from the page, the group will be hidden in the page index on page load.\n\n## v0.25.4 (2023-11-26)\n\n### Features\n\n- Added support for TypeScript 5.3, #2446.\n- TypeDoc will now render interfaces as code at the top of the page describing interfaces, #2449.\n  This can be controlled through the new `DefaultThemeRenderContext.reflectionPreview` helper.\n- Improved type rendering to highlight keywords differently than symbols.\n\n### Bug Fixes\n\n- Fixed automatic declaration file resolution on Windows, #2416.\n- Fixed default option values on options declared by plugins in packages mode, #2433.\n- `gitRevision` will now be replaced in `sourceLinkTemplate`, #2434.\n- Improved handling of function-modules created with `Object.assign`, #2436.\n- TypeDoc will no longer warn about duplicate comments with warnings which point to a single comment, #2437\n- Fixed an infinite loop when `skipLibCheck` is used to ignore some compiler errors, #2438.\n- `@example` tag titles will now be rendered in the example heading, #2440.\n- Correctly handle transient symbols in `@namespace`-created namespaces, #2444.\n- TypeDoc no longer displays the \"Hierarchy\" section if there is no inheritance hierarchy to display.\n- Direct links to individual signatures no longer results in the signature being partially scrolled off the screen.\n\n### Thanks!\n\n- @li-jia-nan\n- @Nokel81\n- @ocavue\n- @swarnpallav\n\n## v0.25.3 (2023-10-29)\n\n### Features\n\n- Added `--sourceLinkExternal` option to render source code links as external, #2415.\n- TypeDoc no longer requires the `declarationMap` option to be set to true to handle cross-package links in packages mode, #2416.\n- Added `external-last` option for the `--sort` option, #2418.\n\n### Bug Fixes\n\n- TypeDoc now attempts to correct local anchor links in readme files which are broken by its deconfliction logic, #2413.\n- TypeDoc now finds comments on index signatures again, #2414.\n- TypeDoc now does a better job of detecting properties when destructured function arguments are used.\n- Quotes will now be properly escaped in HTML attribute values.\n\n### Thanks!\n\n- @mogelbrod\n- @rsanchez\n\n## v0.25.2 (2023-10-08)\n\n### Features\n\n- Added `navigationLeaves` option to remove branches from the navigation tree, #2382.\n- Added `sortEntryPoints` option (defaults to true) to allow disabling entry point sorting, #2393.\n- Improved support for multi-word searches, #2400.\n\n### Bug Fixes\n\n- Fixed conversion of `@template` constraints on JSDoc defined type parameters, #2389.\n- Invalid link validation is now correctly suppressed before all projects have been converted in packages mode, #2403.\n- Fixed tsconfig handling for projects using a solution-style tsconfig, #2406.\n- Fixed broken settings icons caused by icon caching introduced in 0.25.1, #2408.\n- Corrected module comment handling on declaration files containing a single `declare module \"foo\"`, #2401.\n\n### Thanks!\n\n- @schiem\n\n## v0.25.1 (2023-09-04)\n\n### Features\n\n- Added `stripYamlFrontmatter` config option to remove YAML frontmatter from README.md, #2381.\n- Added `--excludeCategories` config option to remove reflections present in any excluded category, #1407.\n- If no tsconfig.json file is present, TypeDoc will now attempt to compile without setting any compiler options, #2304.\n- Navigation is now written to a JS file and built dynamically, which significantly decreases document generation time\n  with large projects and also provides large space benefits. Themes may now override `DefaultTheme.buildNavigation`\n  to customize the displayed navigation tree, #2287.\n  Note: This change renders `navigation.fullTree` obsolete. If you set it, TypeDoc will warn that it is being ignored.\n  It will be removed in v0.26.\n- The search index is now compressed before writing, which reduces most search index sizes by ~5-10x.\n- TypeDoc will now attempt to cache icons when `DefaultThemeRenderContext.icons` is overwritten by a custom theme.\n  Note: To perform this optimization, TypeDoc relies on `DefaultThemeRenderContext.iconCache` being rendered within\n  each page. TypeDoc does it in the `defaultLayout` template.\n- Cache URL derivation during generation, #2386.\n\n### Bug Fixes\n\n- `@property` now works as expected if used to override a method's documentation.\n- Deprecated functions/methods are now correctly rendered with a struck-out name.\n- `--watch` mode works again, #2378.\n- Improved support for optional names within JSDoc types, #2384.\n- Fixed duplicate rendering of reflection flags on signature parameters, #2385.\n- TypeDoc now handles the `intrinsic` keyword if TS intrinsic types are included in documentation.\n- `--exclude` is now respected when expanding globs in entry points, #2376.\n\n### Thanks!\n\n- @ajesshope\n- @HemalPatil\n- @hrueger\n- @typhonrt\n\n## v0.25.0 (2023-08-25)\n\n### Breaking Changes\n\n- Bump minimum Node version to 16.\n- Removed `legacy-packages` option for `--entryPointStrategy`.\n- Changed default value of `--categorizeByGroup` to `false`.\n- Specifying a link as the `gitRemote` is no longer supported.\n- An `Application` instance must now be retrieved via `Application.bootstrap` or `Application.bootstrapWithPlugins`, #2268.\n- Removed `ReflectionKind.ObjectLiteral` that was never used by TypeDoc.\n- Removed deprecated members `DefaultThemeRenderContext.comment` and `DefaultThemeRenderContext.attemptExternalResolution`.\n\n### Features\n\n- Added support for TypeScript 5.2, #2373.\n- TypeDoc config files now support options default-exported from an ESM config file, #2268.\n- TypeDoc config files may now export a promise containing configuration, #2268.\n- Added `--preserveLinkText` option (defaults to true) which determines whether the reflection name or full link text is included\n  in the output when no override is specified, #2355.\n- Added a no-results placeholder when no search results are available, #2347.\n- Implemented several miscellaneous performance improvements to generate docs faster, this took the time to generate TypeDoc's\n  site from ~5.6 seconds to ~5.4 seconds.\n- Added `--disableGit` option to prevent TypeDoc from using Git to try to determine if sources can be linked, #2326.\n- Added support for tags `@showGroups`, `@hideGroups`, `@showCategories`, `@hideCategories` to configure the navigation pane on a\n  per-reflection basis, #2329.\n- With `--jsDocCompatibility.defaultTag` set, `@defaultValue` is now implicitly a code block if the text contains no code, #2370.\n\n### Bug Fixes\n\n- Fixed link discovery if nested (`Foo#bar`) links were used and `--useTsLinkResolution` is enabled in some cases, #2360.\n- Links with invalid declaration references will no longer silently link to the wrong page in some cases, #2360.\n- Fixed duplicate definitions in type hierarchy when using packages mode, #2327.\n- `@inheritDoc` was not properly resolved across packages in packages mode, #2331.\n- Added warning for attempted `@interface` use on union types, #2352.\n- Fixed misleading type annotation on `Theme.getUrls`, #2318.\n- Fixed duplicate namespace in documentation if `@namespace` is used on a variable with an associated namespace, #2364.\n- Fixed `@namespace` property discovery if merged with a type and the type was declared first #2364.\n- Tables in markdown are now styled, #2366.\n- Sidebar links no longer open in a new tab, #2353.\n- Headers now include some padding before rendering text, #2316.\n- Symbol locations for signatures on `reflection.sources` now considers the node's name like non-signature location discovery does.\n\n### Thanks!\n\n- @camc314\n- @cprussin\n- @roggervalf\n- @Th3S4mur41\n\n## v0.24.8 (2023-06-04)\n\n### Features\n\n- Added support for TypeScript 5.1, #2296.\n- Added `navigation.fullTree` to control rendering the full navigation tree on each page, #2287.\n  This option will likely be replaced in 0.25 with dynamic loading of the full tree.\n- TypeDoc's `--pretty` option now also controls whether generated HTML contains line breaks, #2287.\n- Optimized icon caching to reduce file size in generated HTML documentation, #2287.\n- Render property description of \"roughly top level\" object types, #2276.\n- Added `MarkdownEvent.INCLUDE` for plugins, #2284.\n\n### Bug Fixes\n\n- When rendering functions/methods, TypeDoc will now render the comment summary above the parameters/return type,\n  and any other block tags in the order they are defined in the comment, #2285.\n- Comments are no longer removed from classes/interfaces containing call signatures, #2290.\n\n### Thanks!\n\n- @krisztianb\n- @WikiRik\n\n## v0.24.7 (2023-05-08)\n\n### Features\n\n- TypeDoc will now allow conversion without any entry points to support \"readme only\" packages, #2264.\n\n### Bug Fixes\n\n- Category children are now sorted according to the `sort` option, #2272.\n- Inline tags no longer require a space after the tag name to be parsed as a tag, #2273.\n- Fixed module/namespace links in navigation when viewed in Safari, #2275.\n\n## v0.24.6 (2023-04-24)\n\n### Features\n\n- Improved error messaging if a provided entry point could not be converted into a documented module reflection, #2242.\n- API: Added support for `g`, `circle`, `ellipse`, `polygon`, and `polyline` svg elements, #2259.\n- Extended `jsDocCompatibility` option with `inheritDocTag` to ignore fully lowercase `inheritDoc` tags and\n  `ignoreUnescapedBraces` to disable warnings about unescaped `{` and `}` characters in comments.\n\n### Bug Fixes\n\n- `--useTsLinkResolution` is no longer ignored within block tags, #2260.\n- The current namespace will also be expanded in the navigation on page load, #2260.\n- Fixed flicker of navigation pane when reloading a page caused by updating expansion state after the page was loaded.\n- Fixed an infinite loop if more than one entry point was provided, and all entry points were the same.\n\n### Thanks!\n\n- @FlippieCoetser\n\n## v0.24.5 (2023-04-22)\n\n### Features\n\n- Categories and groups can now be shown in the navigation, added `--navigation.includeCategories`\n  and `--navigation.includeGroups` to control this behavior. The `--categorizeByGroup` option also\n  effects this behavior. If `categorizeByGroup` is set (the default) and `navigation.includeGroups` is\n  _not_ set, the value of `navigation.includeCategories` will be effectively ignored since categories\n  will be created only within groups, #1532.\n- Added support for discovering a \"module\" comment on global files, #2165.\n- Added copy code to clipboard button, #2153.\n- Function `@returns` blocks will now be rendered with the return type, #2180.\n- Added `--groupOrder` option to specify the sort order of groups, #2251.\n\n### Bug Fixes\n\n- Type parameter constraints now respect the `--hideParameterTypesInTitle` option, #2226.\n- Even more contrast fixes, #2248.\n- Fix semantic highlighting for predicate type's parameter references, #2249.\n- Fixed broken links to heading titles.\n- Fixed inconsistent styling between type parameter lists and parameter lists.\n- TypeDoc will now warn if more than one `@returns` block is is present in a function, and ignore the duplicate blocks as specified by TSDoc.\n\n### Thanks!\n\n- @FlippieCoetser\n\n## v0.24.4 (2023-04-16)\n\n### Bug Fixes\n\n- Fixed broken semantic coloring, #2247.\n- Increased contrast for parameter titles in dark mode to meet WCAG AA contrast requirements, #2244.\n- Underline color of index links now matches the text color, #2245.\n- Increased contract for active menu item text in dark mode.\n\n## v0.24.3 (2023-04-16)\n\n### Bug Fixes\n\n- Fixed path expansion on Windows preventing generation, #2243 and #2241.\n\n## v0.24.2 (2023-04-15)\n\n### Features\n\n- Added semantic link coloring for reflection names & links, #2227.\n  Note: This resulted in function signatures becoming too busy for easy scanning with even slightly\n  complicated signatures as such, TypeDoc now only renders parameter names in the signature title\n  and includes the type in the parameter details as usual. This can be controlled with the new\n  `--hideParameterTypesInTitle` option.\n- Conditional types will now render their branches on the next line for easier comprehension.\n\n### Bug Fixes\n\n- Fixed `&` showing as `&amp;` and HTML text showing up in page contents navigation, #2224.\n- Increased padding between sections when one navigation column is displayed, #2225.\n- Correct padding for navigation elements with a displayed icon, #2229.\n- Fixed `source-order` sort strategy failing to compare reflections within a file.\n- Added `enum-member-source-order` specialization of the `source-order` sort strategy which only compares enum members, #2237.\n- Updated highlight colors for semantic links to meet WCAG AA contrast requirements, #2228.\n- Type parameters are now highlighted consistently, #2230.\n- Fixed semantic coloring in type and function signatures, #2227.\n- Fixed issue where removing a reflection indirectly containing an object/function type would only partially remove the reflection, #2231.\n- Fixed \"Implementation of X.y\" links if a mixture of methods and property-methods are used, #2233.\n- \"Implementation of\" text to symbol-properties not contained in the documentation will now use the resolved name instead of a `__@` symbol name, #2234.\n- Fix expansion of globs if a single entry point is provided, #2235.\n- Validation will no longer be skipped for sub packages when running with `--entryPointStrategy packages`.\n- Fixed broken theme toggle if the page contained a member named \"theme\".\n\n### Thanks!\n\n- @RunDevelopment\n\n## v0.24.1 (2023-04-09)\n\n### Bug Fixes\n\n- Improve detection for legacy JSDoc `@example` tags, #2222.\n- The page footer will now appear at the bottom of the page even if the page is short, #2223.\n\n## v0.24.0 (2023-04-08)\n\n### Breaking Changes\n\n- `@link`, `@linkcode` and `@linkplain` tags will now be resolved with TypeScript's link resolution by default. The `useTsLinkResolution` option\n  can be used to turn this behavior off, but be aware that doing so will mean your links will be resolved differently by editor tooling and TypeDoc.\n- TypeDoc will no longer automatically load plugins from `node_modules`. Specify the `--plugin` option to indicate which modules should be loaded.\n- The `packages` entry point strategy will now run TypeDoc in each provided package directory and then merge the results together.\n  The previous `packages` strategy has been preserved under `legacy-packages` and will be removed in 0.25. If the new strategy does not work\n  for your use case, please open an issue.\n- Removed `--logger` option, to disable all logging, set the `logLevel` option to `none`.\n- Dropped support for legacy `[[link]]`s, removed deprecated `Reflection.findReflectionByName`.\n- Added `@overload` to default ignored tags.\n\n### API Breaking Changes\n\n- The `label` property on `Reflection` has moved to `Comment`.\n- The default value of the `out` option has been changed from `\"\"` to `\"./docs\"`, #2195.\n- Renamed `DeclarationReflection#version` to `DeclarationReflection#projectVersion` to match property on `ProjectReflection`.\n- Removed unused `Reflection#originalName`.\n- Removed `Reflection#kindString`, use `ReflectionKind.singularString(reflection.kind)` or `ReflectionKind.pluralString(reflection.kind)` instead.\n- The `named-tuple-member` and `template-literal` type kind have been replaced with `namedTupleMember` and `templateLiteral`, #2100.\n- Properties related to rendering are no longer stored on `Reflection`, including `url`, `anchor`, `hasOwnDocument`, and `cssClasses`.\n- `Application.bootstrap` will no longer load plugins. If you want to load plugins, use `Application.bootstrapWithPlugins` instead, #1635.\n- The options passed to `Application.bootstrap` will now be applied both before _and_ after reading options files, which may cause a change in configuration\n  if using a custom script to run TypeDoc that includes some options, but other options are set in config files.\n- Moved `sources` property previously declared on base `Reflection` class to `DeclarationReflection` and `SignatureReflection`.\n- Moved `relevanceBoost` from `ContainerReflection` to `DeclarationReflection` since setting it on the parent class has no effect.\n- Removed internal `ReferenceType.getSymbol`, reference types no longer reference the `ts.Symbol` to enable generation from serialized JSON.\n- `OptionsReader.priority` has been renamed to `OptionsReader.order` to more accurately reflect how it works.\n- `ReferenceType`s which point to type parameters will now always be intentionally broken since they were never linked and should not be warned about when validating exports.\n- `ReferenceType`s now longer include an `id` property for their target. They now instead include a `target` property.\n- Removed `Renderer.addExternalSymbolResolver`, use `Converter.addExternalSymbolResolver` instead.\n- Removed `CallbackLogger`.\n- Removed `SerializeEventData` from serialization events.\n- A `PageEvent` is now required for `getRenderContext`. If caching the context object, `page` must be updated when `getRenderContext` is called.\n- `PageEvent` no longer includes the `template` property. The `Theme.render` method is now expected to take the template to render the page with as its second argument.\n- Removed `secondaryNavigation` member on `DefaultThemeRenderContext`.\n- Renamed `navigation` to `sidebar` on `DefaultThemeRenderContext` and `navigation.begin`/`navigation.end` hooks to `sidebar.begin`/`sidebar.end`.\n\n### Features\n\n- Added `--useTsLinkResolution` option (on by default) which tells TypeDoc to use TypeScript's `@link` resolution.\n- Added `--jsDocCompatibility` option (on by default) which controls TypeDoc's automatic detection of code blocks in `@example` and `@default` tags.\n- Reworked default theme navigation to add support for a page table of contents, #1478, #2189.\n- Added support for `@interface` on type aliases to tell TypeDoc to convert the fully resolved type as an interface, #1519\n- Added support for `@namespace` on variable declarations to tell TypeDoc to convert the variable as a namespace, #2055.\n- Added support for `@prop`/`@property` to specify documentation for a child property of a symbol, intended for use with `@interface`.\n- TypeDoc will now produce more informative error messages for options which cannot be set from the cli, #2022.\n- TypeDoc will now attempt to guess what option you may have meant if given an invalid option name.\n- Plugins may now return a `Promise<void>` from their `load` function, #185.\n- TypeDoc now supports plugins written with ESM, #1635.\n- Added `Renderer.preRenderAsyncJobs` and `Renderer.postRenderAsyncJobs`, which may be used by plugins to perform async processing for rendering, #185.\n  Note: Conversion is still intentionally a synchronous process to ensure stability of converted projects between runs.\n- TypeDoc options may now be set under the `typedocOptions` key in `package.json`, #2112.\n- Added `--cacheBust` option to tell TypeDoc to include include the generation time in files, #2124.\n- Added `--excludeReferences` option to tell TypeDoc to omit re-exports of a symbol already included from the documentation.\n- Introduced new render hooks `pageSidebar.begin` and `pageSidebar.end`.\n\n### Bug Fixes\n\n- TypeDoc will now ignore package.json files not containing a `name` field, #2190.\n- Fixed `@inheritDoc` on signatures (functions, methods, constructors, getters, setters) being unable to inherit from a non-signature.\n- Interfaces/classes created via extending a module will no longer contain variables/functions where the member should have been converted as properties/methods, #2150.\n- TypeDoc will now ignore a leading `v` in versions, #2212.\n- Category titles now render with the same format in the page index and heading title, #2196.\n- Fixed crash when using `typeof` on a reference with type arguments, #2220.\n- Fixed broken anchor links generated to signatures nested within objects.\n\n### Thanks!\n\n- @bodil\n- @futurGH\n- @jm4rtinez\n- @muratgozel\n\n## v0.23.28 (2023-03-19)\n\n### Features\n\n- Added support for TypeScript 5.0, #2201.\n  - `const` type parameters.\n  - JSDoc `@overload` tag.\n  - JSDoc `@satisfies` tag.\n\n## v0.23.27 (2023-03-16)\n\n### Features\n\n- Added `--treatValidationWarningsAsErrors` to treat only validation warnings as errors without treating all warnings as errors, #2199.\n\n### Bug Fixes\n\n- Fixed a bug where optional properties were not appropriately marked as optional, #2200.\n- Fixed shifted navigation pane on devices 1024px wide, #2191.\n- Add missing `@private` and `@protected` tags to `typedoc/tsdoc.json`, #2187.\n\n### Thanks!\n\n- @futurGH\n\n## v0.23.26 (2023-02-26)\n\n### Features\n\n- Added `Application.EVENT_VALIDATE_PROJECT` event for plugins which implement custom validation, #2183.\n- Plugins may now return an object from external symbol resolvers, #2066.\n- Expose `Comment.displayPartsToMarkdown` on for themes overwriting the `comment` helper, #2115.\n\n### Bug Fixes\n\n- Fix crash when converting `export default undefined`, #2175.\n- Fix error in console when clicking on headings in the readme, #2170.\n- TypeDoc will now ignore parameters of callback parameters when validating that all parameters have documentation, #2154.\n\n### Thanks!\n\n- @captain-torch\n- @loopingz\n- @RebeccaStevens\n\n## v0.23.25 (2023-02-11)\n\n### Breaking Changes\n\n- Upgraded Shiki, if your highlight theme was set to `material-<theme>`, the value will need to be changed to\n  `material-theme-<theme>`, see the [Shiki release notes](https://github.com/shikijs/shiki/blob/main/CHANGELOG.md#0130--2023-01-27).\n\n### Features\n\n- Added new `excludeNotDocumentedKinds` variable to control which reflection types can be removed\n  by the `excludeNotDocumented` option, #2162.\n- Added `typedoc.jsonc`, `typedoc.config.js`, `typedoc.config.cjs`, `typedoc.cjs` to the list of files\n  which TypeDoc will automatically use as configuration files.\n\n### Bug Fixes\n\n- Entry points under `node_modules` will no longer be ignored, #2151.\n- Corrected behavior of `excludeNotDocumented` on arrow function-variables, #2156.\n- Added `package.json` to exports declaration.\n\n### Thanks!\n\n- @boneskull\n- @Mikkal24\n- @zamiell\n\n## v0.23.24 (2023-01-07)\n\n### Bug Fixes\n\n- Fixed an issue where signature comments were preferred over property comments for indirectly created function-properties, #2135.\n- Fixed symlink handling when expanding entry points, #2130.\n\n### Thanks!\n\n- @boneskull\n\n## v0.23.23 (2022-12-18)\n\n### Features\n\n- Added `ts.Signature` to emitted `EVENT_CREATE_SIGNATURE` event, #2002.\n\n### Bug Fixes\n\n- Links to members hidden by filter settings now temporarily override the filter, #2092.\n- If `src/` and `src/x` are specified as entry points, `src/` will no longer be ignored, #2121.\n\n## v0.23.22 (2022-12-11)\n\n### Features\n\n- Add support for defining the kind sort order, #2109.\n\n### Bug Fixes\n\n- Normalize all file paths on Windows, #2113.\n- Fix `@link` tags within lists, #2103.\n\n## v0.23.21 (2022-11-14)\n\n### Features\n\n- Added support for a catch-all wildcard in `externalSymbolLinkMappings`, #2102.\n- Added support for TypeScript 4.9.\n\n### Thanks!\n\n- @mistic100\n\n## v0.23.20 (2022-11-03)\n\n### Bug Fixes\n\n- Fixed comment discovery for `@inheritDoc` if inheriting from a function type alias, #2087.\n\n## v0.23.19 (2022-10-28)\n\n### Bug Fixes\n\n- Fixed title link if `titleLink` option was not specified, #2085.\n\n### Thanks!\n\n- @krisztianb\n\n## v0.23.18 (2022-10-23)\n\n### Features\n\n- Improved error reporting when failing to find entry points, #2080, #2082.\n\n### Bug Fixes\n\n- Constructor parameter-properties will now use the `@param` comment for the parameter if available, #1261.\n- Fixed display of object types containing methods, #1788.\n- Fixed conversion of intrinsic string mapping types when converting without a type node, #2079.\n\n## v0.23.17 (2022-10-18)\n\n### Features\n\n- Added `titleLink`, `navigationLinks` and `sidebarLinks` options to add additional links to the rendered output, #1830.\n- Added `sourceLinkTemplate` option to allow more flexible specification of remote urls.\n  Deprecated now redundant `gitRevision` detection starting with `https?://` introduced in v0.23.16, #2068.\n\n### Thanks!\n\n- @futurGH\n\n## v0.23.16 (2022-10-10)\n\n### Features\n\n- Object types will now be pretty printed, #1793.\n- Added support for specifying the tsconfig.json file in packages mode with `{ \"typedoc\": { \"tsconfig\": \"tsconfig.lib.json\" }}` in package.json, #2061.\n- In packages mode, readme files will now be automatically included if present, #2065.\n- Added support for specifying the base file url for links to source code, #2068.\n\n### Bug Fixes\n\n- Private parameter properties will no longer be ignored, #2064.\n\n### Thanks!\n\n- @captainTorch\n\n## v0.23.15 (2022-09-18)\n\n### Features\n\n- TypeDoc will now treat `@typedef {import(\"foo\").Bar<Z>} Baz` type declarations which forward type parameters to the imported\n  symbol as re-exports of that symbol, #2044.\n\n### Bug Fixes\n\n- TypeDoc will now prefer comments on variable declarations over signature comments, #2042.\n- Fixed double rendering of \"Type Parameters\" header, #2054.\n- Fixed double rendering of \"Hierarchy\" header, #2053.\n- Removed unused `widgets.png` and `widgets@2x.png` files from generated assets folder.\n\n## v0.23.14 (2022-09-03)\n\n### Features\n\n- Added support for defining one-off external link mappings with `externalSymbolLinkMappings` see\n  [the documentation](https://typedoc.org/options/comments/#externalsymbollinkmappings) for usage examples and caveats, #2030.\n- External link resolvers defined with `addUnknownSymbolResolver` will now be checked when resolving `@link` tags, #2030.\n  Note: To support this, resolution will now happen during conversion, and as such, `Renderer.addUnknownSymbolResolver` has been\n  soft deprecated in favor of `Converter.addUnknownSymbolResolver`. Plugins should update to use the method on `Converter`.\n  `DefaultThemeRenderContext.attemptExternalResolution` has also been deprecated since it will repeat work done during conversion,\n  use `ReferenceType.externalUrl` instead.\n- Added `Converter.addUnknownSymbolResolver` for use by plugins supporting external links.\n\n### Bug Fixes\n\n- Fixed conversion of object literal types containing construct signatures, #2036.\n- Fixed centering of title bar on wide displays, actually this time, #2046.\n\n## v0.23.13 (2022-09-01)\n\n### Bug Fixes\n\n- Fixed packages mode bug introduced in 0.23.12, #2043.\n\n## v0.23.12 (2022-08-31)\n\n### Features\n\n- Added a new `ParameterType.Object` for declaring object options which will be shallowly merged when read from user configuration.\n- Added a new `Application.EVENT_BOOTSTRAP_END` event emitted when `Application.bootstrap` is called.\n\n### Bug Fixes\n\n- TypeDoc will now work properly in packages mode when converting packages outside the current working directory, #2043.\n- Fixed deprecation warning for `isIdentifierOrPrivateIdentifier`.\n- Fixed centering of title bar on wide displays, #2046.\n\n### Thanks!\n\n- @citkane\n\n## v0.23.11 (2022-08-26)\n\n### Features\n\n- Added support for TypeScript 4.8.\n- Introduced a `skipErrorChecking` option which instructs TypeDoc to not ask TypeScript for compiler errors\n  before attempting to generate documentation. Turning this on may improve generation speed, but could also\n  cause a crash if your code contains compiler errors.\n- Added support for JS entry points when using packages mode, #2037.\n\n### Bug Fixes\n\n- Fixed crash when converting abstract mixin class, #2011.\n- Readme files within monorepos now have `@link` tags resolved, #2029.\n- Correctly resolve unqualified links to class members within parameters, #2031.\n- TypeDoc will now consider other reflections with the same name as parents when resolving links, #2033.\n- The \"Hierarchy\" and \"Type Parameters\" helpers on `DefaultThemeRenderContext` now contain all the HTML for their sections of the page, #2038.\n\n### Thanks!\n\n- @citkane\n- @kaphula\n\n## v0.23.10 (2022-07-31)\n\n### Features\n\n- Added support for detecting comments directly before parameters as the parameter comment, #2019.\n- Added support for using the comment directly before a constructor parameter that declares a property as the property comment, #2019.\n- Improved schema generation to give better autocomplete for the `sort` option.\n- Optional properties are now visually distinguished in the index/sidebar by rendering `prop` as `prop?`, #2023.\n- `DefaultThemeRenderContext.markdown` now also accepts a `CommentDisplayPart[]` for rendering, #2004.\n- Expose `Converter.resolveLinks` method for use with `Converter.parseRawComment`, #2004.\n\n### Bug Fixes\n\n- Fixed schema URL for TSDoc preventing the use of `typedoc/tsdoc.json` in TSDoc extends, #2015.\n- Improved detection of package names in repositories using pnpm, #2017.\n- Fixed missing JSDoc style `@typedef` comments for properties, #2020.\n\n### Thanks!\n\n- @bodil\n- @nazarhussain\n\n## v0.23.9 (2022-07-24)\n\n### Bug Fixes\n\n- TypeDoc will no longer skip entry points which have no exports, #2007.\n  If using `\"entryPointStrategy\": \"expand\"`, this change may result in new pages being added to your documentation.\n  If this is not desired, you can use the `exclude` option to filter them out.\n- Fixed missing comments on callable variable-functions constructed indirectly, #2008.\n- Packages mode will now respect the `--includeVersion` flag, #2010.\n- Fixed multiple reflections mapping to the same file name on case insensitive file systems, #2012.\n\n## v0.23.8 (2022-07-17)\n\n### Features\n\n- Added defined in links for classes, enums, #180.\n- Added support for `*.ghe.com` and `*.github.us` GitHub enterprise domains for source links, #2001.\n- Expose `Converter.parseRawComment` for plugins to parse additional markdown files, #2004.\n\n### Bug Fixes\n\n- TypeDoc will no longer emit a warning for `{@link}` containing a URL, #1980.\n- `excludeNotDocumented` will no longer remove functions/methods/accessors which are documented, #1994.\n- Fixed missing `sources` property on signature reflections #1996.\n\n### Thanks!\n\n- @cary-hu\n- @chadhietala\n\n## v0.23.7 (2022-07-09)\n\n### Bug Fixes\n\n- Tags must now contain whitespace after the tag name to be parsed as a tag, `@jest/globals` in a comment will no longer be parsed as a tag #1990.\n- The private member visibility option will now be respected in generated sites, #1992.\n- Overload rendering will no longer be broken if JavaScript is disabled, #453.\n- All overloads are now shown at once rather than requiring clicks to see the documentation for each signature, #1100.\n\n## v0.23.6 (2022-07-08)\n\n### Features\n\n- Improved support for `--entryPointStrategy Packages`. TypeDoc will now load package-specific configurations from `package.json` `typedoc` field. This configuration allows configuring a custom display name (`typedoc.displayName`) field, entry point (`typedoc.entryPoint` - this is equivalent and will override `typedocMain`), and path to a readme file to be rendered at the top of the package page (`typedoc.readmeFile`), #1658.\n- The `--includeVersion` option will now be respected by `--entryPointStrategy Packages`. Also, for this combination, missing `version` field in the root `package.json` will not issue a warning.\n- The `navigation` partial will now call the new `settings`, `primaryNavigation`, and `secondaryNavigation` partials, #1987.\n\n### Bug Fixes\n\n- All warnings will be reported instead of only the first warning of a given type, #1981.\n- Include references will no longer be incorrectly parsed as links, #1986.\n- The generated schema.json on the website will now use enum values rather than enum names if possible.\n\n### Thanks!\n\n- @akphi\n- @zamiell\n\n## v0.23.5 (2022-07-02)\n\n### Features\n\n- The `DEBUG_SEARCH_WEIGHTS` global variable can now be set on `window` to add search scoring information in the search results.\n- TypeDoc's icons are now available on `DefaultThemeRenderContext.icons` for use/modification by themes.\n\n## v0.23.4 (2022-07-02)\n\n### Bug Fixes\n\n- TypeDoc no longer ignores project references if `--entryPointStrategy Packages` is set, #1976.\n- Boost computations are now done when creating the search index, resulting in a smaller `search.js` generated file.\n\n### Features\n\n- The `--exclude` option will now be respected by `--entryPointStrategy Packages` and can be used to exclude package directories, #1959.\n- TypeDoc now emits an `IndexEvent` on the `Renderer` when preparing the search index, #1953.\n- Added new `--searchInComments` option to include comment text in the search index, #1553.\n  Turning this option on will increase the size of your search index, potentially by an order of magnitude.\n\n## v0.23.3 (2022-07-01)\n\n### Bug Fixes\n\n- Function properties in type space will no longer be interpreted as methods, #1637.\n- TypeDoc will no longer crash if a comment contains an empty `@example` tag, #1967.\n- TypeDoc will now detect attempted inheritance from accessors and inherit from the getter or setter, #1968.\n- `intentionallyNotExported` will now properly respect qualified names, #1972.\n- Fixed missing namespace comments on `export * as NS` declarations, #1973.\n- Fixed missing comments on `export const x = () => 123` function variables, #1973.\n- Exported variable functions with properties will now be converted as a function+namespace instead of a variable+namespace, #1651.\n- Validation warnings caused by missing documentation will now be formatted like other warnings which reference a declaration.\n- TypeDoc will no longer warn if both the `get` and `set` signatures of an accessor have a comment.\n\n### Features\n\n- Added `--htmlLang` option to set the [`lang`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) attribute in the generated HTML. Defaults to `en`, #1951.\n- Added `--basePath` option to override TypeDoc's detected root directory, #1924.\n- Added support for TypeDoc specific `:getter` and `:setter` meaning keywords in declaration references.\n- Warnings caused by comment contents will now do a better job of including the location of the text that caused the warning.\n\n## v0.23.2 (2022-06-28)\n\n### Bug Fixes\n\n- Module comments will no longer be inappropriately attached to signatures, #1962.\n- Projects with a single entry point will now parse `@module` comments in the entry point, #1963.\n- Removed duplicate \"in comment\" warning when parsing comments, #1964.\n- Reflections with a boost of `<= 0` due to `searchCategoryBoosts` or `searchGroupBoosts` will be excluded from search.\n\n## v0.23.1 (2022-06-26)\n\n### Bug Fixes\n\n- If a declaration has multiple comments associated with it, the last one should be used, #1961.\n\n## v0.23.0 (2022-06-26)\n\n### Breaking Changes\n\n- Node 12 is no longer officially supported as it has gone end of life as of 2022-04-30. It might still work, but may stop working at any time.\n- Dropped support for TypeScript before 4.6.\n- `{@link}` tags in comments will now be resolved as declaration references similar to TSDoc's declaration references.\n  For most cases, this will just work. See [the documentation](https://github.com/TypeStrong/typedoc-site/blob/da9760bccf30ce96210f6e35b9dcc2a4ddeed234/guides/link-resolution.md) for details on how link resolution works.\n- TypeDoc will now produce warnings for bracketed links (`[[ target ]]`). Use `{@link target}` instead. The `{@link}` syntax will be recognized by [TypeScript 4.3](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-3.html#editor-support-for-link-tags) and later and used to provide better intellisense. TypeDoc version 0.24.0 will remove support for `[[ target ]]` style links.\n  Support for ``[[`links`]]`` with brackets + code ticks have been dropped.\n- `extends` in typedoc.json is now resolved using NodeJS module resolution, so a local path must begin with `./`.\n- In the JSON output for `DeclarationReflection`s, `getSignature` is no longer a one-tuple.\n- In the JSON output for `DeclarationReflection`s, `setSignature` is no longer a one-tuple.\n- In the JSON output for `DeclarationReflection`s, `typeParameter` has been renamed to `typeParameters`\n- The `searchGroupBoosts` option must now be given the rendered group name rather than reflection kind names, and can be given custom group names.\n- `@inheritDoc` now follows the behavior specified by TSDoc when copying comments with a reference.\n- The `gaSite` option has been removed since Google Analytics now infers the site automatically, updated Google Analytics script to latest version, #1846.\n- The `hideLegend` option has been removed as the default theme no longer contains a legend.\n- Comments on export declarations will only overrides comments for references and namespaces, #1901.\n- The deprecated `listInvalidSymbolLinks` option has been removed. Use `validation.invalidLink` instead.\n- The deprecated `true` and `false` values have been removed from `--emit`, to migrate replace `true` with `\"both\"` and `false` with `\"docs\"` (the default).\n- Links are no longer be resolved against a global list of all symbols. See [the documentation](https://github.com/TypeStrong/typedoc-site/blob/da9760bccf30ce96210f6e35b9dcc2a4ddeed234/guides/link-resolution.md) for details on link resolution.\n- The `validation.invalidLink` option is now on by default.\n- `reflection.decorates`, `reflection.decorators`, and their corresponding interfaces have been removed as no code in TypeDoc used them.\n- The shape of the `Comment` class has changed significantly to support multiple tag kinds.\n- Listeners to `Converter.EVENT_CREATE_TYPE_PARAMETER` and `Converter.EVENT_CREATE_DECLARATION` will now never be passed a `ts.Node` as their third argument.\n- Constant variables which are interpreted as functions will no longer have the `ReflectionFlag.Const` flag set.\n- `reflection.defaultValue` is no longer set for enum members. The same information is available on `reflection.type` with more precision.\n- Removed deprecated `removeReaderByName`, `addDeclarations` and `removeDeclarationByName` methods on `Options`.\n- Removed `ProjectReflection.directory`, it was unused by TypeDoc and not properly tested.\n- Removed `ProjectReflection.files`, this was an internal cache that should not have been exposed, and shouldn't have existed in the first place, since removing it made TypeDoc faster.\n- Removed `ReflectionGroup.kind` since groups can now be created with the `@group` tag.\n- Removed `ReflectionKind.Event`, the `@event` tag is now an alias for `@group Events`. Note: This changes the value of `ReflectionKind.Reference` from `16777216` to `8388608`.\n- Themes are now set on the document element rather than on body, #1706.\n\n### Features\n\n- TypeDoc now supports the `@group` tag to group reflections in a page. If no `@group` tag is specified, reflections will be grouped according to their kind, #1652.\n- TypeDoc will now search for `typedoc.js(on)` in the `.config` folder in the current working directory.\n- Entry point strategies `Resolve` and `Expand` may now specify globs, #1926.\n- `typedoc.json` now supports comments like `tsconfig.json`.\n- TypeDoc will now read the `blockTags`, `inlineTags`, and `modifierTags` out of `tsdoc.json` in the same directory as `tsconfig.json` if it exists.\n  It is recommended to add `\"extends\": [\"typedoc/tsdoc.json\"]`, which defines TypeDoc specific tags to your `tsdoc.json` if you create one.\n- If an exported symbol has multiple declarations, TypeDoc will now check all appropriate declarations for comments, and warn if more than one declaration contains a comment, #1855.\n- Improved support for JSDoc style `@example` tags. If the tag content does not include a code block, TypeDoc now follows VSCode's behavior of treating the entire block as a code block, #135.\n- TypeDoc will now render members marked with `@deprecated` with a line through their name, #1381.\n- Added new `commentStyle` option which can be used to control what comments TypeDoc will parse.\n\n  | Value | Behavior                               |\n  | ----- | -------------------------------------- |\n  | JSDoc | Use block comments starting with `/**` |\n  | Block | Use all block comments                 |\n  | Line  | Use `//` comments                      |\n  | All   | Use both block and line comments       |\n\n- TypeDoc will now warn if part of a comment will be overwritten due to use of `@inheritDoc` instead of silently dropping part of the comment.\n- Added support for inline `@inheritDoc` tags, #1480.\n- It is now possible to link directly to a specific overload, #1326.\n- The JSON output will now include URLs to the file on the remote repository if possible.\n- Added a new `visibilityFilters` option which controls the available filters on a page.\n- TypeDoc will now try to place block elements on a new line in HTML output, resulting in less overwhelming diffs when rebuilding docs, #1923.\n- Added `blockTags`, `inlineTags`, `modifierTags` to control which tags TypeDoc will allow when parsing comments.\n  If a tag not in in one of these options is encountered, TypeDoc will produce a warning and use context clues to determine how to parse the tag.\n\n### Bug Fixes\n\n- Fixed off by one error in warnings for types referenced but not included in the documentation.\n- TypeDoc will no longer render a `Type Parameters` heading if there are no type parameters in some cases.\n- Improved source location detection for constructors.\n- Improved comment discovery on destructured exported functions, #1770.\n- Links which refer to members within a reference reflection will now correctly resolve to the referenced reflection's member, #1770.\n- Correctly detect optional parameters in JavaScript projects using JSDoc, #1804.\n- Fixed identical anchor links for reflections with the same name, #1845.\n- TypeDoc will now automatically inherit documentation from classes `implements` by other interfaces/classes.\n- Fixed `@inheritDoc` on accessors, #1927.\n- JS exports defined as `exports.foo = ...` will now be converted as variables rather than properties.\n- `searchCategoryBoosts` are now correctly computed for all categories, #1960.\n- The `excludeNotDocumented` option will no longer hide a module if it has a documentation comment, #1948.\n- Prevent `--excludeNotDocumented` from hiding properties of type literals (`a` in `function fn(p: { a: string })`), #1752.\n- Allow `cts` and `mts` extensions in packages resolution mode, #1952.\n- Corrected schema generation for https://typedoc.org/schema.json\n\n### Thanks!\n\n- @aqumus\n- @fb55\n- @futurGH\n- @Shane4368\n- @shmax\n\n## v0.22.18 (2022-06-25)\n\n### Features\n\n- Relaxed restrictions on `@enum` style enums to also permit non-literal strings and numbers, #1956.\n\n### Bug Fixes\n\n- `searchGroupBoosts` was only computing the boost for the first reflection in a group, #1958.\n\n### Thanks!\n\n- @shmax\n- @Zamiell\n\n## v0.22.17 (2022-06-01)\n\n### Features\n\n- Added support for documenting a module's global declarations as its exports if it contains no real exports.\n\n### Bug Fixes\n\n- Restore support for TS 4.0 through 4.5, #1945.\n\n## v0.22.16 (2022-05-30)\n\n### Features\n\n- Added support for TypeScript 4.7, #1935.\n- Support enum-like objects with numeric literal values tagged with `@enum`, #1918.\n- Enum member reflections will now have their `type` set to either a `LiteralType` with a string or numeric value or an `IntrinsicType` with type `number`, #1942.\n  Using `defaultValue` on `EnumMember` reflections is now deprecated, and will be broken in 0.23.\n\n### Bug Fixes\n\n- Fixed invalid type output in some uncommon edge cases, TypeDoc also now renders fewer superfluous parenthesis when creating types.\n- TypeDoc is now more consistent about ordering with `enum-value-ascending` or `enum-value-descending` sort strategies in mixed string/number enums.\n\n### Thanks!\n\n- @ejuda\n- @Zamiell\n\n## v0.22.15 (2022-04-10)\n\n### Features\n\n- Classes which are `abstract` and enums which are `const` will now be indicated in their rendered documentation, #1874.\n- Added a new option `compilerOptions`, which can be used to override compiler options read from `tsconfig.json`, #1891.\n- Added new render hooks: `content.begin`, `content.end`, `navigation.begin`, `navigation.end`\n\n### Bug Fixes\n\n- TypeDoc will now warn if a project name/version cannot be inferred from a package.json file rather than using `undefined`, #1907.\n\n### Thanks!\n\n- @ejuda\n- @matteobruni\n- @schlusslicht\n\n## v0.22.14 (2022-04-07)\n\n### Bug Fixes\n\n- Fixed missing comments on `@enum` style enum members defined in declaration files, #1880.\n- Fixed `--validation.notDocumented` warnings for functions/methods/type aliases, #1895, #1898.\n- Search results will no longer include random items when the search bar is empty, #1881.\n- Comments on overloaded constructors will now be detected in the same way that overloaded functions/methods are.\n- Fixed `removeReflection` not completely removing reflections from the project, #1898.\n- Fixed `@hidden` / `@ignore` / `@exclude` comments on default exports with no associated variable, #1903.\n- `makeRecursiveVisitor` will now correctly call the `intersection` callback, #1910.\n\n### Thanks!\n\n- @nlepage\n- @ychan167\n\n## v0.22.13 (2022-03-06)\n\n### Features\n\n- Add support for TypeScript 4.6, #1877.\n- Support copying `@param` comments for nested members that target union and intersection types, #1876.\n\n### Bug Fixes\n\n- Fixed validation for `--requiredToBeDocumented` option, #1872.\n- Fixed missing `this` parameters in documentation for some functions, #1875.\n\n## v0.22.12 (2022-02-20)\n\n### Features\n\n- Added `--validation.notDocumented` option to warn on items that are not documented, #1817.\n\n### Bug Fixes\n\n- Fixed `const` variables not properly marked as `const`, #1866.\n\n### Thanks!\n\n- @albyrock87\n- @Nokel81\n\n## v0.22.11 (2022-01-18)\n\n### Features\n\n- Added new `cname` option for GitHub Pages custom domain support, #1803.\n- `ReferenceType`s which reference an external symbol will now include `qualifiedName` and `package` in their serialized JSON.\n- Added clickable anchor link for member titles, #1842.\n\n### Bug Fixes\n\n- Fixed line height of `h1` and `h2` elements being too low, #1796.\n- Code blocks in the light theme will no longer have the same background as the rest of the page, #1836.\n- Symbol names passed to `addUnknownSymbolResolver` will now be correctly given the qualified name to the symbol being referenced, #1832.\n- The search index will now be written as JSON, reducing load times for large projects, #1825.\n\n### Thanks!\n\n- @adeniszczyc\n- @dragomirtitian\n- @matteobruni\n- @srmagura\n- @stefanobaghino-da\n\n## v0.22.10 (2021-11-25)\n\n### Features\n\n- Added support for TypeScript 4.5, #1798.\n\n### Bug Fixes\n\n- If file exports a symbol both under it's real name and as `default`, the `default` export will now always be the renamed symbol, #1795.\n- TypeDoc will no longer crash if a symbol is defined both as a normal class (and optional interface) and as a property, as is used for global Node types in older `@types/node` versions, Gerrit0/typedoc-plugin-missing-exports#5.\n\n## v0.22.9 (2021-11-14)\n\n### Features\n\n- TypeDoc will now detect and warn if multiple instances of the package are loaded. This usually means that a plugin has its own version of TypeDoc installed, which will lead to things breaking in unexpected ways.\n  It will only work if both loaded TypeDocs are v0.22.9 or later.\n- TypeDoc will now automatically load packages with `typedoc-theme` in their keywords.\n  Plugins which define a custom theme should include this keyword so that they can be automatically collected and displayed at https://typedoc.org/guides/themes/.\n\n### Bug Fixes\n\n- Corrected HTML generation for projects using Google Analytics, #1786.\n- Ensured that the `<meta charset=\"utf-8\" />` appears within the first 1024 bytes of generated pages, #1783.\n\n### Thanks!\n\n- @RunDevelopment\n\n## v0.22.8 (2021-11-07)\n\n### Features\n\n- Added hooks which can be used to inject HTML without completely replacing a template, #1773.\n  See the documentation in [custom-themes.md](https://github.com/TypeStrong/typedoc/blob/v0.22.8/internal-docs/custom-themes.md) for details.\n\n### Bug Fixes\n\n- Actually fixed `@category` tag incorrectly appearing on function types if used on a type alias, #1745.\n- Fix error in console when a page contains no documentation items.\n\n### Thanks!\n\n- @RunDevelopment\n- @srmagura\n\n## v0.22.7 (2021-10-25)\n\n### Features\n\n- Added support for GitHub enterprise projects with a `githubprivate.com` domain, #1743.\n- Added support for GitLab repositories, #1728.\n\n### Bug Fixes\n\n- Replaced O(n^2) with O(1) implementation for determining unique IDs in a rendered page, #1755.\n- Fixed crash with when running in very large repositories, #1744.\n- Fixed visible gap after footer in dark mode if `hideGenerator` is set, #1749.\n- Fixed `@category` tag incorrectly appearing on function types if used on a type alias, #1745.\n- Fixed incorrect JS to apply themes on page load, #1709 (again).\n- Accessors and index signatures are now properly marked as inherited on declaration creation, #1742.\n\n### Thanks!\n\n- @nlfurniss\n- @RunDevelopment\n- @srmagura\n\n## v0.22.6 (2021-10-17)\n\n### Features\n\n- Added support for displaying identifiers & property access expressions in initializers, #1730.\n- Expanded support for variables tagged with `@enum` to all variables whose property types are string literals, #1740.\n\n### Bug Fixes\n\n- Fixed flash when navigating to a second page when OS theme does not match selected theme, #1709.\n- Fixed improper quoting of `as const` style enums, #1727.\n- Fixed handling of `@typeParam` on type aliases, #1733.\n- Fixed handling of comment tags on function type aliases, #1734.\n- Paths in warnings about non-exported symbols are now consistently displayed across platforms, #1738.\n\n### Thanks!\n\n- @capraynor\n- @srmagura\n\n## v0.22.5 (2021-10-02)\n\n### Features\n\n- TypeDoc will now recognize `@param` comments for destructured parameters and rename `__namedParameters` to the name specified\n  in the `@param` comment if the number of `@param` comments match the number of parameters, resolves #1703.\n- The `intentionallyNotExported` option may now include file names/paths to limit its scope, for example, the following\n  will suppress warnings from `Foo` in `src/foo.ts` not being exported, but will not suppress warnings if another `Foo`\n  declared in `src/utils/foo.ts` is not exported.\n  ```json\n  {\n      \"intentionallyNotExported\": [\"src/foo.ts:Foo\"]\n  }\n  ```\n- The `--emit` option can now be used to more finely control what TypeDoc will emit.\n  | Value   | Behavior                                                                |\n  | ------- | ----------------------------------------------------------------------- |\n  | `both`  | Emit both documentation and JS.                                         |\n  | `docs`  | Emit documentation, but not JS (default).                               |\n  | `none`  | Emit nothing, just convert and run validation.                          |\n  | `true`  | Alias for `both`, for backwards compatibility. Will be removed in 0.23. |\n  | `false` | Alias for `docs`, for backwards compatibility. Will be removed in 0.23. |\n\n### Bug Fixes\n\n- TypeDoc will now only create one highlighter for rendering code, saving ~200-500ms for rendering time.\n- For compatibility with JSDoc, TypeDoc will now strip `<caption>` elements from `@example` tags, resolves #1679.\n- TypeScript's `emitDeclarationOnly` compiler option is now supported, resolves #1716.\n- Fixed discovery of tsconfig.json when the provided path ends in `.json`, resolves #1712.\n- Fixed a crash when converting the `globalThis` namespace, could only be caused by a plugin.\n\n### Thanks!\n\n- @Gudahtt\n- @mgred\n- @schlusslicht\n- @srmagura\n\n## v0.22.4 (2021-09-18)\n\n### Features\n\n- Flag option types like `validation` can now be set to true/false to enable/disable all flags within them.\n- Source code links now work with Bitbucket repositories, resolves #1615.\n- Added `githubPages` option (default: true), which will create a `.nojekyll` page in the generated output, resolves #1680.\n- `MarkdownEvent` is now exported, resolves #1696.\n\n### Bug Fixes\n\n- Fixed the hamburger menu not being visible on mobile devices, fixes #1699.\n- Comments on function implementations with overloaded signatures will now be correctly handled, fixes #1697.\n\n### Thanks!\n\n- @srmagura\n\n## v0.22.3 (2021-09-12)\n\n### Bug Fixes\n\n- Switched the default highlighting themes back to `light-plus` and `dark-plus`, they were accidentally set to `min-light` and `min-dark` in v0.22.0.\n\n### Features\n\n- Added new `validation` option which can be used to disable checks for non-exported symbols.\n  On the command line, this can be specified with `--validation.notExported true`, or in an options file with:\n  ```json\n  {\n      \"validation\": {\n          \"notExported\": true\n      }\n  }\n  ```\n- Added invalidLink to `validation` option, deprecated `listInvalidSymbolLinks`, which will be removed in 0.23.\n\n## v0.22.2 (2021-09-11)\n\n### Bug Fixes\n\n- Fix background color of tables in dark mode, closes #1684.\n\n## v0.22.1 (2021-09-10)\n\n### Bug Fixes\n\n- Validation for non-exported symbols will now only produce one warning per symbol, instead of one warning per reference.\n- Syntax highlighting when the preferred color scheme is dark but dark theme is not explicitly selected will now properly use the dark highlighting theme.\n\n## v0.22.0 (2021-09-10)\n\n### Breaking Changes\n\n- The `packages` and `entryPoints` options have been combined.\n  To migrate configurations which used `packages`, replace `packages` with `entryPoints` and set `entryPointStrategy` to `packages`.\n- Renamed `disableOutputCheck` to `cleanOutputDir` to more clearly reflect its behavior.\n- The `highlightTheme` option has been split into `lightHighlightTheme` and `darkHighlightTheme`.\n- Removed poorly documented / poorly behaved `toc` option.\n- HTML output is now rendered with JSX instead of Handlebars, closes #1631.\n  This change provides major performance benefits, reducing rendering time by up to 10x for several benchmarked projects.\n  It also allows themes to be easily type checked, preventing mistakes when creating custom themes.\n  Removing Handlebars also fixed memory leaks when `--watch` was specified due to Handlebar's caching mechanism.\n  This change breaks all existing custom themes, so a theme created for v0.21 or earlier will not work in v0.22.\n  See [internal-docs/custom-themes.md](https://github.com/TypeStrong/typedoc/blob/v0.22.0/internal-docs/custom-themes.md) for documentation on how to create a custom theme in v0.22.\n- Removed the minimal theme that has been mostly broken for a long time.\n- Changed the default `entryPointStrategy` from `expand` to `resolve`.\n- Paths in config files will now be resolved relative to the config file instead of relative to the current working directory.\n- Exclude patterns are now checked against files instead of against each part of the path as traversed, #1399.\n  This means that an exclude of `**/someDir` will **not** exclude files in that directory. To exclude files in a directory, specify `**/someDir/**`.\n\n### Features\n\n- Added support for light/dark mode to the default theme, closes #1641.\n- Added support for custom CSS with the new `customCss` option, closes #1060.\n- Added support for linking to third party documentation sites, closes #131. See [internal-docs/third-party-symbols.md](https://github.com/TypeStrong/typedoc/blob/v0.22.0/internal-docs/third-party-symbols.md)\n  for documentation on how to create a plugin which enables this.\n  Support for linking to MDN for global types is provided by [typedoc-plugin-mdn-links](https://github.com/Gerrit0/typedoc-plugin-mdn-links).\n- Added `entryPointStrategy` to reduce confusion from new TypeDoc users on handling of entry points.\n  There are three possible options:\n  | Option            | Behavior                                                                                                                                                                                    |\n  | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n  | resolve (default) | Expects all entry points to be contained within the root level tsconfig project. If a directory is given, includes `<directory>/index` as the entry point.                                  |\n  | expand            | Expects all entry points to be contained within the root level tsconfig project. If a directory is given, files within it are recursively expanded. This was the default behavior in v0.21. |\n  | packages          | Corresponds to `--packages` in v0.21, behaves as documented in the Monorepo section in the readme.                                                                                          |\n- Added support for `typedocMain` in package.json when using the `packages` strategy for resolving entry points.\n- Produce warnings when documentation is missing exports, closes #1653. If using TypeDoc's API, this behavior is available through calling `application.validate(project)`.\n- Added support for detecting \"`as const` enums\", closes #1675.\n- Added `hideLegend` option, closes #1108.\n- Added performance measurements to debug logging (`--logLevel Verbose`)\n- String literal indexed access types will create links to their referencing member if possible, closes #1226.\n\n### Bug Fixes\n\n- Support inclusion patterns when expanding input files, closes #1399.\n- Arrow keys can no longer select hidden search results.\n- The Legend header will no longer be included if there is nothing in the legend.\n- If a non-function uses `@param`, the name will not be dropped when rendering, closes #1410.\n\n### API Breaking Changes\n\n- TypeDoc now specifies the `\"export\"` key in `package.json`, preventing plugins from importing internal paths.\n  TypeDoc should now export all necessary structures (potentially marked with `@internal` if likely to change) from the root export.\n- The `ReflectionKind` values for `Project`, `Module`, `Namespace`, and `Enum` have changed.\n- Removed deprecated logger functions.\n- Dropped support for legacy plugins which use `export=`. Plugins are now required to export a `load` function.\n- Remove `TypeParameterType`, references to type parameters have produced a `ReferenceType` since v0.20.0.\n- Types no longer have a `clone` method. It inconsistently performed deep or shallow clones, and was not used by TypeDoc.\n- Types no longer contain an `equals` method. It was occasionally correct for medium-complexity types, and always incorrect for more complicated types.\n\n### Thanks!\n\n- @cspotcode\n- @itsjamie\n\n## v0.21.9 (2021-08-29)\n\n### Bug Fixes\n\n- Support highlighting language aliases (#1673), closes #1672\n\n### Thanks!\n\n- @StoneCypher\n\n## v0.21.8 (2021-08-28)\n\n### Features\n\n- Upgrade Shiki to 0.9.8, adds support for several new highlighting languages\n\n### Thanks!\n\n- @StoneCypher\n\n## v0.21.7 (2021-08-27)\n\n### Features\n\n- Support for TypeScript 4.4, closes #1664\n\n## v0.21.6 (2021-08-19)\n\n### Features\n\n- Add support for NO_COLOR environment variable (#1650)\n\n### Bug Fixes\n\n- Handle undefined symbols in query types, closes #1660\n\n### Thanks!\n\n- @krisztianb\n\n## v0.21.5 (2021-07-31)\n\n### Features\n\n- Support Node v12.10 (#1632), closes #1628\n\n### Bug Fixes\n\n- Implicitly set noEmit unless --emit is provided, closes #1639\n\n### Thanks!\n\n- @betaorbust\n\n## v0.21.4 (2021-07-12)\n\n### Bug Fixes\n\n- Constructors did not have source information set, closes #1626\n\n## v0.21.3 (2021-07-10)\n\n### Breaking Changes\n\n- Options may not be set once conversion starts. Enables a small perf improvement.\n\n### Bug Fixes\n\n- Improve detection for \"property methods\" to convert as methods, closes #1624\n- Two members differing only by case produced broken links, closes #1585\n- Resolve some memory leaks\n\n### Thanks!\n\n- @cspotcode\n\n## v0.21.2 (2021-06-27)\n\n### Bug Fixes\n\n- Postpone resolution of inherited classes until their parents have been resolved, closes #1580\n\n## v0.21.1 (2021-06-25)\n\n### Bug Fixes\n\n- Exclude empty modules from documentation, closes #1607\n- `readme` could not be set to `none` in a config file, closes #1608\n- Correctly handle minimatch excludes on Windows, closes #1610\n\n## v0.21.0 (2021-06-18)\n\n### Breaking Changes\n\n- Drop support for Node v10\n- Plugins are now passed Application directly\n- Drop support for TypeScript 3.9\n\n### Features\n\n- Improve monorepos by adding support for TS entry points (#1596)\n- Support for monorepos\n- Support for TypeScript 4.3\n- Add support for sorting reflections based on user criteria, closes #112\n- Add the --treatWarningsAsErrors option, closes #1568\n- The exclude option will now remove symbols re-exported from excluded files, closes #1578\n\n### Bug Fixes\n\n- Correctly handle comments on function type aliases, closes #799\n- Setters should always have a `void` return type, closes #1215\n- Resolve paths in option files according to the config directory, closes #1598, #1442\n- Pick up doc comments for properties declared within a class's constructor, closes #1255\n- Inherit comments from parent methods, closes #1580\n- Correct handling for intentionally broken references\n- Inheritance from multiple Partial<T> types was incorrectly converted, closes #1579\n\n### Thanks!\n\n- @efokschaner\n- @Unnvaldr\n\n## v0.20.37 (2021-06-16)\n\n### Features\n\n- Add disableAliases option (#1576), closes #1571\n\n### Bug Fixes\n\n- Pin `marked` dependency to 2.0.x (#1602), closes #1601\n\n### Thanks!\n\n- @Fleker\n- @Unnvaldr\n\n## v0.20.36 (2021-04-23)\n\n### Features\n\n- use 'pretty' option when generating json\n- create 'pretty' option\n\n### Bug Fixes\n\n- Always write to stdout, even if redirected, closes #1566\n- Create directories when writing JSON output\n\n### Thanks!\n\n- @cAttte\n\n## v0.20.35 (2021-04-03)\n\n### Features\n\n- Include debugging information in highlighting error messages (#1561)\n\n### Bug Fixes\n\n- Relax simple expression requirements for default values, closes #1552\n- Handle #private getters + methods, closes #1564\n\n### Thanks!\n\n- @MasatoMakino\n\n## v0.20.34 (2021-03-25)\n\n### Bug Fixes\n\n- Crash when converting recursive type alias, closes #1547\n- Discover module comments for global files, closes #1549\n- Detect references when export \\* is used, closes #1551\n\n## v0.20.33 (2021-03-22)\n\n### Bug Fixes\n\n- Static properties of Error class incorrectly converted, closes #1541, #572\n\n## v0.20.32 (2021-03-14)\n\n### Bug Fixes\n\n- Correct crash with reflection types, closes #1538\n\n## v0.20.31 (2021-03-14)\n\n### Features\n\n- Improved warning message if TypeDoc is loaded multiple times.\n\n### Bug Fixes\n\n- readonly tuples were recognized as arrays, closes #1534\n- Constructors were improperly reported as inherited, closes #1528, #1527\n\n### Thanks!\n\n- @Minhir\n\n## v0.20.30 (2021-03-06)\n\n### Bug Fixes\n\n- Categories should only appear once if specified multiple times, closes #1522\n- Support JSDocNullableType, JSDocNonNullableType, closes #1524\n- Remove undefined from optional property types, closes #1525\n\n## v0.20.29 (2021-03-04)\n\n### Features\n\n- Support for TypeScript 4.2, closes #1517\n\n## v0.20.28 (2021-02-23)\n\n### Bug Fixes\n\n- Detect visibility modifiers on accessors, closes #1516\n\n## v0.20.27 (2021-02-20)\n\n### Features\n\n- preserve spaces in code blocks\n\n### Bug Fixes\n\n- Detect and normalize unique symbol names, closes #1514\n\n### Thanks!\n\n- @MichaelFroeschen\n\n## v0.20.26 (2021-02-20)\n\n### Bug Fixes\n\n- Pick up optional/readonly from mapped types, closes #1509\n\n## v0.20.25 (2021-02-15)\n\n### Features\n\n- Support for specifying comments on export declarations, closes #1504\n\n## v0.20.24 (2021-02-11)\n\n### Features\n\n- add support for non .com gh enterprise domains (#1507)\n\n### Thanks!\n\n- TUNER88\n\n## v0.20.23 (2021-02-06)\n\n### Bug Fixes\n\n- Missing namespace members when ns is created by re-exporting an entire module, closes #1499\n- Set inheritedFrom on accessor signatures, closes #1497, #1498\n\n### Thanks!\n\n- @siddharthvp\n\n## v0.20.22 (2021-02-06)\n\n### Bug Fixes\n\n- Import from shiki rather than shiki-themes, closes #1496\n\n## v0.20.21 (2021-02-05)\n\n### Bug Fixes\n\n- Missing exported members in file-as-namespace reflection, closes #1493\n\n## v0.20.20 (2021-01-31)\n\n### Features\n\n- add highlight theme option\n\n### Bug Fixes\n\n- Missing comments on optional methods, closes #1490\n- Avoid crash with removed project reflection, closes #1489\n- function-namespaces were converted incorrectly, closes #1483\n- add validation to highlightTheme option\n\n### Thanks!\n\n- @nzmattman\n\n## v0.20.19 (2021-01-25)\n\n### Features\n\n- Support for --watch, --preserveWatchOutput, --emit\n\n## v0.20.18 (2021-01-24)\n\n### Bug Fixes\n\n- Static methods added to the class manually in JS, closes #1481\n\n## v0.20.17 (2021-01-23)\n\n### Features\n\n- Add support for copying item’s documentation by copying it from another API item\n\n### Bug Fixes\n\n- CommonJS export= with type exports, closes #1476\n\n### Thanks!\n\n- @Dergash\n\n## v0.20.16 (2021-01-17)\n\n### Bug Fixes\n\n- Comments on projects were broken\n- Constructors were a bit broken\n\n## v0.20.15 (2021-01-16)\n\n### Features\n\n- Support for excludeInternal, closes #1469\n- add option to read more categories from doc\n\n### Bug Fixes\n\n- Crash when converting `@types/ws`, closes #1463\n- replace return with continue\n- excludeNotDocumented incorrectly ignored some symbols, closes #1465\n- Support for JSDoc `@enum` tags, closes #1464\n\n### Thanks!\n\n- @brunozoric\n\n## v0.20.14 (2021-01-09)\n\n### Bug Fixes\n\n- Crash with destructured export const, closes #1462\n- Add support for optional types, closes #1312\n- Add support for rest types, closes #1457\n- Avoid using process.exit (#1461)\n\n### Thanks!\n\n- @krisztianb\n\n## v0.20.13 (2021-01-06)\n\n### Bug Fixes\n\n- Use type nodes if converting a regular function, closes #1454\n\n## v0.20.12 (2021-01-05)\n\n### Bug Fixes\n\n- Arrow methods did not have modifiers set properly, closes #1452\n- Add support for import types, closes #1453\n- Don't document type arguments if there are none (#1451)\n\n### Thanks!\n\n- @krisztianb\n\n## v0.20.11 (2021-01-04)\n\n### Bug Fixes\n\n- Crash when converting a generic with a tuple constraint, closes #1449\n\n## v0.20.10 (2021-01-03)\n\n### Bug Fixes\n\n- Errors due to bad options in tsconfig file were dropped, closes #1444\n\n## v0.20.9 (2021-01-02)\n\n### Bug Fixes\n\n- Regression caused by 1886304f327da5642097834feac0387fd1b78b6e\n- Parameter declarations might not exist, closes #1443\n\n## v0.20.8 (2021-01-01)\n\n### Bug Fixes\n\n- CLI should not exit cleanly on unexpected error\n\n## v0.20.7 (2020-01-01)\n\n### Bug Fixes\n\n- Tuples could cause a crash\n\n## v0.20.6 (2020-01-01)\n\n### Features\n\n- Support for JSDoc types, closes #1214, #1437\n\n### Bug Fixes\n\n- Properly resolve type parameters, closes #1438\n\n## v0.20.5 (2020-12-30)\n\n### Bug Fixes\n\n- Functions might not have a parent in global files, closes #1436\n\n## v0.20.4 (2020-12-30)\n\n### Bug Fixes\n\n- --excludeNotDocumented didn't remove reflections, closes #1435\n\n## v0.20.3 (2020-12-29)\n\n### Features\n\n- Improved support for global files, closes #1424\n\n## v0.20.2 (2020-12-29)\n\n### Features\n\n- Better detection for declaration files defining a module\n\n### Bug Fixes\n\n- Negative literal types were converted incorrectly, closes #1427\n- ArgumentsReader should warn if missing a value, closes #1429\n- TS 3 converters for null, this types\n- Literal boolean converter in TS 3\n- Map bash, sh, shell to shellscript when highlighting, closes #1432\n\n## v0.20.1 (2020-12-29)\n\n### Bug Fixes\n\n- Initializers should only be included if \"simple\", closes #1288, #1224, #764\n\n## v0.20.0 (2020-12-28)\n\n### Breaking Changes\n\n- Remove EVENT_FUNCTION_IMPLEMENTATION\n- Switch to Shiki for syntax highlighting\n- Unify several inconsistent methods, closes #1403\n- Remove EVENT_FILE_BEGIN\n- TypeDoc no longer accepts TS options\n- Remove \"mode\" option\n- Remove ignoreCompilerErrors option\n\n### Features\n\n- new option \"markedOptions\" (#1412)\n- Initial attempt at support for project references\n- Colors in console output\n- Options may specify a validation function (#1398)\n- Support for `@module` tag\n- Support for TS 4.1 mapped types + string literal types, closes #1397\n- Add logLevel option\n- Partial support for global files\n- Automatically generate schema for typedoc.json\n- Switch back to search.js, closes #1339\n- Support for the remaining literal types\n- Support for mapped types\n- Mostly working library mode\n\n### Bug Fixes\n\n- ConstructorType node support\n- Reintroduce support for index signatures\n- Categorization was broken with a single entry point\n- Normalize unions, closes #571\n- Somehow didn't save a file\n- Missing comments on variable functions, closes #1421\n- Resolve type parameters in concrete subclasses\n- Use entryPoints to search for readme\n- Only create extra programs when dealing with solution style tsconfig.json files\n- A typo in description of DefaultTheme.getMapping (#1416)\n- Correct handling of arrays in generic constraints, closes #1408\n- Type converters threw on older TS versions\n- Accessor with a set signature was converted incorrectly\n- Declaration merged namespaces sometimes produced multiple reflections\n- TypeDoc should warn users about missing entry points\n- isExternal flag wasn't set properly\n- JSON schema had incorrect value types, closes #1389\n- Hidden module-namespaces, closes #1396\n- Some issues with inheritance\n- We pick up all properties now\n- Support for specify a directory as an entry point\n- Lint\n- Array types were converted incorrectly\n- Change target back to ES2018\n- Missing default exports\n- Fix bug in ReferenceType equality check, closes #1383\n- fixes #1383, closes #1383\n- Reference types should always be given resolved symbols\n- Rendering works again\n- A few of the issues with the type converter\n\n### Thanks!\n\n- @gamtiq\n- @krisztianb\n- @socsieng\n\n## v0.19.2 (2020-09-21)\n\n### Bug Fixes\n\n- Export declarations within namespaces weren't detected, closes #1366\n\n## v0.19.1 (2020-09-05)\n\n### Features\n\n- Re-introduce support for TS 3.9, closes #1362\n\n### Thanks!\n\n- @Dergash\n\n## v0.19.0 (2020-08-28)\n\n### Features\n\n- Support for named tuples, closes #1357\n- Upgrade to TS 4.0\n- Support for defaulted type parameters\n\n### Bug Fixes\n\n- Check for missing declarations, closes #1329\n- Add converter for parenthesized type nodes, closes #1346\n- Support for type operators `readonly` & `unique`\n- Address typo in log statement\n\n### Thanks!\n\n- @ericzhangjx\n- @krisztianb\n- @MathBunny\n\n## v0.18.0 (2020-08-09)\n\n### Breaking Changes\n\n- Bump minimum node version to 10\n\n### Bug Fixes\n\n- Improve support for type aliases, closes #1330\n- Examples don't run (#1327)\n- Use `baseUrl` to determine file paths (#1313), closes #1294\n- Support resolveJsonModule, closes #1323\n- Do not ignore the properties of object type literals (#1308)\n- GithubPlugin: read correct remote when multiple github repos exist\n- Only set inputFiles from tsconfig if not already set, closes #1263\n- Options.isDefault was always false when passed non-literals., closes #1263\n\n### Thanks!\n\n- @brandones\n- @christopherthielen\n- @canonic-epicure\n- @TheBrokenRail\n\n## v0.17.7 (2020-05-17)\n\n### Breaking Changes\n\n- Any plugins which referenced ReflectionKind.ExternalModule or ReflectionKind.Module need to be updated to reference ReflectionKind.Module and ReflectionKind.Namespace respectively., closes #109\n- `createMinimatch` is no longer a public function.\n\n### Features\n\n- Allow every possible number as a defaultValue for a number option (#1296), closes #1291\n- Number options may require min and max values (#1278)\n- Add detecting read-only properties (#1268)\n- Remove Result object, closes #1238\n- Generate search index before rendering theme (#1252)\n- Support for `@template`, closes #860\n- Support for private fields\n- Move TypeScript to a peer dependency, closes #880\n- Support disabling sources, closes #808\n- Allow user to set git remote, closes #1130\n- Only generate legend for items that are displayed on the page (#1187), closes #1136\n\n### Bug Fixes\n\n- copy inherited parameter descriptions (#1303), closes #787\n- TypeDoc fails to resolve @types packages outside of cwd, closes #1300\n- Trim whitespace when parsing links, closes #1302\n- Module declaration parsed as namespace (#1301), closes #1284\n- Correct prepublish script\n- Do not silently swallow missing include/media file errors (#1277)\n- Fix extends option in tsconfig.json doesn't work (#1273), closes #1272\n- Improve output for object's computed property names (#1275)\n- Enable lax overloads only in release\n- Map type options should not have their default value validated (#1250)\n- Empty legend on most pages\n- Pin marked to 0.8.0, closes #1240\n- Report errors from setting bad options on CLI, closes #1237\n- Missed a test configuration update\n- Rename external modules to modules, closes #109\n- Check for compiler errors before converting\n- Moved @types/minimatch dependency to devDependencies (#1206)\n- Plugin resolution for relative paths (#1194), closes #1188\n\n### Thanks!\n\n- @alexandercerutti\n- @krisztianb\n- @Unnvaldr\n- @canonic-epicure\n- @garaboncias\n- @sgrishchenko\n- @socsieng\n- @StephanBijzitter\n- @WilliamJns\n\n## v0.16.11 (2020-02-28)\n\n### Features\n\n- Add support for `` inside of Marked Link Brackets (#1091)\n- Support for extended config in typedoc.json, closes #493, #1115\n- Config option to exclude not explicitly documented symbols (#996), closes #995\n\n### Bug Fixes\n\n- Support code blocks with four spaces, closes #1218\n- Ensure child comment tags get set (#1221)\n- Re-export TypeScript namespace (#1217), closes #1213\n- Logger extensions now also count the warnings (#1210)\n\n### Thanks!\n\n- @epzilla\n- @forivall\n- @KSXGitHub\n- @canonic-epicure\n- @Richienb\n- @PissedCapslock\n\n## v0.16.10 (2020-02-16)\n\n### Features\n\n- Allow excluding tags from comments, closes #815\n- Count warnings (#1205)\n\n### Bug Fixes\n\n- Remove tags containing redundant type info, closes #1198\n- Don't remove braces containing a tag, closes #1001\n- Mixin symbols might not have declarations (#1208)\n\n### Thanks!\n\n- @capraynor\n- @PissedCapslock\n- @zslayton\n\n## v0.16.9 (2020-01-25)\n\n### Bug Fixes\n\n- use util.readFile everywhere to handle BOM issues\n\n### Thanks!\n\n- @antongolub\n\n## v0.16.8 (2020-01-21)\n\n### Bug Fixes\n\n- Correctly handle export \\* from..., closes #1186\n\n## v0.16.7 (2020-01-17)\n\n### Features\n\n- Support for query types\n\n### Bug Fixes\n\n- Add test for {} and fix generation\n\n### Thanks!\n\n- @PissedCapslock\n\n## v0.16.6 (2020-01-16)\n\n### Bug Fixes\n\n- removeReflection does not fully remove reflections, closes #1176\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "# TypeDoc\n\nDocumentation generator for TypeScript projects.\n\n## Documentation\n\nFor more detailed documentation, the changelog, and TypeDoc documentation rendered with TypeDoc, see https://typedoc.org.\n\n## Installation\n\nTypeDoc runs on Node.js and is available as a NPM package.\n\n```text\nnpm install typedoc --save-dev\n```\n\n## Usage\n\nTo generate documentation TypeDoc needs to know your project entry point and TypeScript\ncompiler options. It will automatically try to find your `tsconfig.json` file, so you can\njust specify the entry point of your library:\n\n```text\ntypedoc src/index.ts\n```\n\nIf you have multiple entry points, specify each of them.\n\n```text\ntypedoc package1/index.ts package2/index.ts\n```\n\nIf you specify a directory, TypeDoc will use the `entryPointStrategy` option to determine how to resolve it.\nBy default, TypeDoc will search for a file called `index` under the directory.\n\n### Monorepos / Workspaces\n\nIf your codebase is comprised of one or more npm packages, you can build documentation for each of them individually\nand merge the results together into a single site by setting `entryPointStrategy` to `packages`. In this mode TypeDoc\nrequires configuration to be present in each directory to specify the entry points. For an example setup, see\nhttps://github.com/Gerrit0/typedoc-packages-example\n\n### Arguments\n\nFor a complete list of the command line arguments run `typedoc --help` or visit\n[our website](https://typedoc.org/options/).\n\n- `--out <path/to/documentation/>`<br>\n  Specifies the location the documentation should be written to. Defaults to `./docs`\n- `--json <path/to/output.json>`<br>\n  Specifies the location and file name a json file describing the project is\n  written to. When specified no documentation will be generated unless `--out` is also\n  specified.\n- `--options`<br>\n  Specify a json option file that should be loaded. If not specified TypeDoc\n  will look for 'typedoc.json' in the current directory.\n- `--tsconfig <path/to/tsconfig.json>`<br>\n  Specify a typescript config file that should be loaded. If not\n  specified TypeDoc will look for 'tsconfig.json' in the current directory.\n- `--exclude <pattern>`<br>\n  Exclude files by the given pattern when a path is provided as source.\n  Supports standard minimatch patterns.\n\n#### Theming\n\n- `--theme <default|plugin defined theme>`<br>\n  Specify the theme that should be used.\n- `--name <Documentation title>`<br>\n  Set the name of the project that will be used in the header of the template.\n- `--readme <path/to/readme|none>`<br>\n  Path to the readme file that should be displayed on the index page. Pass `none` to disable the index page\n  and start the documentation on the globals page.\n\n#### Miscellaneous\n\n- `--version`<br>\n  Display the version number of TypeDoc.\n- `--help`<br>\n  Display all TypeDoc options.\n\n## Contributing\n\nThis project is maintained by a community of developers. Contributions are welcome and appreciated.\nYou can find TypeDoc on GitHub; feel free to open an issue or create a pull request:\nhttps://github.com/TypeStrong/typedoc\n\nFor more information, read the [contribution guide](https://github.com/TypeStrong/typedoc/blob/master/.github/CONTRIBUTING.md).\n"
  },
  {
    "path": "bin/package.json",
    "content": "{\n    \"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "bin/typedoc",
    "content": "#!/usr/bin/env node\n//@ts-check\n\nconst { fork } = require(\"child_process\");\n\nfunction main() {\n    fork(__dirname + \"/../dist/lib/cli.js\", process.argv.slice(2), {\n        stdio: \"inherit\",\n    }).on(\"exit\", (code) => {\n        // Watch restart required? Fork a new child\n        if (code === 7) {\n            // Set an environment variable to ensure we continue watching\n            // Otherwise, the watch might stop unexpectedly if the watch\n            // option was set in a config file originally, and change to false\n            // later, causing a restart\n            process.env[\"TYPEDOC_FORCE_WATCH\"] = \"1\";\n            main();\n        } else {\n            process.exit(code || 0);\n        }\n    });\n}\n\nmain();\n"
  },
  {
    "path": "dprint.json",
    "content": "{\n    \"indentWidth\": 4,\n    \"typescript\": {\n        \"module.sortImportDeclarations\": \"maintain\",\n        \"operatorPosition\": \"sameLine\",\n        \"quoteStyle\": \"preferDouble\",\n        \"conditionalExpression.operatorPosition\": \"nextLine\",\n        \"forStatement.bracePosition\": \"sameLine\",\n        \"constructorType.spaceAfterNewKeyword\": true,\n        \"constructSignature.spaceAfterNewKeyword\": true,\n        \"functionExpression.spaceAfterFunctionKeyword\": true\n    },\n    \"json\": {},\n    \"markdown\": {},\n    \"excludes\": [\n        \"**/node_modules\",\n        \"**/*-lock.json\",\n        \"src/test/converter2/issues/gh1524.d.ts\",\n        \"src/test/converter2/issues/gh2631/crlf.md\"\n    ],\n    \"plugins\": [\n        \"https://plugins.dprint.dev/typescript-0.95.15.wasm\",\n        \"https://plugins.dprint.dev/json-0.21.1.wasm\",\n        \"https://plugins.dprint.dev/markdown-0.21.1.wasm\",\n        \"https://plugins.dprint.dev/g-plane/malva-v0.15.2.wasm\"\n    ]\n}\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "// @ts-check\nimport eslint from \"@eslint/js\";\nimport tslint from \"typescript-eslint\";\n\n/** @type {import(\"typescript-eslint\").ConfigWithExtends} */\nconst config = {\n    languageOptions: {\n        parserOptions: {\n            project: true,\n            tsconfigRootDir: import.meta.dirname,\n            // We're fairly frequently on a later version of the TS compiler than\n            // is officially supported. So far this has never been a real problem.\n            warnOnUnsupportedTypeScriptVersion: false,\n        },\n    },\n    rules: {\n        \"@typescript-eslint/no-floating-promises\": \"error\",\n        \"@typescript-eslint/await-thenable\": \"error\",\n        \"@typescript-eslint/consistent-type-imports\": [\n            \"error\",\n            {\n                fixStyle: \"inline-type-imports\",\n                prefer: \"type-imports\",\n                disallowTypeAnnotations: false,\n            },\n        ],\n\n        \"@typescript-eslint/restrict-template-expressions\": [\n            \"error\",\n            {\n                allowBoolean: true,\n                allowNumber: true,\n            },\n        ],\n\n        // This one is just annoying since it complains at incomplete code\n        \"no-empty\": \"off\",\n\n        // Doesn't properly handle intersections of generics.\n        \"@typescript-eslint/unified-signatures\": \"off\",\n\n        // This rule is factually incorrect. Interfaces which extend some type alias can be used to introduce\n        // new type names. This is useful particularly when dealing with mixins.\n        \"@typescript-eslint/no-empty-interface\": \"off\",\n\n        // Conflicts with TS option to require dynamic access for records, which I find more useful.\n        \"@typescript-eslint/no-dynamic-delete\": \"off\",\n\n        // Conflicts with the `NeverIfInternal` type used to enforce a stricter API internally\n        \"@typescript-eslint/no-redundant-type-constituents\": \"off\",\n        \"@typescript-eslint/no-unnecessary-boolean-literal-compare\": \"off\",\n\n        // This is sometimes useful for clarity\n        \"@typescript-eslint/no-unnecessary-type-arguments\": \"off\",\n\n        // It'd be kind of nice to be able to turn this on, but it doesn't seem to be worth the additional\n        // pain at this point. Turning it on adds ~300 lint errors, of which manual review found 1 bug, and\n        // whose suggestions would have introduced 3 bugs that I noticed, and potentially more... and it\n        // also didn't catch the bug which I originally turned it on for! Ideally, I'd like a version of\n        // this which ONLY checks for boolean comparisons of type number.\n        \"@typescript-eslint/strict-boolean-expressions\": \"off\",\n\n        // We still use `any` fairly frequently...\n        \"@typescript-eslint/ban-types\": \"off\",\n        \"@typescript-eslint/no-explicit-any\": \"off\",\n        \"@typescript-eslint/no-unsafe-assignment\": \"off\",\n        \"@typescript-eslint/no-unsafe-argument\": \"off\",\n        \"@typescript-eslint/no-unsafe-return\": \"off\",\n        \"@typescript-eslint/no-unsafe-member-access\": \"off\",\n        \"@typescript-eslint/no-unsafe-call\": \"off\",\n        \"@typescript-eslint/no-empty-object-type\": \"off\",\n\n        // Needed for the locales today, don't want to make every contributor to those turn it off.\n        \"@typescript-eslint/no-require-imports\": [\n            \"error\",\n            {\n                allow: [\"/[^/]+\\\\.cjs\"],\n            },\n        ],\n\n        // Really annoying, doesn't provide any value.\n        \"@typescript-eslint/no-empty-function\": \"off\",\n\n        // Declaration merging with a namespace is a necessary tool when working with enums.\n        \"@typescript-eslint/no-namespace\": \"off\",\n\n        // Reported by TypeScript\n        \"@typescript-eslint/no-unused-vars\": \"off\",\n\n        \"no-console\": \"warn\",\n\n        \"@typescript-eslint/no-confusing-void-expression\": \"off\",\n        \"@typescript-eslint/unbound-method\": \"off\",\n\n        \"@typescript-eslint/prefer-literal-enum-member\": [\n            \"error\",\n            { allowBitwiseExpressions: true },\n        ],\n\n        // I'd like to have this turned on, but haven't figured out how to tell it about\n        // checks that are correctly linted as unnecessary for TypeDoc's usage, but not\n        // for plugin permitted usage.\n        \"@typescript-eslint/no-unnecessary-condition\": \"off\",\n\n        // Feel free to turn one of these back on and submit a PR!\n        \"@typescript-eslint/no-non-null-assertion\": \"off\",\n        \"@typescript-eslint/explicit-module-boundary-types\": \"off\",\n\n        // https://astexplorer.net/#/gist/82d22728cda8283bf38e956640420af4/4d5e6fbcbceed981f9897a859322ade5f1cb86ee\n        \"no-restricted-syntax\": [\n            \"warn\",\n            {\n                selector: \"ImportDeclaration[source.value=/.*perf(\\\\.[tj]s)?$/]\",\n                message: \"Benchmark calls must be removed before committing.\",\n            },\n            {\n                selector: \"MemberExpression[object.name=type][property.name=symbol]\",\n                message: \"Use type.getSymbol() instead, Type.symbol is not properly typed.\",\n            },\n            {\n                selector: \"ImportDeclaration[source.value=typescript] ImportNamespaceSpecifier\",\n                message: \"TS before 5.7 does not have non-default exports.\",\n            },\n            {\n                selector: \"ImportDeclaration[source.value=typescript] ImportDeclaration\",\n                message: \"TS before 5.7 does not have non-default exports.\",\n            },\n        ],\n\n        \"no-fallthrough\": [\"error\", { allowEmptyCase: true }],\n    },\n};\n\nconst nodeModules = [\n    \"assert\",\n    \"assert/strict\",\n    \"async_hooks\",\n    \"buffer\",\n    \"child_process\",\n    \"cluster\",\n    \"console\",\n    \"constants\",\n    \"crypto\",\n    \"dgram\",\n    \"diagnostics_channel\",\n    \"dns\",\n    \"dns/promises\",\n    \"domain\",\n    \"events\",\n    \"fs\",\n    \"fs/promises\",\n    \"http\",\n    \"http2\",\n    \"https\",\n    \"inspector\",\n    \"inspector/promises\",\n    \"module\",\n    \"net\",\n    \"os\",\n    \"path\",\n    \"path/posix\",\n    \"path/win32\",\n    \"perf_hooks\",\n    \"process\",\n    \"punycode\",\n    \"querystring\",\n    \"readline\",\n    \"readline/promises\",\n    \"repl\",\n    \"stream\",\n    \"stream/consumers\",\n    \"stream/promises\",\n    \"stream/web\",\n    \"string_decoder\",\n    \"sys\",\n    \"timers\",\n    \"timers/promises\",\n    \"tls\",\n    \"trace_events\",\n    \"tty\",\n    \"url\",\n    \"util\",\n    \"util/types\",\n    \"v8\",\n    \"vm\",\n    \"wasi\",\n    \"worker_threads\",\n    \"zlib\",\n];\n\nexport default tslint.config(\n    {\n        files: [\"src/**/*.ts\"],\n        rules: {\n            \"no-restricted-imports\": [\n                \"error\",\n                {\n                    patterns: [\"*/utils-common/*\"],\n                },\n            ],\n        },\n    },\n    {\n        files: [\"src/lib/models/**/*.ts\"],\n        rules: {\n            \"no-restricted-imports\": [\n                \"error\",\n                {\n                    paths: nodeModules,\n                    patterns: [{\n                        regex: \"^(?!\\./|#utils|#serialization).*\",\n                        message: \"models may only import within this directory or #utils/#serialization\",\n                    }],\n                },\n            ],\n        },\n    },\n    {\n        files: [\"src/lib/serialization/**/*.ts\"],\n        rules: {\n            \"no-restricted-imports\": [\n                \"error\",\n                {\n                    paths: nodeModules,\n                    patterns: [\n                        \"node:*\",\n                        \"\\\\#*\",\n                        \"!\\\\#utils\",\n                        \"!\\\\#models\",\n                        \"../*\",\n                    ],\n                },\n            ],\n        },\n    },\n    {\n        files: [\"src/lib/utils-common/**/*.ts\"],\n        rules: {\n            \"no-restricted-imports\": [\n                \"error\",\n                {\n                    paths: nodeModules,\n                    patterns: [{\n                        regex: \"^(?!\\./).*\",\n                        message: \"utils-common may only import within this directory\",\n                    }],\n                },\n            ],\n        },\n    },\n    eslint.configs.recommended,\n    ...tslint.configs.strictTypeChecked,\n    config,\n    {\n        files: [\"src/test/**/*\"],\n        rules: {\n            \"@typescript-eslint/no-deprecated\": \"off\",\n        },\n    },\n    {\n        ignores: [\n            \"eslint.config.mjs\",\n            \"src/test/renderer/specs\",\n            \"site/typedoc-plugin-redirect.js\",\n            \"site/site-plugin.js\",\n            \"dist\",\n            \"docs\",\n            \"docs2\",\n            \"docs-site\",\n            \"tmp\",\n            \"coverage\",\n            \"static/main.js\",\n            \"src/lib/output/themes/default/assets\",\n            \"**/node_modules\",\n            \"example\",\n            \"src/test/converter\",\n            \"src/test/converter2\",\n            \"src/test/module\",\n            \"src/test/packages\",\n            \"src/test/renderer/\",\n            \"src/test/slow/entry-points\",\n            \"scripts\",\n            \"bin\",\n        ],\n    },\n);\n"
  },
  {
    "path": "example/.eslintrc.json",
    "content": "{\n    \"extends\": \"../.eslintrc\",\n    \"parserOptions\": {\n        \"project\": \"./tsconfig.json\"\n    },\n    \"ignorePatterns\": [\"docs/\"]\n}\n"
  },
  {
    "path": "example/README.md",
    "content": "# The TypeDoc Example\n\nWelcome to the TypeDoc example! TypeDoc is a documentation generator for\nTypeScript.\n\nTypeDoc automatically documents every variable, function, and class\nthat is exported by your project. You can add explanations and examples to your\ndocumentation site by annotating your code with doc comments, e.g.\n\n```\n/**\n * Calculates the square root of a number.\n *\n * @param x the number to calculate the root of.\n * @returns the square root if `x` is non-negative or `NaN` if `x` is negative.\n */\nexport function sqrt(x: number): number {\n    return Math.sqrt(x);\n}\n```\n\nThis project shows off some of TypeDoc's features:\n\n- Built-in support for various TypeScript language constructs\n- Markdown in doc comments\n- Syntax highlighting in code blocks\n\n## Index of Examples\n\n**Click the \"Exports\" link in the sidebar to see a complete list of everything in\nthe package.**\n\nHere are some examples we wanted to highlight:\n\n### Rendering\n\n- External Markdown: [here](./src/documents/external-markdown.md)\n- Markdown showcase: [here](./src/documents/markdown.md)\n- Syntax highlighting showcase: [here](./src/documents/syntax-highlighting.md)\n\n### Functions\n\n- Simple functions: {@link sqrt | `sqrt` } and {@link sqrtArrowFunction | `sqrtArrowFunction` }\n- A generic function: {@link concat | `concat` }\n- Functions that take an options object: {@link makeHttpCallA | `makeHttpCallA` } and {@link makeHttpCallB | `makeHttpCallB` }\n- An overloaded function: {@link overloadedFunction | `overloadedFunction` }\n- An external function exported under a different name: {@link lodashSortBy | `lodashSortBy` }\n\n### Types\n\n- Type aliases: {@link SimpleTypeAlias | `SimpleTypeAlias` } and {@link ComplexGenericTypeAlias | `ComplexGenericTypeAlias` }\n- Interfaces: {@link User | `User` } and {@link AdminUser | `AdminUser` }\n\n### Classes\n\n- A basic class: {@link Customer | `Customer` }\n- A subclass: {@link DeliveryCustomer | `DeliveryCustomer` }\n- A complex class: {@link CancellablePromise | `CancellablePromise` }\n- A class that extends a built-in generic type: {@link StringArray | `StringArray` }\n\n### Enums\n\n- A basic enum: {@link SimpleEnum | `SimpleEnum` }\n- Using the `@enum` tag: {@link EnumLikeObject | `EnumLikeObject` }\n\n### Variables\n\n- {@link PI | `PI` }, {@link STRING_CONSTANT | `STRING_CONSTANT` }, and {@link ObjectConstant | `ObjectConstant` }\n\n### React Components\n\n- Basic React components: {@link CardA | `CardA` } and {@link CardB | `CardB` }\n- A complex React component: {@link EasyFormDialog | `EasyFormDialog` } and {@link EasyFormDialogProps | `EasyFormDialogProps` }\n"
  },
  {
    "path": "example/building-the-example.md",
    "content": "# Building the TypeDoc Example\n\n1. Build TypeDoc: `pnpm install` and `pnpm build` in the root directory.\n2. `cd example`\n3. `pnpm install` (the example has its own `package.json`)\n4. Typecheck the example: `pnpm tsc`\n5. Build the docs: `pnpm typedoc`\n"
  },
  {
    "path": "example/package.json",
    "content": "{\n    \"name\": \"typedoc-example\",\n    \"version\": \"0.0.0\",\n    \"private\": true,\n    \"description\": \"An example of using the TypeDoc documentation generator.\",\n    \"license\": \"Apache-2.0\",\n    \"author\": \"TypeDoc contributors\",\n    \"scripts\": {\n        \"lint\": \"eslint .\",\n        \"tsc\": \"tsc\",\n        \"typedoc\": \"node ../bin/typedoc\"\n    },\n    \"dependencies\": {\n        \"@types/lodash\": \"^4.17.23\",\n        \"@types/react\": \"^19.2.14\",\n        \"@types/react-dom\": \"^19.2.3\",\n        \"lodash\": \"^4.17.23\",\n        \"react\": \"^19.2.4\",\n        \"react-dom\": \"^19.2.4\"\n    },\n    \"devDependencies\": {\n        \"typescript\": \"^5.9.3\"\n    }\n}\n"
  },
  {
    "path": "example/src/classes/CancellablePromise.ts",
    "content": "const noop = () => {\n    /* purposefully empty */\n};\n\n/**\n * If canceled, a {@link CancellablePromise | `CancellablePromise`} should throw an `Cancellation` object.\n */\nclass Cancellation extends Error {\n    constructor(message = \"Promise canceled.\") {\n        super(message);\n    }\n}\n\n/**\n * The most abstract thing we can cancel — a thenable with a cancel method.\n */\ntype PromiseWithCancel<T> = PromiseLike<T> & { cancel(): void };\n\n/**\n * Determines if an arbitrary value is a thenable with a cancel method.\n */\nfunction isPromiseWithCancel<T>(value: unknown): value is PromiseWithCancel<T> {\n    return (\n        typeof value === \"object\" &&\n        typeof (value as any).then === \"function\" &&\n        typeof (value as any).cancel === \"function\"\n    );\n}\n\n/**\n * This example shows off how TypeDoc handles\n *\n * - Complex method signatures\n * - Static methods\n * - A method with 10 overload signatures. Wow!\n *     - Only the implementation signature has a doc comment. TypeDoc\n *       automatically copies the comment from the implementation signature to\n *       each of the visible signatures if they don't have one.\n *\n * A promise with a `cancel` method.  If canceled, the `CancellablePromise` will\n * reject with a `Cancellation` object. Originally from\n * [real-cancellable-promise](https://github.com/srmagura/real-cancellable-promise).\n *\n * @typeParam T what the `CancellablePromise` resolves to\n *\n * @groupDescription Methods\n * Descriptions can be added for groups with `@groupDescription`, which will show up in\n * the index where groups are listed. This works for both manually created groups which\n * are created with `@group`, and implicit groups like the `Methods` group that this\n * description is attached to.\n */\nexport class CancellablePromise<T> {\n    /**\n     * As a consumer of the library, you shouldn't ever need to access\n     * `CancellablePromise.promise` directly.\n     *\n     * If you are subclassing `CancellablePromise` for some reason, you\n     * can access this property.\n     */\n    protected readonly promise: Promise<T>;\n\n    // IMPORTANT: When defining a new `cancel` function,\n    // e.g. in the implementation of `then`,\n    // always use an arrow function so that `this` is bound.\n\n    /**\n     * Cancel the `CancellablePromise`.\n     */\n    readonly cancel: (reason?: string) => void;\n\n    /**\n     * @param promise a normal promise or thenable\n     * @param cancel a function that cancels `promise`. **Calling `cancel` after\n     * `promise` has resolved must be a no-op.**\n     */\n    constructor(promise: PromiseLike<T>, cancel: (reason?: string) => void) {\n        this.promise = Promise.resolve(promise);\n        this.cancel = cancel;\n    }\n\n    /**\n     * Analogous to `Promise.then`.\n     *\n     * `onFulfilled` on `onRejected` can return a value, a normal promise, or a\n     * `CancellablePromise`. So you can make a chain a `CancellablePromise`s\n     * like this:\n     *\n     * ```\n     * const overallPromise = cancellableAsyncFunction1()\n     *     .then(cancellableAsyncFunction2)\n     *     .then(cancellableAsyncFunction3)\n     *     .then(cancellableAsyncFunction4)\n     * ```\n     *\n     * Then if you call `overallPromise.cancel`, `cancel` is called on all\n     * `CancellablePromise`s in the chain! In practice, this means that\n     * whichever async operation is in progress will be canceled.\n     *\n     * @returns a new CancellablePromise\n     */\n    then<TResult1 = T, TResult2 = never>(\n        onFulfilled?:\n            | ((value: T) => TResult1 | PromiseLike<TResult1>)\n            | undefined\n            | null,\n        onRejected?:\n            | ((reason: any) => TResult2 | PromiseLike<TResult2>)\n            | undefined\n            | null,\n    ): CancellablePromise<TResult1 | TResult2> {\n        let fulfill;\n        let reject;\n        let callbackPromiseWithCancel: PromiseWithCancel<unknown> | undefined;\n\n        if (onFulfilled) {\n            fulfill = (value: T): TResult1 | PromiseLike<TResult1> => {\n                const nextValue: TResult1 | PromiseLike<TResult1> = onFulfilled(value);\n\n                if (isPromiseWithCancel(nextValue)) {\n                    callbackPromiseWithCancel = nextValue;\n                }\n\n                return nextValue;\n            };\n        }\n\n        if (onRejected) {\n            reject = (reason: any): TResult2 | PromiseLike<TResult2> => {\n                const nextValue: TResult2 | PromiseLike<TResult2> = onRejected(reason);\n\n                if (isPromiseWithCancel(nextValue)) {\n                    callbackPromiseWithCancel = nextValue;\n                }\n\n                return nextValue;\n            };\n        }\n\n        const newPromise = this.promise.then(fulfill, reject);\n\n        const newCancel = () => {\n            this.cancel();\n            callbackPromiseWithCancel?.cancel();\n        };\n\n        return new CancellablePromise(newPromise, newCancel);\n    }\n\n    /**\n     * Analogous to `Promise.catch`.\n     */\n    catch<TResult = never>(\n        onRejected?:\n            | ((reason: any) => TResult | PromiseLike<TResult>)\n            | undefined\n            | null,\n    ): CancellablePromise<T | TResult> {\n        return this.then(undefined, onRejected);\n    }\n\n    /**\n     * Attaches a callback that is invoked when the Promise is settled\n     * (fulfilled or rejected). The resolved value cannot be modified from the\n     * callback.\n     * @param onFinally The callback to execute when the Promise is settled\n     * (fulfilled or rejected).\n     * @returns A Promise for the completion of the callback.\n     */\n    finally(\n        onFinally?: (() => void) | undefined | null,\n    ): CancellablePromise<T> {\n        return new CancellablePromise(\n            this.promise.finally(onFinally),\n            this.cancel,\n        );\n    }\n\n    /**\n     * Analogous to `Promise.resolve`.\n     *\n     * The returned promise should resolve even if it is canceled. The idea is\n     * that the promise is resolved instantaneously, so by the time the promise\n     * is canceled, it has already resolved.\n     */\n    static resolve(): CancellablePromise<void>;\n\n    static resolve<T>(value: T): CancellablePromise<T>;\n\n    static resolve(value?: unknown): CancellablePromise<unknown> {\n        return new CancellablePromise(Promise.resolve(value), noop);\n    }\n\n    /**\n     * Analogous to `Promise.reject`.\n     *\n     * Like `CancellablePromise.resolve`, canceling the returned\n     * `CancellablePromise` is a no-op.\n     *\n     * @param reason this should probably be an `Error` object\n     */\n    static reject<T>(reason?: unknown): CancellablePromise<T> {\n        return new CancellablePromise(Promise.reject(reason), noop);\n    }\n\n    static all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n            T5 | PromiseLike<T5>,\n            T6 | PromiseLike<T6>,\n            T7 | PromiseLike<T7>,\n            T8 | PromiseLike<T8>,\n            T9 | PromiseLike<T9>,\n            T10 | PromiseLike<T10>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;\n\n    static all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n            T5 | PromiseLike<T5>,\n            T6 | PromiseLike<T6>,\n            T7 | PromiseLike<T7>,\n            T8 | PromiseLike<T8>,\n            T9 | PromiseLike<T9>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;\n\n    static all<T1, T2, T3, T4, T5, T6, T7, T8>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n            T5 | PromiseLike<T5>,\n            T6 | PromiseLike<T6>,\n            T7 | PromiseLike<T7>,\n            T8 | PromiseLike<T8>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4, T5, T6, T7, T8]>;\n\n    static all<T1, T2, T3, T4, T5, T6, T7>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n            T5 | PromiseLike<T5>,\n            T6 | PromiseLike<T6>,\n            T7 | PromiseLike<T7>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4, T5, T6, T7]>;\n\n    static all<T1, T2, T3, T4, T5, T6>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n            T5 | PromiseLike<T5>,\n            T6 | PromiseLike<T6>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4, T5, T6]>;\n\n    static all<T1, T2, T3, T4, T5>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n            T5 | PromiseLike<T5>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4, T5]>;\n\n    static all<T1, T2, T3, T4>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n            T4 | PromiseLike<T4>,\n        ],\n    ): CancellablePromise<[T1, T2, T3, T4]>;\n\n    static all<T1, T2, T3>(\n        values: readonly [\n            T1 | PromiseLike<T1>,\n            T2 | PromiseLike<T2>,\n            T3 | PromiseLike<T3>,\n        ],\n    ): CancellablePromise<[T1, T2, T3]>;\n\n    static all<T1, T2>(\n        values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>],\n    ): CancellablePromise<[T1, T2]>;\n\n    static all<T>(\n        values: readonly (T | PromiseLike<T>)[],\n    ): CancellablePromise<T[]>;\n\n    /**\n     * Analogous to `Promise.all`.\n     *\n     * @param values an array that may contain `CancellablePromise`s, promises,\n     * thenables, and resolved values\n     * @returns a {@link CancellablePromise | `CancellablePromise`}, which, if canceled, will cancel each\n     * of the promises passed in to `CancellablePromise.all`.\n     */\n    static all(values: readonly unknown[]): CancellablePromise<unknown> {\n        return new CancellablePromise(Promise.all(values), () => {\n            for (const value of values) {\n                if (isPromiseWithCancel(value)) value.cancel();\n            }\n        });\n    }\n\n    /**\n     * Creates a `CancellablePromise` that is resolved with an array of results\n     * when all of the provided `Promises` resolve or reject.\n     * @param values An array of `Promises`.\n     * @returns A new `CancellablePromise`.\n     */\n    static allSettled<T extends readonly unknown[] | readonly [unknown]>(\n        values: T,\n    ): CancellablePromise<\n        {\n            -readonly [P in keyof T]: PromiseSettledResult<\n                T[P] extends PromiseLike<infer U> ? U : T[P]\n            >;\n        }\n    >;\n\n    /**\n     * Creates a `CancellablePromise` that is resolved with an array of results\n     * when all of the provided `Promise`s resolve or reject.\n     *\n     * @param values An array of `Promise`s.\n     * @returns A new `CancellablePromise`. Canceling it cancels all of the input\n     * promises.\n     */\n    static allSettled<T>(\n        values: Iterable<T>,\n    ): CancellablePromise<\n        PromiseSettledResult<T extends PromiseLike<infer U> ? U : T>[]\n    >;\n\n    static allSettled(values: unknown[]): CancellablePromise<unknown> {\n        const cancel = (): void => {\n            for (const value of values) {\n                if (isPromiseWithCancel(value)) {\n                    value.cancel();\n                }\n            }\n        };\n\n        return new CancellablePromise(Promise.allSettled(values), cancel);\n    }\n\n    /**\n     * Creates a `CancellablePromise` that is resolved or rejected when any of\n     * the provided `Promises` are resolved or rejected.\n     * @param values An array of `Promises`.\n     * @returns A new `CancellablePromise`. Canceling it cancels all of the input\n     * promises.\n     */\n    static race<T>(values: readonly T[]): CancellablePromise<Awaited<T>> {\n        const cancel = (): void => {\n            for (const value of values) {\n                if (isPromiseWithCancel(value)) {\n                    value.cancel();\n                }\n            }\n        };\n\n        return new CancellablePromise(Promise.race(values), cancel);\n    }\n\n    /**\n     * @returns a `CancellablePromise` that resolves after `ms` milliseconds.\n     */\n    static delay(ms: number): CancellablePromise<void> {\n        let timer: ReturnType<typeof setTimeout> | undefined;\n        let rejectFn: (reason?: any) => void = noop;\n\n        const promise = new Promise<void>((resolve, reject) => {\n            timer = setTimeout(() => {\n                resolve();\n                rejectFn = noop;\n            }, ms);\n            rejectFn = reject;\n        });\n\n        return new CancellablePromise(promise, () => {\n            if (timer) clearTimeout(timer);\n            rejectFn(new Cancellation());\n        });\n    }\n}\n"
  },
  {
    "path": "example/src/classes/Customer.ts",
    "content": "/**\n * An abstract base class for the customer entity in our application.\n *\n * Notice how TypeDoc shows the inheritance hierarchy for our class.\n *\n * @category Model\n */\nexport abstract class Customer {\n    /** A public readonly property. */\n    readonly id: number;\n\n    /** A public property that can be reassigned. */\n    name: string;\n\n    /** An optional protected property. */\n    protected contactName?: string;\n\n    /** A private property that is accessed via a getter and setter. */\n    private _nextOrderNumber = 0;\n\n    /**\n     * A getter that prepends a number sign to the private `_nextOrderNumber`\n     * property.\n     */\n    get nextOrderNumber(): string {\n        return `#${this._nextOrderNumber}`;\n    }\n\n    /**\n     * A setter that takes in either a string or a number and sets the private\n     * `_nextOrderNumber` property.\n     */\n    set nextOrderNumber(value: string | number) {\n        if (typeof value === \"number\") {\n            this._nextOrderNumber = value;\n        } else {\n            this._nextOrderNumber = parseInt(value.replace(/#/g, \"\"));\n        }\n    }\n\n    /**\n     * The constructor of the `Customer` class.\n     *\n     * @param id the customer's database ID\n     * @param name the customer's name\n     * @param nextOrderNumber the next number to use when this customer places an order\n     */\n    constructor(id: number, name: string, nextOrderNumber: string | number) {\n        this.id = id;\n        this.name = name;\n        this.nextOrderNumber = nextOrderNumber;\n        this.doInternalStuff();\n    }\n\n    /** A public method. To be called when an order is placed for this customer. */\n    onOrderPlaced(): void {\n        this._nextOrderNumber++;\n    }\n\n    /**\n     * A public method that's defined using an arrow function.\n     *\n     * TypeDoc knows to document this as a method rather than a property.\n     */\n    onOrderPlacedArrowFunction = (): void => {\n        this._nextOrderNumber++;\n    };\n\n    /** A protected method. */\n    protected isValid(): boolean {\n        return this._nextOrderNumber >= 0;\n    }\n\n    /** A private method. */\n    private doInternalStuff(): void {\n        // does nothing\n    }\n}\n\n/**\n * A class that extends {@link Customer | `Customer`}.\n *\n * Notice how TypeDoc shows the inheritance hierarchy for our class.\n */\nexport class DeliveryCustomer extends Customer {\n    /** A property defined on the subclass. */\n    preferredCourierId?: number;\n\n    /** Another property defined on the subclass. */\n    readonly subscriptionType: \"basic\" | \"enterprise\";\n\n    /**\n     * The constructor of the `DeliveryCustomer` class.\n     *\n     * @param id the customer's database ID\n     * @param name the customer's name\n     * @param nextOrderNumber the next number to use when this customer places an order\n     * @param subscriptionType whether this customer has a basic or enterprise subscription\n     */\n    constructor(\n        id: number,\n        name: string,\n        nextOrderNumber: string | number,\n        subscriptionType: \"basic\" | \"enterprise\",\n    ) {\n        super(id, name, nextOrderNumber);\n        this.subscriptionType = subscriptionType;\n    }\n\n    /**\n     * An example of overriding a protected method.\n     *\n     * A `DeliveryCustomer` can only have a preferred courier if its\n     * subscription type is enterprise.\n     */\n    protected isValid(): boolean {\n        if (!super.isValid()) return false;\n        if (this.subscriptionType === \"enterprise\") return true;\n\n        return typeof this.preferredCourierId === \"undefined\";\n    }\n}\n\n/**\n * A class that extends {@link Customer | `Customer`}.\n *\n * Notice how TypeDoc shows the inheritance hierarchy for our class.\n */\nexport class WalkInCustomer extends Customer {\n    /** A property defined on the subclass. */\n    trustedCustomer?: boolean;\n\n    /** A private property defined on the subclass. */\n    private _ordersPlacedCount: number = 0;\n\n    /**\n     * An example of overriding a public method.\n     */\n    onOrderPlaced(): void {\n        super.onOrderPlaced();\n\n        this._ordersPlacedCount++;\n\n        if (\n            this._ordersPlacedCount > 10 &&\n            typeof this.trustedCustomer === \"undefined\"\n        ) {\n            this.trustedCustomer = true;\n        }\n    }\n}\n"
  },
  {
    "path": "example/src/classes/StringArray.ts",
    "content": "/**\n * An array of strings that's defined as\n *\n * ```\n * export class StringArray extends Array<string> {\n *     // ...\n * }\n * ```\n *\n * Notice how TypeDoc has substituted `string` for the generic type argument in all\n * the methods inherited from `Array`. For example, the `values` method returns\n * `IterableIterator<string>`.\n */\nexport class StringArray extends Array<string> {\n    /** A method that extends the functionality of a basic JavaScript array. */\n    customMethod(): void {\n        // do something awesome\n    }\n}\n"
  },
  {
    "path": "example/src/classes/index.ts",
    "content": "export * from \"./CancellablePromise\";\nexport * from \"./Customer\";\nexport * from \"./StringArray\";\n"
  },
  {
    "path": "example/src/documents/external-markdown.md",
    "content": "---\ntitle: External Markdown\ncategory: Documents\n---\n\n# External Markdown\n\nIt can be convenient to write long-form guides/tutorials outside of doc comments.\nTo support this, TypeDoc supports including documents (like this page!) which exist\nas standalone `.md` files in your repository.\n\n## Including Documents\n\nThese documents can be included in your generated documentation in a few ways.\n\n1. With the [`@document`](https://typedoc.org/tags/document/) tag.\n2. With the [projectDocuments] option.\n3. As a child of another document using yaml frontmatter.\n\n### The `@document` Tag\n\nThe `@document` tag can be placed in the comments for most types to add\na child to that reflection in the generated documentation. The content of\nthe `@document` tag should simply be a path to a markdown document to be\nincluded in the site. As an example, the [tag which caused this file](https://github.com/TypeStrong/typedoc/blob/master/example/src/index.ts#L7)\nto be included in the example site was formatted as:\n\n```ts\n/**\n * @document documents/external-markdown.md\n */\n```\n\nThe document path is relative to the file in which the comment appears in.\n\n### Project Documents\n\nIf your project has multiple entry points, the `@document` tag cannot be used\nto place documents at the top level of the project as there is no comment location\nassociated with the project. For this use case, specify the [projectDocuments]\noption. This option can be specified multiple times, or a glob may be specified\nto include multiple documents.\n\n```jsonc\n// typedoc.json\n{\n    \"projectDocuments\": [\"documents/*.md\"],\n}\n```\n\nTypeDoc's default [sorting](https://typedoc.org/options/organization/#sort) options\nwill cause project documents to be re-ordered alphabetically. If not desired, sorting\nfor entry points can be disabled with the [sortEntryPoints](https://typedoc.org/options/organization/#sortentrypoints)\noption.\n\n## Document Content\n\nDocuments may include a yaml frontmatter section which can be used to control\nsome details about the document.\n\n```yaml\n---\ntitle: External Markdown\ngroup: Documents\ncategory: Guides\nchildren:\n    - ./child.md\n    - ./child2.md\n---\n```\n\nThe `title` key specifies the document name, which will be used in the sidebar\nnavigation. The `group` and `category` keys are equivalent to the\n[`@group`](https://typedoc.org/tags/group/)and [`@category`](https://typedoc.org/tags/category/)\ntags and control how the document shows up in the Index section on the page\nfor the reflection which owns the document. The `children` key can be used to specify\nadditional documents which should be added underneath the current document.\n\nDocuments may include relative links to images or other files/documents. TypeDoc\nwill detect links within markdown `[text](link)` formatted links, `<a>` tags\nand `<img>` tags and automatically resolve them to other documents in the project.\n\nif a path cannot be resolved to a part of the documentation, TypeDoc will copy\nthe file found to a `media` folder in your generated documentation and update the\nlink to point to it, so relative links to images will still work.\n\nDocuments may also include `{@link}` inline tags, which will be resolved as\n[declaration references](https://typedoc.org/guides/declaration-references/) by\nTypeDoc.\n\n[this page]: https://github.com/TypeStrong/typedoc/blob/master/example/src/documents/external-markdown.md\n[projectDocuments]: https://typedoc.org/options/input/#projectdocuments\n"
  },
  {
    "path": "example/src/documents/include-code.md",
    "content": "## The `@includeCode` Tag\n\nFor convenience, an `@includeCode` inline tag is also recognized, which will include the referenced file within a code block, using the file extension for selecting the syntax highlighting language.\nAs an example, this file is inserting the code block below using:\n\n```md\n{@includeCode ../reexports.ts}\n```\n\n**Result:**\n{@includeCode ../reexports.ts}\n\n{@include ../../../site/tags/include.md#includePartsOfFiles}\n"
  },
  {
    "path": "example/src/documents/include.md",
    "content": "---\ntitle: Include and Include Code\ncategory: Documents\n---\n\n# Including other files\n\nIt can be convenient to write long-form guides/tutorials outside of doc comments.\nTo support this, TypeDoc supports including documents (like this page!) which exist\nas standalone `.md` files in your repository.\nThese files can then import other files using the `@include` tag.\n\nFor example, the rest of this page is imported from `include-code.md` using:\n\n```md\n{@include ./include-code.md}\n```\n\n{@include ./include-code.md}\n"
  },
  {
    "path": "example/src/documents/markdown.md",
    "content": "---\ntitle: Markdown Showcase\ncategory: Documents\n---\n\n# Markdown Showcase\n\nAll comments are parsed as **Markdown**. TypeDoc uses the\n[markdown-it](https://github.com/markdown-it/markdown-it) markdown parser to _convert\ncomments to HTML_.\n\nTypeDoc also supports including arbitrary Markdown documents in your site. These can be top level\ndocuments added with the `--projectDocuments` option or added with the `@document` tag.\n\n## Symbol References\n\nYou can link to other classes, members or functions using an inline link tag. See the [TypeDoc documentation](https://typedoc.org/tags/link/) for\ndetails.\n\n## Code in Doc Comments\n\nSome inline code: `npm install --save-dev typedoc`\n\nA TypeScript code block:\n\n```\n// A fabulous variable\nconst x: number | string = 12\n```\n\nSee [the syntax highlighting showcase](./syntax-highlighting.md) for more code blocks.\n\n## A List\n\n- 🥚 ~~Eggs~~\n- 🍞 Bread\n- 🧀 Swiss cheese\n\n## A Table\n\n| Package | Version |\n| ------- | ------- |\n| lodash  | 4.17.21 |\n| react   | 17.0.2  |\n| typedoc | 0.22.4  |\n\nA Random Shakespeare Quote\n\n---\n\n> Rebellious subjects, enemies to peace, Profaners of this neighbour-stained\n> steel,-- Will they not hear? What, ho! you men, you beasts, That quench the\n> fire of your pernicious rage With purple fountains issuing from your veins\n\n## An Image\n\n<img src=\"../../media/typescript-logo.svg\" width=\"120\" />\n\n## Alerts\n\nGitHub supports [alerts](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts)\nto highlight important content. TypeDoc also recognizes alerts and will style them similarly to GitHub.\n\nTo use an alert, include a blockquote in any markdown content which starts with an alert tag:\n\n- `[!NOTE]`\n- `[!TIP]`\n- `[!IMPORTANT]`\n- `[!WARNING]`\n- `[!CAUTION]`\n\n```md\n> [!NOTE]\n> Useful information that users should know, even when skimming content.\n```\n\n> [!NOTE]\n> Useful information that users should know, even when skimming content.\n\n> [!TIP]\n> Helpful advice for doing things better or more easily.\n\n> [!IMPORTANT]\n> Key information users need to know to achieve their goal.\n\n> [!WARNING]\n> Urgent info that needs immediate user attention to avoid problems.\n\n> [!CAUTION]\n> Advises about risks or negative outcomes of certain actions.\n"
  },
  {
    "path": "example/src/documents/syntax-highlighting.md",
    "content": "---\ntitle: Syntax Highlighting\ncategory: Documents\n---\n\nTypeDoc supports code blocks in Markdown and uses\n[Shiki](https://shiki.matsu.io/) to provide syntax highlighting.\n\nTypeDoc supports all languages supported by Shiki, but does not load all of\nthem by default. The `highlightLanguages` option can be used to customize\nwhich languages are loaded for highlighting. The `ignoredHighlightLanguages`\noption can be used to specify languages which should not be highlighted.\n\nIf no language is specified, the code block is assumed to be TypeScript:\n\n```\n// A fabulous variable\nconst x: number | string = 12\n```\n\nYou can specify the language at the start of your code block like this:\n\n````text\n```rust\n````\n\nUse the `tsx` language to get JSX support:\n\n```tsx\nfunction BasicComponent(): ReactElement {\n    return <div>Test</div>;\n}\n```\n\nYou might want to write code in the language your backend uses. Here's some\nPython:\n\n```python\nfor i in range(30):\n    print(i + 1)\n```\n\nAnd some CSS:\n\n```css\n.card {\n    background-color: white;\n    padding: 1rem;\n    border: 1px solid lightgray;\n}\n```\n\nIf you don't want syntax highlighting, use the `text` language:\n\n```text\npackage.json\nsrc/\n    index.ts\n    __tests__/\n        index.test.ts\n```\n\n[**View the full list of supported\nlanguages.**](https://github.com/shikijs/shiki/blob/main/docs/languages.md#all-languages)\nYou can also get this list by running `typedoc --help`.\n"
  },
  {
    "path": "example/src/enums.ts",
    "content": "/** Describes the status of a delivery order. */\n\n// #region simpleEnumRegion\n// #region simpleEnum\nexport enum SimpleEnum {\n    /** This order has just been placed and is yet to be processed. */\n    Pending,\n\n    /** A courier is en route delivering this order. */\n    InProgress,\n\n    /** The order has been delivered. */\n    Complete = \"COMPLETE\",\n}\n// #endregion simpleEnum\n// #endregion simpleEnumRegion\n\n/**\n * [A crazy enum from the TypeScript\n * handbook](https://www.typescriptlang.org/docs/handbook/enums.html#computed-and-constant-members).\n * This enum contains both constant and computed members.\n *\n * TypeDoc won't show the value of computed members since this information is\n * only available at runtime.\n */\nexport enum CrazyEnum {\n    // constant members\n    None,\n    Read = 1 << 1,\n    Write = 1 << 2,\n    ReadWrite = Read | Write,\n    // computed member\n    ComputedMember = \"123\".length,\n}\n\n/**\n * Since TypeScript's `enum` can be inconvenient to work with, some packages define their own enum-like objects:\n *\n * ```\n * export const EnumLikeObject = {\n *     Pending: 'pending',\n *     InProgress: 'inProgress',\n *     Completed: 'completed'\n * } as const\n * ```\n *\n * Use the `@enum` tag to make TypeDoc document this object as an enum.\n *\n * @enum\n */\nexport const EnumLikeObject = {\n    Pending: \"pending\",\n\n    /** Indicates that a courier is en route delivering this order. */\n    InProgress: \"inProgress\",\n\n    Completed: \"completed\",\n} as const;\n\n/**\n * Since TypeScript's `enum` can be inconvenient to work with, some packages define their own enum-like objects:\n *\n * ```\n * export const EnumLikeObjectNumValues = {\n *     Pending: 1,\n *     InProgress: 2,\n *     Completed: 3\n * } as const\n * ```\n *\n * Use the `@enum` tag to make TypeDoc document this object as an enum.\n *\n * @enum\n */\nexport const EnumLikeObjectNumValues = {\n    Pending: 1,\n\n    /** Indicates that a courier is en route delivering this order. */\n    InProgress: 2,\n\n    Completed: 3,\n} as const;\n"
  },
  {
    "path": "example/src/functions.ts",
    "content": "/**\n * Calculates the square root of a number.\n *\n * @param x the number to calculate the root of.\n * @returns the square root if `x` is non-negative or `NaN` if `x` is negative.\n */\nexport function sqrt(x: number): number {\n    return Math.sqrt(x);\n}\n\n/**\n * Calculates the square root of a number.\n *\n * `sqrtArrowFunction` is defined using a variable declaration:\n *\n * ```\n * export const sqrtArrowFunction = (x: number): number => Math.sqrt(x);\n * ```\n *\n * TypeDoc is smart and documents `sqrtArrowFunction` as a function rather than a variable.\n *\n * @param x the number do calculate the root of.\n * @returns the square root if `x` is non-negative or `NaN` if `x` is negative.\n */\nexport const sqrtArrowFunction = (x: number): number => Math.sqrt(x);\n\n/**\n * A simple generic function that concatenates two arrays.\n *\n * Use [`@typeParam <param name>`](https://typedoc.org/tags/typeParam/)\n * to document generic type parameters, e.g.\n *\n * ```text\n * @typeParam T the element type of the arrays\n * ```\n *\n * @typeParam T the element type of the arrays\n */\nexport function concat<T>(array1: T[], array2: T[]): T[] {\n    return array1.concat(array2);\n}\n\n/**\n * The options type for {@link makeHttpCallA}.\n */\nexport interface MakeHttpCallAOptions {\n    url: string;\n\n    /** e.g. GET, POST, PUT, DELETE */\n    method: string;\n\n    /** e.g. `{ 'Authorization': 'Bearer <access token>' }` */\n    headers: Record<string, string>;\n    body: string | Blob | FormData;\n    mode: \"cors\" | \"no-cors\" | \"same-origin\";\n}\n\n/**\n * A function that takes in an options object that is defined as a separate\n * interface and makes an HTTP call.\n *\n * **Make sure to export the options type when using this pattern.** Otherwise,\n * TypeDoc will not document the options.\n */\nexport function makeHttpCallA(\n    options: MakeHttpCallAOptions,\n): Promise<Response> {\n    const { url, method, headers, body, mode } = options;\n\n    return fetch(url, { method, headers, body, mode });\n}\n\n/**\n * A function that takes in an options object and makes an HTTP call.\n *\n * The options type is written directly in the function definition.\n */\nexport function makeHttpCallB(options: {\n    url: string;\n\n    /** e.g. GET, POST, PUT, DELETE */\n    method: string;\n\n    /** e.g. `{ 'Authorization': 'Bearer <access token>' }` */\n    headers: Record<string, string>;\n\n    body: string | Blob | FormData;\n    mode: \"cors\" | \"no-cors\" | \"same-origin\";\n}): Promise<Response> {\n    const { url, method, headers, body, mode } = options;\n\n    return fetch(url, { method, headers, body, mode });\n}\n\n/**\n * Stringifies and concatenates two numbers into a single string.\n *\n * The documentation site allows you to toggle between the different overloads\n * of a function. The implementation signature of the overloaded function is not\n * included in the documentation.\n */\nexport function overloadedFunction(a: number, b: number): string;\n\n/**\n * Concatenates two strings.\n *\n * The documentation site allows you to toggle between the different overloads\n * of a function. The implementation signature of the overloaded function is not\n * included in the documentation.\n */\nexport function overloadedFunction(a: string, b: string): string;\n\nexport function overloadedFunction(a: unknown, b: unknown): string {\n    return (\n        (a as { toString(): string }).toString() +\n        (b as { toString(): string }).toString()\n    );\n}\n"
  },
  {
    "path": "example/src/index.ts",
    "content": "/**\n * @packageDocumentation\n * @categoryDescription Component\n * React Components -- This description is added with the `@categoryDescription` tag\n * on the entry point in src/index.ts\n *\n * @document documents/external-markdown.md\n * @document documents/markdown.md\n * @document documents/syntax-highlighting.md\n * @document documents/include.md\n */\nexport * from \"./classes\";\nexport * from \"./enums\";\nexport * from \"./functions\";\nexport * from \"./internals\";\nexport * from \"./reactComponents\";\nexport * from \"./reexports\";\nexport * from \"./types\";\nexport * from \"./variables\";\n"
  },
  {
    "path": "example/src/internals.ts",
    "content": "/**\n * @internal\n *\n * Use `@internal` to indicate that something is for internal use. If the\n * `--excludeInternal` option is passed, TypeDoc will not document the given\n * code.\n */\nexport function anInternalFunction(): void {\n    // does nothing\n}\n\n/**\n * @ignore\n *\n * `@hidden` and `@ignore` keep the subsequent code from being documented.\n */\nexport function willNotBeDocumented(target: any, value: number): number {\n    return 0;\n}\n"
  },
  {
    "path": "example/src/reactComponents.tsx",
    "content": "import { PropsWithChildren, ReactElement } from \"react\";\n\n/**\n * The props type for {@link CardA}.\n */\nexport interface CardAProps {\n    /** The theme of the card. Defaults to `primary`. */\n    variant: \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"light\" | \"dark\";\n}\n\n/**\n * Renders a card around some content.\n *\n * ```tsx\n * <CardA variant=\"secondary\">\n *     <h5>My Title</h5>\n *     <p>My content</p>\n * </CardA>\n * ```\n *\n * The props type is defined as a separate interface **which must be exported!**\n *\n * ```\n * export interface CardAProps {\n *     // ...\n * }\n *\n * export function CardA({\n *     children,\n *     variant = \"primary\",\n * }: PropsWithChildren<CardAProps>): ReactElement {\n *     // ...\n * }\n * ```\n *\n * This is our recommended way to define React components as it makes your code\n * more readable. The minor drawback is you must click the `CardAProps` link to\n * see the component's props.\n *\n * @category Component\n */\nexport function CardA({ children, variant = \"primary\" }: PropsWithChildren<CardAProps>): ReactElement {\n    return <div className={`card card-${variant}`}>{children}</div>;\n}\n\n/**\n * Renders a card around some content.\n *\n * ```tsx\n * <CardB variant=\"secondary\">\n *     <h5>My Title</h5>\n *     <p>My content</p>\n * </CardB>\n * ```\n *\n * The props type is written directly in the function definition:\n *\n * ```\n * export function CardB({\n *     children,\n *     variant = \"primary\",\n * }: PropsWithChildren<{\n *     variant: \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"light\" | \"dark\";\n * }>): ReactElement {\n *     // ...\n * }\n * ```\n *\n * This can make the TypeDoc documentation a bit cleaner for very simple components,\n * but it makes your code less readable.\n *\n * @category Component\n */\nexport function CardB({\n    children,\n    variant = \"primary\",\n}: PropsWithChildren<{\n    /** The theme of the card. Defaults to `primary`. */\n    variant: \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"light\" | \"dark\";\n}>): ReactElement {\n    return <div className={`card card-${variant}`}>{children}</div>;\n}\n\n/** The props type of {@link EasyFormDialog | `EasyFormDialog`}. */\nexport interface EasyFormDialogProps {\n    /** The title of the dialog. Can be a JSX element. */\n    title: React.ReactNode;\n\n    /** The text of the submit button. */\n    submitButtonText: string;\n\n    /** The CSS class of the submit button. */\n    submitButtonClass?: string;\n\n    /** The text of the cancel button. Defaults to \"Cancel\". */\n    cancelButtonText?: string;\n\n    /**\n     * Allows you to disable the submit button even if `getSubmitEnabled()`\n     * would return true.\n     *\n     * This can be useful if you want to disable the submit button while a query\n     * is in progress.\n     */\n    submitEnabled?: boolean;\n\n    /** A boolean indicating if the form is valid. */\n    formIsValid: boolean;\n\n    /** A boolean indicating if validation feedback is being shown. */\n    showValidation: boolean;\n\n    /** A callback that fires when the dialog is submitted. */\n    onShowValidationChange(showValidation: boolean): void;\n\n    /**\n     * A callback that fires after the `submit` function succeeds.\n     *\n     * If the `submit` function returned `responseData`, it is passed to your\n     * `onSuccess` function.\n     *\n     * Your `onSuccess` callback must return a promise. The submit button will\n     * continue showing a loading indicator until the promise resolves. This is\n     * to support refetching the data that was updated by the form submission.\n     */\n    onSuccess(payload: unknown | undefined): Promise<void>;\n\n    /**\n     * A callback that fires when the dialog has completely closed. Your\n     * `onClose` callback should update call, for example,\n     * `setDialogVisible(false)` so that the `EasyFormDialog` is no longer\n     * rendered.\n     */\n    onClose(): void;\n\n    /**\n     * A callback that fires when the form is submitted. You will typically\n     * perform an API call in your `submit` function.\n     *\n     * Your `submit` function can optionally return an object in the shape\n     *\n     * ```\n     * {\n     *     shouldClose?: boolean\n     *     responseData: unknown\n     * }\n     * ```\n     *\n     * Using `formData` is deprecated. Use controlled components instead.\n     *\n     * `formData` will be `{}` if the optional peer dependency `jquery` is not\n     * installed.\n     */\n    onSubmit(formData: Record<string, string | boolean>):\n        | Promise<\n            | {\n                shouldClose?: boolean;\n                responseData: unknown;\n            }\n            | undefined\n        >\n        | Promise<void>;\n\n    /**\n     * An uncommonly-used callback that fires when the user clicks the cancel button.\n     */\n    onCancel?(): void;\n\n    /**\n     * This prop accepts a ref object that holds a function of type `() =>\n     * void`. You can execute the function to programmatically close the dialog:\n     *\n     * ```\n     * closeRef.current()\n     * ```\n     */\n    closeRef?: React.MutableRefObject<() => void>;\n\n    /** The CSS class added to the underlying Bootstrap modal. */\n    modalClass?: string;\n\n    /**\n     * Set to `false` to disable the default behavior of focusing the first\n     * input.\n     */\n    focusFirst?: boolean;\n\n    /**\n     * Set to `false` to hide the modal footer, which contains the submit and\n     * cancel buttons.\n     */\n    showFooter?: boolean;\n}\n\n/**\n * An example of a complex React component.\n *\n * A wrapper around `ActionDialog` that removes a lot of the boilerplate needed\n * for dialogs that contain a form.\n *\n * ```tsx\n * interface ExampleProps {\n *     onSuccess(responseData: number): Promise<void>\n *     onClose(): void\n * }\n *\n * export function Example({\n *     onSuccess,\n *     onClose,\n * }: ExampleProps): ReactElement {\n *     const { onChildValidChange, allFieldsValid } = useFieldValidity()\n *     const [showValidation, setShowValidation] = useState(false)\n *     const vProps = { showValidation, onValidChange: onChildValidChange }\n *\n *     const [myNumber, setMyNumber] = useState('')\n *\n *     async function submit() {\n *         await api.product.performOperation()\n *\n *         return {\n *             responseData: parseInt(myNumber),\n *         }\n *     }\n *\n *     return (\n *         <EasyFormDialog\n *             title=\"Enter a Number\"\n *             submitButtonText=\"Submit\"\n *             formIsValid={allFieldsValid}\n *             showValidation={showValidation}\n *             onShowValidationChange={setShowValidation}\n *             onSubmit={submit}\n *             onSuccess={onSuccess}\n *             onClose={onClose}\n *         >\n *             <FormGroup label=\"My number\">\n *                 {(id) => (\n *                     <ValidatedInput\n *                         id={id}\n *                         name=\"myNumber\"\n *                         validators={[Validators.required(), Validators.integer()]}\n *                         value={myNumber}\n *                         onChange={setMyNumber}\n *                         {...vProps}\n *                     />\n *                 )}\n *             </FormGroup>\n *         </EasyFormDialog>\n *     )\n * }\n * ```\n * @category Component\n */\nexport function EasyFormDialog(props: PropsWithChildren<EasyFormDialogProps>): ReactElement {\n    return <div />;\n}\n"
  },
  {
    "path": "example/src/reexports.ts",
    "content": "/**\n * Here is a useful function re-exported from Lodash.\n */\nexport { sortBy as lodashSortBy } from \"lodash\";\n"
  },
  {
    "path": "example/src/types.ts",
    "content": "/** A simple type alias defined using the `type` keyword. */\nexport type SimpleTypeAlias = string | number | boolean;\n\n/** A complex generic type. */\nexport type ComplexGenericTypeAlias<T> =\n    | T\n    | T[]\n    | Promise<T>\n    | Promise<T[]>\n    | Record<string, Promise<T>>;\n\n/**\n * A simple interface. Each property has its own doc comment.\n *\n * TypeDoc even supports doc comments on nested type definitions, as shown by the `name` property.\n */\nexport interface User {\n    /** The user's ID. */\n    id: number;\n\n    /** The user's email address. */\n    email: string;\n\n    /** The user's name. */\n    name: {\n        /** The person's given name. */\n        first: string;\n\n        /** The person's family name. */\n        last: string;\n    };\n}\n\n/**\n * An interface that extends {@link User | `User`} and adds more properties.\n *\n * Notice how TypeDoc automatically shows the inheritance hierarchy and where\n * each property was originally defined.\n */\nexport interface AdminUser extends User {\n    administrativeArea: \"sales\" | \"delivery\" | \"billing\";\n    jobTitle: string;\n}\n"
  },
  {
    "path": "example/src/variables.ts",
    "content": "/** A simple numeric constant. */\nexport const PI = 3.14159265359;\n\n/** A simple string constant. */\nexport const STRING_CONSTANT = \"FOOBAR\";\n\n/** An plain JavaScript object using `as const`. */\nexport const ObjectConstant = {\n    library: \"typedoc\",\n    version: \"1.2.3\",\n\n    /** How many people starred us on GitHub. */\n    githubStars: 1_000_000,\n} as const;\n\n/**\n * An exported variable defined with `let`.\n *\n * This pattern should generally be avoided because the variable can be reassigned.\n */\n// eslint-disable-next-line prefer-const\nexport let E = 2.718281828459045235;\n"
  },
  {
    "path": "example/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"ESNext\", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */\n        \"jsx\": \"react-jsx\", /* Specify what JSX code is generated. */\n        \"experimentalDecorators\": true, /* Enable experimental support for TC39 stage 2 draft decorators. */\n\n        /* Modules */\n        \"module\": \"ESNext\", /* Specify what module code is generated. */\n        \"moduleResolution\": \"node\", /* Specify how TypeScript looks up a file from a given module specifier. */\n        \"baseUrl\": \"./src\", /* Specify the base directory to resolve non-relative module names. */\n\n        /* Emit */\n        \"noEmit\": true, /* Disable emitting files from a compilation. */\n\n        /* Interop Constraints */\n        \"esModuleInterop\": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */\n        \"forceConsistentCasingInFileNames\": true, /* Ensure that casing is correct in imports. */\n\n        /* Type Checking */\n        \"strict\": true, /* Enable all strict type-checking options. */\n        \"noFallthroughCasesInSwitch\": true, /* Enable error reporting for fallthrough cases in switch statements. */\n\n        /* Completeness */\n        \"skipLibCheck\": true /* Skip type checking all .d.ts files. */\n    }\n}\n"
  },
  {
    "path": "example/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"name\": \"TypeDoc Example\",\n    \"entryPoints\": [\"./src\"],\n    \"sort\": [\"source-order\"],\n    \"categorizeByGroup\": false,\n    \"searchCategoryBoosts\": {\n        \"Component\": 2,\n        \"Model\": 1.2\n    },\n    \"searchGroupBoosts\": {\n        \"Classes\": 1.5\n    },\n    \"hostedBaseUrl\": \"https://typedoc.org/example/\",\n    \"navigationLinks\": {\n        \"Docs\": \"https://typedoc.org\",\n        \"API\": \"https://typedoc.org/api/index.html\",\n        \"GitHub\": \"https://github.com/TypeStrong/typedoc\"\n    },\n    \"highlightLanguages\": [\n        \"typescript\",\n        \"tsx\",\n        \"css\",\n        \"json\",\n        \"jsonc\",\n        \"python\",\n        \"yaml\",\n        \"markdown\"\n    ],\n    \"markdownItOptions\": {\n        \"html\": true\n    },\n    \"suppressCommentWarningsInDeclarationFiles\": true\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"typedoc\",\n    \"description\": \"Create api documentation for TypeScript projects.\",\n    \"version\": \"0.28.17\",\n    \"homepage\": \"https://typedoc.org\",\n    \"type\": \"module\",\n    \"exports\": {\n        \".\": \"./dist/index.js\",\n        \"./tsdoc.json\": \"./tsdoc.json\",\n        \"./typedoc-config.schema.json\": \"./typedoc-config.schema.json\",\n        \"./package.json\": \"./package.json\",\n        \"./models\": \"./dist/lib/models/index.js\",\n        \"./browser\": \"./dist/browser-utils.js\",\n        \"./browser/*\": \"./dist/browser-locales/*.js\",\n        \"./debug\": \"./dist/lib/debug/index.js\",\n        \"./debug/*\": \"./dist/lib/debug/*.js\"\n    },\n    \"types\": \"./dist/index.d.ts\",\n    \"bin\": {\n        \"typedoc\": \"bin/typedoc\"\n    },\n    \"license\": \"Apache-2.0\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git://github.com/TypeStrong/TypeDoc.git\"\n    },\n    \"bugs\": {\n        \"url\": \"https://github.com/TypeStrong/TypeDoc/issues\"\n    },\n    \"engines\": {\n        \"node\": \">= 18\",\n        \"pnpm\": \">= 10\"\n    },\n    \"dependencies\": {\n        \"@gerrit0/mini-shiki\": \"^3.23.0\",\n        \"lunr\": \"^2.3.9\",\n        \"markdown-it\": \"^14.1.1\",\n        \"minimatch\": \"^10.2.4\",\n        \"yaml\": \"^2.8.2\"\n    },\n    \"peerDependencies\": {\n        \"typescript\": \"5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x\"\n    },\n    \"devDependencies\": {\n        \"@eslint/js\": \"^10.0.1\",\n        \"@types/lunr\": \"^2.3.7\",\n        \"@types/markdown-it\": \"^14.1.2\",\n        \"@types/mocha\": \"^10.0.10\",\n        \"@types/node\": \"18\",\n        \"@typestrong/fs-fixture-builder\": \"github:TypeStrong/fs-fixture-builder#34113409e3a171e68ce5e2b55461ef5c35591cfe\",\n        \"c8\": \"^11.0.0\",\n        \"dprint\": \"^0.52.0\",\n        \"esbuild\": \"^0.27.3\",\n        \"eslint\": \"^10.0.2\",\n        \"mocha\": \"^11.7.5\",\n        \"puppeteer\": \"^24.37.5\",\n        \"semver\": \"^7.7.4\",\n        \"tsx\": \"^4.21.0\",\n        \"typescript\": \"5.9.3\",\n        \"typescript-eslint\": \"^8.56.1\"\n    },\n    \"files\": [\n        \"/bin\",\n        \"!*.map\",\n        \"/dist\",\n        \"!/dist/tmp\",\n        \"!/dist/.tsbuildinfo\",\n        \"!/dist/test\",\n        \"/LICENSE\",\n        \"/static\",\n        \"/tsdoc.json\",\n        \"/typedoc-config.schema.json\"\n    ],\n    \"scripts\": {\n        \"test\": \"mocha --config .config/mocha.fast.json\",\n        \"test:cov\": \"c8 -r lcov mocha --config .config/mocha.fast.json\",\n        \"doc:c\": \"node bin/typedoc --tsconfig src/test/converter/tsconfig.json\",\n        \"doc:cd\": \"node --inspect-brk dist/lib/cli.js --tsconfig src/test/converter/tsconfig.json\",\n        \"doc:c2\": \"node bin/typedoc --options src/test/converter2 --tsconfig src/test/converter2/tsconfig.json\",\n        \"doc:c2d\": \"node --inspect-brk dist/lib/cli.js --options src/test/converter2 --tsconfig src/test/converter2/tsconfig.json\",\n        \"example\": \"cd example && node ../bin/typedoc\",\n        \"test:full\": \"c8 -r lcov -r text-summary mocha --config .config/mocha.full.json\",\n        \"rebuild_specs\": \"node scripts/rebuild_specs.js\",\n        \"build\": \"pnpm build:tsc && pnpm build:locales && pnpm build:themes\",\n        \"build:tsc\": \"tsc --project .\",\n        \"build:themes\": \"node scripts/build_themes.js\",\n        \"build:locales\": \"node scripts/build_browser_translations.js\",\n        \"build:prod\": \"pnpm build:prod:tsc && pnpm build:locales && pnpm build:themes && node scripts/generate_options_schema.js typedoc-config.schema.json\",\n        \"build:prod:tsc\": \"tsc --project . --sourceMap false --declarationMap false\",\n        \"lint\": \"eslint . --max-warnings 0 && dprint check\",\n        \"prepack\": \"node scripts/set_strict.js false && pnpm build:prod\",\n        \"prepare\": \"node scripts/prepare.mjs\",\n        \"postpublish\": \"node scripts/set_strict.js true\"\n    },\n    \"keywords\": [\n        \"typescript\",\n        \"documentation\",\n        \"generator\"\n    ],\n    \"c8\": {\n        \"extension\": [\n            \".ts\",\n            \".tsx\"\n        ],\n        \"reporter\": [\n            \"html-spa\",\n            \"text-summary\"\n        ],\n        \"exclude\": [\n            \"**/*.d.ts\",\n            \"src/test\",\n            \"tmp\"\n        ]\n    },\n    \"imports\": {\n        \"#utils\": {\n            \"typedoc-ts\": \"./src/lib/utils-common/index.ts\",\n            \"default\": \"./dist/lib/utils-common/index.js\"\n        },\n        \"#models\": {\n            \"typedoc-ts\": \"./src/lib/models/index.ts\",\n            \"default\": \"./dist/lib/models/index.js\"\n        },\n        \"#serialization\": {\n            \"typedoc-ts\": \"./src/lib/serialization/index.ts\",\n            \"default\": \"./dist/lib/serialization/index.js\"\n        },\n        \"#node-utils\": {\n            \"typedoc-ts\": \"./src/lib/utils/index.ts\",\n            \"default\": \"./dist/lib/utils/index.js\"\n        }\n    },\n    \"pnpm\": {\n        \"onlyBuiltDependencies\": [\n            \"dprint\",\n            \"esbuild\",\n            \"puppeteer\",\n            \"@typestrong/fs-fixture-builder\"\n        ]\n    }\n}\n"
  },
  {
    "path": "scripts/build_browser_translations.js",
    "content": "// @ts-check\n\nimport ts from \"typescript\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Logger, Options, TSConfigReader } from \"typedoc\";\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { ok } from \"node:assert\";\nimport { createRequire } from \"node:module\";\n\nconst browserBundleFolders = [\n    \"/utils-common/\",\n    \"/models/\",\n    \"/serialization/\",\n];\n\nconst localesDirTs = join(\n    fileURLToPath(import.meta.url),\n    \"../../src/lib/internationalization/locales\",\n);\n\nconst localesDir = join(\n    fileURLToPath(import.meta.url),\n    \"../../dist/lib/internationalization/locales\",\n);\n\nconst distDir = join(\n    fileURLToPath(import.meta.url),\n    \"../../dist/browser-locales\",\n);\n\nconst options = new Options();\nconst tsconfigReader = new TSConfigReader();\ntsconfigReader.read(options, new Logger(), process.cwd());\n\n/** @type {ts.LanguageServiceHost} */\nconst host = {\n    getScriptFileNames: () => options.getFileNames().slice(),\n    getScriptVersion: () => \"unused\",\n    getScriptSnapshot: (fileName) => {\n        if (!existsSync(fileName)) return undefined;\n        return ts.ScriptSnapshot.fromString(\n            readFileSync(fileName, \"utf-8\"),\n        );\n    },\n    getCurrentDirectory: () => process.cwd(),\n    getCompilationSettings: () => options.getCompilerOptions(),\n    getDefaultLibFileName: (opts) => ts.getDefaultLibFilePath(opts),\n    fileExists: ts.sys.fileExists,\n    readFile: ts.sys.readFile,\n    readDirectory: ts.sys.readDirectory,\n    directoryExists: ts.sys.directoryExists,\n    getDirectories: ts.sys.getDirectories,\n};\n\nconst service = ts.createLanguageService(\n    host,\n    ts.createDocumentRegistry(),\n);\n\nconst program = service.getProgram();\nok(program, \"Failed to get program for i18n analysis\");\n\nconst sf = program.getSourceFile(join(localesDirTs, \"en.cts\"));\nok(sf, \"Failed to get source file\");\n\nconst moduleSymbol = program.getTypeChecker().getSymbolAtLocation(sf);\nconst translatable = moduleSymbol?.exports?.get(\n    /** @type {ts.__String} */ (\"export=\"),\n);\nok(translatable, \"Failed to get translatable symbol\");\n\nok(translatable.valueDeclaration && ts.isExportAssignment(translatable.valueDeclaration));\nok(ts.isAsExpression(translatable.valueDeclaration.expression));\nok(\n    ts.isObjectLiteralExpression(\n        translatable.valueDeclaration.expression.expression,\n    ),\n);\nconst translatableObj = translatable.valueDeclaration.expression.expression;\n\n/** @type {string[]} */\nconst bundleUsedTranslationKeys = [];\n\ntranslatableObj.forEachChild((child) => {\n    ok(ts.isPropertyAssignment(child));\n    const refs = service.getReferencesAtPosition(\n        sf.fileName,\n        child.getStart(),\n    );\n\n    if (refs?.some(ref => browserBundleFolders.some(f => ref.fileName.includes(f)))) {\n        bundleUsedTranslationKeys.push(child.name.getText());\n    }\n});\n\nservice.dispose();\n\nconst req = createRequire(import.meta.url);\nconst enLocale = req(join(localesDir, \"en.cjs\"));\n\nrmSync(distDir, { recursive: true, force: true });\nmkdirSync(distDir, { recursive: true });\n\nfor (const locale of readdirSync(localesDir)) {\n    if (!locale.endsWith(\".cjs\")) continue;\n    console.log(`Processing ${locale}`);\n\n    const browserTranslations = {};\n    const translations = req(join(localesDir, locale));\n    for (const key of bundleUsedTranslationKeys) {\n        browserTranslations[key] = translations[key] || enLocale[key];\n    }\n\n    writeFileSync(\n        join(distDir, locale.replace(\".cjs\", \".js\")),\n        `export default ${JSON.stringify(browserTranslations, null, 4)}\\n`,\n    );\n\n    writeFileSync(\n        join(distDir, locale.replace(\".cjs\", \".d.ts\")),\n        `const translations: Record<string, string>;\\nexport default translations;\\n`,\n    );\n}\n"
  },
  {
    "path": "scripts/build_site.sh",
    "content": "#!/bin/bash\n# Expects to be executed in the typedoc repo root folder\nset -e\n\nnode bin/typedoc --help --logLevel Error > site/generated/help.txt\nnode scripts/generate_site_plugins.js\n\n# Build the API docs\nif [[ -n \"$CI\" || ! -d docs ]]; then\n    node bin/typedoc --html docs --json docs/docs.json --readme none\nfi\n\n# Build the example\nif [[ -n \"$CI\" || ! -d example/docs ]]; then\n    cd example\n    pnpm i\n    # Ignoring warnings here because we inherit from Array, which results in\n    # a few warnings because the docs in the .d.ts have bad @param comments\n    # We might want to change TypeDoc's validation logic to make this not a\n    # warning at some point if the relevant comments show up on both signatures.\n    pnpm run typedoc --logLevel Error\n    cd ..\nfi\n\n# Use changelog as of last release\ngit show $(git describe --tags --abbrev=0):CHANGELOG.md | sed 's/#* Unreleased//' > site/generated/CHANGELOG.md\n\n# Build the actual site, references the API docs\nnode bin/typedoc --options site/typedoc.config.jsonc --treatWarningsAsErrors\n\n# Create/copy static files\nnode scripts/generate_options_schema.js docs-site/schema.json\n# cspell: words googlede\ncp site/googlede482cdb17c37ad4.html docs-site/googlede482cdb17c37ad4.html\n\ncp -r example/docs docs-site/example\ncp -r docs docs-site/api\n"
  },
  {
    "path": "scripts/build_themes.js",
    "content": "// @ts-check\nimport esbuild from \"esbuild\";\nimport fs from \"node:fs\";\n\nconst watch = process.argv.slice(2).some((t) => t == \"--watch\" || t == \"-w\");\n\n// It's convenient to be able to build the themes in watch mode without rebuilding the whole docs\n// to test some change to the frontend JS.\n/** @type {esbuild.Plugin} */\nconst copyToDocsPlugin = {\n    name: \"copyToDocs\",\n    setup(build) {\n        if (watch) {\n            build.onEnd((result) => {\n                if (\n                    !result.errors.length &&\n                    fs.existsSync(\"docs/assets/main.js\")\n                ) {\n                    fs.copyFileSync(\"static/main.js\", \"docs/assets/main.js\");\n                }\n            });\n        }\n    },\n};\n\nasync function main() {\n    const context = await esbuild.context({\n        entryPoints: [\"src/lib/output/themes/default/assets/bootstrap.ts\"],\n        bundle: true,\n        minify: true,\n        outfile: \"static/main.js\",\n        logLevel: \"info\",\n        plugins: [copyToDocsPlugin],\n    });\n\n    await context.rebuild();\n\n    if (watch) {\n        await context.watch();\n    } else {\n        await context.dispose();\n    }\n}\n\nmain().catch((err) => {\n    console.error(err);\n    process.exitCode = 1;\n});\n"
  },
  {
    "path": "scripts/capture_screenshots.mjs",
    "content": "// @ts-check\nimport * as fs from \"fs\";\nimport { platform } from \"os\";\nimport { dirname, join, relative, resolve } from \"path\";\nimport { parseArgs } from \"util\";\nimport puppeteer from \"puppeteer\";\n\nconst viewport = { width: 1024, height: 768 };\n\nexport class PQueue {\n    /** @private @type {Array<() => Promise<void>>} */\n    _queued = [];\n    /** @param {number} concurrency */\n    constructor(concurrency) {\n        /** @private */\n        this._concurrency = concurrency;\n    }\n\n    /** @param {() => Promise<void>} action */\n    add(action) {\n        this._queued.push(action);\n    }\n\n    /** @returns {Promise<void>} */\n    run() {\n        return new Promise((resolve, reject) => {\n            /** @type {Promise<void>[]} */\n            const queue = [];\n            const doReject = (err) => {\n                this._queued.length = 0;\n                queue.length = 0;\n                reject(err);\n            };\n            const tick = () => {\n                while (queue.length < this._concurrency) {\n                    const next = this._queued.shift();\n                    if (next) {\n                        const nextPromise = Promise.resolve().then(next);\n                        queue.push(nextPromise);\n                        nextPromise.then(() => {\n                            void queue.splice(queue.indexOf(nextPromise), 1);\n                            tick();\n                        }, doReject);\n                    } else {\n                        break;\n                    }\n                }\n\n                if (queue.length === 0) {\n                    resolve();\n                }\n            };\n\n            tick();\n        });\n    }\n}\n\n/** @param {string} root */\nfunction findHtmlPages(root) {\n    /** @type {string[]} */\n    const result = [];\n\n    const queue = [root];\n    while (queue.length) {\n        const base = queue[0];\n        queue.shift();\n        for (const entry of fs.readdirSync(base, { withFileTypes: true })) {\n            if (entry.isFile()) {\n                if (entry.name.endsWith(\".html\")) {\n                    result.push(join(base, entry.name));\n                }\n            } else if (entry.isDirectory()) {\n                queue.push(join(base, entry.name));\n            }\n        }\n    }\n\n    return result;\n}\n\n/**\n * @param {string} baseDirectory\n * @param {string} outputDirectory\n * @param {number} jobs\n * @param {boolean} headless\n * @param {string} theme\n */\nexport async function captureScreenshots(\n    baseDirectory,\n    outputDirectory,\n    jobs,\n    headless,\n    theme,\n) {\n    await fs.promises.rm(outputDirectory, { force: true, recursive: true });\n    await fs.promises.mkdir(outputDirectory, { recursive: true });\n\n    const browser = await puppeteer.launch({\n        args: platform() === \"win32\"\n            ? []\n            : [\"--no-sandbox\", \"--disable-setuid-sandbox\"],\n        headless,\n    });\n\n    const queue = new PQueue(jobs);\n    const pages = findHtmlPages(resolve(baseDirectory));\n    let finished = 0;\n    console.log(`Processing ${pages.length} pages with ${jobs} workers`);\n    for (const file of pages) {\n        queue.add(async () => {\n            const outputPath = resolve(\n                outputDirectory,\n                relative(baseDirectory, file).replace(/\\.html$/, \".png\"),\n            );\n            fs.mkdirSync(dirname(outputPath), { recursive: true });\n\n            const context = await browser.createBrowserContext();\n            const page = await context.newPage();\n            await page.setViewport(viewport);\n            await page.goto(`file://${file}`, {\n                waitUntil: [\"domcontentloaded\"],\n            });\n\n            await page.evaluate(\n                `document.documentElement.dataset.theme = \"${theme}\"`,\n            );\n            await page.screenshot({\n                path: outputPath,\n                fullPage: true,\n            });\n\n            await context.close();\n            ++finished;\n            const percent = Math.floor((finished / pages.length) * 100);\n            console.log(`[${percent}%] ${relative(baseDirectory, file)}`);\n        });\n    }\n\n    await queue.run();\n\n    console.log(\"Finished!\");\n    await browser.close();\n}\n\nif (import.meta.url.endsWith(process.argv[1])) {\n    const args = parseArgs({\n        options: {\n            jobs: {\n                short: \"j\",\n                type: \"string\",\n                default: \"6\",\n            },\n            docs: {\n                short: \"d\",\n                type: \"string\",\n                default: \"./docs\",\n            },\n            output: {\n                short: \"o\",\n                type: \"string\",\n                default: \"./tmp/screenshots\",\n            },\n            debug: {\n                type: \"boolean\",\n                default: false,\n            },\n            theme: {\n                type: \"string\",\n                default: \"light\",\n            },\n        },\n    });\n\n    const jobs = parseInt(args.values.jobs || \"\");\n    const docs = args.values.docs || \"./docs\";\n    const output = args.values.output || \"./tmp/screenshots\";\n\n    const start = Date.now();\n    await fs.promises.rm(output, { recursive: true, force: true });\n    await captureScreenshots(\n        docs,\n        output,\n        jobs,\n        !args.values.debug,\n        args.values.theme || \"light\",\n    );\n    console.log(`Took ${(Date.now() - start) / 1000} seconds`);\n}\n"
  },
  {
    "path": "scripts/clone_api_users.js",
    "content": "#!/usr/bin/env node\n// @ts-check\n// Purpose: Download repos known to use TypeDoc's APIs for custom plugins/themes\n// which are NOT published to NPM. This is used to check potentially-breaking\n// changes which are likely not actually breaking anyone, so could be included\n// in a patch release with little risk.\n\nimport cp from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport { PQueue } from \"./capture_screenshots.mjs\";\nimport { ALL_API_USERS, API_USERS, OLD_API_USERS } from \"./data/api_users.js\";\nimport { parseArgs } from \"node:util\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport semver from \"semver\";\n\nif (import.meta.url.endsWith(process.argv[1])) {\n    const args = parseArgs({\n        options: {\n            jobs: {\n                short: \"j\",\n                type: \"string\",\n                default: \"6\",\n            },\n            rebuild: {\n                type: \"boolean\",\n                default: false,\n            },\n            all: {\n                type: \"boolean\",\n                default: false,\n            },\n            output: {\n                short: \"o\",\n                type: \"string\",\n                default: \"../typedoc_api_users\",\n            },\n        },\n    });\n\n    const rebuild = args.values.rebuild;\n    const outDir = args.values.output;\n    const jobs = parseInt(args.values.jobs) || 1;\n\n    /**\n     * @param {string[]} args\n     * @returns {Promise<void>}\n     */\n    const git = (...args) =>\n        new Promise((resolve, reject) => {\n            const child = cp.spawn(\"git\", args, { cwd: outDir, stdio: \"inherit\" });\n            child.on(\"close\", () => {\n                if (child.exitCode) reject(new Error(`When executing git ${args.join(\" \")}`));\n                resolve();\n            });\n        });\n\n    const start = Date.now();\n\n    if (rebuild) {\n        await fs.rm(outDir, { recursive: true, force: true });\n    }\n    await fs.mkdir(outDir, { recursive: true });\n\n    const q = new PQueue(jobs);\n\n    for (const { repo, branch, pkg = \"package.json\", filter } of args.values.all ? ALL_API_USERS : API_USERS) {\n        q.add(async () => {\n            const repoDir = `${repo.replace(\"/\", \"_\")}`;\n            if (!existsSync(`${outDir}/${repoDir}`)) {\n                await git(\n                    \"clone\",\n                    \"--quiet\",\n                    \"--filter=blob:none\",\n                    \"--no-checkout\",\n                    \"--depth=1\",\n                    `git@github.com:${repo}.git`,\n                    repoDir,\n                );\n            }\n\n            await git(\"-C\", repoDir, \"fetch\", \"--quiet\", \"--depth=1\", \"origin\", branch);\n\n            const filterArg = Array.isArray(filter) ? filter : [filter];\n            await git(\"-C\", repoDir, \"checkout\", \"--quiet\", branch, \"--\", pkg, ...filterArg);\n        });\n    }\n\n    try {\n        await q.run();\n    } catch (error) {\n        console.error(error);\n        process.exit(1);\n    }\n\n    console.log(`Cloning/updating took ${(Date.now() - start) / 1000} seconds`);\n    console.log(`Output is in ${args.values.output}`);\n\n    // Check for repos listed in the wrong list\n    const currentMinor = semver.parse(JSON.parse(readFileSync(\"package.json\", \"utf-8\")).version)?.minor;\n    console.log(\"Current minor is\", currentMinor);\n\n    for (const { repo, pkg = \"package.json\" } of API_USERS) {\n        const repoDir = `${repo.replace(\"/\", \"_\")}`;\n        const manifest = JSON.parse(readFileSync(`${outDir}/${repoDir}/${pkg}`, \"utf-8\"));\n        const depVersion = manifest.devDependencies?.typedoc || manifest.dependencies?.typedoc ||\n            \"(missing dependency)\";\n        const depMinor = semver.parse(depVersion.replace(/^[\\^<=~]+/, \"\"))?.minor;\n\n        if (depMinor !== currentMinor) {\n            console.log(`API->OLD ${repo} ${depVersion}`);\n        }\n    }\n\n    if (args.values.all) {\n        for (const { repo, pkg = \"package.json\" } of OLD_API_USERS) {\n            const repoDir = `${repo.replace(\"/\", \"_\")}`;\n            const manifest = JSON.parse(readFileSync(`${outDir}/${repoDir}/${pkg}`, \"utf-8\"));\n            const depVersion = manifest.devDependencies?.typedoc || manifest.dependencies?.typedoc;\n            if (!depVersion) {\n                console.log(`OLD->DEL ${repo} (missing dependency)`);\n                continue;\n            }\n\n            const depMinor = semver.parse(depVersion.replace(/^[\\^<=~]+/, \"\"))?.minor;\n\n            if (depMinor === currentMinor) {\n                console.log(`OLD->API ${repo} ${depVersion}`);\n            } else if (depMinor !== (currentMinor || 0) - 1) {\n                console.log(`OLD->DEL ${repo} ${depVersion}`);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "scripts/create_release.js",
    "content": "// @ts-check\n\nimport cp from \"child_process\";\nimport { join } from \"path\";\nimport https from \"https\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { readFileSync } from \"fs\";\n\nconst REMOTE = \"origin\";\nconst REPO = \"TypeStrong/typedoc\";\nconst CHANGELOG_MD = join(fileURLToPath(import.meta.url), \"../../CHANGELOG.md\");\n\nconst packageInfo = JSON.parse(\n    readFileSync(\n        join(fileURLToPath(import.meta.url), \"../../package.json\"),\n        \"utf-8\",\n    ),\n);\n\n/**\n * @param {string} cmd\n * @returns {Promise<string>}\n */\nfunction exec(cmd) {\n    return new Promise((resolve, reject) => {\n        cp.exec(cmd, { encoding: \"utf-8\" }, (err, stdout, stderr) => {\n            if (err) return reject(err);\n\n            if (stderr.trim().length) {\n                return reject(new Error(stderr));\n            }\n\n            resolve(stdout.trim());\n        });\n    });\n}\n\nasync function createGitHubRelease(args) {\n    const data = JSON.stringify(args);\n\n    const options = {\n        hostname: \"api.github.com\",\n        path: `/repos/${REPO}/releases`,\n        method: \"POST\",\n        headers: {\n            Authorization: `token ${process.env.GITHUB_TOKEN}`,\n            Accept: \"application/vnd.github.v3+json\",\n            \"Content-Type\": \"application/json\",\n            \"Content-Length\": data.length,\n            \"User-Agent\": \"Node\",\n        },\n    };\n\n    return new Promise((resolve, reject) => {\n        const req = https.request(options, (res) => {\n            if (res.statusCode !== 201) {\n                reject(new Error(res.statusMessage || \"Unknown status\"));\n            }\n\n            const result = [];\n            res.on(\"data\", (d) => result.push(d.toString(\"utf-8\")));\n            res.on(\"close\", () => resolve(result.join(\"\")));\n        });\n\n        req.on(\"error\", reject);\n        req.write(data);\n        req.end();\n    });\n}\n\nasync function main() {\n    const lastTag = await exec(\"git describe --tags --abbrev=0\");\n    const currentVersion = `v${packageInfo.version}`;\n    const [_major, _minor, patch] = currentVersion.substring(1).split(\".\");\n\n    if (lastTag == currentVersion) {\n        console.log(\"No version change, not publishing.\");\n        return;\n    }\n\n    console.log(`Creating release ${currentVersion}`);\n\n    console.log(\"Updating changelog...\");\n    let fullChangelog = await readFile(CHANGELOG_MD, \"utf-8\");\n    let start = fullChangelog.indexOf(`## ${currentVersion}`);\n\n    // If this version isn't in the changelog yet, take everything under ## Unreleased and include that\n    // as this version.\n    if (start === -1) {\n        start = fullChangelog.indexOf(\"## Unreleased\");\n        if (start === -1) {\n            start = 0;\n        } else {\n            start += \"## Unreleased\".length;\n        }\n\n        const date = new Date();\n        const dateStr = [\n            date.getUTCFullYear(),\n            (date.getUTCMonth() + 1).toString().padStart(2, \"0\"), // +1 because getUTCMonth returns 0 for January\n            date.getUTCDate().toString().padStart(2, \"0\"),\n        ].join(\"-\");\n        fullChangelog = \"---\\n\" +\n            \"title: Changelog\\n\" +\n            \"---\\n\\n\" +\n            \"## Unreleased\\n\\n\" +\n            `## ${currentVersion} (${dateStr})` +\n            fullChangelog.substring(start);\n        start = fullChangelog.indexOf(`## ${currentVersion}`);\n\n        await writeFile(CHANGELOG_MD, fullChangelog);\n        await exec(`git add \"${CHANGELOG_MD}\"`);\n        await exec(`git commit -m \"Update changelog for release\"`);\n        await exec(`git push ${REMOTE}`).catch(() => {});\n    }\n\n    start = fullChangelog.indexOf(\"\\n\", start) + 1;\n\n    let end = fullChangelog.indexOf(\"# v0.\", start);\n    end = fullChangelog.lastIndexOf(\"\\n\", end);\n\n    console.log(\"Creating tag...\");\n    // Delete the tag if it exists already.\n    await exec(`git tag -d ${currentVersion}`).catch(() => void 0);\n    await exec(`git tag ${currentVersion}`);\n    await exec(\n        `git push ${REMOTE} refs/tags/${currentVersion} --quiet --force`,\n    );\n\n    await createGitHubRelease({\n        tag_name: currentVersion,\n        name: currentVersion,\n        body: fullChangelog.substring(start, end),\n    });\n\n    console.log(\"OK\");\n}\n\nmain().catch((err) => {\n    console.error(err);\n    process.exitCode = 1;\n});\n"
  },
  {
    "path": "scripts/data/api_users.js",
    "content": "// @ts-check\n\n// A list of projects on GitHub which are not published TypeDoc plugins which are\n// known to use TypeDoc's JS API. Feel free to add your repo here! This list is\n// occasionally used to review known users for potentially breaking changes to\n// better gauge impact.\n\n/**\n * @typedef {object} ApiUser\n * @property {string} repo the GitHub repository to check out\n * @property {string} branch the branch to check out\n * @property {string[] | string} filter files/directories containing TypeDoc API usage\n * @property {string} [pkg] location of package.json containing TypeDoc dependency if not at the repo root\n */\n\n// cspell:disable\n\n/** @type {ApiUser[]} */\nexport const API_USERS = [\n    {\n        repo: \"playcanvas/engine\",\n        branch: \"main\",\n        filter: \"utils/typedoc/typedoc-plugin.mjs\",\n    },\n    {\n        repo: \"clerk/javascript\",\n        branch: \"main\",\n        filter: \".typedoc\",\n    },\n];\n\n// Users are moved to this list periodically when they are a minor version behind\n// and might be dropped off the list of repos checked for breaking changes eventually\n/** @type {ApiUser[]} */\nexport const OLD_API_USERS = [\n    {\n        repo: \"Fevol/obsidian-typings\",\n        branch: \"main\",\n        pkg: \"docs/package.json\",\n        filter: \"docs/typedoc-plugins/alter-frontmatter-plugin.js\",\n    },\n    {\n        repo: \"akaday/probot\",\n        branch: \"fb37787c230d4599ff11644e5a3ee7a2120ea5e8\",\n        filter: \".typedoc/typedoc_ga.mjs\",\n    },\n    {\n        repo: \"cbunt/react-distortion\",\n        branch: \"main\",\n        filter: \".config/typedoc-minimal-theme.js\",\n    },\n    {\n        repo: \"gohypergiant/standard-toolkit\",\n        branch: \"main\",\n        pkg: \"apps/docs/package.json\",\n        filter: \"apps/docs/lib/\",\n    },\n    {\n        repo: \"vltpkg/vltpkg\",\n        branch: \"main\",\n        pkg: \"www/docs/package.json\",\n        filter: \"www/docs/typedoc\",\n    },\n    {\n        repo: \"pixiv/three-vrm\",\n        branch: \"dev\",\n        filter: \"typedoc-redirect-legacy-docs-plugin.mjs\",\n    },\n];\n\nexport const ALL_API_USERS = [...API_USERS, ...OLD_API_USERS];\n"
  },
  {
    "path": "scripts/download_plugins.cjs",
    "content": "#!/usr/bin/env node\n// @ts-check\n// Helper script to download recently updated plugins\n// Used to review code changes for breaking changes.\n\n// 180 is somewhat arbitrary.\nconst CUTOFF_DAYS = 180;\nconst CUTOFF_MS = Date.now() - 1000 * 60 * 60 * 24 * CUTOFF_DAYS;\n\nconst cp = require(\"child_process\");\nconst path = require(\"path\");\nconst https = require(\"https\");\nconst fs = require(\"fs\");\n\n/**\n * @param {string} command\n * @returns {Promise<string>}\n */\nfunction exec(command) {\n    return new Promise((resolve, reject) => {\n        cp.exec(command, (err, stdout, stderr) => {\n            if (err) reject(err);\n            if (stderr.length) {\n                reject(new Error(`Command: ${command}\\n${stderr}`));\n            }\n            resolve(stdout.trim());\n        });\n    });\n}\n\nasync function getPlugins() {\n    const plugins = JSON.parse(await exec(\"npm search --json typedocplugin\"));\n    const plugins2 = JSON.parse(await exec(\"npm search --json typedoc-plugin\"));\n    const plugins3 = JSON.parse(await exec(\"npm search --json typedoc-theme\"));\n    return [...plugins, ...plugins2, ...plugins3]\n        .filter((plugin) => {\n            return Date.parse(plugin.date) > CUTOFF_MS;\n        })\n        .filter((plugin, index, arr) => {\n            return index === arr.findIndex((p) => p.name === plugin.name);\n        });\n}\n\nfunction getTarballUrl(pack) {\n    return exec(`npm view ${pack.name} dist.tarball`);\n}\n\nfunction downloadTarball(url, outDir) {\n    const outFile = path.join(outDir, path.basename(url));\n\n    return new Promise((resolve, reject) => {\n        const out = fs.createWriteStream(outFile);\n        out.on(\"finish\", () => {\n            out.close();\n            resolve(outFile);\n        });\n\n        https\n            .get(url, (response) => {\n                response.pipe(out);\n            })\n            .on(\"error\", (err) => {\n                reject(err);\n            });\n    });\n}\n\n// Could do this with node... but this works in my environment which is the only place I\n// expect it to be used. If you want to use this, somewhere else, feel free to update.\nasync function inflate(file) {\n    await exec(`gzip -d \"${file}\"`);\n    await fs.promises.mkdir(file.replace(\".tgz\", \"\"));\n    await exec(\n        `tar -C \"${file.replace(\".tgz\", \"\")}\" -xf \"${\n            file.replace(\n                \".tgz\",\n                \".tar\",\n            )\n        }\"`,\n    );\n}\n\n/** @param {string[]} args */\nasync function main(args) {\n    const outDir = path.resolve(args[0] || \"../typedoc_plugins\");\n    const plugins = await getPlugins();\n    console.log(\n        `Found ${plugins.length} plugins updated in the past ${CUTOFF_DAYS} days.`,\n    );\n    const tarballs = await Promise.all(plugins.map(getTarballUrl));\n    console.log(`Downloading tarballs...`);\n    await fs.promises.rm(outDir, { recursive: true, force: true });\n    await fs.promises.mkdir(outDir, { recursive: true });\n    const tarballFiles = await Promise.all(\n        tarballs.map((tar) => downloadTarball(tar, outDir)),\n    );\n    console.log(`Inflating...`);\n    await Promise.all(tarballFiles.map(inflate));\n    console.log(`Done, plugins are in ../typedoc_plugins`);\n}\n\nmain(process.argv.slice(2)).catch(console.error);\n"
  },
  {
    "path": "scripts/generate_options_schema.js",
    "content": "// @ts-check\n\nimport { writeFileSync } from \"fs\";\nimport { ParameterType } from \"../dist/index.js\";\nimport { addTypeDocOptions } from \"../dist/lib/utils/options/sources/typedoc.js\";\nimport { SORT_STRATEGIES } from \"../dist/lib/utils/sort.js\";\nimport { setTranslations } from \"#utils\";\nimport { loadTranslations } from \"../dist/lib/internationalization/internationalization.js\";\n\nsetTranslations(loadTranslations(\"en\"));\n\nconst IGNORED_OPTIONS = new Set([\"help\", \"version\"]);\n\nconst IGNORED_DEFAULT_OPTIONS = new Set([\"options\", \"tsconfig\"]);\n\nconst schema = {\n    $schema: \"https://json-schema.org/draft-07/schema\",\n    title: \"JSON Schema for typedoc.json\",\n    type: \"object\",\n    properties: {},\n    allowTrailingCommas: true,\n};\n\naddTypeDocOptions({\n    /** @param {import(\"../dist/index.js\").DeclarationOption} option */\n    addDeclaration(option) {\n        if (IGNORED_OPTIONS.has(option.name)) return;\n\n        const data = {\n            description: option.help(),\n        };\n\n        const type = option.type ?? ParameterType.String;\n        switch (type) {\n            case ParameterType.Array:\n            case ParameterType.GlobArray:\n            case ParameterType.PathArray:\n            case ParameterType.ModuleArray:\n            case ParameterType.PluginArray:\n                data.type = \"array\";\n                data.items = { type: \"string\" };\n                data.default = /** @type {import(\"../dist/index.js\").ArrayDeclarationOption} */ (\n                    option\n                ).defaultValue ?? [];\n                break;\n            case ParameterType.String:\n            case ParameterType.Path:\n            case ParameterType.UrlOrPath:\n                data.type = \"string\";\n                if (!IGNORED_DEFAULT_OPTIONS.has(option.name)) {\n                    data.default = /** @type {import(\"../dist/index.js\").StringDeclarationOption} */ (\n                        option\n                    ).defaultValue ?? \"\";\n                }\n                break;\n            case ParameterType.Boolean:\n                data.type = \"boolean\";\n                data.default = /** @type {import(\"../dist/index.js\").BooleanDeclarationOption} */ (\n                    option\n                ).defaultValue ?? false;\n                break;\n            case ParameterType.Number: {\n                const decl = /** @type {import(\"../dist/index.js\").NumberDeclarationOption} */ (\n                    option\n                );\n                data.type = \"number\";\n                data.default = decl.defaultValue ?? 0;\n                data.maximum = decl.maxValue;\n                data.minimum = decl.minValue;\n                break;\n            }\n            case ParameterType.Map: {\n                const map = /** @type {import(\"../dist/index.js\").MapDeclarationOption} */ (\n                    option\n                ).map;\n                data.enum = map instanceof Map\n                    ? [...map.values()]\n                    : Object.keys(map)\n                        .filter((key) => isNaN(+key))\n                        .map((key) => typeof map[key] === \"number\" ? key : map[key]);\n                data.default = /** @type {import(\"../dist/index.js\").MapDeclarationOption} */ (\n                    option\n                ).defaultValue;\n                if (!data.enum.includes(data.default)) {\n                    for (\n                        const [k, v] of map instanceof Map\n                            ? map\n                            : Object.entries(map)\n                    ) {\n                        if (v === data.default) {\n                            data.default = k;\n                            break;\n                        }\n                    }\n                }\n                break;\n            }\n            case ParameterType.Flags: {\n                const flagsObj = {\n                    type: \"object\",\n                    properties: {},\n                };\n                const defaults =\n                    /** @type {import(\"../dist/index.js\").FlagsDeclarationOption<Record<string, boolean>>} */ (\n                        option\n                    ).defaults;\n\n                for (const key of Object.keys(defaults)) {\n                    flagsObj.properties[key] = {\n                        type: \"boolean\",\n                    };\n                }\n                flagsObj.additionalProperties = false;\n                data.anyOf = [{ type: \"boolean\" }, flagsObj];\n                data.default = defaults;\n            }\n            case ParameterType.Mixed:\n            case ParameterType.Object:\n                data.default = /** @type {import(\"../dist/index.js\").MixedDeclarationOption} */ (\n                    option\n                ).defaultValue;\n                break;\n\n            default:\n                /** @type {never} */\n                let _unused = type;\n        }\n\n        schema.properties[option.name] = data;\n    },\n});\n\nschema.properties.visibilityFilters.type = \"object\";\nschema.properties.visibilityFilters.properties = Object.fromEntries(\n    Object.keys(schema.properties.visibilityFilters.default).map((x) => [\n        x,\n        { type: \"boolean\" },\n    ]),\n);\nschema.properties.visibilityFilters.patternProperties = {\n    \"^@\": { type: \"boolean\" },\n};\nschema.properties.visibilityFilters.additionalProperties = false;\n\nschema.properties.compilerOptions.type = \"object\";\nschema.properties.compilerOptions.markedOptions = \"object\";\n\nschema.properties.extends = {\n    type: \"array\",\n    items: { type: \"string\" },\n};\n\ndelete schema.properties.sort.items.type;\nschema.properties.sort.items.enum = SORT_STRATEGIES;\n\nconst output = JSON.stringify(schema, null, \"\\t\");\n\nif (process.argv.length > 2) {\n    writeFileSync(process.argv[2], output);\n} else {\n    console.log(output);\n}\n"
  },
  {
    "path": "scripts/generate_site_plugins.js",
    "content": "// @ts-check\nimport * as cp from \"child_process\";\nimport { mkdirSync, promises as fs } from \"fs\";\nimport semver from \"semver\";\n\nconst { version: TYPEDOC_VERSION } = JSON.parse(await fs.readFile(\"package.json\", \"utf-8\"));\nconst NEXT_BREAKING_TYPEDOC_VERSION = semver.parse(TYPEDOC_VERSION)?.inc(\"minor\");\nif (!NEXT_BREAKING_TYPEDOC_VERSION) {\n    throw new Error(\"Failed to determine next TypeDoc version\");\n}\n\nconst CACHE_ROOT = \"tmp/site-cache\";\nmkdirSync(CACHE_ROOT, { recursive: true });\n\n// cspell: disable\nconst EXCLUDED_PLUGINS = [\n    // Fork not intended for public use.\n    \"@zamiell/typedoc-plugin-markdown\",\n    \"@convex-dev/typedoc-plugin-markdown\",\n    \"@jberesford/typedoc-plugin-mdn-links\",\n    \"@jsprismarine/typedoc-material-theme\",\n\n    // Custom plugins/themes for other libraries, likely not useful to most people.\n    \"@initializer-utils/typedoc-theme\",\n    \"@colony/typedoc-plugin-markdown\",\n    \"@gobstones/typedoc-theme-gobstones\",\n    \"jsonforms-typedoc-theme\",\n    \"typedoc-jsonforms-theme\",\n    \"suika-docs-theme\",\n\n    // Improperly tagged, not actually a TypeDoc plugin\n    \"typedoc-toolbox\",\n];\n\nconst EXCLUDED_PLUGIN_USERS = [\n    // Forked typedoc-plugin-markdown, did not abide by license.\n    \"acceleratxr\",\n    // Has forked several plugins & published, forks do not appear to be for general use.\n    \"silei\",\n    \"tivmof\",\n];\n// cspell: enable\n\n/** @type {(command: string) => Promise<string>} */\nfunction exec(command) {\n    return new Promise((resolve, reject) => {\n        cp.exec(command, (err, stdout) => {\n            if (err) reject(err);\n            else resolve(stdout);\n        });\n    });\n}\n\n/** @param {string} npmPackage */\nasync function getSupportedVersions(npmPackage) {\n    const version = await exec(\n        `npm view ${npmPackage} peerDependencies.typedoc`,\n    );\n    return version.trim();\n}\n\n/**\n * @typedef {object} NpmPackage\n * @prop {string} name\n * @prop {string[]} keywords\n * @prop {string} version\n * @prop {string} description\n * @prop {{ username: string}} publisher\n * @prop {Array<{ username: string }>} maintainers\n * @prop {string} license\n * @prop {string} date\n * @prop {NpmLinks} links\n */\n\n/**\n * @typedef {object} NpmLinks\n * @prop {string} npm\n * @prop {string?} repository\n * @prop {string?} homepage\n */\n\n/**\n * @typedef {NpmPackage & { peer: string}} NpmPackageWithPeer\n */\n\n/**\n * @param {string} query\n * @returns {Promise<NpmPackage[]>}\n */\nasync function getAllPackages(query) {\n    const FORCE = process.env[\"CI\"] ? \" --prefer-online\" : \"\";\n\n    /** @type {NpmPackage[]} */\n    const result = JSON.parse(\n        await exec(\n            `npm search \"${query}\" --json --long --searchlimit 1000${FORCE}`,\n        ),\n    );\n\n    return result;\n}\n\n/**\n * @param {string} typedocVersion\n * @param {NpmPackageWithPeer[]} plugins\n * @returns {NpmPackageWithPeer[]}\n */\nfunction getSupportingPlugins(typedocVersion, plugins) {\n    /** @type {NpmPackageWithPeer[]} */\n    const supported = [];\n\n    for (const plugin of plugins) {\n        if (EXCLUDED_PLUGINS.includes(plugin.name)) continue;\n        if (EXCLUDED_PLUGIN_USERS.includes(plugin.publisher.username)) continue;\n        if (plugin.maintainers.some(n => EXCLUDED_PLUGIN_USERS.includes(n.username))) continue;\n\n        let version = plugin.peer.trim();\n        if (!version) continue;\n\n        // Any plugin which declares a version with \">=\" with no upper bound\n        // should really have used \"^\", so rewrite it to that instead.\n        if (version.includes(\">=\") && !version.includes(\"<\")) {\n            version = version.replace(/>=/g, \"^\");\n        }\n\n        // Any plugin which claims compatibility with a version which includes breaking changes\n        // in the future is lying. They can't possibly know that it satisfies this, so exclude\n        // them because we can't reliably figure out what version they do actually support.\n        // (we could technically probably look at when they were published and match that up\n        //  to when TypeDoc breaking versions were released, but that's far too much hackery\n        //  to permit plugins which include inaccurate version support anyways.)\n        if (semver.satisfies(NEXT_BREAKING_TYPEDOC_VERSION || \"\", version)) continue;\n\n        if (semver.satisfies(typedocVersion, version)) {\n            supported.push(plugin);\n        }\n    }\n\n    return supported;\n}\n\n/**\n * @template T\n * @param {string} filename\n * @param {() => Promise<T>} getter\n * @returns {Promise<T>}\n */\nasync function getLocalCache(filename, getter) {\n    try {\n        return JSON.parse(\n            await fs.readFile(CACHE_ROOT + \"/\" + filename, \"utf-8\"),\n        );\n    } catch {\n        const data = await getter();\n        if (process.env.CI !== \"true\") {\n            await fs.writeFile(\n                CACHE_ROOT + \"/\" + filename,\n                JSON.stringify(data, null, 4),\n                \"utf-8\",\n            );\n        }\n        return data;\n    }\n}\n\n/**\n * @param {NpmPackage[]} plugins\n * @returns {Promise<string[]>}\n */\nfunction getAllVersions(plugins) {\n    return Promise.all(plugins.map((p) => getSupportedVersions(p.name)));\n}\n\n/** @param {string} date */\nfunction relativeDate(date) {\n    const nowHours = Date.now() / 1000 / 60 / 60;\n    const dateHours = Date.parse(date) / 1000 / 60 / 60;\n\n    const deltaHours = nowHours - dateHours;\n    if (deltaHours <= 24) {\n        return \"today\";\n    }\n\n    const deltaDays = deltaHours / 24;\n    if (deltaDays <= 7) {\n        if (Math.floor(deltaDays) == 1) {\n            return \"1 day ago\";\n        }\n        return `${Math.floor(deltaDays)} days ago`;\n    }\n\n    const deltaWeeks = Math.floor(deltaDays / 7);\n    if (deltaWeeks === 1) {\n        return `1 week ago`;\n    }\n    if (deltaWeeks <= 3) {\n        return `${deltaWeeks} weeks ago`;\n    }\n\n    // Close enough...\n    const deltaMonths = Math.floor(deltaDays / 30);\n    if (deltaMonths <= 12) {\n        if (deltaMonths < 2) {\n            return \"1 month ago\";\n        }\n        return `${deltaMonths} months ago`;\n    }\n\n    const deltaYears = Math.floor(deltaDays / 365);\n    if (deltaYears < 2) {\n        return \"1 year ago\";\n    }\n    return `${deltaYears} years ago`;\n}\n\n/**\n * @param {NpmPackageWithPeer[]} plugins\n * @param {string[]} checkVersions\n * @param {string} path\n */\nasync function createInclude(plugins, checkVersions, path) {\n    /** @type {string[]} */\n    const out = [];\n\n    for (const typedocVersion of checkVersions) {\n        const supportingPlugins = getSupportingPlugins(\n            typedocVersion,\n            plugins,\n        ).sort((a, b) => Date.parse(b.date) - Date.parse(a.date));\n\n        if (supportingPlugins.length === 0) {\n            continue;\n        }\n\n        out.push(`## v${typedocVersion.replace(/\\.\\d+$/, \"\")}\\n`);\n\n        for (const plugin of supportingPlugins) {\n            out.push(`<div class=\"box\">`);\n            out.push(\n                `    <p class=\"box-title\"><a href=\"${plugin.links.npm}\" target=\"_blank\">${plugin.name}</a></p>`,\n            );\n            out.push(`    <p>${miniMarkdown(plugin.description || \"\")}</p>`);\n            let owner = \"\";\n            if (plugin.publisher.username.toLowerCase() === \"github actions\") {\n                owner = plugin.maintainers[0].username;\n            } else {\n                owner = plugin.publisher.username;\n            }\n            out.push(\n                `    <p>`,\n                `        <a href=\"https://www.npmjs.com/~${owner}\" target=\"_blank\">${owner}</a> •`,\n                `        ${plugin.version} •`,\n                `        ${relativeDate(plugin.date)} •`,\n                `        ${plugin.license || \"no license\"}`,\n                `    </p>`,\n            );\n            out.push(`</div>\\n`);\n        }\n\n        out.push(\"\\n\");\n    }\n\n    await fs.writeFile(path, out.join(\"\\n\"), \"utf-8\");\n}\n\n/**\n * @param {string} text\n * @returns {string}\n */\nfunction miniMarkdown(text) {\n    return escapeHtml(text)\n        .replace(\n            /\\[(.*?)\\]\\((https?:\\/\\/.*?)\\)/g,\n            (_, text, link) => `<a href=\"${link}\" target=\"_blank\">${text}</a>`,\n        )\n        .replace(/`(.*?)`/g, \"<code>$1</code>\");\n}\n\n/**\n * @param {string} html\n */\nfunction escapeHtml(html) {\n    return html.replace(\n        /[&<>'\"]/g,\n        (c) =>\n            ({\n                \"&\": \"&amp;\",\n                \"<\": \"&lt;\",\n                \">\": \"&gt;\",\n                '\"': \"&quot;\",\n                \"'\": \"&#39;\",\n            })[c],\n    );\n}\n\nasync function main() {\n    console.log(\"Getting themes...\");\n    const themes = await getLocalCache(\"themes.json\", () => getAllPackages(\"keywords:typedoc-theme\"));\n\n    console.log(\"Getting plugins...\");\n    const plugins = await getLocalCache(\"plugins.json\", async () => {\n        const plugins = await getAllPackages(\"keywords:typedoc-plugin\");\n        const plugins2 = await getAllPackages(\"keywords:typedocplugin\");\n\n        /** @type {NpmPackage[]} */\n        const result = [];\n        for (const pack of [...plugins, ...plugins2]) {\n            if (\n                !result.some((p) => p.name === pack.name) &&\n                !themes.some((p) => p.name === pack.name)\n            ) {\n                result.push(pack);\n            }\n        }\n\n        return result;\n    });\n\n    console.log(\"Getting typedoc versions...\");\n    const versions = await getLocalCache(\"versions.json\", () => getAllVersions(plugins));\n\n    const withVersions = plugins.map((plug, i) => Object.assign(plug, { peer: versions[i] }));\n\n    const typedocVersions = JSON.parse(\n        await exec(\"npm view typedoc@* versions --json\"),\n    ).filter((s) => typeof s === \"string\" && !s.includes(\"-\"));\n\n    const checkVersions = [typedocVersions[typedocVersions.length - 1]];\n    let index = typedocVersions.length - 1;\n    let lastMinor = semver.parse(checkVersions[0])?.minor ?? 0;\n\n    while (checkVersions.length < 3) {\n        const currentVersion = semver.parse(typedocVersions[index]);\n        if ((currentVersion?.minor ?? 0) < lastMinor) {\n            checkVersions.push(typedocVersions[index]);\n            lastMinor = currentVersion?.minor ?? 0;\n        }\n        index--;\n    }\n\n    await createInclude(\n        withVersions,\n        checkVersions,\n        \"site/generated/plugins.md\",\n    );\n\n    console.log(\"Getting theme versions...\");\n    const themeVersions = await getLocalCache(\"theme_versions.json\", () => getAllVersions(themes));\n\n    const themesWithVersions = themes.map((plug, i) => Object.assign(plug, { peer: themeVersions[i] }));\n\n    // v0.23 - this needs to be updated.\n    await createInclude(\n        themesWithVersions,\n        checkVersions,\n        \"site/generated/themes.md\",\n    );\n    console.log(\"Finished getting themes\");\n}\n\nmain().catch((err) => {\n    console.error(err);\n    process.exit(1);\n});\n"
  },
  {
    "path": "scripts/prepare.mjs",
    "content": "// @ts-check\n// See https://github.com/cspotcode/workaround-broken-npm-prepack-behavior\n\nimport { spawnSync } from \"child_process\";\nimport { isAbsolute, normalize, relative } from \"path\";\n\nconst {\n    npm_config_local_prefix,\n    npm_config_cache,\n    npm_package_resolved,\n    npm_package_json,\n    npm_node_execpath,\n    npm_execpath,\n} = process.env;\n\nif (!npm_node_execpath || !npm_execpath) {\n    process.exit(0);\n}\n\nfunction isInstallingAsGitDepInNpm() {\n    if (!npm_config_cache) return false;\n    const normalizedNpmConfigCache = normalize(npm_config_cache);\n\n    // Check if any of these paths are within npm's cache directory\n    for (\n        const path of [\n            npm_package_json,\n            npm_package_resolved,\n            npm_config_local_prefix,\n        ]\n    ) {\n        if (!path) continue;\n        // If local prefix is subdirectory of cache, assume we're being installed as\n        // a git dep\n        const normalized = normalize(path);\n        const rel = relative(normalizedNpmConfigCache, normalized);\n        if (!isAbsolute(rel) && !rel.startsWith(\"..\")) return true;\n    }\n}\n\nif (isInstallingAsGitDepInNpm()) {\n    spawnSync(npm_node_execpath, [npm_execpath, \"run\", \"prepack\"], {\n        stdio: \"inherit\",\n    });\n}\n"
  },
  {
    "path": "scripts/rebuild_specs.js",
    "content": "#!/usr/bin/env node\n// @ts-check\n\"use strict\";\n\nError.stackTraceLimit = 50;\nimport ts from \"typescript\";\nimport fs from \"fs\";\nimport path, { basename, join } from \"path\";\nimport * as td from \"../dist/index.js\";\nimport { getExpandedEntryPointsForPaths } from \"../dist/lib/utils/index.js\";\nimport { ok } from \"assert\";\nimport { fileURLToPath } from \"url\";\nimport { diagnostics } from \"../dist/lib/utils/loggers.js\";\nimport { getConverterApp } from \"../dist/test/programs.js\";\nimport { buildRendererSpecs } from \"../dist/test/renderer/testRendererUtils.js\";\n\nconst base = path.join(\n    fileURLToPath(import.meta.url),\n    \"../../src/test/converter\",\n);\n\nconst app = getConverterApp();\n\napp.serializer.addSerializer({\n    priority: -1,\n    supports(obj) {\n        return obj instanceof td.SourceReference;\n    },\n    /**\n     * @param {td.SourceReference} ref\n     */\n    toObject(ref, obj) {\n        if (obj.url) {\n            obj.url = `typedoc://${\n                obj.url.substring(\n                    obj.url.indexOf(ref.fileName),\n                )\n            }`;\n        }\n        return obj;\n    },\n});\napp.serializer.addSerializer({\n    priority: -1,\n    supports(obj) {\n        return obj instanceof td.ProjectReflection;\n    },\n    /** @param {td.ProjectReflection} obj */\n    toObject(_refl, obj) {\n        delete obj.packageVersion;\n        return obj;\n    },\n});\n\n/** @type {[string, (app: td.Application) => void, (app: td.Application) => void][]} */\nconst conversions = [\n    [\n        \"specs\",\n        () => {\n            // nop\n        },\n        () => {\n            // nop\n        },\n    ],\n    [\n        \"specs-with-lump-categories\",\n        (app) => app.options.setValue(\"categorizeByGroup\", false),\n        (app) => app.options.setValue(\"categorizeByGroup\", true),\n    ],\n    [\n        \"specs.nodoc\",\n        (app) => app.options.setValue(\"excludeNotDocumented\", true),\n        (app) => app.options.setValue(\"excludeNotDocumented\", false),\n    ],\n];\n\n/**\n * Rebuilds the converter specs for the provided dirs.\n * @param {string[]} dirs\n */\nfunction rebuildConverterTests(dirs) {\n    const program = ts.createProgram(app.options.getFileNames(), {\n        ...app.options.getCompilerOptions(app.logger),\n        noEmit: true,\n    });\n\n    const errors = ts.getPreEmitDiagnostics(program);\n    if (errors.length) {\n        diagnostics(app.logger, errors);\n        return;\n    }\n\n    for (const fullPath of dirs) {\n        console.log(fullPath);\n        for (const [file, before, after] of conversions) {\n            const out = path.join(fullPath, `${file}.json`);\n            if (fs.existsSync(out)) {\n                app.files = new td.ValidatingFileRegistry();\n                td.resetReflectionID();\n                before(app);\n                const entry = getExpandedEntryPointsForPaths(\n                    app.logger,\n                    [fullPath],\n                    app.options,\n                    [program],\n                );\n                ok(entry, \"Missing entry point\");\n                const result = app.converter.convert(entry);\n                result.name = basename(fullPath);\n                const serialized = app.serializer.projectToObject(\n                    result,\n                    td.normalizePath(process.cwd()),\n                );\n\n                const data = JSON.stringify(serialized, null, 4) + \"\\n\";\n                after(app);\n                fs.writeFileSync(out, data);\n            }\n        }\n    }\n}\n\n/** @param {string} specPath */\nasync function rebuildRendererTest(specPath) {\n    console.log(specPath);\n    await buildRendererSpecs(specPath);\n}\n\nasync function main() {\n    console.log(\"Base directory is\", base);\n    const dirs = await fs.promises.readdir(base, { withFileTypes: true });\n\n    await rebuildConverterTests(\n        dirs\n            .filter((dir) => dir.isDirectory())\n            .map((dir) => path.join(base, dir.name)),\n    );\n\n    await rebuildRendererTest(join(process.cwd(), \"src/test/renderer/specs\"));\n}\n\nmain().catch((reason) => {\n    console.error(reason);\n    process.exit(1);\n});\n"
  },
  {
    "path": "scripts/set_strict.js",
    "content": "// @ts-check\n// Sets the Strict type that TypeDoc uses to enable overloads for consumers only.\n// See the rationale in src/lib/utils-common/general.ts\n\nimport fs from \"fs/promises\";\nimport { join } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst file = join(\n    fileURLToPath(import.meta.url),\n    \"../../src/lib/utils-common/general.ts\",\n);\n\nconst isStrict = process.argv[2] === \"true\";\n\nfs.readFile(file, { encoding: \"utf-8\" })\n    .then((text) =>\n        fs.writeFile(\n            file,\n            text.replace(\n                /type InternalOnly =.*/,\n                `type InternalOnly = ${isStrict};`,\n            ),\n        )\n    )\n    .catch((reason) => {\n        console.error(reason);\n        process.exit(1);\n    });\n"
  },
  {
    "path": "scripts/sync_i18n.js",
    "content": "import { execSync } from \"child_process\";\nimport { readdirSync, readFileSync, writeFileSync } from \"fs\";\nimport ts from \"typescript\";\n\nfunction findDescendants(node, match) {\n    const visitor = (node) => {\n        if (match(node)) {\n            return node;\n        }\n        return node.forEachChild(visitor);\n    };\n    return node.forEachChild(visitor);\n}\n\nfunction loadTags() {\n    const sourceFile = ts.createSourceFile(\n        \"tsdoc-defaults.ts\",\n        readFileSync(\"src/lib/utils/options/tsdoc-defaults.ts\", \"utf-8\"),\n        ts.ScriptTarget.ES2022,\n        true,\n    );\n    const decls = {};\n    for (const statement of sourceFile.statements) {\n        if (ts.isVariableStatement(statement)) {\n            for (const decl of statement.declarationList.declarations) {\n                const name = decl.name.getText();\n                /** @type {ts.ArrayLiteralExpression | undefined} */\n                const arrayLiteral = findDescendants(decl.initializer, ts.isArrayLiteralExpression);\n                if (arrayLiteral) {\n                    const tags = [];\n                    for (const el of arrayLiteral.elements) {\n                        if (ts.isStringLiteral(el)) {\n                            tags.push(el.text);\n                        } else if (ts.isSpreadElement(el) && ts.isIdentifier(el.expression)) {\n                            tags.push(...decls[el.expression.text]);\n                        }\n                    }\n                    decls[name] = tags;\n                }\n            }\n        } else {\n            throw new Error(`Unexpected node ${ts.SyntaxKind[propertyAssignment.kind]}`);\n        }\n    }\n    return decls;\n}\n\nfunction loadEnLocale() {\n    const sourceFile = ts.createSourceFile(\n        \"en.cts\",\n        readFileSync(\"src/lib/internationalization/locales/en.cts\", \"utf-8\"),\n        ts.ScriptTarget.ES2022,\n        true,\n    );\n    let indent;\n    /** @type {ts.ObjectLiteralExpression | undefined} */\n    const langObjectLiteral = findDescendants(sourceFile, ts.isObjectLiteralExpression);\n    if (!langObjectLiteral) {\n        throw new Error(`Cannot find language object literal`);\n    }\n    const properties = [];\n    for (const propertyAssignment of langObjectLiteral.properties) {\n        if (ts.isPropertyAssignment(propertyAssignment)) {\n            if (indent === undefined) {\n                const pos = propertyAssignment.getStart();\n                const lnCol = sourceFile.getLineAndCharacterOfPosition(pos);\n                const lnStart = sourceFile.getLineStarts()[lnCol.line];\n                indent = sourceFile.getFullText().slice(lnStart, pos);\n            }\n            properties.push({\n                name: propertyAssignment.name.getText(),\n                nameWithComment: propertyAssignment.name.getFullText(),\n                initializer: propertyAssignment.initializer.getText(),\n            });\n        } else {\n            throw new Error(`Unexpected node ${ts.SyntaxKind[propertyAssignment.kind]}`);\n        }\n    }\n    const tags = loadTags();\n    const mapTagProperties = (tags, comment) => {\n        return tags.map((tag, index) => {\n            const tagName = tag.replace(/^@(.*)$/, \"$1\");\n            const tagTranslateKey = `tag_${tagName}`;\n            let nameWithComment = `\\n${indent}${tagTranslateKey}`;\n            if (index === 0) {\n                nameWithComment = `\\n\\n${indent}// ${comment}${nameWithComment}`;\n            }\n            const tagDefaultTranslation = tagName.substring(0, 1).toUpperCase() +\n                tagName\n                    .substring(1)\n                    .replace(\n                        /[a-z][A-Z]/g,\n                        (x) => `${x[0]} ${x[1]}`,\n                    );\n            return {\n                name: tagTranslateKey,\n                nameWithComment,\n                initializer: `\"${tagDefaultTranslation}\"`,\n            };\n        });\n    };\n    properties.push(...mapTagProperties(tags.blockTags, \"Block tags\"));\n    properties.push(...mapTagProperties(tags.inlineTags, \"Inline tags\"));\n    properties.push(...mapTagProperties(tags.modifierTags, \"Modifier tags\"));\n    const uniqueProperties = [];\n    const propertyKeyVisited = new Set();\n    for (const property of properties) {\n        if (!propertyKeyVisited.has(property.name)) {\n            uniqueProperties.push(property);\n        }\n        propertyKeyVisited.add(property.name);\n    }\n    return uniqueProperties;\n}\n\nfunction organizeLocale(langId) {\n    const langSourcePath = `src/lib/internationalization/locales/${langId}.cts`;\n    const sourceFile = ts.createSourceFile(\n        `${langId}.cts`,\n        readFileSync(langSourcePath, \"utf-8\"),\n        ts.ScriptTarget.ES2022,\n        true,\n    );\n    const sourceFileContent = sourceFile.getFullText();\n    /** @type {ts.ObjectLiteralExpression | undefined} */\n    const langObjectLiteral = findDescendants(sourceFile, ts.isObjectLiteralExpression);\n    if (!langObjectLiteral) {\n        throw new Error(`Cannot find language object literal`);\n    }\n    const properties = loadEnLocale();\n    const propertyStart = langObjectLiteral.getChildAt(0).getEnd();\n    const propertyEnd = langObjectLiteral.getChildAt(langObjectLiteral.getChildCount() - 1).getStart();\n    for (const propertyAssignment of langObjectLiteral.properties) {\n        if (ts.isPropertyAssignment(propertyAssignment)) {\n            const name = propertyAssignment.name.getText();\n            const property = properties.find((p) => p.name === name);\n            if (property) {\n                property.originalInitializer = property.initializer;\n                property.initializer = propertyAssignment.initializer.getText();\n                property.translated = true;\n            }\n        } else {\n            throw new Error(`Unexpected node ${ts.SyntaxKind[propertyAssignment.kind]}`);\n        }\n    }\n    const parts = [sourceFileContent.slice(0, propertyStart)];\n    const untranslatedKeys = [];\n    for (const property of properties) {\n        if (property.translated) {\n            parts.push(property.nameWithComment);\n        } else {\n            parts.push(property.nameWithComment.slice(0, -property.name.length), \"// \", property.name);\n            untranslatedKeys.push(property.name);\n        }\n        parts.push(\": \", property.initializer, \",\");\n    }\n    parts.push(\"\\n\", sourceFileContent.slice(propertyEnd));\n    writeFileSync(langSourcePath, parts.join(\"\"));\n    execSync(`npx dprint fmt ${langSourcePath}`, { stdio: \"inherit\" });\n    return untranslatedKeys;\n}\n\nfunction listLocales() {\n    return readdirSync(\"src/lib/internationalization/locales\").map((n) => n.replace(/^(.+)\\.\\w+$/, \"$1\"));\n}\n\nlistLocales()\n    .filter((lang) => lang !== \"en\")\n    .forEach((lang) => {\n        console.log(`Sync ${lang}.cts`);\n        organizeLocale(lang);\n    });\n"
  },
  {
    "path": "scripts/testcase.js",
    "content": "#!/usr/bin/env node\n// @ts-check\nimport md from \"markdown-it\";\nimport cp from \"child_process\";\nimport { writeFile } from \"fs/promises\";\n\nconst curl =\n    `curl -s -L -H \"Accept: application/vnd.github+json\" -H \"X-GitHub-Api-Version: 2022-11-28\" https://api.github.com/repos/typestrong/typedoc/issues/ISSUE`;\n\n/**\n * @param {string} cmd\n * @returns {Promise<string>}\n */\nfunction exec(cmd) {\n    return new Promise((resolve, reject) => {\n        cp.exec(cmd, { encoding: \"utf-8\" }, (err, stdout, stderr) => {\n            if (err) return reject(err);\n\n            if (stderr.trim().length) {\n                return reject(new Error(stderr));\n            }\n\n            resolve(stdout.trim());\n        });\n    });\n}\n\n/** @param {import(\"markdown-it\", { with: { \"resolution-mode\": \"require\" }}).Token} code */\nfunction guessExtension(code) {\n    switch (code.info) {\n        case \"js\":\n        case \"jsx\":\n            return \".js\";\n        case \"tsx\":\n            return \".tsx\";\n    }\n\n    return \".ts\";\n}\n\nasync function main() {\n    if (process.argv.length !== 3 && process.argv.length !== 4) {\n        console.log(\"Usage: node scripts/testcase.js <issue number> [lang]\");\n        process.exit(1);\n    }\n\n    const issue = process.argv[2];\n    const data = JSON.parse(await exec(curl.replace(\"ISSUE\", issue)));\n\n    const parser = md();\n    const tokens = parser.parse(data.body || \"\", {});\n\n    const code = tokens.find(\n        (tok) =>\n            tok.tag === \"code\" &&\n            [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(tok.info || \"\"),\n    ) || tokens.find((tok) => tok.tag === \"code\");\n\n    /** @type {string} */\n    let file;\n    if (!code) {\n        console.log(\"No codeblock found\");\n        file = `src/test/converter2/issues/gh${issue}.ts`;\n        await writeFile(file, \"\");\n    } else {\n        const ext = process.argv[3] ? `.${process.argv[3]}` : guessExtension(code);\n        file = `src/test/converter2/issues/gh${issue}${ext}`;\n        await writeFile(file, code.content);\n    }\n\n    console.log(file);\n    console.log(\"src/test/issues.c2.test.ts\");\n}\n\nvoid main();\n"
  },
  {
    "path": "scripts/visual_regression.js",
    "content": "#!/usr/bin/env node\n// @ts-check\nimport util from \"util\";\nimport { cpSync, existsSync, mkdirSync, rmSync } from \"fs\";\nimport { spawnSync } from \"child_process\";\nimport { captureScreenshots } from \"./capture_screenshots.mjs\";\nimport { fileURLToPath } from \"url\";\nimport { join } from \"path\";\n\n/** @param {string} dir */\nfunction accept(dir) {\n    const expectedDir = join(dir, \"baseline\");\n    const outputDir = join(dir, \"screenshots\");\n    rmSync(expectedDir, { recursive: true, force: true });\n    cpSync(outputDir, expectedDir, { recursive: true, force: true });\n}\n\n/** @param {string} dir */\nfunction compare(dir) {\n    rmSync(join(dir, \"output\"), { recursive: true, force: true });\n    mkdirSync(join(dir, \"output\"), { recursive: true });\n\n    spawnSync(\n        \"docker\",\n        [\n            \"run\",\n            \"--rm\",\n            \"--name\",\n            \"typedoc-reg-suit\",\n            \"-v\",\n            `${join(dir, \"screenshots\")}:/new`,\n            \"-v\",\n            `${join(dir, \"baseline\")}:/old`,\n            \"-v\",\n            `${join(dir, \"output\")}:/out`,\n            \"ghcr.io/gerrit0/reg-suit-container:main\",\n        ],\n        { stdio: \"inherit\" },\n    );\n}\n\nfunction printHelp() {\n    const help = [\n        \"DIRECTORIES\",\n        \"  --dir <dir>     The root folder that visual regression info is tracked in,\",\n        \"                  defaults to ./tmp/visual_regression\",\n        \"  --docs <dir>    The folder containing built documentation, used when --run is active\",\n        \"FLAGS\",\n        \"  --jobs, -j      Specify the number of workers to use when capturing screenshots, defaults to 6\",\n        \"  --theme         Specify the theme to use when capturing screenshots, default to light\",\n        \"  --help, -h      Show this message\",\n        \"TASKS\",\n        \"  --run           Execute ./bin/typedoc, runs first\",\n        \"  --screenshot    Use puppeteer to capture screenshots of the generated docs, runs second\",\n        \"  --compare       Use reg-suit to compare baseline/regression screenshots, runs third\",\n        \"  --accept        Accept the current screenshots, runs last.\",\n        \"\",\n        \"If no task flags are specified, will act as if all but --accept are specified\",\n    ];\n    console.log(\"node scripts/visual_regression.js\");\n    console.log(help.join(\"\\n\"));\n}\n\nasync function main() {\n    const args = util.parseArgs({\n        options: {\n            dir: {\n                type: \"string\",\n            },\n            docs: {\n                type: \"string\",\n            },\n            accept: {\n                type: \"boolean\",\n            },\n            run: {\n                type: \"boolean\",\n            },\n            screenshot: {\n                type: \"boolean\",\n            },\n            compare: {\n                type: \"boolean\",\n            },\n            jobs: {\n                short: \"j\",\n                type: \"string\",\n                default: \"6\",\n            },\n            theme: {\n                type: \"string\",\n            },\n            help: {\n                type: \"boolean\",\n                short: \"h\",\n            },\n        },\n    });\n\n    if (args.values.help) {\n        printHelp();\n        return;\n    }\n\n    const dir = args.values.dir ??\n        fileURLToPath(new URL(\"../tmp/visual_regression\", import.meta.url));\n    const docs = args.values.docs ?? new URL(\"../docs\", import.meta.url);\n    const jobs = parseInt(args.values.jobs || \"6\");\n\n    const userSpecifiedJob = args.values.accept ||\n        args.values.run ||\n        args.values.screenshot ||\n        args.values.compare;\n\n    if (args.values.run || !userSpecifiedJob) {\n        const runResult = spawnSync(\"node\", [\"bin/typedoc\"], {\n            cwd: new URL(\"../\", import.meta.url),\n            stdio: \"inherit\",\n        });\n        if (runResult.status) {\n            process.exit(1);\n        }\n    }\n\n    if (args.values.screenshot || !userSpecifiedJob) {\n        await captureScreenshots(\n            typeof docs === \"string\" ? docs : fileURLToPath(docs),\n            join(dir, \"screenshots\"),\n            jobs,\n            true,\n            args.values.theme ?? \"light\",\n        );\n\n        if (!existsSync(join(dir, \"baseline\"))) {\n            accept(dir);\n            console.log(\"Initial baseline accepted, run again to compare.\");\n            return;\n        }\n    }\n\n    if (args.values.compare || !userSpecifiedJob) {\n        compare(dir);\n        console.log(`Open ${dir}/output/index.html to review diffs`);\n    }\n\n    if (args.values.accept) {\n        accept(dir);\n        return;\n    }\n}\n\nif (import.meta.url.endsWith(process.argv[1])) {\n    try {\n        const start = Date.now();\n        await main();\n        console.log(\n            \"Took\",\n            ((Date.now() - start) / 1000).toFixed(3),\n            \"seconds\",\n        );\n    } catch (error) {\n        if (error.code == \"ERR_PARSE_ARGS_UNKNOWN_OPTION\") {\n            printHelp();\n            process.exit(1);\n        }\n        throw error;\n    }\n}\n"
  },
  {
    "path": "site/custom.css",
    "content": "/* Custom styling for the themes and plugins pages */\n.box {\n    padding: 0.5em;\n    padding-left: 1em;\n    margin-bottom: 1em;\n}\n\n.box .box-title {\n    padding-left: 0;\n    font-weight: bold;\n}\n\n.box p {\n    margin: 0;\n    padding-left: 1.5em;\n}\n"
  },
  {
    "path": "site/declaration-references.md",
    "content": "---\ntitle: Declaration References\n---\n\n# Declaration References\n\n> [!note] If [--useTsLinkResolution](options/comments.md#usetslinkresolution) is turned on (the default) this page\n> **may not apply** for your links within comments as TypeDoc will use TypeScript's resolution if TypeScript resolved\n> the link. This resolution strategy will only be used if TypeScript fails to parse the link or does not parse the\n> source document (e.g. for [external documents](./external-documents.md) and for the readme file).\n\nSome tags like [`{@link}`](tags/link.md) and [`{@inheritDoc}`](tags/inheritDoc.md) can refer to other\nmembers of the documentation. These tags use declaration references to name another declaration.\n\nTypeDoc's declaration references are slightly different than JSDoc's namepaths. They are based off of\nthe \"new\" [TSDoc](https://tsdoc.org/pages/spec/overview/) declaration references with slight modifications\nto make their resolution behavior more closely match the TypeScript language service (e.g. what VSCode does).\n\nDeclaration references are comprised of an optional module source, a component path, and an optional meaning.\nOnce parsed, they are resolved according to the [resolution strategy](#resolution-strategy) described below.\n\n## Module Source\n\nThe first part of a declaration, up to a `!` is parsed as the module source. This will be taken\nliterally and used to refer to the module name in a multiple entry point documentation site.\nIt should _not_ include the path to the module file.\n\nIf a declaration reference does not contain a `!`, then it does not contain a module source, and the\nfirst part of the declaration reference is the component path.\n\n```ts\n/**\n * {@link moduleA!}\n * {@link \"with!bang and \\\"quoted path\\\"\"!}\n */\n```\n\n## Component Path\n\nAfter the module source, declaration references contain a component path, which is made up of one\nor more component names delimitated by a `.`, `#`, or `~`.\n\nThe deliminator is used to determine how to navigate the project tree.\n\n<!-- dprint-ignore -->\n| Deliminator | Behavior |\n| --- | --- |\n| `.` | The most general purpose deliminator. It will first try to resolve exports and static class properties, but will also resolve members if no export is found for improved compatibility with TypeScript's resolution. |\n| `#` | Indicates that the next component is a \"member\", including class instance properties, interface members, and enum members. |\n| `~` | Indicates that the next component is an export of a namespace/module. |\n\n> [!warning] The TSDoc specification says that `~` traverses via locals. This is\n> different than TypeDoc's behavior. TypeDoc will treat `~` as a stricter `.`\n> which only supports navigating to a namespace/module export. It should\n> generally be avoided in favor of `.` for improved compatibility with VSCode.\n\n```ts\n// module.ts\n/**\n * {@link module!Foo}\n * {@link Foo}\n */\nexport namespace Foo {\n    /**\n     * {@link module!Foo.Bar}\n     * {@link module!Foo~Bar}\n     * {@link Foo~Bar}\n     */\n    export namespace Bar {\n        /**\n         * {@link module!Foo.Bar.Baz}\n         * {@link module!Foo~Bar~Baz}\n         * {@link Bar~Baz}\n         * {@link Baz}\n         */\n        export class Baz {\n            /**\n             * {@link Baz#prop}\n             */\n            prop = 123;\n            /**\n             * {@link Baz.prop}\n             */\n            static prop = 456;\n\n            /**\n             * {@link Baz#instanceOnly}\n             * {@link Baz.instanceOnly} also works as there is no conflicting static\n             */\n            instanceOnly = 789;\n        }\n    }\n}\n```\n\n### Reference Scope\n\nIf no module source is specified, by default component paths are resolved relative to the scope where\nthey are declared (note: Modules and namespaces create a new scope. Classes, interfaces, and object types\ndo not). This is sometimes inconvenient if a name is shadowed. To refer to a name with resolution starting\nin the the root scope, an empty module source can be specified with `!`.\n\n```ts\nexport const Target = 1;\nexport namespace Foo {\n    export const Target = 2;\n\n    /**\n     * {@link Target} links to 2\n     * {@link !Target} links to 1\n     */\n    export const Source = 3;\n}\n```\n\nWhile classes and interfaces do not normally create a new scope, the TypeScript language service will\ncheck their members for link targets when resolving links starting at the class/interface declaration.\nTypeDoc mimics this behavior, but be aware that links that do not contain the class/interface name\nwill prefer targets in their normal scope.\n\n```ts\nexport const dup = 1;\n/**\n * {@link dup} links to 1\n * {@link target} links to 2\n * {@link Foo.dup} links to 3\n */\nexport class Foo {\n    target = 2;\n    dup = 3;\n}\n```\n\n## Meaning\n\nThe final part of a declaration reference is an optional meaning which can be used to disambiguate\nreferences which could otherwise refer to multiple documentation items. The meaning can also be used\nto refer to a specific overload or type of declaration.\n\nThe meaning takes one of the following forms:\n\n- `:keyword` where `keyword` is described by the list below.\n- `:keyword(decimal digits)` where `decimal digits` indicates the index of an overloaded meaning\n- `:(decimal digits)` shorthand for an overloaded meaning\n- `:decimal digits` shorthand for an overloaded meaning\n- `:label` where `label` refers to a declaration by its\n  [`{@label}`](./tags/label.md) tag. `label` may contain `A-Z`, `0-9`, and `_`\n  and may not start with a number. Note: This meaning parse is specific to\n  TypeDoc, and is not currently specified by the TSDoc standard.\n\nThe keywords recognized by TypeDoc are:\n\n- `class` - Refers to reflections which represent a class.\n- `interface` - Refers to reflections which represent an interface.\n- `type` - Refers to reflections which represent some type.\n- `enum` - Refers to reflections which represent an enum.\n- `namespace` - Refers to reflections which represent a namespace.\n- `function` - Refers to reflections which represent a function's or method's signatures.\n- `var` - Refers to reflections which represent a variable.\n- `constructor` - Refers to the constructor of a class or type.\n- `member` - Refers to reflections which represent an enum member, property, method, or accessor.\n- `event` - Permitted to conform with the TSDoc spec, but will result in a broken reference.\n- `call` - Refers to reflections which represent a function's or method's signatures.\n- `new` - Refers to the constructor of a class or type.\n- `index` - Refers to a reflection's index signatures.\n- `complex` - Refers to reflections which represent some type.\n- `getter` - (TypeDoc specific, 0.23.3+) Refers to the get signature of an accessor.\n- `setter` - (TypeDoc specific, 0.23.3+) Refers to the set signature of an accessor.\n\n```ts\n/**\n * {@link foo:0}\n * {@link foo:function}\n * {@link foo:(0)}\n * {@link foo:function(0)}\n * {@link foo:NO_ARGS}\n * {@label NO_ARGS}\n */\nfunction foo(): void;\n/**\n * {@link foo:1}\n * {@link foo:function(1)}\n * {@link foo:(1)}\n * {@link foo:NUM_ARG}\n * {@label NUM_ARG}\n */\nfunction foo(n: number): number;\n/**\n * {@link foo:2}\n * {@link foo:function(2)}\n * {@link foo:(2)}\n * {@link foo:STR_ARG}\n * {@label STR_ARG}\n */\nfunction foo(s: string): string;\n```\n\n# Resolution Strategy\n\nWhen resolving links TypeDoc resolves the module source, then the component path, and finally the meaning.\n\nLink resolution is most easily understood with an example, the following project structure will be used in\nexamples below:\n\n```text\nproject \"My lib docs\"\n    module \"@me/lib\"\n        class \"Foo\"\n            static property \"bar\"\n            property \"bar\"\n            method \"baz\"\n                signature 0 () => string\n                signature 1 (x: number) => number\n\n        type alias \"Bam\"\n        function \"Bam\"\n            signature 0 () => string\n            signature 1 (x: number) => number\n\n        namespace \"Nested\"\n            variable \"Bam\"\n\n    module \"@me/lib2\"\n        function \"Bop\"\n```\n\n1. Resolve the Module Source:\n\n   TypeDoc first checks if a module is specified before `!`. If a module source is specified, then TypeDoc\n   will get the root level reflection with the same name as the module. In the example above, `@me/lib!`\n   and `@me/lib2!` will be resolved to the expected module, but `@me/fake!` will fail to resolve.\n\n   If the declaration reference does not specify a module source but starts with `!` then the link is treated\n   as a globally specified link whose resolution starts at the project level. `!\"@me/lib\"` will also resolve\n   to that module.\n\n   Otherwise, the link is treated as a local link which should start resolution at the comment location.\n   TypeDoc will prioritize link resolution with fewer scope steps to the target, but will also check parents\n   of a reflection for the link target. That is, `{@link Bam}` within the `Nested` namespace will resolve\n   to `@me/lib.Nested.Bam`, but `{@link Bam}` in the `Foo` class's comment (or the property/method) will\n   resolve to `@me/lib.Bam`.\n\n2. Resolve the Component Path:\n\n   Component paths are resolved according to their delimiter. The first section of a component path\n   is resolved as if the delimiter is `.`.\n\n   If the delimiter is `.`, TypeDoc will look for children of the current reflection, prioritizing\n   exports and static attributes over member attributes. The link `{@link @my/lib!Foo.bar}` will link\n   to the static property rather than the instance property, but `{@link my/lib!Foo.baz}` will successfully\n   link to the method even though it isn't static.\n\n   If the delimiter is `#`, TypeDoc will look for class/interface instance members. The link\n   `{@link @my/lib!Foo.bar}` will link to the instance property.\n\n   If the delimiter is `~`, TypeDoc will only look for children of the current reflection if the\n   current reflection is a module. This delimiter isn't generally useful.\n\n3. Resolve the Meaning:\n\n   Meanings are used to disambiguate links which could be intended to go to multiple locations.\n   The keyword portion of the meaning is resolved first. `{@link @my/lib!Bam:type}` will link\n   to the type alias, while `{@link @my/lib!Bam:function}` will link to the function.\n\n   Meanings may also include an index which further disambiguates the link. If you wanted to link\n   to the second signature of the `Bam` function, `{@link @my/lib!Bam:function}` is insufficient\n   and `{@link @my/lib!Bam:function(1)}` must be used instead.\n\n   An index may be included in a meaning without the keyword. This would be sufficient for linking\n   to the first signature of the `baz` method: `{@link @my/lib!Foo.baz:0}`, but the `Bam` function\n   is also merged with a type alias, so `{@link @my/lib!Bam:0}` could link to either the type alias\n   or the first signature of the function.\n\n## Resolution Failures\n\nWhen TypeDoc fails to resolve a link (and the\n[validation.invalidLink option](options/validation.md#validation) is set), TypeDoc will print\na warning like the following:\n\n> [warning] Failed to resolve link to \"Foo\" in comment for @me/lib2.Bop\n\nWith the resolution strategy in mind, we can now manually apply TypeDoc's link resolution algorithm\nto determine where the resolution went wrong.\n\n1. The link doesn't contain `!`, so it will be resolved as a local link, starting from the function `@me/lib2.Bop`\n2. `@my/lib2.Bop` doesn't have any children named `Foo`\n3. `@my/lib2` doesn't have any children named `Foo`\n4. The project doesn't directly have any children named `Foo`\n\nGiven that we wanted to link to the `Foo` class in `@my/lib`, we have a couple options:\n\n1. Change the link to `{@link @my/lib!Foo}`\n\n   This is the recommended change as it means TypeDoc doesn't need to walk up multiple scopes\n   to find the link, it can start at the project root, then go directly to the module and then\n   the class.\n\n2. Change the link to `{@link \"@my/lib\".Foo}`\n\n   With this change, TypeDoc would resolve the link, but still has to check `@my/lib2.Bop` and `@my/lib2`\n   for a child named `@my/lib` before reaching the root project.\n"
  },
  {
    "path": "site/development/index.md",
    "content": "---\ntitle: Development\nchildren:\n    - plugins.md\n    - themes.md\n    - internationalization.md\n    - third-party-symbols.md\n    - local-storage.md\n---\n\n# Development\n\nThis page is a work in progress overview of TypeDoc's architecture.\nFor more details about each individual component, refer to the doc comments within each module.\nIt is intended primarily for those interested in contributing to the TypeDoc codebase or developing a plugin.\n\n## High Level\n\nTypeDoc follows several high level steps when called.\n\n1. Read options - Necessary to determine which plugins should be loaded.\n2. Load plugins\n3. Read options again to pick up plugin options\n4. Convert the input files into the models (also called reflections) that live under `src/lib/models`\n5. Resolve the models<br>\n   Necessary to handle links to models that might not have been created when the source model is generated.\n6. Output the models by serializing to HTML and/or JSON\n\nTypeDoc's code is loosely organized according to each of these steps.\nThe code to read options lives under `src/lib/utils/options`.\nThe plugin loading code lives in `src/lib/utils/plugins`.\nConversion is performed according to the Symbol's `ts.SymbolFlags`. Each distinct flag type gets its own converter function in `src/lib/converter/symbols.ts`.\nResolution is implemented entirely by internal plugins that live in `src/lib/output/plugins` and listen to the `Converter.EVENT_RESOLVE` event.\nOutput is split into two folders, for JSON output see the `src/lib/serialization` directory, and for HTML output see `src/lib/output`.\n\nPlugins may effect any part of the process after step 2 by listening to events\nfired by each component or adding / replacing handlers for a given task. As an\nexample, the [Converter](https://typedoc.org/api/classes/Converter.html) fires events before\nstarting conversion, when declarations are converted and when the project should\nbe resolved.\n\n## Tests\n\nTypeDoc has tests for individual utilities and some components, but the majority of the project is tested by converting source files into their JSON model and comparing it to a known good version. The basic example under `src/test/renderer/testProject` is rendered to HTML to test theme changes.\n\nIf changing the behavior of a converter or resolver, it should be possible to modify one of the existing tests under `src/test/converter`.\nBug fixes or feature additions which need to change one of the `specs*.json` files should run `pnpm rebuild_specs [converter|renderer] [converter filter]` to run the current build of TypeDoc on the source files and generate new specs.\nFor other components, we use [Mocha](https://mochajs.org/) to write tests.\n\n### Running the Visual Regression Tests\n\nWhen making changes to the themes, it is useful to be able to compare screenshots\nfrom the new/old runs.\n\n1. Run `node scripts/visual_regression.js`\n2. Make the UI change\n3. Run `node scripts/visual_regression.js`\n\nThe visual regression script accepts several arguments to control what it does,\nrun it with `--help` to see a summary of the available options.\n\n## Components\n\nFor more detailed information about the implementation and API surface of each\ncomponent, consult its API documentation. All components are available on the\n[Application](https://typedoc.org/api/classes/Application.html) class, which is passed to plugins.\n\n### Options\n\nTypeDoc provides some 30 options which determine how the project model is generated and output to disk.\nThe [Options](https://typedoc.org/api/classes/Configuration.Options.html) class consolidates application options into a single location and handles type conversion.\n\nThere are 11 builtin option types as specified by the [ParameterType](https://typedoc.org/api/enums/Configuration.ParameterType.html) enum.\n\n- `String` - A string\n- `Path` - A string which will be resolved to a path. Paths in config files will be resolved relative to the config directory.\n- `Number` - A number which is not `NaN`\n- `Boolean` - `true` or `false`\n- `Map` - Defines a map between string keys and an arbitrary type. See the [tests](https://github.com/TypeStrong/typedoc/blob/master/src/test/utils/options/declaration.test.ts#L39) for an example.\n- `Mixed` - An object type that is passed through by TypeDoc to create specific implicit behavior.\n- `Object` - An object type of which value keys can be overridden or extended by passing a new object.\n- `Array` - An array of strings.\n- `PathArray` - An array of paths, if specified in a config file, will be resolved relative to the config file directory.\n- `ModuleArray` - An array of modules/paths. Items will be resolved if they start with `.`.\n- `GlobArray` - An array of globs. Globs will be resolved if they do not start with `**`, after skipping leading `!` and `#` characters.\n\nOptions are discovered and set by option readers, which are documented in the\n[Configuration.OptionsReader](https://typedoc.org/api/interfaces/Configuration.OptionsReader.html) interface.\n\nPlugins can declare their own options by calling [Options.addDeclaration](https://typedoc.org/api/classes/Configuration.Options.html#adddeclaration)\n\n### Plugins\n\nPlugins should export a `load` function which will be called by TypeDoc when loading the plugin with an instance of `PluginHost`.\nThis function should add any options the plugin accepts and add any listeners necessary to effect TypeDoc's behavior.\n\n```typescript\nimport { Application, Context, Converter, ParameterType } from \"typedoc\";\n\nexport function load(app: Application) {\n    app.options.addDeclaration({\n        name: \"plugin-option\",\n        help: \"Displayed when --help is passed\",\n        type: ParameterType.String, // The default\n        defaultValue: \"\", // The default\n    });\n\n    app.converter.on(Converter.EVENT_RESOLVE, (context: Context) => {\n        if (app.options.getValue(\"plugin-option\") === \"something\") {\n            // ...\n        }\n    });\n}\n```\n\n### Converters\n\nTypeDoc converts the syntax tree created by TypeScript into its own structure of\n[Reflections](https://typedoc.org/api/classes/Models.Reflection.html) to allow\nthemes and serialization to work with a standard object format. Conversion is\ndone primarily in three files.\n\n- [symbols.ts](https://github.com/TypeStrong/typedoc/blob/master/src/lib/converter/symbols.ts) - contains converters for each `ts.Symbol` that is exported from entry points.\n- [types.ts](https://github.com/TypeStrong/typedoc/blob/master/src/lib/converter/types.ts) - contains converters for `ts.Type`s and `ts.TypeNode`s.\n- [jsdoc.ts](https://github.com/TypeStrong/typedoc/blob/master/src/lib/converter/jsdoc.ts) - contains converters for types and symbols declared within JSDoc comments.\n\n### JSON Output\n\nTypeDoc can produce JSON output which can be consumed by other tools. The format\nof this JSON is defined by the\n[JSONOutput.ProjectReflection](https://typedoc.org/api/interfaces/JSONOutput.ProjectReflection.html)\ninterface. If plugins want to cause custom properties to be included in the\noutput JSON, they can achieve this by adding a serializer to\n[Serializer](https://typedoc.org/api/classes/Serializer.html). If custom\nproperties are added, they should generally also be revived with a\n[Deserializer](https://typedoc.org/api/classes/Deserializer.html) so that they\ncan be used with TypeDoc's packages mode.\n\n### HTML Output\n\nSee [Custom Themes](./themes.md) for creating a theme.\n"
  },
  {
    "path": "site/development/internationalization.md",
    "content": "---\ntitle: \"Internationalization\"\ngroup: Guides\n---\n\n# Internationalization\n\nTypeDoc 0.26 added support for internationalization in TypeDoc's output.\nThis is controlled by the `--lang` option and will affect both console output\nand the generated HTML or JSON output.\n\n## Adding a Locale\n\nLocales are stored in TypeDoc's `src/lib/internationalization/locales` directory\nwith the exception of the default locale, which is stored in\n`src/lib/internationalization/translatable.ts`. To add a new locale, create a file\nunder the `locales` directory which looks like this:\n\n```ts\n// zh.cts\nimport { buildTranslation } from \"../translatable\";\n\nexport = buildTranslation({\n    docs_generated_at_0: \"文档生成于 {0}\",\n});\n```\n\nThis will give a compiler error on `buildTranslation` since the translation object\ndoes not provide a translation for every string supported by TypeDoc. Submitting an\nincomplete translation is still greatly appreciated! If the translation is not complete\nwhen submitting for review, import and call `buildIncompleteTranslation` instead.\n\nAny strings which are not added to the translation object will automatically fall back\nto the default English string.\n\nThe [TranslatableStrings](https://typedoc.org/api/interfaces/TranslatableStrings.html)\ninterface has documentation on the format of TypeDoc's builtin translations. In short,\ntranslation keys include numbers to indicate placeholders in the English string, and\nthe translated strings should include `{n}` where the placeholder will be filled in at\nruntime.\n\n> [!IMPORTANT]\n> Please do not submit machine generated translations for languages you are unfamiliar with.\n> TypeDoc relies on contributors to ensure the accuracy of included translations.\n\n### Validation\n\nThe `buildTranslation` and `buildIncompleteTranslation` functions will attempt to\nvalidate that the provided translation strings include the same number of\nplaceholders as the default locale. This can check that a string does not miss a\nplaceholder, but will not catch usage of placeholders which will not be defined by\nTypeDoc. That issue will automatically be caught by a unit test if it occurs.\n\nThe builder functions will also validate that translations do not provide keys\nwhich are not present in the default locale if a fresh object is provided directly\nto them as suggested in the example above.\n\n## Translating Plugin Defined Strings\n\nPlugins may use TypeDoc's internationalization module to provide multiple\ntranslations for strings declared within them. To do this, they should call\n[Application.internationalization.addTranslations] with their expected values.\n\nThe `addTranslations` method expects that all translatable strings have been\ndeclared in the `TranslatableStrings` interface. To do this, use declaration\nmerging to define the expected number of placeholders for each translation string.\n\n```ts\nimport * as td from \"typedoc\";\n\ndeclare module \"typedoc\" {\n    interface TranslatableStrings {\n        // Define a translatable string with no arguments\n        plugin_example_hello_world: [];\n        // Define a translatable string requiring one argument\n        // By convention, keys should include index numbers for each placeholder\n        plugin_example_hello_0: [string];\n    }\n}\n\nexport function load(app: td.Application) {\n    app.internationalization.addTranslations(\"en\", {\n        plugin_example_hello_world: \"Hello World!\",\n        plugin_example_hello_0: \"Hello {0}!\",\n    });\n\n    app.logger.info(app.i18n.plugin_example_hello_world()); // Logs \"Hello World!\"\n    app.logger.info(app.i18n.plugin_example_hello_0(\"TypeDoc\")); // Logs \"Hello TypeDoc!\"\n}\n```\n\n[Application.internationalization.addTranslations]: https://typedoc.org/api/classes/Internationalization.Internationalization.html#addtranslations\n"
  },
  {
    "path": "site/development/local-storage.md",
    "content": "---\ntitle: Disabling Local Storage\n---\n\n# Disabling Local Storage\n\nTypeDoc uses local storage by default to retain operational state information across page loads for components such as side menus, site menus, and generated pages. To comply with certain functional cookie requirements, local storage usage can be toggled using the `window.TypeDoc` object.\n\nTo disable local storage, use:\n\n`window.TypeDoc.disableLocalStorage();`\n\n**Note:** Disabling local storage will clear its contents.\n\nTo enable local storage, use:\n\n`window.TypeDoc.enableLocalStorage();`\n\n**Note:** Local storage is enabled by default.\n\nTo disable local storage without clearing it, use:\n\n`window.TypeDoc.disableWritingLocalStorage();`\n"
  },
  {
    "path": "site/development/plugins.md",
    "content": "---\ntitle: Plugins\nsummary: Overview of how to write a TypeDoc plugin\n---\n\n# Writing a TypeDoc Plugin\n\nTypeDoc supports plugins which can modify how projects are converted, how\nconverted symbols are organized, and how they are displayed, among other things.\nPlugins are Node modules which export a single `load` function that will be\ncalled by TypeDoc with the [Application] instance which they are to be attached\nto. Plugins should assume that they may be loaded multiple times for different\napplications, and that a single load of an application class may be used to\nconvert multiple projects.\n\nPlugins may be either ESM or CommonJS, but TypeDoc ships with ESM, so they should\ngenerally published as ESM to avoid `require(esm)` experimental warnings.\n\n```js\n// @ts-check\n// npx typedoc --plugin ./plugin.js\n\nimport * as td from \"typedoc\";\n/** @param {td.Application} app */\nexport function load(app) {\n    // Add event listeners to app, app.converter, etc.\n    // this function may be async\n}\n```\n\nPlugin load functions may also be referenced directly in JS config files:\n\n```js\n// typedoc.config.js\nimport * as td from \"typedoc\";\n\n/** @param {td.Application} app */\nexport function customPlugin(app) {\n    // Add event listeners to app, app.converter, etc.\n    // this function may be async\n}\n\n/** @type {td.TypeDocOptions} */\nconst config = {\n    plugin: [customPlugin],\n};\n\nexport default config;\n```\n\nPlugins affect TypeDoc's execution by attaching event listeners to one or many\nevents that will be fired during conversion and rendering. Events are available\non the [Application], [Converter], [Renderer], and [Serializer]/[Deserializer]\nclasses. There are static `EVENT_*` properties on those classes which describe\nthe available events.\n\nThe best way to learn what's available to plugins is to browse the docs, or look\nat the source code for existing plugins. There is a list of currently supported\nplugins at https://typedoc.org/guides/plugins/\n\nTypeDoc also provides several control hooks for plugins to change it's behavior,\nthey are described by the [third party symbols](./third-party-symbols.md) and\n[custom themes](./themes.md) documents.\n\nPlugins which are configurable can add custom options with\n`app.options.addDeclaration`. [typedoc-plugin-mdn-links] has an example of the\nrecommended way of doing this.\n\nIf you have specific questions regarding plugin development, please create a\ndiscussion or ask in the [TypeScript Discord] #typedoc channel.\n\n[typedoc-plugin-mdn-links]: https://github.com/Gerrit0/typedoc-plugin-mdn-links/blob/main/src/index.ts\n[TypeScript Discord]: https://discord.gg/typescript\n[Application]: https://typedoc.org/api/classes/Application.html\n[Converter]: https://typedoc.org/api/classes/Converter.html\n[Renderer]: https://typedoc.org/api/classes/Renderer.html\n[Serializer]: https://typedoc.org/api/classes/Serializer.html\n[Deserializer]: https://typedoc.org/api/classes/Deserializer.html\n"
  },
  {
    "path": "site/development/themes.md",
    "content": "---\ntitle: Custom Themes\n---\n\n# Custom Themes\n\nThemes are defined by plugins calling the `defineTheme` method on\n`Application.renderer` when plugins are loaded. The most trivial theme, which\nexactly duplicates the default theme can be created by doing the following:\n\n```ts\nimport { Application, DefaultTheme } from \"typedoc\";\n\nexport function load(app: Application) {\n    app.renderer.defineTheme(\"mydefault\", DefaultTheme);\n}\n```\n\nThis isn't very interesting since it exactly duplicates the default theme. Most\nthemes need to adjust the templates in some way. This can be done by providing\nthem class which returns a different context class. Say we wanted to replace\nTypeDoc's default footer with one that mentioned your copyright. This could be\ndone with the following theme.\n\nIn this case, it would probably be better to add this content using a render\nhook for `footer.begin` or `footer.end`, but it can be done in this way as well.\n\n```tsx\nimport { Application, DefaultTheme, JSX, PageEvent, Reflection } from \"typedoc\";\n\nclass MyThemeContext extends DefaultThemeRenderContext {\n    // Important: If you use `this`, this function MUST be bound! Template functions\n    // are free to destructure the context object to only grab what they care about.\n    override footer = (context) => {\n        return (\n            <footer>\n                {context.hook(\"footer.begin\", context)}\n                Copyright 2024\n                {context.hook(\"footer.end\", context)}\n            </footer>\n        );\n    };\n}\n\nclass MyTheme extends DefaultTheme {\n    getRenderContext(pageEvent: PageEvent<Reflection>) {\n        return new MyThemeContext(this, pageEvent, this.application.options);\n    }\n}\n\nexport function load(app: Application) {\n    app.renderer.defineTheme(\"open-web-analytics\", MyTheme);\n}\n```\n\n## Hooks\n\nWhen rendering themes, TypeDoc's default theme will call several functions to\nallow plugins to inject HTML into a page without completely overwriting a theme.\nHooks live on the parent `Renderer` and may be called by child themes which\noverwrite a helper with a custom implementation. As an example, the following\nplugin will cause a popup on every page when loaded.\n\n```tsx\nimport { Application, JSX } from \"typedoc\";\nexport function load(app: Application) {\n    app.renderer.hooks.on(\"head.end\", () => (\n        <script>\n            <JSX.Raw html=\"alert('hi!');\" />\n        </script>\n    ));\n}\n```\n\nFor documentation on the available hooks, see the [RendererHooks] documentation\non the website.\n\n## Async Jobs\n\nThemes which completely override TypeDoc's builtin renderer may need to perform\nsome async initialization or teardown after rendering. To support this, there\nare two arrays of functions available on `Renderer` which plugins may add a\ncallback to. The renderer will call each function within these arrays when\nrendering and await the results.\n\n```ts\nimport { Application, RendererEvent } from \"typedoc\";\nexport function load(app: Application) {\n    app.renderer.preRenderAsyncJobs.push(async (output: RendererEvent) => {\n        app.logger.info(\n            \"Pre render, no docs written to \" + output.outputDirectory + \" yet\",\n        );\n        // Slow down rendering by 1 second\n        await new Promise((r) => setTimeout(r, 1000));\n    });\n\n    app.renderer.postRenderAsyncJobs.push(async (output: RendererEvent) => {\n        app.logger.info(\n            \"Post render, all docs written to \" + output.outputDirectory,\n        );\n    });\n}\n```\n\n## Registering your own custom elements/attributes\n\nCustom JSX elements can be defined by merging with TypeDoc's `IntrinsicElements`\ninterface. TypeScript will pick up properties of this interface as valid element\nnames.\n\n```ts\nimport { Application, JSX } from \"typedoc\";\n\ndeclare module \"typedoc\" {\n    // JSX.JSX is intentional due to TypeScript's strange JSX type discovery rules\n    namespace JSX.JSX {\n        interface IntrinsicElements {\n            \"custom-button\": IntrinsicAttributes & {\n                target: string;\n            };\n        }\n\n        // Generally shouldn't be necessary, TypeDoc contains an interface\n        // with all attributes documented on MDN. Properties added here will\n        // be permitted on all JSX elements.\n        interface IntrinsicAttributes {\n            customGlobalAttribute?: string;\n        }\n    }\n}\n\nexport function load(app: Application) {}\n```\n\n[RendererHooks]: https://typedoc.org/api/interfaces/RendererHooks.html\n"
  },
  {
    "path": "site/development/third-party-symbols.md",
    "content": "---\ntitle: Third Party Symbols\n---\n\n# Third Party Symbols\n\nTypeDoc 0.22 added support for linking to third party sites by associating a\nsymbol name with npm packages.\n\nSince TypeDoc 0.23.13, some mappings can be defined without a plugin by setting\n[`externalSymbolLinkMappings`][externalSymbolLinkMappings]. This should be set\nto an object whose keys are package names, and values are the `.` joined\nqualified name of the third party symbol. If the link was defined with a user\ncreated declaration reference, it may also have a `:meaning` at the end. TypeDoc\nwill _not_ attempt to perform fuzzy matching to remove the meaning from keys if\nnot specified, so if meanings may be used, a url must be listed multiple times.\n\nGlobal external symbols are supported, but may have surprising behavior. TypeDoc\nassumes that if a symbol was referenced from a package, it was exported from\nthat package. This will be true for most native TypeScript packages, but\npackages which rely on `@types` will be linked according to that `@types`\npackage for that package name.\n\nFurthermore, types which are defined in the TypeScript lib files (including\n`Array`, `Promise`, ...) will be detected as belonging to the `typescript`\npackage rather than the `global` package. In order to support both `{@link\n!Promise}` and references to the type within source code, both `global` and\n`typescript` need to be set.\n\n```jsonc\n// typedoc.json\n{\n    \"externalSymbolLinkMappings\": {\n        // For these you should probably install typedoc-plugin-mdn-links instead\n        \"global\": {\n            // Handle {@link !Promise}\n            \"Promise\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\",\n        },\n        \"typescript\": {\n            // Handle type X = Promise<number>\n            \"Promise\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\",\n        },\n    },\n}\n```\n\nA wildcard can be used to provide a fallback link to any unmapped type.\n\n```jsonc\n// typedoc.json\n{\n    \"externalSymbolLinkMappings\": {\n        \"external-lib\": {\n            \"SomeObject\": \"https://external-lib.site/docs/SomeObject\",\n            \"*\": \"https://external-lib.site/docs\",\n        },\n    },\n}\n```\n\n## Plugins\n\nPlugins can add support for linking to third party sites by calling\n[Converter.addUnknownSymbolResolver]\n\nIf the given symbol is unknown, or does not appear in the documentation site,\nthe resolver may return `undefined` and no link will be rendered unless provided\nby another resolver. The string `\"#\"` may also be returned to indicate that\nTypeDoc should mark the symbol as externally resolved, but not produce a link\nto it. This can be useful if you want to keep the link for usage in VSCode,\nbut not include it in the documentation.\n\nThe following plugin will resolve a few types from React to links on the\nofficial React documentation site.\n\n```ts\nimport { Application, type DeclarationReference } from \"typedoc\";\n\nconst knownSymbols = {\n    Component: \"https://reactjs.org/docs/react-component.html\",\n    PureComponent: \"https://reactjs.org/docs/react-api.html#reactpurecomponent\",\n};\n\nexport function load(app: Application) {\n    app.converter.addUnknownSymbolResolver((ref: DeclarationReference) => {\n        if (\n            // TS defined symbols\n            ref.moduleSource !== \"@types/react\" &&\n            // User {@link} tags\n            ref.moduleSource !== \"react\"\n        ) {\n            return;\n        }\n\n        // If someone did {@link react!}, link them directly to the home page.\n        if (!ref.symbolReference) {\n            return \"https://reactjs.org/\";\n        }\n\n        // Otherwise, we need to navigate through the symbol reference to\n        // determine where they meant to link to. Since the symbols we know\n        // about are all a single \"level\" deep, this is pretty simple.\n\n        if (!ref.symbolReference.path) {\n            // Someone included a meaning, but not a path.\n            // https://typedoc.org/guides/declaration-references/#meaning\n            return;\n        }\n\n        if (ref.symbolReference.path.length === 1) {\n            const name = ref.symbolReference.path[0].path;\n            if (knownSymbols.hasOwnProperty(name)) {\n                return knownSymbols[name as never];\n            }\n        }\n    });\n}\n```\n\nSince TypeDoc 0.23.26, plugins may also return return an object for more control\nover the displayed link. The returned `caption` will be used if the user does\nnot specify the link text.\n\n```ts\nimport { Application, type DeclarationReference } from \"typedoc\";\n\nconst documentedExports = [\n    \"chunk\",\n    \"compact\",\n    \"concat\",\n    \"difference\",\n    \"differenceBy\",\n    \"differenceWith\",\n];\n\nexport function load(app: Application) {\n    app.converter.addUnknownSymbolResolver((ref: DeclarationReference) => {\n        if (\n            // TS defined symbols\n            ref.moduleSource !== \"@types/lodash\" &&\n            // User {@link} tags\n            ref.moduleSource !== \"lodash\"\n        ) {\n            return;\n        }\n\n        // If someone did {@link lodash!}, link them directly to the home page.\n        if (!ref.symbolReference) {\n            return \"https://lodash.com/\";\n        }\n\n        if (!ref.symbolReference.path) {\n            // Someone included a meaning, but not a path.\n            // https://typedoc.org/guides/declaration-references/#meaning\n            return;\n        }\n\n        if (ref.symbolReference.path.length === 1) {\n            const name = ref.symbolReference.path[0].path;\n            if (documentedExports.includes(name)) {\n                return {\n                    target: `https://lodash.com/docs/4.17.15#${name}`,\n                    caption: name,\n                };\n            }\n        }\n    });\n}\n```\n\nThe unknown symbol resolver will also be passed the reflection containing the\nlink and, if the link was defined by the user, the [Models.CommentDisplayPart]\nwhich was parsed into the [DeclarationReference] provided as the first argument.\n\nIf `--useTsLinkResolution` is on (the default), it may also be passed a\n[Models.ReflectionSymbolId] referencing the symbol that TypeScript resolves the\nlink to.\n\n[externalSymbolLinkMappings]: https://typedoc.org/options/comments/#externalsymbollinkmappings\n[Converter.addUnknownSymbolResolver]: https://typedoc.org/api/classes/Converter.html#addUnknownSymbolResolver\n[Models.CommentDisplayPart]: https://typedoc.org/api/types/Models.CommentDisplayPart.html\n[DeclarationReference]: https://typedoc.org/api/interfaces/DeclarationReference.html\n[Models.ReflectionSymbolId]: https://typedoc.org/api/classes/Models.ReflectionSymbolId.html\n"
  },
  {
    "path": "site/doc-comments/index.md",
    "content": "---\ntitle: Doc Comments\nchildren:\n    - jsdoc-support.md\n    - tsdoc-support.md\n---\n\n# Doc Comments\n\nTypeDoc implements a minimal parser for your comments which extracts TSDoc/JSDoc tags and recognizes code\nblocks to ignore decorators. The resulting markup after resolving tags is then passed to the [markdown-it](https://github.com/markdown-it/markdown-it)\nmarkdown parser to be converted to HTML.\n\n```ts\n/**\n * This comment _supports_ [Markdown](https://www.markdownguide.org/)\n */\nexport class DocumentMe {}\n```\n\nTypeDoc will ignore comments containing `@license` or `@import`.\n\n## Code Blocks\n\nTypeDoc supports code blocks in markdown and uses\n[Shiki](https://shiki.matsu.io/) to provide syntax highlighting. You can specify\nthe syntax highlighting theme with the\n[`--lightHighlightTheme`](../options/output.md#lighthighlighttheme) and\n[`--darkHighlightTheme`](../options/output.md#darkhighlighttheme) options.\nTypeDoc only loads some of the languages supported by Shiki by default. If you\nwant to load additional languages, use the\n[`highlightLanguages`](../options/output.md#highlightlanguages) option.\n\n````ts\n/**\n * Code blocks are great for examples\n *\n * ```ts\n * // run typedoc --help for a list of supported languages\n * const instance = new MyClass();\n * ```\n */\nexport class MyClass {}\n````\n\n> [!note]\n> TypeDoc only supports fenced code blocks. Indentation based code blocks will not prevent tags\n> from being parsed within the code block.\n\n## Escaping Comments\n\nTypeDoc supports escaping special characters in comments to include literal `{}@/` characters.\nAll other escapes will be passed through to be processed by markdown-it. As an example:\n\n````ts\n/**\n * This is not a \\@tag. Nor is this an \\{\\@inlineTag\\}\n *\n * It is possible to escape the end of a comment:\n * ```ts\n * /**\n *  * docs for `example()`\n *  *\\/\n * function example(): void\n * ```\n */\n````\n\nWill be rendered as:\n\n> This is not a \\@tag. Nor is this an \\{\\@inlineTag\\}\n>\n> It is possible to escape the end of a comment:\n>\n> ```ts\n> /**\n>  * docs for `example()`\n>  */\n> function example(): void;\n> ```\n\n## Comment Discovery\n\nIn most cases, TypeDoc's comment discovery closely mirrors TypeScript's discovery. If a comment is placed\ndirectly before a declaration or typically belongs to a declaration but lives on a parent node, TypeDoc\nwill include it in the documentation.\n\n```ts\n/**\n * This works\n * @param x this works\n */\nfunction example(x: string, /** This too */ y: number) {}\n/** This also works */\nclass Example2 {}\n```\n\nTypeDoc also supports discovering comments in some locations which TypeScript does not.\n\n1. Comments on type aliases directly containing unions may have comments before each union branch\n   to document the union.\n\n   ```ts\n   type Choices =\n       /** Comment for option 1 */\n       | \"option_1\"\n       /** Comment for option 2 */\n       | { option_1: number };\n   ```\n\n2. Comments on export specifiers which export (or re-export) a member.\n\n   ```ts\n   /** A comment here will take precedence over a module comment in Lib */\n   export * as Lib from \"lib\";\n   ```\n\n   Comments on export specifiers only have higher priority than the module comment for modules\n   and references where the symbol appears in the documentation multiple times.\n\n   ```ts\n   export * as Lib from \"lib\"; // Use the @module comment\n   /** Preserved for backwards compatibility, prefer {@link Lib} */\n   export * as Library from \"lib\";\n\n   /** This comment will be used for someFunction only if someFunction does not have a comment directly on it */\n   export { someFunction } from \"lib\";\n   ```\n\n## See Also\n\n- The [Tags overview](../tags.md)\n- The [Declaration References](../declaration-references.md) guide\n- The [TSDoc](https://tsdoc.org/) website\n"
  },
  {
    "path": "site/doc-comments/jsdoc-support.md",
    "content": "---\ntitle: JSDoc Support\n---\n\n# JSDoc Support\n\nJSDoc is the de-facto \"standard\" for comments, but does not specify a rigorous\ngrammar and is fully implemented only by the official JSDoc tool. TypeDoc aims\nto recognize _most_ JSDoc comments in a manner similar to how they are handled\nby TypeScript and Visual Studio Code. Where the JSDoc implementation conflicts\nwith the TSDoc specification, TypeDoc generally tries to detect which\nimplementation is intended. JSDoc compatibility can be controlled with the\n[--jsDocCompatibility](../options/comments.md#jsdoccompatibility) option.\n\n## Notable Differences\n\n- TypeDoc's [`@link`](../tags/link.md) tags do not support JSDoc namepaths\n- TypeDoc does not require type annotations in [`@param`](../tags/param.md) blocks\n- TypeDoc does not parse [`@see`](../tags/see.md) tag contents as links\n- TypeDoc does not support all JSDoc tags\n"
  },
  {
    "path": "site/doc-comments/tsdoc-support.md",
    "content": "---\ntitle: TSDoc Support\n---\n\n# TSDoc Support\n\nThe TSDoc standard is a proposal to standardize parsing of JSDoc-like comments.\nTypeDoc aims to be compliant with the TSDoc standard, but does not enforce it.\nThis means that while TypeDoc should be able to parse all (or nearly all)\nTSDoc-complaint comments, it does not require that your comments follow the\nstandard.\n\nThis approach has several benefits, including better support for projects\noriginally written using JSDoc and support for more markdown constructs\n(including day-to-day features like\n[headings](https://github.com/microsoft/tsdoc/issues/197), and\n[lists](https://github.com/microsoft/tsdoc/issues/178)). However, for projects\nrequiring stricter validation of comment formats, this laxness may not be\nacceptable. In this case, [api-extractor](https://api-extractor.com/) is\nrecommended instead of TypeDoc for it's much stricter conformance to TSDoc.\n\n## Notable Differences\n\n- The [jsDocCompatibility](../options/comments.md#jsdoccompatibility) option\n  can be used to configure TypeDoc to parse comments more similarly to\n  JSDoc/TypeScript than TSDoc.\n- TypeDoc takes advantage that TSDoc syntax is (with the exception of tags) a\n  subset of markdown, so delegates most comment parsing to its markdown\n  parser.\n- The [`@inheritDoc`](../tags/inheritDoc.md) tag is declared as an inline tag\n  by TSDoc, but TypeDoc recognizes it in block tag form as well for\n  compatibility with JSDoc.\n- The [`@label`](../tags/label.md) tag has been extended to support user\n  specified meanings in declaration references.\n- The [`@link`](../tags/link.md) tag may be parsed with either TSDoc's\n  [declaration references](../declaration-references.md) or with TypeScript's\n  resolution.\n- The [`@param`](../tags/param.md) tag supports ignoring type annotations in\n  order to support TypeScript's types-in-comments capability.\n- The [`@privateRemarks`](../tags/privateRemarks.md) tag may be configured to\n  be included in the documentation.\n- The [`@public`](../tags/public.md) tag is not inherited by contained members.\n- The [`@typeParam`](../tags/typeParam.md) tag supports ignoring type\n  annotations in order to support TypeScript's types-in-comments capability.\n"
  },
  {
    "path": "site/external-documents.md",
    "content": "---\ntitle: External Documents\n---\n\nIt can be convenient to write long-form guides/tutorials outside of doc comments.\nTo support this, TypeDoc supports including documents which exist as standalone\n`.md` files in your repository.\n\n## Including Documents\n\nThese documents can be included in your generated documentation in a few ways.\n\n1. With the [`@document`](tags/document.md) tag.\n2. With the [projectDocuments] option.\n3. As a child of another document using yaml frontmatter.\n\n### The `@document` Tag\n\nThe `@document` tag can be placed in the comments for most types to add\na child to that reflection in the generated documentation. The content of\nthe `@document` tag should simply be a path to a markdown document to be\nincluded in the site.\n\n```ts\n/**\n * @document documents/external-markdown.md\n */\n```\n\nThe document path is relative to the file in which the comment appears in.\n\n### Project Documents\n\nIf your project has multiple entry points, the `@document` tag cannot be used\nto place documents at the top level of the project as there is no comment location\nassociated with the project. For this use case, specify the [projectDocuments]\noption. This option can be specified multiple times, or a glob may be specified\nto include multiple documents.\n\n```json\n// typedoc.json\n{\n    \"projectDocuments\": [\"documents/*.md\"]\n}\n```\n\nTypeDoc's default [sorting](options/organization.md#sort) options\nwill cause project documents to be re-ordered alphabetically. If not desired, sorting\nfor entry points can be disabled with the [sortEntryPoints](options/organization.md#sortentrypoints)\noption.\n\n## Document Content\n\nDocuments may include a yaml frontmatter section which can be used to control\nsome details about the document. Note: The frontmatter **must** begin and end with\n`---` on lines by itself. TypeDoc's frontmatter extraction uses this to determine\nwhen the block ends.\n\n```yaml\n---\ntitle: External Markdown\ngroup: Documents\ncategory: Guides\nchildren:\n    - ./child.md\n    - ./child2.md\n---\n```\n\nThe `title` key specifies the document name, which will be used in the sidebar\nnavigation. The `group` and `category` keys are equivalent to the\n[`@group`](tags/group.md)and [`@category`](tags/category.md)\ntags and control how the document shows up in the Index section on the page\nfor the reflection which owns the document. The `children` key can be used to specify\nadditional documents which should be added underneath the current document.\n\nDocuments may include relative links to images or other files/documents. TypeDoc\nwill detect links within markdown `[text](link)` formatted links, `<a>` tags\nand `<img>` tags and automatically resolve them to other documents in the project.\n\nif a path cannot be resolved to a part of the documentation, TypeDoc will copy\nthe file found to a `media` folder in your generated documentation and update the\nlink to point to it, so relative links to images will still work.\n\nDocuments may also include `{@link}` inline tags, which will be resolved as\n[declaration references](declaration-references.md) by\nTypeDoc.\n\n[projectDocuments]: options/input.md#projectdocuments\n"
  },
  {
    "path": "site/generated/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "site/googlede482cdb17c37ad4.html",
    "content": "google-site-verification: googlede482cdb17c37ad4.html"
  },
  {
    "path": "site/index.md",
    "content": "TypeDoc converts comments in TypeScript's source code into HTML documentation\nor a JSON model.\n\n## Quick Start\n\nTypeDoc generates documentation based on your exports. It will follow re-exports\nto document members declared in other files for each entry point.\n\n```bash\n# Install\nnpm install --save-dev typedoc\n\n# Build docs using package.json \"exports\" or \"main\" fields as entry points\nnpx typedoc\n```\n\nIf TypeDoc is unable to discover your entry points, they can be provided manually:\n\n```bash\n# Build docs using exports from src/index.ts\nnpx typedoc src/index.ts\n```\n\nIf you are documenting an application rather than a library, which doesn't have\na single entry point, you may want to document each file individually.\n\n```bash\n# Generate docs for all TypeScript files under src\nnpx typedoc --entryPointStrategy Expand src\n```\n\nTypeDoc supports a variety of [options](./options.md) and [themes](./themes.md).\nIt is extensible via the [plugin API](./plugins.md).\n"
  },
  {
    "path": "site/options/comments.md",
    "content": "---\ntitle: Comments\n---\n\nThese options control how TypeDoc parses comments.\n\n## commentStyle\n\n```bash\n$ typedoc --commentStyle block\n```\n\nDetermines what comment types TypeDoc will use. Note: Writing non-JSDoc comments will cause poorer\nintellisense in VSCode and is therefore generally not recommended.\n\n| Value           | Behavior                               |\n| --------------- | -------------------------------------- |\n| jsdoc (default) | Use block comments starting with `/**` |\n| block           | Use all block comments                 |\n| line            | Use `//` comments                      |\n| all             | Use both block and line comments       |\n\n## useTsLinkResolution\n\n```bash\n$ typedoc --useTsLinkResolution false\n```\n\nIndicates that `{@link}` tags should be resolved with TypeScript's parsing rules. This is on by default.\n\n## preserveLinkText\n\n```bash\n$ typedoc --preserveLinkText false\n```\n\nIndicates whether or not `{@link}` tags should include just the name of the target reflection, or the original link text. This is on by default.\n\n## jsDocCompatibility\n\nCLI:\n\n```bash\n$ typedoc --jsDocCompatibility false\n$ typedoc --jsDocCompatibility.defaultTag false\n```\n\ntypedoc.json (defaults):\n\n```json\n{\n    \"jsDocCompatibility\": {\n        \"exampleTag\": true,\n        \"defaultTag\": true,\n        \"inheritDocTag\": true,\n        \"ignoreUnescapedBraces\": true\n    }\n}\n```\n\nJSDoc specifies that the `@example` and `@default` tags indicate that the\nfollowing content should be parsed as code. This conflicts with the TSDoc\nstandard. With this option on, TypeDoc will attempt to infer from the tag\ncontent whether it should be parsed as code by checking if the tag content\ncontains a code block.\n\nTSDoc specifies that `@inheritdoc` should be spelled with a capitalized `D`,\n`@inheritDoc`. If `inheritDocTag` is set to `false`, TypeDoc will produce a\nwarning when rewriting `@inheritdoc` to `@inheritDoc`.\n\nTSDoc specifies that braces (`{}`) must be escaped within comments to avoid\nambiguity between the start of an inline tag and a brace to be included in the\nrendered text. TypeDoc's `ignoreUnescapedBraces` option determines if warnings\nare emitted if a brace is found within regular comment text without being\nescaped.\n\n## suppressCommentWarningsInDeclarationFiles\n\n```bash\n$ typedoc --suppressCommentWarningsInDeclarationFiles\n```\n\nPrevents warnings due to unspecified tags from being reported in comments within `.d.ts` files.\n\n## blockTags\n\n```json\n// typedoc.json\n{\n    \"blockTags\": [\"@param\", \"@returns\"]\n}\n```\n\nThis specifies all of the [block tags](../tags.md#block-tags) that TypeDoc considers to be valid.\n\nTypeDoc will warn when it finds an unknown tag. If you need to add a custom one, you can extend the defaults by using a JavaScript configuration file:\n\n```js\nimport { OptionDefaults } from \"typedoc\";\n\n/** @type {Partial<import('typedoc').TypeDocOptions>} */\nconst config = {\n    // Other config here.\n    // ...\n\n    blockTags: [...OptionDefaults.blockTags, \"@foo\"],\n};\n\nexport default config;\n```\n\nNote that this option will be set by `tsdoc.json`, if present. (Using a `tsdoc.json` file is an alternate way to add a custom tag.)\n\nAlso see [`inlineTags`](#inlinetags) and [`modifierTags`](#modifiertags).\n\n## inlineTags\n\n```json\n// typedoc.json\n{\n    \"inlineTags\": [\"@link\"]\n}\n```\n\nThis specifics all of the [inline tags](../tags.md#inline-tags) that TypeDoc considers to be valid.\n\nTypeDoc will warn when it finds a non-valid tag. If you need to add a custom one, you can extend the defaults by using a JavaScript configuration file:\n\n```js\nimport { OptionDefaults } from \"typedoc\";\n\n/** @type {Partial<import('typedoc').TypeDocOptions>} */\nconst config = {\n    // Other config here.\n    // ...\n\n    inlineTags: [...OptionDefaults.inlineTags, \"@foo\"],\n};\n\nexport default config;\n```\n\nNote that this option will be set by `tsdoc.json`, if present. (Using a `tsdoc.json` file is an alternate way to add a custom tag.)\n\nAlso see [`blockTags`](#blocktags) and [`modifierTags`](#modifiertags).\n\n## modifierTags\n\n```json\n// typedoc.json\n{\n    \"modifierTags\": [\"@hidden\", \"@packageDocumentation\"]\n}\n```\n\nThis specifics all of the [modifier tags](../tags.md#modifier-tags) that TypeDoc considers to be valid.\n\nTypeDoc will warn when it finds a non-valid tag. If you need to add a custom one, you can extend the defaults by using a JavaScript configuration file:\n\n```js\nimport { OptionDefaults } from \"typedoc\";\n\n/** @type {Partial<import('typedoc').TypeDocOptions>} */\nconst config = {\n    // Other config here.\n    // ...\n\n    modifierTags: [...OptionDefaults.modifierTags, \"@foo\"],\n};\n\nexport default config;\n```\n\nNote that this option will be set by `tsdoc.json`, if present. (Using a `tsdoc.json` file is an alternate way to add a custom tag.)\n\nAlso see [`blockTags`](#blocktags) and [`inlineTags`](#inlinetags).\n\n## cascadedModifierTags\n\n```json\n// typedoc.json\n{\n    \"modifierTags\": [\"@alpha\", \"@beta\", \"@experimental\"]\n}\n```\n\nSpecifies modifier tags which should be copied to all children of the parent reflection.\nNote that `@deprecated` is a block tag, not a modifier tag, so should not be specified here.\n\n## excludeTags\n\n```bash\n$ typedoc --excludeTags @apidefine\n```\n\nSpecify tags that should be removed from doc comments when parsing.\nUseful if your project uses [apiDoc](https://apidocjs.com/) for documenting RESTful web APIs.\n\n## notRenderedTags\n\n```bash\n$ typedoc --notRenderedTags @beta\n```\n\nSpecify tags which should be preserved in the doc comments, but not rendered\nwhen creating output. This is intended to support tags which carry some meaning\nabout how to render a member or instructions for TypeDoc to do something after a\npackage has been deserialized from JSON in packages mode.\n\n## preservedTypeAnnotationTags\n\n```json\n// typedoc.json\n{\n    \"preservedTypeAnnotationTags\": [\"@fires\"]\n}\n```\n\nSpecify block tags whose type annotations should be preserved by TypeDoc's parser,\nleading to their content being included in the rendered documentation.\n\n## externalSymbolLinkMappings\n\n```json\n// typedoc.json\n{\n    // format: { [packageName: string]: { [exportName: string]: string } }\n    \"externalSymbolLinkMappings\": {\n        // {@link typescript!Partial} will use this link as well as\n        // type Foo = Partial<Bar>\n        \"typescript\": {\n            \"Partial\": \"https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype\"\n        }\n    }\n}\n```\n\nCan be used to specify locations of externally defined types. If the external library uses namespaces,\nqualify the name with `.` as a separator. These definitions will be used for both types linked to by\nthe user via a `{@link}` tag and in code.\n\nTypeDoc assumes that if a symbol was referenced from a package, it was exported from that package.\nThis will be true for most native TypeScript packages, but packages which rely on `@types` will be linked\naccording to the `@types` package, not the original module name. If both are intended to be supported,\nboth packages must be listed.\n\n```json\n// typedoc.json\n{\n    \"externalSymbolLinkMappings\": {\n        // used by `class Foo extends Component {}`\n        \"@types/react\": {\n            \"Component\": \"https://reactjs.org/docs/react-component.html\"\n        },\n        // used by {@link react!Component}\n        \"react\": {\n            \"Component\": \"https://reactjs.org/docs/react-component.html\"\n        }\n    }\n}\n```\n\nGlobal external types are supported, but may have surprising behavior. Types which are defined in the TypeScript\nlib files (including `Array`, `Promise`, ...) will be detected as belonging to the `typescript` package rather than\nthe special `global` package reserved for global types.\n\n```json\n// typedoc.json\n{\n    \"externalSymbolLinkMappings\": {\n        // used by {@link !Promise}\n        \"global\": {\n            \"Promise\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\"\n        },\n        // used by type Foo = Promise<string>\n        \"typescript\": {\n            \"Promise\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\"\n        }\n    }\n}\n```\n\nThe string `\"#\"` may also be specified to indicate to TypeDoc that the type should be marked as resolved\nbut no link should be created.\n\n```json\n// typedoc.json\n{\n    \"externalSymbolLinkMappings\": {\n        // used by {@link !Promise}\n        \"global\": {\n            \"Promise\": \"#\"\n        },\n        // used by type Foo = Promise<string>\n        \"typescript\": {\n            \"Promise\": \"#\"\n        }\n    }\n}\n```\n"
  },
  {
    "path": "site/options/configuration.md",
    "content": "---\ntitle: Configuration\n---\n\nThese options control where TypeDoc reads its configuration from. TypeDoc will read options\nfrom the [options](#options) file, the `\"typedocOptions\"` key in your `package.json` file,\nand a `\"typedocOptions\"` key in your tsconfig.json.\n\nAll paths within configuration files are resolved relative to the options file they\nare specified within.\n\n## options\n\n```bash\ntypedoc --options <filename>\n```\n\nSpecify a configuration file to be loaded, which should contain entries that correspond\nto command-line options/flags. If not specified, TypeDoc will look for a configuration\nfile matching one of the valid config names in the current directory:\n\n- typedoc.json\n- typedoc.jsonc\n- typedoc.config.js\n- typedoc.config.cjs\n- typedoc.config.mjs\n- typedoc.js (avoid this name, Windows CMD will try to run it instead of calling TypeDoc when running from that directory)\n- typedoc.cjs\n- typedoc.mjs\n- The same filenames under the `.config` directory, `.config/typedoc.json`, ...\n\nOption files may also contain an extends key, which specifies an additional file\nto be loaded before importing options from the current file.\n\n### JSON Files\n\nIf you are using a `typedoc.json` file, VSCode should automatically pick up the schema.\nIf it does not, you can instruct your editor to pick up the schema with a `$schema` key.\n\n```json\n{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [\"./src/index.ts\", \"./src/secondary-entry.ts\"],\n    \"out\": \"doc\"\n}\n```\n\nLike `tsconfig.json`, JSON configuration files are parsed as JSONC, which means that you\ncan safely use trailing commas and comments in your file.\n\n### JavaScript Files\n\nIf you are using a JavaScript file for options, it should export an object whose keys\nare the option names. For example:\n\n```js\n/** @type {Partial<import(\"typedoc\").TypeDocOptions>} */\nconst config = {\n    entryPoints: [\"./src/index.ts\", \"./src/secondary-entry.ts\"],\n    out: \"doc\",\n};\n\nexport default config;\n```\n\n## tsconfig\n\n```bash\ntypedoc --tsconfig tsconfig.json\n```\n\nSpecify a `tsconfig.json` file that options should be read from. If not specified TypeDoc\nwill look for `tsconfig.json` in the current directory and parent directories like `tsc` does.\n\nWhen TypeDoc loads a `tsconfig.json` file, it will also read TypeDoc options declared under\nthe `\"typedocOptions\"` key and look for a `tsdoc.json` file in the same directory to read\nsupported tags.\n\nSee [TSDoc Support](../doc-comments/tsdoc-support.md) for details on how to use a `tsdoc.json` file.\n\n## compilerOptions\n\nThis option may only be set within a config file.\n\n```jsonc\n// typedoc.json\n{\n    \"compilerOptions\": {\n        \"skipLibCheck\": true,\n        \"strictNullChecks\": false,\n    },\n}\n```\n\nUsed to selectively override compiler options for generating documentation.\nTypeDoc parses code using the TypeScript compiler and will therefore behave\nsimilarly to tsc. Values set with this option will override options read from\ntsconfig.json. See [#1891](https://github.com/TypeStrong/typedoc/pull/1891) for details.\n\n## plugin\n\n```bash\ntypedoc --plugin typedoc-plugin-markdown\ntypedoc --plugin ./custom-plugin.js\n```\n\nSpecifies the plugins that should be loaded. By default, no plugins are loaded.\nSee [Plugins](../plugins.md) for a list of available plugins.\n\nIf using a JavaScript configuration file, the `plugin` option may be given\na function which will be called to load a plugin.\n"
  },
  {
    "path": "site/options/input.md",
    "content": "---\ntitle: Input\n---\n\nThese options control what files TypeDoc processes to generate documentation\nand how the files are processed.\n\n## entryPoints\n\n```bash\ntypedoc src/index.ts src/alt.ts\n# or\ntypedoc --entryPoints src/index.ts --entryPoints src/alt.ts\n```\n\n```jsonc\n// typedoc.json\n{\n    \"entryPoints\": [\"src/index.ts\", \"src/alt.ts\", \"src/multiple/*.ts\"],\n}\n```\n\nSpecifies the entry points globs to be documented by TypeDoc. TypeDoc will examine\nthe exports of these files and create documentation according to the exports.\nEntry points can be handled in one of four ways, see [--entryPointStrategy](#entrypointstrategy)\nfor details.\n\nIf this option is not set, TypeDoc will automatically discover your entry points\naccording to the [\"exports\"](https://nodejs.org/api/packages.html#exports) or\n[\"main\"](https://nodejs.org/api/packages.html#main) fields in your package.json,\nusing your tsconfig options to map the JavaScript files back to the original TypeScript\nsource.\n\nIf a `\"typedoc\"` [conditional export](https://nodejs.org/api/packages.html#conditional-exports) is used,\nTypeDoc will use it instead of the `\"import\"` export condition.\n\nThe set of entry points provided to TypeDoc determines the names displayed in the documentation.\nBy default, TypeDoc will derive a [displayBasePath](output.md#displaybasepath) based on your entry point\npaths to determine the displayed module name, but it can be also be set with the [`@module`](../tags/module.md) tag.\n\n## entryPointStrategy\n\n```bash\ntypedoc --entryPointStrategy expand ./src\n```\n\nSpecifies how specified entry points should be handled.\n\n### resolve (default)\n\nExpects all entry points to be contained within the root level tsconfig project.\nIf a directory is given, includes `<directory>/index` as the entry point.\n\n### expand (default prior to v0.22.0)\n\nExpects all entry points to be contained within the root level tsconfig project.\nIf a directory is given, its contents are recursively expanded and treated as\nentry points.\n\n### packages\n\nExpects all entry points to be directories to _effectively_ run TypeDoc within.\nAfter each entry point has been converted by TypeDoc to a JSON model, the\nprojects will be merged together and rendered to a single site or JSON output.\nEach package may have its own set of TypeDoc configuration, but `plugins` within\nsub-projects will _not_ be loaded. See\n[Gerrit0/typedoc-packages-example](https://github.com/Gerrit0/typedoc-packages-example)\nfor an example monorepo which uses this option.\n\n> [!warning] When running in packages mode, options must be specified in the\n> correct location. As TypeDoc effectively runs with a clean options object for\n> each directory, options which take effect during conversion must be set within\n> [packageOptions](#packageoptions) or directly within configuration for each\n> project. Configuration specified in the root level project will _not_ be\n> copied to child projects. See the [package options](package-options.md) page\n> for documentation about where each option should be set.\n\n### merge\n\nExpects all entry points to be `.json` files generated with a previous run of TypeDoc with the [`--json`](./output.md#json) option set. These entry points will be merged into a single project.\n\n## packageOptions\n\n```json\n// typedoc.json\n{\n    \"entryPointStrategy\": \"packages\",\n    \"entryPoints\": [\"packages/*\"],\n    \"packageOptions\": {\n        \"entryPoints\": [\"src/index.ts\"]\n    }\n}\n```\n\nOptions to set be set within each package when entryPointStrategy is set to\npackages. Unlike most options in TypeDoc, paths within this object are\ninterpreted relative to the package directory. This option has no effect if\n[entryPointStrategy](#entrypointstrategy) is not set to `packages`.\n\n## alwaysCreateEntryPointModule\n\nBy default, if TypeDoc is given only one entry point, it will place exports of that entry point directly within\nthe generated project. If this option is specified, TypeDoc will instead always create a module for the entry point.\nHas no effect if more than one entry point is passed to TypeDoc.\n\nIf [`--projectDocuments`](#projectdocuments) is used to add documents, this option defaults to `true`, otherwise, defaults to `false`.\n\n```bash\ntypedoc --alwaysCreateEntryPointModule\n```\n\n## projectDocuments\n\nSpecify additional markdown documents to be added to the generated documentation site.\nSee the [External Documents](../external-documents.md) guide for more details.\n\n```json\n// typedoc.json\n{\n    \"projectDocuments\": [\"docs/tutorial.md\"]\n}\n```\n\n## exclude\n\n```bash\ntypedoc --exclude \"**/*+(index|.spec|.e2e).ts\"\n```\n\nExclude files by the given pattern when a path is provided as source. This option is only used to remove files from consideration as\nentry points. Unlike TypeScript's `exclude` option, it _cannot_ be used to exclude files from compilation. You may want to turn on TypeScript's\n[--skipLibCheck](https://www.typescriptlang.org/tsconfig#skipLibCheck) if you have compilation errors originating in `@types` packages.\n\n**Important:** To exclude files or paths entirely, use TypeScript's `exclude` option in your `tsconfig.json`. TypeDoc will not include any files excluded by `tsconfig.json`. See [issue #1928](https://github.com/TypeStrong/typedoc/issues/1928#issuecomment-1121047065) for further discussion.\n\nSupports [minimatch](https://github.com/isaacs/minimatch) patterns.\nIn configuration files, this option accepts an array of patterns. On the command line, it may be specified multiple times to add multiple patterns.\nIf an exported member from one of your entry points is located in an excluded file, it will be excluded from the documentation.\n\nIf `entryPointStrategy` is set to `packages`, then you can specify package directories with this option to exclude from documentation.\n\n## externalPattern\n\n```bash\ntypedoc --externalPattern 'lib/**/*.ts' --externalPattern 'external/**/*.ts'\n```\n\nDefine patterns for extra files that should be considered external. Can be used along with `--excludeExternals` to remove external modules from the documentation.\n\n## excludeExternals\n\n```bash\ntypedoc --excludeExternals\n```\n\nPrevent externally resolved TypeScript files from being documented. Defaults to false.\n\n## excludeNotDocumented\n\n```bash\ntypedoc --excludeNotDocumented\n```\n\nRemoves symbols from the generated documentation which do not have an associated doc comment if they are matched by `excludeNotDocumentedKinds`.\n\n## excludeNotDocumentedKinds\n\n```json\n// typedoc.json\n{\n    \"excludeNotDocumented\": true,\n    \"excludeNotDocumentedKinds\": [\"Property\", \"Interface\", \"TypeAlias\"]\n}\n```\n\nSpecifies the kinds of member which can be removed by `excludeNotDocumented`. Defaults to:\n\n```json\n{\n    \"excludeNotDocumentedKinds\": [\n        \"Module\",\n        \"Namespace\",\n        \"Enum\",\n        // \"EnumMember\", // Not enabled by default\n        \"Variable\",\n        \"Function\",\n        \"Class\",\n        \"Interface\",\n        \"Constructor\",\n        \"Property\",\n        \"Method\",\n        \"CallSignature\",\n        \"IndexSignature\",\n        \"ConstructorSignature\",\n        \"Accessor\",\n        \"GetSignature\",\n        \"SetSignature\",\n        \"TypeAlias\",\n        \"Reference\"\n    ]\n}\n```\n\n## excludeInternal\n\n```bash\ntypedoc --excludeInternal\n```\n\nRemoves symbols annotated with the `@internal` doc tag. Defaults to true if the stripInternal compiler option is set to true, otherwise defaults to false.\n\n## excludePrivate\n\n```bash\ntypedoc --excludePrivate\n```\n\nRemoves members marked with `private` and `#private` class fields from the generated documentation. Defaults to true.\nTo include `#private` class fields both this option and [excludePrivateClassFields](#excludeprivateclassfields) must be set to `false`.\n\n## excludePrivateClassFields\n\n```bash\ntypedoc --excludePrivateClassFields\n```\n\nRemoves `#private` class fields from the generated documentation. Defaults to true.\n\n## excludeProtected\n\n```bash\ntypedoc --excludeProtected\n```\n\nRemoves protected class members from the generated documentation. Defaults to false.\n\n## excludeReferences\n\n```bash\ntypedoc --excludeReferences\n```\n\nRemoves re-exports of a symbol already included in the documentation from the documentation. Defaults to false.\n\n## excludeCategories\n\n```bash\ntypedoc --excludeCategories A --excludeCategories B\n```\n\nRemoves reflections associated with any of the given categories.\n\n## maxTypeConversionDepth\n\n```bash\ntypedoc --maxTypeConversionDepth 2\n```\n\nSpecifies the maximum depth to recurse when converting types, defaults to `10`.\n\n## name\n\n```bash\ntypedoc --name <Documentation title>\n```\n\nSet the name of the project that will be used in the header of the template.\nThe name defaults to the package name according to your `package.json`.\n\n## includeVersion\n\n```bash\ntypedoc --includeVersion\n```\n\nIncludes the version according to `package.json` in generated documentation. Defaults to false.\n\n## disableSources\n\n```bash\ntypedoc --disableSources\n```\n\nDisables capturing where reflections are declared when converting input.\n\n## sourceLinkTemplate\n\n```bash\ntypedoc --sourceLinkTemplate 'https://vcs.example.com/{path}?at={gitRevision}#line={line}'\n```\n\nHas no effect if `--disableSources` is set.\nSpecify a link template to be used when generating source urls. If not set, will be automatically created\nusing the git remote for GitHub, GitLab, and BitBucket urls. Supports `{path}`, `{line}`, and `{gitRevision}`\nplaceholders.\n\n## gitRevision\n\n```bash\ntypedoc --gitRevision <revision|branch|\"{branch}\">\n```\n\nHas no effect if `--disableSources` is set. Use specified revision or branch instead of the last revision for linking to\nsource files. Defaults to the last commit. Accepts the special value `{branch}` to indicate that `{gitRevision}` in\n`sourceLinkTemplate` should be set to the current commit branch. If `gitRevision` is set to `{branch}` and the current\nHEAD is not set to the tip of a branch, TypeDoc will use the last commit instead.\n\n## gitRemote\n\n```bash\ntypedoc --gitRemote <remote>\n```\n\nHas no effect if `--disableSources` is set.\nUse the specified git remote instead of `origin` for linking to source files in GitHub, Bitbucket, or GitLab.\nYou can use `git remote` to view a list of valid remotes.\nIf you are updating documentation for a forked package, you probably want to pass `--gitRemote upstream`.\n\n## disableGit\n\n```bash\ntypedoc --disableGit\n```\n\nPrevents TypeDoc from using Git to try to determine if sources can be linked, with this enabled, sources will always be\nlinked, even if not part of a git repo.\n\n## readme\n\n```bash\ntypedoc --readme <path/to/readme|none>\n```\n\nPath to the readme file that should be displayed on the index page. If set to `none`, or no readme file is automatically\ndiscovered, the index page will be disabled.\n\n## basePath\n\n```bash\ntypedoc --basePath ./\n```\n\nPath to a directory containing asset files which will be checked when resolving relative paths of links and images\nwithin documentation comments and external documents. If specified, this will also be used for the default value of\nthe [displayBasePath](output.md#displaybasepath) option.\n"
  },
  {
    "path": "site/options/organization.md",
    "content": "---\ntitle: Organization\n---\n\nThese options control how content is structured on generated pages.\n\n## groupReferencesByType\n\n```bash\n$ typedoc --groupReferencesByType\n```\n\nSpecifies that re-exports to a member already included in the documentation\nshould be grouped under the type that the referenced member is grouped within.\nBy default, TypeDoc will group these references in a `References` group.\n\n## categorizeByGroup\n\n```bash\n$ typedoc --categorizeByGroup\n```\n\nThis flag categorizes reflections by group (within properties, methods, etc).\nTo allow methods and properties of the same category to be grouped together, set this flag to false.\nDefaults to false.\n\n## defaultCategory\n\n```bash\n$ typedoc --defaultCategory \"Category Name\"\n```\n\nSets the name for the default category which is used when only some elements of the page are categorized.\nDefaults to 'Other'\n\n## categoryOrder\n\n```json\n// typedoc.json\n{\n    \"categoryOrder\": [\"Category Name\", \"Other Category\", \"*\"]\n}\n```\n\nArray option which allows overriding the order categories display in. A string\nof `*` indicates where categories that are not in the list should appear.\n\nCategories whose order is not specified will be sorted alphabetically. If `*` is\nnot specified and unknown categories are found, they will be listed at the end\nby default.\n\nA category called `none` (case-insensitive) is reserved and treated specially by\nthe default theme to be displayed without a category before other categories.\n\n## groupOrder\n\n```json\n// typedoc.json\n{\n    \"groupOrder\": [\"Variables\", \"Functions\", \"*\"]\n}\n```\n\nArray option which allows overriding the order groups display in. A string of\n`*` indicates where groups that are not in the list should appear.\n\nGroups whose order is not specified will be sorted alphabetically. If `*` is not\nspecified and unknown groups are found, they will be listed at the end by\ndefault.\n\nA group called `none` (case-insensitive) is reserved and treated specially by\nthe default theme to be displayed without a group heading before list of groups.\n\n## sort\n\n```bash\n$ typedoc --sort static-first --sort alphabetical\n```\n\nSpecifies the sort order for members. Sorting strategies will be applied in order.\nIf an earlier sorting strategy determines the relative ordering of two reflections, later\nordering strategies will not be applied.\n\nThis option defines the default sort strategy, the [`@sortStrategy`](../tags/sortStrategy.md)\ntag may be used to override it for individual reflections.\n\nFor example, with the setting `[\"static-first\", \"visibility\"]`, TypeDoc will first compare two\nreflections by if they are static or not, and if that comparison returns equal, will check the\nvisibility of each reflection. On the other hand, if `[\"visibility\", \"static-first\"]` is specified,\nTypeDoc would sort all public properties first and then sort each group to put static properties first.\nThis means that `[\"source-order\", \"static-first\"]` is equivalent to `[\"source-order\"]` since ordering\nby position in source will always produce a non-equal comparison.\n\nThe available sorting strategies are:\n\n- `source-order` (sorts by file, then by position in file)\n- `alphabetical`\n- `enum-value-ascending` (only applies to children of an enum)\n- `enum-value-descending` (only applies to children of an enum)\n- `static-first`\n- `instance-first`\n- `visibility` (public, then protected, then private)\n- `required-first`\n- `kind` (order according to the `kindSortOrder` option)\n- `external-last`\n- `documents-first`\n- `documents-last`\n- `alphabetical-ignoring-documents`\n\nThe default sort order is:\n\n```json\n{\n    \"sort\": [\n        \"kind\",\n        \"instance-first\",\n        \"alphabetical-ignoring-documents\"\n    ]\n}\n```\n\n## sortEntryPoints\n\n```bash\n$ typedoc --sortEntryPoints false\n```\n\nBy default, TypeDoc sorts the members of all pages according to the `sort` option, this option can be\nused to disable sorting at the top level.\n\n## kindSortOrder\n\nSpecifies the relative ordering of reflections if `kind` is specified in the `sort` option. The default order is:\n\n```json\n// typedoc.json\n{\n    \"kindSortOrder\": [\n        \"Reference\",\n        \"Project\",\n        \"Module\",\n        \"Namespace\",\n        \"Enum\",\n        \"EnumMember\",\n        \"Class\",\n        \"Interface\",\n        \"TypeAlias\",\n        \"Constructor\",\n        \"Property\",\n        \"Variable\",\n        \"Function\",\n        \"Accessor\",\n        \"Method\",\n        \"Parameter\",\n        \"TypeParameter\",\n        \"TypeLiteral\",\n        \"CallSignature\",\n        \"ConstructorSignature\",\n        \"IndexSignature\",\n        \"GetSignature\",\n        \"SetSignature\"\n    ]\n}\n```\n"
  },
  {
    "path": "site/options/other.md",
    "content": "---\ntitle: Other\n---\n\nOptions which don't fit elsewhere.\n\n## watch\n\n```bash\n$ typedoc --watch\n```\n\nUse TypeScript's incremental compiler to watch source files for changes and\nbuild the docs on change. May be combined with `--emit`.\n\nThis mode detects changes to project documents, readme, custom JS/CSS,\nconfiguration files, files imported by `@include`/`@includeCode`, and any\nfiles explicitly registered by plugins as needing to be watched, as well\nas all your TypeScript source files.\n\nWatch mode is not supported with `entryPointStrategy` set to `packages` or `merge`.\n\n## preserveWatchOutput\n\n```bash\n$ typedoc --watch --preserveWatchOutput\n```\n\nBy default, `--watch` clears the screen between compilation steps. If\n`--preserveWatchOutput` is specified, this behavior is disabled.\n\n## help\n\n```bash\n$ typedoc --help\n```\n\nPrint all available options, along with a short description. Also prints a list\nof supported highlighting languages.\n\n## version\n\n```bash\n$ typedoc --version\n```\n\nPrints TypeDoc's version.\n\n## showConfig\n\n```bash\n$ typedoc --showConfig\n```\n\nPrint TypeDoc's config and exit. Useful for debugging what options have been set.\n\n## logLevel\n\n```bash\n$ typedoc --logLevel Verbose\n```\n\nSpecifies the log level to be printed to the console. Defaults to `Info`. The available levels are:\n\n- Verbose - Print all log messages, may include debugging information intended for TypeDoc developers\n- Info - Print informational log messages along with warning and error messages\n- Warn - Print warning and error messages\n- Error - Print only error messages\n- None - Print no messages.\n\n## skipErrorChecking\n\n```bash\n$ typedoc --skipErrorChecking\n```\n\nInstructs TypeDoc to not run the type checker before converting a project. Enabling this option may improve generation time, but could also result in crashes if your code contains type errors.\n"
  },
  {
    "path": "site/options/output.md",
    "content": "---\ntitle: Output\n---\n\nThese options control TypeDoc's output.\n\n## outputs\n\n```json\n// typedoc.json\n{\n    \"outputs\": [\n        {\n            \"name\": \"html\",\n            \"path\": \"./docs_html\"\n        },\n        {\n            \"name\": \"html\",\n            \"path\": \"./docs_html_full_nav\",\n            \"options\": {\n                \"navigation\": {\n                    \"includeCategories\": true,\n                    \"includeGroups\": true,\n                    \"excludeReferences\": false,\n                    \"includeFolders\": true\n                }\n            }\n        },\n        {\n            \"name\": \"json\",\n            \"path\": \"./docs.json\"\n        },\n        {\n            // requires typedoc-plugin-markdown\n            \"name\": \"markdown\",\n            \"path\": \"./docs_markdown\"\n        }\n    ]\n}\n```\n\nSpecifies the outputs which should be rendered by TypeDoc. Outputs specify the\nname of the output type, a path to render it to, and optionally a set of options\nto be set when rendering the output.\n\nThe output types which ship with TypeDoc by default are `html` and `json`. Note\nthat any option may be set in the `options` key, but if the option is used\nduring conversion rather than output it will have no effect when rendering the\noutput.\n\n## out\n\n```bash\n$ typedoc --out <path/to/documentation/>\n```\n\nSpecifies the location the default output type should be written to. By default,\nthis will cause TypeDoc to generate HTML documentation, but this option may be\nused by plugins (like\n[typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown))\nwhich change the default output type.\n\nThis option is an output shortcut. If specified, the [outputs](#outputs) option\nwill be overwritten by this option and any other specified output shortcuts.\n\n## html\n\n```bash\n$ typedoc --html <path/to/documentation/>\n```\n\nSpecifies the location the html documentation should be written to. The HTML\noutput produced by running TypeDoc on itself can be seen at [TypeDoc API](https://typedoc.org/api/)\n\nThis option is an output shortcut. If specified, the [outputs](#outputs) option\nwill be overwritten by this option and any other specified output shortcuts.\n\nThis entire site is generated using TypeDoc's [external document](../external-documents.md)\nsupport to include markdown documents alongside the API documentation.\n\n## json\n\n```bash\n$ typedoc --json <path/to/out-file.json>\n```\n\nSpecifies the location to output a JSON file containing all of the reflection data.\nAn example of the JSON output from running TypeDoc on itself can be seen at [/media/docs.json](../../docs/docs.json).\n\nThis option is an output shortcut. If specified, the [outputs](#outputs) option\nwill be overwritten by this option and any other specified output shortcuts.\n\n## pretty\n\n```bash\n$ typedoc --json out.json --pretty\n```\n\nTells TypeDoc to pretty-format the JSON output. Defaults to true.\n\n## emit\n\n```bash\n$ typedoc --emit none\n```\n\nInstructs TypeDoc to write compiled output files as `tsc` does.\n\n| Value  | Behavior                                       |\n| ------ | ---------------------------------------------- |\n| `docs` | Emit documentation, but not JS (default).      |\n| `both` | Emit both documentation and JS.                |\n| `none` | Emit nothing, just convert and run validation. |\n\n> [!note]\n> If TypeScript is configured with `declaration: true` (through `tsconfig.json`)\n> then the TypeDoc emit `both` option will also generate type declaration files.\n\n## theme\n\n```bash\n$ typedoc --theme default\n```\n\nSpecify the theme name that should be used.\n\n## router\n\n```bash\n$ typedoc --router default\n```\n\nSpecify the router that should be used to determine what files to create for the\nHTML output and how to link between pages. Additional routers may be added by\nplugins/themes. TypeDoc ships with the following builtin routers:\n\n- **kind** (default) - Creates folders according to their the documented member's kind.\n- **kind-dir** - Like **kind**, but renders each page as `index.html` within a directory for the page name. This can be used to make \"clean\" urls.\n- **structure** - Creates folders according to the module structure.\n- **structure-dir** - Like **structure**, but renders each page as `index.html` within a directory for the page name. This can be used to make \"clean\" urls.\n- **group** - Creates folders according to the reflection's [`@group`](../tags/group.md).\n- **category** - Creates folders according to the reflection's [`@category`](../tags/category.md).\n\nThis is easiest to understand with an example. Given the following API:\n\n```ts\nexport function initialize(): void;\n/** @group Opts */\nexport class Options {}\nexport namespace TypeDoc {\n    export const VERSION: string;\n}\n```\n\nTypeDoc will create a folder structure resembling the following, the common\n`assets` folder and `index.html` / `modules.html` files have been omitted for\nbrevity.\n\n**kind**\n\n```text\ndocs\n├── classes\n│   └── Options.html\n├── functions\n│   └── initialize.html\n├── modules\n│   └── TypeDoc.html\n└── variables\n    └── TypeDoc.VERSION.html\n```\n\n**structure**\n\n```text\n├── initialize.html\n├── Options.html\n├── TypeDoc\n│   └── VERSION.html\n└── TypeDoc.html\n```\n\n**groups**\n\n```text\ndocs\n├── Opts\n│   └── Options.html\n├── Functions\n│   └── initialize.html\n├── Namespaces\n│   └── TypeDoc.html\n└── Variables\n    └── TypeDoc.VERSION.html\n```\n\n## lightHighlightTheme\n\n```bash\n$ typedoc --lightHighlightTheme light-plus\n```\n\nSpecify the Shiki theme to be used to highlight code snippets in light mode.\n\n## darkHighlightTheme\n\n```bash\n$ typedoc --darkHighlightTheme dark-plus\n```\n\nSpecify the Shiki theme to be used to highlight code snippets in dark mode.\n\n## highlightLanguages\n\nSpecifies the Shiki grammars to load for highlighting code blocks. By default, TypeDoc\nloads the following languages.\n\n```json\n{\n    \"highlightLanguages\": [\n        \"bash\",\n        \"console\",\n        \"css\",\n        \"html\",\n        \"javascript\",\n        \"json\",\n        \"jsonc\",\n        \"json5\",\n        \"tsx\",\n        \"typescript\"\n    ]\n}\n```\n\n## ignoredHighlightLanguages\n\nSpecifies languages used in code blocks which should be silently ignored by TypeDoc.\nBy default, TypeDoc will produce a warning if a code block specifies a language which\nis not present in the highlightLanguages array.\n\n```json\n{\n    \"ignoredHighlightLanguages\": [\"mkdocs\"]\n}\n```\n\n## typePrintWidth\n\nSpecifies the width at which to wrap code when rendering types, defaults to 80.\nChanging this is not advised without tweaks to the theme in use.\n\n```bash\ntypedoc --typePrintWidth 120\n```\n\n## customCss\n\n```bash\n$ typedoc --customCss ./theme/style.css\n```\n\nSpecifies an extra CSS file that should be copied into the assets directory and referenced by the theme.\n\n## customJs\n\n```bash\n$ typedoc --customJs ./theme/custom.js\n```\n\nSpecifies a JavaScript script (not module) file that should be copied into the\nassets directory and referenced by the theme.\n\n## customFooterHtml\n\n```bash\n$ typedoc --customFooterHtml \"Copyright <strong>Project</strong> 2024\"\n```\n\nSpecifies additional custom HTML which should be injected into the page footer.\n\n## customFooterHtmlDisableWrapper\n\n```bash\n$ typedoc --customFooterHtml \"<p>Copyright <strong>Project</strong> 2024</p>\" --customFooterHtmlDisableWrapper\n```\n\nBy default, TypeDoc will wrap the custom footer HTML in a `<p>` element to allow plain text added\nwith it to show up properly aligned. This option disables the wrapping.\n\n## markdownItOptions\n\nSpecifies the options that are forwarded to [markdown-it](https://github.com/markdown-it/markdown-it) when parsing doc comments.\nBy default TypeDoc overrides the default values used by markdown-it with the ones shown below:\n\n```json\n{\n    \"markdownItOptions\": {\n        \"html\": true,\n        \"linkify\": true\n    }\n}\n```\n\nSee the [options section](https://github.com/markdown-it/markdown-it?tab=readme-ov-file#init-with-presets-and-options)\nin the markdown-it readme for a full list of available options.\n\n## markdownItLoader\n\nFunction which can be set in a JS config file to configure plugins loaded by `markdown-it`. It will be called with an\ninstance of the [`MarkdownIt`](https://markdown-it.github.io/markdown-it/#MarkdownIt) class.\n\n```js\n// typedoc.config.mjs\nexport default {\n    markdownItLoader(parser) {\n        parser.use(plugin1);\n    },\n};\n```\n\n## displayBasePath\n\n```bash\n$ typedoc --displayBasePath ./ --entryPoints src/index.ts\n```\n\nSpecifies the base path to be used when displaying file paths. If not set, TypeDoc will guess by taking the lowest\ncommon directory to all source files. In the above example, TypeDoc would display links to `index.ts` rather than `src/index.ts`\nif `displayBasePath` was not specified. Defaults to the value of [basePath](input.md#basepath)\n\n> [!note]\n> This option only affects displayed paths. It _does not_ affect where TypeDoc will create links to.\n\n## cname\n\n```bash\n$ typedoc --cname typedoc.org\n```\n\nCreate a CNAME file in the output directory with the specified text.\n\n## favicon\n\n```bash\n$ typedoc --favicon favicon.ico\n```\n\nSpecify a `.ico`, `.png` or `.svg` file to reference as the site favicon.\n\n## sourceLinkExternal\n\n```bash\n$ typedoc --sourceLinkExternal\n```\n\nTreat source links as external links that open in a new tab when generating HTML.\n\n## markdownLinkExternal\n\n```bash\n$ typedoc --markdownLinkExternal\n```\n\nSpecifies that `http[s]://` links in comments and markdown files should be\ntreated as external links to be opened in a new tab\n\n## lang\n\n```bash\n$ typedoc --lang zh\n```\n\nSets the `lang` attribute in TypeDoc's HTML output and the translations used when,\ngenerating documentation. Defaults to `en`, resulting in `<html lang=\"en\">`.\n\n## locales\n\n```json\n// typedoc.json\n{\n    \"locales\": {\n        \"zh\": {\n            \"flag_private\": \"私有\"\n        }\n    }\n}\n```\n\nSpecify translations which TypeDoc will used when `--lang` is set to the specified locale.\nSee [translatable.ts](https://github.com/TypeStrong/typedoc/blob/master/src/lib/internationalization/translatable.ts)\nfor a list of all potentially translated messages within TypeDoc.\n\nIf your translations may be generally useful to the community, please consider submitting a\npull request adding them to TypeDoc!\n\n## githubPages\n\n```bash\n$ typedoc --githubPages false\n```\n\nWhen enabled, automatically add a `.nojekyll` file to the output directory to prevent GitHub Pages\nfrom processing your documentation site using Jekyll. If you have scoped packages, TypeDoc\ngenerates HTML files that start with `_` which are ignored by Jekyll. Defaults to `true`.\n\n## cacheBust\n\n```bash\n$ typedoc --cacheBust\n```\n\nWhen enabled, TypeDoc will include the generation time in `<script>` and `<link>` tags to JS/CSS assets\nto prevent assets from a previous build of the documentation from being used. This should generally not\nbe necessary with a properly configured web server.\n\n## hideGenerator\n\n```bash\n$ typedoc --hideGenerator\n```\n\nDo not print the TypeDoc link at the end of the page. Defaults to false.\n\n## searchInComments\n\n```bash\n$ typedoc --searchInComments\n```\n\nEnables searching comment text in the generated documentation site.\n\n> [!note]\n> Enabling this option will increase the size of your search index, potentially up\n> to an order of magnitude larger in projects with many long comments.\n\n## searchInDocuments\n\n```bash\n$ typedoc --searchInDocuments\n```\n\nEnables searching document text in the generated documentation site.\n\n> [!note]\n> Enabling this option will increase the size of your search index, potentially up\n> to an order of magnitude larger in projects with many documents.\n\n## cleanOutputDir\n\n```bash\n$ typedoc --cleanOutputDir false\n```\n\nCan be used to prevent TypeDoc from cleaning the output directory specified with `--out`.\n\n## titleLink\n\n```bash\n$ typedoc --titleLink \"http://example.com\"\n```\n\nSets the link the title in the header points to. Defaults to the documentation homepage.\n\n## navigationLinks\n\n```json\n// typedoc.json\n{\n    \"navigationLinks\": {\n        \"Example\": \"http://example.com\"\n    }\n}\n```\n\nDefines additional links to be included in the page header.\n\n## sidebarLinks\n\n```json\n// typedoc.json\n{\n    \"sidebarLinks\": {\n        \"Example\": \"http://example.com\"\n    }\n}\n```\n\nDefines additional links to be included in the page sidebar.\n\n## navigation\n\n```json\n// typedoc.json\n{\n    \"navigation\": {\n        \"includeCategories\": true,\n        \"includeGroups\": false,\n        \"includeFolders\": true,\n        \"compactFolders\": false,\n        \"excludeReferences\": true\n    },\n    \"categorizeByGroup\": false\n}\n```\n\nDetermines how the left hand side navigation will be built.\n\nThe [categorizeByGroup](./organization.md#categorizebygroup) option also affects\nthis behavior. If set (the default), and `includeGroups` is _not_ set, the value\nof `includeCategories` will be effectively ignored since categories will be\ncreated only within groups.\n\nAlso determines if project \"folders\" should become nested dropdowns in the\nnavigation pane. This option will only have an effect if your project includes\nmultiple entry points in different folders. `navigation.includeFolders` defaults\nto `true`.\n\nThe `includeCategories` and `includeGroups` option can be\noverwritten on a per-reflection basis by using the following\ntags within the comment for the reflection containing the\ncategories/groups.\n\n- `@showGroups`\n- `@hideGroups`\n- `@showCategories`\n- `@hideCategories`\n\n## headings\n\n```json\n// typedoc.json\n{\n    \"headings\": {\n        \"readme\": true,\n        \"document\": false\n    }\n}\n```\n\nDefines whether a heading describing the reflection should be included on the rendered page.\n\n## sluggerConfiguration\n\n```json\n// typedoc.json\n{\n    \"sluggerConfiguration\": {\n        \"lowercase\": true\n    }\n}\n```\n\nDetermines how anchors within a page are created. This option exists primarily\nfor backwards compatibility. It may be removed in a future release. TypeDoc 0.26\ndid not lowercase headings within a page which is inconsistent with how GitHub\npages sites commonly generate headings and does not play well with VSCode's\nautocomplete to anchors within external markdown files. In 0.27, this option\ndefaults to `true`.\n\n## navigationLeaves\n\n```json\n// typedoc.json\n{\n    \"navigationLeaves\": [\"JSONOutput\"]\n}\n```\n\nSpecifies namespaces/modules which should not be expandable in the navigation tree.\nTo specify a nested namespace, separate the parent names with `.` according to the displayed\ntree, skipping the top level project link. `ParentNS.ChildNS`\n\n## visibilityFilters\n\n```json\n// typedoc.json\n{\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": false,\n        \"@alpha\": false,\n        \"@beta\": false\n    }\n}\n```\n\nSpecifies the available filters when viewing a page. The four `protected`, `private`, `inherited`, and\n`external` options are all shown by default. Their default value may be set, or they may be omitted\nfrom this option to disable that filter. Further, modifier tags may be specified to introduce a custom\nsort option based on a tag.\n\n## searchCategoryBoosts\n\n```json\n// typedoc.json\n{\n    \"searchCategoryBoosts\": {\n        \"Common Items\": 1.5\n    }\n}\n```\n\nConfigure the search to increase the relevance of items in a given category.\n\n## searchGroupBoosts\n\n```json\n// typedoc.json\n{\n    \"searchCategoryBoosts\": {\n        \"Classes\": 1.5\n    }\n}\n```\n\nConfigure the search to increase the relevance of items in a given group.\n\n## hostedBaseUrl\n\n```json\n// typedoc.json\n{\n    \"hostedBaseUrl\": \"https://example.com\"\n}\n```\n\nSpecify the base URL which the TypeDoc generated site will be hosted at. This\nis used to generate a sitemap, generate canonical `<link>` tags, and enable the\n[useHostedBaseUrlForAbsoluteLinks](#usehostedbaseurlforabsolutelinks) option.\n\n## useHostedBaseUrlForAbsoluteLinks\n\n```json\n// typedoc.json\n{\n    \"hostedBaseUrl\": \"https://example.com\",\n    \"useHostedBaseUrlForAbsoluteLinks\": true\n}\n```\n\nIf set, TypeDoc will generate absolute links to pages rather than relative links.\nDefaults to false.\n\n## useFirstParagraphOfCommentAsSummary\n\n```json\n// typedoc.json\n{\n    \"useFirstParagraphOfCommentAsSummary\": true\n}\n```\n\nWhen rendering a module or namespace, TypeDoc includes a \"short summary\" in the\npage for each member which is rendered on another page. If the\n[`@summary`](../tags/summary.md) tag is used, it will specify the short summary\ntext. If `@summary` is not used, this option controls whether TypeDoc will use\nthe first paragraph from the comment as the short summary or leave it blank.\n\n## includeHierarchySummary\n\n```bash\ntypedoc --includeHierarchySummary false\n```\n\nSpecifies whether or not to generate the `hierarchy.html` page in the output\nwhich lists the full class hierarchy for generated members. Defaults to `true`.\n"
  },
  {
    "path": "site/options/package-options.md",
    "content": "---\ntitle: Package Options\n---\n\n# Package Options\n\n> [!note]\n> This page only applies when running with `entryPointStrategy` set to `\"packages\"`.\n\nWhen running with [entryPointStrategy](input.md#packages) set to `\"packages\"`.\nTypeDoc will _effectively_ be run within each entry point directory, and the\nresults merged together.\n\nWhen running in each directory, TypeDoc does **not** copy options from the root\nconfiguration object. This means that any options used during conversion need to\nbe set within each project, while options used during rendering need to be set\nat the root level. The following tables indicate where an option should be set.\n\n## Configuration Options\n\n| Option                                                | Location | Notes                                                                                                      |\n| ----------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------- |\n| [`options`](configuration.md#options)                 | Both     | TypeDoc will read option files when converting each directory and when looking for configuration initially |\n| [`tsconfig`](configuration.md#tsconfig)               | Both     | TypeDoc will read option files when converting each directory and when looking for configuration initially |\n| [`compilerOptions`](configuration.md#compileroptions) | Package  | In packages mode the TS compiler isn't invoked at the root level                                           |\n| [`plugin`](configuration.md#plugin)                   | Root     | Plugins will only be loaded from the root configuration                                                    |\n\n## Input Options\n\n| Option                                                                  | Location | Notes                                                                                                     |\n| ----------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------- |\n| [`entryPoints`](input.md#entrypoints)                                   | Both     | Root: project directories to convert, Package: source code to convert                                     |\n| [`entryPointStrategy`](input.md#entrypointstrategy)                     | Both     | Root: `\"packages\"`, Package: anything but `\"packages\"`                                                    |\n| [`packageOptions`](input.md#packageoptions)                             | Root     | Options to be applied to each package                                                                     |\n| [`alwaysCreateEntryPointModule`](input.md#alwayscreateentrypointmodule) | Both     | Likely only useful in packages as there will generally be more than one package                           |\n| [`projectDocuments`](input.md#projectdocuments)                         | Both     | Root: Docs at the root level, Package: Docs at the package level                                          |\n| [`exclude`](input.md#exclude)                                           | Both     | Root: Packages to exclude, Package: Entry points and exports to exclude.                                  |\n| [`externalPattern`](input.md#externalpattern)                           | Package  |                                                                                                           |\n| [`excludeExternals`](input.md#excludeexternals)                         | Both     | Root: If the \"Externals\" filter should be shown in HTML rendering, Package: Exclude items when converting |\n| [`excludeNotDocumented`](input.md#excludenotdocumented)                 | Package  |                                                                                                           |\n| [`excludeNotDocumentedKinds`](input.md#excludenotdocumentedkinds)       | Package  |                                                                                                           |\n| [`excludeInternal`](input.md#excludeinternal)                           | Package  |                                                                                                           |\n| [`excludePrivate`](input.md#excludeprivate)                             | Package  |                                                                                                           |\n| [`excludePrivateClassFields`](input.md#excludeprivateclassfields)       | Package  |                                                                                                           |\n| [`excludeProtected`](input.md#excludeprotected)                         | Package  |                                                                                                           |\n| [`excludeReferences`](input.md#excludereferences)                       | Package  |                                                                                                           |\n| [`excludeCategories`](input.md#excludecategories)                       | Package  |                                                                                                           |\n| [`maxTypeConversionDepth`](input.md#maxtypeconversiondepth)             | Package  |                                                                                                           |\n| [`name`](input.md#name)                                                 | Both     | Root: Site name, Package: Package name                                                                    |\n| [`includeVersion`](input.md#includeversion)                             | Both     | Root: Repo version, Package: Package version                                                              |\n| [`disableSources`](input.md#disablesources)                             | Package  | Rendering will always write sources if present, they must be disabled when converting                     |\n| [`sourceLinkTemplate`](input.md#sourcelinktemplate)                     | Package  | Source links are set when converting packages                                                             |\n| [`gitRevision`](input.md#gitrevision)                                   | Package  |                                                                                                           |\n| [`gitRemote`](input.md#gitremote)                                       | Package  |                                                                                                           |\n| [`disableGit`](input.md#disablegit)                                     | Package  |                                                                                                           |\n| [`readme`](input.md#readme)                                             | Both     | Root: Site readme, Package: Package readme                                                                |\n| [`basePath`](input.md#basepath)                                         | Both     | Root: Site readme, documents, Package: Package readme, documentation comments, documents                  |\n\n## Output Options\n\n| Option                                                                                 | Location | Notes                                                      |\n| -------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------- |\n| [`outputs`](output.md#outputs)                                                         | Root     | Outputs are not written when processing each package       |\n| [`out`](output.md#out)                                                                 | Root     |                                                            |\n| [`html`](output.md#html)                                                               | Root     |                                                            |\n| [`json`](output.md#json)                                                               | Root     |                                                            |\n| [`pretty`](output.md#pretty)                                                           | Root     |                                                            |\n| [`emit`](output.md#emit)                                                               | Both     |                                                            |\n| [`theme`](output.md#theme)                                                             | Root     |                                                            |\n| [`router`](output.md#router)                                                           | Root     |                                                            |\n| [`lightHighlightTheme`](output.md#lighthighlighttheme)                                 | Root     |                                                            |\n| [`darkHighlightTheme`](output.md#darkhighlighttheme)                                   | Root     |                                                            |\n| [`highlightLanguages`](output.md#highlightlanguages)                                   | Root     |                                                            |\n| [`ignoredHighlightLanguages`](output.md#ignoredhighlightlanguages)                     | Root     |                                                            |\n| [`typePrintWidth`](output.md#typeprintwidth)                                           | Root     |                                                            |\n| [`customCss`](output.md#customcss)                                                     | Root     |                                                            |\n| [`customJs`](output.md#customjs)                                                       | Root     |                                                            |\n| [`customFooterHtml`](output.md#customfooterhtml)                                       | Root     |                                                            |\n| [`customFooterHtmlDisableWrapper`](output.md#customfooterhtmldisablewrapper)           | Root     |                                                            |\n| [`markdownItOptions`](output.md#markdownitoptions)                                     | Root     |                                                            |\n| [`markdownItLoader`](output.md#markdownitloader)                                       | Root     |                                                            |\n| [`displayBasePath`](output.md#displaybasepath)                                         | Both     | Used to determine file names of entry points and documents |\n| [`cname`](output.md#cname)                                                             | Root     |                                                            |\n| [`favicon`](output.md#favicon)                                                         | Root     |                                                            |\n| [`sourceLinkExternal`](output.md#sourcelinkexternal)                                   | Root     |                                                            |\n| [`markdownLinkExternal`](output.md#markdownlinkexternal)                               | Root     |                                                            |\n| [`lang`](output.md#lang)                                                               | Root     |                                                            |\n| [`locales`](output.md#locales)                                                         | Root     |                                                            |\n| [`githubPages`](output.md#githubpages)                                                 | Root     |                                                            |\n| [`cacheBust`](output.md#cachebust)                                                     | Root     |                                                            |\n| [`hideGenerator`](output.md#hidegenerator)                                             | Root     |                                                            |\n| [`searchInComments`](output.md#searchincomments)                                       | Root     |                                                            |\n| [`searchInDocuments`](output.md#searchindocuments)                                     | Root     |                                                            |\n| [`cleanOutputDir`](output.md#cleanoutputdir)                                           | Root     |                                                            |\n| [`titleLink`](output.md#titlelink)                                                     | Root     |                                                            |\n| [`navigationLinks`](output.md#navigationlinks)                                         | Root     |                                                            |\n| [`sidebarLinks`](output.md#sidebarlinks)                                               | Root     |                                                            |\n| [`navigation`](output.md#navigation)                                                   | Root     |                                                            |\n| [`headings`](output.md#headings)                                                       | Root     |                                                            |\n| [`sluggerConfiguration`](output.md#sluggerconfiguration)                               | Root     |                                                            |\n| [`navigationLeaves`](output.md#navigationleaves)                                       | Root     |                                                            |\n| [`visibilityFilters`](output.md#visibilityfilters)                                     | Root     |                                                            |\n| [`searchCategoryBoosts`](output.md#searchcategoryboosts)                               | Root     |                                                            |\n| [`searchGroupBoosts`](output.md#searchgroupboosts)                                     | Root     |                                                            |\n| [`hostedBaseUrl`](output.md#hostedbaseurl)                                             | Root     |                                                            |\n| [`useHostedBaseUrlForAbsoluteLinks`](output.md#usehostedbaseurlforabsolutelinks)       | Root     |                                                            |\n| [`useFirstParagraphOfCommentAsSummary`](output.md#usefirstparagraphofcommentassummary) | Root     |                                                            |\n| [`includeHierarchySummary`](output.md#includehierarchysummary)                         | Root     |                                                            |\n\n## Comment Options\n\n| Option                                                                                               | Location | Notes                                                                       |\n| ---------------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------- |\n| [`commentStyle`](comments.md#commentstyle)                                                           | Package  |                                                                             |\n| [`useTsLinkResolution`](comments.md#usetslinkresolution)                                             | Package  |                                                                             |\n| [`preserveLinkText`](comments.md#preservelinktext)                                                   | Package  |                                                                             |\n| [`jsDocCompatibility`](comments.md#jsdoccompatibility)                                               | Package  |                                                                             |\n| [`suppressCommentWarningsInDeclarationFiles`](comments.md#suppresscommentwarningsindeclarationfiles) | Package  |                                                                             |\n| [`blockTags`](comments.md#blocktags)                                                                 | Package  |                                                                             |\n| [`inlineTags`](comments.md#inlinetags)                                                               | Package  |                                                                             |\n| [`modifierTags`](comments.md#modifiertags)                                                           | Package  |                                                                             |\n| [`cascadedModifierTags`](comments.md#cascadedmodifiertags)                                           | Package  |                                                                             |\n| [`excludeTags`](comments.md#excludetags)                                                             | Package  |                                                                             |\n| [`notRenderedTags`](comments.md#notrenderedtags)                                                     | Root     |                                                                             |\n| [`preservedTypeAnnotationTags`](comments.md#preservedtypeannotationtags)                             | Package  |                                                                             |\n| [`externalSymbolLinkMappings`](comments.md#externalsymbollinkmappings)                               | Both     | Unresolved links are checked both when converting and when merging projects |\n\n## Organization Options\n\n| Option                                                           | Location | Notes                                                                                      |\n| ---------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------ |\n| [`groupReferencesByType`](organization.md#groupreferencesbytype) | Both     | Root: Used when determining the group for search group boosts, Package: Used when grouping |\n| [`categorizeByGroup`](organization.md#categorizebygroup)         | Package  |                                                                                            |\n| [`defaultCategory`](organization.md#defaultcategory)             | Both     | Root: Used when determining the category for search, Package: Used when categorizing       |\n| [`categoryOrder`](organization.md#categoryorder)                 | Package  |                                                                                            |\n| [`groupOrder`](organization.md#grouporder)                       | Package  |                                                                                            |\n| [`sort`](organization.md#sort)                                   | Both     | Root: Sorting for packages, Package: Sorting within packages                               |\n| [`sortEntryPoints`](organization.md#sortentrypoints)             | Both     | Root: Whether to sort packages, Package: Whether to sort entry points                      |\n| [`kindSortOrder`](organization.md#kindsortorder)                 | Package  |                                                                                            |\n\n## Validation Options\n\n| Option                                                                             | Location | Notes                                                                                                                                        |\n| ---------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- |\n| [`validation`](validation.md#validation)                                           | Both     | TypeDoc modifies the default for packages to defer most validation until projects have been merged. Should generally only be set in the root |\n| [`treatWarningsAsErrors`](validation.md#treatwarningsaserrors)                     | Root     |                                                                                                                                              |\n| [`treatValidationWarningsAsErrors`](validation.md#treatvalidationwarningsaserrors) | Root     |                                                                                                                                              |\n| [`intentionallyNotExported`](validation.md#intentionallynotexported)               | Both     |                                                                                                                                              |\n| [`requiredToBeDocumented`](validation.md#requiredtobedocumented)                   | Both     |                                                                                                                                              |\n| [`packagesRequiringDocumentation`](validation.md#packagesrequiringdocumentation)   | Both     |                                                                                                                                              |\n| [`intentionallyNotDocumented`](validation.md#intentionallynotdocumented)           | Both     |                                                                                                                                              |\n\n## Other Options\n\n| Option                                                | Location | Notes                                |\n| ----------------------------------------------------- | -------- | ------------------------------------ |\n| [`watch`](other.md#watch)                             | Root     | Not supported in packages mode       |\n| [`preserveWatchOutput`](other.md#preservewatchoutput) | Root     |                                      |\n| [`help`](other.md#help)                               | Root     |                                      |\n| [`version`](other.md#version)                         | Root     |                                      |\n| [`showConfig`](other.md#showconfig)                   | Root     | Only shows root configuration values |\n| [`logLevel`](other.md#loglevel)                       | Root     |                                      |\n| [`skipErrorChecking`](other.md#skiperrorchecking)     | Package  |                                      |\n"
  },
  {
    "path": "site/options/validation.md",
    "content": "---\ntitle: Validation\n---\n\nOptions that control how TypeDoc validates your documentation.\n\n## validation\n\nCLI:\n\n```bash\n$ typedoc --validation.invalidLink\n$ typedoc --validation\n```\n\ntypedoc.json (defaults):\n\n```json\n{\n    \"validation\": {\n        \"notExported\": true,\n        \"invalidLink\": true,\n        \"invalidPath\": true,\n        \"rewrittenLink\": true,\n        \"notDocumented\": false,\n        \"unusedMergeModuleWith\": true\n    }\n}\n```\n\nSpecifies validation steps TypeDoc should perform on your generated\ndocumentation. Most validation occurs before rendering, but `rewrittenLink` is\ndone during HTML rendering as links have not been generated before rendering\nbegins.\n\n- **notExported** - Produce warnings if a type is referenced by the\n  documentation but the type isn't exported and therefore included in the\n  documentation.\n- **invalidLink** - Produce warnings for `@link` tags which cannot be resolved.\n- **invalidPath** - Produce warnings for links to relative paths which do not resolve\n  to a file and therefore cannot be copied to the documentation output folder.\n- **rewrittenLink** - Produce warnings for `@link` tags which are resolved,\n  but whose target does not have a unique URL in the documentation. TypeDoc\n  will rewrite these links to point to the first parent with a URL.\n- **notDocumented** - Produce warnings for reflections which do not have a\n  documentation comment. This is also controlled by the\n  [requiredToBeDocumented](#requiredtobedocumented) option.\n- **unusedMergeModuleWith** - Produce warnings for\n  [`@mergeModuleWith`](../tags/mergeModuleWith.md) tags which are not\n  resolved. This option should generally be disabled if generating JSON which\n  will be combined with another document later.\n\n## treatWarningsAsErrors\n\n```bash\n$ typedoc --treatWarningsAsErrors\n```\n\nCauses TypeDoc to treat any reported warnings as fatal errors that can prevent documentation from being generated.\n\n## treatValidationWarningsAsErrors\n\n```bash\n$ typedoc --treatValidationWarningsAsErrors\n```\n\nLimited version of `treatWarningsAsErrors` that only applies to warnings emitted during validation of a project.\nThis option cannot be used to turn `treatWarningsAsErrors` off for validation warnings.\n\n## intentionallyNotExported\n\nLists symbols which are intentionally excluded from the documentation output and should not produce warnings.\nEntries may optionally specify a package name / package relative file name before a colon to only suppress warnings for symbols declared in a specific file.\n\ntypedoc.json:\n\n```json\n{\n    \"intentionallyNotExported\": [\n        \"InternalClass\",\n        \"typedoc/src/other.ts:OtherInternal\"\n    ]\n}\n```\n\n## requiredToBeDocumented\n\nSet the list of reflection types that must be documented, used by `validation.notDocumented`\n\nThe full list of available values are below, with entries not required by default commented out.\n\ntypedoc.json:\n\n```json\n{\n    \"requiredToBeDocumented\": [\n        // \"Project\",\n        // \"Module\",\n        // \"Namespace\",\n        \"Enum\",\n        \"EnumMember\",\n        \"Variable\",\n        \"Function\",\n        \"Class\",\n        \"Interface\",\n        // \"Constructor\",\n        \"Property\",\n        \"Method\",\n        // Implicitly set if function/method is set (this means you can't require docs on methods, but not functions)\n        // This exists because methods/functions can have multiple signatures due to overloads, and TypeDoc puts comment\n        // data on the signature. This might be improved someday, so you probably shouldn't set this directly.\n        //    \"CallSignature\",\n        // Index signature { [k: string]: string } \"properties\"\n        //    \"IndexSignature\",\n        // Equivalent to Constructor due to the same implementation detail as CallSignature\n        //    \"ConstructorSignature\",\n        // \"Parameter\",\n        // Used for object literal types. You probably should set TypeAlias instead, which refers to types created with `type X =`.\n        // This only really exists because of an implementation detail.\n        //    \"TypeLiteral\",\n        // \"TypeParameter\",\n        \"Accessor\", // shorthand for GetSignature + SetSignature\n        //   \"GetSignature\",\n        //    \"SetSignature\",\n        \"TypeAlias\"\n        // TypeDoc creates reference reflections if a symbol is exported from a package with multiple names. Most projects\n        // won't have any of these, and they just render as a link to the canonical name.\n        //    \"Reference\",\n    ]\n}\n```\n\n## packagesRequiringDocumentation\n\nSpecifies which packages TypeDoc should expect to have documentation.\nDefaults to the name of your package from `package.json`.\n\n```json\n{\n    \"packagesRequiringDocumentation\": [\"typedoc\", \"typedoc-plugin-mdn-links\"]\n}\n```\n\n## intentionallyNotDocumented\n\nUsed to selectively ignore undocumented fields, used by `validation.notDocumented`.\nThis should include the qualified name printed when a member is not documented if it cannot be\nor should not be documented normally.\n\n```json\n{\n    \"intentionallyNotDocumented\": [\"Namespace.Class.prop\"]\n}\n```\n"
  },
  {
    "path": "site/options.md",
    "content": "---\ntitle: Options\nchildren:\n    - options/configuration.md\n    - options/input.md\n    - options/output.md\n    - options/comments.md\n    - options/organization.md\n    - options/validation.md\n    - options/other.md\n    - options/package-options.md\n---\n\nAny command line arguments that are passed without a flag will be parsed as entry points.\nAny options passed on the command line will override options set in a configuration file.\n\n## Configuration Options\n\nOptions which control what files TypeDoc reads.\n\n{@listOptions options/configuration.md}\n\n## Input Options\n\nOptions which control how input is converted into a project that can be rendered\nto HTML or JSON.\n\n{@listOptions options/input.md}\n\n## Output Options\n\nOptions which control TypeDoc's HTML output.\n\n{@listOptions options/output.md}\n\n## Comment Options\n\nOptions which control how TypeDoc parses comments and documents.\n\n{@listOptions options/comments.md}\n\n## Organization Options\n\nControls how TypeDoc organizes content within a converted project.\n\n{@listOptions options/organization.md}\n\n## Validation Options\n\nConfigures the validation performed by TypeDoc on a converted project.\n\n{@listOptions options/validation.md}\n\n## Other Options\n\n{@listOptions options/other.md}\n"
  },
  {
    "path": "site/overview.md",
    "content": "---\ntitle: Overview\n---\n\n## Requirements\n\nTypeDoc requires [Node.js](https://nodejs.org/) to run. It supports the current LTS\nversion or newer. It can be installed either locally to your project or globally.\n\n> [!warning]\n> If you install globally, be aware that [npm/cli#7057](https://github.com/npm/cli/issues/7057)\n> means that plugins and themes will get their own installation of TypeDoc unless you use the\n> `--legacy-peer-deps` flag. This will break many plugins and cause warnings from TypeDoc.\n\nTypeDoc aims to support the two latest TypeScript releases for the current release. Depending\non the scale of breaking changes introduced in a new TypeScript version, a given version may\nsupport more versions of TypeScript. TypeDoc may work with older (or newer) TypeScript versions, but\nthe supported version range will generally not include versions not supported by DefinitelyTyped.\n\n| TypeDoc Version | TypeScript Version | Status             |\n| --------------- | ------------------ | ------------------ |\n| 0.28            | 5.0 through 5.8    | ✅ Maintained      |\n| 0.27            | 5.0 through 5.8    | ⚠️ Security Updates |\n| 0.26            | 4.6 through 5.6    | ❌ Unmaintained    |\n| 0.25            | 4.6 through 5.4    | ❌ Unmaintained    |\n| 0.24            | 4.6 through 5.1    | ❌ Unmaintained    |\n| 0.23            | 4.6 through 5.0    | ❌ Unmaintained    |\n| 0.22            | 4.0 through 4.7    | ❌ Unmaintained    |\n| 0.21            | 4.0 through 4.4    | ❌ Unmaintained    |\n| 0.20            | 3.9 through 4.2    | ❌ Unmaintained    |\n| 0.19            | 3.9 through 4.0    | ❌ Unmaintained    |\n\n## Command Line Interface\n\nTypeDoc's CLI can be used through your terminal or npm scripts. Any arguments\npassed to TypeDoc which are not flags are parsed as entry points. TypeDoc will\nalso read configuration from several files. See [Configuration](./options/configuration.md#compileroptions)\nfor details on where options are read from.\n\n<details>\n<summary><code>typedoc --help</code></summary>\n{@includeCode generated/help.txt}\n</details>\n\n## Node Module\n\nTypeDoc exposes an API which can be used to run it without any configuration files.\n\n```js\nimport * as td from \"typedoc\";\n\n// Application.bootstrap also exists, which will not load plugins\n// Also accepts an array of option readers if you want to disable\n// TypeDoc's tsconfig.json/package.json/typedoc.json option readers\nconst app = await td.Application.bootstrapWithPlugins({\n    // Note: This accepts globs, do not pass paths with backslash path separators!\n    entryPoints: [\"src/index.ts\"],\n});\n\n// May be undefined if errors are encountered.\nconst project = await app.convert();\n\nif (project) {\n    // Generate configured outputs\n    await app.generateOutputs(project);\n\n    // Alternatively...\n    const outputDir = \"docs\";\n    // Generate HTML rendered docs\n    await app.generateDocs(project, outputDir);\n    // Alternatively generate JSON output\n    await app.generateJson(project, outputDir + \"/docs.json\");\n}\n```\n\n## Browser Bundle\n\nTypeDoc exports a limited portion of its API surface for users who want to process\nserialized JSON from TypeDoc within a browser via `typedoc/browser`. The browser\nentry point includes the following components:\n\n- TypeDoc's models\n- `Serializer` and `Deserializer` classes\n- A small set of utility functions\n\n```ts\nimport {\n    ConsoleLogger,\n    Deserializer,\n    FileRegistry,\n    setTranslations,\n} from \"typedoc/browser\";\n\n// Similar paths are available for ja, ko, zh\nimport translations from \"typedoc/browser/en\";\n\n// Before doing anything with TypeDoc, it should be configured with translations\nsetTranslations(translations);\n\nconst projectJson = await fetch(\"...\").then(r => r.json());\n\nconst logger = new ConsoleLogger();\nconst deserializer = new Deserializer(logger);\nconst project = deserializer.reviveProject(\"API Docs\", projectJson, {\n    projectRoot: \"/\",\n    registry: new FileRegistry(),\n});\n\n// Now we can use TypeDoc's models to more easily analyze the json\nconsole.log(project.getChildByName(\"SomeClass.property\"));\nconsole.log(project.getChildByName(\"SomeClass.property\").type.toString());\n```\n"
  },
  {
    "path": "site/plugins.md",
    "content": "---\ntitle: Plugins\n---\n\nTypeDoc will load plugins specified with the `--plugin` flag. There are a number of community developed plugins available for installation on npm.\n\nYou can find more plugins on npm using the [typedoc-plugin](https://www.npmjs.com/search?q=keywords:typedoc-plugin) keyword.\n\nFor writing your own plugin, see the [Plugin Development](./development/plugins.md) page.\n\n{@include generated/plugins.md}\n"
  },
  {
    "path": "site/site-plugin.js",
    "content": "// @ts-check\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Application, Converter, OptionDefaults } from \"typedoc\";\n/** @import { CommentDisplayPart, FileRegistry, TranslatedString} from \"typedoc\" */\n\n/** @param {Application} app */\nexport function load(app) {\n    app.on(Application.EVENT_BOOTSTRAP_END, () => {\n        app.options.setValue(\"inlineTags\", [\n            ...OptionDefaults.inlineTags,\n            \"@listOptions\",\n        ]);\n    });\n\n    app.converter.on(Converter.EVENT_CREATE_DOCUMENT, (_ctx, doc) => {\n        // Known we have this as documents always have a file path\n        const fileName = /** @type {string} */ (\n            doc.project.files.getReflectionPath(doc)\n        );\n\n        replaceListOptions(fileName, doc.content, doc.project.files);\n    });\n\n    /**\n     * @param {string} sourceFile\n     * @param {CommentDisplayPart[]} parts\n     * @param {FileRegistry} files\n     */\n    function replaceListOptions(sourceFile, parts, files) {\n        for (let i = 0; i < parts.length; ++i) {\n            const part = parts[i];\n            if (part.kind === \"inline-tag\" && part.tag === \"@listOptions\") {\n                parts.splice(\n                    i,\n                    1,\n                    ...buildListOptions(sourceFile, part.text.trim(), files),\n                );\n            }\n        }\n    }\n\n    /**\n     * @param {string} sourceFile\n     * @param {string} userPath\n     * @param {FileRegistry} files\n     * @returns {CommentDisplayPart[]}\n     */\n    function buildListOptions(sourceFile, userPath, files) {\n        const file = join(dirname(sourceFile), userPath.trim());\n\n        /** @type {string[]} */\n        const headings = [];\n        const content = readFileSync(file, \"utf-8\");\n        for (const line of content.split(\"\\n\")) {\n            if (line.startsWith(\"## \")) {\n                headings.push(line.substring(3).trim());\n            }\n        }\n\n        /** @type {CommentDisplayPart[]} */\n        const result = [];\n\n        for (const heading of headings) {\n            result.push({ kind: \"text\", text: `- [${heading}](` });\n            const text = userPath + \"#\" + heading.toLowerCase();\n            const relPath = files.register(sourceFile, text);\n            if (!relPath) {\n                app.logger.warn(\n                    /** @type {TranslatedString} */ (\n                        `@listOptions specified a file \"${text}\" which does not exist`\n                    ),\n                );\n                return [];\n            }\n\n            result.push({\n                kind: \"relative-link\",\n                target: relPath?.target,\n                targetAnchor: relPath?.anchor,\n                text,\n            });\n            result.push({ kind: \"text\", text: \")\\n\" });\n        }\n\n        return result;\n    }\n}\n"
  },
  {
    "path": "site/tags/abstract.md",
    "content": "---\ntitle: \"@abstract\"\n---\n\n# @abstract\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThis tag can be used to tell TypeDoc to document a method or property as\nabstract, even though it is not according to TypeScript. It can be convenient if\na module may be used by JS consumers without type hints and you want to provide\na default implementation which throws with a more helpful error message.\n\n## Example\n\n```ts\nexport class AbstractExample {\n    /** @abstract */\n    requiredOverride(): void {\n        throw new Error(\n            \"requiredOverride not implemented in subclass of AbstractExample\",\n        );\n    }\n}\n```\n\n## See Also\n\n- The [`@public`](public.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags/alpha.md",
    "content": "---\ntitle: \"@alpha\"\n---\n\n# @alpha\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@alpha](https://tsdoc.org/pages/tags/alpha/)\n\nThis tag can be used to indicate that the associated member is intended\nto eventually be used by third-party developers but is not yet stable\nenough to conform to semantic versioning requirements.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @alpha */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@beta`](beta.md) tag\n- The [`@experimental`](experimental.md) tag\n- The [`@public`](public.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags/author.md",
    "content": "---\ntitle: \"@author\"\n---\n\n# @author\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@author` tag can be used to document the the author of a method. TypeDoc\nattaches no behavior to this tag, rendering it as a paragraph within the\ngenerated comment.\n\n## Example\n\n```ts\n/**\n * @author John Smith\n */\nexport function rand(min: number, max: number): number;\n```\n"
  },
  {
    "path": "site/tags/beta.md",
    "content": "---\ntitle: \"@beta\"\n---\n\n# @beta\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@beta](https://tsdoc.org/pages/tags/beta/)\n\nThis tag can be used to indicate that the associated member is intended to eventually be used by third-party\ndevelopers but is not yet stable enough to conform to semantic versioning requirements.\n\nThe TSDoc specification indicates that the `@beta` and `@experimental` tags should be treated as semantically\nequivalent. TypeDoc users should generally use one or the other, but not both.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @beta */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@alpha`](alpha.md) tag\n- The [`@experimental`](experimental.md) tag\n- The [`@public`](public.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags/category.md",
    "content": "---\ntitle: \"@category\"\n---\n\n# @category\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@category` tag can be used to place several related API items under a\ncommon header when listed in a page's index. It may be specified multiple times\nto list a reflection under several headings.\n\n## Example\n\n```ts\n/**\n * @categoryDescription Advanced Use\n * These functions are available for...\n * @showCategories\n * @module\n */\n\n/**\n * @category General Use\n */\nexport function runProcess(): void;\n\n/**\n * @category Advanced Use\n */\nexport function unref(): void;\n\n/**\n * @category Advanced Use\n */\nexport function ref(): void;\n```\n\n## Category Descriptions\n\nThe `@categoryDescription` block tag can be used to provide additional context\nabout a category of reflections which was created with the\n`@category` tag.\n\nThe `@categoryDescription` tag should be placed in the comment for the\nreflection which contains the child reflections marked with `@category`.\n\nThe first line of the `@categoryDescription` will be taken as the category name,\nand following lines will be used for the description.\n\n## Navigation Customization\n\nCategories can be added to the navigation tree with the\n`navigation.includeCategories` option. This can be selectively enabled or\ndisabled by specifying the `@showCategories` and `@hideCategories` modifier tags\nwithin the comment on the parent reflection.\n\n## See Also\n\n- The [`@group`](group.md) tag\n- The [`--categorizeByGroup`](../options/organization.md#categorizebygroup) option\n- The [`--defaultCategory`](../options/organization.md#defaultcategory) option\n- The [`--categoryOrder`](../options/organization.md#categoryorder) option\n- The [`--searchCategoryBoosts`](../options/output.md#searchcategoryboosts) option\n- The [`--navigation.includeCategories`](../options/output.md#navigation) option\n"
  },
  {
    "path": "site/tags/class.md",
    "content": "---\ntitle: \"@class\"\n---\n\n# @class\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nIf present on a variable, will cause it to be converted as a class. This\nwill result in all \"dynamic\" properties being expanded to real properties.\n\nTypeDoc will also ignore types/interfaces declared with the same name as\nvariables annotated with `@class`.\n\nIf the constructor function has more than one overload, TypeDoc will use\nthe return type for the first overload to determine the shape of the class.\n\nIf the constructor function is generic, the type parameters will be lifted\nup from the constructor function to become class type parameters.\n\n## Example\n\n```ts\n/** @class */\nexport function ClassLike() {\n    if (new.target) {\n        //\n    }\n}\n```\n\n## See Also\n\n- The [`@interface`](interface.md) tag\n"
  },
  {
    "path": "site/tags/defaultValue.md",
    "content": "---\ntitle: \"@defaultValue\"\n---\n\n# @defaultValue\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@defaultValue](https://tsdoc.org/pages/tags/defaultValue/)\n\nThe `@defaultValue` tag can be used to document the default value for an accessor or property.\nTypeDoc also recognizes the commonly used alternative `@default` block tag.\n\nThe default theme does not attach special behavior to this tag, displaying its contents under\na `# Default Value` header like other block tags.\n\n## Example\n\n```ts\nexport interface CompilerOptions {\n    strict?: boolean;\n    /**\n     * @defaultValue `true` if `strict` is `true`, otherwise `false`\n     */\n    strictNullChecks?: boolean;\n}\n```\n"
  },
  {
    "path": "site/tags/deprecated.md",
    "content": "---\ntitle: \"@deprecated\"\n---\n\n# @deprecated\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@deprecated](https://tsdoc.org/pages/tags/deprecated/)\n\nThe `@deprecated` tag indicates that a declaration should not be used and may be removed in a future release.\nTypeDoc will render members marked with `@deprecated` with a line through their name like VSCode.\n\n## Example\n\n```ts\n/**\n * @deprecated Use {@link NewWidget} instead.\n */\nexport class Widget {}\n\nexport class NewWidget {\n    /**\n     * @deprecated a single signature may be deprecated\n     */\n    work(): void;\n    /**\n     * This signature is not deprecated\n     */\n    work(token: CancellationToken): void;\n    work(token?: CancellationToken) {\n        // ...\n    }\n}\n```\n"
  },
  {
    "path": "site/tags/document.md",
    "content": "---\ntitle: \"@document\"\n---\n\n# @document\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nInstructs TypeDoc to include the path specified in the tag content as a document\nwithin the generated site. See the [External Documents](../external-documents.md) guide\nfor more details.\n\n## Example\n\n```ts\n/**\n * @document promise-tutorial.md\n */\nexport class Promise<T> {\n    // ...\n}\n```\n\n## See Also\n\n- The [`projectDocuments`](../options/input.md#projectdocuments) option\n"
  },
  {
    "path": "site/tags/enum.md",
    "content": "---\ntitle: \"@enum\"\n---\n\n# @enum\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nIf present on an object with string or number literal values, TypeDoc will convert the variable as an\nenumeration instead of a variable.\n\n## Example\n\n```ts\n/**\n * This will be displayed as an enumeration.\n * @enum\n */\nexport const MyEnum = {\n    /**\n     * Doc comments may be included here.\n     */\n    A: \"a\",\n    B: \"b\",\n} as const;\n\n/**\n * This works too, but is more verbose\n * @enum\n */\nexport const MyEnum2: { A: \"a\" } = { A: \"a\" };\n\n/**\n * So does this, for declaration files\n */\nexport declare const MyEnum3: { A: \"a\" };\n```\n"
  },
  {
    "path": "site/tags/event.md",
    "content": "---\ntitle: \"@event\"\n---\n\n# @event\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThe `@event` tag is used to mark a reflection as belonging in the \"Events\" group.\nIt is equivalent to specifying `@group Events` in the comment.\n\n## Example\n\n```ts\nexport class App extends EventEmitter {\n    /**\n     * @event\n     */\n    static ON_REQUEST = \"request\";\n}\n```\n\n## See Also\n\n- The [`@group`](group.md) tag\n- The [`@eventProperty`](eventProperty.md) tag\n"
  },
  {
    "path": "site/tags/eventProperty.md",
    "content": "---\ntitle: \"@eventProperty\"\n---\n\n# @eventProperty\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@eventProperty](https://tsdoc.org/pages/tags/eventProperty/)\n\nThe `@eventProperty` tag is used to mark a reflection as belonging in the \"Events\" group.\nIt is equivalent to specifying `@group Events` in the comment.\n\n## Example\n\n```ts\nexport class App extends EventEmitter {\n    /**\n     * @eventProperty\n     */\n    static ON_REQUEST = \"request\";\n}\n```\n\n## See Also\n\n- The [`@group`](group.md) tag\n- The [`@event`](event.md) tag\n"
  },
  {
    "path": "site/tags/example.md",
    "content": "---\ntitle: \"@example\"\n---\n\n# @example\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@example](https://tsdoc.org/pages/tags/example/)\n\nThe example tag indicates that the following text is an example of how to use the function.\n\n## Example\n\n````ts\n/**\n * Takes the factorial of `n`.\n *\n * @example\n * // If there are no code blocks, TypeDoc assumes the whole tag\n * // should be a code block. This is not valid TSDoc, but is recognized\n * // by VSCode and enables better JSDoc support.\n * factorial(1)\n *\n * @example\n * If there is a code block, then both TypeDoc and VSCode will treat\n * text outside of the code block as regular text.\n * ```ts\n * factorial(1)\n * ```\n */\nexport function factorial(n: number): number;\n````\n"
  },
  {
    "path": "site/tags/expand.md",
    "content": "---\ntitle: \"@expand\"\n---\n\n# Expand Tags\n\nThe `@expand`, `@expandType`, and `@preventExpand` tags can be used to control\nhow TypeDoc _displays_ references to type aliases and interfaces.\n\n## @expand\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThe `@expand` tag may be placed on type aliases and interfaces. When a type is\nannotated with `@expand`, TypeDoc will inline the type declaration of that type\nwherever it is referenced and TypeDoc has a place to include it.\n\n> [!note]\n> Use of this tag can _significantly_ increase the size of your generated\n> documentation if it is applied to commonly used types as it will result in\n> inlining the comments for those types everywhere they are referenced.\n\n### Example\n\nThis is particularly useful for React components, where the documentation for\nprops is useful when viewing the component function. The `Hello` component below\nwill take the description \"Props docs\" from `HelloProps` for its `props`\nparameter and also render details about the referenced type.\n\nThe `Hello2` component behaves similarly, but provides a more relevant\ndescription for the overall type, which prevents the summary provided in\n`HelloProps` from being used.\n\n```tsx\n/**\n * Props docs\n * @expand\n */\nexport type HelloProps = {\n    /** Name property docs */\n    name: string;\n};\n\n/**\n * Hello\n */\nexport function Hello(props: HelloProps) {\n    return {};\n}\n\n/**\n * Hello2\n * @param props Props docs (used instead of `@expand` description)\n */\nexport function Hello2(props: HelloProps) {\n    return {};\n}\n```\n\n## @expandType\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@expandType` can be placed on any reflection to tell TypeDoc to expand a type\nreference when rendering it within that reflection. It should specify the type name\nwithout type arguments.\n\n`@expandType` is inherited, it may be placed on a namespace or module where there are\nmultiple references to a type to instruct TypeDoc to expand the type everywhere in that\nmodule.\n\n### Example\n\nTypeDoc will expand `HelloProps` within `Hello` as if `@expand` had been placed\non `HelloProps`.\n\n```ts\nexport type HelloProps = {\n    /** Name description */\n    name: string;\n};\n\n/**\n * Hello component\n * @expandType HelloProps\n */\nexport function Hello(props: HelloProps) {\n    return <span>Hello {props.name}!</span>;\n}\n```\n\n## @preventExpand\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@preventExpand` block tag can be used to instruct TypeDoc to not expand a\ntag which has been expanded with `@expand`, `@preventExpand`, or by highlighting\nproperties of the reference type with `@param`.\n\n```tsx\n/**\n * @expand\n */\nexport type HelloProps = {\n    /** Name property docs */\n    name: string;\n};\n\n/**\n * Hello component - HelloProps will NOT be expanded here\n * @preventExpand HelloProps\n */\nexport function Hello2(props: HelloProps) {\n    return <span>Hello {props.name}!</span>;\n}\n```\n\n## See Also\n\n- The [`@inline`](inline.md) tags\n- The [`@param`](param.md) tag\n"
  },
  {
    "path": "site/tags/experimental.md",
    "content": "---\ntitle: \"@experimental\"\n---\n\n# @experimental\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@experimental](https://tsdoc.org/pages/tags/experimental/)\n\nThis tag can be used to indicate that the associated member is intended to eventually be used by third-party\ndevelopers but is not yet stable enough to conform to semantic versioning requirements.\n\nThe TSDoc specification indicates that the `@beta` and `@experimental` tags should be treated as semantically\nequivalent. TypeDoc users should generally use one or the other, but not both.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @experimental */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@alpha`](alpha.md) tag\n- The [`@beta`](beta.md) tag\n- The [`@public`](public.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags/function.md",
    "content": "---\ntitle: \"@function\"\n---\n\n# @function\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nIf a variable declaration is callable (but not constructable), TypeDoc can\nconvert it as a function. TypeDoc will only automatically convert it as a function\nif the variable's initializer is a function expression and the variable is not\nexplicitly typed.\n\nTypeDoc can be instructed to convert a callable variable declaration as a function\nwith the `@function` tag. The `@function` tag will have no effect if the variable\nit is placed on is not callable or is constructable.\n\n## Example\n\n```ts\nexport interface MultiCallSignature {\n    (): string;\n    (x: string): string;\n}\n\n// Documented as if it was a function with two overloads\n/** @function */\nexport const Callable: MultiCallSignature = () => \"\";\n\n// Documented as Callable2: MultiCallSignature\nexport const Callable2: MultiCallSignature = () => \"\";\n\n// Documented as if it was a function\nexport const Callable3 = () => \"\";\n\n// Documented as a variable\nexport const Callable4 = Object.assign(function () {\n    return \"\";\n}, {\n    fnProp: \"\",\n});\n\n// Documented as if it was a function\n/** @function */\nexport const Callable5 = Object.assign(function () {\n    return \"\";\n}, {\n    fnProp: \"\",\n});\n```\n\n## See Also\n\n- The [`@namespace`](namespace.md) tag\n- The [`@interface`](interface.md) tag\n"
  },
  {
    "path": "site/tags/group.md",
    "content": "---\ntitle: \"@group\"\n---\n\n# Group Tags\n\nThe `@group`, `@groupDescription`, `@showGroups`, `@hideGroups`, and\n`@disableGroups` tags can be used to control how TypeDoc organizes children of a\ndocumentation item.\n\n## @group\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@group` tag can be used to place several related API items under a common\nheader when listed in a page's index. It may be specified multiple times to list\na reflection under several headings.\n\nUnlike the [`@category`](category.md) tag, reflections will be automatically\nplaced under a header according to their kind if the `@group` tag is not\nspecified. This tag can be used to simulate custom member types.\n\n### Example\n\n```ts\n/**\n * @groupDescription Events\n * Events are for...\n * @showGroups\n */\nexport class App extends EventEmitter {\n    /**\n     * @group Events\n     */\n    static readonly BEGIN = \"begin\";\n\n    /**\n     * The `@event` tag is equivalent to `@group Events`\n     * @event\n     */\n    static readonly PARSE_OPTIONS = \"parseOptions\";\n\n    /**\n     * The `@eventProperty` tag is equivalent to `@group Events`\n     * @eventProperty\n     */\n    static readonly END = \"end\";\n}\n```\n\n## @groupDescription\n\nThe `@groupDescription` block tag can be used to provide additional context\nabout a group of reflections. TypeDoc automatically groups reflections according\nto their TypeScript kind, but custom groups can be created with the `@group`\ntag.\n\nThe `@groupDescription` tag should be placed in the comment for the reflection\nwhich contains the group of child reflections.\n\nThe first line of the `@groupDescription` will be taken as the group name, and\nfollowing lines will be used for the description.\n\n## Navigation Customization\n\nGroups can be added to the navigation tree with the `navigation.includeGroups`\noption. This can be selectively enabled or disabled by specifying the\n`@showGroups` and `@hideGroups` modifier tags within the comment on the parent\nreflection. These tags have no effect within the page contents.\n\n## @disableGroups\n\nThe `@disableGroups` tag can be used to selectively disable TypeDoc's grouping\nmechanism on a per-parent basis. This is recommended only for documentation\nsites which contain a small number of members.\n\nNote: A corresponding `@disableCategories` tag does not exist as categories are\nonly created if explicitly requested by including `@category` on at least one\nchild of the parent.\n\n```ts\n/**\n * This is a very small module where separating members into groups by type\n * doesn't make sense.\n * @module\n * @disableGroups\n */\n\nexport const variable = 123;\n\nexport function fn() {}\n```\n\n## See Also\n\n- The [`@category`](category.md) tag\n- The [`--searchGroupBoosts`](../options/output.md#searchgroupboosts) option\n- The [`--navigation.includeGroups`](../options/output.md#navigation) option\n"
  },
  {
    "path": "site/tags/hidden.md",
    "content": "---\ntitle: \"@hidden\"\n---\n\n# @hidden\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nReflections marked with the `@hidden` tag will be removed from the documentation.\nIt is equivalent to the `@ignore` JSDoc tag, which is also recognized by TypeDoc.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @hidden */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@ignore`](ignore.md) tag\n- The [`@internal`](internal.md) tag\n"
  },
  {
    "path": "site/tags/hideconstructor.md",
    "content": "---\ntitle: \"@hideconstructor\"\n---\n\n# @hideconstructor\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThis tag should only be used to work around [TypeScript#58653](https://github.com/microsoft/TypeScript/issues/58653).\nPrefer the [`@hidden`](hidden.md) or [`@ignore`](ignore.md) tags instead.\n\nClasses marked with `@hideconstructor` will have their constructor hidden, it may also be placed on constructors to\nremove them from the documentation\n\n## Example\n\n```ts\n/** @hideconstructor */\nexport class Visibility {\n    /** Will not be present in the generated documentation */\n    constructor() {}\n}\n```\n\n## See Also\n\n- The [`@hidden`](hidden.md) tag\n- The [`@ignore`](ignore.md) tag\n"
  },
  {
    "path": "site/tags/ignore.md",
    "content": "---\ntitle: \"@ignore\"\n---\n\n# @ignore\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nReflections marked with the `@ignore` tag will be removed from the documentation.\nIt is equivalent to the `@hidden` tag.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @ignore */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@hidden`](hidden.md) tag\n- The [`@internal`](internal.md) tag\n- The [JSDoc `@ignore`](https://jsdoc.app/tags-ignore.html) tag\n"
  },
  {
    "path": "site/tags/import.md",
    "content": "---\ntitle: \"@import\"\n---\n\n# @import\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@import` tag is recognized for use in JavaScript projects which can use it\nto declare type imports since TypeScript 5.5. Any comment containing `@import`\nwill be ignored by TypeDoc.\n\n## Example\n\nTaken from the [TypeScript 5.5 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html#the-jsdoc-import-tag)\n\n```js\n/** @import { SomeType } from \"some-module\" */\n/**\n * @param {SomeType} myValue\n */\nfunction doSomething(myValue) {\n    // ...\n}\n```\n\n## See Also\n\n- The [TypeScript 5.5 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html#the-jsdoc-import-tag)\n"
  },
  {
    "path": "site/tags/include.md",
    "content": "---\ntitle: \"\\{\\@include\\}\"\n---\n\n# \\{\\@include\\}\n\n**Tag Kind:** [Inline](../tags.md#inline-tags)\n\nThe `@include` tag can be used to include external markdown content within\nthe comment for a member. It is an inline tag which will be replaced with the\ncontents of the specified file.\n\nFor convenience, an `@includeCode` inline tag is also recognized, which will\ninclude the referenced file within a code block, using the file extension for\nselecting the syntax highlighting language.\n\nNote: Paths in `@include` and `@includeCode` should use forward POSIX style slashes (`/`)\nnot Windows style path separators (`\\`)\n\n## Example\n\n```ts\n/**\n * {@include ./doSomething_docs.md}\n *\n * Quick start:\n * {@includeCode ../examples/doSomethingQuickStart.ts}\n *\n * @example\n * This will only work if the jsdocCompatibility.exampleTag option is false\n * {@includeCode ../test/doSomething.test.ts}\n */\nfunction doSomething() {}\n```\n\n<!-- #region includePartsOfFiles -->\n\n## Including Parts of Files\n\nThe `@include` and `@includeCode` tags can also include only parts of a file by referring to a specific named region.\n\n### Using Regions\n\nFor example:\n\n```md\n{@includeCode ../../example/src/enums.ts#simpleEnum}\n```\n\nMultiple regions may be specified, separated by commas. If multiple regions are\nspecified, TypeDoc will combine them into a single code block.\n\n```md\n{@includeCode file.ts#region1,region2}\n```\n\nRegions are specified in the files themselves via comments.\n\nIn TypeScript for example, the following would be a valid region:\n\n{@includeCode ../../example/src/enums.ts#simpleEnumRegion}\n\n**Result:**\n\n{@includeCode ../../example/src/enums.ts#simpleEnum}\n\nLanguage-dependent region syntax is meant to be compatible with VS Code\n[Folding](https://code.visualstudio.com/docs/editor/codebasics#_folding).\nThe following table describes how to define regions in different languages.\n\n| Language              | Start region                                           | End region                                                 |\n| --------------------- | ------------------------------------------------------ | ---------------------------------------------------------- |\n| Bat                   | `::#region regionName` or `REM #region regionName`     | `::#endregion regionName` or `REM #endregion regionName`   |\n| C#                    | `#region regionName`                                   | `#endregion regionName`                                    |\n| C/C++                 | `#pragma region regionName`                            | `#pragma endregion regionName`                             |\n| CSS/Less/SCSS         | `/*#region regionName*/`                               | `/*#endregion regionName*/`                                |\n| Coffeescript          | `#region regionName`                                   | `#endregion regionName`                                    |\n| F#                    | `//#region regionName` or `(#_region) regionName`      | `//#endregion regionName` or `(#_endregion) regionName`    |\n| Java                  | `//#region regionName` or `//<editor-fold> regionName` | `//#endregion regionName` or `//</editor-fold> regionName` |\n| Markdown              | `<!-- #region regionName -->`                          | `<!-- #endregion regionName -->`                           |\n| Perl5                 | `#region regionName` or `=pod regionName`              | `#endregion regionName` or `=cut regionName`               |\n| PHP                   | `#region regionName`                                   | `#endregion regionName`                                    |\n| PowerShell            | `#region regionName`                                   | `#endregion regionName`                                    |\n| Python                | `#region regionName` or `# region regionName`          | `#endregion regionName` or `# endregion regionName`        |\n| TypeScript/JavaScript | `//#region regionName`                                 | `//#endregion regionName`                                  |\n| Visual Basic          | `#Region regionName`                                   | `#End Region regionName`                                   |\n\n### Using Line Numbers\n\nWhen you can't add comments to define regions (in JSON files, for example) you can use line numbers instead to include a specific region of a file.\n\n> [!warning]\n> Referencing line numbers should be avoided since the reference will likely break when every time the file changes.\n\n```md\n{@includeCode ../../package.json:2,6-7}\n```\n\n**Result:**\n\n{@includeCode ../../package.json:2,6-7}\n\nA colon (`:`) separates the file path from the line numbers: a comma-separated list of numbers or ranges of the form `<start>-<end>` (`6-7` in the example above).\n\n> [!note]\n> The first line in the file Line 1, not Line 0, just like you would see in most code editors.\n\n<!-- #endregion includePartsOfFiles -->\n\n## See Also\n\n- The [jsdocCompatibility](../options/comments.md#jsdoccompatibility) option.\n"
  },
  {
    "path": "site/tags/inheritDoc.md",
    "content": "---\ntitle: \"\\{\\@inheritDoc\\}\"\n---\n\n**Tag Kind:** [Inline](../tags.md#inline-tags) / [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@inheritDoc](https://tsdoc.org/pages/tags/inheritDoc/)\n\nThe `@inheritDoc` tag is used to create a reflection's documentation by copying it from another\nreflection. The tag has the form `{@inheritDoc ref}` where `ref` is a\n[declaration reference](../declaration-references.md).\n\n## Copied Elements\n\nThe `@inheritDoc` tag, following the TSDoc specification, will only copy the following parts\nof a comment:\n\n- The summary\n- The `@remarks` block\n- Any `@param` blocks\n- Any `@typeParam` Blocks\n- The `@returns` block\n\n## Example\n\n```ts\n/**\n * Some documentation\n */\nexport class SomeClass {}\n\n/** {@inheritDoc SomeClass} */\nexport interface SomeUnrelatedClass {}\n```\n\n## TSDoc Compatibility\n\nThe TSDoc standard states that the `@inheritDoc` tag is an inline tag. This conflicts with\nJSDoc's usage, which expects it to be present without wrapping braces. TypeDoc will parse\nboth `{@inheritDoc}` and `@inheritDoc`. When present without braces, TypeDoc will inherit\ncomments from the \"parent\" reflection if possible.\n\n## See Also\n\n- JSDoc's [`@inheritdoc`](https://jsdoc.app/tags-inheritdoc.html)\n"
  },
  {
    "path": "site/tags/inline.md",
    "content": "---\ntitle: \"@inline\"\n---\n\n# Inline Tags\n\nThe `@inline`, `@inlineType` and `@preventInline` tags can be used to control how\nTypeDoc converts references to type aliases and interfaces.\n\n## @inline\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThe `@inline` tag may be placed on type aliases and interfaces. When a type is\nannotated with `@inline` and the type is referenced, TypeDoc will attempt to inline\nthe referenced type within the other type. TypeDoc is unable to inline some types,\nnotably type references with type parameters in some cases, and may make incorrect\nguesses about the shape of types which aren't object literals, unions, intersections,\nor literals. Please report a bug if `@inline` incorrectly converts a type.\n\n> [!note]\n> Use of this tag can _significantly_ increase the size of your generated\n> documentation if it is applied to commonly used types as it will result in\n> inlining the comments for those types everywhere they are referenced.\n\n### Example\n\n```tsx\n/**\n * @inline\n */\nexport type HelloProps = {\n    /** Name property docs */\n    name: string;\n};\n\n/**\n * Hello component - HelloProps will be inlined here as\n * if you had written `Hello(props: { name: string })`\n */\nexport function Hello(props: HelloProps) {\n    return <span>Hello {props.name}!</span>;\n}\n```\n\n## @inlineType\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@inlineType` block tag can be used to selectively inline a type reference\nwithout inlining it everywhere. It should specify the type name without type\narguments.\n\n### Example\n\n```ts\nexport type HelloProps = {\n    name: string;\n};\n\n/**\n * Hello component - HelloProps will be inlined here as\n * if you had written `Hello(props: { name: string })`\n * @inlineType HelloProps\n */\nexport function Hello(props: HelloProps) {\n    return <span>Hello {props.name}!</span>;\n}\n```\n\n## @preventInline\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@preventInline` block tag can be used to instruct TypeDoc to not inline a\ntag which has been inlined with `@inline` or `@preventInline`. Note that TypeDoc\nwill be unable to produce a type reference instead of an inlined type if\nTypeScript does not produce a named reference to begin with. If you remove\n`@inline` and the type is still inlined in your type, `@preventInline` cannot\nprevent the expansion.\n\n### Example\n\n```tsx\n/**\n * @inline\n */\nexport type HelloProps = {\n    /** Name property docs */\n    name: string;\n};\n\n/**\n * Hello component - HelloProps will NOT be inlined here\n * @preventInline HelloProps\n */\nexport function Hello2(props: HelloProps) {\n    return <span>Hello {props.name}!</span>;\n}\n```\n\n## See Also\n\n- The [`@expand`](expand.md) tags\n"
  },
  {
    "path": "site/tags/interface.md",
    "content": "---\ntitle: \"@interface\"\n---\n\n# @interface\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nIf present on a type alias, will cause it to be converted as an interface. This\nwill result in all \"dynamic\" properties being expanded to real properties.\n\n## Example\n\n```ts\n/**\n * This will be displayed as an interface\n * @property a comment for a\n * @prop b comment for b\n * @interface\n */\nexport type Resolved = Record<\"a\" | \"b\" | \"c\", string>;\n\n// will be documented as if you wrote\n\n/** This will be displayed as an interface */\nexport interface Resolved {\n    /** comment for a */\n    a: string;\n    /** comment for b */\n    b: string;\n    c: string;\n}\n```\n\n## See Also\n\n- The [`@property`](property.md) tag\n- The [`@namespace`](namespace.md) tag\n- The [`@useDeclaredType`](useDeclaredType.md) tag\n"
  },
  {
    "path": "site/tags/internal.md",
    "content": "---\ntitle: \"@internal\"\n---\n\n# @internal\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@internal](https://tsdoc.org/pages/tags/internal/)\n\nThe `@internal` tag indicates that a reflection is not intended to be used by API consumers.\nAPI items annotated with `@internal` may be removed from the generated documentation by specifying\nthe `--excludeInternal` option.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @internal */\n    member = 123;\n}\n```\n\n## See Also\n\n- The [`@alpha`](alpha.md) tag\n- The [`@beta`](beta.md) tag\n- The [`@experimental`](experimental.md) tag\n- The [`--excludeInternal`](../options/input.md#excludeinternal) option\n- The [`--stripInternal`](https://www.typescriptlang.org/tsconfig#stripInternal) TypeScript compiler option\n"
  },
  {
    "path": "site/tags/label.md",
    "content": "---\ntitle: \"\\{\\@label\\}\"\n---\n\n# {@label}\n\n**Tag Kind:** [Inline](../tags.md#inline-tags) <br>\n**TSDoc Reference:** [@label](https://tsdoc.org/pages/tags/label/)\n\nThe `@label` tag can be used to give an overloaded signature a name that it can be referenced\nwith via a [declaration reference](../declaration-references.md).\n\nThe identifier specified by the `@label` tag should contain only `A-Z`, `0-9`, and `_`, and should\nnot start with a number. If the identifier does not match this pattern, TypeDoc will be unable to\nuse it when referencing via a declaration reference.\n\n## Example\n\n```ts\n/**\n * {@label BASE}\n */\nexport function round(x: number);\n/**\n * {@label PRECISION}\n */\nexport function round(x: number, y: number);\nexport function round(x: number, y = 0) {\n    // ...\n}\n\n/**\n * A value rounded with {@link round:PRECISION}\n */\nexport const rounded = round(123.456, 2);\n```\n\n## TSDoc Compatibility\n\nWhile the `@label` tag is considered a core tag by TSDoc, its usage in the form of declaration references\nsupported by TypeDoc is not permitted. TypeDoc extends the declaration reference grammar to support it,\nbut users should be aware that this is non-standard. See [declaration references](../declaration-references.md)\nfor additional details.\n\n## See Also\n\n- The [`@link`](link.md) tag\n- [Declaration references](../declaration-references.md) documentation\n"
  },
  {
    "path": "site/tags/license.md",
    "content": "---\ntitle: \"@license\"\n---\n\n# @license\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@license` tag is recognized to declare a license comment which should not\nbe included in the documentation. Any comments containing `@license` will be\nexcluded from the generated documentation.\n\n## Example\n\n```js\n/** @license Apache-2.0 */\nexport const api = {...} // not documented\n```\n"
  },
  {
    "path": "site/tags/link.md",
    "content": "---\ntitle: \"\\{\\@link\\}\"\n---\n\n# \\{\\@link\\}\n\n**Tag Kind:** [Inline](../tags.md#inline-tags) <br>\n**TSDoc Reference:** [@link](https://tsdoc.org/pages/tags/link/)\n\nThe `@link` tag is used to refer to another documented declaration. It takes one of the following forms:\n\n- `{@link Foo.Bar}` - Links to `Foo.Bar`, with link text `Bar`\n- `{@link Foo.Bar | click here}` - Links to `Foo.Bar`, with link text `click here`\n- (non-TSDoc) `{@link Foo.Bar click here}` - Links to `Foo.Bar`, with link text `click here`\n\nLink resolution is controlled by the `--useTsLinkResolution` option. When set\n(the default), links will be resolved using TypeScript's resolution, which uses the\nsymbols in scope to determine what symbol should be linked to. This is the same\nresolution style used by Visual Studio Code.\n\nIf `--useTsLinkResolution` is off, or TypeScript fails to resolve a link, the link will\nbe resolved with [declaration references](../declaration-references.md).\n\n## Example\n\n```ts\n/**\n * Similar to {@link random}, but with a range of [0, 100)\n */\nexport function rand(): number;\n\n/**\n * Returns a random number in the range [0, 1)\n */\nexport function random(): number;\n\n/**\n * {@link Data.prop | instance member}\n * {@link Data.member | static member}\n * {@link Data#member | instance member} (declaration references only)\n */\nexport class Data {\n    prop = 0;\n\n    static member = 1;\n    member = 2;\n}\n\n/**\n * TypeScript links do not support meaning qualifiers (`:namespace`),\n * so both of these links will link to the enum unless --useTsLinkResolution is disabled.\n * {@link Merged:namespace} links to the namespace.\n * {@link Merged:enum} links to the enum.\n */\nexport namespace Merged {\n    export const a = 3;\n}\n\nexport enum Merged {\n    A,\n}\n```\n\n## TSDoc Compatibility\n\nTypeDoc implements the \"new\" version of declaration references, specified at\n[tsdoc/src/beta/DeclarationReference.grammarkdown](https://github.com/microsoft/tsdoc/blob/main/tsdoc/src/beta/DeclarationReference.grammarkdown).\nTypeDoc does not support parsing the initial declaration reference syntax proposed by TSDoc.\nFor more details see the [declaration reference](../declaration-references.md) documentation.\n\n## JSDoc Compatibility\n\nTypeDoc will also recognize the `@linkplain` and `@linkcode` JSDoc tags and\nresolve them with the same method as other links.\n"
  },
  {
    "path": "site/tags/mergeModuleWith.md",
    "content": "---\ntitle: \"@mergeModuleWith\"\n---\n\n# @mergeModuleWith\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@mergeModuleWith` tag can be used to tell TypeDoc to place the children of\na module or namespace within another module and remove the current module. This\nis intended to support projects which combine the results of multiple TypeScript\nprojects into a single exported module but run TypeDoc on each project\nindividually with the [packages entryPointStrategy](../options/input.md#entrypointstrategy)\n\nThe `@mergeModuleWith` tag should be given the qualified name of the module the\ncurrent module should be merged into. This should be a `.` separated path of module\nnames in the case of merging into a nested module.\n\nThe string `<project>` can also be specified to instruct TypeDoc to place members\nof the current module directly under the root project reflection.\n\n> [!WARNING] Using this tag will affect link resolution. Links targeting the\n> module containing `@mergeModuleWith` will be reported as broken links as their\n> target has been removed and links within children of the source module may be\n> resolved as if belonging to either module depending on your TypeDoc build\n> configuration.\n\n## Example\n\n```ts\n// module-a.ts\n/**\n * @module\n * @mergeModuleWith <project>\n */\nexport function fn1() {}\n\n// module-b.ts\n/**\n * @module\n * @mergeModuleWith <project>\n */\nexport function fn2() {}\n```\n\n## See Also\n\n- The [`@module`](module.md) tag\n- The [`@packageDocumentation`](packageDocumentation.md) tag\n"
  },
  {
    "path": "site/tags/module.md",
    "content": "---\ntitle: \"@module\"\n---\n\n# @module\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@module` tag is used to mark a comment as referring to a file rather than the declaration following it.\nIt may optionally be used to rename a module whose name TypeDoc guesses incorrectly.\n\nThe TSDoc specified [`@packageDocumentation`](packageDocumentation.md) tag can also be used to mark\na comment as referring to the file, but cannot be used to rename the module.\n\n> [!note]\n> A comment block where the `@module` tag is used must be the first comment in the file.\n> Therefore, it is recommended to place it at the top of the file before any import statements.\n\n## Example\n\n```ts\n// file1.ts\n/**\n * This is the doc comment for file1.ts\n *\n * Specify this is a module comment and rename it to my-module:\n * @module my-module\n */\nimport * as lib from \"lib\";\n\n// file2.ts\n/**\n * Specify this is a module comment without renaming it:\n * @module\n */\nimport * as lib from \"lib\";\n\n// file3.ts\n/**\n * This is *not* a doc comment for the file, it is a doc comment for the import.\n * Include the `@module` or `@packageDocumentation` tag to mark it as a file comment.\n */\nimport * as lib from \"lib\";\n```\n\n## See Also\n\n- The [`@packageDocumentation`](packageDocumentation.md) tag\n- The [`@mergeModuleWith`](mergeModuleWith.md) tag\n"
  },
  {
    "path": "site/tags/namespace.md",
    "content": "---\ntitle: \"@namespace\"\n---\n\n# @namespace\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThe `@namespace` tag can be used to tell TypeDoc to convert a variable as a namespace. This will cause\nany properties to be resolved and documented as exported variables/functions.\n\n## Example\n\n```ts\nconst a = 1;\nconst b = () => 2;\nconst c = { a, b, c: 3 };\n/** @namespace */\nexport const d = { ...c, d: 4 };\n\n// will be documented as if you wrote\n\nexport namespace d {\n    export const a = 1;\n    export const b = () => 2;\n    export const c = 3;\n    export const d = 4;\n}\n```\n\n## See Also\n\n- The [`@property`](property.md) tag\n- The [`@interface`](interface.md) tag\n"
  },
  {
    "path": "site/tags/overload.md",
    "content": "---\ntitle: \"@overload\"\n---\n\n# @overload\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThe `@overload` tag is recognized for use in JavaScript projects which can use it to declare overloads since TypeScript 5.0. It is automatically removed from the rendered\ndocumentation with the [--excludeTags](../options/comments.md#excludetags) option\n\n## Example\n\n```js\n/**\n * @overload\n * @param {string} value first signature\n * @return {void}\n */\n\n/**\n * @overload\n * @param {number} value second signature\n * @param {number} [maximumFractionDigits]\n * @return {void}\n */\n\n/**\n * @param {string | number} value\n * @param {number} [maximumFractionDigits]\n */\nfunction printValue(value, maximumFractionDigits) {}\n```\n\n## See Also\n\n- The [TypeScript 5.0 release notes](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#overload-support-in-jsdoc)\n- The [--excludeTags](../options/comments.md#excludetags) option.\n"
  },
  {
    "path": "site/tags/override.md",
    "content": "---\ntitle: \"@override\"\n---\n\n# @override\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@override](https://tsdoc.org/pages/tags/override/)\n\nTypeDoc parses the `@override` tag for compatibility with TSDoc, but does not attach any meaning to it's use.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @override */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@sealed`](sealed.md) tag\n- The [`@virtual`](virtual.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags/packageDocumentation.md",
    "content": "---\ntitle: \"@packageDocumentation\"\n---\n\n# @packageDocumentation\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@packageDocumentation](https://tsdoc.org/pages/tags/packagedocumentation/)\n\nThe `@packageDocumentation` tag is used to mark a comment as referring to a file rather than the declaration following it.\nThe TypeDoc specific [`@module`](module.md) tag can be used for the same purpose when semantically clearer.\n\n> [!note]\n> A comment block where the `@packageDocumentation` tag is used must be the first comment in the file.\n> Therefore, it is recommended to place it at the top of the file before any import statements.\n\n## Example\n\n```ts\n// file1.ts\n/**\n * This is the doc comment for file1.ts\n *\n * @packageDocumentation\n */\nimport * as lib from \"lib\";\n\n// file2.ts\n/**\n * This is *not* a doc comment for the file, it is a doc comment for the import.\n * Include the `@module` or `@packageDocumentation` tag to mark it as a file comment.\n */\nimport * as lib from \"lib\";\n```\n\n## See Also\n\n- The [`@module`](module.md) tag\n- The [`@mergeModuleWIth`](mergeModuleWith.md) tag\n"
  },
  {
    "path": "site/tags/param.md",
    "content": "---\ntitle: \"@param\"\n---\n\n# @param and @this\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@param](https://tsdoc.org/pages/tags/param/)\n\nThe `@param` tag is used to document a parameter of a function or method.\n\n## Example\n\n```ts\n/**\n * @param a - the first number\n * @param b - the second number\n */\nexport function sum(a: number, b: number) {\n    return a + b;\n}\n```\n\n## Object Literals\n\nIf the type of a parameter is an object literal type, a union containing an object literal type,\nor an intersection containing an object literal type, property names may be separated by `.` to\nadd a comment to a single level of a nested property.\n\n```ts\n/**\n * @param options - documentation for the whole parameter\n * @param options.value - documentation for the `value` property\n * @param options.nested.value - NOT supported\n */\nexport function configure(\n    options: { value: string; nested: { value: string } } | undefined,\n) {}\n```\n\n## Destructured Parameters\n\nIf your function uses destructured parameters, TypeDoc will attempt to infer the parameter name from\nyour usage of the `@param` tag. For it to be successful, all parameters must be documented. If TypeDoc\nfails to infer the name of the destructured parameter, it will be documented as `__namedParameters`.\n\n```ts\n/**\n * @param options - docs\n */\nexport function configure({ value }: { value: string }) {}\n\n// will be documented as if written as\nexport function configure(options: { value: string }) {}\n```\n\n## `this` Parameters\n\nFunctions which use `this` in JavaScript files may use TypeScript's `@this` tag to define the type of their `this`\nparameter. TypeDoc will check for `@this` tags and use their content in the description of the `this` parameter.\n\n```js\n/**\n * @this {Request} parameter description for `this`\n * @param {Response} response parameter description for `response`\n */\nexport function hello(response) {\n    response.write(`Hello ${this.query.name || \"world!\"}`);\n}\n```\n\n## TSDoc Compatibility\n\nThe TSDoc standard requires that the `@param` tag _not_ include types and that\nthe parameter name must be followed by a hyphen to separate it from the\ndescription. For improved compatibility with projects using TypeScript type\nannotations in JavaScript files and the [JSDoc `@param` tag](https://jsdoc.app/tags-param.html), TypeDoc does not enforce these\nrequirements. The following `@param` tags will all be passed in the same way by\nTypeDoc.\n\n```ts\n/**\n * @param test - description\n * @param test description\n * @param {string} test - description\n * @param {string} test description\n */\n```\n"
  },
  {
    "path": "site/tags/primaryExport.md",
    "content": "---\ntitle: \"@primaryExport\"\n---\n\n# @primaryExport\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nNormally, when TypeDoc encounters a re-export, it will defer converting the symbol\nso that if the symbol's module is documented TypeDoc will document re-exports as pointing\nto the original module.\n\nThis tag overrides that behavior, causing TypeDoc to instead immediately convert the\nsymbol. Specifying it on a comment for a namespace will also cause TypeDoc to convert\nthe re-exports directly within that namespace immediately.\n\n## Example\n\n```ts\n/**\n * We want the primary documentation for models to be this namespace,\n * but also preserve the flattened export structure for backwards compatibility.\n * @primaryExport\n */\nexport * as Models from \"./models/index.js\";\nexport * from \"./models/index.js\";\n```\n"
  },
  {
    "path": "site/tags/private.md",
    "content": "---\ntitle: \"@private\"\n---\n\n# @private\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThis tag should generally not be used and may be removed in a future release.\nThe `@private` tag overrides the visibility of a reflection to be private.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @private */\n    member = 123;\n}\n\n// Will be documented as:\nexport class Visibility {\n    private member = 123;\n}\n```\n\n## See Also\n\n- The [`@public`](public.md) tag\n- The [`@protected`](protected.md) tag\n- The [`@internal`](internal.md) tag\n- The [`--excludePrivate`](../options/input.md#excludeprivate) option\n"
  },
  {
    "path": "site/tags/privateRemarks.md",
    "content": "---\ntitle: \"@privateRemarks\"\n---\n\n# @privateRemarks\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@privateRemarks](https://tsdoc.org/pages/tags/privateRemarks/)\n\nThe `@privateRemarks` tag can be used to include documentation text that should not be included\nin the generated API reference.\n\n## Example\n\n```ts\n/**\n * Some docs here\n *\n * @privateRemarks\n * Implementation detail notes not useful to the API consumer\n */\nexport function rand(): number;\n```\n\n## TSDoc Compatibility\n\nTypeDoc will omit this tag from the documentation by default, but the user is responsible for including it in\nthe `--excludeTags` list if it is set.\n\n## See also\n\n- The [`@remarks`](remarks.md) tag\n- The [`--excludeTags`](../options/comments.md#excludetags) option\n"
  },
  {
    "path": "site/tags/property.md",
    "content": "---\ntitle: \"@property\"\n---\n\n# @property\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@property` (or `@prop`) tag can be used to add a comment to a child of the current reflection.\nIt is intended for use with the [`@namespace`](namespace.md) and [`@interface`](interface.md) tags\nwhich might not have convenient places to include comments for each member.\n\n## Example\n\n```ts\n/**\n * This will be displayed as an interface\n * @property a comment for a\n * @prop b comment for b\n * @interface\n */\nexport type Resolved = Record<\"a\" | \"b\" | \"c\", string>;\n\n// will be documented as if you wrote\n\n/** This will be displayed as an interface */\nexport interface Resolved {\n    /** comment for a */\n    a: string;\n    /** comment for b */\n    b: string;\n    c: string;\n}\n```\n\n## See Also\n\n- The [`@namespace`](namespace.md) tag\n- The [`@interface`](interface.md) tag\n"
  },
  {
    "path": "site/tags/protected.md",
    "content": "---\ntitle: \"@protected\"\n---\n\n# @protected\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags)\n\nThis tag should generally not be used and may be removed in a future release.\nThe `@protected` tag overrides the visibility of a reflection to be protected.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @protected */\n    member = 123;\n}\n\n// Will be documented as:\nexport class Visibility {\n    protected member = 123;\n}\n```\n\n## See Also\n\n- The [`@public`](public.md) tag\n- The [`@private`](private.md) tag\n- The [`@internal`](internal.md) tag\n- The [`--excludeProtected`](../options/input.md#excludeprotected) option\n"
  },
  {
    "path": "site/tags/public.md",
    "content": "---\ntitle: \"@public\"\n---\n\n# @public\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@public](https://tsdoc.org/pages/tags/public/)\n\nThis tag should generally not be used. The `@public` tag overrides the visibility of a reflection to be public.\nThis does not strictly conform to the TSDoc specification, which treats member visibility and release\nvisibility separately.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @public */\n    protected member = 123;\n}\n\n// Will be documented as:\nexport class Visibility {\n    public member = 123;\n}\n```\n\n## TSDoc Compatibility\n\nThe TSDoc standard specifies that the `@public` designation should be inherited by contained members.\nTypeDoc does not display the `@public` badge to all contained members, only showing it on the annotated member.\nFurthermore, TypeDoc's implementation of the `@public` tag changes the effective visibility of a member\nfor backwards compatibility, which is not specified.\n\nAPI authors are encouraged to treat all exported members as public if not explicitly annotated with `@alpha`,\n`@beta`, `@experimental`, or `@internal` and not specify this tag.\n\n## See Also\n\n- The [`@alpha`](alpha.md) tag\n- The [`@beta`](beta.md) tag\n- The [`@experimental`](experimental.md) tag\n- The [`@internal`](internal.md) tag\n- The [`@private`](private.md) tag\n- The [`@protected`](protected.md) tag\n"
  },
  {
    "path": "site/tags/readonly.md",
    "content": "---\ntitle: \"@readonly\"\n---\n\n# @readonly\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@readonly](https://tsdoc.org/pages/tags/readonly/)\n\nThe `@readonly` tag indicates that a reflection should be documented as non-writable, even if writable\naccording to TypeScript.\n\n## Example\n\n```ts\nexport class Readable {\n    /** @readonly */\n    get prop() {\n        return 1;\n    }\n\n    /** Will be removed from the documentation due to the readonly tag */\n    set prop(_: number) {\n        throw new Error(\"Not permitted\");\n    }\n}\n```\n"
  },
  {
    "path": "site/tags/remarks.md",
    "content": "---\ntitle: \"@remarks\"\n---\n\n# @remarks\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@remarks](https://tsdoc.org/pages/tags/remarks/)\n\nThe `@remarks` tag can be used to separate the summary section of a documentation content from\nadditional detailed information. At most one `@remarks` block is permitted in a comment. Unlike\nmost tags, the `@remarks` tag will be copied if `{@inheritDoc}` is used in a comment.\n\nThemes _may_ use it to separate documentation to be displayed on an summary page from documentation\ndisplayed on a dedicated page. The default theme does not attach special behavior to this tag,\ndisplaying its contents under a `# Remarks` header like other block tags.\n\n## Example\n\n```ts\n/**\n * Some docs here\n *\n * @remarks\n * Much longer documentation here\n */\nexport function rand(): number;\n```\n\n## See also\n\n- The [`@inheritDoc`](inheritDoc.md) tag\n- The [`@privateRemarks`](privateRemarks.md) tag\n"
  },
  {
    "path": "site/tags/returns.md",
    "content": "---\ntitle: \"@returns\"\n---\n\n# @returns\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@returns](https://tsdoc.org/pages/tags/returns/)\n\nThe `@returns` tag can be used to document the return value of a function. At most one `@returns` tag should be present in a comment.\n\nTypeDoc treats the `@return` tag as an alias for `@returns`.\n\n## Example\n\n```ts\n/**\n * @param a - the first number\n * @param b - the second number\n * @returns The sum of `a` and `b`\n */\nexport function sum(a: number, b: number): number;\n```\n\n## See Also\n\n- The [`@param`](param.md) tag\n"
  },
  {
    "path": "site/tags/sealed.md",
    "content": "---\ntitle: \"@sealed\"\n---\n\n# @sealed\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@sealed](https://tsdoc.org/pages/tags/sealed/)\n\nTypeDoc parses the `@sealed` tag for compatibility with TSDoc, but does not attach any meaning to it's use.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @sealed */\n    newBehavior(): void;\n}\n```\n\n## See Also\n\n- The [`@virtual`](virtual.md) tag\n- The [`@override`](override.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags/see.md",
    "content": "---\ntitle: \"@see\"\n---\n\n# @see\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@see](https://tsdoc.org/pages/tags/see/)\n**JSDoc Reference:** [@see](https://jsdoc.app/tags-see)\n\nThe `@see` tag can be used to create a list of references for other resources related to this export.\n\n## Example\n\n```ts\n/**\n * @see [Factorial - Wikipedia](https://en.wikipedia.org/wiki/Factorial)\n * @see {@link semifactorial}\n */\nexport function factorial(n: number): number;\n```\n\n## JSDoc Compatibility\n\nJSDoc specifies that `@see` tags contents will be parsed as a reference to a symbol\nname if possible. TypeDoc does not support this use case, requiring an explicit `@link`\nwithin the comment if a link is desired.\n"
  },
  {
    "path": "site/tags/since.md",
    "content": "---\ntitle: \"@since\"\n---\n\n# @since\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@since` tag can be used to document the version that a method was\nintroduced. TypeDoc attaches no behavior to this tag, rendering it as a\nparagraph within the generated comment.\n\n## Example\n\n```ts\n/**\n * @since Introduced in v1.2.3\n */\nexport function rand(min: number, max: number): number;\n```\n"
  },
  {
    "path": "site/tags/sortStrategy.md",
    "content": "---\ntitle: \"@sortStrategy\"\n---\n\n# @sortStrategy\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n\nThis tag can be used to override the [sort](../options/organization.md#sort) locally\nfor a module, namespace, class, or interface. The override will be applied to direct\nchildren of the declaration it appears on. If the declaration has a child which contains\nchildren (e.g. a nested namespace) the grandchildren will _not_ be sorted according\nto the `@sortStrategy` tag.\n\n## Example\n\nThis class makes the most sense if the documentation is reviewed in the source order\nrather than being sorted alphabetically.\n\n```ts\n/**\n * @sortStrategy source-order\n */\nexport class Class {\n    commonMethod(): void;\n    commonMethod2(): void;\n    lessCommonMethod(): void;\n    uncommonMethod(): void;\n}\n```\n\n## See Also\n\n- The [`--sort`](../options/organization.md#sort) option\n"
  },
  {
    "path": "site/tags/summary.md",
    "content": "---\ntitle: \"@summary\"\n---\n\n# @summary\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**JSDoc Reference:** [@summary](https://jsdoc.app/tags-summary)\n\nWhen rendering modules, TypeDoc uses the first paragraph of comment's summary\ntext (text before any [block tags](../tags.md#block-tags)) as the member's\nsummary on the modules page. As this may not always be suitable for standalone\ndisplay, if a `@summary` tag is present TypeDoc will render that block instead.\n\nIf an `@summary` tag is not specified and `--useFirstParagraphOfCommentAsSummary` is\nspecified, TypeDoc will use the first paragraph of the comment as the short summary\nto include on the modules page.\n\nFor overloaded functions, the `@summary` tag may be placed on the comment for the\nfirst signature or on the comment for the function implementation.\n\n## Example\n\n```ts\n/**\n * This description will be used on the **module** page if --useFirstParagraphOfCommentAsSummary is set\n * If not set, this function will not have a description on the module page.\n */\nexport function runProcess(): void;\n\n/**\n * This description will be used on the **member** page\n * @summary\n * This description will be used on the **module** page\n */\nexport function forkProcess(): void;\n```\n"
  },
  {
    "path": "site/tags/template.md",
    "content": "---\ntitle: \"@template\"\n---\n\n# @template\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe `@template` tag is used to document a type parameter of a function, method, class, interface or type alias.\n\nTypeDoc recognizes the `@template` tag as an alias of `@typeParam` for compatibility with JavaScript\nprojects using TypeScript via doc comments. For TypeScript projects, the TSDoc standard\n[`@typeParam`](typeParam.md) tag should be preferred.\n\n## Example\n\n```js\n/**\n * @template {string} T - the identity type\n */\nexport function identity<T>(x) {\n    return x;\n}\n```\n\n## See Also\n\n- The [`@typeParam`](typeParam.md) tag\n"
  },
  {
    "path": "site/tags/throws.md",
    "content": "---\ntitle: \"@throws\"\n---\n\n# @throws\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@throws](https://tsdoc.org/pages/tags/throws/)\n\nThe `@throws` tag can be used to document an exception that can be thrown by a function or method.\n\n## Example\n\n```ts\n/**\n * @throws {@link UserError} if `max < min`\n */\nexport function rand(min: number, max: number): number;\n```\n"
  },
  {
    "path": "site/tags/typeParam.md",
    "content": "---\ntitle: \"@typeParam\"\n---\n\n# @typeParam\n\n**Tag Kind:** [Block](../tags.md#block-tags) <br>\n**TSDoc Reference:** [@typeParam](https://tsdoc.org/pages/tags/typeParam/)\n\nThe `@typeParam` tag is used to document a type parameter of a function, method, class, interface or type alias.\nTypeDoc recognizes the `@template` tag as an alias of `@typeParam`.\n\n## Example\n\n```ts\n/**\n * @typeParam T - the identity type\n */\nexport function identity<T>(x: T): T {\n    return x;\n}\n```\n\n## TSDoc Compatibility\n\nThe TSDoc standard requires that the `@typeParam` tag _not_ include types and\nthat the parameter name must be followed by a hyphen to separate it from the\ndescription. For improved compatibility with projects using TypeScript type\nannotations in JavaScript files, TypeDoc does not enforce these requirements.\nThe following `@typeParam` tags will all be passed in the same way by TypeDoc.\n\n```ts\n/**\n * @typeParam test - description\n * @typeParam test description\n * @typeParam {string} test - description\n * @typeParam {string} test description\n */\n```\n\n## See Also\n\n- The [`@template`](template.md) tag\n"
  },
  {
    "path": "site/tags/typescript.md",
    "content": "---\ntitle: \"TypeScript Tags\"\n---\n\n# TypeScript Tags\n\n**Tag Kind:** [Block](../tags.md#block-tags)\n\nThe following tags are recognized and parsed as block tags for compatibility\nwith TypeScript. TypeDoc does not attach any behavior to their presence, and\nwill remove them from the generated documentation.\n\n- `@augments`\n- `@callback`\n- `@extends`\n- `@jsx`\n- `@type`\n- `@typedef`\n- `@yields`\n- `@satisfies`\n\n## See Also\n\n- [TypeScript's JSDoc Reference](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html)\n- [`@satisfies` Support in JSDoc](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#satisfies-support-in-jsdoc).\n"
  },
  {
    "path": "site/tags/useDeclaredType.md",
    "content": "---\ntitle: \"@useDeclaredType\"\n---\n\n# @useDeclaredType\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n\nThis tag can be specified on type aliases to tell TypeDoc to convert them\nusing the declared type rather than the type node. This can result in better\ndocumentation for derived types. If specified on anything but a type alias,\nthis tag will do nothing.\n\nThe output of the documentation when using this tag is not stable and may change\nbetween TypeScript versions or by very small changes within the type. Depending\non the type alias, this may result in worse documentation. The most common error\ncase is that the type will be documented as a reference to itself.\n\n## Example\n\n```ts\nfunction getData() {\n    return [{ abc: 123 }];\n}\n\n/** @useDeclaredType */\nexport type Data = ReturnType<typeof getData>;\n\n// Data will be documented as if it was written like this:\nexport type DataManual = { abc: number }[];\n\n// This unfortunately DOES NOT work as expected\nexport type Bar = { a: string };\n/** @useDeclaredType */\nexport type BarNum = { [K in keyof Bar]: number };\n```\n\n## See Also\n\n- The [`@interface`](interface.md) tag\n"
  },
  {
    "path": "site/tags/virtual.md",
    "content": "---\ntitle: \"@virtual\"\n---\n\n# @virtual\n\n**Tag Kind:** [Modifier](../tags.md#modifier-tags) <br>\n**TSDoc Reference:** [@virtual](https://tsdoc.org/pages/tags/virtual/)\n\nTypeDoc parses the `@virtual` tag for compatibility with TSDoc, but does not attach any meaning to it's use.\n\n## Example\n\n```ts\nexport class Visibility {\n    /** @virtual */\n    intendedForOverrideByChildren(): void;\n}\n```\n\n## See Also\n\n- The [`@sealed`](sealed.md) tag\n- The [`@override`](override.md) tag\n- The [`--visibilityFilters`](../options/output.md#visibilityfilters) option\n"
  },
  {
    "path": "site/tags.md",
    "content": "---\ntitle: Tags\nchildren:\n    - tags/abstract.md\n    - tags/alpha.md\n    - tags/author.md\n    - tags/beta.md\n    - tags/category.md\n    - tags/class.md\n    - tags/defaultValue.md\n    - tags/deprecated.md\n    - tags/document.md\n    - tags/enum.md\n    - tags/event.md\n    - tags/eventProperty.md\n    - tags/example.md\n    - tags/expand.md\n    - tags/experimental.md\n    - tags/function.md\n    - tags/group.md\n    - tags/hidden.md\n    - tags/hideconstructor.md\n    - tags/ignore.md\n    - tags/import.md\n    - tags/include.md\n    - tags/inheritDoc.md\n    - tags/inline.md\n    - tags/interface.md\n    - tags/internal.md\n    - tags/label.md\n    - tags/license.md\n    - tags/link.md\n    - tags/mergeModuleWith.md\n    - tags/module.md\n    - tags/namespace.md\n    - tags/overload.md\n    - tags/override.md\n    - tags/packageDocumentation.md\n    - tags/param.md\n    - tags/primaryExport.md\n    - tags/private.md\n    - tags/privateRemarks.md\n    - tags/property.md\n    - tags/protected.md\n    - tags/public.md\n    - tags/readonly.md\n    - tags/remarks.md\n    - tags/returns.md\n    - tags/sealed.md\n    - tags/see.md\n    - tags/since.md\n    - tags/sortStrategy.md\n    - tags/summary.md\n    - tags/template.md\n    - tags/throws.md\n    - tags/typeParam.md\n    - tags/useDeclaredType.md\n    - tags/virtual.md\n    - tags/typescript.md\nshowGroups: true\n---\n\n# Tags\n\nTypeDoc supports a specific set of tags. Many JSDoc tags are not supported because the TypeScript\ncompiler can infer the same information directly from code. Any tags which are not recognized will\nresult in a warning being emitted. TypeDoc will still parse the documentation comment, using context\nclues to determine the likely intended tag type.\n\n## Custom Tags\n\nTypeDoc's default list of tags primarily consists of tags which are defined by the [TSDoc](https://tsdoc.org/)\nstandard or have custom behavior associated with them. It also includes some [JSDoc](https://jsdoc.app/) tags\nwhich are very widely used but have no associated behavior to reduce the need for custom configuration.\n\nIf you previously used another documentation generator or want to introduce a tag for a standard heading\nin your documentation, TypeDoc supports defining custom tags which should not produce a warning. When a block\ntag with no special behavior is encountered, TypeDoc will simply render it in the documentation.\n\nTypeDoc supports defining what tags are supported through either a `tsdoc.json` file or via the\n`--blockTags`, `--inlineTags`, and `--modifierTags` options. If defined in a `tsdoc.json` file,\nthe file **must** be placed alongside `tsconfig.json`. See the\n[TSDoc documentation](https://tsdoc.org/pages/packages/tsdoc-config/) for details on the file format.\n\n```json\n// tsdoc.json\n{\n    \"$schema\": \"https://developer.microsoft.com/en-us/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"typedoc/tsdoc.json\"],\n    \"noStandardTags\": false,\n    \"tagDefinitions\": [\n        {\n            \"tagName\": \"@customTag\",\n            \"syntaxKind\": \"modifier\"\n        }\n    ]\n}\n```\n\nWhen defining tags in a TypeDoc configuration file, it is recommended to use a JavaScript\nconfig file so that TypeDoc's default tag list can be easily extended.\n\n```js\n// typedoc.config.mjs\nimport { OptionDefaults } from \"typedoc\";\n/** @import { TypeDocOptions } from \"typedoc\" */\n\n/** @type {TypeDocOptions} */\nconst config = {\n    blockTags: [\n        ...OptionDefaults.blockTags,\n        \"@customBlock\",\n    ],\n    modifierTags: [\n        ...OptionDefaults.modifierTags,\n        \"@customModifier\",\n    ],\n    inlineTags: [\n        ...OptionDefaults.inlineTags,\n        \"@customInline\",\n    ],\n};\n\nexport default config;\n```\n\n## Block Tags\n\nBlock tags are tags that are associated with the following text. They can be\nused to divide documentation into sections ([`@remarks`](./tags/remarks.md)),\nmodify how the reflection is organized ([`@group`](./tags/group.md)) or provide\nexamples for how to use the export ([`@example`](./tags/example.md)).\n\n````ts\n/**\n * Summary\n *\n * @remarks\n * Additional details\n *\n * @example\n * ```ts\n * factorial(3) // => 6\n * ```\n */\n````\n\n- [`@author`](./tags/author.md)\n- [`@category`, `@categoryDescription`, `@showCategories`, `@hideCategories`](./tags/category.md)\n- [`@defaultValue`, `@default`](./tags/defaultValue.md)\n- [`@deprecated`](./tags/deprecated.md)\n- [`@document`](./tags/document.md)\n- [`@example`](./tags/example.md)\n- [`@expandType`](./tags/expand.md#expandtype)\n- [`@group`, `@groupDescription`, `@showGroups`, `@hideGroups`, `@disableGroups`](./tags/group.md)\n- [`@import`](./tags/import.md)\n- [`@inlineType`](./tags/inline.md#inlinetype)\n- [`@license`](./tags/license.md)\n- [`@mergeModuleWith`](./tags/mergeModuleWith.md)\n- [`@module`](./tags/module.md)\n- [`@param`, `@this`](./tags/param.md)\n- [`@preventExpand`](./tags/expand.md#preventexpand)\n- [`@preventInline`](./tags/inline.md#preventinline)\n- [`@privateRemarks`](./tags/privateRemarks.md)\n- [`@property`, `@prop`](./tags/property.md)\n- [`@remarks`](./tags/remarks.md)\n- [`@returns`, `@return`](./tags/returns.md)\n- [`@see`](./tags/see.md)\n- [`@since`](./tags/since.md)\n- [`@sortStrategy`](./tags/sortStrategy.md)\n- [`@summary`](./tags/summary.md)\n- [`@template`](./tags/template.md)\n- [`@throws`](./tags/throws.md)\n- [`@typeParam`](./tags/typeParam.md)\n- [`@type`, `@yields`, `@jsx`, `@typedef`, `@extends`, `@augments`, `@satisfies`, `@callback`](./tags/typescript.md)\n\n## Modifier Tags\n\nModifier tags have no associated content and serve only to specify some special\nbehavior for how the reflection is processed by setting some binary flag. For\nexample, [`@hidden`](./tags/hidden.md) will remove a reflection from the\ndocumentation while [`@internal`](./tags/internal.md) will mark the reflection\nas internal for use with\n[`--visibilityFilters`](./options/output.md#visibilityfilters) or\n[`--excludeInternal`](./options/input.md#excludeinternal).\n\n```ts\n/**\n * Summary\n *\n * @alpha\n * @interface\n */\nexport type Foo = { a: string };\n```\n\n- [`@abstract`](./tags/abstract.md)\n- [`@alpha`](./tags/alpha.md)\n- [`@beta`](./tags/beta.md)\n- [`@class`](./tags/class.md)\n- [`@enum`](./tags/enum.md)\n- [`@event`](./tags/event.md)\n- [`@eventProperty`](./tags/eventProperty.md)\n- [`@expand`](./tags/expand.md)\n- [`@experimental`](./tags/experimental.md)\n- [`@function`](./tags/function.md)\n- [`@hidden`](./tags/hidden.md)\n- [`@hideconstructor`](./tags/hideconstructor.md)\n- [`@ignore`](./tags/ignore.md)\n- [`@inline`](./tags/inline.md)\n- [`@interface`](./tags/interface.md)\n- [`@internal`](./tags/internal.md)\n- [`@namespace`](./tags/namespace.md)\n- [`@overload`](./tags/overload.md)\n- [`@override`](./tags/override.md)\n- [`@packageDocumentation`](./tags/packageDocumentation.md)\n- [`@primaryExport`](./tags/primaryExport.md)\n- [`@private`](./tags/private.md)\n- [`@protected`](./tags/protected.md)\n- [`@public`](./tags/public.md)\n- [`@readonly`](./tags/readonly.md)\n- [`@sealed`](./tags/sealed.md)\n- [`@useDeclaredType`](./tags/useDeclaredType.md)\n- [`@virtual`](./tags/virtual.md)\n\n## Inline Tags\n\nInline tags are used to mark text within a paragraph for processing by TypeDoc. The most important ones are the\n[`@link`](./tags/link.md) and [`@inheritDoc`](./tags/inheritDoc.md) tags.\n\n```ts\n/**\n * Comment with a {@link Foo} to this type.\n */\nexport type Foo = { a: string };\n```\n\n- [`@include`, `@includeCode`](./tags/include.md)\n- [`@inheritDoc`](./tags/inheritDoc.md)\n- [`@label`](./tags/label.md)\n- [`@link`, `@linkcode`, `@linkplain`](./tags/link.md)\n\n## TypeScript in JavaScript\n\nIf your project uses TypeScript to type check JavaScript, TypeDoc will pick up\ntype aliases and interfaces defined with `@typedef` and `@callback`. See the\n[TypeScript handbook](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#typedef-callback-and-param)\nfor details.\n\nIn comments for `@typedef` and `@callback` block tags and modifier tags cannot be\nincluded due to TypeScript's decision to permit multiple `@typedef` declarations\nwithin a single comment resulting in the TypeScript defined comment content not including\nany additional non-braced tags. For this reason, TypeDoc will recognize modifier\ntags with inline tag syntax and no content as modifier tags as a special case.\n\nThe following comment will be parsed as if Foo had a modifier `@interface` tag:\n\n```ts\n/**\n * @typedef {{ x: string }} Foo Foo docs\n * {@interface}\n */\n```\n\n## See Also\n\n- The [Doc Comments overview](./doc-comments/index.md)\n"
  },
  {
    "path": "site/themes.md",
    "content": "---\ntitle: Themes\n---\n\nThemes allow you to change the look and feel of the generated documentation.\nThe `--theme` option is used to change the selected theme.\n\nTypeDoc ships with one builtin default theme, additional themes can be added by plugins.\nFor documentation on creating custom themes, see [Theme Development](development/themes.md) page.\n\nIf all you need to do is slightly change the generated output, the `--customCss` or `--customJs`\noptions may be sufficient.\n\nYou can find more themes on npm with the [typedoc-theme](https://www.npmjs.com/search?q=keywords:typedoc-plugin) keyword.\n\n{@include generated/themes.md}\n"
  },
  {
    "path": "site/typedoc-plugin-redirect.js",
    "content": "// Taken from typedoc-plugin-redirect v1.1.0\n// Can't install the plugin here as this repo isn't actually a monorepo yet.\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport { dirname, join, relative, resolve } from \"path\";\nimport { Application, ParameterType, Renderer, RendererEvent } from \"typedoc\";\n\nconst PLUGIN_PREFIX = \"[typedoc-plugin-redirect]\";\n\nconst PAGE_TEMPLATE = `<!DOCTYPE html>\n<html>\n    <head>\n        <title>{MOVED}</title>\n        <meta charset=\"utf-8\" />\n        <meta http-equiv=\"refresh\" content=\"0;URL='{URL}'\" />\n    </head>\n    <body>\n        <p>{MOVED_URL}</p>\n    </body>\n</html>\n`;\n\n/** @param {Application} app */\nexport function load(app) {\n    app.options.addDeclaration({\n        name: \"redirects\",\n        help: \"Define redirects to write to the generated output directory.\",\n        defaultValue: {},\n        configFileOnly: true,\n        type: ParameterType.Mixed,\n        validate(value) {\n            if (!value || typeof value !== \"object\") {\n                throw new Error(\n                    'The \"redirects\" option must be set to an object with string values.',\n                );\n            }\n\n            for (const val of Object.values(value)) {\n                if (typeof val !== \"string\") {\n                    throw new Error(\n                        'The \"redirects\" option must be set to an object with string values.',\n                    );\n                }\n            }\n        },\n    });\n\n    app.renderer.on(Renderer.EVENT_END, (event) => {\n        const redirects = app.options.getValue(\"redirects\");\n        for (const [fromPath, toPath] of Object.entries(redirects)) {\n            let outputPath = join(event.outputDirectory, fromPath);\n            if (outputPath.endsWith(\"/\")) {\n                outputPath += \"index.html\";\n            }\n            if (existsSync(outputPath)) {\n                app.logger.warn(\n                    `${PLUGIN_PREFIX} ${outputPath} will be overwritten with a redirect.`,\n                );\n            }\n\n            mkdirSync(dirname(outputPath), { recursive: true });\n            writeFileSync(\n                outputPath,\n                buildOutputFile(event.outputDirectory, outputPath, toPath),\n            );\n        }\n    });\n}\n\nfunction buildOutputFile(outDir, outputPath, targetPath) {\n    /** @type {string} */\n    let target;\n    if ([\"/\", \"http://\", \"https://\"].some((p) => targetPath.startsWith(p))) {\n        target = escapeHtml(targetPath);\n    } else {\n        target = escapeHtml(\n            relative(dirname(outputPath), resolve(outDir, targetPath)),\n        );\n    }\n\n    const replacements = {\n        MOVED: `This page has moved to ${target}`,\n        MOVED_URL: `This page has moved to <a href=\"${target}\">${target}</a>.`,\n        URL: target,\n    };\n\n    return PAGE_TEMPLATE.replace(\n        /{(MOVED|MOVED_URL|URL)}/g,\n        (_, k) => replacements[k],\n    );\n}\n\nconst htmlEscapes = {\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    '\"': \"&quot;\",\n    \"'\": \"&#39;\",\n};\n\nfunction escapeHtml(html) {\n    return html.replace(/[&<>'\"]/g, (c) => htmlEscapes[c]);\n}\n"
  },
  {
    "path": "site/typedoc.config.jsonc",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"logLevel\": \"Verbose\",\n    \"treatWarningsAsErrors\": true,\n\n    \"entryPointStrategy\": \"merge\",\n    \"entryPoints\": [],\n    \"alwaysCreateEntryPointModule\": true,\n    \"out\": \"../docs-site\",\n    \"name\": \"TypeDoc\",\n    \"plugin\": [\"./typedoc-plugin-redirect.js\", \"./site-plugin.js\"],\n\n    \"readme\": \"index.md\",\n    \"projectDocuments\": [\n        \"overview.md\",\n        \"options.md\",\n        \"doc-comments/index.md\",\n        \"external-documents.md\",\n        \"themes.md\",\n        \"plugins.md\",\n        \"declaration-references.md\",\n        \"tags.md\",\n        \"generated/CHANGELOG.md\",\n        \"development/index.md\",\n    ],\n    \"highlightLanguages\": [\n        \"bash\",\n        \"console\",\n        \"css\",\n        \"html\",\n        \"javascript\",\n        \"json\",\n        \"jsonc\",\n        \"json5\",\n        \"yaml\",\n        \"tsx\",\n        \"typescript\",\n        \"markdown\",\n    ],\n    \"customCss\": \"custom.css\",\n    \"favicon\": \"favicon.ico\",\n\n    \"searchInComments\": true,\n    \"searchInDocuments\": true,\n    \"navigation\": {\n        \"includeCategories\": true,\n        \"includeGroups\": false,\n        \"excludeReferences\": true,\n    },\n    \"navigationLinks\": {\n        \"Example\": \"https://typedoc.org/example/index.html\",\n        \"API\": \"https://typedoc.org/api/index.html\",\n        \"GitHub\": \"https://github.com/TypeStrong/typedoc\",\n    },\n    // The site doesn't need filters as it doesn't actually include code\n    \"visibilityFilters\": {},\n\n    \"validation\": {\n        \"invalidLink\": true,\n        \"notDocumented\": false,\n        // Validated when building the API docs\n        \"notExported\": false,\n    },\n\n    \"hostedBaseUrl\": \"https://typedoc.org/\",\n    \"redirects\": {\n        \"guides/\": \"documents/Overview.html\",\n        \"guides/overview/\": \"documents/Overview.html\",\n        \"guides/installation/\": \"index.html\",\n        \"guides/options/\": \"documents/Options.html\",\n        \"options/\": \"documents/Options.html\",\n        \"options/configuration/\": \"documents/Options.Configuration.html\",\n        \"options/input/\": \"documents/Options.Input.html\",\n        \"options/output/\": \"documents/Options.Output.html\",\n        \"options/comments/\": \"documents/Options.Comments.html\",\n        \"options/organization/\": \"documents/Options.Organization.html\",\n        \"options/validation/\": \"documents/Options.Validation.html\",\n        \"options/other/\": \"documents/Options.Other.html\",\n        // cspell: words doccomments\n        \"guides/doccomments/\": \"documents/Doc_Comments.html\",\n        \"guides/documents/\": \"documents/External_Documents.html\",\n        \"guides/themes/\": \"documents/Themes.html\",\n        \"guides/plugins/\": \"documents/Plugins.html\",\n        \"guides/declaration-references/\": \"documents/Declaration_References.html\",\n        \"guides/development/\": \"documents/Development.html\",\n        \"guides/changelog/\": \"documents/Changelog.html\",\n\n        // Tags\n        \"guides/tags/\": \"documents/Tags.html\",\n        \"tags/alpha/\": \"documents/Tags._alpha.html\",\n        \"tags/beta/\": \"documents/Tags._beta.html\",\n        \"tags/category/\": \"documents/Tags._category.html\",\n        \"tags/categoryDescription/\": \"documents/Tags._category.html\",\n        \"tags/defaultValue/\": \"documents/Tags._defaultValue.html\",\n        \"tags/deprecated/\": \"documents/Tags._deprecated.html\",\n        \"tags/document/\": \"documents/Tags._document.html\",\n        \"tags/enum/\": \"documents/Tags._enum.html\",\n        \"tags/event/\": \"documents/Tags._event.html\",\n        \"tags/eventProperty/\": \"documents/Tags._eventProperty.html\",\n        \"tags/example/\": \"documents/Tags._example.html\",\n        \"tags/experimental/\": \"documents/Tags._experimental.html\",\n        \"tags/group/\": \"documents/Tags._group.html\",\n        \"tags/groupDescription/\": \"documents/Tags._groupDescription.html\",\n        \"tags/hidden/\": \"documents/Tags._hidden.html\",\n        \"tags/hideconstructor/\": \"documents/Tags._hideconstructor.html\",\n        \"tags/ignore/\": \"documents/Tags._ignore.html\",\n        \"tags/inheritDoc/\": \"documents/Tags.__inheritDoc_.html\",\n        \"tags/interface/\": \"documents/Tags._interface.html\",\n        \"tags/internal/\": \"documents/Tags._internal.html\",\n        \"tags/label/\": \"documents/Tags.__label_.html\",\n        \"tags/link/\": \"documents/Tags.__link_.html\",\n        \"tags/module/\": \"documents/Tags._module.html\",\n        \"tags/namespace/\": \"documents/Tags._namespace.html\",\n        \"tags/overload/\": \"documents/Tags._overload.html\",\n        \"tags/override/\": \"documents/Tags._override.html\",\n        \"tags/packageDocumentation/\": \"documents/Tags._packageDocumentation.html\",\n        \"tags/param/\": \"documents/Tags._param.html\",\n        \"tags/private/\": \"documents/Tags._private.html\",\n        \"tags/privateRemarks/\": \"documents/Tags._privateRemarks.html\",\n        \"tags/property/\": \"documents/Tags._property.html\",\n        \"tags/protected/\": \"documents/Tags._protected.html\",\n        \"tags/public/\": \"documents/Tags._public.html\",\n        \"tags/readonly/\": \"documents/Tags._readonly.html\",\n        \"tags/remarks/\": \"documents/Tags._remarks.html\",\n        \"tags/returns/\": \"documents/Tags._returns.html\",\n        \"tags/satisfies/\": \"documents/Tags.TypeScript_Tags.html\",\n        \"tags/sealed/\": \"documents/Tags._sealed.html\",\n        \"tags/see/\": \"documents/Tags._see.html\",\n        \"tags/template/\": \"documents/Tags._template.html\",\n        \"tags/throws/\": \"documents/Tags._throws.html\",\n        \"tags/typeParam/\": \"documents/Tags._typeParam.html\",\n        \"tags/virtual/\": \"documents/Tags._virtual.html\",\n    },\n}\n"
  },
  {
    "path": "src/browser-utils.ts",
    "content": "export * from \"#models\";\n\nexport {\n    addTranslations,\n    type ComponentPath,\n    ConsoleLogger,\n    type DeclarationReference,\n    type EnumKeys,\n    Logger,\n    LogLevel,\n    type Meaning,\n    type MinimalNode,\n    MinimalSourceFile,\n    type NormalizedPath,\n    setTranslations,\n    type SymbolReference,\n    type TranslatedString,\n    translateTagName,\n} from \"#utils\";\n\nexport {\n    type Deserializable,\n    Deserializer,\n    type DeserializerComponent,\n    JSONOutput,\n    SerializeEvent,\n    Serializer,\n    type SerializerComponent,\n    type SerializerEvents,\n} from \"#serialization\";\n"
  },
  {
    "path": "src/index.ts",
    "content": "/**\n * @module TypeDoc API\n *\n * In addition to the members documented here, TypeDoc exports a `typedoc/debug`\n * entry point which exports some functions which may be useful during plugin\n * development or debugging. Exports from that entry point are **not stable**\n * and may change or be removed at any time.\n *\n * TypeDoc also exports a `typedoc/browser` entry point which exports a subset\n * of the members described here which makes it suitable for usage in browser\n * bundles which want to use TypeDoc's JSON output in the browser.\n */\nexport { Application, type ApplicationEvents } from \"./lib/application.js\";\n\nexport { resetReflectionID } from \"./lib/models/Reflection.js\";\n/**\n * All symbols documented under the Models namespace are also available in the root import.\n * @primaryExport\n *\n * @categoryDescription Types\n * Describes a TypeScript type.\n *\n * @categoryDescription Reflections\n * Describes a documentation entry. The root entry is a {@link ProjectReflection}\n * and contains {@link DeclarationReflection} instances.\n *\n * @summary\n * TypeDoc converts source code into these object types.\n */\nexport * as Models from \"./lib/models/index.js\";\n/**\n * All symbols documented under the Configuration namespace are also available in the root import.\n * @summary\n * Controls how TypeDoc reads option files and what options are available.\n */\nexport {\n    type CommentParserConfig,\n    Context,\n    Converter,\n    type ConverterEvents,\n    type ExternalResolveResult,\n    type ExternalSymbolResolver,\n} from \"./lib/converter/index.js\";\nexport * from \"./lib/models/index.js\";\n/** @primaryExport */\nexport * as Configuration from \"./lib/utils/options/index.js\";\n\nexport {\n    BaseRouter,\n    CategoryRouter,\n    DefaultTheme,\n    DefaultThemeRenderContext,\n    GroupRouter,\n    IndexEvent,\n    KindDirRouter,\n    KindRouter,\n    MarkdownEvent,\n    PageEvent,\n    PageKind,\n    Renderer,\n    RendererEvent,\n    Slugger,\n    StructureDirRouter,\n    StructureRouter,\n    Theme,\n} from \"./lib/output/index.js\";\nexport type {\n    Icons,\n    NavigationElement,\n    PageDefinition,\n    PageHeading,\n    RendererEvents,\n    RendererHooks,\n    RenderTemplate,\n    Router,\n    RouterTarget,\n} from \"./lib/output/index.js\";\n\nexport { Outputs } from \"./lib/output/output.js\";\n\nexport {\n    ArgumentsReader,\n    CommentStyle,\n    EntryPointStrategy,\n    normalizePath,\n    Option,\n    OptionDefaults,\n    Options,\n    PackageJsonReader,\n    ParameterHint,\n    ParameterType,\n    TSConfigReader,\n    TypeDocReader,\n    ValidatingFileRegistry,\n} from \"./lib/utils/index.js\";\n\nexport type {\n    ArrayDeclarationOption,\n    BooleanDeclarationOption,\n    DeclarationOption,\n    DeclarationOptionBase,\n    DeclarationOptionToOptionType,\n    DocumentationEntryPoint,\n    FancyConsoleLogger,\n    FlagsDeclarationOption,\n    JsDocCompatibility,\n    KeyToDeclaration,\n    ManuallyValidatedOption,\n    MapDeclarationOption,\n    MixedDeclarationOption,\n    NumberDeclarationOption,\n    ObjectDeclarationOption,\n    OptionsReader,\n    OutputSpecification,\n    ParameterTypeToOptionTypeMap,\n    SortStrategy,\n    StringDeclarationOption,\n    TypeDocOptionMap,\n    TypeDocOptions,\n    TypeDocOptionValues,\n    ValidationOptions,\n} from \"./lib/utils/index.js\";\n\nexport {\n    type ComponentPath,\n    ConsoleLogger,\n    type DeclarationReference,\n    type EnumKeys,\n    EventDispatcher,\n    EventHooks,\n    type GlobString,\n    i18n,\n    JSX,\n    Logger,\n    LogLevel,\n    type Meaning,\n    type MeaningKeyword,\n    type MinimalNode,\n    MinimalSourceFile,\n    type NormalizedPath,\n    type NormalizedPathOrModule,\n    type NormalizedPathOrModuleOrFunction,\n    type SymbolReference,\n    type TagString,\n    type TranslatedString,\n    translateTagName,\n} from \"#utils\";\n\nexport {\n    type Deserializable,\n    Deserializer,\n    type DeserializerComponent,\n    JSONOutput,\n    SerializeEvent,\n    Serializer,\n    type SerializerComponent,\n    type SerializerEvents,\n} from \"./lib/serialization/index.js\";\n\nexport * as Internationalization from \"./lib/internationalization/index.js\";\n// Re-exported here so that declaration merging works as expected\nexport type { TranslatableStrings } from \"./lib/internationalization/internationalization.js\";\n\nimport TypeScript from \"typescript\";\nexport { TypeScript };\n"
  },
  {
    "path": "src/lib/application-events.ts",
    "content": "export const ApplicationEvents = {\n    BOOTSTRAP_END: \"bootstrapEnd\",\n    REVIVE: \"reviveProject\",\n    VALIDATE_PROJECT: \"validateProject\",\n} as const;\n"
  },
  {
    "path": "src/lib/application.ts",
    "content": "import * as Path from \"path\";\nimport ts from \"typescript\";\n\nimport { Deserializer, type JSONOutput, Serializer } from \"./serialization/index.js\";\nimport { Converter } from \"./converter/index.js\";\nimport { Renderer } from \"./output/renderer.js\";\nimport { type ProjectReflection, ReflectionSymbolId } from \"./models/index.js\";\nimport {\n    AbstractComponent,\n    FancyConsoleLogger,\n    loadPlugins,\n    type OptionsReader,\n    PackageJsonReader,\n    TSConfigReader,\n    TypeDocReader,\n    writeFile,\n} from \"./utils/index.js\";\n\nimport { Option, Options } from \"./utils/index.js\";\nimport { rootPackageOptions, type TypeDocOptions } from \"./utils/options/declaration.js\";\nimport { type GlobString, i18n, Logger, LogLevel, type TranslatedString, unique } from \"#utils\";\nimport { ok } from \"assert\";\nimport {\n    type DocumentationEntryPoint,\n    EntryPointStrategy,\n    getEntryPoints,\n    getPackageDirectories,\n    getWatchEntryPoints,\n    inferEntryPoints,\n} from \"./utils/entry-point.js\";\nimport { nicePath, normalizePath } from \"./utils/paths.js\";\nimport { getLoadedPaths, hasBeenLoadedMultipleTimes, isDebugging } from \"./utils/general.js\";\nimport { validateExports } from \"./validation/exports.js\";\nimport { validateDocumentation } from \"./validation/documentation.js\";\nimport { validateLinks } from \"./validation/links.js\";\nimport { ApplicationEvents } from \"./application-events.js\";\nimport { deriveRootDir, findTsConfigFile, glob, readFile } from \"#node-utils\";\nimport { FileRegistry } from \"./models/FileRegistry.js\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { createRequire } from \"module\";\nimport { Outputs } from \"./output/output.js\";\nimport { validateMergeModuleWith } from \"./validation/unusedMergeModuleWith.js\";\nimport { diagnostic, diagnostics } from \"./utils/loggers.js\";\nimport { ValidatingFileRegistry } from \"./utils/ValidatingFileRegistry.js\";\nimport { Internationalization } from \"./internationalization/internationalization.js\";\n\nconst packageInfo = JSON.parse(\n    readFileSync(\n        Path.join(fileURLToPath(import.meta.url), \"../../../package.json\"),\n        \"utf8\",\n    ),\n) as {\n    version: string;\n    peerDependencies: { typescript: string };\n};\n\nconst supportedVersionMajorMinor = packageInfo.peerDependencies.typescript\n    .split(\"||\")\n    .map((version) => version.replace(/^\\s*|\\.x\\s*$/g, \"\"));\n\nconst DETECTOR = Symbol();\n\nexport function createAppForTesting(): Application {\n    // @ts-expect-error private constructor\n    const app: Application = new Application(DETECTOR);\n    app.files = new FileRegistry();\n    return app;\n}\n\nconst DEFAULT_READERS = [\n    new TypeDocReader(),\n    new PackageJsonReader(),\n    new TSConfigReader(),\n];\n\nexport interface ApplicationEvents {\n    bootstrapEnd: [Application];\n    reviveProject: [ProjectReflection];\n    validateProject: [ProjectReflection];\n}\n\n/**\n * The default TypeDoc main application class.\n *\n * This class holds the two main components of TypeDoc, the {@link Converter} and\n * the {@link Renderer}. When running TypeDoc, first the {@link Converter} is invoked which\n * generates a {@link ProjectReflection} from the passed in source files. The\n * {@link ProjectReflection} is a hierarchical model representation of the TypeScript\n * project. Afterwards the model is passed to the {@link Renderer} which uses an instance\n * of {@link Theme} to generate the final documentation.\n *\n * Both the {@link Converter} and the {@link Renderer} emit a series of events while processing the project.\n * Subscribe to these Events to control the application flow or alter the output.\n *\n * @remarks\n *\n * Access to an Application instance can be retrieved with {@link Application.bootstrap} or\n * {@link Application.bootstrapWithPlugins}. It can not be constructed manually.\n *\n * @group None\n * @summary Root level class which contains most useful behavior.\n */\nexport class Application extends AbstractComponent<\n    Application,\n    ApplicationEvents\n> {\n    private _logger: Logger = new FancyConsoleLogger();\n\n    /**\n     * The converter used to create the declaration reflections.\n     */\n    converter: Converter;\n\n    outputs = new Outputs(this);\n\n    /**\n     * The renderer used to generate the HTML documentation output.\n     */\n    renderer: Renderer;\n\n    /**\n     * The serializer used to generate JSON output.\n     */\n    serializer = new Serializer();\n\n    /**\n     * The deserializer used to restore previously serialized JSON output.\n     */\n    deserializer = new Deserializer(this._logger);\n\n    /**\n     * The logger that should be used to output messages.\n     */\n    get logger(): Logger {\n        return this._logger;\n    }\n    set logger(l: Logger) {\n        this._logger = l;\n        this.deserializer.logger = l;\n    }\n\n    /**\n     * Internationalization module which supports translating according to\n     * the `lang` option.\n     */\n    internationalization = new Internationalization();\n\n    options = new Options();\n\n    /**\n     * Due for deprecation in 0.29, use the reference to this on {@link ProjectReflection},\n     * this was the wrong place for this member to live.\n     */\n    files: FileRegistry = new ValidatingFileRegistry();\n\n    /** @internal */\n    @Option(\"lang\")\n    accessor lang!: string;\n\n    /** @internal */\n    @Option(\"skipErrorChecking\")\n    accessor skipErrorChecking!: boolean;\n\n    /** @internal */\n    @Option(\"entryPointStrategy\")\n    accessor entryPointStrategy!: EntryPointStrategy;\n\n    /** @internal */\n    @Option(\"entryPoints\")\n    accessor entryPoints!: GlobString[];\n\n    /**\n     * The version number of TypeDoc.\n     */\n    static readonly VERSION = packageInfo.version;\n\n    /**\n     * Emitted after plugins have been loaded and options have been read, but before they have been frozen.\n     * The listener will be given an instance of {@link Application}.\n     */\n    static readonly EVENT_BOOTSTRAP_END = ApplicationEvents.BOOTSTRAP_END;\n\n    /**\n     * Emitted after a project has been deserialized from JSON.\n     * The listener will be given an instance of {@link ProjectReflection}.\n     */\n    static readonly EVENT_PROJECT_REVIVE = ApplicationEvents.REVIVE;\n\n    /**\n     * Emitted when validation is being run.\n     * The listener will be given an instance of {@link ProjectReflection}.\n     */\n    static readonly EVENT_VALIDATE_PROJECT = ApplicationEvents.VALIDATE_PROJECT;\n\n    /**\n     * Create a new TypeDoc application instance.\n     */\n    private constructor(detector: typeof DETECTOR) {\n        if (detector !== DETECTOR) {\n            throw new Error(\n                \"An application handle must be retrieved with Application.bootstrap or Application.bootstrapWithPlugins\",\n            );\n        }\n        super(null!); // We own ourselves\n\n        this.converter = new Converter(this);\n        this.renderer = new Renderer(this);\n\n        this.outputs.addOutput(\"json\", async (out, project) => {\n            const ser = this.serializer.projectToObject(project, normalizePath(process.cwd()));\n            const space = this.options.getValue(\"pretty\") ? \"\\t\" : \"\";\n            await writeFile(out, JSON.stringify(ser, null, space) + \"\\n\");\n        });\n\n        this.outputs.addOutput(\"html\", async (out, project) => {\n            await this.renderer.render(project, out);\n        });\n    }\n\n    /**\n     * Initialize TypeDoc, loading plugins if applicable.\n     */\n    static async bootstrapWithPlugins(\n        options: TypeDocOptions = {},\n        readers: readonly OptionsReader[] = DEFAULT_READERS,\n    ): Promise<Application> {\n        const app = new Application(DETECTOR);\n        readers.forEach((r) => app.options.addReader(r));\n        app.options.reset();\n        app.setOptions(options, /* reportErrors */ false);\n        app.internationalization.setLocale(app.lang);\n        await app.options.read(new Logger(), undefined, (path) => app.watchConfigFile(path));\n        app.internationalization.setLocale(app.lang);\n        app.logger.level = app.options.getValue(\"logLevel\");\n\n        await loadPlugins(app, app.options.getValue(\"plugin\"));\n\n        await app._bootstrap(options);\n        return app;\n    }\n\n    /**\n     * Initialize TypeDoc without loading plugins.\n     *\n     * @example\n     * Initialize the application with pretty-printing output disabled.\n     * ```ts\n     * const app = await Application.bootstrap({ pretty: false });\n     * ```\n     *\n     * @param options Options to set during initialization\n     * @param readers Option readers to use to discover options from config files.\n     */\n    static async bootstrap(\n        options: TypeDocOptions = {},\n        readers: readonly OptionsReader[] = DEFAULT_READERS,\n    ): Promise<Application> {\n        const app = new Application(DETECTOR);\n        readers.forEach((r) => app.options.addReader(r));\n        await app._bootstrap(options);\n        return app;\n    }\n\n    private async _bootstrap(options: TypeDocOptions) {\n        this.options.reset();\n        this.setOptions(options, /* reportErrors */ false);\n        this.internationalization.setLocale(this.lang);\n\n        await this.options.read(this.logger, undefined, (path) => this.watchConfigFile(path));\n        this.setOptions(options);\n        this.internationalization.setLocale(this.lang);\n\n        if (isDebugging()) {\n            this.logger.level = LogLevel.Verbose;\n        } else {\n            this.logger.level = this.options.getValue(\"logLevel\");\n        }\n\n        if (this.files instanceof ValidatingFileRegistry) {\n            this.files.basePath = this.options.getValue(\"basePath\");\n        }\n\n        for (\n            const [lang, locales] of Object.entries(\n                this.options.getValue(\"locales\"),\n            )\n        ) {\n            this.internationalization.addTranslations(lang, locales);\n        }\n\n        if (hasBeenLoadedMultipleTimes()) {\n            this.logger.warn(\n                i18n.loaded_multiple_times_0(\n                    getLoadedPaths().join(\"\\n\\t\"),\n                ),\n            );\n        }\n        this.trigger(ApplicationEvents.BOOTSTRAP_END, this);\n\n        if (!this.internationalization.hasTranslations(this.lang)) {\n            // Not internationalized as by definition we don't know what to include here.\n            this.logger.warn(\n                `Options specified \"${this.lang}\" as the language to use, but TypeDoc cannot provide translations for it.` as TranslatedString,\n            );\n            this.logger.info(\n                (\"The languages that translations are available for are:\\n\\t\" +\n                    this.internationalization\n                        .getSupportedLanguages()\n                        .join(\"\\n\\t\")) as TranslatedString,\n            );\n            this.logger.info(\n                \"You can define/override local locales with the `locales` option, or contribute them to TypeDoc!\" as TranslatedString,\n            );\n        }\n\n        if (\n            this.options.getValue(\"useHostedBaseUrlForAbsoluteLinks\") &&\n            !this.options.getValue(\"hostedBaseUrl\")\n        ) {\n            this.logger.warn(\n                i18n.useHostedBaseUrlForAbsoluteLinks_requires_hostedBaseUrl(),\n            );\n            this.options.setValue(\"useHostedBaseUrlForAbsoluteLinks\", false);\n        }\n    }\n\n    /** @internal */\n    setOptions(options: TypeDocOptions, reportErrors = true) {\n        let success = true;\n        for (const [key, val] of Object.entries(options)) {\n            try {\n                this.options.setValue(key as never, val as never);\n            } catch (error) {\n                success = false;\n                ok(error instanceof Error);\n                if (reportErrors) {\n                    this.logger.error(error.message as TranslatedString);\n                }\n            }\n        }\n        return success;\n    }\n\n    /**\n     * Return the path to the TypeScript compiler.\n     */\n    public getTypeScriptPath(): string {\n        const req = createRequire(import.meta.url);\n        return nicePath(Path.dirname(req.resolve(\"typescript\")));\n    }\n\n    public getTypeScriptVersion(): string {\n        return ts.version;\n    }\n\n    public getEntryPoints(): DocumentationEntryPoint[] | undefined {\n        if (this.options.isSet(\"entryPoints\")) {\n            return this.getDefinedEntryPoints();\n        }\n        return inferEntryPoints(this.logger, this.options);\n    }\n\n    /**\n     * Gets the entry points to be documented according to the current `entryPoints` and `entryPointStrategy` options.\n     * May return undefined if entry points fail to be expanded.\n     */\n    public getDefinedEntryPoints(): DocumentationEntryPoint[] | undefined {\n        return getEntryPoints(this.logger, this.options);\n    }\n\n    /**\n     * Run the converter for the given set of files and return the generated reflections.\n     *\n     * @returns An instance of ProjectReflection on success, undefined otherwise.\n     */\n    public async convert(): Promise<ProjectReflection | undefined> {\n        const start = Date.now();\n        this.logger.verbose(\n            `Using TypeScript ${this.getTypeScriptVersion()} from ${this.getTypeScriptPath()}`,\n        );\n\n        if (this.entryPointStrategy === EntryPointStrategy.Merge) {\n            return this._merge();\n        }\n\n        if (this.entryPointStrategy === EntryPointStrategy.Packages) {\n            return this._convertPackages();\n        }\n\n        if (\n            !supportedVersionMajorMinor.some(\n                (version) => version == ts.versionMajorMinor,\n            )\n        ) {\n            this.logger.warn(\n                i18n.unsupported_ts_version_0(\n                    supportedVersionMajorMinor.join(\", \"),\n                ),\n            );\n        }\n\n        const entryPoints = this.getEntryPoints();\n\n        if (!entryPoints) {\n            // Fatal error already reported.\n            return;\n        }\n\n        const programs = unique(entryPoints.map((e) => e.program));\n        this.logger.verbose(\n            `Converting with ${programs.length} programs ${entryPoints.length} entry points`,\n        );\n\n        if (this.skipErrorChecking === false) {\n            const errors = programs.flatMap((program) => ts.getPreEmitDiagnostics(program));\n            if (errors.length) {\n                diagnostics(this.logger, errors);\n                return;\n            }\n        }\n\n        if (this.options.getValue(\"emit\") === \"both\") {\n            for (const program of programs) {\n                program.emit();\n            }\n        }\n\n        const startConversion = Date.now();\n        this.logger.verbose(\n            `Finished getting entry points in ${Date.now() - start}ms`,\n        );\n\n        const project = this.converter.convert(entryPoints);\n        this.logger.verbose(\n            `Finished conversion in ${Date.now() - startConversion}ms`,\n        );\n        return project;\n    }\n\n    private watchers = new Map<string, ts.FileWatcher>();\n    private _watchFile?: (path: string, shouldRestart?: boolean) => void;\n    private criticalFiles = new Set<string>();\n\n    private clearWatches() {\n        this.watchers.forEach((w) => w.close());\n        this.watchers.clear();\n    }\n\n    private watchConfigFile(path: string) {\n        this.criticalFiles.add(path);\n    }\n\n    /**\n     * Register that the current build depends on a file, so that in watch mode\n     * the build will be repeated.  Has no effect if a watch build is not\n     * running, or if the file has already been registered.\n     *\n     * @param path The file to watch.  It does not need to exist, and you should\n     * in fact register files you look for, but which do not exist, so that if\n     * they are created the build will re-run.  (e.g. if you look through a list\n     * of 5 possibilities and find the third, you should register the first 3.)\n     *\n     * @param shouldRestart Should the build be completely restarted?  (This is\n     * normally only used for configuration files -- i.e. files whose contents\n     * determine how conversion, rendering, or compiling will be done, as\n     * opposed to files that are only read *during* the conversion or\n     * rendering.)\n     */\n    public watchFile(path: string, shouldRestart = false) {\n        this._watchFile?.(path, shouldRestart);\n    }\n\n    /**\n     * Run a convert / watch process.\n     *\n     * @param success Callback to run after each convert, receiving the project\n     * @returns True if the watch process should be restarted due to a\n     * configuration change, false for an options error\n     */\n    public async convertAndWatch(\n        success: (project: ProjectReflection) => Promise<void>,\n    ): Promise<boolean> {\n        if (\n            !this.options.getValue(\"preserveWatchOutput\") &&\n            this.logger instanceof FancyConsoleLogger\n        ) {\n            ts.sys.clearScreen?.();\n        }\n\n        this.logger.verbose(\n            `Using TypeScript ${this.getTypeScriptVersion()} from ${this.getTypeScriptPath()}`,\n        );\n\n        if (\n            !supportedVersionMajorMinor.some(\n                (version) => version == ts.versionMajorMinor,\n            )\n        ) {\n            this.logger.warn(\n                i18n.unsupported_ts_version_0(\n                    supportedVersionMajorMinor.join(\", \"),\n                ),\n            );\n        }\n\n        if (Object.keys(this.options.getCompilerOptions(this.logger)).length === 0) {\n            this.logger.warn(i18n.no_compiler_options_set());\n        }\n\n        // Doing this is considerably more complicated, we'd need to manage an array of programs, not convert until all programs\n        // have reported in the first time... just error out for now. I'm not convinced anyone will actually notice.\n        if (this.options.getFileNames().length === 0) {\n            this.logger.error(i18n.solution_not_supported_in_watch_mode());\n            return false;\n        }\n\n        // Support for packages mode is currently unimplemented\n        if (\n            this.entryPointStrategy !== EntryPointStrategy.Resolve &&\n            this.entryPointStrategy !== EntryPointStrategy.Expand\n        ) {\n            this.logger.error(i18n.strategy_not_supported_in_watch_mode());\n            return false;\n        }\n\n        const tsconfigFile = findTsConfigFile(this.options.getValue(\"tsconfig\")) ??\n            \"tsconfig.json\";\n\n        // We don't want to do it the first time to preserve initial debug status messages. They'll be lost\n        // after the user saves a file, but better than nothing...\n        let firstStatusReport = true;\n\n        const host = ts.createWatchCompilerHost(\n            tsconfigFile,\n            this.options.fixCompilerOptions({}, this.logger),\n            ts.sys,\n            ts.createEmitAndSemanticDiagnosticsBuilderProgram,\n            (d) => diagnostic(this.logger, d),\n            (status, newLine, _options, errorCount) => {\n                if (\n                    !firstStatusReport &&\n                    errorCount === void 0 &&\n                    !this.options.getValue(\"preserveWatchOutput\") &&\n                    this.logger instanceof FancyConsoleLogger\n                ) {\n                    ts.sys.clearScreen?.();\n                }\n                firstStatusReport = false;\n                this.logger.info(\n                    ts.flattenDiagnosticMessageText(\n                        status.messageText,\n                        newLine,\n                    ) as TranslatedString,\n                );\n            },\n        );\n\n        let successFinished = true;\n        let currentProgram: ts.Program | undefined;\n        let lastProgram = currentProgram;\n        let restarting = false;\n\n        this._watchFile = (path: string, shouldRestart = false) => {\n            this.logger.verbose(\n                `Watching ${nicePath(path)}, shouldRestart=${shouldRestart}`,\n            );\n            if (this.watchers.has(path)) return;\n            this.watchers.set(\n                path,\n                host.watchFile(\n                    path,\n                    (file) => {\n                        if (shouldRestart) {\n                            restartMain(file);\n                        } else if (!currentProgram) {\n                            currentProgram = lastProgram;\n                            this.logger.info(\n                                i18n.file_0_changed_rebuilding(\n                                    nicePath(file),\n                                ),\n                            );\n                        }\n                        if (successFinished) runSuccess();\n                    },\n                    2000,\n                ),\n            );\n        };\n\n        /** resolver for the returned promise  */\n        let exitWatch: (restart: boolean) => unknown;\n        const restartMain = (file: string) => {\n            if (restarting) return;\n            this.logger.info(\n                i18n.file_0_changed_restarting(nicePath(file)),\n            );\n            restarting = true;\n            currentProgram = undefined;\n            this.clearWatches();\n            tsWatcher.close();\n        };\n\n        const runSuccess = () => {\n            if (restarting && successFinished) {\n                successFinished = false;\n                exitWatch(true);\n                return;\n            }\n\n            if (!currentProgram) {\n                return;\n            }\n\n            if (successFinished) {\n                if (\n                    this.options.getValue(\"emit\") === \"both\" &&\n                    currentProgram !== lastProgram\n                ) {\n                    currentProgram.emit();\n                }\n                // Save for possible re-run due to non-.ts file change\n                lastProgram = currentProgram;\n\n                this.logger.resetErrors();\n                this.logger.resetWarnings();\n                const entryPoints = getWatchEntryPoints(\n                    this.logger,\n                    this.options,\n                    currentProgram,\n                );\n                if (!entryPoints) {\n                    return;\n                }\n                this.clearWatches();\n                this.criticalFiles.forEach((path) => this.watchFile(path, true));\n                const project = this.converter.convert(entryPoints);\n                currentProgram = undefined;\n                successFinished = false;\n                void success(project).then(() => {\n                    successFinished = true;\n                    runSuccess();\n                });\n            }\n        };\n\n        const origAfterProgramCreate = host.afterProgramCreate;\n        host.afterProgramCreate = (program) => {\n            if (\n                !restarting &&\n                ts.getPreEmitDiagnostics(program.getProgram()).length === 0\n            ) {\n                currentProgram = program.getProgram();\n                runSuccess();\n            }\n            origAfterProgramCreate?.(program);\n        };\n\n        const tsWatcher = ts.createWatchProgram(host);\n\n        // Don't return to caller until the watch needs to restart\n        return await new Promise((res) => {\n            exitWatch = res;\n        });\n    }\n\n    validate(project: ProjectReflection) {\n        const checks = this.options.getValue(\"validation\");\n        const start = Date.now();\n\n        // No point in validating exports when merging. Warnings will have already been emitted when\n        // creating the project jsons that this run merges together.\n        if (\n            checks.notExported &&\n            this.entryPointStrategy !== EntryPointStrategy.Merge\n        ) {\n            validateExports(\n                project,\n                this.logger,\n                this.options.getValue(\"intentionallyNotExported\"),\n            );\n        }\n\n        if (checks.notDocumented) {\n            const packagesRequiringDocumentation = this.options.isSet(\"packagesRequiringDocumentation\")\n                ? this.options.getValue(\"packagesRequiringDocumentation\")\n                : [project.packageName ?? ReflectionSymbolId.UNKNOWN_PACKAGE];\n\n            validateDocumentation(\n                project,\n                this.logger,\n                this.options.getValue(\"requiredToBeDocumented\"),\n                this.options.getValue(\"intentionallyNotDocumented\"),\n                packagesRequiringDocumentation,\n            );\n        }\n\n        if (checks.invalidLink) {\n            validateLinks(project, this.logger);\n        }\n\n        if (checks.unusedMergeModuleWith) {\n            validateMergeModuleWith(project, this.logger);\n        }\n\n        this.trigger(Application.EVENT_VALIDATE_PROJECT, project);\n\n        this.logger.verbose(`Validation took ${Date.now() - start}ms`);\n    }\n\n    /**\n     * Render outputs selected with options for the specified project\n     */\n    public async generateOutputs(project: ProjectReflection): Promise<void> {\n        await this.outputs.writeOutputs(project);\n    }\n\n    /**\n     * Render HTML for the given project\n     */\n    public async generateDocs(\n        project: ProjectReflection,\n        out: string,\n    ): Promise<void> {\n        await this.outputs.writeOutput(\n            {\n                name: \"html\",\n                path: out,\n            },\n            project,\n        );\n    }\n\n    /**\n     * Write the reflections to a json file.\n     *\n     * @param out The path and file name of the target file.\n     * @returns Whether the JSON file could be written successfully.\n     */\n    public async generateJson(\n        project: ProjectReflection,\n        out: string,\n    ): Promise<void> {\n        await this.outputs.writeOutput(\n            {\n                name: \"json\",\n                path: out,\n            },\n            project,\n        );\n    }\n\n    /**\n     * Print the version number.\n     */\n    override toString() {\n        return [\n            \"\",\n            `TypeDoc ${Application.VERSION}`,\n            `Using TypeScript ${this.getTypeScriptVersion()} from ${this.getTypeScriptPath()}`,\n            \"\",\n        ].join(\"\\n\");\n    }\n\n    private async _convertPackages(): Promise<ProjectReflection | undefined> {\n        if (!this.options.isSet(\"entryPoints\")) {\n            this.logger.error(i18n.no_entry_points_for_packages());\n            return;\n        }\n\n        const packageDirs = getPackageDirectories(\n            this.logger,\n            this.options,\n            this.options.getValue(\"entryPoints\"),\n        );\n\n        if (packageDirs.length === 0) {\n            this.logger.error(i18n.failed_to_find_packages());\n            return;\n        }\n\n        const origFiles = this.files;\n        const origOptions = this.options;\n        const projects: JSONOutput.ProjectReflection[] = [];\n\n        for (const opt of Object.keys(this.options.getValue(\"packageOptions\"))) {\n            if (rootPackageOptions.includes(opt as never)) {\n                this.logger.warn(\n                    i18n.package_option_0_should_be_specified_at_root(\n                        opt,\n                    ),\n                );\n            }\n        }\n\n        const projectsToConvert: { dir: string; options: Options }[] = [];\n        // Generate a json file for each package\n        for (const dir of packageDirs) {\n            this.logger.verbose(`Reading project at ${nicePath(dir)}`);\n            let opts: Options;\n            try {\n                opts = origOptions.copyForPackage(dir);\n            } catch (error) {\n                ok(error instanceof Error);\n                this.logger.error(error.message as TranslatedString);\n                this.logger.info(\n                    i18n.previous_error_occurred_when_reading_options_for_0(\n                        nicePath(dir),\n                    ),\n                );\n                continue;\n            }\n\n            await opts.read(this.logger, dir);\n            // Invalid links should only be reported after everything has been merged.\n            // Same goes for @mergeModuleWith, should only be validated after merging\n            // everything together.\n            opts.setValue(\"validation\", {\n                invalidLink: false,\n                unusedMergeModuleWith: false,\n            });\n            if (\n                opts.getValue(\"entryPointStrategy\") ===\n                    EntryPointStrategy.Packages\n            ) {\n                this.logger.error(\n                    i18n.nested_packages_unsupported_0(nicePath(dir)),\n                );\n                continue;\n            }\n\n            projectsToConvert.push({ dir, options: opts });\n        }\n\n        for (const { dir, options } of projectsToConvert) {\n            this.logger.info(i18n.converting_project_at_0(nicePath(dir)));\n            this.options = options;\n            this.files = new ValidatingFileRegistry(options.getValue(\"basePath\"));\n            let project = await this.convert();\n            if (project) {\n                this.validate(project);\n                const serialized = this.serializer.projectToObject(\n                    project,\n                    normalizePath(process.cwd()),\n                );\n                projects.push(serialized);\n            }\n\n            // When debugging memory issues, it's useful to set these\n            // here so that a breakpoint on the continue statement below\n            // gets the memory as it ought to be with all TS objects released.\n            // eslint-disable-next-line no-useless-assignment\n            project = undefined;\n            this.files = undefined!;\n            // global.gc!();\n\n            continue;\n        }\n\n        this.options = origOptions;\n        this.files = origFiles;\n\n        if (projects.length !== packageDirs.length) {\n            this.logger.error(i18n.failed_to_convert_packages());\n            return;\n        }\n\n        this.logger.info(i18n.merging_converted_projects());\n        const result = this.deserializer.reviveProjects(\n            this.options.getValue(\"name\") || \"Documentation\",\n            projects,\n            {\n                projectRoot: normalizePath(process.cwd()),\n                registry: this.files,\n                alwaysCreateEntryPointModule: this.options.getValue(\"alwaysCreateEntryPointModule\"),\n            },\n        );\n        this.converter.addProjectDocuments(result);\n        this.trigger(ApplicationEvents.REVIVE, result);\n        return result;\n    }\n\n    private _merge(): ProjectReflection | undefined {\n        const start = Date.now();\n\n        if (!this.options.isSet(\"entryPoints\")) {\n            this.logger.error(i18n.no_entry_points_to_merge());\n            return;\n        }\n\n        const rootDir = deriveRootDir(this.entryPoints);\n        const entryPoints = this.entryPoints.flatMap((entry) => {\n            const result = glob(entry, rootDir);\n\n            if (result.length === 0) {\n                // #2918 - do not pass entry through nicePath here in case it contains\n                // windows path separators which should cause additional warnings.\n                this.logger.warn(\n                    i18n.entrypoint_did_not_match_files_0(entry),\n                );\n            } else if (result.length !== 1) {\n                this.logger.verbose(\n                    `Expanded ${entry} to:\\n\\t${\n                        result\n                            .map(nicePath)\n                            .join(\"\\n\\t\")\n                    }`,\n                );\n            }\n\n            return result;\n        });\n\n        const jsonProjects = entryPoints.map((path) => {\n            try {\n                return JSON.parse(readFile(path));\n            } catch {\n                this.logger.error(\n                    i18n.failed_to_parse_json_0(nicePath(path)),\n                );\n                return null;\n            }\n        });\n        if (this.logger.hasErrors()) return;\n\n        const result = this.deserializer.reviveProjects(\n            this.options.getValue(\"name\"),\n            jsonProjects,\n            {\n                projectRoot: normalizePath(process.cwd()),\n                registry: this.files,\n                alwaysCreateEntryPointModule: this.options.getValue(\"alwaysCreateEntryPointModule\"),\n            },\n        );\n        this.converter.addProjectDocuments(result);\n        this.logger.verbose(`Reviving projects took ${Date.now() - start}ms`);\n\n        this.trigger(ApplicationEvents.REVIVE, result);\n        return result;\n    }\n}\n"
  },
  {
    "path": "src/lib/cli.ts",
    "content": "/* eslint-disable no-console */\n\nconst ExitCodes = {\n    Ok: 0,\n    OptionError: 1,\n    CompileError: 3,\n    ValidationError: 4,\n    OutputError: 5,\n    ExceptionThrown: 6,\n    Watching: 7,\n};\n\nimport { i18n } from \"#utils\";\nimport * as td from \"../index.js\";\n\nvoid main();\n\nasync function main() {\n    let app: td.Application | undefined;\n\n    try {\n        const start = Date.now();\n\n        app = await td.Application.bootstrapWithPlugins({}, [\n            new td.ArgumentsReader(0),\n            new td.TypeDocReader(),\n            new td.PackageJsonReader(),\n            new td.TSConfigReader(),\n            new td.ArgumentsReader(300).ignoreErrors(),\n        ]);\n\n        const exitCode = await run(app);\n        if (exitCode !== ExitCodes.Watching) {\n            app.logger.verbose(`Full run took ${Date.now() - start}ms`);\n            logRunSummary(app.logger);\n        }\n        process.exit(exitCode);\n    } catch (error) {\n        console.error(\"TypeDoc exiting with unexpected error:\");\n        console.error(error);\n        if (app?.options.getValue(\"skipErrorChecking\")) {\n            console.error(\n                \"Try turning off --skipErrorChecking. If TypeDoc still crashes, please report a bug.\",\n            );\n        }\n        process.exit(ExitCodes.ExceptionThrown);\n    }\n}\n\nasync function run(app: td.Application) {\n    if (app.options.getValue(\"version\")) {\n        console.log(app.toString());\n        return ExitCodes.Ok;\n    }\n\n    if (app.options.getValue(\"help\")) {\n        console.log(app.options.getHelp());\n        return ExitCodes.Ok;\n    }\n\n    if (app.options.getValue(\"showConfig\")) {\n        console.log(app.options.getRawValues());\n        return ExitCodes.Ok;\n    }\n\n    if (app.logger.hasErrors()) {\n        return ExitCodes.OptionError;\n    }\n    if (\n        app.options.getValue(\"treatWarningsAsErrors\") &&\n        app.logger.hasWarnings()\n    ) {\n        return ExitCodes.OptionError;\n    }\n\n    if (app.options.getValue(\"watch\") || process.env[\"TYPEDOC_FORCE_WATCH\"]) {\n        const continueWatching = await app.convertAndWatch(async (project) => {\n            app.validate(project);\n            await app.generateOutputs(project);\n        });\n\n        return continueWatching ? ExitCodes.Watching : ExitCodes.OptionError;\n    }\n\n    const project = await app.convert();\n    if (!project) {\n        return ExitCodes.CompileError;\n    }\n    if (\n        app.options.getValue(\"treatWarningsAsErrors\") &&\n        app.logger.hasWarnings()\n    ) {\n        return ExitCodes.CompileError;\n    }\n\n    const preValidationWarnCount = app.logger.warningCount;\n    app.validate(project);\n    const hadValidationWarnings = app.logger.warningCount !== preValidationWarnCount ||\n        app.logger.validationWarningCount != 0;\n    if (app.logger.hasErrors()) {\n        return ExitCodes.ValidationError;\n    }\n    if (\n        hadValidationWarnings &&\n        (app.options.getValue(\"treatWarningsAsErrors\") ||\n            app.options.getValue(\"treatValidationWarningsAsErrors\"))\n    ) {\n        return ExitCodes.ValidationError;\n    }\n\n    if (app.options.getValue(\"emit\") !== \"none\") {\n        await app.generateOutputs(project);\n\n        if (app.logger.hasErrors()) {\n            return ExitCodes.OutputError;\n        }\n        if (\n            app.options.getValue(\"treatWarningsAsErrors\") &&\n            app.logger.hasWarnings()\n        ) {\n            return ExitCodes.OutputError;\n        }\n    }\n\n    return ExitCodes.Ok;\n}\n\n/**\n * Generate a string with the number of errors and warnings found.\n */\nfunction logRunSummary(logger: td.Logger): void {\n    const { errorCount, warningCount } = logger;\n    if (errorCount) {\n        logger.error(\n            i18n.found_0_errors_and_1_warnings(\n                errorCount.toString(),\n                warningCount.toString(),\n            ),\n        );\n    } else if (warningCount) {\n        logger.warn(\n            i18n.found_0_errors_and_1_warnings(\n                errorCount.toString(),\n                warningCount.toString(),\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/comments/blockLexer.ts",
    "content": "import ts from \"typescript\";\nimport { type Token, TokenSyntaxKind } from \"./lexer.js\";\nimport { resolveAliasedSymbol } from \"../utils/symbols.js\";\nimport type { Context } from \"../context.js\";\n\nexport function* lexBlockComment(\n    file: string,\n    pos = 0,\n    end = file.length,\n    createSymbolId: Context[\"createSymbolId\"] = () => {\n        throw new Error(\"unreachable\");\n    },\n    jsDoc?: ts.JSDoc,\n    checker?: ts.TypeChecker,\n): Generator<Token, undefined, undefined> {\n    // Wrapper around our real lex function to collapse adjacent text tokens.\n    let textToken: Token | undefined;\n    for (\n        const token of lexBlockComment2(\n            file,\n            pos,\n            end,\n            getLinkTags(jsDoc),\n            checker,\n            createSymbolId,\n        )\n    ) {\n        if (token.kind === TokenSyntaxKind.Text) {\n            if (textToken) {\n                textToken.text += token.text;\n            } else {\n                textToken = token;\n            }\n        } else {\n            if (textToken) {\n                yield textToken;\n                textToken = void 0;\n            }\n            yield token;\n        }\n    }\n\n    if (textToken) {\n        yield textToken;\n    }\n    return;\n}\n\nfunction getLinkTags(\n    jsDoc: ts.JSDoc | undefined,\n): ReadonlyArray<ts.JSDocLink | ts.JSDocLinkCode | ts.JSDocLinkPlain> {\n    const result: (ts.JSDocLink | ts.JSDocLinkCode | ts.JSDocLinkPlain)[] = [];\n\n    if (jsDoc?.comment && typeof jsDoc.comment !== \"string\") {\n        for (const part of jsDoc.comment) {\n            switch (part.kind) {\n                case ts.SyntaxKind.JSDocLink:\n                case ts.SyntaxKind.JSDocLinkCode:\n                case ts.SyntaxKind.JSDocLinkPlain:\n                    result.push(part);\n            }\n        }\n    }\n\n    for (const block of jsDoc?.tags || []) {\n        if (!block.comment || typeof block.comment === \"string\") continue;\n\n        for (const part of block.comment) {\n            switch (part.kind) {\n                case ts.SyntaxKind.JSDocLink:\n                case ts.SyntaxKind.JSDocLinkCode:\n                case ts.SyntaxKind.JSDocLinkPlain:\n                    result.push(part);\n            }\n        }\n    }\n\n    return result;\n}\n\nfunction* lexBlockComment2(\n    file: string,\n    pos: number,\n    end: number,\n    linkTags: ReadonlyArray<\n        ts.JSDocLink | ts.JSDocLinkCode | ts.JSDocLinkPlain\n    >,\n    checker: ts.TypeChecker | undefined,\n    createSymbolId: Context[\"createSymbolId\"],\n): Generator<Token, undefined, undefined> {\n    pos += 2; // Leading '/*'\n    end -= 2; // Trailing '*/'\n\n    if (pos < end && file[pos] === \"*\") {\n        // Might start with '/**'\n        pos++;\n    }\n\n    // Before skipping whitespace, figure out the comment indent size\n    const [commentHasStars, indent] = discoverIndent(file, pos, end);\n\n    // Skip leading whitespace\n    while (pos < end && /\\s/.test(file[pos])) {\n        pos++;\n    }\n\n    // Trailing whitespace\n    while (pos < end && /\\s/.test(file[end - 1])) {\n        end--;\n    }\n\n    let lineStart = true;\n    let braceStartsType = false;\n    let linkTagIndex = 0;\n\n    for (;;) {\n        if (pos >= end) {\n            return;\n        }\n\n        if (lineStart) {\n            pos = skipIndent(pos);\n            if (commentHasStars && file[pos] === \"*\") {\n                pos++;\n                if (file[pos] === \" \") {\n                    pos++;\n                }\n            }\n            lineStart = false;\n        }\n\n        switch (file[pos]) {\n            case \"\\n\":\n                yield makeToken(TokenSyntaxKind.NewLine, 1);\n                lineStart = true;\n                break;\n\n            case \"{\":\n                if (braceStartsType && nextNonWs(pos + 1) !== \"@\") {\n                    yield makeToken(\n                        TokenSyntaxKind.TypeAnnotation,\n                        findEndOfType(pos) - pos,\n                    );\n                    braceStartsType = false;\n                } else {\n                    yield makeToken(TokenSyntaxKind.OpenBrace, 1);\n                }\n                break;\n\n            case \"}\":\n                yield makeToken(TokenSyntaxKind.CloseBrace, 1);\n                braceStartsType = false;\n                break;\n\n            case \"`\": {\n                // Markdown's code rules are a royal pain. This could be one of several things.\n                // 1. Inline code: <1-n ticks><text without multiple consecutive newlines or ticks at start of line><same number of ticks>\n                // 2. Code block: <newline><3+ ticks><language, no ticks>\\n<text>\\n<3 ticks>\\n\n                // 3. Unmatched tick(s), not code, but part of some text.\n                // We don't quite handle #2 correctly yet. PR welcome!\n                braceStartsType = false;\n                let tickCount = 1;\n\n                let lookahead = pos - 1;\n                let atNewline = true;\n                while (lookahead > 0 && file[lookahead] !== \"\\n\") {\n                    if (/\\S/.test(file[lookahead])) {\n                        if (!commentHasStars || file[lookahead] !== \"*\") {\n                            atNewline = false;\n                            break;\n                        }\n                    }\n                    --lookahead;\n                }\n                lookahead = pos;\n\n                while (lookahead + 1 < end && file[lookahead + 1] === \"`\") {\n                    tickCount++;\n                    lookahead++;\n                }\n                const isCodeBlock = atNewline && tickCount >= 3;\n                let lookaheadStart = pos;\n                const codeText: string[] = [];\n\n                lookahead++;\n                while (lookahead < end) {\n                    if (lookaheadExactlyNTicks(lookahead, tickCount)) {\n                        lookahead += tickCount;\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        const codeTextStr = codeText.join(\"\");\n                        if (isCodeBlock || !/\\n\\s*\\n/.test(codeTextStr)) {\n                            yield {\n                                kind: TokenSyntaxKind.Code,\n                                text: codeTextStr,\n                                pos,\n                            };\n                            pos = lookahead;\n                        } else {\n                            yield makeToken(TokenSyntaxKind.Text, tickCount);\n                        }\n                        break;\n                    } else if (file[lookahead] === \"`\") {\n                        while (lookahead < end && file[lookahead] === \"`\") {\n                            lookahead++;\n                        }\n                    } else if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        file[lookahead + 1] === \"/\"\n                    ) {\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        lookaheadStart = lookahead + 1;\n                        lookahead += 2;\n                    } else if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        file[lookahead + 1] !== \"\\n\"\n                    ) {\n                        lookahead += 2;\n                    } else if (file[lookahead] === \"\\n\") {\n                        lookahead++;\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        lookahead = skipIndent(lookahead);\n                        if (commentHasStars && file[lookahead] === \"*\") {\n                            lookahead++;\n                            if (file[lookahead] === \" \") {\n                                lookahead++;\n                            }\n                        }\n                        lookaheadStart = lookahead;\n                    } else {\n                        lookahead++;\n                    }\n                }\n\n                if (lookahead >= end && pos !== lookahead) {\n                    if (\n                        isCodeBlock &&\n                        file.substring(pos, end).includes(\"\\n\")\n                    ) {\n                        codeText.push(file.substring(lookaheadStart, end));\n                        yield {\n                            kind: TokenSyntaxKind.Code,\n                            text: codeText.join(\"\"),\n                            pos,\n                        };\n                        pos = lookahead;\n                    } else {\n                        yield makeToken(TokenSyntaxKind.Text, tickCount);\n                    }\n                }\n\n                break;\n            }\n\n            case \"@\": {\n                let lookahead = pos + 1;\n                while (lookahead < end && /[a-z]/i.test(file[lookahead])) {\n                    lookahead++;\n                }\n\n                if (lookahead !== pos + 1) {\n                    while (\n                        lookahead < end &&\n                        /[a-z0-9-]/i.test(file[lookahead])\n                    ) {\n                        lookahead++;\n                    }\n                }\n\n                if (\n                    lookahead !== pos + 1 &&\n                    (lookahead === end || /[\\s}]/.test(file[lookahead]))\n                ) {\n                    braceStartsType = true;\n                    const token = makeToken(\n                        TokenSyntaxKind.Tag,\n                        lookahead - pos,\n                    );\n                    attachLinkTagResult(token);\n                    yield token;\n                    break;\n                }\n            }\n            // fall through if we didn't find something that looks like a tag\n\n            default: {\n                const textParts: string[] = [];\n\n                let lookaheadStart = pos;\n                let lookahead = pos;\n                while (lookahead < end) {\n                    if (\"{}\\n`\".includes(file[lookahead])) break;\n\n                    if (\n                        lookahead !== pos &&\n                        file[lookahead] === \"@\" &&\n                        /\\s/.test(file[lookahead - 1])\n                    ) {\n                        // Probably the start of a modifier tag\n                        break;\n                    }\n\n                    if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        \"{}@/`\".includes(file[lookahead + 1])\n                    ) {\n                        textParts.push(\n                            file.substring(lookaheadStart, lookahead),\n                            file[lookahead + 1],\n                        );\n                        lookahead++;\n                        lookaheadStart = lookahead + 1;\n                    }\n\n                    lookahead++;\n                }\n\n                textParts.push(file.substring(lookaheadStart, lookahead));\n\n                if (textParts.some((part) => /\\S/.test(part))) {\n                    braceStartsType = false;\n                }\n\n                // This piece of text had line continuations or escaped text\n                yield {\n                    kind: TokenSyntaxKind.Text,\n                    text: textParts.join(\"\"),\n                    pos,\n                };\n                pos = lookahead;\n                break;\n            }\n        }\n    }\n\n    function attachLinkTagResult(token: Token) {\n        // We might need to skip link tags if someone has link tags inside of an example comment\n        // pos-1 for opening brace, TS doesn't allow spaces between opening brace and @ sign as of 5.0.2\n        while (\n            linkTagIndex < linkTags.length &&\n            linkTags[linkTagIndex].pos < token.pos - 1\n        ) {\n            linkTagIndex++;\n        }\n\n        if (\n            linkTagIndex < linkTags.length &&\n            linkTags[linkTagIndex].pos === token.pos - 1\n        ) {\n            const link = linkTags[linkTagIndex];\n            if (link.name) {\n                const tsTarget = checker?.getSymbolAtLocation(\n                    getRightmostName(link.name),\n                );\n                if (tsTarget) {\n                    token.tsLinkTarget = createSymbolId(\n                        resolveAliasedSymbol(tsTarget, checker!),\n                    );\n                    token.tsLinkText = link.text.replace(/^\\s*\\|\\s*/, \"\");\n                }\n            }\n        }\n    }\n\n    function makeToken(kind: TokenSyntaxKind, size: number): Token {\n        const start = pos;\n        pos += size;\n\n        return {\n            kind,\n            text: file.substring(start, pos),\n            pos: start,\n        };\n    }\n\n    function skipIndent(pos: number) {\n        let taken = indent;\n        let lookahead = pos;\n        while (\n            taken > 0 &&\n            lookahead < end &&\n            file[lookahead] !== \"\\n\" &&\n            /\\s/.test(file[lookahead])\n        ) {\n            taken--;\n            lookahead++;\n        }\n        return lookahead;\n    }\n\n    function lookaheadExactlyNTicks(pos: number, n: number) {\n        if (pos + n > end) {\n            return false;\n        }\n\n        return file.startsWith(\"`\".repeat(n), pos) && file[pos + n] !== \"`\";\n    }\n\n    function findEndOfType(pos: number): number {\n        let openBraces = 0;\n\n        while (pos < end) {\n            if (file[pos] === \"{\") {\n                openBraces++;\n            } else if (file[pos] === \"}\") {\n                if (--openBraces === 0) {\n                    break;\n                }\n            } else if (\"`'\\\"\".includes(file[pos])) {\n                pos = findEndOfString(pos);\n            }\n\n            pos++;\n        }\n\n        if (pos < end && file[pos] === \"}\") {\n            pos++;\n        }\n\n        return pos;\n    }\n\n    function findEndOfString(pos: number): number {\n        const endOfString = file[pos];\n        pos++;\n        while (pos < end) {\n            if (file[pos] === endOfString) {\n                break;\n            } else if (file[pos] === \"\\\\\") {\n                pos++; // Skip escaped character\n            } else if (\n                endOfString === \"`\" &&\n                file[pos] === \"$\" &&\n                file[pos + 1] === \"{\"\n            ) {\n                // Template literal with data inside a ${}\n                while (pos < end && file[pos] !== \"}\") {\n                    if (\"`'\\\"\".includes(file[pos])) {\n                        pos = findEndOfString(pos) + 1;\n                    } else {\n                        pos++;\n                    }\n                }\n            }\n\n            pos++;\n        }\n\n        return pos;\n    }\n\n    function nextNonWs(pos: number): string | undefined {\n        while (pos < end && /\\s/.test(file[pos])) {\n            pos++;\n        }\n        return file[pos];\n    }\n}\n\nfunction discoverIndent(\n    file: string,\n    pos: number,\n    end: number,\n): [boolean, number] {\n    let indent = 0;\n\n    while (pos < end && file[pos] !== \"\\n\") {\n        pos++;\n    }\n\n    outer: while (pos < end) {\n        pos++;\n        const lineStart = pos;\n        while (pos < end && file[pos] !== \"\\n\") {\n            if (/\\S/.test(file[pos])) {\n                indent = pos - lineStart;\n                break outer;\n            }\n            pos++;\n        }\n    }\n\n    const commentHasStars = pos < end && file[pos] === \"*\";\n\n    return [commentHasStars, indent];\n}\n\nfunction getRightmostName(name: ts.EntityName | ts.JSDocMemberName) {\n    if (ts.isJSDocMemberName(name)) {\n        return name.right;\n    }\n    if (ts.isQualifiedName(name)) {\n        return name.right;\n    }\n\n    return name;\n}\n"
  },
  {
    "path": "src/lib/converter/comments/declarationReferenceResolver.ts",
    "content": "import { ok } from \"assert\";\nimport {\n    ContainerReflection,\n    DeclarationReflection,\n    type DocumentReflection,\n    type ProjectReflection,\n    ReferenceReflection,\n    type Reflection,\n    ReflectionKind,\n} from \"../../models/index.js\";\nimport { assertNever, filterMap } from \"#utils\";\nimport type { ComponentPath, DeclarationReference, Meaning, MeaningKeyword } from \"#utils\";\n\nfunction resolveReferenceReflection(ref: Reflection): Reflection {\n    if (ref instanceof ReferenceReflection) {\n        return ref.getTargetReflectionDeep();\n    }\n    return ref;\n}\n\nexport function resolveDeclarationReference(\n    reflection: Reflection,\n    ref: DeclarationReference,\n): Reflection | undefined {\n    let high: Reflection[] = [];\n    let low: Reflection[] = [];\n\n    if (ref.moduleSource) {\n        high = reflection.project.children?.filter(\n            (c) =>\n                c.kindOf(ReflectionKind.SomeModule) &&\n                c.name === ref.moduleSource,\n        ) || [];\n\n        if (!high.length && reflection.project.packageName === ref.moduleSource) {\n            high.push(reflection.project);\n        }\n    } else if (ref.resolutionStart === \"global\") {\n        high.push(reflection.project);\n        if (reflection.project.children?.length === 1) {\n            high.push(reflection.project.children[0]);\n        }\n    } else {\n        // Work around no-unnecessary-condition, should be unnecessary... want a trap if it ever becomes false.\n        ok(\n            ref.resolutionStart.startsWith(\"local\") &&\n                ref.resolutionStart.length === 5,\n        );\n        // TypeScript's behavior is to first try to resolve links via variable scope, and then\n        // if the link still hasn't been found, check either siblings (if comment belongs to a member)\n        // or otherwise children.\n        let refl: Reflection | undefined = reflection;\n        if (refl.kindOf(ReflectionKind.ExportContainer)) {\n            high.push(refl);\n        }\n        while (refl.parent) {\n            refl = refl.parent;\n            if (refl.kindOf(ReflectionKind.ExportContainer)) {\n                high.push(refl);\n            } else {\n                low.push(refl);\n            }\n\n            if (\n                refl.kindOf(ReflectionKind.Project) &&\n                (refl as ProjectReflection).children?.length === 1\n            ) {\n                high.push((refl as ProjectReflection).children![0]);\n            }\n        }\n\n        if (reflection.kindOf(ReflectionKind.SomeMember)) {\n            high.push(reflection.parent!);\n        } else if (\n            reflection.kindOf(ReflectionKind.SomeSignature) &&\n            reflection.parent!.kindOf(ReflectionKind.SomeMember)\n        ) {\n            high.push(reflection.parent!.parent!);\n        } else if (high[0] !== reflection) {\n            if (reflection.parent instanceof ContainerReflection) {\n                high.push(\n                    ...(reflection.parent.childrenIncludingDocuments?.filter(\n                        (c) => c.name === reflection.name,\n                    ) || []),\n                );\n            } else {\n                high.push(reflection);\n            }\n        }\n    }\n\n    if (ref.symbolReference) {\n        for (const part of ref.symbolReference.path || []) {\n            const high2 = high;\n            high = [];\n            const low2 = low;\n            low = [];\n\n            for (const refl of high2) {\n                const resolved = resolveSymbolReferencePart(refl, part);\n                high.push(...resolved.high.map(resolveReferenceReflection));\n                low.push(...resolved.low.map(resolveReferenceReflection));\n            }\n\n            for (const refl of low2) {\n                const resolved = resolveSymbolReferencePart(refl, part);\n                low.push(...resolved.high.map(resolveReferenceReflection));\n                low.push(...resolved.low.map(resolveReferenceReflection));\n            }\n        }\n\n        if (ref.symbolReference.meaning) {\n            high = filterMapByMeaning(high, ref.symbolReference.meaning);\n            low = filterMapByMeaning(low, ref.symbolReference.meaning);\n        }\n    }\n\n    return high[0] || low[0];\n}\n\nfunction filterMapByMeaning(\n    reflections: Reflection[],\n    meaning: Meaning,\n): Reflection[] {\n    return filterMap(reflections, (refl): Reflection | undefined => {\n        const kwResolved = resolveKeyword(refl, meaning.keyword) || [];\n        if (meaning.label) {\n            return kwResolved.find((r) => r.comment?.label === meaning.label);\n        }\n        return kwResolved[meaning.index || 0];\n    });\n}\n\nfunction resolveKeyword(\n    refl: Reflection,\n    kw: MeaningKeyword | undefined,\n): Reflection[] | undefined {\n    switch (kw) {\n        case undefined:\n            return refl instanceof DeclarationReflection && refl.signatures\n                ? refl.signatures\n                : [refl];\n        case \"class\":\n            if (refl.kindOf(ReflectionKind.Class)) return [refl];\n            break;\n        case \"interface\":\n            if (refl.kindOf(ReflectionKind.Interface)) return [refl];\n            break;\n        case \"type\":\n            if (refl.kindOf(ReflectionKind.SomeType)) return [refl];\n            break;\n        case \"enum\":\n            if (refl.kindOf(ReflectionKind.Enum)) return [refl];\n            break;\n        case \"namespace\":\n            if (refl.kindOf(ReflectionKind.SomeModule)) return [refl];\n            break;\n        case \"function\":\n            if (refl.kindOf(ReflectionKind.FunctionOrMethod)) {\n                return (refl as DeclarationReflection).signatures;\n            }\n            break;\n        case \"var\":\n            if (refl.kindOf(ReflectionKind.Variable)) return [refl];\n            break;\n\n        case \"new\":\n        case \"constructor\":\n            if (\n                refl.kindOf(\n                    ReflectionKind.ClassOrInterface |\n                        ReflectionKind.TypeLiteral,\n                )\n            ) {\n                const ctor = (refl as ContainerReflection).children?.find((c) => c.kindOf(ReflectionKind.Constructor));\n                return (ctor as DeclarationReflection).signatures;\n            }\n            break;\n\n        case \"member\":\n            if (refl.kindOf(ReflectionKind.SomeMember)) return [refl];\n            break;\n        case \"event\":\n            // Never resolve. Nobody should use this.\n            // It's required by the grammar, but is not documented by TypeDoc\n            // nor by the comments in the grammar.\n            break;\n        case \"call\":\n            return (refl as DeclarationReflection).signatures;\n\n        case \"index\":\n            if ((refl as DeclarationReflection).indexSignatures) {\n                return (refl as DeclarationReflection).indexSignatures;\n            }\n            break;\n\n        case \"complex\":\n            if (refl.kindOf(ReflectionKind.SomeType)) return [refl];\n            break;\n\n        case \"getter\":\n            if ((refl as DeclarationReflection).getSignature) {\n                return [(refl as DeclarationReflection).getSignature!];\n            }\n            break;\n\n        case \"setter\":\n            if ((refl as DeclarationReflection).setSignature) {\n                return [(refl as DeclarationReflection).setSignature!];\n            }\n            break;\n\n        default:\n            assertNever(kw);\n    }\n}\n\nfunction resolveSymbolReferencePart(\n    refl: Reflection,\n    path: ComponentPath,\n): { high: Reflection[]; low: Reflection[] } {\n    let high: Reflection[] = [];\n    let low: Reflection[] = [];\n\n    let children:\n        | ReadonlyArray<DocumentReflection | DeclarationReflection>\n        | undefined;\n\n    if (refl instanceof ContainerReflection) {\n        children = refl.childrenIncludingDocuments;\n    }\n    if (!children && refl.isDeclaration() && refl.type?.type === \"reflection\") {\n        children = refl.type.declaration.childrenIncludingDocuments;\n    }\n\n    if (!children) {\n        return { high, low };\n    }\n\n    switch (path.navigation) {\n        // Grammar says resolve via \"exports\"... as always, reality is more complicated.\n        // Check exports first, but also allow this as a general purpose \"some child\" operator\n        // so that resolution doesn't behave very poorly with projects using JSDoc style resolution.\n        // Also is more consistent with how TypeScript resolves link tags.\n        case \".\":\n            high = children.filter(\n                (r) =>\n                    r.name === path.path &&\n                    (r.kindOf(ReflectionKind.SomeExport) || r.flags.isStatic),\n            );\n            low = children.filter(\n                (r) =>\n                    r.name === path.path &&\n                    (!r.kindOf(ReflectionKind.SomeExport) || !r.flags.isStatic),\n            );\n            break;\n\n        // Resolve via \"members\", interface children, class instance properties/accessors/methods,\n        // enum members, type literal properties\n        case \"#\":\n            high = children?.filter((r) => {\n                return (\n                    r.name === path.path &&\n                    r.kindOf(ReflectionKind.SomeMember) &&\n                    !r.flags.isStatic\n                );\n            }) || [];\n            break;\n\n        // Resolve via \"locals\"... treat this as a stricter `.` which only supports traversing\n        // module/namespace exports since TypeDoc doesn't support documenting locals.\n        case \"~\":\n            if (\n                refl.kindOf(ReflectionKind.SomeModule | ReflectionKind.Project)\n            ) {\n                high = children?.filter((r) => r.name === path.path) || [];\n            }\n            break;\n    }\n\n    return { high, low };\n}\n"
  },
  {
    "path": "src/lib/converter/comments/discovery.ts",
    "content": "import ts from \"typescript\";\nimport { ReflectionKind } from \"../../models/index.js\";\nimport { CommentStyle } from \"../../utils/options/declaration.js\";\nimport { nicePath } from \"../../utils/paths.js\";\nimport { ok } from \"assert\";\nimport { assertNever, filter, firstDefined, i18n, type Logger } from \"#utils\";\nimport { resolveAliasedSymbol } from \"../utils/symbols.js\";\n\nconst variablePropertyKinds = [\n    ts.SyntaxKind.PropertyDeclaration,\n    ts.SyntaxKind.PropertySignature,\n    ts.SyntaxKind.BinaryExpression,\n    ts.SyntaxKind.PropertyAssignment,\n    ts.SyntaxKind.ShorthandPropertyAssignment,\n    // class X { constructor(/** Comment */ readonly z: string) }\n    ts.SyntaxKind.Parameter,\n    // Variable values\n    ts.SyntaxKind.VariableDeclaration,\n    ts.SyntaxKind.BindingElement,\n    ts.SyntaxKind.ExportAssignment,\n    ts.SyntaxKind.PropertyAccessExpression,\n];\n\n// Note: This does NOT include JSDoc syntax kinds. This is important!\n// Comments from @typedef and @callback tags are handled specially by\n// the JSDoc converter because we only want part of the comment when\n// getting them.\n// This also does NOT include kinds which should be checked after the\n// first kind/kinds have been checked for a comment.\nconst wantedKinds: Record<ReflectionKind, ts.SyntaxKind[]> = {\n    [ReflectionKind.Project]: [\n        ts.SyntaxKind.SourceFile,\n        ts.SyntaxKind.ModuleDeclaration,\n    ],\n    [ReflectionKind.Module]: [\n        ts.SyntaxKind.SourceFile,\n        ts.SyntaxKind.ModuleDeclaration,\n    ],\n    [ReflectionKind.Namespace]: [\n        ts.SyntaxKind.ModuleDeclaration,\n        ts.SyntaxKind.SourceFile,\n        ts.SyntaxKind.BindingElement,\n        ts.SyntaxKind.ExportSpecifier,\n        ts.SyntaxKind.NamespaceExport,\n    ],\n    [ReflectionKind.Enum]: [\n        ts.SyntaxKind.EnumDeclaration,\n    ],\n    [ReflectionKind.EnumMember]: [\n        ts.SyntaxKind.EnumMember,\n    ],\n    [ReflectionKind.Variable]: variablePropertyKinds,\n    [ReflectionKind.Function]: [\n        ts.SyntaxKind.FunctionDeclaration,\n        ts.SyntaxKind.BindingElement,\n        ts.SyntaxKind.VariableDeclaration,\n        ts.SyntaxKind.ExportAssignment,\n        ts.SyntaxKind.PropertyAccessExpression,\n        ts.SyntaxKind.PropertyDeclaration,\n        ts.SyntaxKind.PropertyAssignment,\n        ts.SyntaxKind.ShorthandPropertyAssignment,\n    ],\n    [ReflectionKind.Class]: [\n        ts.SyntaxKind.ClassDeclaration,\n        ts.SyntaxKind.BindingElement,\n    ],\n    [ReflectionKind.Interface]: [\n        ts.SyntaxKind.InterfaceDeclaration,\n    ],\n    [ReflectionKind.Constructor]: [ts.SyntaxKind.Constructor],\n    [ReflectionKind.Property]: variablePropertyKinds,\n    [ReflectionKind.Method]: [\n        ts.SyntaxKind.FunctionDeclaration,\n        ts.SyntaxKind.MethodDeclaration,\n    ],\n    [ReflectionKind.CallSignature]: [\n        ts.SyntaxKind.FunctionDeclaration,\n        ts.SyntaxKind.VariableDeclaration,\n        ts.SyntaxKind.MethodDeclaration,\n        ts.SyntaxKind.MethodDeclaration,\n        ts.SyntaxKind.PropertyDeclaration,\n        ts.SyntaxKind.PropertySignature,\n        ts.SyntaxKind.CallSignature,\n    ],\n    [ReflectionKind.IndexSignature]: [ts.SyntaxKind.IndexSignature],\n    [ReflectionKind.ConstructorSignature]: [ts.SyntaxKind.ConstructSignature],\n    [ReflectionKind.Parameter]: [ts.SyntaxKind.Parameter],\n    [ReflectionKind.TypeLiteral]: [ts.SyntaxKind.TypeLiteral],\n    [ReflectionKind.TypeParameter]: [ts.SyntaxKind.TypeParameter],\n    [ReflectionKind.Accessor]: [ts.SyntaxKind.PropertyDeclaration],\n    [ReflectionKind.GetSignature]: [ts.SyntaxKind.GetAccessor],\n    [ReflectionKind.SetSignature]: [ts.SyntaxKind.SetAccessor],\n    [ReflectionKind.TypeAlias]: [\n        ts.SyntaxKind.TypeAliasDeclaration,\n    ],\n    [ReflectionKind.Reference]: [\n        ts.SyntaxKind.NamespaceExport,\n        ts.SyntaxKind.ExportSpecifier,\n    ],\n    // Non-TS kind, will never have comments.\n    [ReflectionKind.Document]: [],\n};\n\n// These kinds are checked after wantedKinds if wantedKinds doesn't result in\n// discovering a comment. This is a rather unfortunate tradeoff between discovering\n// comments for values in unusual circumstances (#2970) and avoiding duplicate\n// comments being discovered for declaration merging nastiness (#3064)\nconst backupWantedKinds: Record<ReflectionKind, ts.SyntaxKind[]> = {\n    [ReflectionKind.Project]: [],\n    [ReflectionKind.Module]: [],\n    [ReflectionKind.Namespace]: [\n        // @namespace support\n        ts.SyntaxKind.VariableDeclaration,\n        ts.SyntaxKind.BindingElement,\n        ts.SyntaxKind.ExportAssignment,\n        ts.SyntaxKind.PropertyAccessExpression,\n        ts.SyntaxKind.PropertyDeclaration,\n        ts.SyntaxKind.PropertyAssignment,\n        ts.SyntaxKind.ShorthandPropertyAssignment,\n    ],\n    [ReflectionKind.Enum]: [\n        ts.SyntaxKind.VariableDeclaration,\n    ],\n    [ReflectionKind.EnumMember]: [\n        // These here so that @enum gets comments\n        ts.SyntaxKind.PropertyAssignment,\n        ts.SyntaxKind.PropertySignature,\n    ],\n    [ReflectionKind.Variable]: [],\n    [ReflectionKind.Function]: [\n        ts.SyntaxKind.FunctionDeclaration,\n        ts.SyntaxKind.BindingElement,\n        ts.SyntaxKind.VariableDeclaration,\n        ts.SyntaxKind.ExportAssignment,\n        ts.SyntaxKind.PropertyAccessExpression,\n        ts.SyntaxKind.PropertyDeclaration,\n        ts.SyntaxKind.PropertyAssignment,\n        ts.SyntaxKind.ShorthandPropertyAssignment,\n    ],\n    [ReflectionKind.Class]: [\n        // If marked with @class\n        ts.SyntaxKind.VariableDeclaration,\n        ts.SyntaxKind.ExportAssignment,\n        ts.SyntaxKind.FunctionDeclaration,\n    ],\n    [ReflectionKind.Interface]: [\n        ts.SyntaxKind.TypeAliasDeclaration,\n        ts.SyntaxKind.ClassDeclaration, // type only exports\n    ],\n    [ReflectionKind.Constructor]: [],\n    [ReflectionKind.Property]: [],\n    [ReflectionKind.Method]: [],\n    [ReflectionKind.CallSignature]: [],\n    [ReflectionKind.IndexSignature]: [],\n    [ReflectionKind.ConstructorSignature]: [],\n    [ReflectionKind.Parameter]: [],\n    [ReflectionKind.TypeLiteral]: [],\n    [ReflectionKind.TypeParameter]: [],\n    [ReflectionKind.Accessor]: [],\n    [ReflectionKind.GetSignature]: [],\n    [ReflectionKind.SetSignature]: [],\n    [ReflectionKind.TypeAlias]: [\n        ts.SyntaxKind.FunctionDeclaration, // type only exports\n        ts.SyntaxKind.VariableDeclaration, // type only exports\n    ],\n    [ReflectionKind.Reference]: [],\n    // Non-TS kind, will never have comments.\n    [ReflectionKind.Document]: [],\n};\n\nexport interface DiscoveredComment {\n    file: ts.SourceFile;\n    ranges: ts.CommentRange[];\n    jsDoc: ts.JSDoc | undefined;\n    inheritedFromParentDeclaration: boolean;\n}\n\nexport function discoverFileComments(\n    node: ts.SourceFile,\n    commentStyle: CommentStyle,\n): DiscoveredComment[] {\n    const text = node.text;\n\n    const comments = collectCommentRanges(\n        ts.getLeadingCommentRanges(text, node.pos),\n    );\n\n    const selectedDocComments = comments.filter((ranges) => permittedRange(text, ranges, commentStyle));\n\n    return selectedDocComments.map((ranges) => {\n        return {\n            file: node,\n            ranges,\n            jsDoc: findJsDocForComment(node, ranges),\n            inheritedFromParentDeclaration: false,\n        };\n    });\n}\n\nexport function discoverNodeComment(\n    node: ts.Node,\n    commentStyle: CommentStyle,\n): DiscoveredComment | undefined {\n    const text = node.getSourceFile().text;\n    const comments = collectCommentRanges(\n        ts.getLeadingCommentRanges(text, node.pos),\n    );\n    comments.reverse();\n\n    const selectedDocComment = comments.find((ranges) => permittedRange(text, ranges, commentStyle));\n\n    if (selectedDocComment) {\n        return {\n            file: node.getSourceFile(),\n            ranges: selectedDocComment,\n            jsDoc: findJsDocForComment(node, selectedDocComment),\n            inheritedFromParentDeclaration: false,\n        };\n    }\n}\n\nfunction checkCommentDeclarations(\n    commentNodes: ReadonlyArray<{\n        node: ts.Node;\n        inheritedFromParentDeclaration: boolean;\n    }>,\n    reverse: boolean,\n    commentStyle: CommentStyle,\n) {\n    const discovered: DiscoveredComment[] = [];\n\n    for (const { node, inheritedFromParentDeclaration } of commentNodes) {\n        const text = node.getSourceFile().text;\n\n        const comments = collectCommentRanges(\n            ts.getLeadingCommentRanges(text, node.pos),\n        );\n\n        if (reverse) {\n            comments.reverse();\n        }\n\n        const selectedDocComment = comments.find((ranges) => permittedRange(text, ranges, commentStyle));\n\n        if (selectedDocComment) {\n            discovered.push({\n                file: node.getSourceFile(),\n                ranges: selectedDocComment,\n                jsDoc: findJsDocForComment(node, selectedDocComment),\n                inheritedFromParentDeclaration,\n            });\n        }\n    }\n\n    return discovered;\n}\n\nexport function discoverComment(\n    symbol: ts.Symbol,\n    kind: ReflectionKind,\n    logger: Logger,\n    commentStyle: CommentStyle,\n    checker: ts.TypeChecker,\n    declarationWarnings: boolean,\n): DiscoveredComment | undefined {\n    const discovered = discoverCommentWorker(\n        symbol,\n        kind,\n        logger,\n        commentStyle,\n        checker,\n        declarationWarnings,\n        wantedKinds[kind],\n    );\n\n    if (discovered) {\n        return discovered;\n    }\n\n    return discoverCommentWorker(\n        symbol,\n        kind,\n        logger,\n        commentStyle,\n        checker,\n        declarationWarnings,\n        backupWantedKinds[kind],\n    );\n}\n\nfunction discoverCommentWorker(\n    symbol: ts.Symbol,\n    kind: ReflectionKind,\n    logger: Logger,\n    commentStyle: CommentStyle,\n    checker: ts.TypeChecker,\n    declarationWarnings: boolean,\n    wanted: ts.SyntaxKind[],\n): DiscoveredComment | undefined {\n    if (wanted.length === 0) {\n        return;\n    }\n\n    // For a module comment, we want the first one defined in the file,\n    // not the last one, since that will apply to the import or declaration.\n    const reverse = !symbol.declarations?.some(ts.isSourceFile);\n\n    const wantedDeclarations = filter(symbol.declarations, (decl) => wanted.includes(decl.kind));\n\n    const commentNodes = wantedDeclarations.flatMap((decl) => declarationToCommentNodes(decl, checker));\n\n    // Special behavior here!\n    // Signatures and symbols have two distinct discovery methods as of TypeDoc 0.26.\n    // This method discovers comments for symbols, and function-likes will only have\n    // a symbol comment if there is more than one signature (== more than one declaration)\n    // and there is a comment on the implementation signature.\n    if (kind & ReflectionKind.ContainsCallSignatures) {\n        const canHaveOverloads = wantedDeclarations.some((node) =>\n            [\n                ts.SyntaxKind.FunctionDeclaration,\n                ts.SyntaxKind.MethodDeclaration,\n                ts.SyntaxKind.Constructor,\n            ].includes(node.kind)\n        );\n\n        const isOverloaded = canHaveOverloads && wantedDeclarations.length > 1;\n\n        if (isOverloaded) {\n            commentNodes.length = 0;\n\n            const implementationNode = wantedDeclarations.find(\n                (node) => (node as ts.FunctionDeclaration).body,\n            );\n            if (implementationNode) {\n                commentNodes.push({\n                    node: implementationNode,\n                    inheritedFromParentDeclaration: false,\n                });\n            }\n        } else if (canHaveOverloads) {\n            // Single signature function, function reflection doesn't get a comment,\n            // the signatures do.\n            commentNodes.length = 0;\n        } else {\n            // Variable declaration which happens to include signatures.\n        }\n    }\n\n    const discovered = checkCommentDeclarations(\n        commentNodes,\n        reverse,\n        commentStyle,\n    );\n\n    switch (discovered.length) {\n        case 0:\n            return undefined;\n        case 1:\n            return discovered[0];\n        default: {\n            if (\n                discovered.filter((n) => !n.inheritedFromParentDeclaration)\n                        .length > 1 &&\n                (declarationWarnings ||\n                    discovered.some((dc) => !dc.file.isDeclarationFile))\n            ) {\n                logger.warn(\n                    i18n.symbol_0_has_multiple_declarations_with_comment(\n                        symbol.name,\n                    ),\n                );\n                const locations = discovered.map(\n                    ({ file, ranges: [{ pos }] }) => {\n                        const path = nicePath(file.fileName);\n                        const line = ts.getLineAndCharacterOfPosition(file, pos).line +\n                            1;\n                        return `${path}:${line}`;\n                    },\n                );\n                logger.info(\n                    i18n.comments_for_0_are_declared_at_1(\n                        symbol.name,\n                        locations.join(\"\\n\\t\"),\n                    ),\n                );\n            }\n            return discovered[0];\n        }\n    }\n}\n\nexport function discoverSignatureComment(\n    declaration: ts.SignatureDeclaration | ts.JSDocSignature,\n    checker: ts.TypeChecker,\n    commentStyle: CommentStyle,\n): DiscoveredComment | undefined {\n    for (\n        const {\n            node,\n            inheritedFromParentDeclaration,\n        } of declarationToCommentNodes(declaration, checker)\n    ) {\n        if (ts.isJSDocSignature(node)) {\n            const comment = node.parent.parent;\n            ok(ts.isJSDoc(comment));\n\n            return {\n                file: node.getSourceFile(),\n                ranges: [\n                    {\n                        kind: ts.SyntaxKind.MultiLineCommentTrivia,\n                        pos: comment.pos,\n                        end: comment.end,\n                    },\n                ],\n                jsDoc: comment,\n                inheritedFromParentDeclaration,\n            };\n        }\n\n        const text = node.getSourceFile().text;\n\n        const comments = collectCommentRanges(\n            ts.getLeadingCommentRanges(text, node.pos),\n        );\n        comments.reverse();\n\n        const comment = comments.find((ranges) => permittedRange(text, ranges, commentStyle));\n        if (comment) {\n            return {\n                file: node.getSourceFile(),\n                ranges: comment,\n                jsDoc: findJsDocForComment(node, comment),\n                inheritedFromParentDeclaration,\n            };\n        }\n    }\n}\n\nfunction findJsDocForComment(\n    node: ts.Node,\n    ranges: ts.CommentRange[],\n): ts.JSDoc | undefined {\n    if (ranges[0].kind === ts.SyntaxKind.MultiLineCommentTrivia) {\n        const jsDocs = ts\n            .getJSDocCommentsAndTags(node)\n            .map((doc) => ts.findAncestor(doc, ts.isJSDoc)!);\n\n        if (ts.isSourceFile(node)) {\n            if (node.statements.length) {\n                jsDocs.push(...node.statements[0].getChildren().filter(ts.isJSDoc));\n            }\n        }\n\n        return jsDocs.find((doc) => doc.pos === ranges[0].pos);\n    }\n}\n\n/**\n * Check whether the given module declaration is the topmost.\n *\n * This function returns TRUE if there is no trailing module defined, in\n * the following example this would be the case only for module `C`.\n *\n * ```\n * module A.B.C { }\n * ```\n *\n * @param node  The module definition that should be tested.\n * @return TRUE if the given node is the topmost module declaration, FALSE otherwise.\n */\nfunction isTopmostModuleDeclaration(node: ts.ModuleDeclaration): boolean {\n    return node.getChildren().some(ts.isModuleBlock);\n}\n\n/**\n * Return the root module declaration of the given module declaration.\n *\n * In the following example this function would always return module\n * `A` no matter which of the modules was passed in.\n *\n * ```\n * module A.B.C { }\n * ```\n */\nfunction getRootModuleDeclaration(node: ts.ModuleDeclaration): ts.Node {\n    while (node.parent.kind === ts.SyntaxKind.ModuleDeclaration) {\n        const parent = node.parent;\n        if (node.name.pos === parent.name.end + 1) {\n            node = parent;\n        } else {\n            break;\n        }\n    }\n\n    return node;\n}\n\nfunction declarationToCommentNodeIgnoringParents(\n    node: ts.Declaration,\n): ts.Node | undefined {\n    // ts.SourceFile is a counterexample\n    if (!node.parent) return node;\n\n    // function foo(x: number)\n    //              ^^^^^^^^^\n    if (node.kind === ts.SyntaxKind.Parameter) {\n        return node;\n    }\n\n    // const abc = 123\n    //       ^^^\n    if (node.parent.kind === ts.SyntaxKind.VariableDeclarationList) {\n        return node.parent.parent;\n    }\n\n    // const a = () => {}\n    //           ^^^^^^^^\n    if (node.parent.kind === ts.SyntaxKind.VariableDeclaration) {\n        return node.parent.parent.parent;\n    }\n\n    // class X { y = () => {} }\n    //               ^^^^^^^^\n    // function Z() {}\n    // Z.method = () => {}\n    //            ^^^^^^^^\n    // export default () => {}\n    //                ^^^^^^^^\n    if (\n        [\n            ts.SyntaxKind.PropertyDeclaration,\n            ts.SyntaxKind.BinaryExpression,\n            ts.SyntaxKind.ExportAssignment,\n        ].includes(node.parent.kind)\n    ) {\n        return node.parent;\n    }\n\n    if (ts.isModuleDeclaration(node)) {\n        if (!isTopmostModuleDeclaration(node)) {\n            return;\n        } else {\n            return getRootModuleDeclaration(node);\n        }\n    }\n\n    if (node.kind === ts.SyntaxKind.ExportSpecifier) {\n        return node.parent.parent;\n    }\n\n    if (ts.SyntaxKind.NamespaceExport === node.kind) {\n        return node.parent;\n    }\n}\n\nfunction declarationToCommentNodes(\n    node: ts.Declaration,\n    checker: ts.TypeChecker,\n): ReadonlyArray<{ node: ts.Node; inheritedFromParentDeclaration: boolean }> {\n    const commentNode = declarationToCommentNodeIgnoringParents(node);\n\n    if (commentNode) {\n        return [\n            {\n                node: commentNode,\n                inheritedFromParentDeclaration: false,\n            },\n        ];\n    }\n\n    const result: { node: ts.Node; inheritedFromParentDeclaration: boolean }[] = [\n        {\n            node,\n            inheritedFromParentDeclaration: false,\n        },\n    ];\n\n    let overloadIndex: number | undefined = undefined;\n    if (ts.isMethodDeclaration(node)) {\n        const symbol = checker.getSymbolAtLocation(node.name || node);\n        if (symbol) {\n            overloadIndex = symbol.declarations\n                ?.filter((d) => d.kind === node.kind)\n                .indexOf(node);\n            ok(overloadIndex !== -1, \"Should always find declaration\");\n        }\n    }\n\n    const seenSymbols = new Set<ts.Symbol>();\n    const bases = findBaseOfDeclaration(checker, node, (symbol) => {\n        if (!seenSymbols.has(symbol)) {\n            seenSymbols.add(symbol);\n            if (overloadIndex === undefined) {\n                return symbol.declarations?.map(\n                    (node) => declarationToCommentNodeIgnoringParents(node) || node,\n                );\n            } else if (symbol.declarations?.[overloadIndex]) {\n                const parentSigNode = symbol.declarations[overloadIndex];\n                return [\n                    declarationToCommentNodeIgnoringParents(parentSigNode) ||\n                    parentSigNode,\n                ];\n            }\n        }\n    });\n\n    for (const parentCommentNode of bases || []) {\n        result.push({\n            node: parentCommentNode,\n            inheritedFromParentDeclaration: true,\n        });\n    }\n\n    // #2999 automatically pick up comments from the value symbol for shorthand assignments\n    if (ts.isShorthandPropertyAssignment(node)) {\n        const sourceSymbol = checker.getShorthandAssignmentValueSymbol(node);\n        if (sourceSymbol?.valueDeclaration) {\n            const commentNode = declarationToCommentNodeIgnoringParents(sourceSymbol.valueDeclaration);\n            if (commentNode) {\n                result.push(\n                    {\n                        node: commentNode,\n                        inheritedFromParentDeclaration: true,\n                    },\n                );\n            }\n        }\n\n        // #3003 even more magic for handling an imported symbol which appears in a shorthand property assignment\n        const originalSymbol = sourceSymbol && resolveAliasedSymbol(sourceSymbol, checker);\n        if (originalSymbol !== sourceSymbol && originalSymbol?.valueDeclaration) {\n            const commentNode = declarationToCommentNodeIgnoringParents(originalSymbol?.valueDeclaration);\n            if (commentNode) {\n                result.push(\n                    {\n                        node: commentNode,\n                        inheritedFromParentDeclaration: true,\n                    },\n                );\n            }\n        }\n    }\n\n    // With overloaded functions/methods, TypeScript will use the comment on the first signature\n    // declaration\n    if (\n        (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) &&\n        node.name\n    ) {\n        const symbol = checker.getSymbolAtLocation(node.name);\n        if (symbol && symbol.declarations![0] !== node) {\n            result.push({\n                node: symbol.declarations![0],\n                inheritedFromParentDeclaration: true,\n            });\n        }\n    }\n\n    return result;\n}\n\n// Lifted from the TS source, with a couple minor modifications\nfunction findBaseOfDeclaration<T>(\n    checker: ts.TypeChecker,\n    declaration: ts.Declaration,\n    cb: (symbol: ts.Symbol) => T[] | undefined,\n): T[] | undefined {\n    const classOrInterfaceDeclaration = declaration.parent?.kind === ts.SyntaxKind.Constructor\n        ? declaration.parent.parent\n        : declaration.parent;\n    if (!classOrInterfaceDeclaration) return;\n\n    const isStaticMember = ts.getCombinedModifierFlags(declaration) & ts.ModifierFlags.Static;\n    return firstDefined(\n        ts.getAllSuperTypeNodes(classOrInterfaceDeclaration),\n        (superTypeNode) => {\n            const baseType = checker.getTypeAtLocation(superTypeNode);\n            const type = isStaticMember && baseType.symbol\n                ? checker.getTypeOfSymbol(baseType.symbol)\n                : baseType;\n            const symbol = checker.getPropertyOfType(\n                type,\n                declaration.symbol!.name,\n            );\n            return symbol ? cb(symbol) : undefined;\n        },\n    );\n}\n\n/**\n * Separate comment ranges into arrays so that multiple line comments are kept together\n * and each block comment is left on its own.\n */\nfunction collectCommentRanges(\n    ranges: ts.CommentRange[] | undefined,\n): ts.CommentRange[][] {\n    const result: ts.CommentRange[][] = [];\n\n    let collect: ts.CommentRange[] = [];\n    for (const range of ranges || []) {\n        collect.push(range);\n\n        switch (range.kind) {\n            case ts.SyntaxKind.MultiLineCommentTrivia:\n                if (collect.length) {\n                    result.push(collect);\n                    collect = [];\n                }\n                result.push([range]);\n                break;\n            case ts.SyntaxKind.SingleLineCommentTrivia:\n                collect.push(range);\n                break;\n            /* istanbul ignore next */\n            default:\n                assertNever(range.kind);\n        }\n    }\n\n    if (collect.length) {\n        result.push(collect);\n    }\n\n    return result;\n}\n\nfunction permittedRange(\n    text: string,\n    ranges: ts.CommentRange[],\n    commentStyle: CommentStyle,\n): boolean {\n    switch (commentStyle) {\n        case CommentStyle.All:\n            return true;\n        case CommentStyle.Block:\n            return ranges[0].kind === ts.SyntaxKind.MultiLineCommentTrivia;\n        case CommentStyle.Line:\n            return ranges[0].kind === ts.SyntaxKind.SingleLineCommentTrivia;\n        case CommentStyle.JSDoc:\n            return (\n                ranges[0].kind === ts.SyntaxKind.MultiLineCommentTrivia &&\n                text[ranges[0].pos] === \"/\" &&\n                text[ranges[0].pos + 1] === \"*\" &&\n                text[ranges[0].pos + 2] === \"*\"\n            );\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/comments/index.ts",
    "content": "import ts from \"typescript\";\nimport { Comment, type CommentDisplayPart, ReflectionKind } from \"../../models/index.js\";\nimport type { CommentStyle, JsDocCompatibility, ValidationOptions } from \"../../utils/options/declaration.js\";\nimport { lexBlockComment } from \"./blockLexer.js\";\nimport {\n    discoverComment,\n    type DiscoveredComment,\n    discoverFileComments,\n    discoverNodeComment,\n    discoverSignatureComment,\n} from \"./discovery.js\";\nimport { lexLineComments } from \"./lineLexer.js\";\nimport { parseComment } from \"./parser.js\";\nimport type { FileRegistry } from \"../../models/FileRegistry.js\";\nimport { assertNever, i18n, Logger, setUnion } from \"#utils\";\nimport type { Context } from \"../context.js\";\n\nexport interface CommentParserConfig {\n    blockTags: Set<string>;\n    inlineTags: Set<string>;\n    modifierTags: Set<string>;\n    preservedTypeAnnotationTags: Set<string>;\n    jsDocCompatibility: JsDocCompatibility;\n    suppressCommentWarningsInDeclarationFiles: boolean;\n    useTsLinkResolution: boolean;\n    commentStyle: CommentStyle;\n    validationOptions: ValidationOptions;\n}\n\nexport interface CommentContext {\n    config: CommentParserConfig;\n    logger: Logger;\n    checker: ts.TypeChecker;\n    files: FileRegistry;\n    createSymbolId: Context[\"createSymbolId\"];\n}\n\nexport interface CommentContextOptionalChecker {\n    config: CommentParserConfig;\n    logger: Logger;\n    checker?: ts.TypeChecker | undefined;\n    files: FileRegistry;\n    createSymbolId: Context[\"createSymbolId\"];\n}\n\nconst jsDocCommentKinds = [\n    ts.SyntaxKind.JSDocPropertyTag,\n    ts.SyntaxKind.JSDocCallbackTag,\n    ts.SyntaxKind.JSDocTypedefTag,\n    ts.SyntaxKind.JSDocTemplateTag,\n    ts.SyntaxKind.JSDocEnumTag,\n];\n\nlet commentDiscoveryId = 0;\nlet commentCache = new WeakMap<ts.SourceFile, Map<number, Comment>>();\n\n// We need to do this for tests so that changing the tsLinkResolution option\n// actually works. Without it, we'd get the old parsed comment which doesn't\n// have the TS symbols attached.\nexport function clearCommentCache() {\n    commentCache = new WeakMap();\n    commentDiscoveryId = 0;\n}\n\nfunction getCommentIgnoringCacheNoDiscoveryId(\n    discovered: DiscoveredComment | undefined,\n    context: CommentContextOptionalChecker,\n) {\n    if (!discovered) return;\n\n    const { file, ranges, jsDoc } = discovered;\n\n    let comment: Comment;\n    switch (ranges[0].kind) {\n        case ts.SyntaxKind.MultiLineCommentTrivia:\n            comment = parseComment(\n                lexBlockComment(\n                    file.text,\n                    ranges[0].pos,\n                    ranges[0].end,\n                    context.createSymbolId,\n                    jsDoc,\n                    context.checker,\n                ),\n                file,\n                context,\n            );\n            break;\n        case ts.SyntaxKind.SingleLineCommentTrivia:\n            comment = parseComment(\n                lexLineComments(file.text, ranges),\n                file,\n                context,\n            );\n            break;\n        default:\n            assertNever(ranges[0].kind);\n    }\n\n    comment.inheritedFromParentDeclaration = discovered.inheritedFromParentDeclaration;\n    return comment;\n}\n\nfunction getCommentWithCache(\n    discovered: DiscoveredComment | undefined,\n    context: CommentContextOptionalChecker,\n) {\n    if (!discovered) return;\n\n    const { file, ranges } = discovered;\n    const cache = commentCache.get(file) || new Map<number, Comment>();\n    if (cache.has(ranges[0].pos)) {\n        const clone = cache.get(ranges[0].pos)!.clone();\n        clone.inheritedFromParentDeclaration = discovered.inheritedFromParentDeclaration;\n        return clone;\n    }\n\n    const comment = getCommentIgnoringCacheNoDiscoveryId(discovered, context);\n    if (!comment) return;\n\n    comment.discoveryId = ++commentDiscoveryId;\n    cache.set(ranges[0].pos, comment);\n    commentCache.set(file, cache);\n\n    return comment.clone();\n}\n\nfunction getCommentImpl(\n    commentSource: DiscoveredComment | undefined,\n    moduleComment: boolean,\n    context: CommentContext,\n) {\n    const comment = getCommentWithCache(\n        commentSource,\n        {\n            ...context,\n            checker: context.config.useTsLinkResolution ? context.checker : undefined,\n        },\n    );\n\n    if (comment?.getTag(\"@import\") || comment?.getTag(\"@license\")) {\n        return;\n    }\n\n    if (moduleComment && comment) {\n        // Module comment, make sure it is tagged with @packageDocumentation or @module.\n        // If it isn't then the comment applies to the first statement in the file, so throw it away.\n        if (\n            !comment.hasModifier(\"@packageDocumentation\") &&\n            !comment.getTag(\"@module\")\n        ) {\n            return;\n        }\n    }\n\n    if (!moduleComment && comment) {\n        // Ensure module comments are not attached to non-module reflections.\n        if (\n            comment.hasModifier(\"@packageDocumentation\") ||\n            comment.getTag(\"@module\")\n        ) {\n            return;\n        }\n    }\n\n    return comment;\n}\n\nexport function getComment(\n    symbol: ts.Symbol,\n    kind: ReflectionKind,\n    context: CommentContext,\n): Comment | undefined {\n    const declarations = symbol.declarations || [];\n\n    if (\n        declarations.length &&\n        declarations.every((d) => jsDocCommentKinds.includes(d.kind))\n    ) {\n        return getJsDocComment(\n            declarations[0] as ts.JSDocPropertyLikeTag,\n            context,\n        );\n    }\n\n    const sf = declarations.find(ts.isSourceFile);\n    if (sf) {\n        return getFileComment(sf, context);\n    }\n\n    const isModule = declarations.some((decl) => {\n        if (ts.isModuleDeclaration(decl) && ts.isStringLiteral(decl.name)) {\n            return true;\n        }\n        return false;\n    });\n\n    const comment = getCommentImpl(\n        discoverComment(\n            symbol,\n            kind,\n            context.logger,\n            context.config.commentStyle,\n            context.checker,\n            !context.config.suppressCommentWarningsInDeclarationFiles,\n        ),\n        isModule,\n        context,\n    );\n\n    if (!comment && kind === ReflectionKind.Property) {\n        return getConstructorParamPropertyComment(\n            symbol,\n            context,\n        );\n    }\n\n    return comment;\n}\n\nexport function getNodeComment(\n    node: ts.Node,\n    moduleComment: boolean,\n    context: CommentContext,\n) {\n    return getCommentImpl(\n        discoverNodeComment(node, context.config.commentStyle),\n        moduleComment,\n        context,\n    );\n}\n\nexport function getFileComment(\n    file: ts.SourceFile,\n    context: CommentContext,\n): Comment | undefined {\n    const quietContext = {\n        ...context,\n        logger: new Logger(),\n    };\n\n    for (\n        const commentSource of discoverFileComments(\n            file,\n            context.config.commentStyle,\n        )\n    ) {\n        // First parse the comment without adding the parse to the cache\n        // and without logging any messages. If we end up not using this as\n        // a file comment we want to avoid parsing it with warnings here as\n        // it might be associated with a JSDoc parse which has special\n        // handling to allow modifier tags to be specified as {@mod}\n        // and if it gets added to the cache here we'll get unwanted warnings\n        const comment = getCommentIgnoringCacheNoDiscoveryId(\n            commentSource,\n            quietContext,\n        );\n\n        if (comment?.getTag(\"@license\") || comment?.getTag(\"@import\")) {\n            continue;\n        }\n\n        if (\n            comment?.getTag(\"@module\") ||\n            comment?.hasModifier(\"@packageDocumentation\")\n        ) {\n            return getCommentWithCache(commentSource, context);\n        }\n        return;\n    }\n}\n\nfunction getConstructorParamPropertyComment(\n    symbol: ts.Symbol,\n    context: CommentContext,\n): Comment | undefined {\n    const decl = symbol.declarations?.find(ts.isParameter);\n    if (!decl) return;\n\n    const ctor = decl.parent;\n    const comment = getSignatureComment(ctor, context);\n\n    const paramTag = comment?.getIdentifiedTag(symbol.name, \"@param\");\n    if (paramTag) {\n        const result = new Comment(paramTag.content);\n        result.sourcePath = comment!.sourcePath;\n        return result;\n    }\n}\n\nexport function getSignatureComment(\n    declaration: ts.SignatureDeclaration | ts.JSDocSignature,\n    context: CommentContext,\n): Comment | undefined {\n    return getCommentImpl(\n        discoverSignatureComment(declaration, context.checker, context.config.commentStyle),\n        false,\n        context,\n    );\n}\n\nfunction buildJsDocCommentFromParts(\n    declaration: ts.Node,\n    parts: readonly CommentDisplayPart[] | undefined,\n    sourceComment: Comment,\n    context: CommentContext,\n) {\n    if (!parts) {\n        return undefined;\n    }\n\n    const comment = new Comment(Comment.cloneDisplayParts(parts));\n    comment.sourcePath = sourceComment.sourcePath;\n\n    for (let i = 0; i < comment.summary.length;) {\n        const part = comment.summary[i];\n\n        if (\n            part.kind === \"inline-tag\" &&\n            !part.text.trim() &&\n            context.config.modifierTags.has(part.tag)\n        ) {\n            comment.modifierTags.add(part.tag);\n            comment.summary.splice(i, 1);\n        } else if (\n            part.kind === \"inline-tag\" &&\n            part.text.trim() &&\n            context.config.modifierTags.has(part.tag) &&\n            !context.config.inlineTags.has(part.tag)\n        ) {\n            context.logger.warn(\n                i18n.inline_tag_0_not_parsed_as_modifier_tag_1(part.tag, part.text.trim()),\n                declaration,\n            );\n            ++i;\n        } else {\n            ++i;\n        }\n    }\n\n    return comment;\n}\n\nexport function getJsDocComment(\n    declaration:\n        | ts.JSDocPropertyLikeTag\n        | ts.JSDocCallbackTag\n        | ts.JSDocTypedefTag\n        | ts.JSDocTemplateTag\n        | ts.JSDocEnumTag,\n    context: CommentContext,\n): Comment | undefined {\n    const file = declaration.getSourceFile();\n\n    // First, get the whole comment. We know we'll need all of it.\n    let parent: ts.Node = declaration.parent;\n    while (!ts.isJSDoc(parent)) {\n        parent = parent.parent;\n    }\n\n    // Build a custom context to allow modifier tags to be written as inline\n    // tags as otherwise there's no way to specify them here #2916 #3050\n    const contextWithInline = {\n        ...context,\n        config: {\n            ...context.config,\n            inlineTags: setUnion(context.config.inlineTags, context.config.modifierTags),\n        },\n    };\n\n    // Then parse it.\n    const comment = getCommentWithCache(\n        {\n            file,\n            ranges: [\n                {\n                    kind: ts.SyntaxKind.MultiLineCommentTrivia,\n                    pos: parent.pos,\n                    end: parent.end,\n                },\n            ],\n            jsDoc: parent,\n            inheritedFromParentDeclaration: false,\n        },\n        contextWithInline,\n    )!;\n\n    // And pull out the tag we actually care about.\n    if (ts.isJSDocEnumTag(declaration)) {\n        return buildJsDocCommentFromParts(declaration, comment.getTag(\"@enum\")?.content, comment, context);\n    }\n\n    if (\n        ts.isJSDocTemplateTag(declaration) &&\n        declaration.comment &&\n        declaration.typeParameters.length > 1\n    ) {\n        // We could just put the same comment on everything, but due to how comment parsing works,\n        // we'd have to search for any @template with a name starting with the first type parameter's name\n        // which feels horribly hacky.\n        context.logger.warn(\n            i18n.multiple_type_parameters_on_template_tag_unsupported(),\n            declaration,\n        );\n        return;\n    }\n\n    let name: string | undefined;\n    if (ts.isJSDocTemplateTag(declaration)) {\n        // This isn't really ideal.\n        name = declaration.typeParameters[0].name.text;\n    } else {\n        name = declaration.name?.getText();\n    }\n\n    if (!name) {\n        return;\n    }\n\n    const tag = comment.getIdentifiedTag(name, `@${declaration.tagName.text}`);\n\n    if (!tag) {\n        // If this is a template tag with multiple declarations, we warned already if there\n        // was a comment attached. If there wasn't, then don't error about failing to find\n        // a tag because this is unsupported.\n        if (!ts.isJSDocTemplateTag(declaration)) {\n            context.logger.error(\n                i18n.failed_to_find_jsdoc_tag_for_name_0(name),\n                declaration,\n            );\n        }\n    } else {\n        return buildJsDocCommentFromParts(declaration, tag.content, comment, context);\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/comments/lexer.ts",
    "content": "import type { ReflectionSymbolId } from \"../../models/index.js\";\n\nexport enum TokenSyntaxKind {\n    Text = \"text\",\n    NewLine = \"new_line\",\n    OpenBrace = \"open_brace\",\n    CloseBrace = \"close_brace\",\n    Tag = \"tag\",\n    Code = \"code\",\n    TypeAnnotation = \"type\",\n}\n\nexport interface Token {\n    kind: TokenSyntaxKind;\n    text: string;\n\n    pos: number;\n\n    // These come from the compiler for use if useTsLinkResolution is on\n    tsLinkTarget?: ReflectionSymbolId;\n    tsLinkText?: string;\n}\n"
  },
  {
    "path": "src/lib/converter/comments/lineLexer.ts",
    "content": "import type ts from \"typescript\";\nimport { type Token, TokenSyntaxKind } from \"./lexer.js\";\n\nexport function* lexLineComments(\n    file: string,\n    ranges: ts.CommentRange[],\n): Generator<Token, undefined, undefined> {\n    // Wrapper around our real lex function to collapse adjacent text tokens.\n    let textToken: Token | undefined;\n    for (\n        const token of lexLineComments2(\n            file,\n            ranges[0].pos,\n            ranges[ranges.length - 1].end,\n        )\n    ) {\n        if (token.kind === TokenSyntaxKind.Text) {\n            if (textToken) {\n                textToken.text += token.text;\n            } else {\n                textToken = token;\n            }\n        } else {\n            if (textToken) {\n                yield textToken;\n                textToken = void 0;\n            }\n            yield token;\n        }\n    }\n\n    if (textToken) {\n        yield textToken;\n    }\n    return;\n}\n\nfunction* lexLineComments2(\n    file: string,\n    pos: number,\n    end: number,\n): Generator<Token, undefined, undefined> {\n    // Trailing whitespace\n    while (pos < end && /\\s/.test(file[end - 1])) {\n        end--;\n    }\n\n    let lineStart = true;\n    let braceStartsType = false;\n\n    for (;;) {\n        if (lineStart) {\n            pos = skipLeadingLineTrivia(pos);\n            lineStart = false;\n        }\n\n        if (pos >= end) {\n            return;\n        }\n\n        switch (file[pos]) {\n            case \"\\n\":\n                yield makeToken(TokenSyntaxKind.NewLine, 1);\n                lineStart = true;\n                break;\n\n            case \"{\":\n                if (braceStartsType && nextNonWs(pos + 1) !== \"@\") {\n                    yield makeToken(\n                        TokenSyntaxKind.TypeAnnotation,\n                        findEndOfType(pos) - pos,\n                    );\n                    braceStartsType = false;\n                } else {\n                    yield makeToken(TokenSyntaxKind.OpenBrace, 1);\n                }\n                break;\n\n            case \"}\":\n                yield makeToken(TokenSyntaxKind.CloseBrace, 1);\n                braceStartsType = false;\n                break;\n\n            case \"`\": {\n                // Markdown's code rules are a royal pain. This could be one of several things.\n                // 1. Inline code: <1-n ticks><text><same number of ticks>\n                // 2. Code block: <3 ticks><language, no ticks>\\n<text>\\n<3 ticks>\\n\n                // 3. Unmatched tick(s), not code, but part of some text.\n                // We don't quite handle #2 correctly yet. PR welcome!\n                braceStartsType = false;\n                let tickCount = 1;\n\n                let lookahead = pos - 1;\n                let atNewline = true;\n                while (lookahead > 0 && file[lookahead] !== \"\\n\") {\n                    if (/\\S/.test(file[lookahead])) {\n                        atNewline = false;\n                        break;\n                    }\n                    --lookahead;\n                }\n                lookahead = pos;\n\n                while (lookahead + 1 < end && file[lookahead + 1] === \"`\") {\n                    tickCount++;\n                    lookahead++;\n                }\n                const isCodeBlock = atNewline && tickCount >= 3;\n                let lookaheadStart = pos;\n                const codeText: string[] = [];\n\n                lookahead++;\n                while (lookahead < end) {\n                    if (lookaheadExactlyNTicks(lookahead, tickCount)) {\n                        lookahead += tickCount;\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        const codeTextStr = codeText.join(\"\");\n                        if (isCodeBlock || !/\\n\\s*\\n/.test(codeTextStr)) {\n                            yield {\n                                kind: TokenSyntaxKind.Code,\n                                text: codeTextStr,\n                                pos,\n                            };\n                            pos = lookahead;\n                        } else {\n                            yield makeToken(TokenSyntaxKind.Text, tickCount);\n                        }\n                        break;\n                    } else if (file[lookahead] === \"`\") {\n                        while (lookahead < end && file[lookahead] === \"`\") {\n                            lookahead++;\n                        }\n                    } else if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        file[lookahead + 1] !== \"\\n\"\n                    ) {\n                        lookahead += 2;\n                    } else if (file[lookahead] === \"\\n\") {\n                        lookahead++;\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        lookahead = skipLeadingLineTrivia(lookahead);\n                        lookaheadStart = lookahead;\n                    } else {\n                        lookahead++;\n                    }\n                }\n\n                if (lookahead >= end && pos !== lookahead) {\n                    if (\n                        tickCount === 3 &&\n                        file.substring(pos, end).includes(\"\\n\")\n                    ) {\n                        codeText.push(file.substring(lookaheadStart, end));\n                        yield {\n                            kind: TokenSyntaxKind.Code,\n                            text: codeText.join(\"\"),\n                            pos,\n                        };\n                        pos = lookahead;\n                    } else {\n                        yield makeToken(TokenSyntaxKind.Text, tickCount);\n                    }\n                }\n\n                break;\n            }\n\n            case \"@\": {\n                let lookahead = pos + 1;\n                while (lookahead < end && /[a-z]/i.test(file[lookahead])) {\n                    lookahead++;\n                }\n\n                if (lookahead !== pos + 1) {\n                    while (\n                        lookahead < end &&\n                        /[a-z0-9-]/i.test(file[lookahead])\n                    ) {\n                        lookahead++;\n                    }\n                }\n\n                if (\n                    lookahead !== pos + 1 &&\n                    (lookahead === end || /[\\s}]/.test(file[lookahead]))\n                ) {\n                    braceStartsType = true;\n                    yield makeToken(TokenSyntaxKind.Tag, lookahead - pos);\n                    break;\n                }\n            }\n            // fall through if we didn't find something that looks like a tag\n\n            default: {\n                const textParts: string[] = [];\n\n                let lookaheadStart = pos;\n                let lookahead = pos;\n                while (lookahead < end) {\n                    if (\"{}\\n`\".includes(file[lookahead])) break;\n\n                    if (\n                        lookahead !== pos &&\n                        file[lookahead] === \"@\" &&\n                        /\\s/.test(file[lookahead - 1])\n                    ) {\n                        // Probably the start of a modifier tag\n                        break;\n                    }\n\n                    if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        \"{}@`\".includes(file[lookahead + 1])\n                    ) {\n                        textParts.push(\n                            file.substring(lookaheadStart, lookahead),\n                            file[lookahead + 1],\n                        );\n                        lookahead++;\n                        lookaheadStart = lookahead + 1;\n                    }\n\n                    lookahead++;\n                }\n\n                textParts.push(file.substring(lookaheadStart, lookahead));\n\n                if (textParts.some((part) => /\\S/.test(part))) {\n                    braceStartsType = false;\n                }\n\n                // This piece of text had line continuations or escaped text\n                yield {\n                    kind: TokenSyntaxKind.Text,\n                    text: textParts.join(\"\"),\n                    pos,\n                };\n                pos = lookahead;\n                break;\n            }\n        }\n    }\n\n    function makeToken(kind: TokenSyntaxKind, size: number): Token {\n        const start = pos;\n        pos += size;\n\n        return {\n            kind,\n            text: file.substring(start, pos),\n            pos: start,\n        };\n    }\n\n    function skipLeadingLineTrivia(pos: number) {\n        let lookahead = pos;\n        while (lookahead < end && /\\s/.test(file[lookahead])) {\n            lookahead++;\n        }\n        while (lookahead < end && file[lookahead] === \"/\") {\n            lookahead++;\n        }\n        if (lookahead < end && file[lookahead] === \" \") {\n            lookahead++;\n        }\n        return lookahead;\n    }\n\n    function lookaheadExactlyNTicks(pos: number, n: number) {\n        if (pos + n > end) {\n            return false;\n        }\n\n        return file.startsWith(\"`\".repeat(n), pos) && file[pos + n] !== \"`\";\n    }\n\n    function findEndOfType(pos: number): number {\n        let openBraces = 0;\n\n        while (pos < end) {\n            if (file[pos] === \"{\") {\n                openBraces++;\n            } else if (file[pos] === \"}\") {\n                if (--openBraces === 0) {\n                    break;\n                }\n            } else if (\"`'\\\"\".includes(file[pos])) {\n                pos = findEndOfString(pos);\n            }\n\n            pos++;\n        }\n\n        if (pos < end && file[pos] === \"}\") {\n            pos++;\n        }\n\n        return pos;\n    }\n\n    function findEndOfString(pos: number): number {\n        const endOfString = file[pos];\n        pos++;\n        while (pos < end) {\n            if (file[pos] === endOfString) {\n                break;\n            } else if (file[pos] === \"\\\\\") {\n                pos++; // Skip escaped character\n            } else if (\n                endOfString === \"`\" &&\n                file[pos] === \"$\" &&\n                file[pos + 1] === \"{\"\n            ) {\n                // Template literal with data inside a ${}\n                while (pos < end && file[pos] !== \"}\") {\n                    if (\"`'\\\"\".includes(file[pos])) {\n                        pos = findEndOfString(pos) + 1;\n                    } else {\n                        pos++;\n                    }\n                }\n            }\n\n            pos++;\n        }\n\n        return pos;\n    }\n\n    function nextNonWs(pos: number): string | undefined {\n        while (pos < end && /\\s/.test(file[pos])) {\n            pos++;\n        }\n        return file[pos];\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/comments/linkResolver.ts",
    "content": "import ts from \"typescript\";\nimport {\n    type CommentDisplayPart,\n    type InlineTagDisplayPart,\n    makeRecursiveVisitor,\n    Reflection,\n    ReflectionKind,\n    ReflectionSymbolId,\n} from \"../../models/index.js\";\nimport { resolveDeclarationReference } from \"./declarationReferenceResolver.js\";\nimport { type DeclarationReference, maxElementByScore, parseDeclarationReference } from \"#utils\";\n\nconst urlPrefix = /^(http|ftp)s?:\\/\\//;\n\nexport type ExternalResolveResult = { target: string; caption?: string };\n\n/**\n * @param ref - Parsed declaration reference to resolve. This may be created automatically for some symbol, or\n *   parsed from user input.\n * @param refl - Reflection that contains the resolved link\n * @param part - If the declaration reference was created from a comment, the originating part.\n * @param symbolId - If the declaration reference was created from a symbol, or `useTsLinkResolution` is turned\n *   on and TypeScript resolved the link to some symbol, the ID of that symbol.\n */\nexport type ExternalSymbolResolver = (\n    ref: DeclarationReference,\n    refl: Reflection,\n    part: Readonly<CommentDisplayPart> | undefined,\n    symbolId: ReflectionSymbolId | undefined,\n) => ExternalResolveResult | string | undefined;\n\nexport type LinkResolverOptions = {\n    preserveLinkText: boolean;\n};\n\nexport function resolveLinks(\n    reflection: Reflection,\n    externalResolver: ExternalSymbolResolver,\n    options: LinkResolverOptions,\n) {\n    if (reflection.comment) {\n        reflection.comment.summary = resolvePartLinks(\n            reflection,\n            reflection.comment.summary,\n            externalResolver,\n            options,\n        );\n        for (const tag of reflection.comment.blockTags) {\n            tag.content = resolvePartLinks(\n                reflection,\n                tag.content,\n                externalResolver,\n                options,\n            );\n        }\n    }\n\n    if ((reflection.isDeclaration() || reflection.isProject()) && reflection.readme) {\n        reflection.readme = resolvePartLinks(\n            reflection,\n            reflection.readme,\n            externalResolver,\n            options,\n        );\n    }\n\n    if (reflection.isDeclaration()) {\n        reflection.type?.visit(\n            makeRecursiveVisitor({\n                union: (type) => {\n                    type.elementSummaries = type.elementSummaries?.map(\n                        (parts) => resolvePartLinks(reflection, parts, externalResolver, options),\n                    );\n                },\n            }),\n        );\n    }\n\n    if (reflection.isDocument()) {\n        reflection.content = resolvePartLinks(\n            reflection,\n            reflection.content,\n            externalResolver,\n            options,\n        );\n    }\n\n    if (\n        reflection.isParameter() &&\n        reflection.type?.type === \"reference\" &&\n        reflection.type.highlightedProperties\n    ) {\n        const resolved = new Map(\n            Array.from(\n                reflection.type.highlightedProperties,\n                ([name, parts]) => {\n                    return [\n                        name,\n                        resolvePartLinks(reflection, parts, externalResolver, options),\n                    ];\n                },\n            ),\n        );\n\n        reflection.type.highlightedProperties = resolved;\n    }\n\n    if (reflection.isContainer()) {\n        if (reflection.groups) {\n            for (const group of reflection.groups) {\n                if (group.description) {\n                    group.description = resolvePartLinks(\n                        reflection,\n                        group.description,\n                        externalResolver,\n                        options,\n                    );\n                }\n\n                if (group.categories) {\n                    for (const cat of group.categories) {\n                        if (cat.description) {\n                            cat.description = resolvePartLinks(reflection, cat.description, externalResolver, options);\n                        }\n                    }\n                }\n            }\n        }\n\n        if (reflection.categories) {\n            for (const cat of reflection.categories) {\n                if (cat.description) {\n                    cat.description = resolvePartLinks(reflection, cat.description, externalResolver, options);\n                }\n            }\n        }\n    }\n}\n\nexport function resolvePartLinks(\n    reflection: Reflection,\n    parts: readonly CommentDisplayPart[],\n    externalResolver: ExternalSymbolResolver,\n    options: LinkResolverOptions,\n): CommentDisplayPart[] {\n    return parts.flatMap((part) => processPart(reflection, part, externalResolver, options));\n}\n\nfunction processPart(\n    reflection: Reflection,\n    part: CommentDisplayPart,\n    externalResolver: ExternalSymbolResolver,\n    options: LinkResolverOptions,\n): CommentDisplayPart | CommentDisplayPart[] {\n    if (part.kind === \"inline-tag\") {\n        if (\n            part.tag === \"@link\" ||\n            part.tag === \"@linkcode\" ||\n            part.tag === \"@linkplain\"\n        ) {\n            return resolveLinkTag(reflection, part, externalResolver, options);\n        }\n    }\n\n    return part;\n}\n\nfunction resolveLinkTag(\n    reflection: Reflection,\n    part: InlineTagDisplayPart,\n    externalResolver: ExternalSymbolResolver,\n    options: LinkResolverOptions,\n): InlineTagDisplayPart {\n    // This tag may have already been resolved to if we are running in packages mode\n    // or when reading in a JSON file. #2680.\n    if (typeof part.target === \"string\" || part.target instanceof Reflection) {\n        return part;\n    }\n\n    let defaultDisplayText = \"\";\n    let pos = 0;\n    const end = part.text.length;\n    while (pos < end && ts.isWhiteSpaceLike(part.text.charCodeAt(pos))) {\n        pos++;\n    }\n\n    let target: Reflection | string | undefined;\n    // Try to parse a declaration reference if we didn't use the TS symbol for resolution\n    const declRef = parseDeclarationReference(part.text, pos, end);\n\n    // Might already know where it should go if useTsLinkResolution is turned on\n    if (part.target instanceof ReflectionSymbolId) {\n        const tsTargets = reflection.project.getReflectionsFromSymbolId(\n            part.target,\n        );\n\n        if (tsTargets.length) {\n            // Find the target most likely to have a real url in the generated documentation\n            // 4. A direct export (class, interface, variable)\n            // 3. A property of a direct export (class/interface property)\n            // 2. A property of a type of an export (property on type alias)\n            // 1. Whatever the first symbol found was\n            target = maxElementByScore(tsTargets, (r) => {\n                if (r.kindOf(ReflectionKind.SomeExport)) {\n                    return 4;\n                }\n                if (\n                    r.kindOf(ReflectionKind.SomeMember) &&\n                    r.parent?.kindOf(ReflectionKind.SomeExport)\n                ) {\n                    return 3;\n                }\n                if (\n                    r.kindOf(ReflectionKind.SomeMember) &&\n                    r.parent?.kindOf(ReflectionKind.TypeLiteral) &&\n                    r.parent.parent?.kindOf(\n                        ReflectionKind.TypeAlias | ReflectionKind.Variable,\n                    )\n                ) {\n                    return 2;\n                }\n\n                return 1;\n            })!;\n            pos = end;\n            defaultDisplayText = part.tsLinkText ||\n                (options.preserveLinkText ? part.text : target.name);\n        } else {\n            // If we didn't find a target, we might be pointing to a symbol in another project that will be merged in\n            // or some external symbol, so ask external resolvers to try resolution. Don't use regular declaration ref\n            // resolution in case it matches something that would have been merged in later.\n            if (declRef) {\n                pos = declRef[1];\n            }\n\n            const externalResolveResult = externalResolver(\n                declRef?.[0] ?? part.target.toDeclarationReference(),\n                reflection,\n                part,\n                part.target,\n            );\n\n            defaultDisplayText = part.tsLinkText ||\n                (options.preserveLinkText\n                    ? part.text\n                    : part.text.substring(0, pos));\n\n            switch (typeof externalResolveResult) {\n                case \"string\":\n                    target = externalResolveResult;\n                    break;\n                case \"object\":\n                    target = externalResolveResult.target;\n                    defaultDisplayText = externalResolveResult.caption || defaultDisplayText;\n            }\n        }\n    }\n\n    if (!target && declRef) {\n        // Got one, great! Try to resolve the link\n        target = resolveDeclarationReference(reflection, declRef[0]);\n        pos = declRef[1];\n\n        if (target) {\n            defaultDisplayText = options.preserveLinkText\n                ? part.text\n                : target.name;\n        } else {\n            // If we didn't find a link, it might be a @link tag to an external symbol, check that next.\n            const externalResolveResult = externalResolver(\n                declRef[0],\n                reflection,\n                part,\n                part.target instanceof ReflectionSymbolId\n                    ? part.target\n                    : undefined,\n            );\n\n            defaultDisplayText = options.preserveLinkText\n                ? part.text\n                : part.text.substring(0, pos);\n\n            switch (typeof externalResolveResult) {\n                case \"string\":\n                    target = externalResolveResult;\n                    break;\n                case \"object\":\n                    target = externalResolveResult.target;\n                    defaultDisplayText = externalResolveResult.caption || defaultDisplayText;\n            }\n        }\n    }\n\n    if (!target && urlPrefix.test(part.text)) {\n        const wsIndex = part.text.search(/\\s/);\n        target = wsIndex === -1 ? part.text : part.text.substring(0, wsIndex);\n        pos = target.length;\n        defaultDisplayText = target;\n    }\n\n    // Remaining text after an optional pipe is the link text, so advance\n    // until that's consumed.\n    while (pos < end && ts.isWhiteSpaceLike(part.text.charCodeAt(pos))) {\n        pos++;\n    }\n    if (pos < end && part.text[pos] === \"|\") {\n        pos++;\n    }\n\n    if (!target) {\n        return part;\n    }\n\n    part.target = target;\n    part.text = part.text.substring(pos).trim() || defaultDisplayText || part.text;\n\n    return part;\n}\n"
  },
  {
    "path": "src/lib/converter/comments/parser.ts",
    "content": "import assert, { ok } from \"assert\";\nimport { parseDocument as parseYamlDoc } from \"yaml\";\nimport type { CommentContextOptionalChecker, CommentParserConfig } from \"./index.js\";\nimport { Comment, type CommentDisplayPart, CommentTag, type InlineTagDisplayPart } from \"../../models/index.js\";\nimport type { MinimalSourceFile, TagString } from \"#utils\";\nimport { nicePath } from \"../../utils/paths.js\";\nimport { type Token, TokenSyntaxKind } from \"./lexer.js\";\nimport { extractTagName } from \"./tagName.js\";\nimport { FileRegistry } from \"../../models/FileRegistry.js\";\nimport { textContent, TextParserReentryState } from \"./textParser.js\";\nimport { hasDeclarationFileExtension } from \"../../utils/fs.js\";\nimport { assertNever, i18n, type Logger, type NormalizedPath, removeIf, type TranslatedString } from \"#utils\";\n\ninterface LookaheadGenerator<T> {\n    done(): boolean;\n    peek(): T;\n    take(): T;\n\n    mark(): void;\n    release(): void;\n}\n\nfunction makeLookaheadGenerator<T>(\n    gen: Generator<T, void>,\n): LookaheadGenerator<T> {\n    let trackHistory = false;\n    const history: IteratorResult<T>[] = [];\n    const next = [gen.next()];\n\n    return {\n        done() {\n            return !!next[0].done;\n        },\n        peek() {\n            ok(!next[0].done);\n            return next[0].value;\n        },\n        take() {\n            const thisItem = next.shift()!;\n            if (trackHistory) {\n                history.push(thisItem);\n            }\n            ok(!thisItem.done);\n            next.push(gen.next());\n            return thisItem.value;\n        },\n        mark() {\n            ok(\n                !trackHistory,\n                \"Can only mark one location for backtracking at a time\",\n            );\n            trackHistory = true;\n        },\n        release() {\n            trackHistory = false;\n            next.unshift(...history);\n            history.length = 0;\n        },\n    };\n}\n\nexport function parseComment(\n    tokens: Generator<Token, undefined, undefined>,\n    file: MinimalSourceFile,\n    context: CommentContextOptionalChecker,\n): Comment {\n    const lexer = makeLookaheadGenerator(tokens);\n    const tok = lexer.done() || lexer.peek();\n\n    const comment = new Comment();\n    comment.sourcePath = file.fileName as NormalizedPath;\n    comment.summary = blockContent(\n        comment,\n        lexer,\n        context.config,\n        warningImpl,\n        validationWarningImpl,\n        context.files,\n    );\n\n    while (!lexer.done()) {\n        comment.blockTags.push(\n            blockTag(comment, lexer, context.config, warningImpl, validationWarningImpl, context.files),\n        );\n    }\n\n    const tok2 = tok as Token;\n\n    postProcessComment(\n        comment,\n        () => `${nicePath(file.fileName)}:${file.getLineAndCharacterOfPosition(tok2.pos).line + 1}`,\n        (message) => context.logger.warn(message),\n    );\n\n    return comment;\n\n    function warningImpl(message: TranslatedString, token: Token) {\n        if (\n            context.config.suppressCommentWarningsInDeclarationFiles &&\n            hasDeclarationFileExtension(file.fileName)\n        ) {\n            return;\n        }\n        context.logger.warn(message, token.pos, file);\n    }\n\n    function validationWarningImpl(message: TranslatedString, token: Token) {\n        if (\n            context.config.suppressCommentWarningsInDeclarationFiles &&\n            hasDeclarationFileExtension(file.fileName)\n        ) {\n            return;\n        }\n        context.logger.validationWarning(message, token.pos, file);\n    }\n}\n\n/**\n * Intended for parsing markdown documents. This only parses code blocks and\n * inline tags outside of code blocks, everything else is text.\n *\n * If you change this, also look at blockContent, as it likely needs similar\n * modifications to ensure parsing is consistent.\n */\nexport function parseCommentString(\n    tokens: Generator<Token, undefined, undefined>,\n    config: CommentParserConfig,\n    file: MinimalSourceFile,\n    logger: Logger,\n    files: FileRegistry,\n) {\n    const suppressWarningsConfig: CommentParserConfig = {\n        ...config,\n        jsDocCompatibility: {\n            defaultTag: true,\n            exampleTag: true,\n            ignoreUnescapedBraces: true,\n            inheritDocTag: true,\n        },\n        suppressCommentWarningsInDeclarationFiles: true,\n    };\n\n    const reentry = new TextParserReentryState();\n    const content: CommentDisplayPart[] = [];\n    const lexer = makeLookaheadGenerator(tokens);\n\n    let atNewLine = false;\n    while (!lexer.done()) {\n        let consume = true;\n        const next = lexer.peek();\n        reentry.checkState(next);\n\n        switch (next.kind) {\n            case TokenSyntaxKind.TypeAnnotation:\n                // Shouldn't have been produced by our lexer\n                assert(false, \"Should be unreachable\");\n                break;\n            case TokenSyntaxKind.NewLine:\n            case TokenSyntaxKind.Text:\n            case TokenSyntaxKind.Tag:\n            case TokenSyntaxKind.CloseBrace:\n                textContent(\n                    {\n                        sourcePath: file.fileName as NormalizedPath,\n                        token: next,\n                        warning: (msg, token) => logger.warn(msg, token.pos, file),\n                        validationWarning: (msg, token) => logger.validationWarning(msg, token.pos, file),\n                        files,\n                        atNewLine,\n                        validationOptions: config.validationOptions,\n                    },\n                    /* out */ content,\n                    reentry,\n                );\n                break;\n\n            case TokenSyntaxKind.Code:\n                content.push({ kind: \"code\", text: next.text });\n                break;\n\n            case TokenSyntaxKind.OpenBrace:\n                inlineTag(\n                    lexer,\n                    content,\n                    suppressWarningsConfig,\n                    (message, token) => logger.warn(message, token.pos, file),\n                );\n                consume = false;\n                break;\n\n            default:\n                assertNever(next.kind);\n        }\n\n        atNewLine = next.kind === TokenSyntaxKind.NewLine;\n        if (consume) {\n            lexer.take();\n        }\n    }\n\n    // Check for frontmatter\n    let frontmatterData: Record<string, unknown> = {};\n    const firstBlock = content.at(0);\n    if (firstBlock?.text.startsWith(\"---\\n\")) {\n        const end = firstBlock.text.indexOf(\"\\n---\\n\");\n        if (end !== -1) {\n            const yamlText = firstBlock.text.slice(\"---\\n\".length, end);\n            firstBlock.text = firstBlock.text\n                .slice(end + \"\\n---\\n\".length)\n                .trimStart();\n\n            const frontmatter = parseYamlDoc(yamlText, { prettyErrors: false });\n            for (const warning of frontmatter.warnings) {\n                // Can't translate issues coming from external library...\n                logger.warn(\n                    warning.message as TranslatedString,\n                    warning.pos[0] + \"---\\n\".length,\n                    file,\n                );\n            }\n            for (const error of frontmatter.errors) {\n                // Can't translate issues coming from external library...\n                logger.error(\n                    error.message as TranslatedString,\n                    error.pos[0] + \"---\\n\".length,\n                    file,\n                );\n            }\n\n            if (frontmatter.errors.length === 0) {\n                const data = frontmatter.toJS();\n                if (typeof data === \"object\") {\n                    frontmatterData = data;\n                } else {\n                    logger.error(\n                        i18n.yaml_frontmatter_not_an_object(),\n                        5,\n                        file,\n                    );\n                }\n            }\n        }\n    }\n\n    return { content, frontmatter: frontmatterData };\n}\n\nconst HAS_USER_IDENTIFIER: TagString[] = [\n    \"@callback\",\n    \"@param\",\n    \"@prop\",\n    \"@property\",\n    \"@template\",\n    \"@typedef\",\n    \"@typeParam\",\n    \"@inheritDoc\",\n];\n\nfunction makeCodeBlock(text: string) {\n    return \"```ts\\n\" + text + \"\\n```\";\n}\n\n/**\n * Loop over comment, produce lint warnings, and set tag names for tags\n * which have them.\n */\nfunction postProcessComment(\n    comment: Comment,\n    getPosition: () => string,\n    warning: (msg: TranslatedString) => void,\n) {\n    for (const tag of comment.blockTags) {\n        if (HAS_USER_IDENTIFIER.includes(tag.tag) && tag.content.length) {\n            const first = tag.content[0];\n            if (first.kind === \"text\") {\n                const { name, newText } = extractTagName(first.text);\n                tag.name = name;\n                if (newText) {\n                    first.text = newText;\n                } else {\n                    // Remove this token, no real text in it.\n                    tag.content.shift();\n                }\n            }\n        }\n\n        if (\n            tag.content.some(\n                (part) => part.kind === \"inline-tag\" && part.tag === \"@inheritDoc\",\n            )\n        ) {\n            warning(\n                i18n.inline_inheritdoc_should_not_appear_in_block_tag_in_comment_at_0(\n                    getPosition(),\n                ),\n            );\n        }\n    }\n\n    const remarks = comment.blockTags.filter((tag) => tag.tag === \"@remarks\");\n    if (remarks.length > 1) {\n        warning(\n            i18n.at_most_one_remarks_tag_expected_in_comment_at_0(\n                getPosition(),\n            ),\n        );\n        removeIf(comment.blockTags, (tag) => remarks.indexOf(tag) > 0);\n    }\n\n    const returns = comment.blockTags.filter((tag) => tag.tag === \"@returns\");\n    if (remarks.length > 1) {\n        warning(\n            i18n.at_most_one_returns_tag_expected_in_comment_at_0(\n                getPosition(),\n            ),\n        );\n        removeIf(comment.blockTags, (tag) => returns.indexOf(tag) > 0);\n    }\n\n    const inheritDoc = comment.blockTags.filter(\n        (tag) => tag.tag === \"@inheritDoc\",\n    );\n    const inlineInheritDoc = comment.summary.filter(\n        (part) => part.kind === \"inline-tag\" && part.tag === \"@inheritDoc\",\n    );\n\n    if (inlineInheritDoc.length + inheritDoc.length > 1) {\n        warning(\n            i18n.at_most_one_inheritdoc_tag_expected_in_comment_at_0(\n                getPosition(),\n            ),\n        );\n        const allInheritTags = [...inlineInheritDoc, ...inheritDoc];\n        removeIf(comment.summary, (part) => allInheritTags.indexOf(part) > 0);\n        removeIf(comment.blockTags, (tag) => allInheritTags.indexOf(tag) > 0);\n    }\n\n    if (\n        (inlineInheritDoc.length || inheritDoc.length) &&\n        comment.summary.some(\n            (part) => part.kind !== \"inline-tag\" && /\\S/.test(part.text),\n        )\n    ) {\n        warning(\n            i18n.content_in_summary_overwritten_by_inheritdoc_in_comment_at_0(\n                getPosition(),\n            ),\n        );\n    }\n\n    if ((inlineInheritDoc.length || inheritDoc.length) && remarks.length) {\n        warning(\n            i18n.content_in_remarks_block_overwritten_by_inheritdoc_in_comment_at_0(\n                getPosition(),\n            ),\n        );\n    }\n    if ((inlineInheritDoc.length || inheritDoc.length) && returns.length) {\n        warning(\n            i18n.content_in_returns_block_overwritten_by_inheritdoc_in_comment_at_0(\n                getPosition(),\n            ),\n        );\n    }\n}\n\nconst aliasedTags = new Map([[\"@return\", \"@returns\"]]);\n\nfunction blockTag(\n    comment: Comment,\n    lexer: LookaheadGenerator<Token>,\n    config: CommentParserConfig,\n    warning: (msg: TranslatedString, token: Token) => void,\n    validationWarning: (msg: TranslatedString, token: Token) => void,\n    files: FileRegistry,\n): CommentTag {\n    const blockTag = lexer.take();\n    ok(\n        blockTag.kind === TokenSyntaxKind.Tag,\n        \"blockTag called not at the start of a block tag.\",\n    ); // blockContent is broken if this fails.\n\n    if (!config.blockTags.has(blockTag.text)) {\n        warning(i18n.unknown_block_tag_0(blockTag.text), blockTag);\n    }\n\n    const tagName = aliasedTags.get(blockTag.text) || blockTag.text;\n\n    let content: CommentDisplayPart[];\n    if (tagName === \"@example\") {\n        return exampleBlock(comment, lexer, config, warning, validationWarning, files);\n    }\n\n    let typeAnnotation: string | undefined;\n    if (\n        !lexer.done() &&\n        config.preservedTypeAnnotationTags.has(tagName)\n    ) {\n        if (lexer.peek().kind === TokenSyntaxKind.Text && /^\\s+$/.test(lexer.peek().text)) {\n            lexer.take();\n        }\n        if (lexer.peek().kind === TokenSyntaxKind.TypeAnnotation) {\n            typeAnnotation = lexer.take().text;\n        }\n    }\n\n    if (\n        [\"@default\", \"@defaultValue\"].includes(tagName) &&\n        config.jsDocCompatibility.defaultTag\n    ) {\n        content = defaultBlockContent(\n            comment,\n            lexer,\n            config,\n            warning,\n            validationWarning,\n            files,\n        );\n    } else {\n        content = blockContent(comment, lexer, config, warning, validationWarning, files);\n    }\n\n    const tag = new CommentTag(tagName as TagString, content);\n    if (typeAnnotation) {\n        tag.typeAnnotation = typeAnnotation;\n    }\n    return tag;\n}\n\n/**\n * The `@default` tag gets a special case because otherwise we will produce many warnings\n * about unescaped/mismatched/missing braces in legacy JSDoc comments\n */\nfunction defaultBlockContent(\n    comment: Comment,\n    lexer: LookaheadGenerator<Token>,\n    config: CommentParserConfig,\n    warning: (msg: TranslatedString, token: Token) => void,\n    validationWarning: (msg: TranslatedString, token: Token) => void,\n    files: FileRegistry,\n): CommentDisplayPart[] {\n    lexer.mark();\n    const tempRegistry = new FileRegistry();\n    const content = blockContent(\n        comment,\n        lexer,\n        config,\n        () => {},\n        () => {},\n        tempRegistry,\n    );\n    const end = lexer.done() || lexer.peek();\n    lexer.release();\n\n    if (\n        content.some(\n            (part) => part.kind === \"code\" || part.kind === \"inline-tag\",\n        )\n    ) {\n        return blockContent(comment, lexer, config, warning, validationWarning, files);\n    }\n\n    const tokens: Token[] = [];\n    while ((lexer.done() || lexer.peek()) !== end) {\n        tokens.push(lexer.take());\n    }\n\n    const blockText = tokens\n        .map((tok) => tok.text)\n        .join(\"\")\n        .trim();\n\n    return [\n        {\n            kind: \"code\",\n            text: makeCodeBlock(blockText),\n        },\n    ];\n}\n\n/**\n * The `@example` tag gets a special case because otherwise we will produce many warnings\n * about unescaped/mismatched/missing braces in legacy JSDoc comments.\n *\n * In TSDoc, we also want to treat the first line of the block as the example name.\n */\nfunction exampleBlock(\n    comment: Comment,\n    lexer: LookaheadGenerator<Token>,\n    config: CommentParserConfig,\n    warning: (msg: TranslatedString, token: Token) => void,\n    validationWarning: (msg: TranslatedString, token: Token) => void,\n    files: FileRegistry,\n): CommentTag {\n    lexer.mark();\n    const tempRegistry = new FileRegistry();\n    const content = blockContent(\n        comment,\n        lexer,\n        config,\n        () => {},\n        () => {},\n        tempRegistry,\n    );\n    const end = lexer.done() || lexer.peek();\n    lexer.release();\n\n    if (\n        !config.jsDocCompatibility.exampleTag ||\n        content.some(\n            (part) => part.kind === \"code\" && part.text.startsWith(\"```\"),\n        )\n    ) {\n        let exampleName = \"\";\n\n        // First line of @example block is the example name.\n        let warnedAboutRichNameContent = false;\n        outer: while ((lexer.done() || lexer.peek()) !== end) {\n            const next = lexer.peek();\n            switch (next.kind) {\n                case TokenSyntaxKind.NewLine:\n                    lexer.take();\n                    break outer;\n                case TokenSyntaxKind.Text: {\n                    const newline = next.text.indexOf(\"\\n\");\n                    if (newline !== -1) {\n                        exampleName += next.text.substring(0, newline);\n                        next.pos += newline + 1;\n                        break outer;\n                    } else {\n                        exampleName += lexer.take().text;\n                    }\n                    break;\n                }\n                case TokenSyntaxKind.Code:\n                case TokenSyntaxKind.Tag:\n                case TokenSyntaxKind.TypeAnnotation:\n                case TokenSyntaxKind.CloseBrace:\n                case TokenSyntaxKind.OpenBrace:\n                    if (!warnedAboutRichNameContent) {\n                        warning(i18n.example_tag_literal_name(), lexer.peek());\n                        warnedAboutRichNameContent = true;\n                    }\n                    exampleName += lexer.take().text;\n                    break;\n                default:\n                    assertNever(next.kind);\n            }\n        }\n\n        const content = blockContent(\n            comment,\n            lexer,\n            config,\n            warning,\n            validationWarning,\n            files,\n        );\n        const tag = new CommentTag(\"@example\", content);\n        if (exampleName.trim()) {\n            tag.name = exampleName.trim();\n        }\n        return tag;\n    }\n\n    const tokens: Token[] = [];\n    while ((lexer.done() || lexer.peek()) !== end) {\n        tokens.push(lexer.take());\n    }\n\n    const blockText = tokens\n        .map((tok) => tok.text)\n        .join(\"\")\n        .trim();\n\n    const caption = blockText.match(/^\\s*<caption>(.*?)<\\/caption>\\s*(\\n|$)/);\n\n    if (caption) {\n        const tag = new CommentTag(\"@example\", [\n            {\n                kind: \"code\",\n                text: makeCodeBlock(blockText.slice(caption[0].length)),\n            },\n        ]);\n        tag.name = caption[1];\n        return tag;\n    } else {\n        return new CommentTag(\"@example\", [\n            {\n                kind: \"code\",\n                text: makeCodeBlock(blockText),\n            },\n        ]);\n    }\n}\n\n/**\n * If you change this, also look at parseCommentString as it\n * likely needs similar modifications to ensure parsing is consistent.\n */\nfunction blockContent(\n    comment: Comment,\n    lexer: LookaheadGenerator<Token>,\n    config: CommentParserConfig,\n    warning: (msg: TranslatedString, token: Token) => void,\n    validationWarning: (msg: TranslatedString, token: Token) => void,\n    files: FileRegistry,\n): CommentDisplayPart[] {\n    const content: CommentDisplayPart[] = [];\n    let atNewLine = true as boolean;\n    const reentry = new TextParserReentryState();\n\n    loop: while (!lexer.done()) {\n        const next = lexer.peek();\n        reentry.checkState(next);\n        let consume = true;\n\n        switch (next.kind) {\n            case TokenSyntaxKind.NewLine:\n                content.push({ kind: \"text\", text: next.text });\n                break;\n\n            case TokenSyntaxKind.Text:\n                textContent(\n                    {\n                        sourcePath: comment.sourcePath!,\n                        token: next,\n                        files,\n                        atNewLine,\n                        warning,\n                        validationWarning,\n                        validationOptions: config.validationOptions,\n                    },\n                    /*out*/ content,\n                    reentry,\n                );\n                break;\n\n            case TokenSyntaxKind.Code:\n                content.push({ kind: \"code\", text: next.text });\n                break;\n\n            case TokenSyntaxKind.Tag:\n                if (next.text === \"@inheritdoc\") {\n                    if (!config.jsDocCompatibility.inheritDocTag) {\n                        warning(\n                            i18n.inheritdoc_tag_properly_capitalized(),\n                            next,\n                        );\n                    }\n                    next.text = \"@inheritDoc\";\n                }\n                if (config.modifierTags.has(next.text)) {\n                    comment.modifierTags.add(next.text as TagString);\n                    break;\n                } else if (!atNewLine && !config.blockTags.has(next.text)) {\n                    // Treat unknown tag as a modifier, but warn about it.\n                    comment.modifierTags.add(next.text as TagString);\n                    warning(\n                        i18n.treating_unrecognized_tag_0_as_modifier(next.text),\n                        next,\n                    );\n                    break;\n                } else {\n                    // Block tag or unknown tag, handled by our caller.\n                    break loop;\n                }\n\n            case TokenSyntaxKind.TypeAnnotation:\n                // We always ignore these. In TS files they are redundant, in JS files\n                // they are required.\n                break;\n\n            case TokenSyntaxKind.CloseBrace:\n                // Unmatched closing brace, generate a warning, and treat it as text.\n                if (!config.jsDocCompatibility.ignoreUnescapedBraces) {\n                    warning(i18n.unmatched_closing_brace(), next);\n                }\n                content.push({ kind: \"text\", text: next.text });\n                break;\n\n            case TokenSyntaxKind.OpenBrace:\n                inlineTag(lexer, content, config, warning);\n                consume = false;\n                break;\n\n            default:\n                assertNever(next.kind);\n        }\n\n        if (consume && lexer.take().kind === TokenSyntaxKind.NewLine) {\n            atNewLine = true;\n        }\n    }\n\n    // Collapse adjacent text parts\n    for (let i = 0; i < content.length - 1 /* inside loop */;) {\n        if (content[i].kind === \"text\" && content[i + 1].kind === \"text\") {\n            content[i].text += content[i + 1].text;\n            content.splice(i + 1, 1);\n        } else {\n            i++;\n        }\n    }\n\n    // Now get rid of extra whitespace, and any empty parts\n    for (let i = 0; i < content.length /* inside loop */;) {\n        if (i === 0 || content[i].kind === \"inline-tag\") {\n            content[i].text = content[i].text.trimStart();\n        }\n        if (i === content.length - 1 || content[i].kind === \"inline-tag\") {\n            content[i].text = content[i].text.trimEnd();\n        }\n\n        if (!content[i].text && content[i].kind === \"text\") {\n            content.splice(i, 1);\n        } else {\n            i++;\n        }\n    }\n\n    return content;\n}\n\nfunction inlineTag(\n    lexer: LookaheadGenerator<Token>,\n    block: CommentDisplayPart[],\n    config: CommentParserConfig,\n    warning: (msg: TranslatedString, token: Token) => void,\n) {\n    const openBrace = lexer.take();\n\n    // Now skip whitespace to grab the tag name.\n    // If the first non-whitespace text after the brace isn't a tag,\n    // then produce a warning and treat what we've consumed as plain text.\n    if (\n        lexer.done() ||\n        ![TokenSyntaxKind.Text, TokenSyntaxKind.Tag].includes(lexer.peek().kind)\n    ) {\n        if (!config.jsDocCompatibility.ignoreUnescapedBraces) {\n            warning(i18n.unescaped_open_brace_without_inline_tag(), openBrace);\n        }\n        block.push({ kind: \"text\", text: openBrace.text });\n        return;\n    }\n\n    let tagName = lexer.take();\n\n    if (\n        lexer.done() ||\n        (tagName.kind === TokenSyntaxKind.Text &&\n            (!/^\\s+$/.test(tagName.text) ||\n                lexer.peek().kind != TokenSyntaxKind.Tag))\n    ) {\n        if (!config.jsDocCompatibility.ignoreUnescapedBraces) {\n            warning(i18n.unescaped_open_brace_without_inline_tag(), openBrace);\n        }\n        block.push({ kind: \"text\", text: openBrace.text + tagName.text });\n        return;\n    }\n\n    if (tagName.kind !== TokenSyntaxKind.Tag) {\n        tagName = lexer.take();\n    }\n\n    if (!config.inlineTags.has(tagName.text)) {\n        warning(i18n.unknown_inline_tag_0(tagName.text), tagName);\n    }\n\n    const content: string[] = [];\n\n    // At this point, we know we have an inline tag. Treat everything following as plain text,\n    // until we get to the closing brace.\n    while (!lexer.done() && lexer.peek().kind !== TokenSyntaxKind.CloseBrace) {\n        const token = lexer.take();\n        if (token.kind === TokenSyntaxKind.OpenBrace) {\n            warning(i18n.open_brace_within_inline_tag(), token);\n        }\n\n        content.push(token.kind === TokenSyntaxKind.NewLine ? \" \" : token.text);\n    }\n\n    if (lexer.done()) {\n        warning(i18n.inline_tag_not_closed(), openBrace);\n    } else {\n        lexer.take(); // Close brace\n    }\n\n    const inlineTag: InlineTagDisplayPart = {\n        kind: \"inline-tag\",\n        tag: tagName.text as TagString,\n        text: content.join(\"\"),\n    };\n    if (tagName.tsLinkTarget) {\n        inlineTag.target = tagName.tsLinkTarget;\n    }\n    // Separated from tsLinkTarget to avoid storing a useless empty string\n    // if TS doesn't have an opinion on what the link text should be.\n    if (tagName.tsLinkText) {\n        inlineTag.tsLinkText = tagName.tsLinkText;\n    }\n    block.push(inlineTag);\n}\n"
  },
  {
    "path": "src/lib/converter/comments/rawLexer.ts",
    "content": "import { type Token, TokenSyntaxKind } from \"./lexer.js\";\n\n/**\n * Note: This lexer intentionally *only* recognizes inline tags and code blocks.\n * This is because it is intended for use on markdown documents, and we shouldn't\n * take some stray `@user` mention within a \"Thanks\" section of someone's changelog\n * as starting a block!\n */\nexport function* lexCommentString(\n    file: string,\n): Generator<Token, undefined, undefined> {\n    // Wrapper around our real lex function to collapse adjacent text tokens.\n    let textToken: Token | undefined;\n    for (const token of lexCommentString2(file)) {\n        if (\n            token.kind === TokenSyntaxKind.Text ||\n            token.kind === TokenSyntaxKind.NewLine\n        ) {\n            if (textToken) {\n                textToken.text += token.text;\n            } else {\n                token.kind = TokenSyntaxKind.Text;\n                textToken = token;\n            }\n        } else {\n            if (textToken) {\n                yield textToken;\n                textToken = void 0;\n            }\n            yield token;\n        }\n    }\n\n    if (textToken) {\n        yield textToken;\n    }\n    return;\n}\n\nfunction* lexCommentString2(\n    file: string,\n): Generator<Token, undefined, undefined> {\n    let pos = 0;\n    let end = file.length;\n\n    // Skip leading whitespace\n    while (pos < end && /\\s/.test(file[pos])) {\n        pos++;\n    }\n\n    // Trailing whitespace\n    while (pos < end && /\\s/.test(file[end - 1])) {\n        end--;\n    }\n\n    let expectingTag = false;\n\n    for (;;) {\n        if (pos >= end) {\n            return;\n        }\n\n        switch (file[pos]) {\n            case \"\\n\":\n                yield makeToken(TokenSyntaxKind.NewLine, 1);\n                expectingTag = false;\n                break;\n\n            case \"{\":\n                yield makeToken(TokenSyntaxKind.OpenBrace, 1);\n                expectingTag = true;\n                break;\n\n            case \"}\":\n                yield makeToken(TokenSyntaxKind.CloseBrace, 1);\n                expectingTag = false;\n                break;\n\n            case \"`\": {\n                // Markdown's code rules are a royal pain. This could be one of several things.\n                // 1. Inline code: <1-n ticks><text without multiple consecutive newlines or ticks at start of line><same number of ticks>\n                // 2. Code block: <newline><3+ ticks><language, no ticks>\\n<text>\\n<3 ticks>\\n\n                // 3. Unmatched tick(s), not code, but part of some text.\n                // We don't quite handle #2 correctly yet. PR welcome!\n                let tickCount = 1;\n\n                let lookahead = pos - 1;\n                let atNewline = true;\n                while (lookahead > 0 && file[lookahead] !== \"\\n\") {\n                    if (/\\S/.test(file[lookahead])) {\n                        atNewline = false;\n                        break;\n                    }\n                    --lookahead;\n                }\n                lookahead = pos;\n\n                while (lookahead + 1 < end && file[lookahead + 1] === \"`\") {\n                    tickCount++;\n                    lookahead++;\n                }\n                const isCodeBlock = atNewline && tickCount >= 3;\n                let lookaheadStart = pos;\n                const codeText: string[] = [];\n\n                lookahead++;\n                while (lookahead < end) {\n                    if (lookaheadExactlyNTicks(lookahead, tickCount)) {\n                        lookahead += tickCount;\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        const codeTextStr = codeText.join(\"\");\n                        if (isCodeBlock || !/\\n\\s*\\n/.test(codeTextStr)) {\n                            yield {\n                                kind: TokenSyntaxKind.Code,\n                                text: codeTextStr,\n                                pos,\n                            };\n                            expectingTag = false;\n                            pos = lookahead;\n                        } else {\n                            yield makeToken(TokenSyntaxKind.Text, tickCount);\n                            expectingTag = false;\n                        }\n                        break;\n                    } else if (file[lookahead] === \"`\") {\n                        while (lookahead < end && file[lookahead] === \"`\") {\n                            lookahead++;\n                        }\n                    } else if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        file[lookahead + 1] !== \"\\n\"\n                    ) {\n                        lookahead += 2;\n                    } else if (file[lookahead] === \"\\n\") {\n                        lookahead++;\n                        codeText.push(\n                            file.substring(lookaheadStart, lookahead),\n                        );\n                        lookaheadStart = lookahead;\n                    } else {\n                        lookahead++;\n                    }\n                }\n\n                if (lookahead >= end && pos !== lookahead) {\n                    if (\n                        isCodeBlock &&\n                        file.substring(pos, end).includes(\"\\n\")\n                    ) {\n                        codeText.push(file.substring(lookaheadStart, end));\n                        yield {\n                            kind: TokenSyntaxKind.Code,\n                            text: codeText.join(\"\"),\n                            pos,\n                        };\n                        expectingTag = false;\n                        pos = lookahead;\n                    } else {\n                        yield makeToken(TokenSyntaxKind.Text, tickCount);\n                        expectingTag = false;\n                    }\n                }\n\n                break;\n            }\n\n            case \"@\": {\n                let lookahead = pos + 1;\n                while (lookahead < end && /[a-z]/i.test(file[lookahead])) {\n                    lookahead++;\n                }\n\n                if (lookahead !== pos + 1) {\n                    while (\n                        lookahead < end &&\n                        /[a-z0-9-]/i.test(file[lookahead])\n                    ) {\n                        lookahead++;\n                    }\n                }\n\n                if (\n                    expectingTag &&\n                    lookahead !== pos + 1 &&\n                    (lookahead === end || /[\\s}]/.test(file[lookahead]))\n                ) {\n                    yield makeToken(TokenSyntaxKind.Tag, lookahead - pos);\n                    break;\n                }\n            }\n            // fall through if we didn't find something that looks like a tag\n\n            default: {\n                const textParts: string[] = [];\n\n                let lookaheadStart = pos;\n                let lookahead = pos;\n                while (lookahead < end) {\n                    if (\"{}\\n`\".includes(file[lookahead])) break;\n\n                    if (\n                        lookahead !== pos &&\n                        file[lookahead] === \"@\" &&\n                        /\\s/.test(file[lookahead - 1])\n                    ) {\n                        // Probably the start of a modifier tag\n                        break;\n                    }\n\n                    if (\n                        file[lookahead] === \"\\\\\" &&\n                        lookahead + 1 < end &&\n                        \"{}@`\".includes(file[lookahead + 1])\n                    ) {\n                        textParts.push(\n                            file.substring(lookaheadStart, lookahead),\n                            file[lookahead + 1],\n                        );\n                        lookahead++;\n                        lookaheadStart = lookahead + 1;\n                    }\n\n                    lookahead++;\n                }\n\n                textParts.push(file.substring(lookaheadStart, lookahead));\n\n                if (textParts.some((part) => /\\S/.test(part))) {\n                    expectingTag = false;\n                }\n\n                // This piece of text had line continuations or escaped text\n                yield {\n                    kind: TokenSyntaxKind.Text,\n                    text: textParts.join(\"\"),\n                    pos,\n                };\n                pos = lookahead;\n                break;\n            }\n        }\n    }\n\n    function makeToken(kind: TokenSyntaxKind, size: number): Token {\n        const start = pos;\n        pos += size;\n\n        return {\n            kind,\n            text: file.substring(start, pos),\n            pos: start,\n        };\n    }\n\n    function lookaheadExactlyNTicks(pos: number, n: number) {\n        if (pos + n > end) {\n            return false;\n        }\n\n        return file.startsWith(\"`\".repeat(n), pos) && file[pos + n] !== \"`\";\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/comments/tagName.ts",
    "content": "/**\n * Determines the name of the parameter/template/property from the tag content\n * when processing `@param x`\n */\nexport function extractTagName(text: string): {\n    name: string;\n    newText: string;\n} {\n    let pos = skipWs(text, 0);\n\n    // Extract the \"name\" part of the comment, this might also include a default\n    // value if bracketed.\n    let nameStart = pos;\n    let bracketDepth = 0;\n    let stringChar = \"\";\n    while (pos < text.length && (bracketDepth > 0 || /\\S/.test(text[pos]))) {\n        if (stringChar) {\n            if (text[pos] == stringChar) {\n                stringChar = \"\";\n                ++pos;\n            } else if (text[pos] == \"\\\\\") {\n                pos += 2;\n            } else {\n                ++pos;\n            }\n        } else {\n            if (\"\\\"'`\".includes(text[pos])) {\n                stringChar = text[pos];\n            } else if (text[pos] == \"[\") {\n                ++bracketDepth;\n            } else if (text[pos] == \"]\") {\n                --bracketDepth;\n            }\n            ++pos;\n        }\n    }\n\n    let nameEnd = pos;\n    if (text[nameStart] === \"[\") {\n        nameStart = skipWs(text, nameStart + 1);\n        nameEnd = skipWith(text, nameStart, /[^\\s=\\]]/);\n    }\n\n    // Skip any whitespace & an optional dash before the description\n    pos = skipWith(text, pos, /[\\s-]/);\n\n    return {\n        name: text.substring(nameStart, nameEnd),\n        newText: text.substring(pos),\n    };\n}\n\nfunction skipWs(text: string, pos: number) {\n    return skipWith(text, pos, /\\s/);\n}\n\nfunction skipWith(text: string, pos: number, reg: RegExp) {\n    while (pos < text.length && reg.test(text[pos])) {\n        ++pos;\n    }\n    return pos;\n}\n"
  },
  {
    "path": "src/lib/converter/comments/textParser.ts",
    "content": "/**\n * Parser to handle plain text markdown.\n *\n * Responsible for recognizing relative paths within the text and turning\n * them into references.\n * @module\n */\nimport { i18n } from \"#utils\";\nimport type { CommentDisplayPart, RelativeLinkDisplayPart } from \"../../models/index.js\";\nimport type { FileId, FileRegistry } from \"../../models/FileRegistry.js\";\nimport { HtmlAttributeParser, ParserState, type ValidationOptions } from \"#node-utils\";\nimport { type Token, TokenSyntaxKind } from \"./lexer.js\";\n\nimport MarkdownIt from \"markdown-it\";\nimport type { NormalizedPath, TranslatedString } from \"#utils\";\nconst MdHelpers = new MarkdownIt().helpers;\n\ninterface TextParserData {\n    sourcePath: NormalizedPath;\n    token: Token;\n    pos: number; // relative to Token\n    warning: (msg: TranslatedString, token: Token) => void;\n    validationWarning: (msg: TranslatedString, token: Token) => void;\n    files: FileRegistry;\n    atNewLine: boolean;\n\n    validationOptions: ValidationOptions;\n}\n\ninterface RelativeLink {\n    pos: number;\n    end: number;\n    /** May be undefined if the registry can't find this file */\n    target: FileId | undefined;\n    targetAnchor: string | undefined;\n}\n\n/**\n * This is incredibly unfortunate. The comment lexer owns the responsibility\n * for splitting up text into text/code, this is totally fine for HTML links\n * but for markdown links, ``[`code`](./link)`` is valid, so we need to keep\n * track of state across calls to {@link textContent}.\n */\nexport class TextParserReentryState {\n    withinLinkLabel = false;\n    withinLinkDest = false;\n    private lastPartWasNewline = false;\n\n    checkState(token: Token) {\n        switch (token.kind) {\n            case TokenSyntaxKind.Code:\n                if (/\\n\\s*\\n/.test(token.text)) {\n                    this.withinLinkLabel = false;\n                    this.withinLinkDest = false;\n                }\n                break;\n            case TokenSyntaxKind.NewLine:\n                if (this.lastPartWasNewline) {\n                    this.withinLinkLabel = false;\n                    this.withinLinkDest = false;\n                }\n                break;\n        }\n\n        this.lastPartWasNewline = token.kind === TokenSyntaxKind.NewLine;\n    }\n}\n\n/**\n * Look for relative links within a piece of text and add them to the {@link FileRegistry}\n * so that they can be correctly resolved during rendering.\n */\nexport function textContent(\n    parserData: Omit<TextParserData, \"pos\">,\n    outContent: CommentDisplayPart[],\n    reentry: TextParserReentryState,\n) {\n    let lastPartEnd = 0;\n    let canEndMarkdownLink = true;\n    const data: TextParserData = {\n        ...parserData,\n        pos: 0, // relative to the token\n    };\n\n    function addRef(ref: RelativeLink) {\n        canEndMarkdownLink = true;\n        outContent.push({\n            kind: \"text\",\n            text: data.token.text.slice(lastPartEnd, ref.pos),\n        });\n        const link: RelativeLinkDisplayPart = {\n            kind: \"relative-link\",\n            text: data.token.text.slice(ref.pos, ref.end),\n            target: ref.target,\n            targetAnchor: ref.targetAnchor,\n        };\n        outContent.push(link);\n        lastPartEnd = ref.end;\n        data.pos = ref.end;\n        if (!ref.target && data.validationOptions.invalidPath) {\n            data.validationWarning(\n                i18n.relative_path_0_is_not_a_file_and_will_not_be_copied_to_output(\n                    data.token.text.slice(ref.pos, ref.end),\n                ),\n                {\n                    kind: TokenSyntaxKind.Text,\n                    // ref.pos is relative to the token, but this pos is relative to the file.\n                    pos: data.token.pos + ref.pos,\n                    text: data.token.text.slice(ref.pos, ref.end),\n                },\n            );\n        }\n    }\n\n    while (data.pos < data.token.text.length) {\n        if (canEndMarkdownLink) {\n            const link = checkMarkdownLink(data, reentry);\n            if (link) {\n                addRef(link);\n                continue;\n            }\n            // If we're within a Markdown link, then `checkMarkdownLink`\n            // already scanned `token` up to a line feed (if any).\n            canEndMarkdownLink = !reentry.withinLinkLabel && !reentry.withinLinkDest;\n        }\n\n        const reference = checkReference(data);\n        if (reference) {\n            addRef(reference);\n            continue;\n        }\n\n        const tagLinks = checkTagLink(data);\n        if (tagLinks.length) {\n            for (const tagLink of tagLinks) {\n                addRef(tagLink);\n            }\n            continue;\n        }\n\n        const atNewLine = data.token.text[data.pos] === \"\\n\";\n        data.atNewLine = atNewLine;\n        if (atNewLine && !reentry.withinLinkDest) canEndMarkdownLink = true;\n        ++data.pos;\n    }\n\n    if (lastPartEnd !== data.token.text.length) {\n        outContent.push({ kind: \"text\", text: data.token.text.slice(lastPartEnd) });\n    }\n}\n\n/**\n * Links are inline text with the form `[ text ]( url title )`.\n *\n * Images are just links with a leading `!` and lack of support for `[ref]` referring to a path\n * defined elsewhere, we don't care about that distinction here as we'll only replace the path\n * piece of the image.\n *\n * Reference: https://github.com/markdown-it/markdown-it/blob/14.1.0/lib/rules_inline/link.mjs\n * Reference: https://github.com/markdown-it/markdown-it/blob/14.1.0/lib/rules_inline/image.mjs\n */\nfunction checkMarkdownLink(\n    data: TextParserData,\n    reentry: TextParserReentryState,\n): RelativeLink | undefined {\n    const { token, sourcePath, files } = data;\n\n    let searchStart: number;\n    if (reentry.withinLinkLabel || reentry.withinLinkDest) {\n        searchStart = data.pos;\n    } else if (token.text[data.pos] === \"[\") {\n        searchStart = data.pos + 1;\n    } else {\n        return;\n    }\n\n    if (!reentry.withinLinkDest) {\n        const labelEnd = findLabelEnd(token.text, searchStart);\n        if (labelEnd === -1 || token.text[labelEnd] === \"\\n\") {\n            // This markdown link might be split across multiple lines or input tokens\n            //     [prefix `code` suffix](target)\n            //     ........^^^^^^................\n            // Unless we encounter two consecutive line feeds, expect it to keep going.\n            reentry.withinLinkLabel = labelEnd !== data.pos || !data.atNewLine;\n            return;\n        }\n        reentry.withinLinkLabel = false;\n        if (!token.text.startsWith(\"](\", labelEnd)) return;\n        searchStart = labelEnd + 2;\n    }\n\n    // Skip whitespace (including line breaks) between \"](\" and the link destination.\n    // https://spec.commonmark.org/0.31.2/#links\n    const end = token.text.length;\n    let lookahead = searchStart;\n    for (let newlines = 0;; ++lookahead) {\n        if (lookahead === end) {\n            reentry.withinLinkDest = true;\n            return;\n        }\n        switch (token.text[lookahead]) {\n            case \"\\n\":\n                if (++newlines === 2) {\n                    reentry.withinLinkDest = false;\n                    return;\n                }\n                continue;\n            case \" \":\n            case \"\\t\":\n                continue;\n        }\n        break;\n    }\n    reentry.withinLinkDest = false;\n\n    const link = MdHelpers.parseLinkDestination(token.text, lookahead, end);\n    if (link.ok) {\n        // Only make a relative-link display part if it's actually a relative link.\n        // Discard protocol:// links, unix style absolute paths, and windows style absolute paths.\n        const decoded = decodeURI(link.str);\n        if (isRelativePath(decoded)) {\n            const { target, anchor } = files.register(\n                sourcePath,\n                decoded as NormalizedPath,\n            ) || { target: undefined, anchor: undefined };\n            return {\n                pos: lookahead,\n                end: link.pos,\n                target,\n                targetAnchor: anchor,\n            };\n        }\n\n        // This was a link, skip ahead to ensure we don't happen to parse\n        // something else as a link within the link.\n        data.pos = link.pos - 1;\n    }\n}\n\n/**\n * Reference definitions are blocks with the form `[label]: link title`\n * Reference: https://github.com/markdown-it/markdown-it/blob/14.1.0/lib/rules_block/reference.mjs\n *\n * Note: This may include false positives where TypeDoc recognizes a reference block that markdown\n * does not if users start lines with something that looks like a reference block without fully\n * separating it from an above paragraph. For a first cut, this is good enough.\n */\nfunction checkReference(data: TextParserData): RelativeLink | undefined {\n    const { atNewLine, pos, token, files, sourcePath } = data;\n\n    if (atNewLine) {\n        let lookahead = pos;\n        while (/[ \\t]/.test(token.text[lookahead])) {\n            ++lookahead;\n        }\n        // #2991, we check that this reference also doesn't look like a footnote reference\n        // as it is unlikely that someone uses that syntax without intending for footnote behavior.\n        // This introduces a problem if someone has an [^ref] and doesn't intend for that to\n        // be interpreted as a footnote, but as a reference, but we can't have it both ways,\n        // and having people rename their reference to not be confused with a footnote isn't a\n        // horrible workaround.\n        if (token.text[lookahead] === \"[\" && token.text[lookahead + 1] !== \"^\") {\n            while (\n                lookahead < token.text.length &&\n                /[^\\n\\]]/.test(token.text[lookahead])\n            ) {\n                ++lookahead;\n            }\n            if (token.text.startsWith(\"]:\", lookahead)) {\n                lookahead += 2;\n                while (/[ \\t]/.test(token.text[lookahead])) {\n                    ++lookahead;\n                }\n\n                const link = MdHelpers.parseLinkDestination(\n                    token.text,\n                    lookahead,\n                    token.text.length,\n                );\n\n                if (link.ok) {\n                    const decoded = decodeURI(link.str);\n                    if (isRelativePath(decoded)) {\n                        const { target, anchor } = files.register(\n                            sourcePath,\n                            decoded as NormalizedPath,\n                        ) || { target: undefined, anchor: undefined };\n                        return {\n                            pos: lookahead,\n                            end: link.pos,\n                            target,\n                            targetAnchor: anchor,\n                        };\n                    }\n\n                    data.pos = link.pos - 1;\n                }\n            }\n        }\n    }\n}\n\n/**\n * Looks for `<a href=\"./relative\">`, `<img src=\"./relative\">`, and `<source srcset=\"./relative\">`\n */\nfunction checkTagLink(data: TextParserData): RelativeLink[] {\n    const { pos, token } = data;\n\n    if (token.text.startsWith(\"<img \", pos)) {\n        data.pos += 4;\n        return checkAttributes(data, {\n            src: checkAttributeDirectPath,\n            srcset: checkAttributeSrcSet,\n        });\n    }\n\n    if (token.text.startsWith(\"<link \", pos)) {\n        data.pos += 4;\n        return checkAttributes(data, {\n            // cspell:words imagesrcset\n            imagesrcset: checkAttributeSrcSet,\n        });\n    }\n\n    if (token.text.startsWith(\"<a \", pos)) {\n        data.pos += 3;\n        return checkAttributes(data, { href: checkAttributeDirectPath });\n    }\n\n    if (token.text.startsWith(\"<source \", pos)) {\n        data.pos += 8;\n        return checkAttributes(data, {\n            src: checkAttributeDirectPath,\n            srcset: checkAttributeSrcSet,\n        });\n    }\n\n    return [];\n}\n\nfunction checkAttributes(\n    data: TextParserData,\n    attributes: Record<\n        string,\n        (data: TextParserData, text: string, pos: number, end: number) => RelativeLink[]\n    >,\n): RelativeLink[] {\n    const links: RelativeLink[] = [];\n    const parser = new HtmlAttributeParser(data.token.text, data.pos);\n    while (parser.state !== ParserState.END) {\n        if (\n            parser.state === ParserState.BeforeAttributeValue &&\n            Object.prototype.hasOwnProperty.call(attributes, parser.currentAttributeName)\n        ) {\n            parser.step();\n\n            links.push(...attributes[parser.currentAttributeName](\n                data,\n                parser.currentAttributeValue,\n                parser.currentAttributeValueStart,\n                parser.currentAttributeValueEnd,\n            ));\n        }\n\n        parser.step();\n    }\n\n    return links;\n}\n\nfunction checkAttributeDirectPath(\n    data: TextParserData,\n    text: string,\n    pos: number,\n    end: number,\n): RelativeLink[] {\n    const decoded = decodeURI(text.trim());\n    if (isRelativePath(decoded)) {\n        const { target, anchor } = data.files.register(\n            data.sourcePath,\n            decoded as NormalizedPath,\n        ) || { target: undefined, anchor: undefined };\n        return [{\n            pos,\n            end,\n            target,\n            targetAnchor: anchor,\n        }];\n    }\n\n    return [];\n}\n\n// See https://html.spec.whatwg.org/multipage/images.html#srcset-attribute\nfunction checkAttributeSrcSet(data: TextParserData, text: string, pos: number, _end: number): RelativeLink[] {\n    const result: RelativeLink[] = [];\n\n    let textPos = 0;\n    parseImageCandidate();\n    while (textPos < text.length && text[textPos] == \",\") {\n        ++textPos;\n        parseImageCandidate();\n    }\n\n    return result;\n\n    function parseImageCandidate() {\n        // 1. Zero or more ASCII whitespace\n        while (textPos < text.length && /[\\t\\r\\f\\n ]/.test(text[textPos])) ++textPos;\n        // 2. A valid non-empty URL that does not start or end with a comma\n        // TypeDoc: We don't exactly match this, PR welcome! For now, just permit anything\n        // that's not whitespace or a comma\n        const url = text.slice(textPos).match(/^[^\\t\\r\\f\\n ,]+/);\n        const decoded = url && decodeURI(url[0]);\n\n        if (decoded && isRelativePath(decoded)) {\n            const { target, anchor } = data.files.register(\n                data.sourcePath,\n                decoded as NormalizedPath,\n            ) || { target: undefined, anchor: undefined };\n            result.push({\n                pos: pos + textPos,\n                end: pos + textPos + url[0].length,\n                target,\n                targetAnchor: anchor,\n            });\n        }\n        textPos += url ? url[0].length : 0;\n\n        // 3. Zero or more ASCII whitespace\n        while (textPos < text.length && /[\\t\\r\\f\\n ]/.test(text[textPos])) ++textPos;\n\n        // 4. Zero or one of the following:\n        {\n            // A width descriptor, consisting of: ASCII whitespace, a valid non-negative integer giving\n            // a number greater than zero representing the width descriptor value, and a U+0077 LATIN\n            // SMALL LETTER W character.\n            const w = text.slice(textPos).match(/^\\+?\\d+\\s*w/);\n            textPos += w ? w[0].length : 0;\n\n            // A pixel density descriptor, consisting of: ASCII whitespace, a valid floating-point number\n            // giving a number greater than zero representing the pixel density descriptor value, and a\n            // U+0078 LATIN SMALL LETTER X character.\n            if (!w) {\n                const x = text.slice(textPos).match(/^\\+?\\d+(\\.\\d+)?([eE][+-]\\d+)?\\s*x/);\n                textPos += x ? x[0].length : 0;\n            }\n        }\n\n        // 5. Zero or more ASCII whitespace\n        while (textPos < text.length && /[\\t\\r\\f\\n ]/.test(text[textPos])) ++textPos;\n    }\n}\n\nfunction isRelativePath(link: string) {\n    // Lots of edge cases encoded right here!\n    // Originally, this attempted to match protocol://, but...\n    // `mailto:example@example.com` is not a relative path\n    // `C:\\foo` is not a relative path\n    // `/etc/passwd` is not a relative path\n    // `#anchor` is not a relative path\n    return !/^[a-z]+:|^\\/|^#/i.test(link);\n}\n\nfunction findLabelEnd(text: string, pos: number) {\n    while (pos < text.length) {\n        switch (text[pos]) {\n            case \"\\\\\":\n                ++pos;\n                if (pos < text.length && text[pos] === \"\\n\") return pos;\n                break;\n            case \"\\n\":\n            case \"]\":\n            case \"[\":\n                return pos;\n        }\n        ++pos;\n    }\n\n    return -1;\n}\n"
  },
  {
    "path": "src/lib/converter/components.ts",
    "content": "import { AbstractComponent } from \"../utils/component.js\";\nimport type { Converter } from \"./converter.js\";\n\nexport abstract class ConverterComponent extends AbstractComponent<\n    Converter,\n    {}\n> {}\n"
  },
  {
    "path": "src/lib/converter/context.ts",
    "content": "import { ok as assert } from \"assert\";\nimport ts from \"typescript\";\n\nimport {\n    Comment,\n    ContainerReflection,\n    DeclarationReflection,\n    type DocumentReflection,\n    type ProjectReflection,\n    ReferenceType,\n    type Reflection,\n    ReflectionFlag,\n    ReflectionKind,\n} from \"../models/index.js\";\n\nimport type { Converter } from \"./converter.js\";\nimport { isNamedNode } from \"./utils/nodes.js\";\nimport { ConverterEvents } from \"./converter-events.js\";\nimport { resolveAliasedSymbol } from \"./utils/symbols.js\";\nimport {\n    type CommentContext,\n    getComment,\n    getFileComment,\n    getJsDocComment,\n    getNodeComment,\n    getSignatureComment,\n} from \"./comments/index.js\";\nimport { getHumanName, getQualifiedName } from \"../utils/tsutils.js\";\nimport { findPackageForPath, normalizePath } from \"#node-utils\";\nimport { createSymbolIdImpl } from \"./factories/symbol-id.js\";\nimport { type NormalizedPath, removeIf } from \"#utils\";\n\n/**\n * The context describes the current state the converter is in.\n */\nexport class Context {\n    /**\n     * The converter instance that has created the context.\n     */\n    readonly converter: Converter;\n\n    /**\n     * The TypeChecker instance returned by the TypeScript compiler.\n     */\n    get checker(): ts.TypeChecker {\n        return this.program.getTypeChecker();\n    }\n\n    /**\n     * The program currently being converted.\n     * Accessing this property will throw if a source file is not currently being converted.\n     */\n    get program(): ts.Program {\n        assert(\n            this._program,\n            \"Tried to access Context.program when not converting a source file\",\n        );\n        return this._program;\n    }\n    private _program?: ts.Program;\n\n    /**\n     * All programs being converted.\n     */\n    readonly programs: readonly ts.Program[];\n\n    /**\n     * The project that is currently processed.\n     */\n    readonly project: ProjectReflection;\n\n    /**\n     * The scope or parent reflection that is currently processed.\n     */\n    readonly scope: Reflection;\n\n    convertingTypeNode = false; // Inherited by withScope\n    convertingClassOrInterface = false; // Not inherited\n    shouldBeStatic = false; // Not inherited\n    inlineType = new Set<string>(); // Inherited by withScope\n    preventInline = new Set<string>(); // Inherited by withScope\n\n    private reflectionIdToSymbolMap = new Map<number, ts.Symbol>();\n\n    /**\n     * Create a new Context instance.\n     *\n     * @param converter  The converter instance that has created the context.\n     * @internal\n     */\n    constructor(\n        converter: Converter,\n        programs: readonly ts.Program[],\n        project: ProjectReflection,\n        scope: Reflection = project,\n    ) {\n        this.converter = converter;\n        this.programs = programs;\n\n        this.project = project;\n        this.scope = scope;\n    }\n\n    /** @internal */\n    get logger() {\n        return this.converter.application.logger;\n    }\n\n    /**\n     * Return the type declaration of the given node.\n     *\n     * @param node  The TypeScript node whose type should be resolved.\n     * @returns The type declaration of the given node.\n     */\n    getTypeAtLocation(node: ts.Node): ts.Type | undefined {\n        let nodeType: ts.Type | undefined;\n        try {\n            nodeType = this.checker.getTypeAtLocation(node);\n        } catch {\n            // ignore\n        }\n        if (!nodeType) {\n            if (node.symbol) {\n                nodeType = this.checker.getDeclaredTypeOfSymbol(node.symbol);\n                // The TS types lie due to ts.SourceFile\n            } else if (node.parent?.symbol) {\n                nodeType = this.checker.getDeclaredTypeOfSymbol(\n                    node.parent.symbol,\n                );\n                // The TS types lie due to ts.SourceFile\n            } else if (node.parent?.parent?.symbol) {\n                nodeType = this.checker.getDeclaredTypeOfSymbol(\n                    node.parent.parent.symbol,\n                );\n            }\n        }\n        return nodeType;\n    }\n\n    getSymbolAtLocation(node: ts.Node): ts.Symbol | undefined {\n        let symbol = this.checker.getSymbolAtLocation(node);\n        if (!symbol && isNamedNode(node)) {\n            symbol = this.checker.getSymbolAtLocation(node.name);\n        }\n        return symbol;\n    }\n\n    expectSymbolAtLocation(node: ts.Node): ts.Symbol {\n        const symbol = this.getSymbolAtLocation(node);\n        if (!symbol) {\n            const { line } = ts.getLineAndCharacterOfPosition(\n                node.getSourceFile(),\n                node.pos,\n            );\n            throw new Error(\n                `Expected a symbol for node with kind ${ts.SyntaxKind[node.kind]} at ${node.getSourceFile().fileName}:${\n                    line + 1\n                }`,\n            );\n        }\n        return symbol;\n    }\n\n    resolveAliasedSymbol(symbol: ts.Symbol): ts.Symbol {\n        return resolveAliasedSymbol(symbol, this.checker);\n    }\n\n    createDeclarationReflection(\n        kind: ReflectionKind,\n        symbol: ts.Symbol | undefined,\n        exportSymbol: ts.Symbol | undefined,\n        // We need this because modules don't always have symbols.\n        nameOverride?: string,\n    ) {\n        const name = getHumanName(\n            nameOverride ?? exportSymbol?.name ?? symbol?.name ?? \"unknown\",\n        );\n\n        if (this.convertingClassOrInterface) {\n            if (kind === ReflectionKind.Function) {\n                kind = ReflectionKind.Method;\n            }\n            if (kind === ReflectionKind.Variable) {\n                kind = ReflectionKind.Property;\n            }\n        }\n\n        const reflection = new DeclarationReflection(name, kind, this.scope);\n        this.postReflectionCreation(reflection, symbol, exportSymbol);\n\n        return reflection;\n    }\n\n    postReflectionCreation(\n        reflection: Reflection,\n        symbol: ts.Symbol | undefined,\n        exportSymbol: ts.Symbol | undefined,\n    ) {\n        // Allow comments on export declarations to take priority over comments directly\n        // on the symbol to enable overriding comments on modules/references, #1504\n        if (\n            !reflection.comment &&\n            exportSymbol &&\n            (reflection.kind &\n                (ReflectionKind.SomeModule | ReflectionKind.Reference))\n        ) {\n            reflection.comment = this.getComment(exportSymbol, reflection.kind);\n        }\n\n        // If that didn't get us a comment (the normal case), then get the comment from\n        // the source declarations, this is the common case.\n        if (symbol && !reflection.comment) {\n            reflection.comment = this.getComment(symbol, reflection.kind);\n        }\n\n        // If we still don't have a comment, check for any comments on the export declaration,\n        // we don't have to worry about functions being weird in this case as the regular declaration\n        // doesn't have any comment.\n        if (exportSymbol && !reflection.comment) {\n            reflection.comment = this.getComment(exportSymbol, ReflectionKind.Reference);\n        }\n\n        if (this.shouldBeStatic) {\n            reflection.setFlag(ReflectionFlag.Static);\n        }\n\n        if (reflection instanceof DeclarationReflection) {\n            reflection.escapedName = symbol?.escapedName ? String(symbol.escapedName) : undefined;\n            this.addChild(reflection);\n        }\n\n        if (symbol && this.converter.isExternal(symbol, this.checker)) {\n            reflection.setFlag(ReflectionFlag.External);\n        }\n        if (exportSymbol) {\n            this.registerReflection(reflection, exportSymbol, void 0);\n        }\n\n        const path = reflection.kindOf(\n                ReflectionKind.Namespace | ReflectionKind.Module,\n            )\n            ? symbol?.declarations?.find(ts.isSourceFile)?.fileName\n            : undefined;\n\n        if (path) {\n            this.registerReflection(reflection, symbol, normalizePath(path));\n        } else {\n            this.registerReflection(reflection, symbol, undefined);\n        }\n    }\n\n    finalizeDeclarationReflection(reflection: DeclarationReflection) {\n        this.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            this,\n            reflection,\n        );\n\n        if (reflection.kindOf(ReflectionKind.MayContainDocuments)) {\n            this.converter.processDocumentTags(reflection, reflection);\n        }\n    }\n\n    /**\n     * Create a {@link ReferenceType} which points to the provided symbol.\n     *\n     * @privateRemarks\n     * This is available on Context so that it can be monkey-patched by typedoc-plugin-missing-exports\n     */\n    createSymbolReference(\n        symbol: ts.Symbol,\n        context: Context,\n        name?: string,\n    ): ReferenceType {\n        const ref = ReferenceType.createUnresolvedReference(\n            name ?? symbol.name,\n            this.createSymbolId(symbol),\n            context.project,\n            getQualifiedName(symbol, name ?? symbol.name),\n        );\n        ref.refersToTypeParameter = !!(\n            symbol.flags & ts.SymbolFlags.TypeParameter\n        );\n\n        const symbolPath = symbol.declarations?.[0]?.getSourceFile().fileName;\n        if (!symbolPath) return ref;\n\n        ref.package = findPackageForPath(symbolPath)?.[0];\n        return ref;\n    }\n\n    /**\n     * Create a stable {@link ReflectionSymbolId} for the provided symbol,\n     * optionally targeting a specific declaration.\n     *\n     * @privateRemarks\n     * This is available on Context so that it can be monkey-patched by typedoc-plugin-missing-exports\n     * It might also turn out to be generally useful for other plugin users.\n     */\n    createSymbolId(symbol: ts.Symbol, declaration?: ts.Declaration) {\n        return createSymbolIdImpl(symbol, declaration);\n    }\n\n    addChild(reflection: DeclarationReflection | DocumentReflection) {\n        if (this.scope instanceof ContainerReflection) {\n            this.scope.addChild(reflection);\n        }\n    }\n\n    shouldIgnore(symbol: ts.Symbol) {\n        return this.converter.shouldIgnore(symbol, this.checker);\n    }\n\n    /**\n     * Register a newly generated reflection. All created reflections should be\n     * passed to this method to ensure that the project helper functions work correctly.\n     *\n     * @param reflection  The reflection that should be registered.\n     * @param symbol  The symbol the given reflection was resolved from.\n     */\n    registerReflection(reflection: Reflection, symbol: ts.Symbol | undefined, filePath?: NormalizedPath) {\n        if (symbol) {\n            this.reflectionIdToSymbolMap.set(reflection.id, symbol);\n            const id = this.createSymbolId(symbol);\n\n            // #2466\n            // If we just registered a member of a class or interface, then we need to check if\n            // we've registered this symbol before under the wrong parent reflection.\n            // This can happen because the compiler API will use non-dependently-typed symbols\n            // for properties of classes/interfaces which inherit them, so we can't rely on the\n            // property being unique for each class.\n            if (\n                reflection.parent?.kindOf(ReflectionKind.ClassOrInterface) &&\n                reflection.kindOf(ReflectionKind.SomeMember)\n            ) {\n                const saved = this.project[\"symbolToReflectionIdMap\"].get(id);\n                const parentSymbolReflection = symbol.parent &&\n                    this.getReflectionFromSymbol(symbol.parent);\n\n                if (\n                    typeof saved === \"object\" &&\n                    saved.length > 1 &&\n                    parentSymbolReflection\n                ) {\n                    removeIf(\n                        saved,\n                        (item) =>\n                            this.project.getReflectionById(item)?.parent !==\n                                parentSymbolReflection,\n                    );\n                }\n            }\n\n            this.project.registerReflection(reflection, id, filePath);\n        } else {\n            this.project.registerReflection(reflection, void 0, filePath);\n        }\n    }\n\n    getReflectionFromSymbol(symbol: ts.Symbol) {\n        return this.project.getReflectionFromSymbolId(this.createSymbolId(symbol));\n    }\n\n    getSymbolFromReflection(reflection: Reflection) {\n        return this.reflectionIdToSymbolMap.get(reflection.id);\n    }\n\n    /** @internal */\n    setActiveProgram(program: ts.Program | undefined) {\n        this._program = program;\n    }\n\n    private createCommentContext(): CommentContext {\n        return {\n            config: this.converter.config,\n            logger: this.logger,\n            checker: this.checker,\n            files: this.project.files,\n            createSymbolId: (s, d) => this.createSymbolId(s, d),\n        };\n    }\n\n    getComment(symbol: ts.Symbol, kind: ReflectionKind) {\n        return getComment(\n            symbol,\n            kind,\n            this.createCommentContext(),\n        );\n    }\n\n    getNodeComment(node: ts.Node, moduleComment: boolean) {\n        return getNodeComment(\n            node,\n            moduleComment,\n            this.createCommentContext(),\n        );\n    }\n\n    getFileComment(node: ts.SourceFile) {\n        return getFileComment(\n            node,\n            this.createCommentContext(),\n        );\n    }\n\n    getJsDocComment(\n        declaration:\n            | ts.JSDocPropertyLikeTag\n            | ts.JSDocCallbackTag\n            | ts.JSDocTypedefTag\n            | ts.JSDocTemplateTag\n            | ts.JSDocEnumTag,\n    ) {\n        return getJsDocComment(\n            declaration,\n            this.createCommentContext(),\n        );\n    }\n\n    getSignatureComment(\n        declaration: ts.SignatureDeclaration | ts.JSDocSignature,\n    ) {\n        return getSignatureComment(\n            declaration,\n            this.createCommentContext(),\n        );\n    }\n\n    shouldInline(symbol: ts.Symbol, name: string): boolean {\n        if (this.preventInline.has(name)) return false;\n        if (this.inlineType.has(name)) return true;\n\n        return this\n            .getComment(symbol, ReflectionKind.Interface)\n            ?.hasModifier(\"@inline\") ?? false;\n    }\n\n    public withScope(scope: Reflection): Context {\n        assert(scope.parent === this.scope || scope === this.scope, \"Incorrect context used for withScope\");\n\n        const context = new Context(\n            this.converter,\n            this.programs,\n            this.project,\n            scope,\n        );\n        context.convertingTypeNode = this.convertingTypeNode;\n        context.setActiveProgram(this._program);\n        context.reflectionIdToSymbolMap = this.reflectionIdToSymbolMap;\n        context.preventInline = new Set(this.preventInline);\n        context.inlineType = new Set(this.inlineType);\n\n        for (const tag of scope.comment?.blockTags || []) {\n            if (tag.tag === \"@preventInline\") {\n                context.preventInline.add(Comment.combineDisplayParts(tag.content));\n            } else if (tag.tag === \"@inlineType\") {\n                context.inlineType.add(Comment.combineDisplayParts(tag.content));\n            }\n        }\n\n        return context;\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/convert-expression.ts",
    "content": "import ts from \"typescript\";\n\n/**\n * Return the default value of the given node.\n *\n * @param node  The TypeScript node whose default value should be extracted.\n * @returns The default value as a string.\n */\nexport function convertDefaultValue(\n    node: ts.Declaration | undefined,\n): string | undefined {\n    const anyNode = node as any;\n    if (anyNode?.initializer) {\n        return convertExpression(anyNode.initializer);\n    } else {\n        return undefined;\n    }\n}\n\nexport function convertExpression(expression: ts.Expression): string {\n    switch (expression.kind) {\n        case ts.SyntaxKind.StringLiteral:\n        case ts.SyntaxKind.TrueKeyword:\n        case ts.SyntaxKind.FalseKeyword:\n        case ts.SyntaxKind.NullKeyword:\n        case ts.SyntaxKind.NumericLiteral:\n        case ts.SyntaxKind.BigIntLiteral:\n        case ts.SyntaxKind.Identifier:\n            return expression.getText();\n    }\n\n    if (ts.isPrefixUnaryExpression(expression)) {\n        const inner = convertExpression(expression.operand);\n        if (inner != \"...\") {\n            return expression.getText();\n        }\n    }\n\n    if (\n        ts.isArrayLiteralExpression(expression) &&\n        expression.elements.length === 0\n    ) {\n        return \"[]\";\n    }\n\n    if (\n        ts.isObjectLiteralExpression(expression) &&\n        expression.properties.length === 0\n    ) {\n        return \"{}\";\n    }\n\n    // a.b.c.d\n    if (ts.isPropertyAccessExpression(expression)) {\n        const parts = [expression.name.getText()];\n        let iter = expression.expression;\n        while (ts.isPropertyAccessExpression(iter)) {\n            parts.unshift(iter.name.getText());\n            iter = iter.expression;\n        }\n\n        if (ts.isIdentifier(iter)) {\n            parts.unshift(iter.text);\n            return parts.join(\".\");\n        }\n    }\n\n    // More complex expressions are generally not useful in the documentation.\n    // Show that there was a value, but not specifics.\n    return \"...\";\n}\n"
  },
  {
    "path": "src/lib/converter/converter-events.ts",
    "content": "export const ConverterEvents = {\n    BEGIN: \"begin\",\n    END: \"end\",\n    CREATE_PROJECT: \"createProject\",\n    CREATE_DECLARATION: \"createDeclaration\",\n    CREATE_DOCUMENT: \"createDocument\",\n    CREATE_SIGNATURE: \"createSignature\",\n    CREATE_PARAMETER: \"createParameter\",\n    CREATE_TYPE_PARAMETER: \"createTypeParameter\",\n    RESOLVE_BEGIN: \"resolveBegin\",\n    RESOLVE: \"resolveReflection\",\n    RESOLVE_END: \"resolveEnd\",\n} as const;\n"
  },
  {
    "path": "src/lib/converter/converter.ts",
    "content": "import ts from \"typescript\";\nimport { ok } from \"assert\";\n\nimport type { Application } from \"../application.js\";\nimport {\n    Comment,\n    type CommentDisplayPart,\n    type ContainerReflection,\n    type DeclarationReflection,\n    DocumentReflection,\n    type ParameterReflection,\n    ProjectReflection,\n    Reflection,\n    ReflectionKind,\n    type ReflectionSymbolId,\n    type SignatureReflection,\n    type SomeType,\n    type TypeParameterReflection,\n} from \"../models/index.js\";\nimport { Context } from \"./context.js\";\nimport { AbstractComponent } from \"../utils/component.js\";\nimport { getDocumentEntryPoints, Option, readFile } from \"../utils/index.js\";\nimport { convertType } from \"./types.js\";\nimport { ConverterEvents } from \"./converter-events.js\";\nimport { convertSymbol } from \"./symbols.js\";\nimport { MinimatchSet, nicePath, normalizePath } from \"../utils/paths.js\";\nimport {\n    type GlobString,\n    hasAllFlags,\n    hasAnyFlag,\n    i18n,\n    MinimalSourceFile,\n    type NormalizedPath,\n    NormalizedPathUtils,\n    partition,\n    unique,\n} from \"#utils\";\nimport type { DocumentationEntryPoint } from \"../utils/entry-point.js\";\nimport { clearCommentCache, type CommentParserConfig } from \"./comments/index.js\";\nimport type { CommentStyle, ValidationOptions } from \"../utils/options/declaration.js\";\nimport { parseCommentString } from \"./comments/parser.js\";\nimport { lexCommentString } from \"./comments/rawLexer.js\";\nimport {\n    type ExternalResolveResult,\n    type ExternalSymbolResolver,\n    resolveLinks,\n    resolvePartLinks,\n} from \"./comments/linkResolver.js\";\nimport { type DeclarationReference, meaningToString } from \"#utils\";\nimport { basename, dirname, resolve } from \"path\";\nimport type { FileRegistry } from \"../models/FileRegistry.js\";\n\nimport { GroupPlugin } from \"./plugins/GroupPlugin.js\";\nimport { CategoryPlugin } from \"./plugins/CategoryPlugin.js\";\nimport { CommentPlugin } from \"./plugins/CommentPlugin.js\";\nimport { ImplementsPlugin } from \"./plugins/ImplementsPlugin.js\";\nimport { InheritDocPlugin } from \"./plugins/InheritDocPlugin.js\";\nimport { LinkResolverPlugin } from \"./plugins/LinkResolverPlugin.js\";\nimport { PackagePlugin } from \"./plugins/PackagePlugin.js\";\nimport { SourcePlugin } from \"./plugins/SourcePlugin.js\";\nimport { TypePlugin } from \"./plugins/TypePlugin.js\";\nimport { IncludePlugin } from \"./plugins/IncludePlugin.js\";\nimport { MergeModuleWithPlugin } from \"./plugins/MergeModuleWithPlugin.js\";\nimport { resolveAliasedSymbol } from \"./utils/symbols.js\";\n\nexport interface ConverterEvents {\n    begin: [Context];\n    end: [Context];\n    createProject: [Context, ProjectReflection];\n    createDeclaration: [Context, DeclarationReflection];\n    createDocument: [undefined, DocumentReflection];\n    createSignature: [\n        Context,\n        SignatureReflection,\n        (\n            | ts.SignatureDeclaration\n            | ts.IndexSignatureDeclaration\n            | ts.JSDocSignature\n        )?,\n        ts.Signature?,\n    ];\n    createParameter: [Context, ParameterReflection, ts.Node?];\n    createTypeParameter: [\n        Context,\n        TypeParameterReflection,\n        ts.TypeParameterDeclaration?,\n    ];\n    resolveBegin: [Context];\n    resolveReflection: [Context, Reflection];\n    resolveEnd: [Context];\n}\n\n/**\n * Compiles source files using TypeScript and converts compiler symbols to reflections.\n *\n * @group None\n * @summary Responsible for converting TypeScript symbols into {@link Reflection}s and {@link Type}s.\n */\nexport class Converter extends AbstractComponent<Application, ConverterEvents> {\n    /** @internal */\n    @Option(\"externalPattern\")\n    accessor externalPattern!: GlobString[];\n    private externalPatternCache?: MinimatchSet;\n    private excludeCache?: MinimatchSet;\n\n    /** @internal */\n    @Option(\"excludeExternals\")\n    accessor excludeExternals!: boolean;\n\n    /** @internal */\n    @Option(\"excludePrivate\")\n    accessor excludePrivate!: boolean;\n\n    /** @internal */\n    @Option(\"excludeProtected\")\n    accessor excludeProtected!: boolean;\n\n    /** @internal */\n    @Option(\"excludeReferences\")\n    accessor excludeReferences!: boolean;\n\n    /** @internal */\n    @Option(\"commentStyle\")\n    accessor commentStyle!: CommentStyle;\n\n    /** @internal */\n    @Option(\"validation\")\n    accessor validation!: ValidationOptions;\n\n    /** @internal */\n    @Option(\"externalSymbolLinkMappings\")\n    accessor externalSymbolLinkMappings!: Record<\n        string,\n        Record<string, string>\n    >;\n\n    /** @internal */\n    @Option(\"preserveLinkText\")\n    accessor preserveLinkText!: boolean;\n\n    /** @internal */\n    @Option(\"maxTypeConversionDepth\")\n    accessor maxTypeConversionDepth!: number;\n\n    private _config?: CommentParserConfig;\n    private _externalSymbolResolvers: Array<ExternalSymbolResolver> = [];\n    // We try to document symbols which are exported from multiple locations\n    // in modules/namespaces which declare them, rather than those which re-export them.\n    // To do this, when converting a symbol, that might be re-exported, we first defer it\n    // to the second conversion pass.\n    private _deferPermitted = false;\n    private _defer: Array<() => void> = [];\n\n    get config(): CommentParserConfig {\n        return this._config || this._buildCommentParserConfig();\n    }\n\n    /**\n     * General events\n     */\n\n    /**\n     * Triggered when the converter begins converting a project.\n     * The listener will be given a {@link Context} object.\n     * @event\n     */\n    static readonly EVENT_BEGIN = ConverterEvents.BEGIN;\n\n    /**\n     * Triggered when the converter has finished converting a project.\n     * The listener will be given a {@link Context} object.\n     * @event\n     */\n    static readonly EVENT_END = ConverterEvents.END;\n\n    /**\n     * Factory events\n     */\n\n    /**\n     * Triggered when the converter has created a project reflection.\n     * The listener will be given {@link Context} and a {@link Models.ProjectReflection}.\n     * @event\n     */\n    static readonly EVENT_CREATE_PROJECT = ConverterEvents.CREATE_PROJECT;\n\n    /**\n     * Triggered when the converter has created a declaration reflection.\n     * The listener will be given {@link Context} and a {@link Models.DeclarationReflection}.\n     * @event\n     */\n    static readonly EVENT_CREATE_DECLARATION = ConverterEvents.CREATE_DECLARATION;\n\n    /**\n     * Triggered when the converter has created a document reflection.\n     * The listener will be given `undefined` (for consistency with the\n     * other create events) and a {@link Models.DocumentReflection}.\n     * @event\n     */\n    static readonly EVENT_CREATE_DOCUMENT = ConverterEvents.CREATE_DOCUMENT;\n\n    /**\n     * Triggered when the converter has created a signature reflection.\n     * The listener will be given {@link Context}, {@link Models.SignatureReflection} | {@link Models.ProjectReflection} the declaration,\n     * `ts.SignatureDeclaration | ts.IndexSignatureDeclaration | ts.JSDocSignature | undefined`,\n     * and `ts.Signature | undefined`. The signature will be undefined if the created signature is an index signature.\n     * @event\n     */\n    static readonly EVENT_CREATE_SIGNATURE = ConverterEvents.CREATE_SIGNATURE;\n\n    /**\n     * Triggered when the converter has created a parameter reflection.\n     * The listener will be given {@link Context}, {@link Models.ParameterReflection} and a `ts.Node?`\n     * @event\n     */\n    static readonly EVENT_CREATE_PARAMETER = ConverterEvents.CREATE_PARAMETER;\n\n    /**\n     * Triggered when the converter has created a type parameter reflection.\n     * The listener will be given {@link Context} and a {@link Models.TypeParameterReflection}\n     * @event\n     */\n    static readonly EVENT_CREATE_TYPE_PARAMETER = ConverterEvents.CREATE_TYPE_PARAMETER;\n\n    /**\n     * Resolve events\n     */\n\n    /**\n     * Triggered when the converter begins resolving a project.\n     * The listener will be given {@link Context}.\n     * @event\n     */\n    static readonly EVENT_RESOLVE_BEGIN = ConverterEvents.RESOLVE_BEGIN;\n\n    /**\n     * Triggered when the converter resolves a reflection.\n     * The listener will be given {@link Context} and a {@link Reflection}.\n     * @event\n     */\n    static readonly EVENT_RESOLVE = ConverterEvents.RESOLVE;\n\n    /**\n     * Triggered when the converter has finished resolving a project.\n     * The listener will be given {@link Context}.\n     * @event\n     */\n    static readonly EVENT_RESOLVE_END = ConverterEvents.RESOLVE_END;\n\n    /** @internal @hidden */\n    includePlugin: IncludePlugin;\n\n    constructor(owner: Application) {\n        super(owner);\n\n        const userConfiguredSymbolResolver: ExternalSymbolResolver = (\n            ref,\n            refl,\n            _part,\n            symbolId,\n        ) => {\n            if (symbolId) {\n                return userConfiguredSymbolResolver(\n                    symbolId.toDeclarationReference(),\n                    refl,\n                    undefined,\n                    undefined,\n                );\n            }\n\n            // Require global links, matching local ones will likely hide mistakes where the\n            // user meant to link to a local type.\n            if (ref.resolutionStart !== \"global\" || !ref.symbolReference) {\n                return;\n            }\n\n            const modLinks = this.externalSymbolLinkMappings[ref.moduleSource ?? \"global\"];\n            if (typeof modLinks !== \"object\") {\n                return;\n            }\n\n            let name = \"\";\n            if (ref.symbolReference.path) {\n                name += ref.symbolReference.path.map((p) => p.path).join(\".\");\n            }\n            if (ref.symbolReference.meaning) {\n                name += meaningToString(ref.symbolReference.meaning);\n            }\n\n            if (typeof modLinks[name] === \"string\") {\n                return modLinks[name];\n            }\n            if (typeof modLinks[\"*\"] === \"string\") {\n                return modLinks[\"*\"];\n            }\n        };\n        this.addUnknownSymbolResolver(userConfiguredSymbolResolver);\n\n        new CategoryPlugin(this);\n        new CommentPlugin(this);\n        new GroupPlugin(this);\n        new ImplementsPlugin(this);\n        new InheritDocPlugin(this);\n        new LinkResolverPlugin(this);\n        new PackagePlugin(this);\n        new SourcePlugin(this);\n        new TypePlugin(this);\n        this.includePlugin = new IncludePlugin(this);\n        new MergeModuleWithPlugin(this);\n    }\n\n    /**\n     * Compile the given source files and create a project reflection for them.\n     */\n    convert(\n        entryPoints: readonly DocumentationEntryPoint[],\n    ): ProjectReflection {\n        const programs = unique(entryPoints.map((e) => e.program));\n        this.externalPatternCache = void 0;\n\n        const project = new ProjectReflection(\n            this.application.options.getValue(\"name\"),\n            this.application.files,\n        );\n        if (this.owner.options.packageDir) {\n            project.files.registerReflectionPath(normalizePath(this.owner.options.packageDir), project);\n        }\n\n        const context = new Context(this, programs, project);\n\n        this.trigger(Converter.EVENT_BEGIN, context);\n\n        this.addProjectDocuments(project);\n        this.compile(entryPoints, context);\n        this.resolve(context);\n\n        this.trigger(Converter.EVENT_END, context);\n\n        // Delete caches of options so that test usage which changes options\n        // doesn't have confusing behavior where tests run in isolation work\n        // but break when run as a batch.\n        delete this._config;\n        delete this.excludeCache;\n        delete this.externalPatternCache;\n\n        // Also clear the comment cache so if we convert this ts.Program again\n        // later we will re-parse comments.\n        clearCommentCache();\n\n        return project;\n    }\n\n    /** @internal */\n    addProjectDocuments(project: ProjectReflection) {\n        const projectDocuments = getDocumentEntryPoints(\n            this.application.logger,\n            this.application.options,\n        );\n        for (const { displayName, path } of projectDocuments) {\n            let file: MinimalSourceFile;\n            try {\n                file = new MinimalSourceFile(readFile(path), path);\n            } catch (error: any) {\n                this.application.logger.error(\n                    i18n.failed_to_read_0_when_processing_project_document(\n                        path,\n                    ),\n                );\n                continue;\n            }\n            this.addDocument(project, file, displayName);\n        }\n    }\n\n    /** @internal */\n    convertSymbol(\n        context: Context,\n        symbol: ts.Symbol,\n        exportSymbol?: ts.Symbol,\n    ) {\n        convertSymbol(context, symbol, exportSymbol);\n    }\n\n    /**\n     * Convert the given TypeScript type into its TypeDoc type reflection.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     * @returns The TypeDoc type reflection representing the given node and type.\n     * @internal\n     */\n    convertType(context: Context, node: ts.TypeNode | undefined): SomeType;\n    convertType(context: Context, type: ts.Type, node?: ts.TypeNode): SomeType;\n    convertType(\n        context: Context,\n        typeOrNode: ts.TypeNode | ts.Type | undefined,\n        maybeNode?: ts.TypeNode,\n    ): SomeType {\n        return convertType(context, typeOrNode, maybeNode);\n    }\n\n    /**\n     * Parse the given file into a comment. Intended to be used with markdown files.\n     */\n    parseRawComment(file: MinimalSourceFile, files: FileRegistry) {\n        return parseCommentString(\n            lexCommentString(file.text),\n            this.config,\n            file,\n            this.application.logger,\n            files,\n        );\n    }\n\n    /**\n     * Adds a new resolver that the theme can use to try to figure out how to link to a symbol declared\n     * by a third-party library which is not included in the documentation.\n     *\n     * The resolver function will be passed a declaration reference which it can attempt to resolve. If\n     * resolution fails, the function should return undefined.\n     *\n     * Note: This will be used for both references to types declared in node_modules (in which case the\n     * reference passed will have the `moduleSource` set and the `symbolReference` will navigate via `.`)\n     * and user defined \\{\\@link\\} tags which cannot be resolved. If the link being resolved is inferred\n     * from a type, then no `part` will be passed to the resolver function.\n     */\n    addUnknownSymbolResolver(resolver: ExternalSymbolResolver): void {\n        this._externalSymbolResolvers.push(resolver);\n    }\n\n    /** @internal */\n    resolveExternalLink(\n        ref: DeclarationReference,\n        refl: Reflection,\n        part: CommentDisplayPart | undefined,\n        symbolId: ReflectionSymbolId | undefined,\n    ): ExternalResolveResult | string | undefined {\n        for (const resolver of this._externalSymbolResolvers) {\n            const resolved = resolver(ref, refl, part, symbolId);\n            if (resolved) return resolved;\n        }\n    }\n\n    resolveLinks(reflection: Reflection): void;\n    /** @deprecated just pass the reflection */\n    resolveLinks(comment: Comment, owner: Reflection): void;\n    resolveLinks(\n        parts: readonly CommentDisplayPart[],\n        owner: Reflection,\n    ): CommentDisplayPart[];\n    resolveLinks(\n        comment: Reflection | Comment | readonly CommentDisplayPart[],\n        owner?: Reflection,\n    ): CommentDisplayPart[] | undefined {\n        if (comment instanceof Reflection) {\n            resolveLinks(\n                comment,\n                (ref, part, refl, id) => this.resolveExternalLink(ref, part, refl, id),\n                { preserveLinkText: this.preserveLinkText },\n            );\n        } else if (comment instanceof Comment) {\n            resolveLinks(\n                owner!,\n                (ref, part, refl, id) => this.resolveExternalLink(ref, part, refl, id),\n                { preserveLinkText: this.preserveLinkText },\n            );\n        } else {\n            return resolvePartLinks(\n                owner!,\n                comment,\n                (ref, part, refl, id) => this.resolveExternalLink(ref, part, refl, id),\n                { preserveLinkText: this.preserveLinkText },\n            );\n        }\n    }\n\n    /**\n     * Permit deferred conversion steps to take place. Until this is called, {@link deferConversion}\n     * will throw if used.\n     * @since 0.28.1\n     */\n    permitDeferredConversion(): void {\n        ok(!this._deferPermitted, \"Attempted to allow deferred conversion when already permitted\");\n        this._deferPermitted = true;\n    }\n\n    /**\n     * Finalize deferred conversion, must be called by the caller of {@link permitDeferredConversion}\n     * @since 0.28.1\n     */\n    finalizeDeferredConversion(): void {\n        this.application.logger.verbose(`Have ${this._defer.length} initial deferred tasks`);\n        let count = 0;\n        while (this._defer.length) {\n            ++count;\n            const first = this._defer.shift()!;\n            first();\n        }\n        this.application.logger.verbose(`Ran ${count} total deferred tasks`);\n        this._deferPermitted = false;\n    }\n\n    /**\n     * Defer a conversion step until later. This may only be called during conversion.\n     * @since 0.28.0\n     */\n    deferConversion(cb: () => void): void {\n        ok(this._deferPermitted, \"Attempted to defer conversion when not permitted\");\n        this._defer.push(cb);\n    }\n\n    /**\n     * Compile the files within the given context and convert the compiler symbols to reflections.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     * @returns An array containing all errors generated by the TypeScript compiler.\n     */\n    private compile(\n        entryPoints: readonly DocumentationEntryPoint[],\n        context: Context,\n    ) {\n        this.permitDeferredConversion();\n        let createModuleReflections = entryPoints.length > 1;\n        if (!createModuleReflections) {\n            const opts = this.application.options;\n            createModuleReflections = opts.isSet(\"alwaysCreateEntryPointModule\")\n                ? opts.getValue(\"alwaysCreateEntryPointModule\")\n                : !!(context.scope as ProjectReflection).documents;\n        }\n\n        if (createModuleReflections) {\n            this.trigger(\n                ConverterEvents.CREATE_PROJECT,\n                context,\n                context.project,\n            );\n        }\n\n        for (const entry of entryPoints) {\n            // Clone context in case deferred conversion uses different programs\n            const entryContext = context.withScope(context.scope);\n            entryContext.setActiveProgram(entry.program);\n            this.convertExports(entryContext, entry, createModuleReflections);\n        }\n\n        this.finalizeDeferredConversion();\n    }\n\n    private convertExports(\n        context: Context,\n        entryPoint: DocumentationEntryPoint,\n        createModuleReflections: boolean,\n    ) {\n        const node = entryPoint.sourceFile;\n        const entryName = entryPoint.displayName;\n        const symbol = getSymbolForModuleLike(context, node);\n        let moduleContext: Context;\n\n        if (createModuleReflections === false) {\n            // Special case for when we're giving a single entry point, we don't need to\n            // create modules for each entry. Register the project as this module.\n            context.registerReflection(\n                context.project,\n                symbol,\n                normalizePath(entryPoint.sourceFile.fileName),\n            );\n            context.project.comment = symbol\n                ? context.getComment(symbol, context.project.kind)\n                : context.getFileComment(node);\n            this.processDocumentTags(context.project, context.project);\n            this.trigger(\n                ConverterEvents.CREATE_PROJECT,\n                context,\n                context.project,\n            );\n            moduleContext = context;\n        } else {\n            const reflection = context.createDeclarationReflection(\n                ReflectionKind.Module,\n                symbol,\n                void 0,\n                entryName,\n            );\n\n            if (!reflection.comment && !symbol) {\n                reflection.comment = context.getFileComment(node);\n            }\n\n            context.finalizeDeclarationReflection(reflection);\n            moduleContext = context.withScope(reflection);\n        }\n\n        const allExports = getExports(context, node, symbol);\n        const [directExport, indirectExports] = partition(\n            allExports,\n            exp => isDirectExport(context.resolveAliasedSymbol(exp), node),\n        );\n\n        for (const exp of directExport) {\n            this.convertSymbol(moduleContext, exp);\n        }\n\n        if (indirectExports.length) {\n            this.deferConversion(() => {\n                for (const exp of indirectExports) {\n                    this.convertSymbol(moduleContext, exp);\n                }\n            });\n        }\n    }\n\n    /**\n     * Resolve the project within the given context.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     * @returns The final project reflection.\n     */\n    private resolve(context: Context): void {\n        this.trigger(Converter.EVENT_RESOLVE_BEGIN, context);\n        const project = context.project;\n\n        for (const id in project.reflections) {\n            this.trigger(\n                Converter.EVENT_RESOLVE,\n                context,\n                project.reflections[id],\n            );\n        }\n\n        this.trigger(Converter.EVENT_RESOLVE_END, context);\n    }\n\n    /**\n     * Used to determine if we should immediately bail when creating a reflection.\n     * Note: This should not be used for excludeNotDocumented because we don't have enough\n     * information at this point since comment discovery hasn't happened.\n     * @internal\n     */\n    shouldIgnore(symbol: ts.Symbol, checker: ts.TypeChecker) {\n        symbol = resolveAliasedSymbol(symbol, checker);\n        if (this.isExcluded(symbol)) {\n            return true;\n        }\n\n        return this.excludeExternals && this.isExternal(symbol, checker);\n    }\n\n    private isExcluded(symbol: ts.Symbol) {\n        this.excludeCache ??= new MinimatchSet(\n            this.application.options.getValue(\"exclude\"),\n        );\n        const cache = this.excludeCache;\n\n        return (symbol.getDeclarations() ?? []).some((node) => cache.matchesAny(node.getSourceFile().fileName));\n    }\n\n    /** @internal */\n    isExternal(symbol: ts.Symbol, checker: ts.TypeChecker) {\n        this.externalPatternCache ??= new MinimatchSet(this.externalPattern);\n        const cache = this.externalPatternCache;\n\n        const declarations = resolveAliasedSymbol(symbol, checker).getDeclarations();\n\n        // `undefined` has no declarations, if someone does `export default undefined`\n        // the symbol ends up as having no declarations (the export symbol does, but\n        // not the source symbol)\n        if (!declarations?.length) {\n            return false;\n        }\n\n        // If there are any non-external declarations, treat it as non-external\n        // This is possible with declaration merging against external namespaces\n        // (e.g. merging with HTMLElementTagNameMap)\n        return declarations.every((node) => cache.matchesAny(node.getSourceFile().fileName));\n    }\n\n    processDocumentTags(reflection: Reflection, parent: ContainerReflection) {\n        let relativeTo = reflection.comment?.sourcePath;\n        if (relativeTo) {\n            relativeTo = NormalizedPathUtils.dirname(relativeTo);\n            const tags = reflection.comment?.getTags(\"@document\") || [];\n            reflection.comment?.removeTags(\"@document\");\n            for (const tag of tags) {\n                const path = Comment.combineDisplayParts(tag.content);\n\n                let file: MinimalSourceFile;\n                try {\n                    const resolved = normalizePath(resolve(relativeTo, path));\n                    file = new MinimalSourceFile(readFile(resolved), resolved);\n                } catch {\n                    this.application.logger.warn(\n                        i18n.failed_to_read_0_when_processing_document_tag_in_1(\n                            nicePath(path),\n                            nicePath(reflection.comment!.sourcePath!),\n                        ),\n                    );\n                    continue;\n                }\n\n                this.addDocument(\n                    parent,\n                    file,\n                    basename(file.fileName).replace(/\\.[^.]+$/, \"\"),\n                );\n            }\n        }\n    }\n\n    private addDocument(\n        parent: ContainerReflection | DocumentReflection,\n        file: MinimalSourceFile,\n        displayName: string,\n    ) {\n        const { content, frontmatter } = this.parseRawComment(\n            file,\n            parent.project.files,\n        );\n        const children = frontmatter[\"children\"];\n        delete frontmatter[\"children\"];\n        const docRefl = new DocumentReflection(\n            displayName,\n            parent,\n            content,\n            frontmatter,\n        );\n\n        this.application.watchFile(file.fileName);\n        parent.addChild(docRefl);\n        parent.project.registerReflection(docRefl, undefined, file.fileName as NormalizedPath);\n        this.trigger(ConverterEvents.CREATE_DOCUMENT, undefined, docRefl);\n\n        const childrenToAdd: [string, string][] = [];\n        if (children && typeof children === \"object\") {\n            if (Array.isArray(children)) {\n                for (const child of children) {\n                    if (typeof child === \"string\") {\n                        childrenToAdd.push([\n                            basename(child).replace(/\\.[^.]+$/, \"\"),\n                            child,\n                        ]);\n                    } else {\n                        this.application.logger.error(\n                            i18n\n                                .frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values(\n                                    nicePath(file.fileName),\n                                ),\n                        );\n                        return;\n                    }\n                }\n            } else {\n                for (const [name, path] of Object.entries(children)) {\n                    if (typeof path === \"string\") {\n                        childrenToAdd.push([name, path]);\n                    } else {\n                        this.application.logger.error(\n                            i18n\n                                .frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values(\n                                    nicePath(file.fileName),\n                                ),\n                        );\n                        return;\n                    }\n                }\n            }\n        }\n\n        for (const [displayName, path] of childrenToAdd) {\n            const absPath = normalizePath(resolve(dirname(file.fileName), path));\n            let childFile: MinimalSourceFile;\n            try {\n                childFile = new MinimalSourceFile(readFile(absPath), absPath);\n            } catch (error: any) {\n                this.application.logger.error(\n                    i18n.failed_to_read_0_when_processing_document_child_in_1(\n                        path,\n                        nicePath(file.fileName),\n                    ),\n                );\n                continue;\n            }\n            this.addDocument(docRefl, childFile, displayName);\n        }\n    }\n\n    private _buildCommentParserConfig() {\n        this._config = {\n            blockTags: new Set(this.application.options.getValue(\"blockTags\")),\n            inlineTags: new Set(this.application.options.getValue(\"inlineTags\")),\n            modifierTags: new Set(this.application.options.getValue(\"modifierTags\")),\n            preservedTypeAnnotationTags: new Set(this.application.options.getValue(\"preservedTypeAnnotationTags\")),\n            jsDocCompatibility: this.application.options.getValue(\"jsDocCompatibility\"),\n            suppressCommentWarningsInDeclarationFiles: this.application.options.getValue(\n                \"suppressCommentWarningsInDeclarationFiles\",\n            ),\n            useTsLinkResolution: this.application.options.getValue(\n                \"useTsLinkResolution\",\n            ),\n            commentStyle: this.application.options.getValue(\"commentStyle\"),\n            validationOptions: this.application.options.getValue(\"validation\"),\n        };\n\n        // Can't be included in options because the TSDoc parser blows up if we do.\n        // TypeDoc supports it as one, so it should always be included here.\n        this._config.blockTags.add(\"@inheritDoc\");\n\n        return this._config;\n    }\n}\n\nfunction getSymbolForModuleLike(\n    context: Context,\n    node: ts.SourceFile | ts.ModuleBlock,\n) {\n    const symbol = context.checker.getSymbolAtLocation(node) ?? node.symbol;\n\n    if (symbol) {\n        return symbol;\n    }\n\n    // This is a global file, get all symbols declared in this file...\n    // this isn't the best solution, it would be nice to have all globals given to a special\n    // \"globals\" file, but this is uncommon enough that I'm skipping it for now.\n    const sourceFile = node.getSourceFile();\n    const globalSymbols = context.checker\n        .getSymbolsInScope(node, ts.SymbolFlags.ModuleMember)\n        .filter((s) => s.getDeclarations()?.some((d) => d.getSourceFile() === sourceFile));\n\n    // Detect declaration files with declare module \"foo\" as their only export\n    // and lift that up one level as the source file symbol\n    if (\n        globalSymbols.length === 1 &&\n        globalSymbols[0]\n            .getDeclarations()\n            ?.every(\n                (declaration) =>\n                    ts.isModuleDeclaration(declaration) &&\n                    ts.isStringLiteral(declaration.name),\n            )\n    ) {\n        return globalSymbols[0];\n    }\n}\n\nfunction getExports(\n    context: Context,\n    node: ts.SourceFile,\n    symbol: ts.Symbol | undefined,\n): ts.Symbol[] {\n    let result: ts.Symbol[];\n\n    // The generated docs aren't great, but you really ought not be using\n    // this in the first place... so it's better than nothing.\n    const exportEq = symbol?.exports?.get(\"export=\" as ts.__String);\n    if (exportEq) {\n        // JS users might also have exported types here.\n        // We need to filter for types because otherwise static methods can show up as both\n        // members of the export= class and as functions if a class is directly exported.\n        result = [exportEq].concat(\n            context.checker\n                .getExportsOfModule(symbol!)\n                .filter(\n                    (s) =>\n                        !hasAnyFlag(\n                            s.flags,\n                            ts.SymbolFlags.Prototype | ts.SymbolFlags.Value,\n                        ),\n                ),\n        );\n    } else if (symbol) {\n        result = context.checker\n            .getExportsOfModule(symbol)\n            .filter((s) => !hasAllFlags(s.flags, ts.SymbolFlags.Prototype));\n\n        if (result.length === 0) {\n            const globalDecl = node.statements.find(\n                (s) =>\n                    ts.isModuleDeclaration(s) &&\n                    s.flags & ts.NodeFlags.GlobalAugmentation,\n            );\n\n            if (globalDecl) {\n                const globalSymbol = context.getSymbolAtLocation(globalDecl);\n                if (globalSymbol) {\n                    result = context.checker\n                        .getExportsOfModule(globalSymbol)\n                        .filter((exp) =>\n                            exp.declarations?.some(\n                                (d) => d.getSourceFile() === node,\n                            )\n                        )\n                        .map((s) => context.checker.getMergedSymbol(s));\n                }\n            }\n        }\n    } else {\n        // Global file with no inferred top level symbol, get all symbols declared in this file.\n        const sourceFile = node.getSourceFile();\n        result = context.checker\n            .getSymbolsInScope(node, ts.SymbolFlags.ModuleMember)\n            .filter((s) =>\n                s\n                    .getDeclarations()\n                    ?.some((d) => d.getSourceFile() === sourceFile)\n            );\n    }\n\n    // Put symbols named \"default\" last, #1795\n    result.sort((a, b) => {\n        if (a.name === \"default\") {\n            return 1;\n        } else if (b.name === \"default\") {\n            return -1;\n        }\n        return 0;\n    });\n\n    return result;\n}\n\nfunction isDirectExport(symbol: ts.Symbol, file: ts.SourceFile): boolean {\n    return (\n        symbol\n            .getDeclarations()\n            ?.every((decl) => decl.getSourceFile() === file) ?? false\n    );\n}\n"
  },
  {
    "path": "src/lib/converter/factories/index-signature.ts",
    "content": "import assert from \"assert\";\nimport type ts from \"typescript\";\nimport {\n    DeclarationReflection,\n    ParameterReflection,\n    ReflectionFlag,\n    ReflectionKind,\n    SignatureReflection,\n    UnionType,\n} from \"../../models/index.js\";\nimport type { Context } from \"../context.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\n\nexport function convertIndexSignatures(context: Context, type: ts.Type) {\n    assert(context.scope instanceof DeclarationReflection);\n\n    // Each declaration should have one SignatureReflection\n    // If we don't have a declaration, the index signature was inferred by TS\n    // and we should make a separate SignatureReflection for each index signature.\n    const seenByDeclaration = new Map<ts.Declaration, SignatureReflection>();\n    const createdSignatures: [\n        ts.IndexSignatureDeclaration | undefined,\n        SignatureReflection,\n    ][] = [];\n\n    for (const indexInfo of context.checker.getIndexInfosOfType(type)) {\n        // Check if we've already created an index signature for this type\n        if (\n            indexInfo.declaration &&\n            seenByDeclaration.has(indexInfo.declaration)\n        ) {\n            const createdSig = seenByDeclaration.get(indexInfo.declaration)!;\n            if (createdSig.parameters![0].type?.type !== \"union\") {\n                createdSig.parameters![0].type = new UnionType([\n                    createdSig.parameters![0].type!,\n                ]);\n            }\n            createdSig.parameters![0].type.types.push(\n                context.converter.convertType(\n                    context.withScope(createdSig),\n                    indexInfo.keyType,\n                ),\n            );\n            // No need to update the return type as it will be the same for all members.\n            continue;\n        }\n\n        // Otherwise create a new one\n        const index = new SignatureReflection(\n            \"__index\",\n            ReflectionKind.IndexSignature,\n            context.scope,\n        );\n        const ic = context.withScope(index);\n        if (indexInfo.isReadonly) {\n            index.setFlag(ReflectionFlag.Readonly);\n        }\n\n        createdSignatures.push([indexInfo.declaration, index]);\n        if (indexInfo.declaration) {\n            seenByDeclaration.set(indexInfo.declaration, index);\n            index.comment = context.getNodeComment(\n                indexInfo.declaration,\n                /* moduleComment */ false,\n            );\n        }\n\n        index.parameters = [\n            new ParameterReflection(\n                indexInfo.declaration?.parameters[0].name.getText() ?? \"key\",\n                ReflectionKind.Parameter,\n                index,\n            ),\n        ];\n        index.parameters[0].type = context.converter.convertType(\n            ic.withScope(index.parameters[0]),\n            indexInfo.keyType,\n        );\n        index.type = context.converter.convertType(\n            ic,\n            indexInfo.type,\n        );\n\n        context.registerReflection(index, indexInfo.declaration?.symbol);\n        context.scope.indexSignatures ||= [];\n        context.scope.indexSignatures.push(index);\n    }\n\n    // Now that we've created everything, trigger events for them.\n    for (const [declaration, index] of createdSignatures) {\n        context.converter.trigger(\n            ConverterEvents.CREATE_SIGNATURE,\n            context,\n            index,\n            declaration,\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/factories/signature.ts",
    "content": "import ts from \"typescript\";\nimport assert from \"assert\";\nimport {\n    DeclarationReflection,\n    IntrinsicType,\n    ParameterReflection,\n    PredicateType,\n    ReferenceType,\n    type Reflection,\n    ReflectionFlag,\n    ReflectionKind,\n    SignatureReflection,\n    TypeParameterReflection,\n    VarianceModifier,\n} from \"../../models/index.js\";\nimport type { Context } from \"../context.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport { convertDefaultValue } from \"../convert-expression.js\";\nimport { removeUndefined } from \"../utils/reflections.js\";\n\nexport function convertConstructSignatures(context: Context, symbol: ts.Symbol) {\n    const type = context.checker.getDeclaredTypeOfSymbol(symbol);\n\n    // These get added as a \"constructor\" member of this interface. This is a problem... but nobody\n    // has complained yet. We really ought to have a constructSignatures property on the reflection instead.\n    const constructSignatures = context.checker.getSignaturesOfType(\n        type,\n        ts.SignatureKind.Construct,\n    );\n    if (constructSignatures.length) {\n        const constructMember = new DeclarationReflection(\n            \"constructor\",\n            ReflectionKind.Constructor,\n            context.scope,\n        );\n        context.postReflectionCreation(constructMember, symbol, void 0);\n        context.finalizeDeclarationReflection(constructMember);\n\n        const constructContext = context.withScope(constructMember);\n\n        constructSignatures.forEach((sig) =>\n            createSignature(\n                constructContext,\n                ReflectionKind.ConstructorSignature,\n                sig,\n                symbol,\n            )\n        );\n    }\n}\n\nexport function createSignature(\n    context: Context,\n    kind:\n        | ReflectionKind.CallSignature\n        | ReflectionKind.ConstructorSignature\n        | ReflectionKind.GetSignature\n        | ReflectionKind.SetSignature,\n    signature: ts.Signature,\n    symbol: ts.Symbol | undefined,\n    declaration?: ts.SignatureDeclaration | ts.JSDocSignature,\n) {\n    assert(context.scope instanceof DeclarationReflection);\n\n    declaration ||= signature.getDeclaration() as\n        | ts.SignatureDeclaration\n        | undefined;\n\n    const sigRef = new SignatureReflection(\n        kind == ReflectionKind.ConstructorSignature\n            ? context.scope.parent!.name\n            : context.scope.name,\n        kind,\n        context.scope,\n    );\n    // This feels awful, but we need some way to tell if callable signatures on classes\n    // are \"static\" (e.g. `Foo()`) or not (e.g. `(new Foo())()`)\n    if (context.shouldBeStatic) {\n        sigRef.setFlag(ReflectionFlag.Static);\n    }\n    if (symbol && declaration) {\n        context.project.registerSymbolId(\n            sigRef,\n            context.createSymbolId(symbol, declaration),\n        );\n    }\n\n    let parentReflection = context.scope;\n    if (\n        parentReflection.kindOf(ReflectionKind.TypeLiteral) &&\n        parentReflection.parent instanceof DeclarationReflection\n    ) {\n        parentReflection = parentReflection.parent;\n    }\n\n    if (declaration) {\n        const sigComment = context.getSignatureComment(declaration);\n        if (parentReflection.comment?.discoveryId !== sigComment?.discoveryId) {\n            sigRef.comment = sigComment;\n            if (parentReflection.kindOf(ReflectionKind.MayContainDocuments)) {\n                context.converter.processDocumentTags(sigRef, parentReflection);\n            }\n        }\n    }\n\n    const sigRefCtx = context.withScope(sigRef);\n    sigRef.typeParameters = convertTypeParameters(\n        sigRefCtx,\n        sigRef,\n        signature.typeParameters,\n    );\n\n    const parameterSymbols: ReadonlyArray<ts.Symbol & { type?: ts.Type }> = signature.thisParameter\n        ? [signature.thisParameter, ...signature.parameters]\n        : signature.parameters;\n\n    sigRef.parameters = convertParameters(\n        sigRefCtx,\n        sigRef,\n        parameterSymbols,\n        declaration?.parameters,\n    );\n\n    const predicate = context.checker.getTypePredicateOfSignature(signature);\n    if (predicate) {\n        sigRef.type = convertPredicate(predicate, sigRefCtx);\n    } else if (kind == ReflectionKind.SetSignature) {\n        sigRef.type = new IntrinsicType(\"void\");\n    } else if (declaration?.type?.kind === ts.SyntaxKind.ThisType) {\n        sigRef.type = new IntrinsicType(\"this\");\n    } else {\n        let typeNode = declaration?.type;\n        if (typeNode && ts.isJSDocReturnTag(typeNode)) {\n            typeNode = typeNode.typeExpression?.type;\n        }\n\n        sigRef.type = context.converter.convertType(\n            sigRefCtx,\n            signature.getReturnType(),\n            typeNode,\n        );\n    }\n\n    context.registerReflection(sigRef, undefined);\n\n    switch (kind) {\n        case ReflectionKind.GetSignature:\n            context.scope.getSignature = sigRef;\n            break;\n        case ReflectionKind.SetSignature:\n            context.scope.setSignature = sigRef;\n            break;\n        case ReflectionKind.CallSignature:\n        case ReflectionKind.ConstructorSignature:\n            context.scope.signatures ??= [];\n            context.scope.signatures.push(sigRef);\n            break;\n    }\n\n    context.converter.trigger(\n        ConverterEvents.CREATE_SIGNATURE,\n        context,\n        sigRef,\n        declaration,\n        signature,\n    );\n}\n\n/**\n * Special cased constructor factory for functions tagged with `@class`\n */\nexport function createConstructSignatureWithType(\n    context: Context,\n    signature: ts.Signature,\n    classType: Reflection,\n) {\n    assert(context.scope instanceof DeclarationReflection);\n\n    const declaration = signature.getDeclaration() as\n        | ts.SignatureDeclaration\n        | undefined;\n\n    const sigRef = new SignatureReflection(\n        context.scope.parent!.name,\n        ReflectionKind.ConstructorSignature,\n        context.scope,\n    );\n    const sigRefCtx = context.withScope(sigRef);\n\n    if (declaration) {\n        sigRef.comment = context.getSignatureComment(declaration);\n        if (sigRef.comment?.discoveryId === context.scope.parent?.comment?.discoveryId) {\n            delete sigRef.comment;\n        }\n    }\n\n    const parameterSymbols = signature.thisParameter\n        ? [signature.thisParameter, ...signature.parameters]\n        : [...signature.parameters];\n\n    // Prevent a `this` parameter from appearing on constructor signature\n    // as TS disallows them on regular classes.\n    if (parameterSymbols[0]?.name === \"this\") {\n        parameterSymbols.shift();\n    }\n\n    sigRef.parameters = convertParameters(\n        sigRefCtx,\n        sigRef,\n        parameterSymbols,\n        declaration?.parameters,\n    );\n    sigRef.parameters = convertParameters(sigRefCtx, sigRef, parameterSymbols, undefined);\n\n    // Do NOT convert type parameters here, they go on the class itself in the @class case\n    // See #2914.\n\n    sigRef.type = ReferenceType.createResolvedReference(\n        context.scope.parent!.name,\n        classType,\n        context.project,\n    );\n\n    context.registerReflection(sigRef, undefined);\n\n    context.scope.signatures ??= [];\n    context.scope.signatures.push(sigRef);\n\n    context.converter.trigger(\n        ConverterEvents.CREATE_SIGNATURE,\n        context,\n        sigRef,\n        declaration,\n        signature,\n    );\n}\n\nfunction convertParameters(\n    context: Context,\n    sigRef: SignatureReflection,\n    parameters: readonly ts.Symbol[],\n    parameterNodes:\n        | readonly ts.ParameterDeclaration[]\n        | readonly ts.JSDocParameterTag[]\n        | undefined,\n) {\n    // #2698 if `satisfies` is used to imply a this parameter, we might have\n    // more parameters than parameter nodes and need to shift the parameterNode\n    // access index. Very ugly, but it does the job.\n    const parameterNodeOffset = parameterNodes?.length !== parameters.length ? -1 : 0;\n\n    return parameters.map((param, i) => {\n        const declaration = param.valueDeclaration;\n        assert(\n            !declaration ||\n                ts.isParameter(declaration) ||\n                ts.isJSDocParameterTag(declaration),\n        );\n        const paramRefl = new ParameterReflection(\n            /^__\\d+$/.test(param.name) ? \"__namedParameters\" : param.name,\n            ReflectionKind.Parameter,\n            sigRef,\n        );\n        if (declaration && ts.isJSDocParameterTag(declaration)) {\n            paramRefl.comment = context.getJsDocComment(declaration);\n        }\n        paramRefl.comment ||= context.getComment(param, paramRefl.kind);\n\n        context.registerReflection(paramRefl, param);\n        context.converter.trigger(\n            ConverterEvents.CREATE_PARAMETER,\n            context,\n            paramRefl,\n        );\n\n        let type: ts.Type | ts.TypeNode | undefined;\n        let typeNode: ts.TypeNode | undefined;\n        if (declaration) {\n            type = context.checker.getTypeOfSymbolAtLocation(\n                param,\n                declaration,\n            );\n\n            if (ts.isParameter(declaration)) {\n                typeNode = declaration.type;\n            } else {\n                typeNode = declaration.typeExpression?.type;\n            }\n        } else {\n            type = context.checker.getTypeOfSymbol(param);\n        }\n\n        if (\n            declaration &&\n            ts.isParameter(declaration) &&\n            declaration.type?.kind === ts.SyntaxKind.ThisType\n        ) {\n            paramRefl.type = new IntrinsicType(\"this\");\n        } else if (!type) {\n            paramRefl.type = new IntrinsicType(\"any\");\n        } else {\n            paramRefl.type = context.converter.convertType(\n                context.withScope(paramRefl),\n                type,\n                typeNode,\n            );\n        }\n\n        let isOptional = false;\n        if (declaration) {\n            isOptional = ts.isParameter(declaration)\n                ? !!declaration.questionToken ||\n                    ts\n                        .getJSDocParameterTags(declaration)\n                        .some((tag) => tag.isBracketed)\n                : declaration.isBracketed;\n        }\n\n        if (isOptional) {\n            paramRefl.type = removeUndefined(paramRefl.type);\n        }\n\n        paramRefl.defaultValue = convertDefaultValue(\n            parameterNodes?.[i + parameterNodeOffset],\n        );\n        paramRefl.setFlag(ReflectionFlag.Optional, isOptional);\n\n        // If we have no declaration, then this is an implicitly defined parameter in JS land\n        // because the method body uses `arguments`... which is always a rest argument,\n        // unless it is a this parameter defined with @this in JSDoc.\n        let isRest = param.name !== \"this\";\n        if (declaration) {\n            isRest = ts.isParameter(declaration)\n                ? !!declaration.dotDotDotToken\n                : !!declaration.typeExpression &&\n                    ts.isJSDocVariadicType(declaration.typeExpression.type);\n        }\n\n        paramRefl.setFlag(ReflectionFlag.Rest, isRest);\n        checkForDestructuredParameterDefaults(\n            paramRefl,\n            parameterNodes?.[i + parameterNodeOffset],\n        );\n        return paramRefl;\n    });\n}\n\nexport function convertParameterNodes(\n    context: Context,\n    sigRef: SignatureReflection,\n    parameters: readonly (ts.JSDocParameterTag | ts.ParameterDeclaration)[],\n) {\n    return parameters.map((param) => {\n        const paramRefl = new ParameterReflection(\n            /__\\d+/.test(param.name.getText())\n                ? \"__namedParameters\"\n                : param.name.getText(),\n            ReflectionKind.Parameter,\n            sigRef,\n        );\n        if (ts.isJSDocParameterTag(param)) {\n            paramRefl.comment = context.getJsDocComment(param);\n        }\n        context.registerReflection(\n            paramRefl,\n            context.getSymbolAtLocation(param),\n        );\n        context.converter.trigger(\n            ConverterEvents.CREATE_PARAMETER,\n            context,\n            paramRefl,\n        );\n\n        paramRefl.type = context.converter.convertType(\n            context.withScope(paramRefl),\n            ts.isParameter(param) ? param.type : param.typeExpression?.type,\n        );\n\n        const isOptional = ts.isParameter(param)\n            ? !!param.questionToken\n            : param.isBracketed;\n        if (isOptional) {\n            paramRefl.type = removeUndefined(paramRefl.type);\n        }\n\n        paramRefl.defaultValue = convertDefaultValue(param);\n        paramRefl.setFlag(ReflectionFlag.Optional, isOptional);\n        paramRefl.setFlag(\n            ReflectionFlag.Rest,\n            ts.isParameter(param)\n                ? !!param.dotDotDotToken\n                : !!param.typeExpression &&\n                    ts.isJSDocVariadicType(param.typeExpression.type),\n        );\n        checkForDestructuredParameterDefaults(paramRefl, param);\n        return paramRefl;\n    });\n}\n\nfunction checkForDestructuredParameterDefaults(\n    param: ParameterReflection,\n    decl: ts.ParameterDeclaration | ts.JSDocParameterTag | undefined,\n) {\n    if (!decl || !ts.isParameter(decl)) return;\n    if (param.name !== \"__namedParameters\") return;\n    if (!ts.isObjectBindingPattern(decl.name)) return;\n    if (param.type?.type !== \"reflection\") return;\n\n    for (const child of param.type.declaration.children || []) {\n        const tsChild = decl.name.elements.find(\n            (el) => (el.propertyName || el.name).getText() === child.name,\n        );\n\n        if (tsChild) {\n            child.defaultValue = convertDefaultValue(tsChild);\n        }\n    }\n}\n\nexport function convertTypeParameters(\n    context: Context,\n    parent: Reflection,\n    parameters: readonly ts.TypeParameter[] | undefined,\n) {\n    return parameters?.map((param) => {\n        const constraintT = param.getConstraint();\n        const defaultT = param.getDefault();\n\n        // There's no way to determine directly from a ts.TypeParameter what it's variance modifiers are\n        // so unfortunately we have to go back to the node for this...\n        const declaration = param\n            .getSymbol()\n            ?.declarations?.find(ts.isTypeParameterDeclaration);\n        const variance = getVariance(declaration?.modifiers);\n\n        const paramRefl = new TypeParameterReflection(\n            param.symbol.name,\n            parent,\n            variance,\n        );\n        const paramCtx = context.withScope(paramRefl);\n\n        paramRefl.type = constraintT\n            ? context.converter.convertType(paramCtx, constraintT)\n            : void 0;\n        paramRefl.default = defaultT\n            ? context.converter.convertType(paramCtx, defaultT)\n            : void 0;\n\n        // No way to determine this from the type parameter itself, need to go back to the declaration\n        if (\n            declaration?.modifiers?.some(\n                (m) => m.kind === ts.SyntaxKind.ConstKeyword,\n            )\n        ) {\n            paramRefl.flags.setFlag(ReflectionFlag.Const, true);\n        }\n\n        context.registerReflection(paramRefl, param.getSymbol());\n        context.converter.trigger(\n            ConverterEvents.CREATE_TYPE_PARAMETER,\n            context,\n            paramRefl,\n        );\n\n        return paramRefl;\n    });\n}\n\nexport function convertTypeParameterNodes(\n    context: Context,\n    parameters: readonly ts.TypeParameterDeclaration[] | undefined,\n) {\n    return parameters?.map((param) => createTypeParamReflection(param, context));\n}\n\nexport function createTypeParamReflection(\n    param: ts.TypeParameterDeclaration,\n    context: Context,\n) {\n    const paramRefl = new TypeParameterReflection(\n        param.name.text,\n        context.scope,\n        getVariance(param.modifiers),\n    );\n    const paramScope = context.withScope(paramRefl);\n\n    if (ts.isJSDocTemplateTag(param.parent)) {\n        // With a @template tag, the constraint applies only to the\n        // first type parameter declared.\n        if (param.parent.typeParameters[0].name.text === param.name.text && param.parent.constraint) {\n            paramRefl.type = context.converter.convertType(paramScope, param.parent.constraint);\n        }\n    } else {\n        paramRefl.type = param.constraint\n            ? context.converter.convertType(paramScope, param.constraint)\n            : void 0;\n    }\n\n    paramRefl.default = param.default\n        ? context.converter.convertType(paramScope, param.default)\n        : void 0;\n\n    if (param.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword)) {\n        paramRefl.flags.setFlag(ReflectionFlag.Const, true);\n    }\n\n    context.registerReflection(paramRefl, param.symbol);\n\n    if (ts.isJSDocTemplateTag(param.parent)) {\n        paramRefl.comment = context.getJsDocComment(param.parent);\n    }\n\n    context.converter.trigger(\n        ConverterEvents.CREATE_TYPE_PARAMETER,\n        context,\n        paramRefl,\n        param,\n    );\n    return paramRefl;\n}\n\nexport function convertTemplateParameterNodes(\n    context: Context,\n    nodes: readonly ts.JSDocTemplateTag[] | undefined,\n) {\n    return nodes?.flatMap((node) => {\n        return node.typeParameters.map((param, index) => {\n            const paramRefl = new TypeParameterReflection(\n                param.name.text,\n                context.scope,\n                getVariance(param.modifiers),\n            );\n            const paramScope = context.withScope(paramRefl);\n            paramRefl.type = index || !node.constraint\n                ? void 0\n                : context.converter.convertType(\n                    paramScope,\n                    node.constraint.type,\n                );\n            paramRefl.default = param.default\n                ? context.converter.convertType(paramScope, param.default)\n                : void 0;\n            if (\n                param.modifiers?.some(\n                    (m) => m.kind === ts.SyntaxKind.ConstKeyword,\n                )\n            ) {\n                paramRefl.flags.setFlag(ReflectionFlag.Const, true);\n            }\n\n            context.registerReflection(paramRefl, param.symbol);\n\n            if (ts.isJSDocTemplateTag(param.parent)) {\n                paramRefl.comment = context.getJsDocComment(param.parent);\n            }\n\n            context.converter.trigger(\n                ConverterEvents.CREATE_TYPE_PARAMETER,\n                context,\n                paramRefl,\n                param,\n            );\n            return paramRefl;\n        });\n    });\n}\n\nfunction getVariance(\n    modifiers: ts.ModifiersArray | undefined,\n): VarianceModifier | undefined {\n    const hasIn = modifiers?.some(\n        (mod) => mod.kind === ts.SyntaxKind.InKeyword,\n    );\n    const hasOut = modifiers?.some(\n        (mod) => mod.kind === ts.SyntaxKind.OutKeyword,\n    );\n\n    if (hasIn && hasOut) {\n        return VarianceModifier.inOut;\n    }\n\n    if (hasIn) {\n        return VarianceModifier.in;\n    }\n\n    if (hasOut) {\n        return VarianceModifier.out;\n    }\n}\n\nfunction convertPredicate(\n    predicate: ts.TypePredicate,\n    context: Context,\n): PredicateType {\n    let name: string;\n    switch (predicate.kind) {\n        case ts.TypePredicateKind.This:\n        case ts.TypePredicateKind.AssertsThis:\n            name = \"this\";\n            break;\n        case ts.TypePredicateKind.Identifier:\n        case ts.TypePredicateKind.AssertsIdentifier:\n            name = predicate.parameterName;\n            break;\n    }\n\n    let asserts: boolean;\n    switch (predicate.kind) {\n        case ts.TypePredicateKind.This:\n        case ts.TypePredicateKind.Identifier:\n            asserts = false;\n            break;\n        case ts.TypePredicateKind.AssertsThis:\n        case ts.TypePredicateKind.AssertsIdentifier:\n            asserts = true;\n            break;\n    }\n\n    return new PredicateType(\n        name,\n        asserts,\n        predicate.type\n            ? context.converter.convertType(context, predicate.type)\n            : void 0,\n    );\n}\n"
  },
  {
    "path": "src/lib/converter/factories/symbol-id.ts",
    "content": "import { ReflectionSymbolId } from \"#models\";\nimport { findPackageForPath, getQualifiedName, normalizePath, resolveDeclarationMaps } from \"#node-utils\";\nimport { type NormalizedPath } from \"#utils\";\nimport { relative } from \"node:path\";\nimport ts from \"typescript\";\n\nlet transientCount = 0;\nconst transientIds = new WeakMap<ts.Symbol, number>();\n\n// Don't use this directly, use Context.createSymbolId instead.\nexport function createSymbolIdImpl(symbol: ts.Symbol, declaration?: ts.Declaration) {\n    declaration ??= symbol.declarations?.[0];\n    const tsSource = declaration?.getSourceFile().fileName ?? \"\";\n    const sourceFileName = resolveDeclarationMaps(tsSource);\n    let packageName: string;\n    let packagePath: NormalizedPath;\n    const packageInfo = findPackageForPath(tsSource);\n    if (packageInfo) {\n        let packageDir: string;\n        [packageName, packageDir] = packageInfo;\n        packagePath = normalizePath(relative(packageDir, sourceFileName));\n    } else {\n        packageName = ReflectionSymbolId.UNKNOWN_PACKAGE;\n        packagePath = normalizePath(sourceFileName);\n    }\n\n    let qualifiedName: string;\n    if (symbol.declarations?.some(ts.isSourceFile)) {\n        qualifiedName = \"\";\n    } else {\n        qualifiedName = getQualifiedName(symbol, symbol.name);\n    }\n    const pos = declaration?.getStart() ?? Infinity;\n    let transientId = NaN;\n    if (symbol.flags & ts.SymbolFlags.Transient) {\n        transientId = transientIds.get(symbol) ?? ++transientCount;\n        transientIds.set(symbol, transientId);\n    }\n\n    const id = new ReflectionSymbolId({\n        packageName,\n        packagePath,\n        qualifiedName,\n    });\n    id.pos = pos;\n    id.transientId = transientId;\n    id.fileName = normalizePath(sourceFileName);\n\n    return id;\n}\n"
  },
  {
    "path": "src/lib/converter/index.ts",
    "content": "export type { CommentParserConfig } from \"./comments/index.js\";\nexport type { ExternalResolveResult, ExternalSymbolResolver } from \"./comments/linkResolver.js\";\nexport { Context } from \"./context.js\";\nexport { convertDefaultValue, convertExpression } from \"./convert-expression.js\";\nexport { Converter, type ConverterEvents } from \"./converter.js\";\n"
  },
  {
    "path": "src/lib/converter/jsdoc.ts",
    "content": "// Converter functions for JSDoc defined types\n// @typedef\n// @callback\n\nimport { ok } from \"assert\";\nimport ts from \"typescript\";\nimport {\n    DeclarationReflection,\n    IntrinsicType,\n    ReflectionKind,\n    ReflectionType,\n    SignatureReflection,\n} from \"../models/index.js\";\nimport type { Context } from \"./context.js\";\nimport { ConverterEvents } from \"./converter-events.js\";\nimport {\n    convertConstructSignatures,\n    convertParameterNodes,\n    convertTemplateParameterNodes,\n    createSignature,\n} from \"./factories/signature.js\";\nimport { i18n } from \"#utils\";\nimport { convertIndexSignatures } from \"./factories/index-signature.js\";\n\n// This is almost convertTypeAliasAsInterface, but unfortunately needs to be separate\n// due to type parameters being different in JSDoc comments\nfunction convertJsDocAliasAsInterface(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol: ts.Symbol | undefined,\n    declaration: ts.JSDocTypedefTag | ts.JSDocEnumTag,\n): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Interface,\n        symbol,\n        exportSymbol,\n    );\n    context.finalizeDeclarationReflection(reflection);\n    const rc = context.withScope(reflection);\n\n    const type = context.checker.getTypeAtLocation(declaration);\n\n    if (type.getFlags() & ts.TypeFlags.Union) {\n        context.logger.warn(\n            i18n.converting_union_as_interface(),\n            declaration,\n        );\n    }\n\n    // Interfaces have properties\n    for (const prop of type.getProperties()) {\n        context.converter.convertSymbol(rc, prop);\n    }\n\n    // And type parameters\n    convertTemplateParameters(rc, declaration.parent);\n\n    // And maybe call signatures\n    context.checker\n        .getSignaturesOfType(type, ts.SignatureKind.Call)\n        .forEach((sig) => createSignature(rc, ReflectionKind.CallSignature, sig, symbol));\n\n    // And maybe constructor signatures\n    convertConstructSignatures(rc, symbol);\n\n    // And finally, index signatures\n    convertIndexSignatures(rc, type);\n}\n\nexport function convertJsDocAlias(\n    context: Context,\n    symbol: ts.Symbol,\n    declaration: ts.JSDocTypedefTag | ts.JSDocEnumTag,\n    exportSymbol?: ts.Symbol,\n) {\n    if (\n        declaration.typeExpression &&\n        ts.isJSDocTypeLiteral(declaration.typeExpression)\n    ) {\n        convertJsDocInterface(context, declaration, symbol, exportSymbol);\n        return;\n    }\n\n    const comment = context.getJsDocComment(declaration);\n    if (comment?.hasModifier(\"@interface\")) {\n        return convertJsDocAliasAsInterface(\n            context,\n            symbol,\n            exportSymbol,\n            declaration,\n        );\n    }\n\n    // If the typedef tag is just referring to another type-space symbol, with no type parameters\n    // or appropriate forwarding type parameters, then we treat it as a re-export instead of creating\n    // a type alias with an import type.\n    const aliasedSymbol = getTypedefReExportTarget(context, declaration);\n    if (aliasedSymbol) {\n        context.converter.convertSymbol(\n            context,\n            aliasedSymbol,\n            exportSymbol ?? symbol,\n        );\n        return;\n    }\n\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.TypeAlias,\n        symbol,\n        exportSymbol,\n    );\n    reflection.comment = comment;\n\n    reflection.type = context.converter.convertType(\n        context.withScope(reflection),\n        declaration.typeExpression?.type,\n    );\n\n    convertTemplateParameters(\n        context.withScope(reflection),\n        declaration.parent,\n    );\n\n    context.finalizeDeclarationReflection(reflection);\n}\n\nexport function convertJsDocCallback(\n    context: Context,\n    symbol: ts.Symbol,\n    declaration: ts.JSDocCallbackTag,\n    exportSymbol?: ts.Symbol,\n) {\n    const alias = context.createDeclarationReflection(\n        ReflectionKind.TypeAlias,\n        symbol,\n        exportSymbol,\n    );\n    alias.comment = context.getJsDocComment(declaration);\n    context.finalizeDeclarationReflection(alias);\n\n    const ac = context.withScope(alias);\n\n    alias.type = convertJsDocSignature(ac, declaration.typeExpression);\n    convertTemplateParameters(ac, declaration.parent);\n}\n\nfunction convertJsDocInterface(\n    context: Context,\n    declaration: ts.JSDocTypedefTag | ts.JSDocEnumTag,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n) {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Interface,\n        symbol,\n        exportSymbol,\n    );\n    reflection.comment = context.getJsDocComment(declaration);\n    context.finalizeDeclarationReflection(reflection);\n\n    const rc = context.withScope(reflection);\n\n    const type = context.checker.getDeclaredTypeOfSymbol(symbol);\n    for (const s of type.getProperties()) {\n        context.converter.convertSymbol(rc, s);\n    }\n\n    convertTemplateParameters(rc, declaration.parent);\n}\n\nfunction convertJsDocSignature(context: Context, node: ts.JSDocSignature) {\n    const symbol = context.getSymbolAtLocation(node) ?? node.symbol;\n    const type = context.getTypeAtLocation(node);\n    if (!symbol || !type) {\n        return new IntrinsicType(\"Function\");\n    }\n\n    const reflection = new DeclarationReflection(\n        \"__type\",\n        ReflectionKind.TypeLiteral,\n        context.scope,\n    );\n    const rc = context.withScope(reflection);\n    context.registerReflection(reflection, symbol);\n    context.converter.trigger(\n        ConverterEvents.CREATE_DECLARATION,\n        context,\n        reflection,\n    );\n\n    const signature = new SignatureReflection(\n        \"__type\",\n        ReflectionKind.CallSignature,\n        reflection,\n    );\n    context.project.registerSymbolId(\n        signature,\n        context.createSymbolId(symbol, node),\n    );\n    context.registerReflection(signature, void 0);\n    const signatureCtx = rc.withScope(signature);\n\n    reflection.signatures = [signature];\n    signature.type = context.converter.convertType(\n        signatureCtx,\n        node.type?.typeExpression?.type,\n    );\n    signature.parameters = convertParameterNodes(\n        signatureCtx,\n        signature,\n        node.parameters,\n    );\n    signature.typeParameters = convertTemplateParameterNodes(\n        context.withScope(reflection),\n        node.typeParameters,\n    );\n\n    return new ReflectionType(reflection);\n}\n\nfunction convertTemplateParameters(context: Context, node: ts.JSDoc) {\n    ok(context.scope instanceof DeclarationReflection);\n    context.scope.typeParameters = convertTemplateParameterNodes(\n        context,\n        node.tags?.filter(ts.isJSDocTemplateTag),\n    );\n}\n\nfunction getTypedefReExportTarget(\n    context: Context,\n    declaration: ts.JSDocTypedefTag | ts.JSDocEnumTag,\n): ts.Symbol | undefined {\n    const typeExpression = declaration.typeExpression;\n    if (\n        !ts.isJSDocTypedefTag(declaration) ||\n        !typeExpression ||\n        ts.isJSDocTypeLiteral(typeExpression) ||\n        !ts.isImportTypeNode(typeExpression.type) ||\n        !typeExpression.type.qualifier ||\n        !ts.isIdentifier(typeExpression.type.qualifier)\n    ) {\n        return;\n    }\n\n    const targetSymbol = context.expectSymbolAtLocation(\n        typeExpression.type.qualifier,\n    );\n    const decl = targetSymbol.declarations?.[0];\n\n    if (\n        !decl ||\n        !(\n            ts.isTypeAliasDeclaration(decl) ||\n            ts.isInterfaceDeclaration(decl) ||\n            ts.isJSDocTypedefTag(decl) ||\n            ts.isJSDocCallbackTag(decl)\n        )\n    ) {\n        return;\n    }\n\n    const targetParams = ts.getEffectiveTypeParameterDeclarations(decl);\n    const localParams = ts.getEffectiveTypeParameterDeclarations(declaration);\n    const localArgs = typeExpression.type.typeArguments || [];\n\n    // If we have type parameters, ensure they are forwarding parameters with no transformations.\n    // This doesn't check constraints since they aren't checked in JSDoc types.\n    if (\n        targetParams.length !== localParams.length ||\n        localArgs.some(\n            (arg, i) =>\n                !ts.isTypeReferenceNode(arg) ||\n                !ts.isIdentifier(arg.typeName) ||\n                arg.typeArguments ||\n                localParams[i]?.name.text !== arg.typeName.text,\n        )\n    ) {\n        return;\n    }\n\n    return targetSymbol;\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/CategoryPlugin.ts",
    "content": "import assert from \"assert\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport {\n    Comment,\n    ContainerReflection,\n    type DeclarationReflection,\n    type DocumentReflection,\n    type ProjectReflection,\n    ReflectionCategory,\n    ReflectionKind,\n} from \"../../models/index.js\";\nimport { getSortFunction, Option } from \"../../utils/index.js\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\nimport { i18n } from \"#utils\";\nimport { isValidSortStrategy } from \"../../utils/sort.js\";\n\n/**\n * A handler that sorts and categorizes the found reflections in the resolving phase.\n *\n * The handler sets the ´category´ property of all reflections.\n */\nexport class CategoryPlugin extends ConverterComponent {\n    defaultSortFunction!: (\n        reflections: Array<DeclarationReflection | DocumentReflection>,\n    ) => void;\n\n    @Option(\"defaultCategory\")\n    accessor defaultCategory!: string;\n\n    @Option(\"categoryOrder\")\n    accessor categoryOrder!: string[];\n\n    @Option(\"categorizeByGroup\")\n    accessor categorizeByGroup!: boolean;\n\n    // For use in static methods\n    static defaultCategory = \"Other\";\n    static WEIGHTS: string[] = [];\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(\n            ConverterEvents.RESOLVE_END,\n            this.onEndResolve.bind(this),\n            -200,\n        );\n        this.application.on(\n            ApplicationEvents.REVIVE,\n            this.onRevive.bind(this),\n            -200,\n        );\n    }\n\n    private onRevive(project: ProjectReflection) {\n        this.setup();\n\n        this.categorize(project);\n        for (\n            const refl of project.getReflectionsByKind(\n                ReflectionKind.SomeModule,\n            )\n        ) {\n            assert(refl.isDeclaration());\n            this.categorize(refl);\n        }\n    }\n\n    /**\n     * Triggered when the converter begins converting a project.\n     */\n    private setup() {\n        this.defaultSortFunction = getSortFunction(this.application.options);\n\n        // Set up static properties\n        if (this.defaultCategory) {\n            CategoryPlugin.defaultCategory = this.defaultCategory;\n        }\n        CategoryPlugin.WEIGHTS = this.categoryOrder;\n    }\n\n    /**\n     * Triggered when the converter has finished resolving a project.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     */\n    private onEndResolve(context: Context) {\n        this.setup();\n\n        const project = context.project;\n        this.categorize(project);\n\n        for (const id in project.reflections) {\n            const reflection = project.reflections[id];\n            if (reflection instanceof ContainerReflection) {\n                this.categorize(reflection);\n            }\n        }\n    }\n\n    private categorize(obj: ContainerReflection) {\n        if (this.categorizeByGroup && obj.groups) {\n            this.groupCategorize(obj);\n        } else {\n            this.lumpCategorize(obj);\n        }\n    }\n\n    private groupCategorize(obj: ContainerReflection) {\n        if (!obj.groups || obj.groups.length === 0) {\n            return;\n        }\n        obj.groups.forEach((group) => {\n            if (group.categories) return;\n\n            group.categories = this.getReflectionCategories(\n                obj,\n                group.children,\n            );\n            if (group.categories.length > 1) {\n                group.categories.sort(CategoryPlugin.sortCatCallback);\n            } else if (\n                group.categories.length === 1 &&\n                group.categories[0].title === CategoryPlugin.defaultCategory\n            ) {\n                // no categories if everything is uncategorized\n                group.categories = undefined;\n            }\n        });\n    }\n\n    private lumpCategorize(obj: ContainerReflection) {\n        if (!obj.childrenIncludingDocuments || obj.categories) {\n            return;\n        }\n        obj.categories = this.getReflectionCategories(\n            obj,\n            obj.childrenIncludingDocuments,\n        );\n        if (obj.categories.length > 1) {\n            obj.categories.sort(CategoryPlugin.sortCatCallback);\n        } else if (\n            obj.categories.length === 1 &&\n            obj.categories[0].title === CategoryPlugin.defaultCategory\n        ) {\n            // no categories if everything is uncategorized\n            obj.categories = undefined;\n        }\n    }\n\n    /**\n     * Create a categorized representation of the given list of reflections.\n     *\n     * @param reflections  The reflections that should be categorized.\n     * @returns An array containing all children of the given reflection categorized\n     */\n    private getReflectionCategories(\n        parent: ContainerReflection,\n        reflections: Array<DeclarationReflection | DocumentReflection>,\n    ): ReflectionCategory[] {\n        const categories = new Map<string, ReflectionCategory>();\n\n        for (const child of reflections) {\n            const childCategories = CategoryPlugin.getCategories(child);\n            if (childCategories.size === 0) {\n                childCategories.add(CategoryPlugin.defaultCategory);\n            }\n\n            for (const childCat of childCategories) {\n                const category = categories.get(childCat);\n\n                if (category) {\n                    category.children.push(child);\n                } else {\n                    const cat = new ReflectionCategory(childCat);\n                    cat.children.push(child);\n                    categories.set(childCat, cat);\n                }\n            }\n        }\n\n        if (parent.comment) {\n            for (const tag of parent.comment.blockTags) {\n                if (tag.tag === \"@categoryDescription\") {\n                    const { header, body } = Comment.splitPartsToHeaderAndBody(\n                        tag.content,\n                    );\n                    const cat = categories.get(header);\n                    if (cat) {\n                        cat.description = body;\n                    } else {\n                        this.application.logger.warn(\n                            i18n\n                                .comment_for_0_includes_categoryDescription_for_1_but_no_child_in_group(\n                                    parent.getFriendlyFullName(),\n                                    header,\n                                ),\n                        );\n                    }\n                }\n            }\n        }\n\n        for (const cat of categories.values()) {\n            this.getSortFunction(parent)(cat.children);\n        }\n\n        return Array.from(categories.values());\n    }\n\n    getSortFunction(reflection: ContainerReflection) {\n        const tag = reflection.comment?.getTag(\"@sortStrategy\");\n        if (tag) {\n            const text = Comment.combineDisplayParts(tag.content);\n            // We don't need to warn about invalid strategies here because the group plugin\n            // runs first and will have already warned.\n            const strategies = text.split(/[,\\s]+/).filter(isValidSortStrategy);\n            return getSortFunction(this.application.options, strategies);\n        }\n\n        return this.defaultSortFunction;\n    }\n\n    /**\n     * Callback used to sort categories by name.\n     *\n     * @param a The left reflection to sort.\n     * @param b The right reflection to sort.\n     * @returns The sorting weight.\n     */\n    private static sortCatCallback(\n        a: ReflectionCategory,\n        b: ReflectionCategory,\n    ): number {\n        let aWeight = CategoryPlugin.WEIGHTS.indexOf(a.title);\n        let bWeight = CategoryPlugin.WEIGHTS.indexOf(b.title);\n        if (aWeight === -1 || bWeight === -1) {\n            let asteriskIndex = CategoryPlugin.WEIGHTS.indexOf(\"*\");\n            if (asteriskIndex === -1) {\n                asteriskIndex = CategoryPlugin.WEIGHTS.length;\n            }\n            if (aWeight === -1) {\n                aWeight = asteriskIndex;\n            }\n            if (bWeight === -1) {\n                bWeight = asteriskIndex;\n            }\n        }\n        if (aWeight === bWeight) {\n            return a.title > b.title ? 1 : -1;\n        }\n        return aWeight - bWeight;\n    }\n\n    static getCategories(\n        reflection: DeclarationReflection | DocumentReflection,\n    ) {\n        const categories = new Set<string>();\n        function discoverCategories(comment: Comment | undefined) {\n            if (!comment) return;\n            for (const tag of comment.blockTags) {\n                if (tag.tag === \"@category\") {\n                    categories.add(\n                        Comment.combineDisplayParts(tag.content).trim(),\n                    );\n                }\n            }\n        }\n\n        discoverCategories(reflection.comment);\n        if (reflection.isDeclaration()) {\n            for (const sig of reflection.getNonIndexSignatures()) {\n                discoverCategories(sig.comment);\n            }\n\n            if (reflection.type?.type === \"reflection\") {\n                discoverCategories(reflection.type.declaration.comment);\n                for (const sig of reflection.type.declaration.getNonIndexSignatures()) {\n                    discoverCategories(sig.comment);\n                }\n            }\n        }\n\n        if (reflection.isDocument() && \"category\" in reflection.frontmatter) {\n            categories.add(String(reflection.frontmatter[\"category\"]));\n        }\n\n        categories.delete(\"\");\n\n        return categories;\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/CommentPlugin.ts",
    "content": "import {\n    Comment,\n    CommentTag,\n    DeclarationReflection,\n    ParameterReflection,\n    type ReferenceType,\n    type Reflection,\n    ReflectionFlag,\n    ReflectionKind,\n    ReflectionType,\n    SignatureReflection,\n    type SourceReference,\n    type TypeParameterReflection,\n    type TypeVisitor,\n} from \"../../models/index.js\";\nimport { Option } from \"../../utils/index.js\";\nimport {\n    filterMap,\n    i18n,\n    type NormalizedPath,\n    partition,\n    removeIf,\n    removeIfPresent,\n    setIntersection,\n    type TagString,\n    unique,\n} from \"#utils\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\nimport { CategoryPlugin } from \"./CategoryPlugin.js\";\n\n/**\n * These tags are not useful to display in the generated documentation.\n * They should be ignored when parsing comments. Any relevant type information\n * (for JS users) will be consumed by TypeScript and need not be preserved\n * in the comment.\n *\n * Note that param/arg/argument/return/returns/this are not present.\n * These tags will have their type information stripped when parsing, but still\n * may provide useful information for documentation.\n */\nconst NEVER_RENDERED = [\n    \"@augments\",\n    \"@callback\",\n    \"@class\",\n    \"@constructor\",\n    \"@enum\",\n    \"@extends\",\n    \"@type\",\n    \"@typedef\",\n    \"@jsx\",\n] as const;\n\n// We might make this user configurable at some point, but for now,\n// this set is configured here.\nconst MUTUALLY_EXCLUSIVE_MODIFIERS = [\n    new Set<TagString>([\n        \"@alpha\",\n        \"@beta\",\n        \"@experimental\",\n        \"@internal\",\n        \"@public\",\n    ]),\n] as const;\n\n/**\n * Handles most behavior triggered by comments. `@group` and `@category` are handled by their respective plugins, but everything else is here.\n *\n * How it works today\n * ==================\n * During conversion:\n * - Handle visibility flags (`@private`, `@protected`. `@public`)\n * - Handle module renames (`@module`)\n * - Remove excluded tags & comment discovery tags (`@module`, `@packageDocumentation`)\n * - Copy comments for type parameters from the parent container (for classes/interfaces)\n *\n * Resolve begin:\n * - Remove hidden reflections\n *\n * Resolve:\n * - Apply `@label` tag\n * - Copy comments on signature containers to the signature if signatures don't already have a comment\n *   and then remove the comment on the container.\n * - Copy comments to parameters and type parameters (for signatures)\n * - Apply `@group` and `@category` tags\n *\n * Resolve end:\n * - Copy auto inherited comments from heritage clauses\n * - Handle `@inheritDoc`\n * - Resolve `@link` tags to point to target reflections\n *\n * How it should work\n * ==================\n * During conversion:\n * - Handle visibility flags (`@private`, `@protected`. `@public`)\n * - Handle module renames (`@module`)\n * - Remove excluded tags & comment discovery tags (`@module`, `@packageDocumentation`)\n *\n * Resolve begin (100):\n * - Copy auto inherited comments from heritage clauses\n * - Apply `@label` tag\n *\n * Resolve begin (75)\n * - Handle `@inheritDoc`\n *\n * Resolve begin (50)\n * - Copy comments on signature containers to the signature if signatures don't already have a comment\n *   and then remove the comment on the container.\n * - Copy comments for type parameters from the parent container (for classes/interfaces)\n *\n * Resolve begin (25)\n * - Remove hidden reflections\n *\n * Resolve:\n * - Copy comments to parameters and type parameters (for signatures)\n * - Apply `@group` and `@category` tags\n *\n * Resolve end:\n * - Resolve `@link` tags to point to target reflections\n */\nexport class CommentPlugin extends ConverterComponent {\n    @Option(\"excludeTags\")\n    accessor excludeTags!: TagString[];\n\n    @Option(\"cascadedModifierTags\")\n    accessor cascadedModifierTags!: TagString[];\n\n    @Option(\"excludeInternal\")\n    accessor excludeInternal!: boolean;\n\n    @Option(\"excludePrivate\")\n    accessor excludePrivate!: boolean;\n\n    @Option(\"excludePrivateClassFields\")\n    accessor excludePrivateClassFields!: boolean;\n\n    @Option(\"excludeProtected\")\n    accessor excludeProtected!: boolean;\n\n    @Option(\"excludeNotDocumented\")\n    accessor excludeNotDocumented!: boolean;\n\n    @Option(\"excludeCategories\")\n    accessor excludeCategories!: string[];\n\n    @Option(\"defaultCategory\")\n    accessor defaultCategory!: string;\n\n    @Option(\"suppressCommentWarningsInDeclarationFiles\")\n    accessor suppressCommentWarningsInDeclarationFiles!: boolean;\n\n    private _excludeKinds: number | undefined;\n    private get excludeNotDocumentedKinds(): number {\n        this._excludeKinds ??= this.application.options\n            .getValue(\"excludeNotDocumentedKinds\")\n            .reduce((a, b) => a | ReflectionKind[b], 0);\n        return this._excludeKinds;\n    }\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(\n            ConverterEvents.CREATE_DECLARATION,\n            this.onDeclaration.bind(this),\n        );\n        this.owner.on(\n            ConverterEvents.CREATE_SIGNATURE,\n            this.onDeclaration.bind(this),\n        );\n        this.owner.on(\n            ConverterEvents.CREATE_TYPE_PARAMETER,\n            this.onCreateTypeParameter.bind(this),\n        );\n        this.owner.on(\n            ConverterEvents.RESOLVE_BEGIN,\n            this.onBeginResolve.bind(this),\n        );\n        this.owner.on(ConverterEvents.RESOLVE, this.onResolve.bind(this));\n        this.owner.on(ConverterEvents.END, () => {\n            this._excludeKinds = undefined;\n        });\n    }\n\n    /**\n     * Apply all comment tag modifiers to the given reflection.\n     *\n     * @param reflection  The reflection the modifiers should be applied to.\n     * @param comment  The comment that should be searched for modifiers.\n     */\n    private applyModifiers(reflection: Reflection, comment: Comment) {\n        if (reflection.kindOf(ReflectionKind.SomeModule)) {\n            comment.removeModifier(\"@namespace\");\n        }\n\n        if (reflection.kindOf(ReflectionKind.Interface)) {\n            comment.removeModifier(\"@interface\");\n        }\n\n        if (comment.hasModifier(\"@abstract\")) {\n            if (reflection.kindOf(ReflectionKind.SomeSignature)) {\n                reflection.parent!.setFlag(ReflectionFlag.Abstract);\n            } else {\n                reflection.setFlag(ReflectionFlag.Abstract);\n            }\n            comment.removeModifier(\"@abstract\");\n        }\n\n        if (comment.hasModifier(\"@private\")) {\n            reflection.setFlag(ReflectionFlag.Private);\n            if (reflection.kindOf(ReflectionKind.CallSignature)) {\n                reflection.parent?.setFlag(ReflectionFlag.Private);\n            }\n            comment.removeModifier(\"@private\");\n        }\n\n        if (comment.hasModifier(\"@protected\")) {\n            reflection.setFlag(ReflectionFlag.Protected);\n            if (reflection.kindOf(ReflectionKind.CallSignature)) {\n                reflection.parent?.setFlag(ReflectionFlag.Protected);\n            }\n            comment.removeModifier(\"@protected\");\n        }\n\n        if (comment.hasModifier(\"@public\")) {\n            reflection.setFlag(ReflectionFlag.Public);\n            if (reflection.kindOf(ReflectionKind.CallSignature)) {\n                reflection.parent?.setFlag(ReflectionFlag.Public);\n            }\n            comment.removeModifier(\"@public\");\n        }\n\n        if (comment.hasModifier(\"@readonly\")) {\n            const target = reflection.kindOf(ReflectionKind.GetSignature)\n                ? reflection.parent!\n                : reflection;\n            target.setFlag(ReflectionFlag.Readonly);\n            comment.removeModifier(\"@readonly\");\n        }\n\n        if (\n            comment.hasModifier(\"@event\") ||\n            comment.hasModifier(\"@eventProperty\")\n        ) {\n            comment.blockTags.push(\n                new CommentTag(\"@group\", [{ kind: \"text\", text: \"Events\" }]),\n            );\n            comment.removeModifier(\"@event\");\n            comment.removeModifier(\"@eventProperty\");\n        }\n\n        if (\n            reflection.kindOf(\n                ReflectionKind.Project | ReflectionKind.SomeModule,\n            )\n        ) {\n            comment.removeTags(\"@module\");\n            comment.removeModifier(\"@packageDocumentation\");\n        }\n    }\n\n    /**\n     * Triggered when the converter has created a type parameter reflection.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     * @param reflection  The reflection that is currently processed.\n     */\n    private onCreateTypeParameter(\n        _context: Context,\n        reflection: TypeParameterReflection,\n    ) {\n        if (reflection.comment) return;\n\n        const comment = reflection.parent?.comment;\n        if (comment) {\n            let tag = comment.getIdentifiedTag(reflection.name, \"@typeParam\");\n            if (!tag) {\n                tag = comment.getIdentifiedTag(reflection.name, \"@template\");\n            }\n            if (!tag) {\n                tag = comment.getIdentifiedTag(\n                    `<${reflection.name}>`,\n                    \"@param\",\n                );\n            }\n            if (!tag) {\n                tag = comment.getIdentifiedTag(reflection.name, \"@param\");\n            }\n            if (tag) {\n                reflection.comment = new Comment(tag.content);\n                reflection.comment.sourcePath = comment.sourcePath;\n                removeIfPresent(comment.blockTags, tag);\n                return;\n            }\n        }\n\n        // #3031 if this is a class constructor, also check for type parameters\n        // that live on the class itself and potentially copy their comment.\n        if (\n            reflection.parent?.kindOf(ReflectionKind.ConstructorSignature) &&\n            reflection.parent.parent?.kindOf(ReflectionKind.Constructor)\n        ) {\n            const cls = reflection.parent.parent.parent as DeclarationReflection;\n            const typeParam = cls.typeParameters?.find(param => param.name === reflection.name);\n            if (typeParam?.comment) {\n                reflection.comment = typeParam.comment.clone();\n            }\n        }\n    }\n\n    /**\n     * Triggered when the converter has created a declaration or signature reflection.\n     *\n     * Invokes the comment parser.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     * @param reflection  The reflection that is currently processed.\n     * @param node  The node that is currently processed if available.\n     */\n    private onDeclaration(_context: Context, reflection: Reflection) {\n        this.cascadeModifiers(reflection);\n\n        const comment = reflection.comment;\n        if (!comment) return;\n\n        if (reflection.kindOf(ReflectionKind.SomeModule)) {\n            const tag = comment.getTag(\"@module\");\n            if (tag) {\n                // If no name is specified, this is a flag to mark a comment as a module comment\n                // and should not result in a reflection rename.\n                const newName = Comment.combineDisplayParts(tag.content).trim();\n                if (newName.length && !newName.includes(\"\\n\")) {\n                    reflection.name = newName;\n                }\n                removeIfPresent(comment.blockTags, tag);\n            }\n        }\n\n        this.applyModifiers(reflection, comment);\n        this.removeExcludedTags(comment);\n    }\n\n    /**\n     * Triggered when the converter begins resolving a project.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     */\n    private onBeginResolve(context: Context) {\n        if (context.project.comment) {\n            this.applyModifiers(context.project, context.project.comment);\n            this.removeExcludedTags(context.project.comment);\n        }\n\n        const project = context.project;\n        const reflections = Object.values(project.reflections);\n\n        // Remove hidden reflections\n        const hidden = new Set<Reflection>();\n        for (const ref of reflections) {\n            if (ref.kindOf(ReflectionKind.Accessor) && ref.flags.isReadonly) {\n                const decl = ref as DeclarationReflection;\n                if (decl.setSignature) {\n                    hidden.add(decl.setSignature);\n                }\n                // Clear flag set by @readonly since it shouldn't be rendered.\n                ref.setFlag(ReflectionFlag.Readonly, false);\n            }\n\n            if (this.isHidden(ref)) {\n                hidden.add(ref);\n            }\n        }\n        hidden.forEach((reflection) => project.removeReflection(reflection));\n\n        // remove functions with empty signatures after their signatures have been removed\n        const [allRemoved, someRemoved] = partition(\n            unique(\n                filterMap(hidden, (reflection) =>\n                    reflection.parent?.kindOf(ReflectionKind.SignatureContainer)\n                        ? reflection.parent\n                        : void 0) as DeclarationReflection[],\n            ),\n            (method) => method.getNonIndexSignatures().length === 0,\n        );\n        allRemoved.forEach((reflection) => {\n            project.removeReflection(reflection);\n        });\n        someRemoved.forEach((reflection) => {\n            reflection.sources = reflection\n                .getNonIndexSignatures()\n                .flatMap<SourceReference>((s) => s.sources ?? []);\n        });\n    }\n\n    /**\n     * Triggered when the converter resolves a reflection.\n     *\n     * Cleans up comment tags related to signatures like `@param` or `@returns`\n     * and moves their data to the corresponding parameter reflections.\n     *\n     * This hook also copies over the comment of function implementations to their\n     * signatures.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     * @param reflection  The reflection that is currently resolved.\n     */\n    private onResolve(context: Context, reflection: Reflection) {\n        if (reflection.comment) {\n            if (\n                reflection.comment.label &&\n                !/[A-Z_][A-Z0-9_]/.test(reflection.comment.label) &&\n                !this.suppressCommentWarnings(reflection.comment)\n            ) {\n                context.logger.warn(\n                    i18n.label_0_for_1_cannot_be_referenced(\n                        reflection.comment.label,\n                        reflection.getFriendlyFullName(),\n                    ),\n                );\n            }\n\n            for (const group of MUTUALLY_EXCLUSIVE_MODIFIERS) {\n                const intersect = setIntersection(\n                    group,\n                    reflection.comment.modifierTags,\n                );\n                if (intersect.size > 1 && !this.suppressCommentWarnings(reflection.comment)) {\n                    const [a, b] = intersect;\n                    context.logger.warn(\n                        i18n.modifier_tag_0_is_mutually_exclusive_with_1_in_comment_for_2(\n                            a,\n                            b,\n                            reflection.getFriendlyFullName(),\n                        ),\n                    );\n                }\n            }\n\n            mergeSeeTags(reflection.comment);\n            movePropertyTags(reflection.comment, reflection);\n\n            // Unlike other modifiers, this one has to wait until resolution to be removed\n            // as it needs to remain present so that it can be checked when `@hidden` tags are\n            // being processed.\n            if (reflection.kindOf(ReflectionKind.Class)) {\n                reflection.comment.removeModifier(\"@hideconstructor\");\n            }\n\n            // Similar story for this one, if a namespace is merged the tag should\n            // still apply when merging the second declaration of the namespace\n            reflection.comment.removeModifier(\"@primaryExport\");\n        }\n\n        if (\n            (reflection instanceof DeclarationReflection ||\n                reflection instanceof ParameterReflection) &&\n            reflection.comment\n        ) {\n            let sigs: SignatureReflection[] = [];\n            if (reflection.type instanceof ReflectionType) {\n                sigs = reflection.type.declaration.getNonIndexSignatures();\n            } else if (reflection instanceof DeclarationReflection) {\n                sigs = reflection.getNonIndexSignatures();\n            }\n\n            // For variables and properties, the symbol might own the comment but we might also\n            // have @param and @returns comments for an owned signature. Only do this if there is\n            // exactly one signature as otherwise we have no hope of doing validation right.\n            if (sigs.length === 1 && !sigs[0].comment) {\n                this.moveSignatureParamComments(sigs[0], reflection.comment);\n                const returnsTag = reflection.comment.getTag(\"@returns\");\n                if (returnsTag) {\n                    sigs[0].comment = new Comment();\n                    sigs[0].comment.sourcePath = reflection.comment.sourcePath;\n                    sigs[0].comment.blockTags.push(returnsTag);\n                    reflection.comment.removeTags(\"@returns\");\n                }\n            }\n\n            // Any cascaded tags will show up twice, once on this and once on our signatures\n            // This is completely redundant, so remove them from the wrapping function.\n            if (sigs.length && reflection.type?.type !== \"reflection\") {\n                for (const mod of this.cascadedModifierTags) {\n                    reflection.comment.modifierTags.delete(mod);\n                }\n            }\n        }\n\n        if (reflection instanceof SignatureReflection) {\n            this.moveSignatureParamComments(reflection);\n        }\n    }\n\n    private moveSignatureParamComments(\n        signature: SignatureReflection,\n        comment = signature.comment,\n    ) {\n        if (!comment) return;\n\n        const unusedCommentParams = comment.blockTags.filter(\n            (tag) =>\n                tag.tag === \"@param\" && tag.name && !tag.name.includes(\".\") &&\n                !signature.parameters?.some(p => p.name === tag.name),\n        );\n\n        signature.parameters?.forEach((parameter) => {\n            if (parameter.name === \"__namedParameters\" && unusedCommentParams.length) {\n                parameter.name = unusedCommentParams[0].name!;\n                unusedCommentParams.splice(0, 1);\n            }\n\n            const tag = comment.getIdentifiedTag(parameter.name, \"@param\");\n\n            if (tag) {\n                parameter.comment = new Comment(Comment.cloneDisplayParts(tag.content));\n                parameter.comment.sourcePath = comment.sourcePath;\n            } else if (parameter.name === \"this\") {\n                const thisTag = comment.getTag(\"@this\");\n                if (thisTag) {\n                    parameter.comment = new Comment(Comment.cloneDisplayParts(thisTag.content));\n                    parameter.comment.sourcePath = comment.sourcePath;\n                }\n            }\n        });\n\n        for (const parameter of signature.typeParameters || []) {\n            const tag = comment.getIdentifiedTag(parameter.name, \"@typeParam\") ||\n                comment.getIdentifiedTag(parameter.name, \"@template\") ||\n                comment.getIdentifiedTag(`<${parameter.name}>`, \"@param\");\n            if (tag) {\n                parameter.comment = new Comment(\n                    Comment.cloneDisplayParts(tag.content),\n                );\n                parameter.comment.sourcePath = comment.sourcePath;\n            }\n        }\n\n        this.validateParamTags(signature, comment, signature.parameters || []);\n\n        comment.removeTags(\"@this\");\n        comment.removeTags(\"@param\");\n        comment.removeTags(\"@typeParam\");\n        comment.removeTags(\"@template\");\n    }\n\n    private removeExcludedTags(comment: Comment) {\n        for (const tag of NEVER_RENDERED) {\n            comment.removeTags(tag);\n            comment.removeModifier(tag);\n        }\n        for (const tag of this.excludeTags) {\n            comment.removeTags(tag);\n            comment.removeModifier(tag);\n        }\n    }\n\n    private cascadeModifiers(reflection: Reflection) {\n        const parentComment = reflection.parent?.comment;\n        if (!parentComment || reflection.kindOf(ReflectionKind.TypeLiteral)) {\n            return;\n        }\n\n        const childMods = reflection.comment?.modifierTags ?? new Set();\n\n        for (const mod of this.cascadedModifierTags) {\n            if (parentComment.hasModifier(mod)) {\n                const exclusiveSet = MUTUALLY_EXCLUSIVE_MODIFIERS.find((tags) => tags.has(mod));\n\n                if (\n                    !exclusiveSet ||\n                    Array.from(exclusiveSet).every((tag) => !childMods.has(tag))\n                ) {\n                    reflection.comment ||= new Comment();\n                    reflection.comment.modifierTags.add(mod);\n                }\n            }\n        }\n    }\n\n    /**\n     * Determines whether or not a reflection has been hidden\n     *\n     * @param reflection Reflection to check if hidden\n     */\n    private isHidden(reflection: Reflection): boolean {\n        const comment = reflection.comment;\n\n        if (\n            reflection.flags.hasFlag(ReflectionFlag.Private) &&\n            this.excludePrivate\n        ) {\n            return true;\n        }\n\n        // #3017 this isn't quite right as it may incorrectly detect\n        // private members named with a hash which aren't actually private\n        // class fields (e.g. class Foo { \"#hash\" = 1 })\n        // We can't fix this without storing more information about the name,\n        // which I'm going to put off until #3015 is done.\n        if (\n            reflection.flags.hasFlag(ReflectionFlag.Private) &&\n            reflection.name.startsWith(\"#\") &&\n            this.excludePrivateClassFields\n        ) {\n            return true;\n        }\n\n        if (\n            reflection.flags.hasFlag(ReflectionFlag.Protected) &&\n            this.excludeProtected\n        ) {\n            return true;\n        }\n\n        if (this.excludedByCategory(reflection)) {\n            return true;\n        }\n\n        if (\n            reflection.kindOf(\n                ReflectionKind.ConstructorSignature |\n                    ReflectionKind.Constructor,\n            )\n        ) {\n            if (comment?.hasModifier(\"@hideconstructor\")) return true;\n            const cls = reflection.parent?.kindOf(ReflectionKind.Class)\n                ? reflection.parent\n                : reflection.parent?.parent?.kindOf(ReflectionKind.Class)\n                ? reflection.parent.parent\n                : undefined;\n            if (cls?.comment?.hasModifier(\"@hideconstructor\")) {\n                return true;\n            }\n        }\n\n        if (!comment) {\n            // We haven't moved comments from the parent for signatures without a direct\n            // comment, so don't exclude those due to not being documented.\n            if (\n                reflection.kindOf(\n                    ReflectionKind.CallSignature |\n                        ReflectionKind.ConstructorSignature,\n                ) &&\n                reflection.parent?.comment\n            ) {\n                return false;\n            }\n\n            if (this.excludeNotDocumented) {\n                // Don't let excludeNotDocumented remove parameters.\n                if (\n                    !(reflection instanceof DeclarationReflection) &&\n                    !(reflection instanceof SignatureReflection)\n                ) {\n                    return false;\n                }\n\n                if (!reflection.kindOf(this.excludeNotDocumentedKinds)) {\n                    return false;\n                }\n\n                // excludeNotDocumented should hide a module only if it has no visible children\n                if (reflection.kindOf(ReflectionKind.SomeModule)) {\n                    if (!(reflection as DeclarationReflection).children) {\n                        return true;\n                    }\n                    return (\n                        reflection as DeclarationReflection\n                    ).children!.every((child) => this.isHidden(child));\n                }\n\n                // signature containers should only be hidden if all their signatures are hidden\n                if (reflection.kindOf(ReflectionKind.SignatureContainer)) {\n                    return (reflection as DeclarationReflection)\n                        .getAllSignatures()\n                        .every((child) => this.isHidden(child));\n                }\n\n                // excludeNotDocumented should never hide parts of \"type\" reflections\n                return inTypeLiteral(reflection) === false;\n            }\n            return false;\n        }\n\n        const isHidden = comment.hasModifier(\"@hidden\") ||\n            comment.hasModifier(\"@ignore\") ||\n            (comment.hasModifier(\"@internal\") && this.excludeInternal);\n\n        if (\n            !isHidden &&\n            reflection.kindOf(ReflectionKind.ContainsCallSignatures)\n        ) {\n            return (reflection as DeclarationReflection)\n                .getNonIndexSignatures()\n                .every((sig) => this.isHidden(sig));\n        }\n\n        return isHidden;\n    }\n\n    private excludedByCategory(reflection: Reflection): boolean {\n        const excludeCategories = this.excludeCategories;\n        let target: DeclarationReflection | undefined;\n        if (reflection instanceof DeclarationReflection) {\n            target = reflection;\n        } else if (reflection instanceof SignatureReflection) {\n            target = reflection.parent;\n        }\n        if (!target || !excludeCategories.length) return false;\n        const categories = CategoryPlugin.getCategories(target);\n        if (categories.size === 0) {\n            categories.add(this.defaultCategory);\n        }\n        return excludeCategories.some((cat) => categories.has(cat));\n    }\n\n    private validateParamTags(\n        signature: SignatureReflection,\n        comment: Comment,\n        params: ParameterReflection[],\n    ) {\n        const paramTags = comment.blockTags.filter(\n            (tag) => tag.tag === \"@param\",\n        );\n\n        removeIf(paramTags, (tag) => params.some((param) => param.name === tag.name));\n\n        moveNestedParamTags(/* in-out */ paramTags, params, comment.sourcePath);\n\n        if (!comment.inheritedFromParentDeclaration && !this.suppressCommentWarnings(comment)) {\n            for (const tag of paramTags) {\n                this.application.logger.warn(\n                    i18n.signature_0_has_unused_param_with_name_1(\n                        signature.getFriendlyFullName(),\n                        tag.name ?? \"(missing)\",\n                    ),\n                );\n            }\n        }\n    }\n\n    private suppressCommentWarnings(comment: Comment) {\n        return this.suppressCommentWarningsInDeclarationFiles &&\n            /\\.d\\.(ts|mts|cts)$/.test(comment.sourcePath || \"\");\n    }\n}\n\nfunction inTypeLiteral(refl: Reflection | undefined) {\n    while (refl) {\n        if (refl.kind === ReflectionKind.TypeLiteral) {\n            return true;\n        }\n        refl = refl.parent;\n    }\n    return false;\n}\n\nfunction validHighlightedName(ref: ReferenceType, name: string) {\n    const refl = ref.reflection;\n    // Assume external types are documented properly\n    if (!refl) return true;\n\n    // If it is a direct child, it is valid.\n    if (refl.getChildByName([name])) return true;\n\n    // Or if it is the child of the referenced reflection's type\n    if (refl.isDeclaration() && refl.type?.type === \"reflection\") {\n        if (refl.type.declaration.getChildByName([name])) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n// Moves tags like `@param foo.bar docs for bar` into the `bar` property of the `foo` parameter.\nfunction moveNestedParamTags(\n    /* in-out */ paramTags: CommentTag[],\n    parameters: ParameterReflection[],\n    sourcePath: NormalizedPath | undefined,\n) {\n    const used = new Set<number>();\n\n    for (const param of parameters) {\n        const visitor: Partial<TypeVisitor> = {\n            reflection(target) {\n                const tags = paramTags.filter((t) => t.name?.startsWith(`${param.name}.`));\n                for (const tag of tags) {\n                    const path = tag.name!.split(\".\");\n                    path.shift();\n                    const child = target.declaration.getChildOrTypePropertyByName(path);\n\n                    if (child && !child.comment) {\n                        child.comment = new Comment(\n                            Comment.cloneDisplayParts(tag.content),\n                        );\n                        child.comment.sourcePath = sourcePath;\n                        used.add(paramTags.indexOf(tag));\n                    }\n                }\n            },\n            // #1876, also do this for unions/intersections.\n            union(u) {\n                u.types.forEach((t) => t.visit(visitor));\n            },\n            intersection(i) {\n                i.types.forEach((t) => t.visit(visitor));\n            },\n            // #2147, support highlighting parts of a referenced type\n            reference(ref) {\n                for (let i = 0; i < paramTags.length; ++i) {\n                    const tag = paramTags[i];\n                    if (tag.name?.startsWith(`${param.name}.`)) {\n                        const childName = tag.name.substring(\n                            param.name.length + 1,\n                        );\n\n                        if (!validHighlightedName(ref, childName)) {\n                            continue;\n                        }\n\n                        ref.highlightedProperties ??= new Map();\n                        ref.highlightedProperties.set(\n                            childName,\n                            paramTags[i].content,\n                        );\n                        used.add(i);\n                    }\n                }\n            },\n        };\n\n        param.type?.visit(visitor);\n    }\n\n    const toRemove = Array.from(used)\n        .sort((a, b) => a - b)\n        .reverse();\n\n    for (const index of toRemove) {\n        paramTags.splice(index, 1);\n    }\n}\n\nfunction movePropertyTags(comment: Comment, container: Reflection) {\n    const propTags = comment.blockTags.filter(\n        (tag) => tag.tag === \"@prop\" || tag.tag === \"@property\",\n    );\n    comment.removeTags(\"@prop\");\n    comment.removeTags(\"@property\");\n\n    for (const prop of propTags) {\n        if (!prop.name) continue;\n\n        const child = container.getChildByName(prop.name);\n        if (child) {\n            child.comment = new Comment(\n                Comment.cloneDisplayParts(prop.content),\n            );\n            child.comment.sourcePath = comment.sourcePath;\n\n            if (child instanceof DeclarationReflection && child.signatures) {\n                for (const sig of child.signatures) {\n                    sig.comment = new Comment(\n                        Comment.cloneDisplayParts(prop.content),\n                    );\n                    sig.comment.sourcePath = comment.sourcePath;\n                }\n            }\n        }\n    }\n}\n\nfunction mergeSeeTags(comment: Comment) {\n    const see = comment.getTags(\"@see\");\n\n    if (see.length < 2) return;\n\n    const index = comment.blockTags.indexOf(see[0]);\n    comment.removeTags(\"@see\");\n\n    see[0].content = see.flatMap((part) => [\n        { kind: \"text\", text: \" - \" },\n        ...part.content,\n        { kind: \"text\", text: \"\\n\" },\n    ]);\n\n    comment.blockTags.splice(index, 0, see[0]);\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/GroupPlugin.ts",
    "content": "import {\n    ContainerReflection,\n    type DeclarationReflection,\n    type DocumentReflection,\n    type ProjectReflection,\n    ReferenceReflection,\n    ReflectionKind,\n} from \"../../models/index.js\";\nimport { ReflectionGroup } from \"../../models/ReflectionGroup.js\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { getSortFunction, isValidSortStrategy, SORT_STRATEGIES } from \"../../utils/sort.js\";\nimport { Option, type SortStrategy } from \"../../utils/index.js\";\nimport { Comment } from \"../../models/index.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport assert from \"assert\";\nimport { i18n, partition } from \"#utils\";\n\n// Same as the defaultKindSortOrder in sort.ts\nconst defaultGroupOrder = [\n    ReflectionKind.Document,\n    // project is never a child so never added to a group\n    ReflectionKind.Module,\n    ReflectionKind.Namespace,\n    ReflectionKind.Enum,\n    ReflectionKind.EnumMember,\n    ReflectionKind.Class,\n    ReflectionKind.Interface,\n    ReflectionKind.TypeAlias,\n\n    ReflectionKind.Constructor,\n    ReflectionKind.Property,\n    ReflectionKind.Variable,\n    ReflectionKind.Function,\n    ReflectionKind.Accessor,\n    ReflectionKind.Method,\n\n    ReflectionKind.Reference,\n    // others are never added to groups\n];\n\n/**\n * A handler that sorts and groups the found reflections in the resolving phase.\n *\n * The handler sets the `groups` property of all container reflections.\n */\nexport class GroupPlugin extends ConverterComponent {\n    defaultSortFunction!: (\n        reflections: Array<DeclarationReflection | DocumentReflection>,\n    ) => void;\n\n    @Option(\"groupOrder\")\n    accessor groupOrder!: string[];\n\n    @Option(\"sortEntryPoints\")\n    accessor sortEntryPoints!: boolean;\n\n    @Option(\"groupReferencesByType\")\n    accessor groupReferencesByType!: boolean;\n\n    static WEIGHTS: string[] = [];\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(\n            ConverterEvents.RESOLVE_END,\n            this.onEndResolve.bind(this),\n            -100,\n        );\n        this.application.on(\n            ApplicationEvents.REVIVE,\n            this.onRevive.bind(this),\n            -100,\n        );\n    }\n\n    /**\n     * Triggered when the converter has finished resolving a project.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     */\n    private onEndResolve(context: Context) {\n        this.setup();\n        this.group(context.project);\n\n        for (const id in context.project.reflections) {\n            const reflection = context.project.reflections[id];\n            if (reflection instanceof ContainerReflection) {\n                this.group(reflection);\n            }\n        }\n    }\n\n    private onRevive(project: ProjectReflection) {\n        this.setup();\n        this.group(project);\n        for (\n            const refl of project.getReflectionsByKind(\n                ReflectionKind.SomeModule,\n            )\n        ) {\n            assert(refl.isDeclaration());\n            this.group(refl);\n        }\n    }\n\n    private setup() {\n        this.defaultSortFunction = getSortFunction(this.application.options);\n        GroupPlugin.WEIGHTS = this.groupOrder;\n        if (GroupPlugin.WEIGHTS.length === 0) {\n            GroupPlugin.WEIGHTS = defaultGroupOrder.map((kind) => ReflectionKind.pluralString(kind));\n        }\n    }\n\n    private group(reflection: ContainerReflection) {\n        const sortFunction = this.getSortFunction(reflection);\n\n        if (reflection.childrenIncludingDocuments && !reflection.groups) {\n            if (reflection.children) {\n                if (\n                    this.sortEntryPoints ||\n                    !reflection.children.some((c) => c.kindOf(ReflectionKind.Module))\n                ) {\n                    sortFunction(reflection.children);\n                    sortFunction(reflection.documents || []);\n                    sortFunction(reflection.childrenIncludingDocuments);\n                }\n            } else if (reflection.documents) {\n                sortFunction(reflection.documents);\n                sortFunction(reflection.childrenIncludingDocuments);\n            }\n\n            if (reflection.comment?.hasModifier(\"@disableGroups\")) {\n                return;\n            }\n            reflection.groups = this.getReflectionGroups(\n                reflection,\n                reflection.childrenIncludingDocuments,\n            );\n        }\n    }\n\n    /**\n     * Extracts the groups for a given reflection.\n     *\n     * @privateRemarks\n     * If you change this, also update extractCategories in CategoryPlugin accordingly.\n     */\n    getGroups(reflection: DeclarationReflection | DocumentReflection) {\n        return GroupPlugin.getGroups(\n            reflection,\n            this.groupReferencesByType,\n        );\n    }\n\n    static getGroups(\n        reflection: DeclarationReflection | DocumentReflection,\n        groupReferencesByType: boolean,\n    ) {\n        const groups = new Set<string>();\n        function extractGroupTags(comment: Comment | undefined) {\n            if (!comment) return;\n            for (const tag of comment.blockTags) {\n                if (tag.tag === \"@group\") {\n                    groups.add(Comment.combineDisplayParts(tag.content).trim());\n                }\n            }\n        }\n\n        if (reflection.isDeclaration()) {\n            extractGroupTags(reflection.comment);\n            for (const sig of reflection.getNonIndexSignatures()) {\n                extractGroupTags(sig.comment);\n            }\n\n            if (reflection.type?.type === \"reflection\") {\n                extractGroupTags(reflection.type.declaration.comment);\n                for (const sig of reflection.type.declaration.getNonIndexSignatures()) {\n                    extractGroupTags(sig.comment);\n                }\n            }\n        }\n\n        if (reflection.isDocument() && \"group\" in reflection.frontmatter) {\n            groups.add(String(reflection.frontmatter[\"group\"]));\n        }\n\n        groups.delete(\"\");\n        if (groups.size === 0) {\n            if (\n                reflection instanceof ReferenceReflection &&\n                groupReferencesByType\n            ) {\n                groups.add(\n                    ReflectionKind.pluralString(\n                        reflection.getTargetReflectionDeep().kind,\n                    ),\n                );\n            } else {\n                groups.add(\n                    ReflectionKind.pluralString(reflection.kind),\n                );\n            }\n        }\n\n        return groups;\n    }\n\n    /**\n     * Create a grouped representation of the given list of reflections.\n     *\n     * Reflections are grouped by kind and sorted by weight and name.\n     *\n     * @param reflections  The reflections that should be grouped.\n     * @returns An array containing all children of the given reflection grouped by their kind.\n     */\n    getReflectionGroups(\n        parent: ContainerReflection,\n        reflections: Array<DeclarationReflection | DocumentReflection>,\n    ): ReflectionGroup[] {\n        const groups = new Map<string, ReflectionGroup>();\n\n        reflections.forEach((child) => {\n            for (const name of this.getGroups(child)) {\n                let group = groups.get(name);\n                if (!group) {\n                    group = new ReflectionGroup(name, child);\n                    groups.set(name, group);\n                }\n\n                group.children.push(child);\n            }\n        });\n\n        if (parent.comment) {\n            for (const tag of parent.comment.blockTags) {\n                if (tag.tag === \"@groupDescription\") {\n                    const { header, body } = Comment.splitPartsToHeaderAndBody(\n                        tag.content,\n                    );\n                    const cat = groups.get(header);\n                    if (cat) {\n                        cat.description = body;\n                    } else {\n                        this.application.logger.warn(\n                            i18n.comment_for_0_includes_groupDescription_for_1_but_no_child_in_group(\n                                parent.getFriendlyFullName(),\n                                header,\n                            ),\n                        );\n                    }\n                }\n            }\n        }\n\n        return Array.from(groups.values()).sort(GroupPlugin.sortGroupCallback);\n    }\n\n    getSortFunction(reflection: ContainerReflection) {\n        const tag = reflection.comment?.getTag(\"@sortStrategy\");\n        if (tag) {\n            const text = Comment.combineDisplayParts(tag.content);\n            const strategies = text.split(/[,\\s]+/);\n            const [valid, invalid] = partition(strategies, isValidSortStrategy);\n            for (const inv of invalid) {\n                this.application.logger.warn(i18n.comment_for_0_specifies_1_as_sort_strategy_but_only_2_is_valid(\n                    reflection.getFriendlyFullName(),\n                    inv,\n                    SORT_STRATEGIES.join(\"\\n\\t\"),\n                ));\n            }\n            return getSortFunction(this.application.options, valid as SortStrategy[]);\n        }\n\n        return this.defaultSortFunction;\n    }\n\n    /**\n     * Callback used to sort groups by name.\n     */\n    static sortGroupCallback(a: ReflectionGroup, b: ReflectionGroup): number {\n        let aWeight = GroupPlugin.WEIGHTS.indexOf(a.title);\n        let bWeight = GroupPlugin.WEIGHTS.indexOf(b.title);\n        if (aWeight === -1 || bWeight === -1) {\n            let asteriskIndex = GroupPlugin.WEIGHTS.indexOf(\"*\");\n            if (asteriskIndex === -1) {\n                asteriskIndex = GroupPlugin.WEIGHTS.length;\n            }\n            if (aWeight === -1) {\n                aWeight = asteriskIndex;\n            }\n            if (bWeight === -1) {\n                bWeight = asteriskIndex;\n            }\n        }\n        if (aWeight === bWeight) {\n            return a.title > b.title ? 1 : -1;\n        }\n        return aWeight - bWeight;\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/ImplementsPlugin.ts",
    "content": "import ts from \"typescript\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport {\n    type ContainerReflection,\n    DeclarationReflection,\n    type ProjectReflection,\n    type Reflection,\n    ReflectionFlag,\n    ReflectionKind,\n    SignatureReflection,\n} from \"../../models/index.js\";\nimport { ReferenceType, ReflectionType, type SomeType, type Type } from \"../../models/types.js\";\nimport { filterMap, type TranslatedString, zip } from \"#utils\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { findPackageForPath, getHumanName } from \"../../utils/index.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\n\n/**\n * A plugin that detects interface implementations of functions and\n * properties on classes and links them.\n */\nexport class ImplementsPlugin extends ConverterComponent {\n    private resolved = new WeakSet<Reflection>();\n    private postponed = new WeakMap<Reflection, Set<DeclarationReflection>>();\n    private revivingSerialized = false;\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(\n            ConverterEvents.RESOLVE_END,\n            this.onResolveEnd.bind(this),\n        );\n        this.owner.on(\n            ConverterEvents.CREATE_DECLARATION,\n            this.onDeclaration.bind(this),\n            -1000,\n        );\n        this.owner.on(\n            ConverterEvents.CREATE_SIGNATURE,\n            this.onSignature.bind(this),\n            1000,\n        );\n        this.application.on(ApplicationEvents.REVIVE, this.onRevive.bind(this));\n    }\n\n    /**\n     * Mark all members of the given class to be the implementation of the matching interface member.\n     */\n    private analyzeImplements(\n        project: ProjectReflection,\n        classReflection: DeclarationReflection,\n        interfaceReflection: DeclarationReflection,\n    ) {\n        this.handleInheritedComments(classReflection, interfaceReflection);\n        if (!interfaceReflection.children) {\n            return;\n        }\n\n        interfaceReflection.children.forEach((interfaceMember) => {\n            const classMember = findMatchingMember(\n                interfaceMember,\n                classReflection,\n            );\n\n            if (!classMember) {\n                return;\n            }\n\n            const interfaceMemberName = interfaceReflection.name + \".\" + interfaceMember.name;\n            classMember.implementationOf = ReferenceType.createResolvedReference(\n                interfaceMemberName,\n                interfaceMember,\n                project,\n            );\n\n            const intSigs = interfaceMember.signatures ||\n                interfaceMember.type?.visit({\n                    reflection: (r) => r.declaration.signatures,\n                });\n\n            const clsSigs = classMember.signatures ||\n                classMember.type?.visit({\n                    reflection: (r) => r.declaration.signatures,\n                });\n\n            if (intSigs && clsSigs) {\n                for (const [clsSig, intSig] of zip(clsSigs, intSigs)) {\n                    if (clsSig.implementationOf) {\n                        const target = intSig.parent.kindOf(\n                                ReflectionKind.FunctionOrMethod,\n                            )\n                            ? intSig\n                            : intSig.parent.parent!;\n                        clsSig.implementationOf = ReferenceType.createResolvedReference(\n                            clsSig.implementationOf.name,\n                            target,\n                            project,\n                        );\n                    }\n                }\n            }\n\n            this.handleInheritedComments(classMember, interfaceMember);\n        });\n    }\n\n    private analyzeInheritance(\n        project: ProjectReflection,\n        reflection: DeclarationReflection,\n    ) {\n        if (!reflection.extendedTypes) return;\n\n        const extendedTypes = filterMap(\n            reflection.extendedTypes,\n            (type) => {\n                return type instanceof ReferenceType &&\n                        type.reflection instanceof DeclarationReflection\n                    ? (type as ReferenceType & {\n                        reflection: DeclarationReflection;\n                    })\n                    : void 0;\n            },\n        );\n\n        for (const parent of extendedTypes) {\n            this.handleInheritedComments(reflection, parent.reflection);\n\n            for (const parentMember of parent.reflection.children ?? []) {\n                const child = findMatchingMember(parentMember, reflection);\n\n                if (child) {\n                    const key = child.overwrites\n                        ? \"overwrites\"\n                        : \"inheritedFrom\";\n\n                    for (\n                        const [childSig, parentSig] of zip(\n                            child.signatures ?? [],\n                            parentMember.signatures ?? [],\n                        )\n                    ) {\n                        // If we're already pointing at something because TS said we should reference\n                        // it, then don't overwrite the reference.\n                        if (!childSig[key]?.reflection) {\n                            childSig[key] = ReferenceType.createResolvedReference(\n                                `${parent.name}.${parentMember.name}`,\n                                parentSig,\n                                project,\n                            );\n                        }\n                    }\n\n                    if (!child[key]?.reflection) {\n                        child[key] = ReferenceType.createResolvedReference(\n                            `${parent.name}.${parentMember.name}`,\n                            parentMember,\n                            project,\n                        );\n                    }\n\n                    this.handleInheritedComments(child, parentMember);\n                }\n            }\n        }\n\n        // #2978, this is very unfortunate. If a child's parent links are broken at this point,\n        // we replace them with an intentionally broken link so that they won't ever be resolved.\n        // This is done because if we don't do it then we run into issues where we have a link which\n        // points to some ReflectionSymbolId which might not exist now, but once we've gone through\n        // serialization/deserialization, might point to an unexpected location. (See the mixin\n        // converter tests, I suspect this might actually be an indication of something else slightly\n        // broken there, but don't want to spend more time with this right now.)\n        for (const child of reflection.children || []) {\n            if (child.inheritedFrom && !isValidRef(child.inheritedFrom)) {\n                child.inheritedFrom = ReferenceType.createBrokenReference(\n                    child.inheritedFrom.name,\n                    project,\n                    child.inheritedFrom.package,\n                );\n            }\n            if (child.overwrites && !isValidRef(child.overwrites)) {\n                child.overwrites = ReferenceType.createBrokenReference(\n                    child.overwrites.name,\n                    project,\n                    child.overwrites.package,\n                );\n            }\n\n            for (const childSig of child.getAllSignatures()) {\n                if (childSig.inheritedFrom && !isValidRef(childSig.inheritedFrom)) {\n                    childSig.inheritedFrom = ReferenceType.createBrokenReference(\n                        childSig.inheritedFrom.name,\n                        project,\n                        childSig.inheritedFrom.package,\n                    );\n                }\n                if (childSig.overwrites && !isValidRef(childSig.overwrites)) {\n                    childSig.overwrites = ReferenceType.createBrokenReference(\n                        childSig.overwrites.name,\n                        project,\n                        childSig.overwrites.package,\n                    );\n                }\n            }\n        }\n    }\n\n    private cleanUpImplements(\n        project: ProjectReflection,\n        reflection: DeclarationReflection,\n    ) {\n        // #3052, the same problem as #2978 applies for implements\n        for (const child of reflection.children || []) {\n            if (child.implementationOf && !isValidRef(child.implementationOf)) {\n                child.implementationOf = ReferenceType.createBrokenReference(\n                    child.implementationOf.name,\n                    project,\n                    child.implementationOf.package,\n                );\n            }\n\n            for (const childSig of child.getAllSignatures()) {\n                if (childSig.implementationOf && !isValidRef(childSig.implementationOf)) {\n                    childSig.implementationOf = ReferenceType.createBrokenReference(\n                        childSig.implementationOf.name,\n                        project,\n                        childSig.implementationOf.package,\n                    );\n                }\n            }\n        }\n    }\n\n    private onResolveEnd(context: Context) {\n        this.resolve(context.project);\n    }\n\n    private onRevive(project: ProjectReflection) {\n        this.revivingSerialized = true;\n        this.resolve(project);\n        this.revivingSerialized = false;\n    }\n\n    private resolve(project: ProjectReflection) {\n        for (const id in project.reflections) {\n            const refl = project.reflections[id];\n            if (refl instanceof DeclarationReflection) {\n                this.tryResolve(project, refl);\n            }\n        }\n    }\n\n    private tryResolve(\n        project: ProjectReflection,\n        reflection: DeclarationReflection,\n    ) {\n        const requirements = filterMap(\n            [\n                ...(reflection.implementedTypes ?? []),\n                ...(reflection.extendedTypes ?? []),\n            ],\n            (type) => {\n                return type instanceof ReferenceType ? type.reflection : void 0;\n            },\n        );\n\n        if (requirements.every((req) => this.resolved.has(req))) {\n            this.doResolve(project, reflection);\n            this.resolved.add(reflection);\n\n            for (const refl of this.postponed.get(reflection) ?? []) {\n                this.tryResolve(project, refl);\n            }\n            this.postponed.delete(reflection);\n        } else {\n            for (const req of requirements) {\n                const future = this.postponed.get(req) ?? new Set();\n                future.add(reflection);\n                this.postponed.set(req, future);\n            }\n        }\n    }\n\n    private doResolve(\n        project: ProjectReflection,\n        reflection: DeclarationReflection,\n    ) {\n        if (\n            reflection.kindOf(ReflectionKind.Class) &&\n            reflection.implementedTypes\n        ) {\n            reflection.implementedTypes.forEach((type: Type) => {\n                if (!(type instanceof ReferenceType)) {\n                    return;\n                }\n\n                if (\n                    type.reflection &&\n                    type.reflection.kindOf(ReflectionKind.ClassOrInterface)\n                ) {\n                    this.analyzeImplements(\n                        project,\n                        reflection,\n                        type.reflection as DeclarationReflection,\n                    );\n                }\n            });\n        }\n\n        // Remove hidden classes/interfaces which we inherit from\n        if (reflection.kindOf(ReflectionKind.ClassOrInterface)) {\n            const notHiddenType = (t: SomeType) =>\n                !(t instanceof ReferenceType) ||\n                !t.symbolId ||\n                !project.symbolIdHasBeenRemoved(t.symbolId);\n            reflection.implementedTypes = reflection.implementedTypes?.filter(notHiddenType);\n            if (!reflection.implementedTypes?.length) delete reflection.implementedTypes;\n            reflection.extendedTypes = reflection.extendedTypes?.filter(notHiddenType);\n            if (!reflection.extendedTypes?.length) delete reflection.extendedTypes;\n        }\n\n        if (\n            reflection.kindOf(ReflectionKind.ClassOrInterface) &&\n            reflection.extendedTypes\n        ) {\n            this.analyzeInheritance(project, reflection);\n        }\n\n        if (\n            reflection.kindOf(ReflectionKind.ClassOrInterface) &&\n            (reflection.extendedTypes || reflection.implementedTypes)\n        ) {\n            this.cleanUpImplements(project, reflection);\n        }\n    }\n\n    private getExtensionInfo(\n        context: Context,\n        reflection: Reflection | undefined,\n    ) {\n        if (!reflection || !reflection.kindOf(ReflectionKind.Inheritable)) {\n            return;\n        }\n\n        // Need this because we re-use reflections for type literals.\n        if (!reflection.parent?.kindOf(ReflectionKind.ClassOrInterface)) {\n            return;\n        }\n\n        const symbol = context.getSymbolFromReflection(\n            reflection.parent,\n        );\n        if (!symbol) {\n            return;\n        }\n\n        const declaration = symbol\n            .getDeclarations()\n            ?.find(\n                (n): n is ts.ClassDeclaration | ts.InterfaceDeclaration =>\n                    ts.isClassDeclaration(n) || ts.isInterfaceDeclaration(n),\n            );\n        if (!declaration) {\n            return;\n        }\n\n        return { symbol, declaration };\n    }\n\n    private onSignature(context: Context, reflection: SignatureReflection) {\n        this.onDeclaration(context, reflection.parent);\n    }\n\n    /**\n     * Responsible for setting the {@link DeclarationReflection.inheritedFrom},\n     * {@link DeclarationReflection.overwrites}, and {@link DeclarationReflection.implementationOf}\n     * properties on the provided reflection temporarily, these links will be replaced\n     * during the resolve step with links which actually point to the right place.\n     */\n    private onDeclaration(context: Context, reflection: DeclarationReflection) {\n        const info = this.getExtensionInfo(context, reflection);\n        if (!info) {\n            return;\n        }\n\n        if (reflection.kind === ReflectionKind.Constructor) {\n            const ctor = (\n                info.declaration.members as ReadonlyArray<\n                    ts.ClassElement | ts.TypeElement\n                >\n            ).find(ts.isConstructorDeclaration);\n            constructorInheritance(context, reflection, info.declaration, ctor);\n            return;\n        }\n\n        const childType = reflection.flags.isStatic\n            ? context.checker.getTypeOfSymbolAtLocation(\n                info.symbol,\n                info.declaration,\n            )\n            : context.checker.getDeclaredTypeOfSymbol(info.symbol);\n\n        const property = findProperty(reflection, childType);\n\n        if (!property) {\n            // We're probably broken... but I don't think this should be fatal.\n            context.logger.warn(\n                `Failed to retrieve${reflection.flags.isStatic ? \" static\" : \"\"} member \"${\n                    reflection.escapedName ?? reflection.name\n                }\" of \"${reflection.parent?.name}\" for inheritance analysis. Please report a bug.` as TranslatedString,\n            );\n            return;\n        }\n\n        // Need to check both extends and implements clauses.\n        out: for (const clause of info.declaration.heritageClauses ?? []) {\n            // No point checking implemented types for static members, they won't exist.\n            if (\n                reflection.flags.isStatic &&\n                clause.token === ts.SyntaxKind.ImplementsKeyword\n            ) {\n                continue;\n            }\n\n            for (const expr of clause.types) {\n                const parentType = context.checker.getTypeAtLocation(\n                    reflection.flags.isStatic ? expr.expression : expr,\n                );\n\n                const parentProperty = findProperty(reflection, parentType);\n                if (parentProperty) {\n                    const isInherit = property\n                        .getDeclarations()\n                        ?.some((d) => d.parent !== info.declaration) ??\n                        true;\n\n                    createLink(\n                        context,\n                        reflection,\n                        clause,\n                        expr,\n                        parentProperty,\n                        isInherit,\n                    );\n\n                    // Can't always break because we need to also set `implementationOf` if we\n                    // inherit from a base class and also implement an interface.\n                    if (clause.token === ts.SyntaxKind.ImplementsKeyword) {\n                        break out;\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Responsible for copying comments from \"parent\" reflections defined\n     * in either a base class or implemented interface to the child class.\n     */\n    private handleInheritedComments(\n        child: DeclarationReflection,\n        parent: DeclarationReflection,\n    ) {\n        this.copyComment(child, parent);\n\n        if (\n            parent.kindOf(ReflectionKind.Property) &&\n            child.kindOf(ReflectionKind.Accessor)\n        ) {\n            if (child.getSignature) {\n                this.copyComment(child.getSignature, parent);\n                child.getSignature.implementationOf = child.implementationOf;\n            }\n            if (child.setSignature) {\n                this.copyComment(child.setSignature, parent);\n                child.setSignature.implementationOf = child.implementationOf;\n            }\n        }\n        if (\n            parent.kindOf(ReflectionKind.Accessor) &&\n            child.kindOf(ReflectionKind.Accessor)\n        ) {\n            if (parent.getSignature && child.getSignature) {\n                this.copyComment(child.getSignature, parent.getSignature);\n            }\n            if (parent.setSignature && child.setSignature) {\n                this.copyComment(child.setSignature, parent.setSignature);\n            }\n        }\n\n        if (\n            parent.kindOf(ReflectionKind.FunctionOrMethod) &&\n            parent.signatures &&\n            child.signatures\n        ) {\n            for (const [cs, ps] of zip(child.signatures, parent.signatures)) {\n                this.copyComment(cs, ps);\n            }\n        } else if (\n            parent.kindOf(ReflectionKind.Property) &&\n            parent.type instanceof ReflectionType &&\n            parent.type.declaration.signatures &&\n            child.signatures\n        ) {\n            for (\n                const [cs, ps] of zip(\n                    child.signatures,\n                    parent.type.declaration.signatures,\n                )\n            ) {\n                this.copyComment(cs, ps);\n            }\n        }\n    }\n\n    /**\n     * Copy the comment of the source reflection to the target reflection with a JSDoc style copy\n     * function. The TSDoc copy function is in the InheritDocPlugin.\n     */\n    private copyComment(target: Reflection, source: Reflection) {\n        if (!shouldCopyComment(target, source, this.revivingSerialized)) {\n            return;\n        }\n\n        target.comment = source.comment!.clone();\n\n        if (\n            target instanceof DeclarationReflection &&\n            source instanceof DeclarationReflection\n        ) {\n            for (\n                const [tt, ts] of zip(\n                    target.typeParameters || [],\n                    source.typeParameters || [],\n                )\n            ) {\n                this.copyComment(tt, ts);\n            }\n        }\n        if (\n            target instanceof SignatureReflection &&\n            source instanceof SignatureReflection\n        ) {\n            for (\n                const [tt, ts] of zip(\n                    target.typeParameters || [],\n                    source.typeParameters || [],\n                )\n            ) {\n                this.copyComment(tt, ts);\n            }\n            for (\n                const [pt, ps] of zip(\n                    target.parameters || [],\n                    source.parameters || [],\n                )\n            ) {\n                this.copyComment(pt, ps);\n            }\n        }\n    }\n}\n\nfunction getConstructorPackagePath(context: Context, clause: ts.ExpressionWithTypeArguments): string | undefined {\n    const symbol = context.getSymbolAtLocation(clause.expression);\n    if (!symbol) return undefined;\n\n    const resolvedSymbol = context.resolveAliasedSymbol(symbol);\n\n    const symbolPath = resolvedSymbol?.declarations?.[0]?.getSourceFile().fileName;\n    if (!symbolPath) return undefined;\n\n    return findPackageForPath(symbolPath)?.[0];\n}\n\nfunction constructorInheritance(\n    context: Context,\n    reflection: DeclarationReflection,\n    childDecl: ts.ClassDeclaration | ts.InterfaceDeclaration,\n    constructorDecl: ts.ConstructorDeclaration | undefined,\n) {\n    const extendsClause = childDecl.heritageClauses?.find(\n        (cl) => cl.token === ts.SyntaxKind.ExtendsKeyword,\n    );\n\n    if (!extendsClause) return;\n    const extendsType = extendsClause.types[0];\n    const refPackage = getConstructorPackagePath(context, extendsType);\n\n    const name = `${extendsType.getText()}.constructor`;\n\n    const key = constructorDecl ? \"overwrites\" : \"inheritedFrom\";\n\n    reflection[key] ??= ReferenceType.createBrokenReference(\n        name,\n        context.project,\n        refPackage,\n    );\n\n    for (const sig of reflection.signatures ?? []) {\n        sig[key] ??= ReferenceType.createBrokenReference(name, context.project, refPackage);\n    }\n}\n\nfunction findProperty(reflection: DeclarationReflection, parent: ts.Type) {\n    return parent.getProperties().find((prop) => {\n        return reflection.escapedName\n            ? prop.escapedName === reflection.escapedName as ts.__String\n            : prop.name === reflection.name;\n    });\n}\n\nfunction createLink(\n    context: Context,\n    reflection: DeclarationReflection,\n    clause: ts.HeritageClause,\n    expr: ts.ExpressionWithTypeArguments,\n    symbol: ts.Symbol,\n    isInherit: boolean,\n) {\n    const name = `${expr.expression.getText()}.${getHumanName(symbol.name)}`;\n\n    // We should always have rootSymbols, but check just in case. We use the first\n    // symbol here as TypeDoc's models don't have multiple symbols for the parent\n    // reference. This is technically wrong because symbols might be declared in\n    // multiple locations (interface declaration merging), but that's an uncommon\n    // enough use case that it doesn't seem worthwhile to complicate the rest of the\n    // world to deal with it.\n    // Note that we also need to check that the root symbol isn't this symbol.\n    // This seems to happen sometimes when dealing with interface inheritance.\n    const rootSymbols = context.checker.getRootSymbols(symbol);\n    const ref = rootSymbols.length && rootSymbols[0] != symbol\n        ? context.createSymbolReference(rootSymbols[0], context, name)\n        : ReferenceType.createBrokenReference(name, context.project, undefined);\n\n    link(reflection);\n    link(reflection.getSignature);\n    link(reflection.setSignature);\n    for (const sig of reflection.indexSignatures || []) {\n        link(sig);\n    }\n    for (const sig of reflection.signatures ?? []) {\n        link(sig);\n    }\n\n    function link(\n        target: DeclarationReflection | SignatureReflection | undefined,\n    ) {\n        if (!target) return;\n\n        if (clause.token === ts.SyntaxKind.ImplementsKeyword) {\n            target.implementationOf ??= ref;\n            return;\n        }\n\n        if (isInherit) {\n            target.setFlag(ReflectionFlag.Inherited);\n            target.inheritedFrom ??= ref;\n        } else {\n            target.overwrites ??= ref;\n        }\n    }\n}\n\nfunction shouldCopyComment(\n    target: Reflection,\n    source: Reflection,\n    revivingSerialized: boolean,\n) {\n    if (!source.comment) {\n        return false;\n    }\n\n    if (target.comment) {\n        // If we're reviving, then the revived project might have a better comment\n        // on source, so copy it.\n        if (revivingSerialized && source.comment.similarTo(target.comment)) {\n            return true;\n        }\n\n        // We might still want to copy, if the child has a JSDoc style inheritDoc tag.\n        const tag = target.comment.getTag(\"@inheritDoc\");\n        if (!tag || tag.name) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nfunction findMatchingMember(\n    toMatch: Reflection,\n    container: ContainerReflection,\n) {\n    return container.children?.find(\n        (child) =>\n            child.name == toMatch.name &&\n            child.flags.isStatic === toMatch.flags.isStatic,\n    );\n}\n\n// #2982/#3007 unfortunately, we only want to keep the link if it is pointing\n// to a reflection which will receive a link during rendering, we pick this based on it being\n// the type of member we expect to point to.\nfunction isValidRef(ref: ReferenceType) {\n    return !!ref.reflection?.parent?.kindOf(\n        ReflectionKind.ClassOrInterface | ReflectionKind.Method | ReflectionKind.Constructor,\n    );\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/IncludePlugin.ts",
    "content": "import path from \"path\";\n\nimport { ConverterComponent } from \"../components.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { CommentDisplayPart, Reflection } from \"../../models/index.js\";\nimport { MinimalSourceFile } from \"#utils\";\nimport type { Converter } from \"../converter.js\";\nimport { isFile, readFile } from \"../../utils/fs.js\";\nimport { dedent, escapeRegExp, i18n } from \"#utils\";\nimport { normalizePath } from \"#node-utils\";\n\n/**\n * Handles `@include` and `@includeCode` within comments/documents.\n */\nexport class IncludePlugin extends ConverterComponent {\n    get logger() {\n        return this.application.logger;\n    }\n\n    constructor(owner: Converter) {\n        super(owner);\n        const onCreate = this.onCreate.bind(this);\n        owner.on(ConverterEvents.CREATE_PROJECT, onCreate);\n        owner.on(ConverterEvents.CREATE_DOCUMENT, onCreate);\n        owner.on(ConverterEvents.CREATE_DECLARATION, onCreate);\n        owner.on(ConverterEvents.CREATE_PARAMETER, onCreate);\n        owner.on(ConverterEvents.CREATE_SIGNATURE, onCreate);\n        owner.on(ConverterEvents.CREATE_TYPE_PARAMETER, onCreate);\n    }\n\n    private onCreate(_context: unknown, refl: Reflection) {\n        if (refl.isDocument()) {\n            // We know it must be present as documents are always associated with a file.\n            const relative = this.application.files.getReflectionPath(refl)!;\n            this.checkIncludeTagsParts(\n                refl,\n                path.dirname(relative),\n                refl.content,\n            );\n        }\n\n        if (!refl.comment?.sourcePath) return;\n        const relative = path.dirname(refl.comment.sourcePath);\n        this.checkIncludeTagsParts(refl, relative, refl.comment.summary);\n        for (const tag of refl.comment.blockTags) {\n            this.checkIncludeTagsParts(refl, relative, tag.content);\n        }\n    }\n\n    checkIncludeTagsParts(\n        refl: Reflection,\n        relative: string,\n        parts: CommentDisplayPart[],\n        included: string[] = [],\n    ) {\n        for (let i = 0; i < parts.length; ++i) {\n            const part = parts[i];\n\n            if (\n                part.kind !== \"inline-tag\" ||\n                ![\"@include\", \"@includeCode\"].includes(part.tag)\n            ) {\n                continue;\n            }\n\n            const { filename, regionTarget, requestedLines } = parseIncludeCodeTextPart(part.text);\n\n            const file = normalizePath(path.resolve(relative, filename));\n            this.application.watchFile(file);\n            if (included.includes(file) && part.tag === \"@include\") {\n                this.logger.error(\n                    i18n.include_0_in_1_specified_2_circular_include_3(\n                        part.tag,\n                        refl.getFriendlyFullName(),\n                        part.text,\n                        included.join(\"\\n\\t\"),\n                    ),\n                );\n            } else if (isFile(file)) {\n                const text = readFile(file).replaceAll(\"\\r\\n\", \"\\n\");\n                const ext = path.extname(file).substring(1);\n\n                const includedText = regionTarget\n                    ? this.getRegions(\n                        refl,\n                        file,\n                        ext,\n                        part.text,\n                        text,\n                        regionTarget,\n                        part.tag,\n                        part.tag === \"@includeCode\",\n                    )\n                    : requestedLines\n                    ? this.getLines(\n                        refl,\n                        file,\n                        part.text,\n                        text,\n                        requestedLines,\n                        part.tag,\n                    )\n                    : text;\n\n                if (part.tag === \"@include\") {\n                    const sf = new MinimalSourceFile(includedText, file);\n                    const { content } = this.owner.parseRawComment(\n                        sf,\n                        refl.project.files,\n                    );\n                    this.checkIncludeTagsParts(\n                        refl,\n                        path.dirname(file),\n                        content,\n                        [...included, file],\n                    );\n                    parts.splice(i, 1, ...content);\n                } else {\n                    parts[i] = {\n                        kind: \"code\",\n                        text: makeCodeBlock(ext, includedText),\n                    };\n                }\n            } else {\n                this.logger.error(\n                    i18n.include_0_in_1_specified_2_resolved_to_3_does_not_exist(\n                        part.tag,\n                        refl.getFriendlyFullName(),\n                        part.text,\n                        file,\n                    ),\n                );\n            }\n        }\n    }\n\n    getRegions(\n        refl: Reflection,\n        file: string,\n        ext: string,\n        textPart: string,\n        text: string,\n        regionTargets: string,\n        tag: string,\n        ignoreIndent: boolean,\n    ) {\n        const regionTagsList = regionTagREsByExt[ext];\n        if (!regionTagsList) {\n            this.logger.error(\n                i18n.include_0_tag_in_1_region_2_region_not_supported(\n                    tag,\n                    refl.getFriendlyFullName(),\n                    textPart,\n                ),\n            );\n            return \"\";\n        }\n\n        const targets = regionTargets.split(\",\").map((s) => s.trim());\n        let content = \"\";\n\n        for (const target of targets) {\n            let found: string | false = false;\n            for (const [startTag, endTag] of regionTagsList) {\n                const safeTarget = escapeRegExp(target);\n                const start = text.match(startTag(safeTarget));\n                const end = text.match(endTag(safeTarget));\n\n                const foundStart = start && start.length > 0;\n                const foundEnd = end && end.length > 0;\n                if (foundStart && !foundEnd) {\n                    this.logger.error(\n                        i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found(\n                            tag,\n                            refl.getFriendlyFullName(),\n                            textPart,\n                            file,\n                            target,\n                        ),\n                    );\n                    return \"\";\n                }\n                if (!foundStart && foundEnd) {\n                    this.logger.error(\n                        i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found(\n                            tag,\n                            refl.getFriendlyFullName(),\n                            textPart,\n                            file,\n                            target,\n                        ),\n                    );\n                    return \"\";\n                }\n                if (foundStart && foundEnd) {\n                    if (start.length > 1) {\n                        this.logger.error(\n                            i18n\n                                .include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times(\n                                    tag,\n                                    refl.getFriendlyFullName(),\n                                    textPart,\n                                    file,\n                                    target,\n                                ),\n                        );\n                        return \"\";\n                    }\n                    if (end.length > 1) {\n                        this.logger.error(\n                            i18n\n                                .include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times(\n                                    tag,\n                                    refl.getFriendlyFullName(),\n                                    textPart,\n                                    file,\n                                    target,\n                                ),\n                        );\n                        return \"\";\n                    }\n                    if (found) {\n                        this.logger.error(\n                            i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times(\n                                tag,\n                                refl.getFriendlyFullName(),\n                                textPart,\n                                file,\n                                target,\n                            ),\n                        );\n                        return \"\";\n                    }\n                    found = text.substring(\n                        text.indexOf(start[0]) + start[0].length,\n                        text.indexOf(end[0]),\n                    );\n                }\n            }\n            if (found === false) {\n                this.logger.error(\n                    i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_not_found(\n                        tag,\n                        refl.getFriendlyFullName(),\n                        textPart,\n                        file,\n                        target,\n                    ),\n                );\n                return \"\";\n            }\n            if (found.trim() === \"\") {\n                this.logger.warn(\n                    i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_empty(\n                        tag,\n                        refl.getFriendlyFullName(),\n                        textPart,\n                        file,\n                        target,\n                    ),\n                );\n            }\n\n            content += ignoreIndent ? dedent(found) + \"\\n\" : found;\n        }\n\n        return content;\n    }\n\n    getLines(\n        refl: Reflection,\n        file: string,\n        textPart: string,\n        text: string,\n        requestedLines: string,\n        tag: string,\n    ) {\n        let output = \"\";\n        const lines = text.split(/\\r\\n|\\r|\\n/);\n        requestedLines.split(\",\").forEach((requestedLineString) => {\n            if (requestedLineString.includes(\"-\")) {\n                const [start, end] = requestedLineString.split(\"-\").map(Number);\n                if (start > end) {\n                    this.logger.error(\n                        i18n.include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range(\n                            tag,\n                            refl.getFriendlyFullName(),\n                            textPart,\n                            file,\n                            requestedLines,\n                        ),\n                    );\n                    return \"\";\n                }\n                if (start > lines.length || end > lines.length) {\n                    this.logger.error(\n                        i18n.include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines(\n                            tag,\n                            refl.getFriendlyFullName(),\n                            textPart,\n                            file,\n                            requestedLines,\n                            lines.length.toString(),\n                        ),\n                    );\n                    return \"\";\n                }\n                output += lines.slice(start - 1, end).join(\"\\n\") + \"\\n\";\n            } else {\n                const requestedLine = Number(requestedLineString);\n                if (requestedLine > lines.length) {\n                    this.logger.error(\n                        i18n.include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines(\n                            tag,\n                            refl.getFriendlyFullName(),\n                            textPart,\n                            file,\n                            requestedLines,\n                            lines.length.toString(),\n                        ),\n                    );\n                    return \"\";\n                }\n                output += lines[requestedLine - 1] + \"\\n\";\n            }\n        });\n\n        return output;\n    }\n}\n\nfunction makeCodeBlock(lang: string, code: string) {\n    const escaped = code.replace(/`(?=`)/g, \"`\\u200B\");\n    return \"\\n\\n```\" + lang + \"\\n\" + escaped.trimEnd() + \"\\n```\";\n}\n\nfunction parseIncludeCodeTextPart(text: string): {\n    filename: string;\n    regionTarget: string | undefined;\n    requestedLines: string | undefined;\n} {\n    let filename = text.trim();\n    let regionTarget: string | undefined;\n    let requestedLines: string | undefined;\n    if (filename.includes(\"#\")) {\n        const parsed = filename.split(\"#\");\n        filename = parsed[0];\n        regionTarget = parsed[1];\n    } else if (filename.includes(\":\")) {\n        const parsed = filename.split(\":\");\n        filename = parsed[0];\n        requestedLines = parsed[1];\n    }\n    return { filename, regionTarget, requestedLines };\n}\n\ntype RegionTagRETuple = [\n    (regionName: string) => RegExp,\n    (regionName: string) => RegExp,\n];\nconst regionTagREsByExt: Record<string, RegionTagRETuple[] | undefined> = {\n    bat: [\n        [\n            (regionName) => new RegExp(`:: *#region  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`:: *#endregion  *${regionName} *\\n`, \"g\"),\n        ],\n        [\n            (regionName) => new RegExp(`REM  *#region  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`REM  *#endregion  *${regionName} *\\n`, \"g\"),\n        ],\n    ],\n    cs: [\n        [\n            (regionName) => new RegExp(`#region  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`#endregion  *${regionName} *\\n`, \"g\"),\n        ],\n    ],\n    c: [\n        [\n            (regionName) => new RegExp(`#pragma  *region  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`#pragma  *endregion  *${regionName} *\\n`, \"g\"),\n        ],\n    ],\n    css: [\n        [\n            (regionName) => new RegExp(`/\\\\* *#region *\\\\*/  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`/\\\\* *#endregion *\\\\*/  *${regionName} *\\n`, \"g\"),\n        ],\n    ],\n    md: [\n        [\n            (regionName) => new RegExp(`<!--  *#region  *${regionName} *--> *\\n`, \"g\"),\n            (regionName) => new RegExp(`<!--  *#endregion  *${regionName} *--> *\\n`, \"g\"),\n        ],\n    ],\n    ts: [\n        [\n            (regionName) => new RegExp(`// *#region  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`// *#endregion  *${regionName} *\\n`, \"g\"),\n        ],\n    ],\n    vb: [\n        [\n            (regionName) => new RegExp(`#Region  *${regionName} *\\n`, \"g\"),\n            (regionName) => new RegExp(`#End Region  *${regionName} *\\n`, \"g\"),\n        ],\n    ],\n};\nregionTagREsByExt[\"fs\"] = [\n    ...regionTagREsByExt[\"ts\"]!,\n    [\n        (regionName) => new RegExp(`(#_region)  *${regionName} *\\n`, \"g\"),\n        (regionName) => new RegExp(`(#_endregion)  *${regionName} *\\n`, \"g\"),\n    ],\n];\nregionTagREsByExt[\"java\"] = [\n    ...regionTagREsByExt[\"ts\"]!,\n    [\n        (regionName) => new RegExp(`// *<editor-fold>  *${regionName} *\\n`, \"g\"),\n        (regionName) => new RegExp(`// *</editor-fold>  *${regionName} *\\n`, \"g\"),\n    ],\n];\nregionTagREsByExt[\"cpp\"] = regionTagREsByExt[\"c\"];\nregionTagREsByExt[\"less\"] = regionTagREsByExt[\"css\"];\nregionTagREsByExt[\"scss\"] = regionTagREsByExt[\"css\"];\nregionTagREsByExt[\"coffee\"] = regionTagREsByExt[\"cs\"];\nregionTagREsByExt[\"php\"] = regionTagREsByExt[\"cs\"];\nregionTagREsByExt[\"ps1\"] = regionTagREsByExt[\"cs\"];\nregionTagREsByExt[\"py\"] = regionTagREsByExt[\"cs\"];\nregionTagREsByExt[\"js\"] = regionTagREsByExt[\"ts\"];\nregionTagREsByExt[\"mjs\"] = regionTagREsByExt[\"ts\"];\nregionTagREsByExt[\"mts\"] = regionTagREsByExt[\"ts\"];\nregionTagREsByExt[\"cjs\"] = regionTagREsByExt[\"ts\"];\nregionTagREsByExt[\"cts\"] = regionTagREsByExt[\"ts\"];\nregionTagREsByExt[\"jsx\"] = regionTagREsByExt[\"ts\"];\nregionTagREsByExt[\"tsx\"] = regionTagREsByExt[\"ts\"];\n"
  },
  {
    "path": "src/lib/converter/plugins/InheritDocPlugin.ts",
    "content": "import {\n    Comment,\n    DeclarationReflection,\n    type ProjectReflection,\n    ReflectionKind,\n    ReflectionType,\n    SignatureReflection,\n} from \"../../models/index.js\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport type { Reflection } from \"../../models/Reflection.js\";\nimport { Option, type ValidationOptions } from \"../../utils/index.js\";\nimport { DefaultMap, i18n, parseDeclarationReference, zip } from \"#utils\";\nimport { resolveDeclarationReference } from \"../comments/declarationReferenceResolver.js\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\n\n/**\n * A plugin that handles `@inheritDoc` tags by copying documentation from another API item.\n * It is NOT responsible for handling bare JSDoc style `@inheritDoc` tags which do not specify\n * a target to inherit from. Those are handled by the ImplementsPlugin class.\n *\n * What gets copied:\n * - short text\n * - text\n * - `@remarks` block\n * - `@params` block\n * - `@typeParam` block\n * - `@return` block\n */\nexport class InheritDocPlugin extends ConverterComponent {\n    @Option(\"validation\")\n    accessor validation!: ValidationOptions;\n\n    // Key is depended on by Values\n    private dependencies = new DefaultMap<Reflection, Reflection[]>(() => []);\n\n    /**\n     * Create a new InheritDocPlugin instance.\n     */\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(ConverterEvents.RESOLVE_END, (context: Context) => this.processInheritDoc(context.project));\n        this.application.on(\n            ApplicationEvents.REVIVE,\n            this.processInheritDoc.bind(this),\n        );\n    }\n\n    /**\n     * Traverse through reflection descendant to check for `inheritDoc` tag.\n     * If encountered, the parameter of the tag is used to determine a source reflection\n     * that will provide actual comment.\n     */\n    private processInheritDoc(project: ProjectReflection) {\n        for (const id in project.reflections) {\n            const reflection = project.reflections[id];\n            const source = extractInheritDocTagReference(reflection);\n            if (!source) continue;\n\n            const declRef = parseDeclarationReference(source, 0, source.length);\n            if (!declRef || /\\S/.test(source.substring(declRef[1]))) {\n                this.application.logger.warn(\n                    i18n.declaration_reference_in_inheritdoc_for_0_not_fully_parsed(\n                        reflection.getFriendlyFullName(),\n                    ),\n                );\n            }\n            let sourceRefl = declRef && resolveDeclarationReference(reflection, declRef[0]);\n\n            if (reflection instanceof SignatureReflection) {\n                // Assumes that if there are overloads, they are declared in the same order as the parent.\n                // TS doesn't check this, but if a user messes this up then they are almost\n                // guaranteed to run into bugs where they can't call a method on a child class\n                // but if they assign (without a type assertion) that child to a variable of the parent class\n                // then they can call the method.\n                if (sourceRefl instanceof DeclarationReflection) {\n                    const index = reflection.parent\n                        .getAllSignatures()\n                        .indexOf(reflection);\n                    sourceRefl = sourceRefl.getAllSignatures()[index] || sourceRefl;\n                }\n            }\n\n            if (\n                sourceRefl instanceof DeclarationReflection &&\n                sourceRefl.kindOf(ReflectionKind.Accessor)\n            ) {\n                // Accessors, like functions, never have comments on their actual root reflection.\n                // If the user didn't specify whether to inherit from the getter or setter, then implicitly\n                // try to inherit from the getter, #1968.\n                sourceRefl = sourceRefl.getSignature || sourceRefl.setSignature;\n            }\n\n            if (!sourceRefl) {\n                if (this.validation.invalidLink) {\n                    this.application.logger.warn(\n                        i18n.failed_to_find_0_to_inherit_comment_from_in_1(\n                            source,\n                            reflection.getFriendlyFullName(),\n                        ),\n                    );\n                }\n                continue;\n            }\n\n            this.copyComment(sourceRefl, reflection);\n        }\n\n        this.createCircularDependencyWarnings();\n        this.dependencies.clear();\n    }\n\n    private copyComment(source: Reflection, target: Reflection) {\n        if (!target.comment) return;\n\n        if (\n            !source.comment &&\n            source instanceof DeclarationReflection &&\n            source.signatures\n        ) {\n            source = source.signatures[0];\n        }\n\n        if (\n            !source.comment &&\n            source instanceof DeclarationReflection &&\n            source.type instanceof ReflectionType &&\n            source.type.declaration.signatures\n        ) {\n            source = source.type.declaration.signatures[0];\n        }\n\n        if (!source.comment) {\n            this.application.logger.warn(\n                i18n.reflection_0_tried_to_copy_comment_from_1_but_source_had_no_comment(\n                    target.getFullName(),\n                    source.getFullName(),\n                ),\n            );\n            return;\n        }\n\n        // If the source also has a @inheritDoc tag, we can't do anything yet.\n        // We'll try again later, once we've resolved the source's @inheritDoc reference.\n        if (extractInheritDocTagReference(source)) {\n            this.dependencies.get(source).push(target);\n            return;\n        }\n\n        target.comment.removeTags(\"@inheritDoc\");\n        target.comment.removeTags(\"@remarks\");\n        target.comment.removeTags(\"@returns\");\n        target.comment.summary = Comment.cloneDisplayParts(\n            source.comment.summary,\n        );\n        const remarks = source.comment.getTag(\"@remarks\");\n        if (remarks) {\n            target.comment.blockTags.unshift(remarks.clone());\n        }\n        const returns = source.comment.getTag(\"@returns\");\n        if (returns) {\n            target.comment.blockTags.push(returns.clone());\n        }\n\n        if (\n            source instanceof SignatureReflection &&\n            target instanceof SignatureReflection\n        ) {\n            copySummaries(source.parameters, target.parameters);\n            copySummaries(source.typeParameters, target.typeParameters);\n        } else if (\n            source instanceof DeclarationReflection &&\n            target instanceof DeclarationReflection\n        ) {\n            copySummaries(source.typeParameters, target.typeParameters);\n        }\n\n        // Now copy the comment for anyone who depends on me.\n        const dependent = this.dependencies.get(target);\n        this.dependencies.delete(target);\n        for (const target2 of dependent) {\n            this.copyComment(target, target2);\n        }\n    }\n\n    private createCircularDependencyWarnings() {\n        const unwarned = new Set(this.dependencies.keys());\n\n        const generateWarning = (orig: Reflection) => {\n            const parts = [orig.name];\n            unwarned.delete(orig);\n            let work = orig;\n\n            do {\n                work = this.dependencies.get(work)[0];\n                unwarned.delete(work);\n                parts.push(work.name);\n            } while (!this.dependencies.get(work).includes(orig));\n            parts.push(orig.name);\n\n            this.application.logger.warn(\n                i18n.inheritdoc_circular_inheritance_chain_0(\n                    parts.reverse().join(\" -> \"),\n                ),\n            );\n        };\n\n        for (const orig of this.dependencies.keys()) {\n            if (unwarned.has(orig)) {\n                generateWarning(orig);\n            }\n        }\n    }\n}\n\nfunction copySummaries(\n    source: Reflection[] | undefined,\n    target: Reflection[] | undefined,\n) {\n    for (const [s, t] of zip(source || [], target || [])) {\n        t.comment = new Comment(s.comment?.summary);\n        t.comment.sourcePath = s.comment?.sourcePath;\n    }\n}\n\nfunction extractInheritDocTagReference(\n    reflection: Reflection,\n): string | undefined {\n    const comment = reflection.comment;\n    if (!comment) return;\n\n    const blockTag = comment.blockTags.find((tag) => tag.tag === \"@inheritDoc\");\n\n    if (blockTag) {\n        return blockTag.name;\n    }\n\n    const inlineTag = comment.summary.find(\n        (part) => part.kind === \"inline-tag\" && part.tag === \"@inheritDoc\",\n    );\n\n    if (inlineTag) {\n        return inlineTag.text;\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/LinkResolverPlugin.ts",
    "content": "import { ConverterComponent } from \"../components.js\";\nimport type { Context, Converter } from \"../../converter/index.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport { Option, type ValidationOptions } from \"../../utils/index.js\";\nimport type { ProjectReflection } from \"../../models/index.js\";\nimport { discoverAllReferenceTypes } from \"../../utils/reflections.js\";\nimport { ApplicationEvents } from \"../../application-events.js\";\n\n/**\n * A plugin that resolves `{@link Foo}` tags.\n */\nexport class LinkResolverPlugin extends ConverterComponent {\n    @Option(\"validation\")\n    accessor validation!: ValidationOptions;\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(\n            ConverterEvents.RESOLVE_END,\n            this.onResolve.bind(this),\n            -300,\n        );\n        this.application.on(\n            ApplicationEvents.REVIVE,\n            this.resolveLinks.bind(this),\n            -300,\n        );\n    }\n\n    onResolve(context: Context) {\n        this.resolveLinks(context.project);\n    }\n\n    resolveLinks(project: ProjectReflection) {\n        for (const id in project.reflections) {\n            const reflection = project.reflections[id];\n            this.owner.resolveLinks(reflection);\n        }\n\n        for (\n            const { type, owner } of discoverAllReferenceTypes(\n                project,\n                false,\n            )\n        ) {\n            if (!type.reflection) {\n                const resolveResult = this.owner.resolveExternalLink(\n                    type.toDeclarationReference(),\n                    owner,\n                    undefined,\n                    type.symbolId,\n                );\n                switch (typeof resolveResult) {\n                    case \"string\":\n                        type.externalUrl = resolveResult;\n                        break;\n                    case \"object\":\n                        type.externalUrl = resolveResult.target;\n                        break;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/MergeModuleWithPlugin.ts",
    "content": "import { ok } from \"assert\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport { Comment, type ProjectReflection, type Reflection, ReflectionKind } from \"../../models/index.js\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\nimport { i18n } from \"#utils\";\n\n/**\n * Handles `@mergeModuleWith` tags in comments\n * Warnings if resolution failed are emitted during the validation step, not here.\n */\nexport class MergeModuleWithPlugin extends ConverterComponent {\n    constructor(owner: Converter) {\n        super(owner);\n\n        // Note: This happens before grouping/categorizing\n        this.owner.on(\n            ConverterEvents.RESOLVE_BEGIN,\n            this.onResolveBegin.bind(this),\n            10000,\n        );\n        this.application.on(\n            ApplicationEvents.REVIVE,\n            this.onRevive.bind(this),\n            10000,\n        );\n    }\n\n    private onResolveBegin(context: Context) {\n        this.onRevive(context.project);\n    }\n\n    private onRevive(project: ProjectReflection) {\n        const mods = project.getReflectionsByKind(ReflectionKind.SomeModule);\n        for (const refl of mods) {\n            this.checkAndMerge(refl);\n        }\n    }\n\n    private checkAndMerge(refl: Reflection) {\n        ok(refl.isDeclaration());\n\n        const tag = refl.comment?.getTag(\"@mergeModuleWith\");\n        if (!tag) return;\n\n        const project = refl.project;\n\n        const targetStr = Comment.combineDisplayParts(tag.content);\n        const target = targetStr === \"<project>\"\n            ? project\n            : project.getChildByName(targetStr);\n\n        if (!target?.isDeclaration() && !target?.isProject()) {\n            return;\n        }\n\n        let tempRefl: Reflection = refl;\n        while (tempRefl !== project) {\n            if (tempRefl === target) {\n                this.application.logger.warn(\n                    i18n.reflection_0_tried_to_merge_into_child_1(\n                        refl.getFriendlyFullName(),\n                        target.getFriendlyFullName(),\n                    ),\n                );\n            }\n            tempRefl = tempRefl.parent!;\n        }\n\n        this.application.logger.verbose(\n            `Merging ${refl.getFullName()} into ${target.getFullName()}`,\n        );\n        project.mergeReflections(refl, target);\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/PackagePlugin.ts",
    "content": "import * as Path from \"path\";\n\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport type { ProjectReflection } from \"../../models/index.js\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\nimport { type GlobString, i18n, MinimalSourceFile, type NormalizedPath, NormalizedPathUtils } from \"#utils\";\nimport {\n    deriveRootDir,\n    discoverPackageJson,\n    type EntryPointStrategy,\n    nicePath,\n    normalizePath,\n    Option,\n    readFile,\n} from \"#node-utils\";\nimport { existsSync } from \"fs\";\n\n/**\n * A handler that tries to find the package.json and readme.md files of the\n * current project.\n */\nexport class PackagePlugin extends ConverterComponent {\n    @Option(\"readme\")\n    accessor readme!: string;\n\n    @Option(\"entryPointStrategy\")\n    accessor entryPointStrategy!: EntryPointStrategy;\n\n    @Option(\"entryPoints\")\n    accessor entryPoints!: GlobString[];\n\n    @Option(\"includeVersion\")\n    accessor includeVersion!: boolean;\n\n    /**\n     * The file name of the found readme.md file.\n     */\n    private readmeFile?: NormalizedPath;\n\n    /**\n     * Contents of the readme.md file discovered, if any\n     */\n    private readmeContents?: string;\n\n    /**\n     * Contents of package.json for the active project\n     */\n    private packageJson?: { name: string; version?: string };\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(ConverterEvents.BEGIN, this.onBegin.bind(this));\n        this.owner.on(\n            ConverterEvents.RESOLVE_BEGIN,\n            this.onBeginResolve.bind(this),\n        );\n        this.owner.on(ConverterEvents.END, () => {\n            delete this.readmeFile;\n            delete this.readmeContents;\n            delete this.packageJson;\n        });\n        this.application.on(ApplicationEvents.REVIVE, this.onRevive.bind(this));\n    }\n\n    private onRevive(project: ProjectReflection) {\n        this.onBegin();\n        this.addEntries(project);\n        delete this.readmeFile;\n        delete this.packageJson;\n        delete this.readmeContents;\n    }\n\n    private onBegin() {\n        this.readmeFile = undefined;\n        this.readmeContents = undefined;\n        this.packageJson = undefined;\n\n        const dirName = this.application.options.packageDir ??\n            Path.resolve(deriveRootDir(this.entryPoints));\n\n        this.application.logger.verbose(\n            `Begin package.json search at ${nicePath(dirName)}`,\n        );\n\n        const packageJson = discoverPackageJson(dirName);\n        this.packageJson = packageJson?.content;\n\n        // Path will be resolved already. This is kind of ugly, but...\n        if (this.readme.endsWith(\"none\")) {\n            return; // No readme, we're done\n        }\n\n        if (this.readme) {\n            // Readme path provided, read only that file.\n            this.application.watchFile(this.readme);\n            try {\n                this.readmeContents = readFile(this.readme);\n                this.readmeFile = normalizePath(this.readme);\n            } catch {\n                this.application.logger.error(\n                    i18n.provided_readme_at_0_could_not_be_read(\n                        nicePath(this.readme),\n                    ),\n                );\n            }\n        } else if (packageJson) {\n            // No readme provided, automatically find the readme\n            const possibleReadmePaths = [\n                \"README.md\",\n                \"readme.md\",\n                \"Readme.md\",\n            ].map(name => Path.join(Path.dirname(packageJson.file), name));\n\n            const readmePath = possibleReadmePaths.find(path => {\n                this.application.watchFile(path);\n                return existsSync(path);\n            });\n\n            if (readmePath) {\n                this.readmeFile = normalizePath(readmePath);\n                this.readmeContents = readFile(readmePath);\n                this.application.watchFile(this.readmeFile);\n            }\n        }\n    }\n\n    private onBeginResolve(context: Context) {\n        this.addEntries(context.project);\n    }\n\n    private addEntries(project: ProjectReflection) {\n        if (this.readmeFile && this.readmeContents) {\n            const { content } = this.application.converter.parseRawComment(\n                new MinimalSourceFile(this.readmeContents, this.readmeFile),\n                project.files,\n            );\n\n            project.readme = content;\n            project.files.registerReflectionPath(this.readmeFile, project);\n            // In packages mode, this probably won't do anything unless someone uses the readme\n            // option to select a different file.\n            project.files.registerReflectionPath(NormalizedPathUtils.dirname(this.readmeFile), project);\n\n            // This isn't ideal, but seems better than figuring out the readme\n            // path over in the include plugin...\n            this.owner.includePlugin.checkIncludeTagsParts(\n                project,\n                Path.dirname(this.readmeFile),\n                content,\n            );\n        }\n\n        if (this.packageJson) {\n            project.packageName = this.packageJson.name;\n            if (!project.name) {\n                project.name = project.packageName || \"Documentation\";\n            }\n            if (this.includeVersion) {\n                project.packageVersion = this.packageJson.version?.replace(\n                    /^v/,\n                    \"\",\n                );\n            }\n        } else if (!project.name) {\n            this.application.logger.warn(\n                i18n.defaulting_project_name(),\n            );\n            project.name = \"Documentation\";\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/SourcePlugin.ts",
    "content": "import ts from \"typescript\";\n\nimport { DeclarationReflection, ReflectionKind, SignatureReflection } from \"../../models/index.js\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { getCommonDirectory, normalizePath, Option } from \"../../utils/index.js\";\nimport { isNamedNode } from \"../utils/nodes.js\";\nimport { relative } from \"path\";\nimport { SourceReference } from \"../../models/index.js\";\nimport { gitIsInstalled, RepositoryManager } from \"../utils/repository.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\nimport { i18n } from \"#utils\";\n\n/**\n * A handler that attaches source file information to reflections.\n */\nexport class SourcePlugin extends ConverterComponent {\n    @Option(\"disableSources\")\n    accessor disableSources!: boolean;\n\n    @Option(\"gitRevision\")\n    accessor gitRevision!: string;\n\n    @Option(\"gitRemote\")\n    accessor gitRemote!: string;\n\n    @Option(\"disableGit\")\n    accessor disableGit!: boolean;\n\n    @Option(\"sourceLinkTemplate\")\n    accessor sourceLinkTemplate!: string;\n\n    get displayBasePath() {\n        return this.application.options.getValue(\"displayBasePath\") || this.application.options.getValue(\"basePath\");\n    }\n\n    /**\n     * All file names to find the base path from.\n     */\n    private fileNames = new Set<string>();\n\n    private repositories?: RepositoryManager;\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(ConverterEvents.END, this.onEnd.bind(this));\n        this.owner.on(\n            ConverterEvents.CREATE_DECLARATION,\n            this.onDeclaration.bind(this),\n        );\n        this.owner.on(\n            ConverterEvents.CREATE_SIGNATURE,\n            this.onSignature.bind(this),\n        );\n        this.owner.on(\n            ConverterEvents.RESOLVE_BEGIN,\n            this.onBeginResolve.bind(this),\n        );\n    }\n\n    private onEnd() {\n        this.fileNames.clear();\n        delete this.repositories;\n    }\n\n    /**\n     * Triggered when the converter has created a declaration reflection.\n     *\n     * Attach the current source file to the {@link DeclarationReflection.sources} array.\n     *\n     * @param _context  The context object describing the current state the converter is in.\n     * @param reflection  The reflection that is currently processed.\n     */\n    private onDeclaration(\n        context: Context,\n        reflection: DeclarationReflection,\n    ) {\n        if (this.disableSources || reflection.kindOf(ReflectionKind.TypeLiteral)) return;\n\n        const symbol = context.getSymbolFromReflection(reflection);\n        for (const node of symbol?.declarations || []) {\n            const sourceFile = node.getSourceFile();\n            const fileName = normalizePath(sourceFile.fileName);\n            this.fileNames.add(fileName);\n\n            let position: ts.LineAndCharacter;\n            if (ts.isSourceFile(node)) {\n                position = { character: 0, line: 0 };\n            } else {\n                position = ts.getLineAndCharacterOfPosition(\n                    sourceFile,\n                    getLocationNode(node).getStart(),\n                );\n            }\n\n            reflection.sources ||= [];\n            reflection.sources.push(\n                new SourceReference(\n                    fileName,\n                    position.line + 1,\n                    position.character,\n                ),\n            );\n        }\n    }\n\n    private onSignature(\n        _context: Context,\n        reflection: SignatureReflection,\n        sig?:\n            | ts.SignatureDeclaration\n            | ts.IndexSignatureDeclaration\n            | ts.JSDocSignature,\n    ) {\n        if (this.disableSources || !sig || reflection.parent.kindOf(ReflectionKind.TypeLiteral)) return;\n\n        const sourceFile = sig.getSourceFile();\n        const fileName = normalizePath(sourceFile.fileName);\n        this.fileNames.add(fileName);\n\n        const position = ts.getLineAndCharacterOfPosition(\n            sourceFile,\n            getLocationNode(sig).getStart(),\n        );\n\n        reflection.sources ||= [];\n        reflection.sources.push(\n            new SourceReference(\n                fileName,\n                position.line + 1,\n                position.character,\n            ),\n        );\n    }\n\n    /**\n     * Triggered when the converter begins resolving a project.\n     *\n     * @param context  The context object describing the current state the converter is in.\n     */\n    private onBeginResolve(context: Context) {\n        if (this.disableSources) return;\n\n        if (this.disableGit && !this.sourceLinkTemplate) {\n            this.application.logger.error(\n                i18n.disable_git_set_but_not_source_link_template(),\n            );\n            return;\n        }\n        if (\n            this.disableGit &&\n            this.sourceLinkTemplate.includes(\"{gitRevision}\") &&\n            !this.gitRevision\n        ) {\n            this.application.logger.warn(\n                i18n.disable_git_set_and_git_revision_used(),\n            );\n        }\n\n        const basePath = this.displayBasePath || getCommonDirectory([...this.fileNames]);\n        this.repositories ||= new RepositoryManager(\n            basePath,\n            this.gitRevision,\n            this.gitRemote,\n            this.sourceLinkTemplate,\n            this.disableGit,\n            this.application.logger,\n        );\n\n        for (const id in context.project.reflections) {\n            const refl = context.project.reflections[id];\n\n            if (\n                !(\n                    refl instanceof DeclarationReflection ||\n                    refl instanceof SignatureReflection\n                )\n            ) {\n                continue;\n            }\n\n            if (replaceSourcesWithParentSources(context, refl)) {\n                refl.sources = (refl.parent as DeclarationReflection).sources;\n            }\n\n            for (const source of refl.sources || []) {\n                if (this.disableGit || gitIsInstalled()) {\n                    const repo = this.repositories.getRepository(\n                        source.fullFileName,\n                    );\n                    source.url = repo?.getURL(source.fullFileName, source.line);\n                }\n\n                source.fileName = normalizePath(\n                    relative(basePath, source.fullFileName),\n                );\n            }\n        }\n    }\n}\n\nfunction getLocationNode(node: ts.Node) {\n    if (isNamedNode(node)) return node.name;\n    return node;\n}\n\nfunction replaceSourcesWithParentSources(\n    context: Context,\n    refl: SignatureReflection | DeclarationReflection,\n) {\n    if (refl instanceof DeclarationReflection || !refl.sources) {\n        return false;\n    }\n\n    const symbol = context.getSymbolFromReflection(refl.parent);\n    if (!symbol?.declarations) {\n        return false;\n    }\n\n    for (const decl of symbol.declarations) {\n        const file = decl.getSourceFile();\n        const pos = file.getLineAndCharacterOfPosition(decl.pos);\n        const end = file.getLineAndCharacterOfPosition(decl.end);\n\n        if (\n            refl.sources.some(\n                (src) =>\n                    src.fullFileName === file.fileName &&\n                    pos.line <= src.line - 1 &&\n                    src.line - 1 <= end.line,\n            )\n        ) {\n            return false;\n        }\n    }\n\n    return true;\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/TypePlugin.ts",
    "content": "import {\n    type DeclarationHierarchy,\n    DeclarationReflection,\n    type ProjectReflection,\n    type Reflection,\n    ReflectionKind,\n} from \"../../models/index.js\";\nimport { ReferenceType, type SomeType, type Type } from \"../../models/types.js\";\nimport { ConverterComponent } from \"../components.js\";\nimport type { Context } from \"../context.js\";\nimport { ApplicationEvents } from \"../../application-events.js\";\nimport { ConverterEvents } from \"../converter-events.js\";\nimport type { Converter } from \"../converter.js\";\n\n/**\n * Responsible for adding `implementedBy` / `implementedFrom`\n */\nexport class TypePlugin extends ConverterComponent {\n    reflections = new Set<DeclarationReflection>();\n\n    constructor(owner: Converter) {\n        super(owner);\n        this.owner.on(ConverterEvents.RESOLVE, this.onResolve.bind(this));\n        this.owner.on(\n            ConverterEvents.RESOLVE_END,\n            this.onResolveEnd.bind(this),\n        );\n        this.owner.on(ConverterEvents.END, () => this.reflections.clear());\n        this.application.on(\n            ApplicationEvents.REVIVE,\n            this.onRevive.bind(this),\n            100,\n        );\n    }\n\n    private onRevive(project: ProjectReflection) {\n        for (const id in project.reflections) {\n            this.resolve(project, project.reflections[id]);\n        }\n        this.finishResolve(project);\n        this.reflections.clear();\n    }\n\n    private onResolve(context: Context, reflection: Reflection) {\n        this.resolve(context.project, reflection);\n    }\n\n    private resolve(project: ProjectReflection, reflection: Reflection) {\n        if (!(reflection instanceof DeclarationReflection)) return;\n\n        if (reflection.kindOf(ReflectionKind.ClassOrInterface)) {\n            this.postpone(reflection);\n\n            walk(reflection.implementedTypes, (target) => {\n                this.postpone(target);\n                target.implementedBy ||= [];\n\n                if (\n                    !target.implementedBy.some(\n                        (t) => t.reflection === reflection,\n                    )\n                ) {\n                    target.implementedBy.push(\n                        ReferenceType.createResolvedReference(\n                            reflection.name,\n                            reflection,\n                            project,\n                        ),\n                    );\n                }\n            });\n\n            walk(reflection.extendedTypes, (target) => {\n                this.postpone(target);\n                target.extendedBy ||= [];\n\n                if (\n                    !target.extendedBy.some((t) => t.reflection === reflection)\n                ) {\n                    target.extendedBy.push(\n                        ReferenceType.createResolvedReference(\n                            reflection.name,\n                            reflection,\n                            project,\n                        ),\n                    );\n                }\n            });\n        }\n\n        function walk(\n            types: Type[] | undefined,\n            callback: { (declaration: DeclarationReflection): void },\n        ) {\n            if (!types) {\n                return;\n            }\n            types.forEach((type) => {\n                if (!(type instanceof ReferenceType)) {\n                    return;\n                }\n                if (\n                    !type.reflection ||\n                    !(type.reflection instanceof DeclarationReflection)\n                ) {\n                    return;\n                }\n                callback(type.reflection);\n            });\n        }\n    }\n\n    private postpone(reflection: DeclarationReflection) {\n        this.reflections.add(reflection);\n    }\n\n    private onResolveEnd(context: Context) {\n        this.finishResolve(context.project);\n    }\n\n    private finishResolve(project: ProjectReflection) {\n        this.reflections.forEach((reflection) => {\n            if (reflection.implementedBy) {\n                reflection.implementedBy.sort((a, b) => {\n                    if (a.name === b.name) {\n                        return 0;\n                    }\n                    return a.name > b.name ? 1 : -1;\n                });\n            }\n\n            let root: DeclarationHierarchy | undefined;\n            let hierarchy: DeclarationHierarchy | undefined;\n            function push(types: SomeType[]) {\n                const level: DeclarationHierarchy = { types: types };\n                if (hierarchy) {\n                    hierarchy.next = level;\n                    hierarchy = level;\n                } else {\n                    root = hierarchy = level;\n                }\n            }\n\n            if (reflection.extendedTypes) {\n                push(reflection.extendedTypes);\n            }\n\n            push([\n                ReferenceType.createResolvedReference(\n                    reflection.name,\n                    reflection,\n                    project,\n                ),\n            ]);\n            hierarchy!.isTarget = true;\n\n            if (reflection.extendedBy) {\n                push(reflection.extendedBy);\n            }\n\n            // No point setting up a hierarchy if there is no hierarchy to display\n            if (root!.next) {\n                reflection.typeHierarchy = root;\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/lib/converter/plugins/index.ts",
    "content": "export { CategoryPlugin } from \"./CategoryPlugin.js\";\nexport { CommentPlugin } from \"./CommentPlugin.js\";\nexport { GroupPlugin } from \"./GroupPlugin.js\";\nexport { ImplementsPlugin } from \"./ImplementsPlugin.js\";\nexport { IncludePlugin } from \"./IncludePlugin.js\";\nexport { InheritDocPlugin } from \"./InheritDocPlugin.js\";\nexport { LinkResolverPlugin } from \"./LinkResolverPlugin.js\";\nexport { PackagePlugin } from \"./PackagePlugin.js\";\nexport { SourcePlugin } from \"./SourcePlugin.js\";\nexport { TypePlugin } from \"./TypePlugin.js\";\n"
  },
  {
    "path": "src/lib/converter/symbols.ts",
    "content": "import assert from \"assert\";\nimport ts from \"typescript\";\nimport {\n    DeclarationReflection,\n    IntrinsicType,\n    LiteralType,\n    ReferenceReflection,\n    type Reflection,\n    ReflectionFlag,\n    ReflectionKind,\n    type UnionType,\n} from \"../models/index.js\";\nimport { getEnumFlags, hasAllFlags, hasAnyFlag, i18n, removeFlag } from \"#utils\";\nimport type { Context } from \"./context.js\";\nimport { convertDefaultValue } from \"./convert-expression.js\";\nimport { convertIndexSignatures } from \"./factories/index-signature.js\";\nimport {\n    convertConstructSignatures,\n    convertTypeParameters,\n    createConstructSignatureWithType,\n    createSignature,\n    createTypeParamReflection,\n} from \"./factories/signature.js\";\nimport { convertJsDocAlias, convertJsDocCallback } from \"./jsdoc.js\";\nimport { getHeritageTypes } from \"./utils/nodes.js\";\nimport { removeUndefined } from \"./utils/reflections.js\";\nimport { resolveAliasedSymbol } from \"./utils/symbols.js\";\n\nconst symbolConverters: {\n    [K in ts.SymbolFlags]?: (\n        context: Context,\n        symbol: ts.Symbol,\n        exportSymbol?: ts.Symbol,\n    ) => undefined | ts.SymbolFlags;\n} = {\n    [ts.SymbolFlags.RegularEnum]: convertEnum,\n    [ts.SymbolFlags.ConstEnum]: convertEnum,\n    [ts.SymbolFlags.EnumMember]: convertEnumMember,\n    [ts.SymbolFlags.ValueModule]: convertNamespace,\n    [ts.SymbolFlags.NamespaceModule]: convertNamespace,\n    [ts.SymbolFlags.TypeAlias]: convertTypeAlias,\n    [ts.SymbolFlags.Function]: convertFunctionOrMethod,\n    [ts.SymbolFlags.Method]: convertFunctionOrMethod,\n    [ts.SymbolFlags.Interface]: convertClassOrInterface,\n    [ts.SymbolFlags.Property]: convertProperty,\n    [ts.SymbolFlags.Class]: convertClassOrInterface,\n    [ts.SymbolFlags.Constructor]: convertConstructor,\n    [ts.SymbolFlags.Alias]: convertAlias,\n    [ts.SymbolFlags.BlockScopedVariable]: convertVariable,\n    [ts.SymbolFlags.FunctionScopedVariable]: convertVariable,\n    [ts.SymbolFlags.ExportValue]: convertVariable,\n    [ts.SymbolFlags.GetAccessor]: convertAccessor,\n    [ts.SymbolFlags.SetAccessor]: convertAccessor,\n};\n\nconst allConverterFlags = Object.keys(symbolConverters).reduce(\n    (v, k) => v | +k,\n    0,\n);\n\n// This is kind of a hack, born of resolving references by symbols instead\n// of by source location.\nconst conversionOrder = [\n    // Do enums before namespaces so that @hidden on a namespace\n    // merged with an enum works properly.\n    ts.SymbolFlags.RegularEnum,\n    ts.SymbolFlags.ConstEnum,\n    ts.SymbolFlags.EnumMember,\n\n    // Before type alias\n    ts.SymbolFlags.BlockScopedVariable,\n    ts.SymbolFlags.FunctionScopedVariable,\n    ts.SymbolFlags.ExportValue,\n    ts.SymbolFlags.Function, // Before NamespaceModule\n\n    ts.SymbolFlags.TypeAlias,\n    ts.SymbolFlags.Method,\n    ts.SymbolFlags.Interface,\n    ts.SymbolFlags.Property,\n    ts.SymbolFlags.Class,\n    ts.SymbolFlags.Constructor,\n    ts.SymbolFlags.Alias,\n\n    ts.SymbolFlags.GetAccessor,\n    ts.SymbolFlags.SetAccessor,\n\n    ts.SymbolFlags.ValueModule,\n    ts.SymbolFlags.NamespaceModule,\n];\n\n// Sanity check, if this fails a dev messed up.\nfor (const key of Object.keys(symbolConverters)) {\n    assert(\n        Number.isInteger(Math.log2(+key)),\n        `Symbol converter for key ${ts.SymbolFlags[+key]} does not specify a valid flag value.`,\n    );\n\n    assert(\n        conversionOrder.includes(+key),\n        `Symbol converter for key ${ts.SymbolFlags[+key]} is not specified in conversionOrder`,\n    );\n}\n\nassert(\n    conversionOrder.reduce((a, b) => a | b, 0) === allConverterFlags,\n    \"conversionOrder contains a symbol flag that converters do not.\",\n);\n\nfunction _convertSymbolNow(context: Context, symbol: ts.Symbol, exportSymbol: ts.Symbol | undefined) {\n    if (context.shouldIgnore(resolveAliasedSymbol(symbol, context.checker))) {\n        return;\n    }\n\n    // This check can catch symbols which ought to be documented as references\n    // but aren't aliased symbols because `export *` was used.\n    const previous = context.getReflectionFromSymbol(symbol);\n    if (\n        previous &&\n        previous.parent?.kindOf(\n            ReflectionKind.SomeModule | ReflectionKind.Project,\n        )\n    ) {\n        createAlias(previous, context, symbol, exportSymbol);\n        return;\n    }\n\n    let flags = removeFlag(\n        symbol.flags,\n        ts.SymbolFlags.Transient |\n            ts.SymbolFlags.Assignment |\n            ts.SymbolFlags.Optional |\n            ts.SymbolFlags.Prototype,\n    );\n\n    // Declaration merging - the only type (excluding enum/enum, ns/ns, etc)\n    // that TD supports is merging a class and interface. All others are\n    // represented as multiple reflections\n    if (hasAllFlags(symbol.flags, ts.SymbolFlags.Class)) {\n        flags = removeFlag(\n            flags,\n            ts.SymbolFlags.Interface | ts.SymbolFlags.Function,\n        );\n    }\n\n    // Kind of declaration merging... we treat this as a property with get/set signatures.\n    if (hasAllFlags(symbol.flags, ts.SymbolFlags.GetAccessor)) {\n        flags = removeFlag(flags, ts.SymbolFlags.SetAccessor);\n    }\n\n    if (hasAllFlags(symbol.flags, ts.SymbolFlags.NamespaceModule)) {\n        // This might be here if a namespace is declared several times.\n        // Or if it's a namespace-like thing defined on a function\n        // In the function case, it's important to remove ValueModule so that\n        // if we convert the children as properties of the function rather than as\n        // a separate namespace, we skip creating the namespace.\n        flags = removeFlag(flags, ts.SymbolFlags.ValueModule);\n    }\n\n    if (\n        hasAnyFlag(\n            symbol.flags,\n            ts.SymbolFlags.Method |\n                ts.SymbolFlags.Interface |\n                ts.SymbolFlags.Class |\n                ts.SymbolFlags.Variable,\n        )\n    ) {\n        // This happens when someone declares an object with methods:\n        // { methodProperty() {} }\n        flags = removeFlag(flags, ts.SymbolFlags.Property);\n    }\n\n    for (const flag of getEnumFlags(flags & ~allConverterFlags)) {\n        context.logger.verbose(\n            `Missing converter for symbol: ${symbol.name} with flag ${ts.SymbolFlags[flag]}`,\n        );\n    }\n\n    const selectedConverters = conversionOrder.filter(flag => flag & flags);\n\n    let skip = 0;\n    for (const flag of selectedConverters) {\n        if (skip & flag) continue;\n\n        skip |= symbolConverters[flag]?.(context, symbol, exportSymbol) || 0;\n    }\n}\n\nexport function convertSymbol(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): void {\n    // #1795, defer conversion of symbols named `default` so that if a function\n    // is default exported and also exported with a name, the name takes precedence\n    if (\n        (exportSymbol?.name ?? symbol.name) === \"default\" &&\n        context.scope.kindOf(ReflectionKind.ExportContainer)\n    ) {\n        context.converter.deferConversion(() => {\n            _convertSymbolNow(context, symbol, exportSymbol);\n        });\n        return;\n    }\n\n    _convertSymbolNow(context, symbol, exportSymbol);\n}\n\nfunction convertSymbols(context: Context, symbols: readonly ts.Symbol[]) {\n    for (const symbol of symbols) {\n        convertSymbol(context, symbol);\n    }\n}\n\nfunction convertEnum(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Enum,\n        symbol,\n        exportSymbol,\n    );\n\n    if (symbol.flags & ts.SymbolFlags.ConstEnum) {\n        reflection.setFlag(ReflectionFlag.Const);\n    }\n\n    context.finalizeDeclarationReflection(reflection);\n\n    convertSymbols(\n        context.withScope(reflection),\n        context.checker\n            .getExportsOfModule(symbol)\n            .filter((s) => s.flags & ts.SymbolFlags.EnumMember),\n    );\n}\n\nfunction convertEnumMember(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.EnumMember,\n        symbol,\n        exportSymbol,\n    );\n\n    const defaultValue = context.checker.getConstantValue(\n        symbol.getDeclarations()![0] as ts.EnumMember,\n    );\n\n    if (defaultValue !== undefined) {\n        reflection.type = new LiteralType(defaultValue);\n    } else {\n        // We know this has to be a number, because computed values aren't allowed\n        // in string enums, so otherwise we would have to have the constant value\n        reflection.type = new IntrinsicType(\"number\");\n    }\n\n    context.finalizeDeclarationReflection(reflection);\n}\n\nfunction convertNamespace(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    let exportFlags = ts.SymbolFlags.ModuleMember;\n\n    // This can happen in JS land where \"class\" functions get tagged as a namespace too\n    if (\n        symbol\n            .getDeclarations()\n            ?.some((d) => ts.isModuleDeclaration(d) || ts.isSourceFile(d)) !==\n            true\n    ) {\n        exportFlags = ts.SymbolFlags.ClassMember;\n\n        if (hasAnyFlag(symbol.flags, ts.SymbolFlags.Class)) {\n            return;\n        }\n    }\n\n    if (symbol.declarations?.some(ts.isFunctionDeclaration)) {\n        exportFlags |= ts.SymbolFlags.PropertyOrAccessor;\n    }\n\n    // #2364, @namespace on a variable might be merged with a namespace containing types.\n    const existingReflection = context.getReflectionFromSymbol(\n        exportSymbol || symbol,\n    );\n\n    let reflection: DeclarationReflection;\n    if (existingReflection?.kind === ReflectionKind.Namespace) {\n        reflection = existingReflection as DeclarationReflection;\n    } else {\n        let kind = ReflectionKind.Namespace;\n        let nameOverride: string | undefined;\n\n        // #2778 - always treat declare module \"foo\" as a module, not a namespace\n        const declareModule = symbol.declarations?.find(\n            (mod): mod is ts.ModuleDeclaration => ts.isModuleDeclaration(mod) && ts.isStringLiteral(mod.name),\n        );\n        if (declareModule) {\n            kind = ReflectionKind.Module;\n            nameOverride = declareModule.name.text;\n        }\n\n        reflection = context.createDeclarationReflection(\n            kind,\n            symbol,\n            exportSymbol,\n            nameOverride,\n        );\n        context.finalizeDeclarationReflection(reflection);\n    }\n\n    convertSymbols(\n        context.withScope(reflection),\n        context.checker\n            .getExportsOfModule(symbol)\n            .filter((s) => s.flags & exportFlags),\n    );\n}\n\nfunction convertTypeAlias(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    const declaration = symbol\n        .getDeclarations()\n        ?.find(\n            (\n                d,\n            ): d is\n                | ts.TypeAliasDeclaration\n                | ts.JSDocTypedefTag\n                | ts.JSDocCallbackTag\n                | ts.JSDocEnumTag =>\n                ts.isTypeAliasDeclaration(d) ||\n                ts.isJSDocTypedefTag(d) ||\n                ts.isJSDocCallbackTag(d) ||\n                ts.isJSDocEnumTag(d),\n        );\n    assert(declaration);\n\n    if (ts.isTypeAliasDeclaration(declaration)) {\n        if (\n            context\n                .getComment(symbol, ReflectionKind.TypeAlias)\n                ?.hasModifier(\"@interface\")\n        ) {\n            return convertTypeAliasAsInterface(\n                context,\n                symbol,\n                exportSymbol,\n                declaration,\n            );\n        }\n\n        const reflection = context.createDeclarationReflection(\n            ReflectionKind.TypeAlias,\n            symbol,\n            exportSymbol,\n        );\n        context.finalizeDeclarationReflection(reflection);\n\n        if (reflection.comment?.hasModifier(\"@useDeclaredType\")) {\n            reflection.comment.removeModifier(\"@useDeclaredType\");\n            reflection.type = context.converter.convertType(\n                context.withScope(reflection),\n                context.checker.getDeclaredTypeOfSymbol(symbol),\n            );\n        } else {\n            reflection.type = context.converter.convertType(\n                context.withScope(reflection),\n                declaration.type,\n            );\n        }\n\n        if (reflection.type.type === \"union\") {\n            attachUnionComments(context, declaration, reflection.type);\n        } else if (reflection.type.type === \"reflection\" && reflection.type.declaration.children) {\n            // #2817 lift properties of object literal types up to the reflection level.\n            const typeDecl = reflection.type.declaration;\n            reflection.project.mergeReflections(typeDecl, reflection);\n            delete reflection.type;\n\n            // When created any signatures will be created with __type as their\n            // name, rename them so that they have the alias's name as their name\n            for (const sig of reflection.signatures || []) {\n                sig.name = reflection.name;\n            }\n        }\n\n        reflection.typeParameters = declaration.typeParameters?.map((param) =>\n            createTypeParamReflection(param, context.withScope(reflection))\n        );\n    } else if (\n        ts.isJSDocTypedefTag(declaration) ||\n        ts.isJSDocEnumTag(declaration)\n    ) {\n        convertJsDocAlias(context, symbol, declaration, exportSymbol);\n    } else {\n        convertJsDocCallback(context, symbol, declaration, exportSymbol);\n    }\n}\n\nfunction convertTypeAliasFromValueDeclaration(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol: ts.Symbol | undefined,\n    valueKind: ReflectionKind,\n): undefined {\n    const comment = context.getComment(symbol, valueKind);\n\n    const reflection = new DeclarationReflection(\n        exportSymbol?.name || symbol.name,\n        ReflectionKind.TypeAlias,\n        context.scope,\n    );\n    reflection.comment = comment;\n    context.postReflectionCreation(reflection, symbol, exportSymbol);\n    context.finalizeDeclarationReflection(reflection);\n\n    reflection.type = context.converter.convertType(\n        context.withScope(reflection),\n        context.checker.getTypeOfSymbol(symbol),\n    );\n\n    if (reflection.type.type === \"reflection\" && reflection.type.declaration.children) {\n        // #2817 lift properties of object literal types up to the reflection level.\n        const typeDecl = reflection.type.declaration;\n        reflection.project.mergeReflections(typeDecl, reflection);\n        delete reflection.type;\n\n        // When created any signatures will be created with __type as their\n        // name, rename them so that they have the alias's name as their name\n        for (const sig of reflection.signatures || []) {\n            sig.name = reflection.name;\n        }\n    }\n}\n\nfunction attachUnionComments(\n    context: Context,\n    declaration: ts.TypeAliasDeclaration,\n    union: UnionType,\n) {\n    const list = declaration.type.getChildAt(0);\n    if (list.kind !== ts.SyntaxKind.SyntaxList) return;\n\n    let unionIndex = 0;\n    for (const child of list.getChildren()) {\n        const comment = context.getNodeComment(child, false);\n        if (comment?.modifierTags.size || comment?.blockTags.length) {\n            context.logger.warn(\n                i18n.comment_for_0_should_not_contain_block_or_modifier_tags(\n                    `${context.scope.getFriendlyFullName()}.${unionIndex}`,\n                ),\n                child,\n            );\n        }\n\n        if (comment) {\n            union.elementSummaries ||= Array.from(\n                { length: union.types.length },\n                () => [],\n            );\n            union.elementSummaries[unionIndex] = comment.summary;\n        }\n\n        if (child.kind !== ts.SyntaxKind.BarToken) {\n            ++unionIndex;\n        }\n    }\n}\n\nfunction convertTypeAliasAsInterface(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol: ts.Symbol | undefined,\n    declaration: ts.TypeAliasDeclaration,\n): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Interface,\n        symbol,\n        exportSymbol,\n    );\n    context.finalizeDeclarationReflection(reflection);\n    const rc = context.withScope(reflection);\n\n    const type = context.checker.getTypeAtLocation(declaration);\n\n    if (type.getFlags() & ts.TypeFlags.Union) {\n        context.logger.warn(\n            i18n.converting_union_as_interface(),\n            declaration,\n        );\n    }\n\n    // Interfaces have properties\n    convertSymbols(rc, type.getProperties());\n\n    // And type arguments\n    if (declaration.typeParameters) {\n        reflection.typeParameters = declaration.typeParameters.map((param) => {\n            const declaration = param.symbol?.declarations?.[0];\n            assert(declaration && ts.isTypeParameterDeclaration(declaration));\n            return createTypeParamReflection(declaration, rc);\n        });\n    }\n\n    // And maybe call signatures\n    context.checker\n        .getSignaturesOfType(type, ts.SignatureKind.Call)\n        .forEach((sig) => createSignature(rc, ReflectionKind.CallSignature, sig, symbol));\n\n    // And maybe constructor signatures\n    convertConstructSignatures(rc, symbol);\n\n    // And finally, index signatures\n    convertIndexSignatures(rc, type);\n}\n\nfunction convertFunctionOrMethod(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined | ts.SymbolFlags {\n    if (isTypeOnlyExport(exportSymbol)) {\n        return convertTypeAliasFromValueDeclaration(context, symbol, exportSymbol, ReflectionKind.Function);\n    }\n\n    // Can't just check method flag because this might be called for properties as well\n    // This will *NOT* be called for variables that look like functions, they need a special case.\n    const isMethod = !!(\n        symbol.flags &\n        (ts.SymbolFlags.Property | ts.SymbolFlags.Method)\n    );\n\n    if (!isMethod) {\n        const comment = context.getComment(symbol, ReflectionKind.Function);\n        if (comment?.hasModifier(\"@class\")) {\n            return convertSymbolAsClass(context, symbol, exportSymbol);\n        }\n    }\n\n    const declarations = symbol.getDeclarations()?.filter(ts.isFunctionLike) ?? [];\n\n    // Don't do anything if we inherited this method and it is private.\n    if (\n        isMethod &&\n        isInherited(context, symbol) &&\n        declarations.length > 0 &&\n        hasAllFlags(\n            ts.getCombinedModifierFlags(declarations[0]),\n            ts.ModifierFlags.Private,\n        )\n    ) {\n        return;\n    }\n\n    const locationDeclaration = symbol.parent\n        ?.getDeclarations()\n        ?.find(\n            (d) => ts.isClassDeclaration(d) || ts.isInterfaceDeclaration(d),\n        ) ??\n        symbol.parent?.getDeclarations()?.[0]?.getSourceFile() ??\n        symbol.getDeclarations()?.[0]?.getSourceFile();\n    assert(locationDeclaration, \"Missing declaration context\");\n\n    const type = context.checker.getTypeOfSymbolAtLocation(\n        symbol,\n        locationDeclaration,\n    );\n    // Need to get the non nullable type because interface methods might be declared\n    // with a question token. See GH1490.\n    const signatures = type.getNonNullableType().getCallSignatures();\n\n    const reflection = context.createDeclarationReflection(\n        context.scope.kindOf(ReflectionKind.MethodContainer)\n            ? ReflectionKind.Method\n            : ReflectionKind.Function,\n        symbol,\n        exportSymbol,\n        void 0,\n    );\n\n    if (symbol.declarations?.length && isMethod) {\n        // All method signatures must have the same modifier flags.\n        setModifiers(symbol, symbol.declarations[0], reflection);\n    }\n    context.finalizeDeclarationReflection(reflection);\n\n    const scope = context.withScope(reflection);\n\n    for (const sig of signatures) {\n        createSignature(scope, ReflectionKind.CallSignature, sig, symbol);\n    }\n\n    return convertFunctionProperties(scope, symbol, type);\n}\n\n// getDeclaredTypeOfSymbol gets the INSTANCE type\n// getTypeOfSymbolAtLocation gets the STATIC type\nfunction convertClassOrInterface(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n) {\n    const reflection = context.createDeclarationReflection(\n        (ts.SymbolFlags.Class & symbol.flags) && !isTypeOnlyExport(exportSymbol)\n            ? ReflectionKind.Class\n            : ReflectionKind.Interface,\n        symbol,\n        exportSymbol,\n        void 0,\n    );\n\n    const classDeclaration = symbol\n        .getDeclarations()\n        ?.find((d) => ts.isClassDeclaration(d) || ts.isFunctionDeclaration(d));\n    if (classDeclaration) setModifiers(symbol, classDeclaration, reflection);\n\n    const reflectionContext = context.withScope(reflection);\n    reflectionContext.convertingClassOrInterface = true;\n\n    const instanceType = context.checker.getDeclaredTypeOfSymbol(symbol);\n    assert(instanceType.isClassOrInterface());\n\n    // We might do some inheritance - do this first so that it's set when converting properties\n    const declarations = symbol\n        .getDeclarations()\n        ?.filter(\n            (d): d is ts.InterfaceDeclaration | ts.ClassDeclaration =>\n                ts.isInterfaceDeclaration(d) || ts.isClassDeclaration(d),\n        ) ?? [];\n\n    const extendedTypes = getHeritageTypes(\n        declarations,\n        ts.SyntaxKind.ExtendsKeyword,\n    ).map((t) => context.converter.convertType(reflectionContext, t));\n    if (extendedTypes.length) {\n        reflection.extendedTypes = extendedTypes;\n    }\n\n    const implementedTypes = getHeritageTypes(\n        declarations,\n        ts.SyntaxKind.ImplementsKeyword,\n    ).map((t) => context.converter.convertType(reflectionContext, t));\n    if (implementedTypes.length) {\n        reflection.implementedTypes = implementedTypes;\n    }\n\n    context.finalizeDeclarationReflection(reflection);\n\n    // Convert type parameters early so that we get access them when converting the constructors if any\n    if (instanceType.typeParameters) {\n        reflection.typeParameters = instanceType.typeParameters.map((param) => {\n            const declaration = param.symbol.declarations?.[0];\n            assert(declaration && ts.isTypeParameterDeclaration(declaration));\n            return createTypeParamReflection(declaration, reflectionContext);\n        });\n    }\n\n    if (classDeclaration && reflection.kind === ReflectionKind.Class) {\n        // Classes can have static props\n        const staticType = context.checker.getTypeOfSymbolAtLocation(\n            symbol,\n            classDeclaration,\n        );\n\n        reflectionContext.shouldBeStatic = true;\n        for (const prop of context.checker.getPropertiesOfType(staticType)) {\n            // Don't convert namespace members, or the prototype here.\n            if (\n                prop.flags &\n                (ts.SymbolFlags.ModuleMember | ts.SymbolFlags.Prototype)\n            ) {\n                continue;\n            }\n            convertSymbol(reflectionContext, prop);\n        }\n        reflectionContext.shouldBeStatic = false;\n\n        const ctors = staticType.getConstructSignatures();\n\n        const constructMember = reflectionContext.createDeclarationReflection(\n            ReflectionKind.Constructor,\n            ctors[0]?.declaration?.symbol,\n            void 0,\n            \"constructor\",\n        );\n\n        // Modifiers are the same for all constructors\n        if (ctors.length && ctors[0].declaration) {\n            setModifiers(symbol, ctors[0].declaration, constructMember);\n        }\n\n        context.finalizeDeclarationReflection(constructMember);\n\n        const constructContext = reflectionContext.withScope(constructMember);\n\n        ctors.forEach((sig) => {\n            createSignature(\n                constructContext,\n                ReflectionKind.ConstructorSignature,\n                sig,\n                symbol,\n            );\n        });\n    }\n\n    // Classes/interfaces usually just have properties...\n    convertSymbols(\n        reflectionContext,\n        context.checker.getPropertiesOfType(instanceType),\n    );\n\n    // Interfaces might also have call signatures\n    // Classes might too, because of declaration merging\n    context.checker\n        .getSignaturesOfType(instanceType, ts.SignatureKind.Call)\n        .forEach((sig) =>\n            createSignature(\n                reflectionContext,\n                ReflectionKind.CallSignature,\n                sig,\n                symbol,\n            )\n        );\n\n    // We also might have constructor signatures\n    // This is potentially a problem with classes having multiple \"constructor\" members...\n    // but nobody has complained yet.\n    convertConstructSignatures(reflectionContext, symbol);\n\n    // And finally, index signatures\n    convertIndexSignatures(reflectionContext, instanceType);\n\n    // Normally this shouldn't matter, unless someone did something with skipLibCheck on.\n    return ts.SymbolFlags.Alias;\n}\n\nfunction convertProperty(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined | ts.SymbolFlags {\n    // This might happen if we're converting a function-module created with Object.assign\n    // or `export default () => {}`\n    if (context.scope.kindOf(ReflectionKind.VariableContainer)) {\n        return convertVariable(context, symbol, exportSymbol);\n    }\n\n    const declarations = symbol.getDeclarations() ?? [];\n\n    // Don't do anything if we inherited this property and it is private.\n    if (\n        isInherited(context, symbol) &&\n        declarations.length > 0 &&\n        hasAllFlags(\n            ts.getCombinedModifierFlags(declarations[0]),\n            ts.ModifierFlags.Private,\n        )\n    ) {\n        return;\n    }\n\n    // Special case: We pretend properties are methods if they look like methods.\n    // This happens with mixins / weird inheritance. Don't do this if the type\n    // doesn't have call signatures to avoid converting non-functions. This can\n    // happen if @class is used and functions are converted to their return type\n    // with a mapped type (e.g. with Vue's `computed` properties)\n    const type = context.checker.getTypeOfSymbol(symbol);\n    if (\n        type.getCallSignatures().length &&\n        declarations.length &&\n        declarations.every(\n            (decl) => ts.isMethodSignature(decl) || ts.isMethodDeclaration(decl),\n        )\n    ) {\n        return convertFunctionOrMethod(context, symbol, exportSymbol);\n    }\n\n    if (declarations.length === 1) {\n        const declaration = declarations[0];\n\n        // Special case: \"arrow methods\" should be treated as methods.\n        if (\n            ts.isPropertyDeclaration(declaration) &&\n            !declaration.type &&\n            declaration.initializer &&\n            ts.isArrowFunction(declaration.initializer)\n        ) {\n            return convertArrowAsMethod(\n                context,\n                symbol,\n                declaration.initializer,\n                exportSymbol,\n            );\n        }\n    }\n\n    const reflection = context.createDeclarationReflection(\n        context.scope.kindOf(ReflectionKind.VariableContainer)\n            ? ReflectionKind.Variable\n            : ReflectionKind.Property,\n        symbol,\n        exportSymbol,\n    );\n\n    const declaration = symbol.getDeclarations()?.[0];\n    let parameterTypeNode: ts.TypeNode | undefined;\n\n    if (\n        declaration &&\n        (ts.isPropertyDeclaration(declaration) ||\n            ts.isPropertySignature(declaration) ||\n            ts.isParameter(declaration) ||\n            ts.isPropertyAccessExpression(declaration) ||\n            ts.isPropertyAssignment(declaration))\n    ) {\n        if (\n            !ts.isPropertyAccessExpression(declaration) &&\n            !ts.isPropertyAssignment(declaration)\n        ) {\n            parameterTypeNode = declaration.type;\n        }\n        setModifiers(symbol, declaration, reflection);\n    } else {\n        setSymbolModifiers(symbol, reflection);\n    }\n    reflection.defaultValue = declaration && convertDefaultValue(declaration);\n\n    if (context.convertingTypeNode && parameterTypeNode) {\n        reflection.type = context.converter.convertType(\n            context.withScope(reflection),\n            parameterTypeNode,\n        );\n    } else {\n        reflection.type = context.converter.convertType(\n            context.withScope(reflection),\n            context.checker.getTypeOfSymbol(symbol),\n            parameterTypeNode,\n        );\n    }\n\n    if (reflection.flags.isOptional) {\n        reflection.type = removeUndefined(reflection.type);\n    }\n\n    context.finalizeDeclarationReflection(reflection);\n}\n\nfunction convertArrowAsMethod(\n    context: Context,\n    symbol: ts.Symbol,\n    arrow: ts.ArrowFunction,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Method,\n        symbol,\n        exportSymbol,\n        void 0,\n    );\n    setModifiers(symbol, arrow.parent as ts.PropertyDeclaration, reflection);\n    context.finalizeDeclarationReflection(reflection);\n\n    const rc = context.withScope(reflection);\n\n    const locationDeclaration = symbol.parent\n        ?.getDeclarations()\n        ?.find(\n            (d) => ts.isClassDeclaration(d) || ts.isInterfaceDeclaration(d),\n        ) ??\n        symbol.parent?.getDeclarations()?.[0]?.getSourceFile() ??\n        symbol.getDeclarations()?.[0]?.getSourceFile();\n    assert(locationDeclaration, \"Missing declaration context\");\n\n    const type = context.checker.getTypeOfSymbolAtLocation(\n        symbol,\n        locationDeclaration,\n    );\n\n    const signatures = type.getNonNullableType().getCallSignatures();\n    assert(signatures.length, \"Missing signatures\");\n\n    createSignature(\n        rc,\n        ReflectionKind.CallSignature,\n        signatures[0],\n        symbol,\n        arrow,\n    );\n}\n\nfunction convertConstructor(context: Context, symbol: ts.Symbol): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Constructor,\n        symbol,\n        void 0,\n        \"constructor\",\n    );\n    context.finalizeDeclarationReflection(reflection);\n\n    const reflectionContext = context.withScope(reflection);\n\n    const declarations = symbol.getDeclarations()?.filter(ts.isConstructorDeclaration) ?? [];\n    const signatures = declarations.map((decl) => {\n        const sig = context.checker.getSignatureFromDeclaration(decl);\n        assert(sig);\n        return sig;\n    });\n\n    for (const sig of signatures) {\n        createSignature(\n            reflectionContext,\n            ReflectionKind.ConstructorSignature,\n            sig,\n            symbol,\n        );\n    }\n}\n\nfunction convertAlias(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    // If this is a namespace marked as a primary export or directly within one\n    // marked as a primary export then we should convert it immediately rather than deferring\n    if (\n        context.scope.comment?.hasModifier(\"@primaryExport\") ||\n        context.getComment(exportSymbol || symbol, ReflectionKind.Namespace)?.hasModifier(\"@primaryExport\")\n    ) {\n        _convertAlias();\n    } else {\n        // Defer conversion of aliases so that if the original module/namespace\n        // containing them is included in the docs, we will point to that namespace\n        // rather than pointing that namespace to the first namespace encountered, #2856.\n        context.converter.deferConversion(_convertAlias);\n    }\n\n    function _convertAlias() {\n        const reflection = context.getReflectionFromSymbol(\n            context.resolveAliasedSymbol(symbol),\n        );\n        if (\n            !reflection ||\n            (reflection &&\n                !reflection.parent?.kindOf(\n                    ReflectionKind.Project | ReflectionKind.SomeModule,\n                ))\n        ) {\n            // We don't have this, convert it.\n            convertSymbol(\n                context,\n                context.resolveAliasedSymbol(symbol),\n                exportSymbol ?? symbol,\n            );\n        } else {\n            createAlias(reflection, context, symbol, exportSymbol);\n        }\n    }\n}\n\nfunction createAlias(\n    target: Reflection,\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol: ts.Symbol | undefined,\n) {\n    if (context.converter.excludeReferences) return;\n\n    // We already have this. Create a reference.\n    const ref = new ReferenceReflection(\n        exportSymbol?.name ?? symbol.name,\n        target.isReference() ? target.getTargetReflection() : target,\n        context.scope,\n    );\n    context.postReflectionCreation(ref, symbol, exportSymbol);\n    context.finalizeDeclarationReflection(ref);\n}\n\nfunction convertVariable(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined | ts.SymbolFlags {\n    if (isTypeOnlyExport(exportSymbol)) {\n        return convertTypeAliasFromValueDeclaration(context, symbol, exportSymbol, ReflectionKind.Variable);\n    }\n\n    const declaration = symbol.getDeclarations()?.[0];\n\n    const comment = context.getComment(symbol, ReflectionKind.Variable);\n    const type = declaration\n        ? context.checker.getTypeOfSymbolAtLocation(symbol, declaration)\n        : context.checker.getTypeOfSymbol(symbol);\n\n    if (\n        isEnumLike(context.checker, type, declaration) &&\n        comment?.hasModifier(\"@enum\")\n    ) {\n        return convertVariableAsEnum(context, symbol, exportSymbol);\n    }\n\n    if (comment?.hasModifier(\"@namespace\")) {\n        return convertVariableAsNamespace(context, symbol, exportSymbol);\n    }\n\n    if (comment?.hasModifier(\"@class\")) {\n        return convertSymbolAsClass(context, symbol, exportSymbol);\n    }\n\n    if (\n        type.getCallSignatures().length &&\n        !type.getConstructSignatures().length\n    ) {\n        if (\n            comment?.hasModifier(\"@function\") ||\n            (declaration && shouldAutomaticallyConvertAsFunction(declaration))\n        ) {\n            return convertVariableAsFunction(context, symbol, exportSymbol);\n        }\n    }\n\n    const reflection = context.createDeclarationReflection(\n        context.scope.kindOf(ReflectionKind.VariableContainer)\n            ? ReflectionKind.Variable\n            : ReflectionKind.Property,\n        symbol,\n        exportSymbol,\n    );\n\n    let typeNode: ts.TypeNode | undefined;\n    if (declaration && ts.isVariableDeclaration(declaration)) {\n        // Otherwise we might have destructuring\n        typeNode = declaration.type;\n    }\n\n    if (typeNode) {\n        reflection.type = context.converter.convertType(\n            context.withScope(reflection),\n            typeNode,\n        );\n    } else {\n        reflection.type = context.converter.convertType(\n            context.withScope(reflection),\n            type,\n            typeNode,\n        );\n    }\n\n    setModifiers(symbol, declaration, reflection);\n\n    reflection.defaultValue = convertDefaultValue(declaration);\n    context.finalizeDeclarationReflection(reflection);\n\n    // Exclude ValueModule to handle `module.exports = []`\n    return ts.SymbolFlags.Property | ts.SymbolFlags.ValueModule;\n}\n\nfunction isEnumLike(\n    checker: ts.TypeChecker,\n    type: ts.Type,\n    location?: ts.Node,\n) {\n    if (!location || !hasAllFlags(type.flags, ts.TypeFlags.Object)) {\n        return false;\n    }\n\n    return type.getProperties().every((prop) => {\n        const propType = checker.getTypeOfSymbolAtLocation(prop, location);\n        return isValidEnumProperty(propType);\n    });\n}\n\nfunction isValidEnumProperty(type: ts.Type) {\n    return hasAnyFlag(\n        type.flags,\n        ts.TypeFlags.NumberLike | ts.TypeFlags.StringLike,\n    );\n}\n\nfunction convertVariableAsEnum(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined | ts.SymbolFlags {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Enum,\n        symbol,\n        exportSymbol,\n    );\n    context.finalizeDeclarationReflection(reflection);\n    const rc = context.withScope(reflection);\n\n    const declaration = symbol.valueDeclaration;\n    if (!declaration) {\n        context.logger.error(\n            i18n.converting_0_as_enum_requires_value_declaration(\n                symbol.name,\n            ),\n            symbol.declarations?.[0],\n        );\n        return;\n    }\n\n    const type = context.checker.getTypeAtLocation(declaration);\n\n    for (const prop of type.getProperties()) {\n        const reflection = rc.createDeclarationReflection(\n            ReflectionKind.EnumMember,\n            prop,\n            void 0,\n        );\n\n        const propType = context.checker.getTypeOfSymbolAtLocation(\n            prop,\n            declaration,\n        );\n\n        reflection.type = context.converter.convertType(\n            rc.withScope(reflection),\n            propType,\n        );\n\n        rc.finalizeDeclarationReflection(reflection);\n    }\n\n    // Skip converting the type alias, if there is one\n    return ts.SymbolFlags.TypeAlias;\n}\n\nfunction convertVariableAsNamespace(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n) {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Namespace,\n        symbol,\n        exportSymbol,\n    );\n    context.finalizeDeclarationReflection(reflection);\n    const rc = context.withScope(reflection);\n\n    const type = context.checker.getTypeOfSymbol(symbol);\n    convertSymbols(rc, type.getProperties());\n\n    return ts.SymbolFlags.Property;\n}\n\nfunction convertVariableAsFunction(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n) {\n    const declaration = symbol\n        .getDeclarations()\n        ?.find(ts.isVariableDeclaration);\n\n    const accessDeclaration = declaration ?? symbol.valueDeclaration;\n\n    const type = accessDeclaration\n        ? context.checker.getTypeOfSymbolAtLocation(symbol, accessDeclaration)\n        : context.checker.getDeclaredTypeOfSymbol(symbol);\n\n    const reflection = context.createDeclarationReflection(\n        context.scope.kindOf(ReflectionKind.MethodContainer)\n            ? ReflectionKind.Method\n            : ReflectionKind.Function,\n        symbol,\n        exportSymbol,\n    );\n    setModifiers(symbol, accessDeclaration, reflection);\n    context.finalizeDeclarationReflection(reflection);\n\n    const reflectionContext = context.withScope(reflection);\n\n    reflection.signatures ??= [];\n    for (const signature of type.getCallSignatures()) {\n        createSignature(\n            reflectionContext,\n            ReflectionKind.CallSignature,\n            signature,\n            symbol,\n        );\n    }\n\n    reflection.comment?.removeModifier(\"@function\");\n\n    // #2824 If there is only one signature, and there isn't a comment\n    // on the signature already, treat the comment on the variable\n    // as if it belongs to the signature instead.\n    if (\n        reflection.signatures.length === 1 &&\n        !reflection.signatures[0].comment &&\n        reflection.comment\n    ) {\n        reflection.signatures[0].comment = reflection.comment;\n        delete reflection.comment;\n    }\n\n    return (\n        convertFunctionProperties(context.withScope(reflection), symbol, type) |\n        ts.SymbolFlags.Property\n    );\n}\n\nfunction convertFunctionProperties(\n    context: Context,\n    symbol: ts.Symbol,\n    type: ts.Type,\n) {\n    // #2436/#2461: Functions created with Object.assign on a function likely have properties\n    // that we should document. We also add properties to the function if they are defined like:\n    //   function f() {}\n    //   f.x = 123;\n    // rather than creating a separate namespace.\n    // In the expando case, we'll have both namespace flags.\n    // In the Object.assign case, we'll have no namespace flags.\n    const nsFlags = ts.SymbolFlags.ValueModule | ts.SymbolFlags.NamespaceModule;\n    if (\n        type.getProperties().length &&\n        (hasAllFlags(symbol.flags, nsFlags) ||\n            !hasAnyFlag(symbol.flags, nsFlags)) &&\n        !symbol.declarations?.some(ts.isModuleDeclaration)\n    ) {\n        convertSymbols(context, type.getProperties());\n\n        return ts.SymbolFlags.NamespaceModule;\n    }\n\n    return ts.SymbolFlags.None;\n}\n\nfunction convertSymbolAsClass(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n) {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Class,\n        symbol,\n        exportSymbol,\n    );\n    const rc = context.withScope(reflection);\n\n    context.finalizeDeclarationReflection(reflection);\n\n    if (!symbol.valueDeclaration) {\n        context.logger.error(\n            i18n.converting_0_as_class_requires_value_declaration(\n                symbol.name,\n            ),\n            symbol.declarations?.[0],\n        );\n        return;\n    }\n\n    const type = context.checker.getTypeOfSymbolAtLocation(\n        symbol,\n        symbol.valueDeclaration,\n    );\n\n    rc.shouldBeStatic = true;\n    convertSymbols(\n        rc,\n        // Prototype is implicitly this class, don't document it.\n        type.getProperties().filter((prop) => prop.name !== \"prototype\"),\n    );\n\n    for (const sig of type.getCallSignatures()) {\n        createSignature(rc, ReflectionKind.CallSignature, sig, undefined);\n    }\n\n    rc.shouldBeStatic = false;\n\n    const ctors = type.getConstructSignatures();\n    if (ctors.length) {\n        const constructMember = rc.createDeclarationReflection(\n            ReflectionKind.Constructor,\n            ctors[0]?.declaration?.symbol,\n            void 0,\n            \"constructor\",\n        );\n\n        // Modifiers are the same for all constructors\n        if (ctors.length && ctors[0].declaration) {\n            setModifiers(symbol, ctors[0].declaration, constructMember);\n        }\n\n        context.finalizeDeclarationReflection(constructMember);\n\n        const constructContext = rc.withScope(constructMember);\n\n        for (const sig of ctors) {\n            createConstructSignatureWithType(constructContext, sig, reflection);\n        }\n\n        // Take the type parameters from the first constructor signature and use\n        // them as the type parameters for the class, #2914\n        reflection.typeParameters = convertTypeParameters(rc, reflection, ctors[0].getTypeParameters());\n\n        const instType = ctors[0].getReturnType();\n        convertSymbols(rc, instType.getProperties());\n\n        for (const sig of instType.getCallSignatures()) {\n            createSignature(rc, ReflectionKind.CallSignature, sig, undefined);\n        }\n    } else {\n        context.logger.warn(\n            i18n.converting_0_as_class_without_construct_signatures(\n                reflection.getFriendlyFullName(),\n            ),\n            symbol.valueDeclaration,\n        );\n    }\n\n    return (\n        ts.SymbolFlags.TypeAlias |\n        ts.SymbolFlags.Interface |\n        ts.SymbolFlags.Namespace\n    );\n}\n\nfunction convertAccessor(\n    context: Context,\n    symbol: ts.Symbol,\n    exportSymbol?: ts.Symbol,\n): undefined {\n    const reflection = context.createDeclarationReflection(\n        ReflectionKind.Accessor,\n        symbol,\n        exportSymbol,\n    );\n    const rc = context.withScope(reflection);\n\n    const declaration = symbol.getDeclarations()?.[0];\n    if (declaration) {\n        setModifiers(symbol, declaration, reflection);\n\n        // #3019, auto accessors `accessor x: string` get the symbol flag for\n        // an accessor, but they don't have get/set accessors, so the need a type\n        // set on the accessor reflection structure.\n        if (\n            ts.isPropertyDeclaration(declaration) &&\n            declaration.modifiers?.some(n => n.kind === ts.SyntaxKind.AccessorKeyword)\n        ) {\n            reflection.type = context.converter.convertType(\n                context.withScope(reflection),\n                context.checker.getTypeOfSymbol(symbol),\n                declaration.type,\n            );\n        }\n    }\n\n    context.finalizeDeclarationReflection(reflection);\n\n    const getDeclaration = symbol.getDeclarations()?.find(ts.isGetAccessor);\n    if (getDeclaration) {\n        const signature = context.checker.getSignatureFromDeclaration(getDeclaration);\n        if (signature) {\n            createSignature(\n                rc,\n                ReflectionKind.GetSignature,\n                signature,\n                symbol,\n                getDeclaration,\n            );\n        }\n    }\n\n    const setDeclaration = symbol.getDeclarations()?.find(ts.isSetAccessor);\n    if (setDeclaration) {\n        const signature = context.checker.getSignatureFromDeclaration(setDeclaration);\n        if (signature) {\n            createSignature(\n                rc,\n                ReflectionKind.SetSignature,\n                signature,\n                symbol,\n                setDeclaration,\n            );\n        }\n    }\n}\n\nfunction isInherited(context: Context, symbol: ts.Symbol) {\n    const parentSymbol = context.getSymbolFromReflection(context.scope);\n    // It'd be nice to be able to assert that this is true, but sometimes object\n    // types don't get symbols if they are inferred.\n    if (!parentSymbol) return false;\n\n    const parents = parentSymbol.declarations?.slice() || [];\n    const constructorDecls = parents.flatMap((parent) =>\n        ts.isClassDeclaration(parent)\n            ? parent.members.filter(ts.isConstructorDeclaration)\n            : []\n    );\n    parents.push(...constructorDecls);\n\n    return (\n        parents.some((d) => symbol.getDeclarations()?.some((d2) => d2.parent === d)) === false\n    );\n}\n\nfunction setModifiers(\n    symbol: ts.Symbol,\n    declaration: ts.Declaration | undefined,\n    reflection: Reflection,\n) {\n    setSymbolModifiers(symbol, reflection);\n    if (!declaration) {\n        return;\n    }\n\n    const modifiers = ts.getCombinedModifierFlags(declaration);\n\n    if (\n        ts.isMethodDeclaration(declaration) ||\n        ts.isPropertyDeclaration(declaration) ||\n        ts.isAccessor(declaration)\n    ) {\n        if (ts.isPrivateIdentifier(declaration.name)) {\n            reflection.setFlag(ReflectionFlag.Private);\n        }\n    }\n    if (hasAllFlags(modifiers, ts.ModifierFlags.Private)) {\n        reflection.setFlag(ReflectionFlag.Private);\n    }\n    if (hasAllFlags(modifiers, ts.ModifierFlags.Protected)) {\n        reflection.setFlag(ReflectionFlag.Protected);\n    }\n    if (hasAllFlags(modifiers, ts.ModifierFlags.Public)) {\n        reflection.setFlag(ReflectionFlag.Public);\n    }\n    reflection.setFlag(\n        ReflectionFlag.Optional,\n        hasAllFlags(symbol.flags, ts.SymbolFlags.Optional),\n    );\n    reflection.setFlag(\n        ReflectionFlag.Readonly,\n        hasAllFlags(ts.getCheckFlags(symbol), ts.CheckFlags.Readonly) ||\n            hasAllFlags(modifiers, ts.ModifierFlags.Readonly),\n    );\n    reflection.setFlag(\n        ReflectionFlag.Abstract,\n        hasAllFlags(modifiers, ts.ModifierFlags.Abstract),\n    );\n\n    if (\n        reflection.kindOf(ReflectionKind.Variable) &&\n        hasAllFlags(symbol.flags, ts.SymbolFlags.BlockScopedVariable)\n    ) {\n        reflection.setFlag(\n            ReflectionFlag.Const,\n            hasAllFlags(declaration.parent.flags, ts.NodeFlags.Const),\n        );\n    }\n\n    // ReflectionFlag.Static happens when constructing the reflection.\n    // We don't have sufficient information here to determine if it ought to be static.\n}\n\nfunction setSymbolModifiers(symbol: ts.Symbol, reflection: Reflection) {\n    reflection.setFlag(\n        ReflectionFlag.Optional,\n        hasAllFlags(symbol.flags, ts.SymbolFlags.Optional),\n    );\n}\n\nfunction shouldAutomaticallyConvertAsFunction(node: ts.Declaration): boolean {\n    // const fn = () => {}\n    if (ts.isVariableDeclaration(node)) {\n        if (node.type || !node.initializer) return false;\n\n        return isFunctionLikeInitializer(node.initializer);\n    }\n\n    // { fn: () => {} }\n    if (ts.isPropertyAssignment(node)) {\n        return isFunctionLikeInitializer(node.initializer);\n    }\n\n    // exports.fn = () => {}\n    // exports.fn ||= () => {}\n    // exports.fn ??= () => {}\n    if (ts.isPropertyAccessExpression(node)) {\n        if (\n            ts.isBinaryExpression(node.parent) &&\n            [ts.SyntaxKind.EqualsToken, ts.SyntaxKind.BarBarEqualsToken, ts.SyntaxKind.QuestionQuestionEqualsToken]\n                .includes(node.parent.operatorToken.kind)\n        ) {\n            return isFunctionLikeInitializer(node.parent.right);\n        }\n    }\n\n    return false;\n}\n\nfunction isFunctionLikeInitializer(node: ts.Expression): boolean {\n    if (ts.isFunctionExpression(node) || ts.isArrowFunction(node)) {\n        return true;\n    }\n\n    if (ts.isSatisfiesExpression(node)) {\n        return isFunctionLikeInitializer(node.expression);\n    }\n\n    if (ts.isAsExpression(node)) {\n        return isFunctionLikeInitializer(node.expression);\n    }\n\n    return false;\n}\n\nfunction isTypeOnlyExport(symbol: ts.Symbol | undefined): boolean {\n    if (!symbol) return false;\n\n    const declaration = symbol.declarations?.[0];\n    if (!declaration) return false;\n    if (!ts.isExportSpecifier(declaration)) return false;\n\n    return declaration.isTypeOnly || declaration.parent.parent.isTypeOnly;\n}\n"
  },
  {
    "path": "src/lib/converter/types.ts",
    "content": "import assert from \"assert\";\nimport ts from \"typescript\";\nimport {\n    ArrayType,\n    ConditionalType,\n    DeclarationReflection,\n    IndexedAccessType,\n    InferredType,\n    IntersectionType,\n    IntrinsicType,\n    LiteralType,\n    MappedType,\n    NamedTupleMember,\n    OptionalType,\n    PredicateType,\n    QueryType,\n    ReferenceType,\n    ReflectionFlag,\n    ReflectionKind,\n    ReflectionType,\n    RestType,\n    SignatureReflection,\n    type SomeType,\n    TemplateLiteralType,\n    TupleType,\n    TypeOperatorType,\n    UnionType,\n    UnknownType,\n} from \"../models/index.js\";\nimport { type TranslatedString, zip } from \"#utils\";\nimport type { Context } from \"./context.js\";\nimport { ConverterEvents } from \"./converter-events.js\";\nimport { convertIndexSignatures } from \"./factories/index-signature.js\";\nimport { convertParameterNodes, convertTypeParameterNodes, createSignature } from \"./factories/signature.js\";\nimport { convertSymbol } from \"./symbols.js\";\nimport { isObjectType, isTypeReference } from \"./utils/nodes.js\";\nimport { removeUndefined } from \"./utils/reflections.js\";\n\nexport interface TypeConverter<\n    TNode extends ts.TypeNode = ts.TypeNode,\n    TType extends ts.Type = ts.Type,\n> {\n    kind: TNode[\"kind\"][];\n    // getTypeAtLocation is expensive, so don't pass the type here.\n    convert(context: Context, node: TNode): SomeType;\n    // We use typeToTypeNode to figure out what method to call in the first place,\n    // so we have a non-type-checkable node here, necessary for some converters.\n    // We *may* also have an original node which is the node the type was originally\n    // retrieved from.\n    convertType(\n        context: Context,\n        type: TType,\n        serializedNode: TNode,\n        originalNode: ts.TypeNode | undefined,\n    ): SomeType;\n}\n\nconst converters = new Map<ts.SyntaxKind, TypeConverter>();\nexport function loadConverters() {\n    if (converters.size) return;\n\n    for (\n        const actor of [\n            arrayConverter,\n            conditionalConverter,\n            constructorConverter,\n            exprWithTypeArgsConverter,\n            functionTypeConverter,\n            importType,\n            indexedAccessConverter,\n            inferredConverter,\n            intersectionConverter,\n            intrinsicConverter,\n            jsDocVariadicTypeConverter,\n            keywordConverter,\n            optionalConverter,\n            parensConverter,\n            predicateConverter,\n            queryConverter,\n            typeLiteralConverter,\n            referenceConverter,\n            restConverter,\n            namedTupleMemberConverter,\n            mappedConverter,\n            literalTypeConverter,\n            templateLiteralConverter,\n            thisConverter,\n            tupleConverter,\n            typeOperatorConverter,\n            unionConverter,\n            jSDocTypeExpressionConverter,\n            // Only used if skipLibCheck: true\n            jsDocNullableTypeConverter,\n            jsDocNonNullableTypeConverter,\n            jsDocAllTypeConverter,\n        ]\n    ) {\n        for (const key of actor.kind) {\n            if (key === undefined) {\n                // Might happen if running on an older TS version.\n                continue;\n            }\n            assert(!converters.has(key));\n            converters.set(key, actor);\n        }\n    }\n}\n\n// This ought not be necessary, but we need some way to discover recursively\n// typed symbols which do not have type nodes. See the `recursive` symbol in the variables test.\nconst seenTypes = new Set<number>();\n\nfunction maybeConvertType(\n    context: Context,\n    typeOrNode: ts.Type | ts.TypeNode | undefined,\n): SomeType | undefined {\n    if (!typeOrNode) {\n        return;\n    }\n\n    return convertType(context, typeOrNode);\n}\n\nlet typeConversionDepth = 0;\nexport function convertType(\n    context: Context,\n    typeOrNode: ts.Type | ts.TypeNode | undefined,\n    maybeNode?: ts.TypeNode,\n): SomeType {\n    if (!typeOrNode) {\n        return new IntrinsicType(\"any\");\n    }\n\n    if (typeConversionDepth > context.converter.maxTypeConversionDepth) {\n        return new UnknownType(\"...\");\n    }\n\n    loadConverters();\n    if (\"kind\" in typeOrNode) {\n        const converter = converters.get(typeOrNode.kind);\n        if (converter) {\n            ++typeConversionDepth;\n            const result = converter.convert(context, typeOrNode);\n            --typeConversionDepth;\n            return result;\n        }\n        return requestBugReport(context, typeOrNode);\n    }\n\n    // TS 4.2 added this to enable better tracking of type aliases.\n    // We need to check it here, not just in the union checker, because typeToTypeNode\n    // will use the origin when serializing\n    // aliasSymbol check is important - #2468\n    if (typeOrNode.isUnion() && typeOrNode.origin && !typeOrNode.aliasSymbol) {\n        // Don't increment typeConversionDepth as this is a transparent step to the user.\n        return convertType(context, typeOrNode.origin);\n    }\n\n    // IgnoreErrors is important, without it, we can't assert that we will get a node.\n    const node = context.checker.typeToTypeNode(\n        typeOrNode,\n        void 0,\n        ts.NodeBuilderFlags.IgnoreErrors,\n    );\n    assert(node); // According to the TS source of typeToString, this is a bug if it does not hold.\n\n    if (seenTypes.has(typeOrNode.id)) {\n        const typeString = context.checker.typeToString(typeOrNode);\n        context.logger.verbose(\n            `Refusing to recurse when converting type: ${typeString}`,\n        );\n        return new UnknownType(typeString);\n    }\n\n    let converter = converters.get(node.kind);\n    if (converter) {\n        // Hacky fix for #2011, need to find a better way to choose the converter.\n        if (\n            converter === intersectionConverter &&\n            !typeOrNode.isIntersection()\n        ) {\n            converter = typeLiteralConverter;\n        }\n\n        seenTypes.add(typeOrNode.id);\n        ++typeConversionDepth;\n        const result = converter.convertType(\n            context,\n            typeOrNode,\n            node,\n            maybeNode,\n        );\n        --typeConversionDepth;\n        seenTypes.delete(typeOrNode.id);\n        return result;\n    }\n\n    return requestBugReport(context, typeOrNode);\n}\n\nconst arrayConverter: TypeConverter<ts.ArrayTypeNode, ts.TypeReference> = {\n    kind: [ts.SyntaxKind.ArrayType],\n    convert(context, node) {\n        return new ArrayType(convertType(context, node.elementType));\n    },\n    convertType(context, type) {\n        const params = type.aliasTypeArguments || context.checker.getTypeArguments(type);\n        // This is *almost* always true... except for when this type is in the constraint of a type parameter see GH#1408\n        // assert(params.length === 1);\n        assert(params.length > 0);\n        return new ArrayType(convertType(context, params[0]));\n    },\n};\n\nconst conditionalConverter: TypeConverter<\n    ts.ConditionalTypeNode,\n    ts.ConditionalType\n> = {\n    kind: [ts.SyntaxKind.ConditionalType],\n    convert(context, node) {\n        return new ConditionalType(\n            convertType(context, node.checkType),\n            convertType(context, node.extendsType),\n            convertType(context, node.trueType),\n            convertType(context, node.falseType),\n        );\n    },\n    convertType(context, type) {\n        return new ConditionalType(\n            convertType(context, type.checkType),\n            convertType(context, type.extendsType),\n            convertType(context, type.resolvedTrueType),\n            convertType(context, type.resolvedFalseType),\n        );\n    },\n};\n\nconst constructorConverter: TypeConverter<ts.ConstructorTypeNode, ts.Type> = {\n    kind: [ts.SyntaxKind.ConstructorType],\n    convert(context, node) {\n        const symbol = context.getSymbolAtLocation(node) ?? node.symbol;\n        const type = context.getTypeAtLocation(node);\n        if (!symbol || !type) {\n            return new IntrinsicType(\"Function\");\n        }\n\n        const reflection = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.Constructor,\n            context.scope,\n        );\n        const rc = context.withScope(reflection);\n        rc.convertingTypeNode = true;\n\n        context.registerReflection(reflection, symbol);\n        context.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            context,\n            reflection,\n        );\n\n        const signature = new SignatureReflection(\n            \"__type\",\n            ReflectionKind.ConstructorSignature,\n            reflection,\n        );\n        // This is unfortunate... but seems the obvious place to put this with the current\n        // architecture. Ideally, this would be a property on a \"ConstructorType\"... but that\n        // needs to wait until TypeDoc 0.22 when making other breaking changes.\n        if (\n            node.modifiers?.some(\n                (m) => m.kind === ts.SyntaxKind.AbstractKeyword,\n            )\n        ) {\n            signature.setFlag(ReflectionFlag.Abstract);\n        }\n        context.project.registerSymbolId(\n            signature,\n            context.createSymbolId(symbol, node),\n        );\n        context.registerReflection(signature, void 0);\n        const signatureCtx = rc.withScope(signature);\n\n        reflection.signatures = [signature];\n        signature.type = convertType(signatureCtx, node.type);\n        signature.parameters = convertParameterNodes(\n            signatureCtx,\n            signature,\n            node.parameters,\n        );\n        signature.typeParameters = convertTypeParameterNodes(\n            signatureCtx,\n            node.typeParameters,\n        );\n\n        return new ReflectionType(reflection);\n    },\n    convertType(context, type) {\n        const symbol = type.getSymbol();\n        if (!symbol) {\n            return new IntrinsicType(\"Function\");\n        }\n\n        const reflection = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.Constructor,\n            context.scope,\n        );\n        context.registerReflection(reflection, symbol);\n        context.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            context,\n            reflection,\n        );\n\n        createSignature(\n            context.withScope(reflection),\n            ReflectionKind.ConstructorSignature,\n            type.getConstructSignatures()[0],\n            symbol,\n        );\n\n        return new ReflectionType(reflection);\n    },\n};\n\nconst exprWithTypeArgsConverter: TypeConverter<\n    ts.ExpressionWithTypeArguments,\n    ts.Type\n> = {\n    kind: [ts.SyntaxKind.ExpressionWithTypeArguments],\n    convert(context, node) {\n        const targetSymbol = context.getSymbolAtLocation(node.expression);\n        // Mixins... we might not have a symbol here.\n        if (!targetSymbol) {\n            return convertType(\n                context,\n                context.checker.getTypeAtLocation(node),\n            );\n        }\n        const parameters = node.typeArguments?.map((type) => convertType(context, type)) ?? [];\n        const ref = context.createSymbolReference(\n            context.resolveAliasedSymbol(targetSymbol),\n            context,\n        );\n        ref.typeArguments = parameters;\n        return ref;\n    },\n    convertType: requestBugReport,\n};\n\nconst functionTypeConverter: TypeConverter<ts.FunctionTypeNode, ts.Type> = {\n    kind: [ts.SyntaxKind.FunctionType],\n    convert(context, node) {\n        const symbol = context.getSymbolAtLocation(node) ?? node.symbol;\n        const type = context.getTypeAtLocation(node);\n        if (!symbol || !type) {\n            return new IntrinsicType(\"Function\");\n        }\n\n        const reflection = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n            context.scope,\n        );\n        const rc = context.withScope(reflection);\n\n        context.registerReflection(reflection, symbol);\n        context.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            context,\n            reflection,\n        );\n\n        const signature = new SignatureReflection(\n            \"__type\",\n            ReflectionKind.CallSignature,\n            reflection,\n        );\n        context.project.registerSymbolId(\n            signature,\n            context.createSymbolId(symbol, node),\n        );\n        context.registerReflection(signature, undefined);\n        const signatureCtx = rc.withScope(signature);\n\n        reflection.signatures = [signature];\n        signature.type = convertType(signatureCtx, node.type);\n        signature.parameters = convertParameterNodes(\n            signatureCtx,\n            signature,\n            node.parameters,\n        );\n        signature.typeParameters = convertTypeParameterNodes(\n            signatureCtx,\n            node.typeParameters,\n        );\n\n        return new ReflectionType(reflection);\n    },\n    convertType(context, type) {\n        const symbol = type.getSymbol();\n        if (!symbol) {\n            return new IntrinsicType(\"Function\");\n        }\n\n        const reflection = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n            context.scope,\n        );\n        context.registerReflection(reflection, symbol);\n        context.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            context,\n            reflection,\n        );\n\n        createSignature(\n            context.withScope(reflection),\n            ReflectionKind.CallSignature,\n            type.getCallSignatures()[0],\n            type.getSymbol(),\n        );\n\n        return new ReflectionType(reflection);\n    },\n};\n\nconst importType: TypeConverter<ts.ImportTypeNode> = {\n    kind: [ts.SyntaxKind.ImportType],\n    convert(context, node) {\n        const name = node.qualifier?.getText() ?? \"__module\";\n        const symbol = context.getSymbolAtLocation(node.qualifier || node);\n        // #2792, we should always have a symbol here unless there is a compiler\n        // error ignored with ts-expect-error or ts-ignore.\n        if (!symbol) {\n            return new IntrinsicType(\"any\");\n        }\n\n        return context.createSymbolReference(\n            context.resolveAliasedSymbol(symbol),\n            context,\n            name,\n        );\n    },\n    convertType(context, type) {\n        const symbol = type.getSymbol();\n        assert(symbol, \"Missing symbol when converting import type\"); // Should be a compiler error\n        return context.createSymbolReference(\n            context.resolveAliasedSymbol(symbol),\n            context,\n            \"__module\",\n        );\n    },\n};\n\nconst indexedAccessConverter: TypeConverter<\n    ts.IndexedAccessTypeNode,\n    ts.IndexedAccessType\n> = {\n    kind: [ts.SyntaxKind.IndexedAccessType],\n    convert(context, node) {\n        return new IndexedAccessType(\n            convertType(context, node.objectType),\n            convertType(context, node.indexType),\n        );\n    },\n    convertType(context, type) {\n        return new IndexedAccessType(\n            convertType(context, type.objectType),\n            convertType(context, type.indexType),\n        );\n    },\n};\n\nconst inferredConverter: TypeConverter<ts.InferTypeNode> = {\n    kind: [ts.SyntaxKind.InferType],\n    convert(context, node) {\n        return new InferredType(\n            node.typeParameter.name.text,\n            maybeConvertType(context, node.typeParameter.constraint),\n        );\n    },\n    convertType(context, type) {\n        return new InferredType(\n            type.getSymbol()!.name,\n            maybeConvertType(context, type.getConstraint()),\n        );\n    },\n};\n\nconst intersectionConverter: TypeConverter<\n    ts.IntersectionTypeNode,\n    ts.IntersectionType\n> = {\n    kind: [ts.SyntaxKind.IntersectionType],\n    convert(context, node) {\n        return new IntersectionType(\n            node.types.map((type) => convertType(context, type)),\n        );\n    },\n    convertType(context, type) {\n        return new IntersectionType(\n            type.types.map((type) => convertType(context, type)),\n        );\n    },\n};\n\nconst intrinsicConverter: TypeConverter<\n    ts.KeywordTypeNode<ts.SyntaxKind.IntrinsicKeyword>,\n    ts.Type\n> = {\n    kind: [ts.SyntaxKind.IntrinsicKeyword],\n    convert() {\n        return new IntrinsicType(\"intrinsic\");\n    },\n    convertType() {\n        return new IntrinsicType(\"intrinsic\");\n    },\n};\n\nconst jsDocVariadicTypeConverter: TypeConverter<ts.JSDocVariadicType> = {\n    kind: [ts.SyntaxKind.JSDocVariadicType],\n    convert(context, node) {\n        return new ArrayType(convertType(context, node.type));\n    },\n    convertType(context, type, _node, origNode) {\n        assert(isTypeReference(type));\n        return arrayConverter.convertType(context, type, null!, origNode);\n    },\n};\n\nconst keywordNames = {\n    [ts.SyntaxKind.AnyKeyword]: \"any\",\n    [ts.SyntaxKind.BigIntKeyword]: \"bigint\",\n    [ts.SyntaxKind.BooleanKeyword]: \"boolean\",\n    [ts.SyntaxKind.NeverKeyword]: \"never\",\n    [ts.SyntaxKind.NumberKeyword]: \"number\",\n    [ts.SyntaxKind.ObjectKeyword]: \"object\",\n    [ts.SyntaxKind.StringKeyword]: \"string\",\n    [ts.SyntaxKind.SymbolKeyword]: \"symbol\",\n    [ts.SyntaxKind.UndefinedKeyword]: \"undefined\",\n    [ts.SyntaxKind.UnknownKeyword]: \"unknown\",\n    [ts.SyntaxKind.VoidKeyword]: \"void\",\n    [ts.SyntaxKind.IntrinsicKeyword]: \"intrinsic\",\n};\n\nconst keywordConverter: TypeConverter<ts.KeywordTypeNode> = {\n    kind: [\n        ts.SyntaxKind.AnyKeyword,\n        ts.SyntaxKind.BigIntKeyword,\n        ts.SyntaxKind.BooleanKeyword,\n        ts.SyntaxKind.NeverKeyword,\n        ts.SyntaxKind.NumberKeyword,\n        ts.SyntaxKind.ObjectKeyword,\n        ts.SyntaxKind.StringKeyword,\n        ts.SyntaxKind.SymbolKeyword,\n        ts.SyntaxKind.UndefinedKeyword,\n        ts.SyntaxKind.UnknownKeyword,\n        ts.SyntaxKind.VoidKeyword,\n    ],\n    convert(_context, node) {\n        return new IntrinsicType(keywordNames[node.kind]);\n    },\n    convertType(_context, _type, node) {\n        return new IntrinsicType(keywordNames[node.kind]);\n    },\n};\n\nconst optionalConverter: TypeConverter<ts.OptionalTypeNode> = {\n    kind: [ts.SyntaxKind.OptionalType],\n    convert(context, node) {\n        return new OptionalType(\n            removeUndefined(convertType(context, node.type)),\n        );\n    },\n    // Handled by the tuple converter\n    convertType: requestBugReport,\n};\n\nconst parensConverter: TypeConverter<ts.ParenthesizedTypeNode> = {\n    kind: [ts.SyntaxKind.ParenthesizedType],\n    convert(context, node) {\n        return convertType(context, node.type);\n    },\n    // TS strips these out too... shouldn't run into this.\n    convertType: requestBugReport,\n};\n\nconst predicateConverter: TypeConverter<ts.TypePredicateNode, ts.Type> = {\n    kind: [ts.SyntaxKind.TypePredicate],\n    convert(context, node) {\n        const name = ts.isThisTypeNode(node.parameterName)\n            ? \"this\"\n            : node.parameterName.getText();\n        const asserts = !!node.assertsModifier;\n        const targetType = node.type ? convertType(context, node.type) : void 0;\n        return new PredicateType(name, asserts, targetType);\n    },\n    // Never inferred by TS 4.0, could potentially change in a future TS version.\n    convertType: requestBugReport,\n};\n\n// This is a horrible thing... we're going to want to split this into converters\n// for different types at some point.\nconst typeLiteralConverter = {\n    kind: [ts.SyntaxKind.TypeLiteral],\n    convert(context, node) {\n        const symbol = context.getSymbolAtLocation(node) ?? node.symbol;\n        const type = context.getTypeAtLocation(node);\n        if (!symbol || !type) {\n            return new IntrinsicType(\"Object\");\n        }\n\n        const reflection = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n            context.scope,\n        );\n        const rc = context.withScope(reflection);\n        rc.convertingTypeNode = true;\n\n        context.registerReflection(reflection, symbol);\n        context.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            context,\n            reflection,\n        );\n\n        for (const prop of context.checker.getPropertiesOfType(type)) {\n            convertSymbol(rc, prop);\n        }\n        for (const signature of type.getCallSignatures()) {\n            createSignature(\n                rc,\n                ReflectionKind.CallSignature,\n                signature,\n                symbol,\n            );\n        }\n        for (const signature of type.getConstructSignatures()) {\n            createSignature(\n                rc,\n                ReflectionKind.ConstructorSignature,\n                signature,\n                symbol,\n            );\n        }\n\n        convertIndexSignatures(rc, type);\n\n        return new ReflectionType(reflection);\n    },\n    convertType(context, type) {\n        const symbol = type.getSymbol();\n        const reflection = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n            context.scope,\n        );\n        context.registerReflection(reflection, symbol);\n        context.converter.trigger(\n            ConverterEvents.CREATE_DECLARATION,\n            context,\n            reflection,\n        );\n\n        for (const prop of context.checker.getPropertiesOfType(type)) {\n            convertSymbol(context.withScope(reflection), prop);\n        }\n        for (const signature of type.getCallSignatures()) {\n            createSignature(\n                context.withScope(reflection),\n                ReflectionKind.CallSignature,\n                signature,\n                symbol,\n            );\n        }\n        for (const signature of type.getConstructSignatures()) {\n            createSignature(\n                context.withScope(reflection),\n                ReflectionKind.ConstructorSignature,\n                signature,\n                symbol,\n            );\n        }\n\n        if (symbol) {\n            convertIndexSignatures(context.withScope(reflection), type);\n        }\n\n        return new ReflectionType(reflection);\n    },\n} satisfies TypeConverter<ts.TypeLiteralNode>;\n\nconst queryConverter: TypeConverter<ts.TypeQueryNode> = {\n    kind: [ts.SyntaxKind.TypeQuery],\n    convert(context, node) {\n        const querySymbol = context.getSymbolAtLocation(node.exprName);\n        if (!querySymbol) {\n            // This can happen if someone uses `typeof` on some property\n            // on a variable typed as `any` with a name that doesn't exist.\n            return new QueryType(\n                ReferenceType.createBrokenReference(\n                    node.exprName.getText(),\n                    context.project,\n                    undefined,\n                ),\n            );\n        }\n\n        const ref = context.createSymbolReference(\n            context.resolveAliasedSymbol(querySymbol),\n            context,\n            node.exprName.getText(),\n        );\n        ref.preferValues = true;\n        return new QueryType(ref);\n    },\n    convertType(context, type, node) {\n        // Order matters here - check the node location first so that if the typeof is targeting\n        // an instantiation expression we get the user's exprName.\n        const symbol = context.getSymbolAtLocation(node.exprName) || type.getSymbol();\n        assert(\n            symbol,\n            `Query type failed to get a symbol for: ${\n                context.checker.typeToString(\n                    type,\n                )\n            }. This is a bug.`,\n        );\n        const ref = context.createSymbolReference(\n            context.resolveAliasedSymbol(symbol),\n            context,\n        );\n        ref.preferValues = true;\n        return new QueryType(ref);\n    },\n};\n\nconst referenceConverter: TypeConverter<\n    ts.TypeReferenceNode,\n    ts.TypeReference | ts.StringMappingType | ts.SubstitutionType\n> = {\n    kind: [ts.SyntaxKind.TypeReference],\n    convert(context, node) {\n        const type = context.checker.getTypeAtLocation(node.typeName);\n        const isArray = context.checker.typeToTypeNode(\n            type,\n            void 0,\n            ts.NodeBuilderFlags.IgnoreErrors,\n        )?.kind === ts.SyntaxKind.ArrayType;\n\n        if (isArray) {\n            return new ArrayType(convertType(context, node.typeArguments?.[0]));\n        }\n\n        const symbol = context.expectSymbolAtLocation(node.typeName);\n        const name = node.typeName.getText();\n\n        // Ignore @inline if there are type arguments, as they won't be resolved\n        // in the type we just retrieved from node.typeName.\n        if (\n            !node.typeArguments &&\n            context.shouldInline(symbol, name)\n        ) {\n            return convertTypeInlined(context, type);\n        }\n\n        const ref = context.createSymbolReference(\n            context.resolveAliasedSymbol(symbol),\n            context,\n            name,\n        );\n        ref.typeArguments = node.typeArguments?.map((type) => convertType(context, type));\n        return ref;\n    },\n    convertType(context, type, node, originalNode) {\n        // typeName.symbol handles the case where this is a union which happens to refer\n        // to an enumeration. TS doesn't put the symbol on the type for some reason, but\n        // does add it to the constructed type node.\n        const symbol = type.aliasSymbol ?? type.getSymbol() ?? node.typeName.symbol;\n        if (!symbol) {\n            // This happens when we get a reference to a type parameter\n            // created within a mapped type, `K` in: `{ [K in T]: string }`\n            const ref = ReferenceType.createBrokenReference(\n                context.checker.typeToString(type),\n                context.project,\n                undefined,\n            );\n            ref.refersToTypeParameter = true;\n            return ref;\n        }\n\n        // #2954 mapped type aliases are special! The type that we have here will\n        // not point at the type alias which names it like we want, but instead at\n        // the mapped type instantiation. Fall back to converting via the original\n        // type node to avoid creating a reference which points to the mapped type.\n        if (\n            originalNode && ts.isTypeReferenceNode(originalNode) && isObjectType(type) &&\n            type.objectFlags & ts.ObjectFlags.Mapped\n        ) {\n            return referenceConverter.convert(context, originalNode);\n        }\n\n        let name: string;\n        if (ts.isIdentifier(node.typeName)) {\n            name = node.typeName.text;\n        } else {\n            name = node.typeName.right.text;\n        }\n\n        if (context.shouldInline(symbol, name)) {\n            return convertTypeInlined(context, type);\n        }\n\n        const ref = context.createSymbolReference(\n            context.resolveAliasedSymbol(symbol),\n            context,\n            name,\n        );\n\n        if ((type.flags & ts.TypeFlags.Substitution) && name === \"NoInfer\" && ref.package === \"typescript\") {\n            // NoInfer<T>\n            ref.typeArguments = [\n                convertType(context, (type as ts.SubstitutionType).baseType),\n            ];\n        } else if (type.flags & ts.TypeFlags.StringMapping) {\n            ref.typeArguments = [\n                convertType(context, (type as ts.StringMappingType).type),\n            ];\n        } else {\n            const args = type.aliasSymbol\n                ? type.aliasTypeArguments\n                : (type as ts.TypeReference).typeArguments;\n\n            const maxArgLength = originalNode && ts.isTypeReferenceNode(originalNode)\n                ? (originalNode.typeArguments?.length ?? 0)\n                : args?.length;\n\n            ref.typeArguments = args\n                ?.slice(0, maxArgLength)\n                .map((ref) => convertType(context, ref));\n        }\n        return ref;\n    },\n};\n\nconst restConverter: TypeConverter<ts.RestTypeNode> = {\n    kind: [ts.SyntaxKind.RestType],\n    convert(context, node) {\n        return new RestType(convertType(context, node.type));\n    },\n    // This is handled in the tuple converter\n    convertType: requestBugReport,\n};\n\nconst namedTupleMemberConverter: TypeConverter<ts.NamedTupleMember> = {\n    kind: [ts.SyntaxKind.NamedTupleMember],\n    convert(context, node) {\n        const innerType = convertType(context, node.type);\n        return new NamedTupleMember(\n            node.name.getText(),\n            !!node.questionToken,\n            innerType,\n        );\n    },\n    // This ought to be impossible.\n    convertType: requestBugReport,\n};\n\n// { -readonly [K in string]-?: number}\n//   ^ readonlyToken\n//              ^ typeParameter\n//                   ^^^^^^ typeParameter.constraint\n//                          ^ questionToken\n//                              ^^^^^^ type\nconst mappedConverter: TypeConverter<\n    ts.MappedTypeNode,\n    ts.Type & {\n        // Beware! Internal TS API here.\n        templateType: ts.Type;\n        typeParameter: ts.TypeParameter;\n        constraintType: ts.Type;\n        nameType?: ts.Type;\n    }\n> = {\n    kind: [ts.SyntaxKind.MappedType],\n    convert(context, node) {\n        const optionalModifier = kindToModifier(node.questionToken?.kind);\n        const templateType = convertType(context, node.type);\n\n        return new MappedType(\n            node.typeParameter.name.text,\n            convertType(context, node.typeParameter.constraint),\n            optionalModifier === \"+\"\n                ? removeUndefined(templateType)\n                : templateType,\n            kindToModifier(node.readonlyToken?.kind),\n            optionalModifier,\n            node.nameType ? convertType(context, node.nameType) : void 0,\n        );\n    },\n    convertType(context, type, node) {\n        // This can happen if a generic function does not have a return type annotated.\n        const optionalModifier = kindToModifier(node.questionToken?.kind);\n        const templateType = convertType(context, type.templateType);\n\n        return new MappedType(\n            type.typeParameter.symbol.name || \"__type\",\n            convertType(context, type.typeParameter.getConstraint()),\n            optionalModifier === \"+\"\n                ? removeUndefined(templateType)\n                : templateType,\n            kindToModifier(node.readonlyToken?.kind),\n            optionalModifier,\n            type.nameType ? convertType(context, type.nameType) : void 0,\n        );\n    },\n};\n\nconst literalTypeConverter: TypeConverter<ts.LiteralTypeNode, ts.LiteralType> = {\n    kind: [ts.SyntaxKind.LiteralType],\n    convert(context, node) {\n        switch (node.literal.kind) {\n            case ts.SyntaxKind.TrueKeyword:\n            case ts.SyntaxKind.FalseKeyword:\n                return new LiteralType(\n                    node.literal.kind === ts.SyntaxKind.TrueKeyword,\n                );\n            case ts.SyntaxKind.StringLiteral:\n                return new LiteralType(node.literal.text);\n            case ts.SyntaxKind.NumericLiteral:\n                return new LiteralType(Number(node.literal.text));\n            case ts.SyntaxKind.NullKeyword:\n                return new LiteralType(null);\n            case ts.SyntaxKind.PrefixUnaryExpression: {\n                const operand = (node.literal as ts.PrefixUnaryExpression)\n                    .operand;\n                switch (operand.kind) {\n                    case ts.SyntaxKind.NumericLiteral:\n                        return new LiteralType(\n                            Number(node.literal.getText()),\n                        );\n                    case ts.SyntaxKind.BigIntLiteral:\n                        return new LiteralType(\n                            BigInt(node.literal.getText().replace(\"n\", \"\")),\n                        );\n                    default:\n                        return requestBugReport(context, node.literal);\n                }\n            }\n            case ts.SyntaxKind.BigIntLiteral:\n                return new LiteralType(\n                    BigInt(node.literal.getText().replace(\"n\", \"\")),\n                );\n            case ts.SyntaxKind.NoSubstitutionTemplateLiteral:\n                return new LiteralType(node.literal.text);\n        }\n\n        return requestBugReport(context, node.literal);\n    },\n    convertType(_context, type, node) {\n        switch (node.literal.kind) {\n            case ts.SyntaxKind.StringLiteral:\n                return new LiteralType(node.literal.text);\n            case ts.SyntaxKind.NumericLiteral:\n                return new LiteralType(+node.literal.text);\n            case ts.SyntaxKind.TrueKeyword:\n            case ts.SyntaxKind.FalseKeyword:\n                return new LiteralType(\n                    node.literal.kind === ts.SyntaxKind.TrueKeyword,\n                );\n            case ts.SyntaxKind.NullKeyword:\n                return new LiteralType(null);\n        }\n\n        if (typeof type.value === \"object\") {\n            return new LiteralType(\n                BigInt(\n                    `${type.value.negative ? \"-\" : \"\"}${type.value.base10Value}`,\n                ),\n            );\n        }\n\n        return new LiteralType(type.value);\n    },\n};\n\nconst templateLiteralConverter: TypeConverter<\n    ts.TemplateLiteralTypeNode,\n    ts.TemplateLiteralType\n> = {\n    kind: [ts.SyntaxKind.TemplateLiteralType],\n    convert(context, node) {\n        return new TemplateLiteralType(\n            node.head.text,\n            node.templateSpans.map((span) => {\n                return [convertType(context, span.type), span.literal.text];\n            }),\n        );\n    },\n    convertType(context, type) {\n        assert(type.texts.length === type.types.length + 1);\n        const parts: [SomeType, string][] = [];\n        for (const [a, b] of zip(type.types, type.texts.slice(1))) {\n            parts.push([convertType(context, a), b]);\n        }\n\n        return new TemplateLiteralType(type.texts[0], parts);\n    },\n};\n\nconst thisConverter: TypeConverter<ts.ThisTypeNode> = {\n    kind: [ts.SyntaxKind.ThisType],\n    convert() {\n        return new IntrinsicType(\"this\");\n    },\n    convertType() {\n        return new IntrinsicType(\"this\");\n    },\n};\n\nconst tupleConverter = {\n    kind: [ts.SyntaxKind.TupleType],\n    convert(context, node) {\n        const elements = node.elements.map((node) => convertType(context, node));\n        return new TupleType(elements);\n    },\n    convertType(context, type, node) {\n        const types = type.typeArguments?.slice(0, node.elements.length);\n        let elements = types?.map((type) => convertType(context, type));\n\n        if (type.target.labeledElementDeclarations) {\n            const namedDeclarations = type.target.labeledElementDeclarations;\n            elements = elements?.map((el, i) => {\n                const namedDecl = namedDeclarations[i];\n                return namedDecl\n                    ? new NamedTupleMember(\n                        namedDecl.name.getText(),\n                        !!namedDecl.questionToken,\n                        removeUndefined(el),\n                    )\n                    : el;\n            });\n        }\n\n        elements = elements?.map((el, i) => {\n            if (type.target.elementFlags[i] & ts.ElementFlags.Variable) {\n                // In the node case, we don't need to add the wrapping Array type... but we do here.\n                if (el instanceof NamedTupleMember) {\n                    return new RestType(\n                        new NamedTupleMember(\n                            el.name,\n                            el.isOptional,\n                            new ArrayType(el.element),\n                        ),\n                    );\n                }\n\n                return new RestType(new ArrayType(el));\n            }\n\n            if (\n                type.target.elementFlags[i] & ts.ElementFlags.Optional &&\n                !(el instanceof NamedTupleMember)\n            ) {\n                return new OptionalType(removeUndefined(el));\n            }\n\n            return el;\n        });\n\n        return new TupleType(elements ?? []);\n    },\n} satisfies TypeConverter<ts.TupleTypeNode, ts.TupleTypeReference>;\n\nconst supportedOperatorNames = {\n    [ts.SyntaxKind.KeyOfKeyword]: \"keyof\",\n    [ts.SyntaxKind.UniqueKeyword]: \"unique\",\n    [ts.SyntaxKind.ReadonlyKeyword]: \"readonly\",\n} as const;\n\nconst typeOperatorConverter: TypeConverter<ts.TypeOperatorNode> = {\n    kind: [ts.SyntaxKind.TypeOperator],\n    convert(context, node) {\n        return new TypeOperatorType(\n            convertType(context, node.type),\n            supportedOperatorNames[node.operator],\n        );\n    },\n    convertType(context, type, node) {\n        // readonly is only valid on array and tuple literal types.\n        if (node.operator === ts.SyntaxKind.ReadonlyKeyword) {\n            const resolved = resolveReference(type);\n            assert(isObjectType(resolved));\n            const args = context.checker\n                .getTypeArguments(type as ts.TypeReference)\n                .map((type) => convertType(context, type));\n            const inner = resolved.objectFlags & ts.ObjectFlags.Tuple\n                ? new TupleType(args)\n                : new ArrayType(args[0]);\n\n            return new TypeOperatorType(inner, \"readonly\");\n        }\n\n        // keyof will only show up with generic functions, otherwise it gets eagerly\n        // resolved to a union of strings.\n        if (node.operator === ts.SyntaxKind.KeyOfKeyword) {\n            // There's probably an interface for this somewhere... I couldn't find it.\n            const targetType = (type as ts.Type & { type: ts.Type }).type;\n            return new TypeOperatorType(\n                convertType(context, targetType),\n                \"keyof\",\n            );\n        }\n\n        // TS drops `unique` in `unique symbol` everywhere. If someone used it, we ought\n        // to have a type node. This shouldn't ever happen.\n        return requestBugReport(context, type);\n    },\n};\n\nconst unionConverter: TypeConverter<ts.UnionTypeNode, ts.UnionType> = {\n    kind: [ts.SyntaxKind.UnionType],\n    convert(context, node) {\n        return new UnionType(\n            node.types.map((type) => convertType(context, type)),\n        );\n    },\n    convertType(context, type) {\n        const types = type.types.map((type) => convertType(context, type));\n        normalizeUnion(types);\n        sortUnion(types);\n\n        return new UnionType(types);\n    },\n};\n\nconst jSDocTypeExpressionConverter: TypeConverter<ts.JSDocTypeExpression> = {\n    kind: [ts.SyntaxKind.JSDocTypeExpression],\n    convert(context, node) {\n        return convertType(context, node.type);\n    },\n    convertType: requestBugReport,\n};\n\nconst jsDocNullableTypeConverter: TypeConverter<ts.JSDocNullableType> = {\n    kind: [ts.SyntaxKind.JSDocNullableType],\n    convert(context, node) {\n        return new UnionType([\n            convertType(context, node.type),\n            new LiteralType(null),\n        ]);\n    },\n    // Should be a UnionType\n    convertType: requestBugReport,\n};\n\nconst jsDocNonNullableTypeConverter: TypeConverter<ts.JSDocNonNullableType> = {\n    kind: [ts.SyntaxKind.JSDocNonNullableType],\n    convert(context, node) {\n        return convertType(context, node.type);\n    },\n    // Should be a UnionType\n    convertType: requestBugReport,\n};\n\nconst jsDocAllTypeConverter: TypeConverter<ts.JSDocAllType> = {\n    kind: [ts.SyntaxKind.JSDocAllType],\n    convert() {\n        return new IntrinsicType(\"any\");\n    },\n    // Should be a UnionType\n    convertType: requestBugReport,\n};\n\nfunction requestBugReport(context: Context, nodeOrType: ts.Node | ts.Type) {\n    if (\"kind\" in nodeOrType) {\n        const kindName = ts.SyntaxKind[nodeOrType.kind];\n        context.logger.warn(\n            `Failed to convert type node with kind: ${kindName} and text ${nodeOrType.getText()}. Please report a bug.` as TranslatedString,\n            nodeOrType,\n        );\n        return new UnknownType(nodeOrType.getText());\n    } else {\n        const typeString = context.checker.typeToString(nodeOrType);\n        context.logger.warn(\n            `Failed to convert type: ${typeString} when converting ${context.scope.getFullName()}. Please report a bug.` as TranslatedString,\n        );\n        return new UnknownType(typeString);\n    }\n}\n\nfunction resolveReference(type: ts.Type) {\n    if (isObjectType(type) && type.objectFlags & ts.ObjectFlags.Reference) {\n        return (type as ts.TypeReference).target;\n    }\n    return type;\n}\n\nfunction kindToModifier(\n    kind:\n        | ts.SyntaxKind.PlusToken\n        | ts.SyntaxKind.MinusToken\n        | ts.SyntaxKind.ReadonlyKeyword\n        | ts.SyntaxKind.QuestionToken\n        | undefined,\n): \"+\" | \"-\" | undefined {\n    switch (kind) {\n        case ts.SyntaxKind.ReadonlyKeyword:\n        case ts.SyntaxKind.QuestionToken:\n        case ts.SyntaxKind.PlusToken:\n            return \"+\";\n        case ts.SyntaxKind.MinusToken:\n            return \"-\";\n        default:\n            return undefined;\n    }\n}\n\nfunction sortUnion(types: SomeType[]) {\n    // If every member of the union is a literal numeric type, sort in ascending order\n    if (types.every(t => t.type === \"literal\" && typeof t.value === \"number\")) {\n        types.sort((a, b) => {\n            const aLit = a as LiteralType;\n            const bLit = b as LiteralType;\n\n            return (aLit.value as number) - (bLit.value as number);\n        });\n        return;\n    }\n\n    // #3024 Otherwise, leave the union in the converted order with the exception of null\n    // and undefined, which should be sorted last, with null before undefined.\n    types.sort((a, b) => {\n        const aIsNull = a.type === \"literal\" && a.value === null;\n        const aIsUndef = a.type === \"intrinsic\" && a.name === \"undefined\";\n        const bIsNull = b.type === \"literal\" && b.value === null;\n        const bIsUndef = b.type === \"intrinsic\" && b.name === \"undefined\";\n\n        const aWeight = aIsNull ? 1 : aIsUndef ? 2 : 0;\n        const bWeight = bIsNull ? 1 : bIsUndef ? 2 : 0;\n\n        return aWeight - bWeight;\n    });\n}\n\nfunction normalizeUnion(types: SomeType[]) {\n    let trueIndex = -1;\n    let falseIndex = -1;\n    for (\n        let i = 0;\n        i < types.length && (trueIndex === -1 || falseIndex === -1);\n        i++\n    ) {\n        const t = types[i];\n        if (t instanceof LiteralType) {\n            if (t.value === true) {\n                trueIndex = i;\n            }\n            if (t.value === false) {\n                falseIndex = i;\n            }\n        }\n    }\n\n    if (trueIndex !== -1 && falseIndex !== -1) {\n        types.splice(Math.max(trueIndex, falseIndex), 1);\n        types.splice(\n            Math.min(trueIndex, falseIndex),\n            1,\n            new IntrinsicType(\"boolean\"),\n        );\n    }\n}\n\nfunction convertTypeInlined(context: Context, type: ts.Type): SomeType {\n    if (type.isUnion()) {\n        const types = type.types.map(type => convertType(context, type));\n        return new UnionType(types);\n    }\n\n    if (type.isIntersection()) {\n        const types = type.types.map(type => convertType(context, type));\n        return new IntersectionType(types);\n    }\n\n    if (type.isLiteral()) {\n        return new LiteralType(\n            typeof type.value === \"object\"\n                ? BigInt(type.value.base10Value) * (type.value.negative ? -1n : 1n)\n                : type.value,\n        );\n    }\n\n    if (context.checker.isArrayType(type)) {\n        const elementType = convertType(context, context.checker.getTypeArguments(type as ts.TypeReference)[0]);\n        return new ArrayType(elementType);\n    }\n    if (isTypeReference(type) && context.checker.isTupleType(type)) {\n        const tupleNode = context.checker.typeToTypeNode(type.target, void 0, ts.NodeBuilderFlags.IgnoreErrors)!;\n        if (ts.isTupleTypeNode(tupleNode)) {\n            return tupleConverter.convertType(context, type as ts.TupleTypeReference, tupleNode);\n        }\n    }\n\n    return typeLiteralConverter.convertType(\n        context,\n        type,\n    );\n}\n"
  },
  {
    "path": "src/lib/converter/utils/nodes.ts",
    "content": "import ts from \"typescript\";\n\nexport function isNamedNode(node: unknown): node is {\n    readonly name:\n        | ts.Identifier\n        | ts.PrivateIdentifier\n        | ts.ComputedPropertyName;\n} {\n    const name: ts.Node | undefined = (node as any).name;\n    return !!name && (ts.isMemberName(name) || ts.isComputedPropertyName(name));\n}\n\nexport function getHeritageTypes(\n    declarations: readonly (ts.ClassDeclaration | ts.InterfaceDeclaration)[],\n    kind: ts.SyntaxKind.ImplementsKeyword | ts.SyntaxKind.ExtendsKeyword,\n): ts.ExpressionWithTypeArguments[] {\n    const exprs = declarations.flatMap((d) =>\n        (d.heritageClauses ?? [])\n            .filter((hc) => hc.token === kind)\n            .flatMap(\n                (hc) => hc.types as readonly ts.ExpressionWithTypeArguments[],\n            )\n    );\n\n    const seenTexts = new Set<string>();\n\n    return exprs.filter((expr) => {\n        const text = expr.getText();\n        if (seenTexts.has(text)) {\n            return false;\n        }\n        seenTexts.add(text);\n        return true;\n    });\n}\n\nexport function isObjectType(type: ts.Type): type is ts.ObjectType {\n    return typeof (type as any).objectFlags === \"number\";\n}\n\nexport function isTypeReference(type: ts.Type): type is ts.TypeReference {\n    return (\n        isObjectType(type) &&\n        (type.objectFlags & ts.ObjectFlags.Reference) !== 0\n    );\n}\n"
  },
  {
    "path": "src/lib/converter/utils/reflections.ts",
    "content": "import { IntrinsicType, type SomeType, UnionType } from \"../../models/index.js\";\n\nexport function removeUndefined(type: SomeType): SomeType {\n    if (type instanceof UnionType) {\n        const types = type.types.filter((t) => {\n            if (t instanceof IntrinsicType) {\n                return t.name !== \"undefined\";\n            }\n            return true;\n        });\n        if (types.length === 1) {\n            return types[0];\n        }\n        type.types = types;\n        return type;\n    }\n    return type;\n}\n"
  },
  {
    "path": "src/lib/converter/utils/repository.ts",
    "content": "import { spawnSync } from \"child_process\";\nimport { normalizePath } from \"../../utils/index.js\";\nimport { i18n, type Logger, NonEnumerable } from \"#utils\";\nimport { dirname, join } from \"path\";\nimport { existsSync } from \"fs\";\n\nconst TEN_MEGABYTES = 1024 * 10000;\n\nfunction git(...args: string[]) {\n    return spawnSync(\"git\", args, {\n        encoding: \"utf-8\",\n        windowsHide: true,\n        maxBuffer: TEN_MEGABYTES,\n    });\n}\n\nlet haveGit: boolean | undefined;\nexport function gitIsInstalled() {\n    haveGit ??= git(\"--version\").status === 0;\n    return haveGit;\n}\n\nexport interface Repository {\n    readonly path: string;\n    getURL(fileName: string, line: number): string | undefined;\n}\n\nexport class AssumedRepository implements Repository {\n    constructor(\n        readonly path: string,\n        readonly gitRevision: string,\n        readonly sourceLinkTemplate: string,\n    ) {}\n\n    getURL(fileName: string, line: number): string | undefined {\n        const replacements = {\n            gitRevision: this.gitRevision,\n            \"gitRevision:short\": this.gitRevision.substring(0, 8),\n            path: fileName.substring(this.path.length + 1),\n            line,\n        };\n\n        return this.sourceLinkTemplate.replace(\n            /\\{(gitRevision|gitRevision:short|path|line)\\}/g,\n            (_, key) => replacements[key as never],\n        );\n    }\n}\n\n/**\n * Stores data of a repository.\n */\nexport class GitRepository implements Repository {\n    /**\n     * The path of this repository on disk.\n     */\n    path: string;\n\n    /**\n     * All files tracked by the repository.\n     */\n    @NonEnumerable\n    files = new Set<string>();\n\n    urlTemplate: string;\n    gitRevision: string;\n\n    /**\n     * Create a new Repository instance.\n     *\n     * @param path  The root path of the repository.\n     */\n    constructor(path: string, gitRevision: string, urlTemplate: string) {\n        this.path = path;\n        this.gitRevision = gitRevision;\n        this.urlTemplate = urlTemplate;\n\n        const out = git(\"-C\", path, \"ls-files\", \"-z\");\n        if (out.status === 0) {\n            out.stdout.split(\"\\0\").forEach((file) => {\n                if (file !== \"\") {\n                    this.files.add(normalizePath(path + \"/\" + file));\n                }\n            });\n        }\n    }\n\n    /**\n     * Get the URL of the given file on GitHub or Bitbucket.\n     *\n     * @param fileName  The file whose URL should be determined.\n     * @returns A URL pointing to the web preview of the given file or undefined.\n     */\n    getURL(fileName: string, line: number): string | undefined {\n        if (!this.files.has(fileName)) {\n            return;\n        }\n\n        const replacements = {\n            gitRevision: this.gitRevision,\n            \"gitRevision:short\": this.gitRevision.substring(0, 8),\n            path: fileName.substring(this.path.length + 1),\n            line,\n        };\n\n        return this.urlTemplate.replace(\n            /\\{(gitRevision|gitRevision:short|path|line)\\}/g,\n            (_, key) => replacements[key as never],\n        );\n    }\n\n    /**\n     * Try to create a new repository instance.\n     *\n     * Checks whether the given path is the root of a valid repository and if so\n     * creates a new instance of {@link GitRepository}.\n     *\n     * @param path  The potential repository root.\n     * @returns A new instance of {@link GitRepository} or undefined.\n     */\n    static tryCreateRepository(\n        path: string,\n        sourceLinkTemplate: string,\n        gitRevision: string,\n        gitRemote: string,\n        logger: Logger,\n    ): GitRepository | undefined {\n        if (gitRevision === \"{branch}\") {\n            gitRevision = git(\"-C\", path, \"branch\", \"--show-current\").stdout.trim();\n        }\n        gitRevision ||= git(\"-C\", path, \"rev-parse\", \"HEAD\").stdout.trim();\n        if (gitRevision == \"HEAD\") return; // Will only happen in a repo with no commits.\n\n        let urlTemplate: string | undefined;\n        if (sourceLinkTemplate) {\n            urlTemplate = sourceLinkTemplate;\n        } else {\n            const remotesOut = git(\"-C\", path, \"remote\", \"get-url\", gitRemote);\n            if (remotesOut.status === 0) {\n                urlTemplate = guessSourceUrlTemplate(\n                    remotesOut.stdout.split(\"\\n\"),\n                );\n            } else {\n                logger.warn(i18n.git_remote_0_not_valid(gitRemote));\n            }\n        }\n\n        if (!urlTemplate) return;\n\n        return new GitRepository(normalizePath(path), gitRevision, urlTemplate);\n    }\n}\n\n/**\n * Responsible for keeping track of 0-N repositories which exist on a machine.\n * This used to be inlined in SourcePlugin, moved out for easy unit testing.\n *\n * Git repositories can be nested. Files should be resolved to a repo as shown\n * below:\n * ```text\n * /project\n * /project/.git (A)\n * /project/file.js (A)\n * /project/folder/file.js (A)\n * /project/sub/.git (B)\n * /project/sub/file.js (B)\n * ```\n *\n * In order words, it is not safe to assume that just because a file is within\n * the `/project` directory, that it belongs to repo `A`. As calling git is\n * expensive (~20-300ms depending on the machine, antivirus, etc.) we check for\n * `.git` folders manually, and only call git if one is found.\n *\n * Symlinked files have the potential to further complicate this. If TypeScript's\n * `preserveSymlinks` option is on, then this may be passed the path to a symlinked\n * file. Unlike TypeScript, we will resolve the path, as the repo link should really\n * point to the actual file.\n */\nexport class RepositoryManager {\n    private cache = new Map<string, Repository | undefined>();\n    private assumedRepo: Repository;\n\n    constructor(\n        private basePath: string,\n        private gitRevision: string,\n        private gitRemote: string,\n        private sourceLinkTemplate: string,\n        private disableGit: boolean,\n        private logger: Logger,\n    ) {\n        this.assumedRepo = new AssumedRepository(\n            this.basePath,\n            this.gitRevision,\n            this.sourceLinkTemplate,\n        );\n    }\n\n    /**\n     * Check whether the given file is placed inside a repository.\n     *\n     * @param fileName  The name of the file a repository should be looked for.\n     * @returns The found repository info or undefined.\n     */\n    getRepository(fileName: string): Repository | undefined {\n        if (this.disableGit) {\n            return this.assumedRepo;\n        }\n        return this.getRepositoryFolder(normalizePath(dirname(fileName)));\n    }\n\n    private getRepositoryFolder(dir: string): Repository | undefined {\n        if (this.cache.has(dir)) {\n            return this.cache.get(dir);\n        }\n\n        if (existsSync(join(dir, \".git\"))) {\n            // This might just be a git repo, or we might be in some self-recursive symlink\n            // loop, and the repo is actually somewhere else. Ask Git where the repo actually is.\n            const repo = git(\"-C\", dir, \"rev-parse\", \"--show-toplevel\");\n            if (repo.status === 0) {\n                const repoDir = repo.stdout.replace(\"\\n\", \"\");\n                // This check is only necessary if we're in a symlink loop, otherwise\n                // it will always be true.\n                if (!this.cache.has(repoDir)) {\n                    this.cache.set(\n                        repoDir,\n                        GitRepository.tryCreateRepository(\n                            repoDir,\n                            this.sourceLinkTemplate,\n                            this.gitRevision,\n                            this.gitRemote,\n                            this.logger,\n                        ),\n                    );\n                }\n\n                this.cache.set(dir, this.cache.get(repoDir));\n            } else {\n                // Not a git repo, probably corrupt.\n                this.cache.set(dir, undefined);\n            }\n        } else {\n            // We may be at the root of the file system, in which case there is no repo.\n            this.cache.set(dir, undefined);\n            this.cache.set(dir, this.getRepositoryFolder(dirname(dir)));\n        }\n\n        return this.cache.get(dir);\n    }\n}\n\n// Should have three capturing groups:\n// 1. hostname\n// 2. user\n// 3. project\nconst repoExpressions = [\n    /(github(?!.us)(?:\\.[a-z]+)*\\.[a-z]{2,})[:/]([^/]+)\\/(.*)/,\n    /(\\w+\\.githubprivate.com)[:/]([^/]+)\\/(.*)/, // GitHub enterprise\n    /(\\w+\\.ghe.com)[:/]([^/]+)\\/(.*)/, // GitHub enterprise\n    /(\\w+\\.github.us)[:/]([^/]+)\\/(.*)/, // GitHub enterprise\n    /(bitbucket.org)[:/]([^/]+)\\/(.*)/,\n    /(gitlab.com)[:/]([^/]+)\\/(.*)/,\n];\n\nexport function guessSourceUrlTemplate(remotes: string[]): string | undefined {\n    let hostname = \"\";\n    let user = \"\";\n    let project = \"\";\n    outer: for (const repoLink of remotes) {\n        for (const regex of repoExpressions) {\n            const match = regex.exec(repoLink);\n            if (match) {\n                hostname = match[1];\n                user = match[2];\n                project = match[3];\n                break outer;\n            }\n        }\n    }\n\n    if (!hostname) return;\n\n    if (project.endsWith(\".git\")) {\n        project = project.slice(0, -4);\n    }\n\n    let sourcePath = \"blob\";\n    let anchorPrefix = \"L\";\n    if (hostname.includes(\"gitlab\")) {\n        sourcePath = \"-/blob\";\n    } else if (hostname.includes(\"bitbucket\")) {\n        sourcePath = \"src\";\n        anchorPrefix = \"lines-\";\n    }\n\n    return `https://${hostname}/${user}/${project}/${sourcePath}/{gitRevision}/{path}#${anchorPrefix}{line}`;\n}\n"
  },
  {
    "path": "src/lib/converter/utils/symbols.ts",
    "content": "import ts from \"typescript\";\n\nexport function resolveAliasedSymbol(\n    symbol: ts.Symbol,\n    checker: ts.TypeChecker,\n): ts.Symbol {\n    const seen = new Set<ts.Symbol>();\n    while (ts.SymbolFlags.Alias & symbol.flags) {\n        symbol = checker.getAliasedSymbol(symbol);\n\n        // #2438, with declaration files, we might have an aliased symbol which eventually points to itself.\n        if (seen.has(symbol)) return symbol;\n        seen.add(symbol);\n    }\n    return symbol;\n}\n"
  },
  {
    "path": "src/lib/debug/index.ts",
    "content": "export { debugReflectionLifetimes } from \"./reflectionLifetimes.js\";\nexport { debugRendererUrls } from \"./rendererUrls.js\";\n"
  },
  {
    "path": "src/lib/debug/reflectionLifetimes.ts",
    "content": "/* eslint-disable no-console */\nimport type { Application } from \"../application.js\";\nimport { ConverterEvents } from \"../converter/converter-events.js\";\nimport { type Reflection, ReflectionKind } from \"../models/index.js\";\n\nexport function debugReflectionLifetimes(app: Application, kindFilter = ReflectionKind.All) {\n    app.converter.on(ConverterEvents.CREATE_PROJECT, logCreate);\n    app.converter.on(ConverterEvents.CREATE_SIGNATURE, logCreate);\n    app.converter.on(ConverterEvents.CREATE_TYPE_PARAMETER, logCreate);\n    app.converter.on(ConverterEvents.CREATE_DECLARATION, logCreate);\n    app.converter.on(ConverterEvents.CREATE_DOCUMENT, logCreate);\n    app.converter.on(ConverterEvents.CREATE_PARAMETER, logCreate);\n\n    app.converter.on(ConverterEvents.CREATE_PROJECT, (_context, project) => {\n        const oldRemove = project[\"_removeReflection\"];\n        project[\"_removeReflection\"] = function (reflection) {\n            if (reflection.kindOf(kindFilter)) {\n                console.log(\"Remove\", reflection.id, reflection.getFullName());\n            }\n            return oldRemove.call(this, reflection);\n        };\n    });\n\n    function logCreate(_context: unknown, refl: Reflection) {\n        if (refl.kindOf(kindFilter)) {\n            console.log(\"Create\", refl.variant, refl.id, refl.getFullName());\n        }\n    }\n}\n\nexport function load(app: Application) {\n    debugReflectionLifetimes(app);\n}\n"
  },
  {
    "path": "src/lib/debug/rendererUrls.ts",
    "content": "/* eslint-disable no-console */\nimport { join } from \"node:path\";\nimport type { Application } from \"../application.js\";\nimport { Reflection, ReflectionKind, type SomeReflection } from \"../models/index.js\";\nimport type { SerializerComponent } from \"../serialization/components.js\";\nimport type { JSONOutput } from \"../serialization/index.js\";\nimport type { Router } from \"../output/index.js\";\n\nfunction makeSerializer(router: Router) {\n    const serializer: SerializerComponent<SomeReflection> = {\n        priority: 0,\n        supports(x) {\n            return x instanceof Reflection;\n        },\n        toObject(item, obj: any) {\n            if (router.hasUrl(item)) {\n                obj.url = router.getFullUrl(item);\n                obj.hasOwnDocument = router.hasOwnDocument(item);\n            }\n            delete obj.sources;\n            delete obj.groups;\n            delete obj.categories;\n            delete obj.readme;\n            delete obj.content;\n            obj.kind = ReflectionKind[obj.kind];\n            delete obj.flags;\n            delete obj.defaultValue;\n            delete obj.symbolIdMap;\n            delete obj.files;\n            delete obj.packageName;\n            delete obj.variant;\n            delete obj.extendedTypes;\n            delete obj.inheritedFrom;\n            if (![\"reflection\", \"reference\"].includes(obj.type?.type)) {\n                delete obj.type;\n            }\n\n            if (obj.comment) {\n                obj.comment.summary = obj.comment.summary.filter(\n                    (part: JSONOutput.CommentDisplayPart) => part.kind === \"inline-tag\",\n                );\n                obj.comment.blockTags = obj.comment.blockTags?.filter(\n                    (tag: JSONOutput.CommentTag) => {\n                        tag.content = tag.content.filter(\n                            (part) => part.kind === \"inline-tag\",\n                        );\n                        return tag.content.length;\n                    },\n                );\n\n                if (\n                    !obj.comment.summary.length &&\n                    !obj.comment.blockTags?.length &&\n                    !obj.comment.modifierTags\n                ) {\n                    delete obj.comment;\n                }\n            }\n\n            return obj;\n        },\n    };\n\n    return serializer;\n}\n\nexport function debugRendererUrls(\n    app: Application,\n    { json = false, logs = true } = {},\n) {\n    app.renderer.postRenderAsyncJobs.push(async (evt) => {\n        const router = app.renderer.router!;\n\n        if (json) {\n            const serializer = makeSerializer(router);\n            app.serializer.addSerializer(serializer);\n            await app.generateJson(\n                evt.project,\n                join(evt.outputDirectory, \"url_debug.json\"),\n            );\n            app.serializer.removeSerializer(serializer);\n        }\n\n        if (logs) {\n            for (const id in evt.project.reflections) {\n                const refl = evt.project.reflections[id];\n                console.log(\n                    refl.id,\n                    refl.getFullName(),\n                    router.hasUrl(refl) ? router.getFullUrl(refl) : undefined,\n                );\n            }\n        }\n    });\n}\n\nexport function load(app: Application) {\n    debugRendererUrls(app);\n}\n"
  },
  {
    "path": "src/lib/internationalization/index.ts",
    "content": "/**\n * Internationalization module for localized strings in output.\n * @summary Internationalization module for localized strings in output.\n * @module\n */\nexport { i18n, type TranslatedString } from \"#utils\";\nexport { Internationalization, type TranslatableStrings, type TranslationProxy } from \"./internationalization.js\";\n"
  },
  {
    "path": "src/lib/internationalization/internationalization.ts",
    "content": "import { ok } from \"assert\";\nimport { addTranslations, DefaultMap, setTranslations, type TranslatedString } from \"#utils\";\nimport { readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { type BuiltinTranslatableStringArgs } from \"./translatable.js\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * ### What is translatable?\n * TypeDoc includes a lot of literal strings. By convention, messages which are displayed\n * to the user at the INFO level or above should be present in this object to be available\n * for translation. Messages at the VERBOSE level need not be translated as they are primarily\n * intended for debugging. ERROR/WARNING deprecation messages related to TypeDoc's API, or\n * requesting users submit a bug report need not be translated.\n *\n * Errors thrown by TypeDoc are generally *not* considered translatable as they are not\n * displayed to the user. An exception to this is errors thrown by the `validate` method\n * on options, as option readers will use them to report errors to the user.\n *\n * ### Interface Keys\n * This object uses a similar convention as TypeScript, where the specified key should\n * indicate where placeholders are present by including a number in the name. This is\n * so that translations can easily tell that they are including the appropriate placeholders.\n * This will also be validated at runtime by the {@link Internationalization} class, but\n * it's better to have that hint when editing as well.\n *\n * This interface defines the available translatable strings, and the number of placeholders\n * that are required to use each string. Plugins may use declaration merging to add members\n * to this interface to use TypeDoc's internationalization module.\n *\n * @example\n * ```ts\n * declare module \"typedoc\" {\n *     interface TranslatableStrings {\n *         // Define a translatable string with no arguments\n *         plugin_msg: [];\n *         // Define a translatable string requiring one argument\n *         plugin_msg_0: [string];\n *     }\n * }\n * ```\n */\nexport interface TranslatableStrings extends BuiltinTranslatableStringArgs {}\n\n/**\n * Dynamic proxy type built from {@link TranslatableStrings}\n */\nexport type TranslationProxy = {\n    [K in keyof TranslatableStrings]: (\n        ...args: TranslatableStrings[K]\n    ) => TranslatedString;\n};\n\nconst req = createRequire(fileURLToPath(import.meta.url));\n\n/**\n * Load TypeDoc's translations for a specified language\n */\nexport function loadTranslations(lang: string): Record<string, string> {\n    // Make sure this isn't abused to load some random file by mistake\n    ok(\n        /^[A-Za-z-]+$/.test(lang),\n        \"Locale names may only contain letters and dashes\",\n    );\n    try {\n        return req(`./locales/${lang}.cjs`);\n    } catch {\n        return loadTranslations(\"en\");\n    }\n}\n\n/**\n * Get languages which TypeDoc includes translations for\n */\nexport function getNativelySupportedLanguages(): string[] {\n    return readdirSync(join(fileURLToPath(import.meta.url), \"../locales\"))\n        .map((x) => x.substring(0, x.indexOf(\".\")));\n}\n\n/**\n * Responsible for maintaining loaded internationalized strings.\n */\nexport class Internationalization {\n    private locales = new DefaultMap<string, Record<string, string>>(() => ({}));\n    private loadedLocale!: string;\n\n    constructor() {\n        this.setLocale(\"en\");\n    }\n\n    setLocale(locale: string): void {\n        if (this.loadedLocale !== locale) {\n            const defaultTranslations = loadTranslations(locale);\n            const overrides = this.locales.get(locale);\n            setTranslations({ ...defaultTranslations, ...overrides });\n            this.loadedLocale = locale;\n        }\n    }\n\n    addTranslations(locale: string, translations: Record<string, string>): void {\n        Object.assign(this.locales.get(locale), translations);\n        if (locale === this.loadedLocale) {\n            addTranslations(translations);\n        }\n    }\n\n    hasTranslations(locale: string) {\n        return this.getSupportedLanguages().includes(locale);\n    }\n\n    getSupportedLanguages(): string[] {\n        const supported = new Set(getNativelySupportedLanguages());\n        for (const [locale, translations] of this.locales) {\n            if (Object.entries(translations).length) {\n                supported.add(locale);\n            }\n        }\n        return Array.from(supported);\n    }\n}\n"
  },
  {
    "path": "src/lib/internationalization/locale-utils.cts",
    "content": "import type { BuiltinTranslatableStringConstraints } from \"./translatable.js\" with { \"resolution-mode\": \"import\" };\n\nfunction buildTranslation<T extends BuiltinTranslatableStringConstraints>(\n    translations: T,\n) {\n    return translations;\n}\n\nfunction buildIncompleteTranslation<\n    T extends Partial<BuiltinTranslatableStringConstraints>,\n>(translations: T) {\n    return translations;\n}\n\nexport = { buildTranslation, buildIncompleteTranslation };\n"
  },
  {
    "path": "src/lib/internationalization/locales/de.cts",
    "content": "// Please DO NOT include machine generated translations here.\n// If adding a new key, leave it commented out for a native speaker\n// to update.\n\nimport localeUtils = require(\"../locale-utils.cjs\");\n\nexport = localeUtils.buildIncompleteTranslation({\n    loaded_multiple_times_0:\n        \"TypeDoc wurde mehrfach geladen. Das wird oft von Plugins verursacht, die auch TypeDoc installiert haben. Die Pfade, von denen TypeDoc geladen wurde, sind:\\n\\t{0}\",\n    unsupported_ts_version_0:\n        \"Sie verwenden eine Version von TypeScript, die nicht unterstützt wird! Stürzt TypeDoc ab, ist das der Grund. TypeDoc unterstützt {0}\",\n    no_compiler_options_set:\n        \"Keine Compiler-Optionen gesetzt. Das bedeutet wahrscheinlich, dass TypeDoc die tsconfig.json nicht finden konnte. Die generierte Dokumentation wird wahrscheinlich leer sein\",\n\n    loaded_plugin_0: \"Plugin {0} geladen\",\n\n    solution_not_supported_in_watch_mode:\n        \"Die angegebene tsconfig-Datei sieht nach einer Solution-Style-tsconfig aus, die nicht im Watch-Modus unterstützt wird\",\n    strategy_not_supported_in_watch_mode:\n        \"entryPointStrategy muss für den Watch-Modus entweder auf resolve oder expand gesetzt werden\",\n    file_0_changed_restarting: \"Konfigurationsdatei {0} wurde verändert: Kompletter Neustart erforderlich...\",\n    file_0_changed_rebuilding: \"Datei {0} wurde verändert: Baue Ausgabe neu...\",\n    found_0_errors_and_1_warnings: \"{0} Fehler und {1} Warnungen gefunden\",\n\n    output_0_could_not_be_generated: \"{0}-Ausgabe konnte aufgrund obiger Fehler nicht erstellt werden\",\n    output_0_generated_at_1: \"{0} wurde generiert in {1}\",\n\n    no_entry_points_for_packages:\n        \"Keine Einstiegspunkte für den packages-Modus angegeben, Dokumentation kann nicht generiert werden\",\n    failed_to_find_packages:\n        \"Konnte keine Packages finden, stellen Sie sicher, dass mindestens ein Verzeichnis mit einer package.json als Einstiegspunkt angegeben wurde\",\n    nested_packages_unsupported_0:\n        \"Projekt unter {0} hat die entryPointStrategy auf packages gesetzt, aber geschachtelte Packages werden nicht unterstützt\",\n    package_option_0_should_be_specified_at_root:\n        \"Die Option packageOptions setzt die Option {0}, welche nur auf Root-Ebene eine Auswirkung hat\",\n    previous_error_occurred_when_reading_options_for_0:\n        \"Der vorangegangene Fehler trat auf, als die Optionen für das Package unter {0} gelesen wurden\",\n    converting_project_at_0: \"Konvertiere Projekt unter {0}\",\n    failed_to_convert_packages:\n        \"Konnte ein oder mehrere Packages nicht konvertieren, Ergebnisse werden nicht zusammengeführt\",\n    merging_converted_projects: \"Führe konvertierte Projekte zusammen\",\n\n    no_entry_points_to_merge: \"Keine Einstiegspunkte zum Zusammenführen angegeben\",\n    entrypoint_did_not_match_files_0: \"Der Glob {0} für den Einstiegspunkt passte auf keine Dateien\",\n    failed_to_parse_json_0: \"Konnte Datei unter {0} nicht als JSON parsen\",\n\n    failed_to_read_0_when_processing_document_tag_in_1:\n        \"Fehler beim Einlesen der Datei {0} während der Verarbeitung des @document-Tags vom Kommentar in {1}\",\n    failed_to_read_0_when_processing_project_document:\n        \"Fehler beim Einlesen der Datei {0} während des Hinzufügens des Projekt-Dokuments\",\n    failed_to_read_0_when_processing_document_child_in_1:\n        \"Fehler beim Einlesen der Datei {0} während der Verarbeitung der Dokument-Kindelemente in {1}\",\n    frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values:\n        \"Kinder der Frontmatter in {0} sollten entweder ein Array von Strings oder ein Objekt mit String-Werten sein\",\n    converting_union_as_interface:\n        \"Nutzung von @interface auf einem Union-Typ verwirft alle Eigenschaften, die nicht in allen Teilen der Union vorhanden sind. TypeDocs Ausgabe spiegelt möglicherweise den Quellcode nicht korrekt wider.\",\n    converting_0_as_class_requires_value_declaration:\n        \"Konvertierung von {0} als Klasse erfordert eine Klassen-Deklaration, die einen Wert und nicht nur einen Typ darstellt\",\n    converting_0_as_class_without_construct_signatures:\n        \"{0} wird als Klasse konvertiert, hat aber keine Konstruktor-Signaturen\",\n\n    comment_for_0_should_not_contain_block_or_modifier_tags:\n        \"Das Kommentar für {0} sollte keine Block- oder Modifier-Tags enthalten\",\n\n    symbol_0_has_multiple_declarations_with_comment:\n        \"{0} hat mehrere Deklarationen mit Kommentaren. Ein beliebiges Kommentar wird verwendet werden\",\n    comments_for_0_are_declared_at_1: \"Die Kommentare für {0} sind deklariert in:\\n\\t{1}\",\n\n    // comments/parser.ts\n    multiple_type_parameters_on_template_tag_unsupported:\n        \"TypeDoc unterstützt mehrfache Typenparameter nicht, wenn diese in einem einzelnen @template-Tag mit Kommentar definiert sind\",\n    failed_to_find_jsdoc_tag_for_name_0:\n        \"Konnte JSDoc-Tag für {0} nach dem Parsen der Kommentare nicht finden, bitte erstellen Sie einen Bug-Report\",\n    relative_path_0_is_not_a_file_and_will_not_be_copied_to_output:\n        \"Der relative Pfad {0} ist keine Datei und wird daher nicht mit in das Ausgabeverzeichnis kopiert\",\n\n    inline_inheritdoc_should_not_appear_in_block_tag_in_comment_at_0:\n        \"Inline-@inheritDoc-Tag sollte nicht innerhalb eines Block-Tags verwendet werden. Solche Tags im Kommentar unter {0} können nicht verarbeitet werden\",\n    at_most_one_remarks_tag_expected_in_comment_at_0:\n        \"Höchstens ein @remarks-Tag darf in einem Kommentar verwendet werden. Alle außer dem ersten Tag im Kommentar unter {0} werden ignoriert\",\n    at_most_one_returns_tag_expected_in_comment_at_0:\n        \"Höchstens ein @returns-Tag darf in einem Kommentar verwendet werden. Alle außer dem ersten Tag im Kommentar unter {0} werden ignoriert\",\n    at_most_one_inheritdoc_tag_expected_in_comment_at_0:\n        \"Höchstens ein @inheritDoc-Tag darf in einem Kommentar verwendet werden. Alle außer dem ersten Tag im Kommentar unter {0} werden ignoriert\",\n    content_in_summary_overwritten_by_inheritdoc_in_comment_at_0:\n        \"Inhalt in der Zusammenfassung des Kommentars unter {0} wird vom @inheritDoc-Tag überschrieben werden\",\n    content_in_remarks_block_overwritten_by_inheritdoc_in_comment_at_0:\n        \"Inhalt im @remarks-Block des Kommentars unter {0} wird vom @inheritDoc-Tag überschrieben werden\",\n    example_tag_literal_name:\n        \"Die erste Zeile eines @example-Tags wird wortwörtlich als Name des Beispiels interpretiert und sollte nur Text enthalten\",\n    inheritdoc_tag_properly_capitalized: \"Der @inheritDoc-Tag sollte korrekte Groß- und Kleinschreibung verwenden\",\n    treating_unrecognized_tag_0_as_modifier: \"Behandle unerkannten Tag {0} als Modifier-Tag\",\n    unmatched_closing_brace: \"Nicht übereinstimmende schließende Klammern\",\n    unescaped_open_brace_without_inline_tag: \"Unmaskierte öffnende Klammer ohne Inline-Tag vorgefunden\",\n    unknown_block_tag_0: \"Unbekannter Block-Tag {0} vorgefunden\",\n    unknown_inline_tag_0: \"Unbekannter Inline-Tag {0} vorgefunden\",\n    open_brace_within_inline_tag:\n        \"Öffnende Klammer innerhalb eines Inline-Tags vorgefunden, das ist wahrscheinlich ein Fehler\",\n    inline_tag_not_closed: \"Inline-Tag wurde nicht geschlossen\",\n\n    // validation\n    failed_to_resolve_link_to_0_in_comment_for_1: `Konnte Link zu \"{0}\" im Kommentar für {1} nicht auflösen`,\n    failed_to_resolve_link_to_0_in_comment_for_1_may_have_meant_2:\n        `Konnte Link zu \"{0}\" im Kommentar für {1} nicht auflösen. Meinten Sie vielleicht \"{2}\"`,\n    failed_to_resolve_link_to_0_in_readme_for_1: `Konnte Link zu \"{0}\" in Readme für {1} nicht auflösen`,\n    failed_to_resolve_link_to_0_in_readme_for_1_may_have_meant_2:\n        `Konnte Link zu \"{0}\" in Readme für {1} nicht auflösen. Meinten Sie vielleicht \"{2}\"`,\n    failed_to_resolve_link_to_0_in_document_1: `Konnte Link zu \"{0}\" im Dokument {1} nicht auflösen`,\n    failed_to_resolve_link_to_0_in_document_1_may_have_meant_2:\n        `Konnte Link zu \"{0}\" im Dokument {1} nicht auflösen. Meinten Sie vielleicht \"{2}\"`,\n    type_0_defined_in_1_is_referenced_by_2_but_not_included_in_docs:\n        \"{0}, definiert in {1}, wird referenziert von {2}, ist aber nicht in der Dokumentation enthalten\",\n    reflection_0_kind_1_defined_in_2_does_not_have_any_documentation:\n        \"{0} ({1}), definiert in {2}, hat keinerlei Dokumentation\",\n    invalid_intentionally_not_documented_names_0:\n        \"Die folgenden qualifizierten Reflection-Namen wurden absichtlich als undokumentiert markiert, wurden aber entweder in der Dokumentation nicht referenziert oder werden dokumentiert:\\n\\t{0}\",\n    invalid_intentionally_not_exported_symbols_0:\n        \"Die folgenden Symbole wurden absichtlich als nicht exportiert markiert, wurden aber entweder in der Dokumentation nicht referenziert oder werden dokumentiert:\\n\\t{0}\",\n    reflection_0_has_unused_mergeModuleWith_tag:\n        \"{0} hat einen @mergeModuleWith-Tag, der nicht aufgelöst werden konnte\",\n    reflection_0_links_to_1_with_text_2_but_resolved_to_3:\n        `\"{0}\" verlinkt auf \"{1}\" mit Text \"{2}\", welcher zwar existiert, aber keinen Link in der Dokumentation hat. Verlinke stattdessen auf \"{3}\"`,\n\n    // conversion plugins\n    not_all_search_category_boosts_used_0:\n        \"Nicht alle in searchCategoryBoosts angegebenen Kategorien werden in der Dokumentation verwendet. Die unbenutzten Kategorien sind:\\n\\t{0}\",\n    not_all_search_group_boosts_used_0:\n        \"Nicht alle in searchGroupBoosts angegebenen Gruppen werden in der Dokumentation verwendet. Die unbenutzten Gruppen sind:\\n\\t{0}\",\n    comment_for_0_includes_categoryDescription_for_1_but_no_child_in_group:\n        `Kommentar für {0} enthält @categoryDescription für \"{1}\", aber kein Kind wurde in dieser Kategorie platziert`,\n    comment_for_0_includes_groupDescription_for_1_but_no_child_in_group:\n        `Kommentar für {0} enthält @groupDescription für \"{1}\", aber kein Kind wurde in dieser Gruppe platziert`,\n    label_0_for_1_cannot_be_referenced:\n        `Das Label \"{0}\" für {1} kann nicht mit einer Deklarationsreferenz referenziert werden. Labels dürfen nur A-Z, 0-9 sowie _ enthalten und dürfen nicht mit einer Ziffer beginnen`,\n    modifier_tag_0_is_mutually_exclusive_with_1_in_comment_for_2:\n        \"Der Modifier-Tag {0} darf nicht gleichzeitig mit {1} verwendet werden im Kommentar für {2}\",\n    signature_0_has_unused_param_with_name_1:\n        `Die Signatur {0} enthält einen @param mit Namen \"{1}\", der nicht verwendet wird`,\n    declaration_reference_in_inheritdoc_for_0_not_fully_parsed:\n        \"Deklarationsreferenz in @inheritDoc für {0} wurde nicht vollständig geparst und wird möglicherweise falsch aufgelöst werden\",\n    failed_to_find_0_to_inherit_comment_from_in_1:\n        `Konnte \"{0}\" zum Erben des Kommentars nicht finden. Betrifft Kommentar für {1}`,\n    reflection_0_tried_to_copy_comment_from_1_but_source_had_no_comment:\n        \"{0} hat versucht, ein Kommentar von {1} mit @inheritDoc zu kopieren, aber die Quelle hat kein zugehöriges Kommentar\",\n    inheritdoc_circular_inheritance_chain_0: \"@inheritDoc spezifiziert eine zyklische Vererbungskette: {0}\",\n    provided_readme_at_0_could_not_be_read: \"Angegebener README-Pfad {0} konnte nicht gelesen werden\",\n    defaulting_project_name:\n        'Die Option --name wurde nicht angegeben und kein package.json wurde gefunden. Verwende \"Dokumentation\" als Rückfallwert für den Projektnamen',\n    disable_git_set_but_not_source_link_template:\n        \"disableGit wurde gesetzt, aber sourceLinkTemplate nicht, sodass Links auf die Quellcode-Dateien nicht erstellt werden können. Setzen Sie sourceLinkTemplate oder disableSources, um das Ermitteln der Quellcode-Dateien zu deaktivieren\",\n    disable_git_set_and_git_revision_used:\n        \"disableGit wurde gesetzt und sourceLinkTemplate enthält {gitRevision}, was mit dem Leerstring ersetzt wird, da keine Revision angegeben wurde\",\n    git_remote_0_not_valid:\n        `Das angegebene Git-Remote \"{0}\" war nicht gültig. Links auf Quellcode-Dateien werden nicht funktionieren`,\n    reflection_0_tried_to_merge_into_child_1:\n        \"Die Reflection {0} versuchte mittels @mergeModuleWith, sich in eines ihrer Kinder einzufügen: {1}\",\n\n    include_0_in_1_specified_2_resolved_to_3_does_not_exist:\n        `{0}-Tag im Kommentar für {1} gab \"{2}\" zum Einbinden an, was zu \"{3}\" aufgelöst wurde und nicht existiert oder keine Datei ist.`,\n    include_0_in_1_specified_2_circular_include_3:\n        `{0}-Tag im Kommentar für {1} gab \"{2}\" zum Einbinden an, was in einer zyklischen Einbindung resultierte:\\n\\t{3}`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_not_found:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an, aber die Region wurde nicht in der Datei gefunden.`,\n    include_0_tag_in_1_region_2_region_not_supported:\n        `{0}-Tag in {1} gab \"{2}\" an, aber Regionen werden für die Dateierweiterung nicht unterstützt.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an, aber das Kommentar zum Schließen der Region wurde nicht in der Datei gefunden.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an, aber das Kommentar zum Öffnen einer Region wurde nicht in der Datei gefunden.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an, aber das Kommentar zum Schließen der Region wurde mehrfach in der Datei gefunden.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an, aber das Kommentar zum Öffnen der Region wurde mehrfach in der Datei gefunden.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an, aber die Region wurde mehrfach in der Datei gefunden.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_empty:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Region mit Label \"{4}\" aus Datei \"{3}\" an. Die Region wurde gefunden, ist aber leer oder enthält nur Leerzeichen.`,\n    include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Zeilen {4} aus Datei \"{3}\" an, aber ein ungültiges Intervall wurde angegeben.`,\n    include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines:\n        `{0}-Tag in {1} gab \"{2}\" zum Einbinden der Zeilen {4} aus Datei \"{3}\" an, aber die Datei hat nur {5} Zeilen.`,\n\n    // output plugins\n    custom_css_file_0_does_not_exist: \"Eigene CSS-Datei unter {0} existiert nicht\",\n    custom_js_file_0_does_not_exist: \"Eigene JavaScript-Datei unter {0} existiert nicht\",\n    unsupported_highlight_language_0_not_highlighted_in_comment_for_1:\n        \"Sprache {0} unterstützt keine Syntaxhervorhebung und wird im Kommentar {1} nicht hervorgehoben\",\n    unloaded_language_0_not_highlighted_in_comment_for_1:\n        \"Code-Block mit Sprache {0} wird keine Syntaxhervorhebung im Kommentar für {1} erfahren, da diese Sprache nicht in der Option highlightLanguages enthalten ist\",\n    yaml_frontmatter_not_an_object: \"Erwartete ein Objekt für die YAML-Frontmatter\",\n\n    // renderer\n    could_not_write_0: \"{0} konnte nicht geschrieben werden\",\n    could_not_empty_output_directory_0: \"Ausgabeverzeichnis {0} konnte nicht geleert werden\",\n    could_not_create_output_directory_0: \"Konnte das Ausgabeverzeichnis {0} nicht erstellen\",\n    theme_0_is_not_defined_available_are_1: `Das Theme '{0}' ist nicht definiert. Verfügbare Themes sind: {1}`,\n    router_0_is_not_defined_available_are_1: `Der Router '{0}' ist nicht definiert. Verfügbare Router sind: {1}`,\n    reflection_0_links_to_1_but_anchor_does_not_exist_try_2:\n        \"{0} verlinkt auf {1}, aber der Anker existiert nicht. Meinten Sie vielleicht:\\n\\t{2}\",\n\n    // entry points\n    no_entry_points_provided:\n        \"Einstiegspunkte wurden weder angegeben noch konnten sie aus den package.json-Exports ermittelt werden. Das ist wahrscheinlich eine Fehlerkonfiguration\",\n    unable_to_find_any_entry_points: \"Konnte keine Einstiegspunkte finden. Beachte auch die vorigen Warnmeldungen\",\n    watch_does_not_support_packages_mode: \"Watch-Modus unterstützt Einstiegspunkte der Art 'packages' nicht\",\n    watch_does_not_support_merge_mode: \"Watch-Modus unterstützt Einstiegspunkte der Art 'merge' nicht\",\n    entry_point_0_not_in_program:\n        `Der Einstiegspunkt {0} wird nicht von der Option 'files' oder 'include' in der tsconfig referenziert`,\n    failed_to_resolve_0_to_ts_path:\n        \"Konnte den Einstiegspunktpfad {0} der package.json nicht zu einer TypeScript-Quellcode-Datei auflösen\",\n    use_expand_or_glob_for_files_in_dir:\n        'Falls Sie Dateien aus diesem Verzeichnis einbinden wollten, setzen Sie die --entryPointStrategy auf \"expand\" oder geben Sie einen Glob an',\n    glob_0_did_not_match_any_files: \"Der Glob {0} passte auf keine Dateien\",\n    entry_point_0_did_not_match_any_files_after_exclude:\n        \"Der Glob {0} passte auf keine Dateien mehr, nachdem die Exclude-Patterns angewandt wurden\",\n    entry_point_0_did_not_exist: \"Angegebener Einstiegspunkt {0} existiert nicht\",\n    entry_point_0_did_not_match_any_packages:\n        \"Der Einstiegspunkt-Glob {0} passte auf keine Verzeichnisse mit einer package.json-Datei\",\n    file_0_not_an_object: \"Die Datei {0} ist kein Objekt\",\n\n    // deserialization\n    serialized_project_referenced_0_not_part_of_project:\n        \"Serialisiertes Projekt referenziert Reflection {0}, welche kein Teil des Projekts ist\",\n    saved_relative_path_0_resolved_from_1_does_not_exist:\n        \"Serialisiertes Projekt referenziert {0}, was relativ zu {1} nicht existiert\",\n\n    // options\n    circular_reference_extends_0: `Zyklische Referenz im \"extends\"-Feld von {0} gefunden`,\n    failed_resolve_0_to_file_in_1: \"Konnte {0} in {1} nicht zu einer Datei auflösen\",\n\n    glob_0_should_use_posix_slash:\n        `Der Glob \"{0}\" maskiert nichtspezielle Zeichen. Glob-Eingaben für TypeDoc dürfen keine Windows-Pfadtrennzeichen (\\\\) verwenden, nutzen Sie stattdessen Posix-Pfadtrennzeichen (/)`,\n    option_0_can_only_be_specified_by_config_file:\n        `Die Option '{0}' darf nur in einer Konfigurationsdatei angegeben werden`,\n    option_0_expected_a_value_but_none_provided: \"--{0} erwartet einen Wert, aber keiner wurde als Argument übergeben\",\n    unknown_option_0_may_have_meant_1: \"Unbekannte Option: {0}, meinten Sie vielleicht:\\n\\t{1}\",\n\n    typedoc_key_in_0_ignored:\n        `Das Feld 'typedoc' in {0} wurde von der entryPointStrategy \"legacy-packages\" verwendet und wird ignoriert`,\n    typedoc_options_must_be_object_in_0:\n        `Konnte das Feld \"typedocOptions\" in {0} nicht parsen, stellen Sie sicher, dass es existiert und ein Objekt enthält`,\n    tsconfig_file_0_does_not_exist: \"Die tsconfig-Datei {0} existiert nicht\",\n    tsconfig_file_specifies_options_file:\n        `\"typedocOptions\" in der tsconfig-Datei gibt eine einzulesende Datei mit Optionen an, aber die Optionsdatei wurde schon eingelesen. Das ist wahrscheinlich ein Konfigurationsfehler`,\n    tsconfig_file_specifies_tsconfig_file:\n        `\"typedocOptions\" in der tsconfig-Datei darf keine tsconfig-Datei zum Einlesen angeben`,\n    tags_0_defined_in_typedoc_json_overwritten_by_tsdoc_json:\n        \"Die {0} aus der typedoc.json werden durch die Konfiguration in der tsdoc.json überschrieben\",\n    failed_read_tsdoc_json_0: \"Konnte tsdoc.json-Datei unter {0} nicht lesen\",\n    invalid_tsdoc_json_0: \"Die Datei {0} ist keine gültige tsdoc.json-Datei\",\n\n    options_file_0_does_not_exist: \"Die Optionsdatei {0} existiert nicht\",\n    failed_read_options_file_0:\n        \"Konnte {0} nicht parsen, stellen Sie sicher, dass die Datei existiert und ein Objekt exportiert\",\n\n    // plugins\n    invalid_plugin_0_missing_load_function: \"Ungültige Struktur im Plugin {0}, keine load-Funktion gefunden\",\n    plugin_0_could_not_be_loaded: \"Das Plugin {0} konnte nicht geladen werden\",\n\n    // option declarations help\n    help_options:\n        \"JSON-Datei mit Optionen, die geladen werden soll. Ist keine angegeben, schaut TypeDoc nach einer 'typedoc.json' im aktuellen Verzeichnis\",\n    help_tsconfig:\n        \"TypeScript-Konfigurationsdatei, die geladen werden soll. Ist keine angegeben, schaut TypeDoc nach einer 'tsconfig.json' im aktuellen Verzeichnis\",\n    help_compilerOptions: \"Ausgewählte TypeScript-Compiler-Optionen überschreiben, die von TypeDoc genutzt werden\",\n    help_lang: \"Setzt die Sprache für die generierte Dokumentation und für die von TypeDoc ausgegebenen Meldungen\",\n    help_locales:\n        \"Fügt Übersetzungen für eine bestimmte Sprache hinzu. Die Option ist hauptsächlich als Überbrückung gedacht, bis TypeDoc die Sprache offiziell unterstützt\",\n    help_packageOptions:\n        \"Setzt Optionen, die innerhalb jedes Packages verwendet werden, falls die entryPointStrategy auf packages gesetzt ist\",\n\n    help_entryPoints: \"Die Einstiegspunkte der Dokumentation\",\n    help_entryPointStrategy: \"Die zu nutzende Strategie, um die Einstiegspunkte in Dokumentationsmodule umzuwandeln\",\n    help_alwaysCreateEntryPointModule:\n        \"Falls gesetzt, erstellt TypeDoc immer ein `Modul` für Einstiegspunkte, selbst wenn nur eins angegeben wurde\",\n    help_projectDocuments:\n        \"Dokumente, die als Kinder zur Root-Ebene der generierten Dokumentation hinzugefügt werden sollen. Unterstützt Globs, um mehrere Dateien zu selektieren\",\n    help_exclude:\n        \"Patterns zum Ausschließen von Dateien, wenn nach Dateien in einem Verzeichnis gesucht wird, das als Einstiegspunkt angegeben wurde\",\n    help_externalPattern: \"Patterns für Dateien, die als extern betrachtet werden sollen\",\n    help_excludeExternals: \"Verhindert die Dokumentation von als extern aufgelösten Symbolen\",\n    help_excludeNotDocumented:\n        \"Verhindert, dass Symbole in der Dokumentation erscheinen, die nicht explizit dokumentiert wurden\",\n    help_excludeNotDocumentedKinds: \"Arten von Reflections, die von excludeNotDocumented entfernt werden können\",\n    help_excludeInternal: \"Verhindert, dass Symbole in der Dokumentation erscheinen, die mit @internal markiert sind\",\n    help_excludeCategories: \"Schließt Symbole aus dieser Kategorie von der Dokumentation aus\",\n    help_excludeProtected: \"Ignoriert geschützte Variablen und Methoden\",\n    help_excludeReferences: \"Wird ein Symbol mehrfach exportiert, ignoriere alle außer dem ersten Export\",\n    help_externalSymbolLinkMappings:\n        \"Definiert eigene Links für Symbole, die nicht in der Dokumentation enthalten sind\",\n    help_out:\n        \"Gibt den Pfad an, wohin die Dokumentation für die Default-Ausgabe geschrieben werden soll. Der Standard-Ausgabetyp kann von Plugins geändert werden.\",\n    help_html: \"Gibt den Pfad an, wohin die HTML-Dokumentation geschrieben werden soll.\",\n    help_json:\n        \"Gibt den Pfad und den Dateinamen an, wohin eine JSON-Datei mit einer Beschreibung des Projekts geschrieben werden soll\",\n    help_pretty: \"Gibt an, ob die JSON-Datei mit Tabs formatiert werden soll\",\n    help_emit: \"Gibt an, was TypeDoc ausgeben soll, 'docs', 'both', oder 'none'\",\n    help_theme: \"Gibt den Namen des Themes an, mit dem die Dokumentation erstellt werden soll\",\n    help_router: \"Gibt den Namen des Routers an, der zum Ermitteln der Dateinamen in der Dokumentation verwendet wird\",\n    help_lightHighlightTheme: \"Gibt das Theme für die Syntaxhervorhebung im Light-Modus an\",\n    help_darkHighlightTheme: \"Gibt das Theme für die Syntaxhervorhebung im Dark-Modus an\",\n    help_highlightLanguages: \"Gibt die Sprachen an, die geladen werden sollen, um Code bei der Ausgabe hervorzuheben\",\n    help_ignoredHighlightLanguages:\n        \"Gibt Sprachen an, welche als gültige Sprache für die Syntaxhervorhebung erkannt werden, aber zur Laufzeit nicht hervorgehoben werden\",\n    help_typePrintWidth: \"Breite beim Rendern eines Typs, ab der Code in eine neue Zeile umgebrochen wird\",\n    help_customCss: \"Pfad auf eine eigene CSS-Datei, die zusätzlich zum Theme importiert wird\",\n    help_customJs: \"Pfade auf eine eigene einzubindende JavaScript-Datei\",\n    help_markdownItOptions:\n        \"Gibt Optionen an, die zu markdown-it weitergereicht werden, dem von TypeDoc verwendeten Markdown-Parser\",\n    help_markdownItLoader:\n        \"Gibt ein Callback an, das beim Laden der markdown-it-Instanz gerufen wird. Dem Callback wird die Instanz des Parsers übergeben, den TypeDoc verwenden wird\",\n    help_maxTypeConversionDepth: \"Setzt die maximale Tiefe von Typen, bis zu der diese konvertiert werden\",\n    help_name: \"Setzt den Namen des Projekts, der im Header des Templates verwendet wird\",\n    help_includeVersion: \"Fügt die Package-Version zum Projektnamen hinzu\",\n    help_disableSources: \"Deaktiviert das Setzen der Quelle, wenn eine Reflection dokumentiert wird\",\n    help_sourceLinkTemplate:\n        \"Gibt ein Link-Template an, das beim Generieren von Quelldatei-URLs verwendet wird. Wenn nicht gesetzt, wird automatisch ein Template vom Git-Remote erstellt. Unterstützt die Platzhalter {path}, {line} und {gitRevision}\",\n    help_gitRevision:\n        \"Nutzt die angegebene Revision statt der neuesten Revision zum Verlinken der Quellcode-Dateien auf GitHub/Bitbucket. Hat keinen Effekt, wenn disableSources gesetzt ist\",\n    help_gitRemote:\n        \"Nutzt das angegebene Remote zum Verlinken von Quellcode-Dateien auf GitHub/Bitbucket. Hat keinen Effekt, wenn disableGit oder disableSources gesetzt ist\",\n    help_disableGit:\n        \"Gehe davon aus, dass auf alles mit dem sourceLinkTemplate verlinkt werden kann, sourceLinkTemplate muss gesetzt sein, falls die Option aktiviert ist. Der Platzhalter {path} ist dann relativ zum basePath\",\n    help_basePath: \"Gibt den Basispfad an, der beim Anzeigen von Dateipfaden verwendet wird\",\n    help_excludeTags: \"Entfernt die angegebenen Block- und Modifier-Tags von den Doc-Kommentaren\",\n    help_notRenderedTags:\n        \"Tags, die in den Doc-Kommentaren bewahrt werden, aber in der Dokumentation nicht angezeigt werden sollen\",\n    help_cascadedModifierTags: \"Modifier-Tags, die in alle Kinder einer Eltern-Reflection kopiert werden sollen\",\n    help_readme:\n        \"Pfad auf die Readme-Datei, die auf der Indexseite angezeigt werden soll. `none`, um die Indexseite zu deaktivieren und die Dokumentation auf der Seite mit den globalen Variablen beginnen zu lassen\",\n    help_cname: \"Setzt den CNAME-Dateitext, nützlich für eigene Domains bei GitHub-Pages\",\n    help_favicon: \"Pfad auf ein Favicon, welches als Icon für die Seite eingebunden werden soll\",\n    help_sourceLinkExternal:\n        \"Gibt an, dass Quelldatei-Links als externe Links behandelt und in einem neuen Tab geöffnet werden sollen\",\n    help_markdownLinkExternal:\n        \"Gibt an, dass http[s]://-Links in Kommentaren und Markdown-Dateien als externe Links behandelt und in einem neuen Tab geöffnet werden sollen\",\n    help_githubPages:\n        \"Erzeugt eine .nojekyll-Datei, um 404-Fehler bei GitHub-Pages zu vermeiden. Standardwert ist `true`\",\n    help_hostedBaseUrl:\n        \"Gibt die Basis-URL an, die beim Erzeugen einer sitemap.xml im Ausgabeverzeichnis und für kanonische Links verwendet wird. Wenn nicht angegeben, wird keine Sitemap erzeugt\",\n    help_useHostedBaseUrlForAbsoluteLinks:\n        \"Wenn gesetzt, erzeugt TypeDoc unter Verwendung der Option hostedBaseUrl absolute Links auf Unterseiten der Seite\",\n    help_hideGenerator: \"Gibt den TypeDoc-Link am Ende der Seite nicht aus\",\n    help_customFooterHtml: \"Eigener Footer nach dem TypeDoc-Link\",\n    help_customFooterHtmlDisableWrapper: \"Wenn gesetzt, wird das Wrapper-Element um customFooterHtml nicht ausgegeben\",\n    help_cacheBust: \"Zeitpunkt der Erstellung der Dokumentation in Links auf statische Assets inkludieren\",\n    help_searchInComments:\n        \"Wenn gesetzt, wird der Suchindex auch Kommentare enthalten. Dies wird die Größe des Suchindex stark erhöhen\",\n    help_searchInDocuments:\n        \"Wenn gesetzt, wird der Suchindex auch Dokumente enthalten. Dies wird die Größe des Suchindex stark erhöhen\",\n    help_cleanOutputDir: \"Wenn gesetzt, löscht TypeDoc das Ausgabeverzeichnis vor dem Schreiben der Dokumentation\",\n    help_titleLink:\n        \"Setzt den Link des Titels im Header. Standardmäßig wird auf die Startseite der Dokumentation verlinkt\",\n    help_navigationLinks: \"Gibt Links an, die mit in den Header geschrieben werden\",\n    help_sidebarLinks: \"Gibt Links an, die mit in die Seitenleiste geschrieben werden\",\n    help_navigationLeaves: \"Zweige des Navigationsbaums, die nicht ausgeklappt sein sollen\",\n    help_headings: \"Legt fest, welche optionalen Überschriften ausgegeben werden sollen\",\n    help_sluggerConfiguration: \"Legt fest, wie Anker im generierten HTML festgelegt werden.\",\n    help_navigation: \"Legt fest, wie die Navigationsseitenleiste organisiert wird\",\n    help_includeHierarchySummary:\n        \"Wenn gesetzt, wird eine Übersicht der Reflection-Hierarchie auf der Zusammenfassungsseite ausgegeben. Standardwert ist `true`\",\n    help_visibilityFilters:\n        \"Gibt die standardmäßige Sichtbarkeit für eingebaute Filter sowie zusätzliche Filter anhand eines Modifier-Tags an.\",\n    help_searchCategoryBoosts: \"Konfiguriert die Suche so, dass ausgewählte Kategorien als relevanter bewertet werden\",\n    help_searchGroupBoosts:\n        'Konfiguriert die Suche so, dass ausgewählte Symbolarten (z.B. \"Klasse\") als relevanter bewertet werden',\n    help_useFirstParagraphOfCommentAsSummary:\n        \"Wenn gesetzt und kein @summary-Tag vorhanden ist, verwendet TypeDoc den ersten Absatz eines Kommentars als die Kurzzusammenfassung in der Modul- oder Namensraum-Ansicht\",\n    help_jsDocCompatibility:\n        \"Setzt Kompatibilitätsoptionen beim Parsen von Kommentaren, welche die Ähnlichkeit zu JSDoc-Kommentaren erhöhen\",\n    help_suppressCommentWarningsInDeclarationFiles:\n        \"Verhindert, dass Warnungen gemeldet werden, die durch unspezifizierte Tags innerhalb von Kommentaren in .d.ts-Dateien verursacht wurden.\",\n    help_commentStyle: \"Legt fest, wie TypeDoc nach Kommentaren sucht\",\n    help_useTsLinkResolution:\n        \"Verwendet TypeScripts Mechanismus zur Auflösung von Links beim Ermitteln des Ziels eines @link-Tags. Betrifft nur Kommentare im JSDoc-Stil\",\n    help_preserveLinkText:\n        \"Wenn gesetzt, wird bei @link-Tags ohne expliziten Link-Text der Textinhalt als Link verwendet. Wenn nicht gesetzt, wird der Name der Ziel-Reflection verwendet\",\n    help_blockTags: \"Block-Tags, die TypeDoc beim Parsen von Kommentaren erkennen soll\",\n    help_inlineTags: \"Inline-Tags, die TypeDoc beim Parsen von Kommentaren erkennen soll\",\n    help_modifierTags: \"Modifier-Tags, die TypeDoc beim Parsen von Kommentaren erkennen soll\",\n    help_categorizeByGroup: \"Gibt an, ob die Kategorisierung auf der Gruppen-Ebene vorgenommen werden soll\",\n    help_groupReferencesByType:\n        \"Wenn gesetzt, werden Referenzen zusammen mit dem Typ, auf den sie verweisen, gruppiert und nicht innerhalb einer 'Referenzen'-Gruppe\",\n    help_defaultCategory: \"Gibt die Standard-Kategorie für Reflections ohne eine Kategorie an\",\n    help_categoryOrder:\n        \"Gibt die Reihenfolge an, in der Kategorien erscheinen. * legt die relative Reihenfolge für Kategorien fest, die nicht in der Liste sind\",\n    help_groupOrder:\n        \"Gibt die Reihenfolge an, in der Gruppen erscheinen. * legt die relative Reihenfolge für Gruppen fest, die nicht in der Liste sind\",\n    help_sort: \"Gibt die Sortierstrategie für dokumentierte Werte an\",\n    help_sortEntryPoints:\n        \"Wenn gesetzt, werden auf Einstiegspunkte die gleichen Sortierregeln angewandt, die auch für andere Reflections gelten\",\n    help_kindSortOrder: \"Gibt die Sortierreihenfolge für Reflections an, wenn ein 'kind' festgelegt ist\",\n    help_watch: \"Überwache Dateien auf Änderungen und baue die Dokumentation bei Änderungen neu\",\n    help_preserveWatchOutput: \"Wenn gesetzt, leert TypeDoc den Bildschirm nicht zwischen Kompilierungsschritten\",\n    help_skipErrorChecking: \"Führt die Typenprüfung von TypeScript nicht vor Erzeugung der Dokumentation aus\",\n    help_help: \"Gibt diese Nachricht aus\",\n    help_version: \"Gibt die Version von TypeDoc aus\",\n    help_showConfig: \"Gibt die aufgelöste Konfiguration aus und stoppt\",\n    help_plugin:\n        \"Gibt die NPM-Plugins an, die geladen werden sollen. Nicht angeben, um alle installierten Plugins zu laden\",\n    help_logLevel: \"Gibt an, welches Level für das Logging verwendet werden soll\",\n    help_treatWarningsAsErrors: \"Wenn gesetzt, werden alle Warnungen als Fehler behandelt\",\n    help_treatValidationWarningsAsErrors:\n        \"Wenn gesetzt, werden alle Warnungen, die während der Validierung erzeugt wurden, als Fehler behandelt. Diese Option kann nicht zum Deaktivieren von treatWarningsAsErrors für Validierungswarnungen verwendet werden\",\n    help_intentionallyNotExported:\n        \"Eine Liste von Typen, welche keine Warnungen der Art 'referenziert, aber nicht dokumentiert' erzeugen sollen\",\n    help_requiredToBeDocumented: \"Eine Liste von Reflection-Arten, die dokumentiert werden müssen\",\n    help_packagesRequiringDocumentation: \"Eine Liste von Packages, die dokumentiert werden müssen\",\n    help_intentionallyNotDocumented:\n        \"Eine Liste von vollständigen Reflection-Namen, welche keine Warnungen erzeugen sollen, wenn sie nicht dokumentiert sind\",\n    help_validation: \"Gibt an, welche Validierungsschritte TypeDoc auf die erzeugte Dokumentation anwenden soll\",\n\n    // ==================================================================\n    // Option validation\n    // ==================================================================\n    unknown_option_0_you_may_have_meant_1: `Unbekannte Option '{0}'. Meinten Sie vielleicht:\\n\\t{1}`,\n    option_0_must_be_between_1_and_2: \"{0} muss zwischen {1} und {2} liegen\",\n    option_0_must_be_equal_to_or_greater_than_1: \"{0} muss größer oder gleich {1} sein\",\n    option_0_must_be_less_than_or_equal_to_1: \"{0} muss kleiner oder gleich {1} sein\",\n    option_0_must_be_one_of_1: \"{0} muss enthalten sein in {1}\",\n    flag_0_is_not_valid_for_1_expected_2: \"Das Flag '{0}' ist nicht gültig für {1}, erwartet wird {2}\",\n    expected_object_with_flag_values_for_0: \"Erwartet für {0} wird entweder true/false oder ein Objekt mit Flag-Werten\",\n    flag_values_for_0_must_be_booleans: \"Flag-Werte für {0} müssen Wahrheitswerte sein\",\n    locales_must_be_an_object:\n        \"Die Option 'locales' muss auf ein Objekt der folgenden Form gesetzt werden: { en: { theme_implements: \\\"Implements\\\" }}\",\n    exclude_not_documented_specified_0_valid_values_are_1:\n        \"excludeNotDocumentedKinds erlaubt nur bekannte Werte, und ungültige Werte wurden angegeben ({0}). Die gültigen Arten sind:\\n{1}\",\n    external_symbol_link_mappings_must_be_object:\n        \"externalSymbolLinkMappings muss vom Typ Record<package name, Record<symbol name, link>> sein\",\n    highlight_theme_0_must_be_one_of_1: \"{0} muss einer der folgenden Werte sein: {1}\",\n    highlightLanguages_contains_invalid_languages_0:\n        \"highlightLanguages enthält ungültige Sprachen: {0}, führen Sie typedoc --help aus, um eine Liste unterstützter Sprachen zu erhalten\",\n    hostedBaseUrl_must_start_with_http: \"hostedBaseUrl muss mit http:// oder https:// anfangen\",\n    useHostedBaseUrlForAbsoluteLinks_requires_hostedBaseUrl:\n        \"Die Option useHostedBaseUrlForAbsoluteLinks erfordert, dass auch hostedBaseUrl gesetzt wird\",\n    favicon_must_have_one_of_the_following_extensions_0: \"Favicon muss eine der folgenden Dateiendungen haben: {0}\",\n    option_0_must_be_an_object: \"Die Option '{0}' muss ein Objekt (kein Array) sein\",\n    option_0_must_be_a_function: \"Die Option '{0}' muss eine Funktion sein\",\n    option_0_must_be_object_with_urls: \"{0} muss ein Objekt sein, mit String-Labels als Schlüssel und URLs als Werte\",\n    visibility_filters_only_include_0: \"visibilityFilters darf nur die folgenden nicht-@-Schlüssel enthalten: {0}\",\n    visibility_filters_must_be_booleans: \"Alle Werte von visibilityFilters müssen Wahrheitswerte sein\",\n    option_0_values_must_be_numbers: \"Alle Werte von {0} müssen Zahlen sein\",\n    option_0_values_must_be_array_of_tags: \"{0} muss ein Array mit gültigen Tag-Namen sein\",\n    option_0_specified_1_but_only_2_is_valid:\n        \"{0} erlaubt nur bekannte Werte, und ungültige Werte wurden angegeben ({1}). Die gültigen Sortierungsstrategien sind:\\n{2}\",\n    option_outputs_must_be_array:\n        `Option \"outputs\" muss ein Array aus Elementen vom Typ { name: string, path: string, options?: TypeDocOptions } sein.`,\n    specified_output_0_has_not_been_defined: `Angegebene Ausgabe \"{0}\" wurde nicht definiert.`,\n\n    // https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n    alert_note: \"Hinweis\",\n    alert_tip: \"Tipp\",\n    alert_important: \"Wichtig\",\n    alert_warning: \"Warnung\",\n    alert_caution: \"Achtung\",\n\n    // ReflectionKind singular translations\n    kind_project: \"Projekt\",\n    kind_module: \"Modul\",\n    kind_namespace: \"Namensraum\",\n    kind_enum: \"Aufzählung\",\n    kind_enum_member: \"Aufzählungselement\",\n    kind_variable: \"Variable\",\n    kind_function: \"Funktion\",\n    kind_class: \"Klasse\",\n    kind_interface: \"Schnittstelle\",\n    kind_constructor: \"Konstruktor\",\n    kind_property: \"Eigenschaft\",\n    kind_method: \"Methode\",\n    kind_call_signature: \"Aufrufsignatur\",\n    kind_index_signature: \"Indexsignatur\",\n    kind_constructor_signature: \"Konstruktorsignatur\",\n    kind_parameter: \"Parameter\",\n    kind_type_literal: \"Typenliteral\",\n    kind_type_parameter: \"Typenparameter\",\n    kind_accessor: \"Zugriffsfunktion\",\n    kind_get_signature: \"Abfragesignatur\",\n    kind_set_signature: \"Änderungssignatur\",\n    kind_type_alias: \"Typenalias\",\n    kind_reference: \"Referenz\",\n    kind_document: \"Dokument\",\n\n    // ReflectionKind plural translations\n    kind_plural_project: \"Projekte\",\n    kind_plural_module: \"Module\",\n    kind_plural_namespace: \"Namensräume\",\n    kind_plural_enum: \"Aufzählungen\",\n    kind_plural_enum_member: \"Aufzählungselemente\",\n    kind_plural_variable: \"Variablen\",\n    kind_plural_function: \"Funktionen\",\n    kind_plural_class: \"Klassen\",\n    kind_plural_interface: \"Schnittstellen\",\n    kind_plural_constructor: \"Konstruktoren\",\n    kind_plural_property: \"Eigenschaften\",\n    kind_plural_method: \"Methoden\",\n    kind_plural_call_signature: \"Aufrufsignaturen\",\n    kind_plural_index_signature: \"Indexsignaturen\",\n    kind_plural_constructor_signature: \"Konstruktorsignaturen\",\n    kind_plural_parameter: \"Parameter\",\n    kind_plural_type_literal: \"Typenliterale\",\n    kind_plural_type_parameter: \"Typenparameter\",\n    kind_plural_accessor: \"Zugriffsfunktionen\",\n    kind_plural_get_signature: \"Abfragesignaturen\",\n    kind_plural_set_signature: \"Änderungssignaturen\",\n    kind_plural_type_alias: \"Typenaliasse\",\n    kind_plural_reference: \"Referenzen\",\n    kind_plural_document: \"Dokumente\",\n\n    // ReflectionFlag translations\n    flag_private: \"Privat\",\n    flag_protected: \"Geschützt\",\n    flag_public: \"Öffentlich\",\n    flag_static: \"Statisch\",\n    flag_external: \"Extern\",\n    flag_optional: \"Optional\",\n    flag_rest: \"Rest\",\n    flag_abstract: \"Abstrakt\",\n    flag_const: \"Konstant\",\n    flag_readonly: \"Schreibgeschützt\",\n    flag_inherited: \"Geerbt\",\n\n    // ==================================================================\n    // Strings that show up in the default theme\n    // ==================================================================\n    // Page headings/labels\n    theme_implements: \"Implementiert\",\n    theme_indexable: \"Indexierbar\",\n    theme_type_declaration: \"Typendeklaration\",\n    theme_index: \"Index\",\n    theme_hierarchy: \"Hierarchie\",\n    theme_hierarchy_summary: \"Hierarchieübersicht\",\n    theme_hierarchy_view_summary: \"Zusammenfassung anzeigen\",\n    theme_implemented_by: \"Implementiert von\",\n    theme_defined_in: \"Definiert in\",\n    theme_implementation_of: \"Implementierung von\",\n    theme_inherited_from: \"Geerbt von\",\n    theme_overrides: \"Überschreibt\",\n    theme_returns: \"Rückgabewert\",\n    theme_generated_using_typedoc: \"Generiert mit TypeDoc\", // If this includes \"TypeDoc\", theme will insert a link at that location.\n    // Search\n    theme_preparing_search_index: \"Bereite Suchindex vor...\",\n    // Left nav bar\n    theme_loading: \"Lade...\",\n    // Right nav bar\n    theme_settings: \"Einstellungen\",\n    theme_member_visibility: \"Member-Sichtbarkeit\",\n    theme_theme: \"Theme\",\n    theme_os: \"OS\",\n    theme_light: \"Light\",\n    theme_dark: \"Dark\",\n    theme_on_this_page: \"Auf dieser Seite\",\n\n    // aria-label\n    theme_search: \"Suchen\",\n    theme_menu: \"Menu\",\n    theme_permalink: \"Permalink\",\n    theme_folder: \"Ordner\",\n\n    // Used by the frontend JS\n    // For the English translations only, these should also be added to\n    // src/lib/output/themes/default/assets/typedoc/Application.ts\n    // Also uses theme_folder and singular kinds\n    theme_copy: \"Kopieren\",\n    theme_copied: \"Kopiert!\",\n    theme_normally_hidden: \"Dieser Member ist normalerweise aufgrund der Filtereinstellungen versteckt.\",\n    theme_hierarchy_expand: \"Ausklappen\",\n    theme_hierarchy_collapse: \"Einklappen\",\n    theme_search_index_not_available: \"Der Suchindex ist nicht verfügbar\",\n    theme_search_no_results_found_for_0: \"Keine Resultate gefunden für {0}\",\n    theme_search_placeholder: \"Dokumentation durchsuchen\",\n});\n"
  },
  {
    "path": "src/lib/internationalization/locales/en.cts",
    "content": "// This one is the source of truth, so looks a bit different from the other locales, look at another one\n// for a template to follow.\n\nexport = {\n    loaded_multiple_times_0:\n        \"TypeDoc has been loaded multiple times. This is commonly caused by plugins which have their own installation of TypeDoc. The loaded paths are:\\n\\t{0}\",\n    unsupported_ts_version_0:\n        \"You are running with an unsupported TypeScript version! If TypeDoc crashes, this is why. TypeDoc supports {0}\",\n    no_compiler_options_set:\n        \"No compiler options set. This likely means that TypeDoc did not find your tsconfig.json. Generated documentation will probably be empty\",\n\n    loaded_plugin_0: `Loaded plugin {0}`,\n\n    solution_not_supported_in_watch_mode:\n        \"The provided tsconfig file looks like a solution style tsconfig, which is not supported in watch mode\",\n    strategy_not_supported_in_watch_mode: \"entryPointStrategy must be set to either resolve or expand for watch mode\",\n    file_0_changed_restarting: \"Configuration file {0} changed: full restart required...\",\n    file_0_changed_rebuilding: \"File {0} changed: rebuilding output...\",\n    found_0_errors_and_1_warnings: \"Found {0} errors and {1} warnings\",\n\n    output_0_could_not_be_generated: \"{0} output could not be generated due to the errors above\",\n    output_0_generated_at_1: \"{0} generated at {1}\",\n\n    no_entry_points_for_packages: \"No entry points provided to packages mode, documentation cannot be generated\",\n    failed_to_find_packages:\n        \"Failed to find any packages, ensure you have provided at least one directory as an entry point containing package.json\",\n    nested_packages_unsupported_0:\n        \"Project at {0} has entryPointStrategy set to packages, but nested packages are not supported\",\n    package_option_0_should_be_specified_at_root:\n        \"The packageOptions option sets option {0}, which only has an affect at the root level\",\n    previous_error_occurred_when_reading_options_for_0:\n        \"The previous error occurred when reading options for the package at {0}\",\n    converting_project_at_0: \"Converting project at {0}\",\n    failed_to_convert_packages: \"Failed to convert one or more packages, result will not be merged together\",\n    merging_converted_projects: \"Merging converted projects\",\n\n    no_entry_points_to_merge: \"No entry points provided to merge\",\n    entrypoint_did_not_match_files_0: \"The entrypoint glob {0} did not match any files\",\n    failed_to_parse_json_0: `Failed to parse file at {0} as json`,\n\n    failed_to_read_0_when_processing_document_tag_in_1:\n        `Failed to read file {0} when processing @document tag for comment in {1}`,\n    failed_to_read_0_when_processing_project_document: `Failed to read file {0} when adding project document`,\n    failed_to_read_0_when_processing_document_child_in_1:\n        `Failed to read file {0} when processing document children in {1}`,\n    frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values:\n        \"Frontmatter children in {0} should be an array of strings or an object with string values\",\n    converting_union_as_interface:\n        `Using @interface on a union type will discard properties not present on all branches of the union. TypeDoc's output may not accurately describe your source code`,\n    converting_0_as_class_requires_value_declaration:\n        `Converting {0} as a class requires a declaration which represents a non-type value`,\n    converting_0_as_class_without_construct_signatures:\n        `{0} is being converted as a class, but does not have any construct signatures`,\n    converting_0_as_enum_requires_value_declaration:\n        `Converting {0} as an enum requires a declaration which represents a non-type value`,\n\n    comment_for_0_should_not_contain_block_or_modifier_tags:\n        `The comment for {0} should not contain any block or modifier tags`,\n\n    symbol_0_has_multiple_declarations_with_comment:\n        `{0} has multiple declarations with a comment. An arbitrary comment will be used`,\n    comments_for_0_are_declared_at_1: `The comments for {0} are declared at:\\n\\t{1}`,\n\n    // comments/parser.ts\n    multiple_type_parameters_on_template_tag_unsupported:\n        `TypeDoc does not support multiple type parameters defined in a single @template tag with a comment`,\n    inline_tag_0_not_parsed_as_modifier_tag_1:\n        `The inline tag {0} was likely intended to be a modifier tag but was not parsed as one due to including content \"{1}\"`,\n    failed_to_find_jsdoc_tag_for_name_0:\n        `Failed to find JSDoc tag for {0} after parsing comment, please file a bug report`,\n    relative_path_0_is_not_a_file_and_will_not_be_copied_to_output:\n        `The relative path {0} is not a file and will not be copied to the output directory`,\n\n    inline_inheritdoc_should_not_appear_in_block_tag_in_comment_at_0:\n        \"An inline @inheritDoc tag should not appear within a block tag as it will not be processed in comment at {0}\",\n    at_most_one_remarks_tag_expected_in_comment_at_0:\n        \"At most one @remarks tag is expected in a comment, ignoring all but the first in comment at {0}\",\n    at_most_one_returns_tag_expected_in_comment_at_0:\n        \"At most one @returns tag is expected in a comment, ignoring all but the first in comment at {0}\",\n    at_most_one_inheritdoc_tag_expected_in_comment_at_0:\n        \"At most one @inheritDoc tag is expected in a comment, ignoring all but the first in comment at {0}\",\n    content_in_summary_overwritten_by_inheritdoc_in_comment_at_0:\n        \"Content in the summary section will be overwritten by the @inheritDoc tag in comment at {0}\",\n    content_in_remarks_block_overwritten_by_inheritdoc_in_comment_at_0:\n        \"Content in the @remarks block will be overwritten by the @inheritDoc tag in comment at {0}\",\n    content_in_returns_block_overwritten_by_inheritdoc_in_comment_at_0:\n        \"Content in the @returns block will be overwritten by the @inheritDoc tag in comment at {0}\",\n    example_tag_literal_name:\n        \"The first line of an example tag will be taken literally as the example name, and should only contain text\",\n    inheritdoc_tag_properly_capitalized: \"The @inheritDoc tag should be properly capitalized\",\n    treating_unrecognized_tag_0_as_modifier: `Treating unrecognized tag {0} as a modifier tag`,\n    unmatched_closing_brace: `Unmatched closing brace`,\n    unescaped_open_brace_without_inline_tag: `Encountered an unescaped open brace without an inline tag`,\n    unknown_block_tag_0: `Encountered an unknown block tag {0}`,\n    unknown_inline_tag_0: `Encountered an unknown inline tag {0}`,\n    open_brace_within_inline_tag: `Encountered an open brace within an inline tag, this is likely a mistake`,\n    inline_tag_not_closed: `Inline tag is not closed`,\n\n    // validation\n    comment_for_0_links_to_1_not_included_in_docs_use_external_link_2:\n        `The comment for {0} links to \"{1}\" which was resolved but is not included in the documentation. To fix this warning export it or add {2} to the externalSymbolLinkMappings option`,\n    failed_to_resolve_link_to_0_in_comment_for_1: `Failed to resolve link to \"{0}\" in comment for {1}`,\n    failed_to_resolve_link_to_0_in_comment_for_1_may_have_meant_2:\n        `Failed to resolve link to \"{0}\" in comment for {1}. You may have wanted \"{2}\"`,\n    failed_to_resolve_link_to_0_in_readme_for_1: `Failed to resolve link to \"{0}\" in readme for {1}`,\n    failed_to_resolve_link_to_0_in_readme_for_1_may_have_meant_2:\n        `Failed to resolve link to \"{0}\" in readme for {1}. You may have wanted \"{2}\"`,\n    failed_to_resolve_link_to_0_in_document_1: `Failed to resolve link to \"{0}\" in document {1}`,\n    failed_to_resolve_link_to_0_in_document_1_may_have_meant_2:\n        `Failed to resolve link to \"{0}\" in document {1}. You may have wanted \"{2}\"`,\n    type_0_defined_in_1_is_referenced_by_2_but_not_included_in_docs:\n        `{0}, defined in {1}, is referenced by {2} but not included in the documentation`,\n    reflection_0_kind_1_defined_in_2_does_not_have_any_documentation:\n        `{0} ({1}), defined in {2}, does not have any documentation`,\n    invalid_intentionally_not_documented_names_0:\n        \"The following qualified reflection names were marked as intentionally not documented, but were either not referenced in the documentation, or were documented:\\n\\t{0}\",\n    invalid_intentionally_not_exported_symbols_0:\n        \"The following symbols were marked as intentionally not exported, but were either not referenced in the documentation, or were exported:\\n\\t{0}\",\n    reflection_0_has_unused_mergeModuleWith_tag: \"{0} has a @mergeModuleWith tag which could not be resolved\",\n    reflection_0_links_to_1_with_text_2_but_resolved_to_3:\n        `\"{0}\" links to \"{1}\" with text \"{2}\" which exists but does not have a link in the documentation, will link to \"{3}\" instead.`,\n\n    // conversion plugins\n    not_all_search_category_boosts_used_0:\n        `Not all categories specified in searchCategoryBoosts were used in the documentation. The unused categories were:\\n\\t{0}`,\n    not_all_search_group_boosts_used_0:\n        `Not all groups specified in searchGroupBoosts were used in the documentation. The unused groups were:\\n\\t{0}`,\n    comment_for_0_includes_categoryDescription_for_1_but_no_child_in_group:\n        `Comment for {0} includes @categoryDescription for \"{1}\", but no child is placed in that category`,\n    comment_for_0_includes_groupDescription_for_1_but_no_child_in_group:\n        `Comment for {0} includes @groupDescription for \"{1}\", but no child is placed in that group`,\n    comment_for_0_specifies_1_as_sort_strategy_but_only_2_is_valid:\n        `Comment for {0} specifies @sortStrategy with \"{1}\", which is an invalid sort strategy, the following are valid:\\n\\t{2}`,\n    label_0_for_1_cannot_be_referenced:\n        `The label \"{0}\" for {1} cannot be referenced with a declaration reference. Labels may only contain A-Z, 0-9, and _, and may not start with a number`,\n    modifier_tag_0_is_mutually_exclusive_with_1_in_comment_for_2:\n        `The modifier tag {0} is mutually exclusive with {1} in the comment for {2}`,\n    signature_0_has_unused_param_with_name_1: `The signature {0} has an @param with name \"{1}\", which was not used`,\n    declaration_reference_in_inheritdoc_for_0_not_fully_parsed:\n        `Declaration reference in @inheritDoc for {0} was not fully parsed and may resolve incorrectly`,\n    failed_to_find_0_to_inherit_comment_from_in_1:\n        `Failed to find \"{0}\" to inherit the comment from in the comment for {1}`,\n    reflection_0_tried_to_copy_comment_from_1_but_source_had_no_comment:\n        `{0} tried to copy a comment from {1} with @inheritDoc, but the source has no associated comment`,\n    inheritdoc_circular_inheritance_chain_0: `@inheritDoc specifies a circular inheritance chain: {0}`,\n    provided_readme_at_0_could_not_be_read: `Provided README path, {0} could not be read`,\n    defaulting_project_name:\n        'The --name option was not specified, and no package.json was found. Defaulting project name to \"Documentation\"',\n    disable_git_set_but_not_source_link_template:\n        `disableGit is set, but sourceLinkTemplate is not, so source links cannot be produced. Set a sourceLinkTemplate or disableSources to prevent source tracking`,\n    disable_git_set_and_git_revision_used:\n        `disableGit is set and sourceLinkTemplate contains {gitRevision}, which will be replaced with an empty string as no revision was provided`,\n    git_remote_0_not_valid: `The provided git remote \"{0}\" was not valid. Source links will be broken`,\n    reflection_0_tried_to_merge_into_child_1:\n        `The reflection {0} tried to use @mergeModuleWith to merge into one of its children: {1}`,\n\n    include_0_in_1_specified_2_resolved_to_3_does_not_exist:\n        `{0} tag in comment for {1} specified \"{2}\" to include, which was resolved to \"{3}\" and does not exist or is not a file.`,\n    include_0_in_1_specified_2_circular_include_3:\n        `{0} tag in comment for {1} specified \"{2}\" to include, which resulted in a circular include:\\n\\t{3}`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_not_found:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled \"{4}\", but the region was not found in the file.`,\n    include_0_tag_in_1_region_2_region_not_supported:\n        `{0} tag in {1} specified \"{2}\", but regions are not supported for this file extension.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled \"{4}\", but the region closing comment was not found in the file.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled \"{4}\", but the region opening comment was not found in the file.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}, but the region closing comment was found multiple times in the file.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}, but the region opening comment was found multiple times in the file.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}, but the region was found multiple times in the file.`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_empty:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}. The region was found but it is empty or contains only whitespace.`,\n    include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the lines {4}, but an invalid range was specified.`,\n    include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines:\n        `{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the lines {4}, but the file only has {5} lines.`,\n\n    // output plugins\n    custom_css_file_0_does_not_exist: `Custom CSS file at {0} does not exist`,\n    custom_js_file_0_does_not_exist: `Custom JavaScript file at {0} does not exist`,\n    unsupported_highlight_language_0_not_highlighted_in_comment_for_1:\n        `Unsupported highlight language {0} will not be highlighted in comment for {1}`,\n    unloaded_language_0_not_highlighted_in_comment_for_1:\n        `Code block with language {0} will not be highlighted in comment for {1} as it was not included in the highlightLanguages option`,\n    yaml_frontmatter_not_an_object: `Expected YAML frontmatter to be an object`,\n\n    // renderer\n    could_not_write_0: `Could not write {0}`,\n    could_not_empty_output_directory_0: `Could not empty the output directory {0}`,\n    could_not_create_output_directory_0: `Could not create the output directory {0}`,\n    theme_0_is_not_defined_available_are_1: `The theme '{0}' is not defined. The available themes are: {1}`,\n    router_0_is_not_defined_available_are_1: `The router '{0}' is not defined. The available routers are: {1}`,\n    reflection_0_links_to_1_but_anchor_does_not_exist_try_2:\n        `{0} links to {1}, but the anchor does not exist. You may have meant:\\n\\t{2}`,\n\n    // entry points\n    no_entry_points_provided:\n        \"No entry points were provided or discovered from package.json exports, this is likely a misconfiguration\",\n    unable_to_find_any_entry_points: \"Unable to find any entry points. See previous warnings\",\n    watch_does_not_support_packages_mode: \"Watch mode does not support 'packages' style entry points\",\n    watch_does_not_support_merge_mode: \"Watch mode does not support 'merge' style entry points\",\n    entry_point_0_not_in_program:\n        `The entry point {0} is not referenced by the 'files' or 'include' option in your tsconfig`,\n    failed_to_resolve_0_to_ts_path:\n        `Failed to resolve entry point path {0} from package.json to a TypeScript source file`,\n    use_expand_or_glob_for_files_in_dir:\n        `If you wanted to include files inside this directory, set --entryPointStrategy to expand or specify a glob`,\n    glob_0_did_not_match_any_files: `The glob {0} did not match any files`,\n    entry_point_0_did_not_match_any_files_after_exclude:\n        `The glob {0} did not match any files after applying exclude patterns`,\n    entry_point_0_did_not_exist: `Provided entry point {0} does not exist`,\n    entry_point_0_did_not_match_any_packages:\n        `The entry point glob {0} did not match any directories containing package.json`,\n    file_0_not_an_object: `The file {0} is not an object`,\n\n    // deserialization\n    serialized_project_referenced_0_not_part_of_project:\n        `Serialized project referenced reflection {0}, which was not a part of the project`,\n    saved_relative_path_0_resolved_from_1_does_not_exist:\n        `Serialized project referenced {0}, which does not exist relative to {1}`,\n\n    // options\n    circular_reference_extends_0: `Circular reference encountered for \"extends\" field of {0}`,\n    failed_resolve_0_to_file_in_1: `Failed to resolve {0} to a file in {1}`,\n\n    glob_0_should_use_posix_slash:\n        `The glob \"{0}\" escapes a non-special character. Glob inputs to TypeDoc may not use Windows path separators (\\\\), try replacing with posix path separators (/)`,\n    option_0_can_only_be_specified_by_config_file: `The '{0}' option can only be specified via a config file`,\n    option_0_expected_a_value_but_none_provided: `--{0} expected a value, but none was given as an argument`,\n    unknown_option_0_may_have_meant_1: `Unknown option: {0}, you may have meant:\\n\\t{1}`,\n\n    typedoc_key_in_0_ignored:\n        `The 'typedoc' key in {0} was used by the legacy-packages entryPointStrategy and will be ignored`,\n    typedoc_options_must_be_object_in_0:\n        `Failed to parse the \"typedocOptions\" field in {0}, ensure it exists and contains an object`,\n    tsconfig_file_0_does_not_exist: `The tsconfig file {0} does not exist`,\n    tsconfig_file_specifies_options_file:\n        `\"typedocOptions\" in tsconfig file specifies an option file to read but the option file has already been read. This is likely a misconfiguration`,\n    tsconfig_file_specifies_tsconfig_file: `\"typedocOptions\" in tsconfig file may not specify a tsconfig file to read`,\n    tags_0_defined_in_typedoc_json_overwritten_by_tsdoc_json:\n        `The {0} defined in typedoc.json will be overwritten by configuration in tsdoc.json`,\n    failed_read_tsdoc_json_0: `Failed to read tsdoc.json file at {0}`,\n    invalid_tsdoc_json_0: `The file {0} is not a valid tsdoc.json file`,\n\n    options_file_0_does_not_exist: `The options file {0} does not exist`,\n    failed_read_options_file_0: `Failed to parse {0}, ensure it exists and exports an object`,\n    failed_to_apply_compilerOptions_overrides_0: \"Failed to apply compilerOptions overrides: {0}\",\n\n    // plugins\n    invalid_plugin_0_missing_load_function: `Invalid structure in plugin {0}, no load function found`,\n    plugin_0_could_not_be_loaded: `The plugin {0} could not be loaded`,\n\n    // option declarations help\n    help_options:\n        \"Specify a json option file that should be loaded. If not specified TypeDoc will look for 'typedoc.json' in the current directory\",\n    help_tsconfig:\n        \"Specify a TypeScript config file that should be loaded. If not specified TypeDoc will look for 'tsconfig.json' in the current directory\",\n    help_compilerOptions: \"Selectively override the TypeScript compiler options used by TypeDoc\",\n    help_lang: \"Sets the language to be used in generation and in TypeDoc's messages\",\n    help_locales:\n        \"Add translations for a specified locale. This option is primarily intended to be used as a stopgap while waiting for official locale support to be added to TypeDoc\",\n    help_packageOptions: \"Set options which will be set within each package when entryPointStrategy is set to packages\",\n\n    help_entryPoints: \"The entry points of your documentation\",\n    help_entryPointStrategy: \"The strategy to be used to convert entry points into documentation modules\",\n    help_alwaysCreateEntryPointModule:\n        \"When set, TypeDoc will always create a `Module` for entry points, even if only one is provided\",\n    help_projectDocuments:\n        \"Documents which should be added as children to the root of the generated documentation. Supports globs to match multiple files\",\n    help_exclude: \"Define patterns to be excluded when expanding a directory that was specified as an entry point\",\n    help_externalPattern: \"Define patterns for files that should be considered being external\",\n    help_excludeExternals: \"Prevent externally resolved symbols from being documented\",\n    help_excludeNotDocumented: \"Prevent symbols that are not explicitly documented from appearing in the results\",\n    help_excludeNotDocumentedKinds: \"Specify the type of reflections that can be removed by excludeNotDocumented\",\n    help_excludeInternal: \"Prevent symbols that are marked with @internal from being documented\",\n    help_excludeCategories: \"Exclude symbols within this category from the documentation\",\n    help_excludePrivate: \"Ignore members marked with the private keyword and #private class fields, defaults to true.\",\n    help_excludePrivateClassFields: \"Ignore #private class fields, defaults to true.\",\n    help_excludeProtected: \"Ignore protected variables and methods\",\n    help_excludeReferences: \"If a symbol is exported multiple times, ignore all but the first export\",\n    help_externalSymbolLinkMappings: \"Define custom links for symbols not included in the documentation\",\n    help_out:\n        \"Specify the location the documentation for the default output should be written to. The default output type may be changed by plugins.\",\n    help_html: \"Specify the location where html documentation should be written to.\",\n    help_json: \"Specify the location and filename a JSON file describing the project is written to\",\n    help_pretty: \"Specify whether the output JSON should be formatted with tabs\",\n    help_emit: \"Specify what TypeDoc should emit, 'docs', 'both', or 'none'\",\n    help_theme: \"Specify the theme name to render the documentation with\",\n    help_router: \"Specify the router name to use to determine file names in the documentation\",\n    help_lightHighlightTheme: \"Specify the code highlighting theme in light mode\",\n    help_darkHighlightTheme: \"Specify the code highlighting theme in dark mode\",\n    help_highlightLanguages: \"Specify the languages which will be loaded to highlight code when rendering\",\n    help_ignoredHighlightLanguages:\n        \"Specify languages which will be accepted as valid highlight languages, but will not be highlighted at runtime\",\n    help_typePrintWidth: \"Width at which to wrap code to a new line when rendering a type\",\n    help_customCss: \"Path to a custom CSS file to for the theme to import\",\n    help_customJs: \"Path to a custom JS file to import\",\n    help_markdownItOptions: \"Specify the options passed to markdown-it, the Markdown parser used by TypeDoc\",\n    help_markdownItLoader:\n        \"Specify a callback to be called when loading the markdown-it instance. Will be passed the instance of the parser which TypeDoc will use\",\n    help_maxTypeConversionDepth: \"Set the maximum depth of types to be converted\",\n    help_name: \"Set the name of the project that will be used in the header of the template\",\n    help_includeVersion: \"Add the package version to the project name\",\n    help_disableSources: \"Disable setting the source of a reflection when documenting it\",\n    help_sourceLinkTemplate:\n        \"Specify a link template to be used when generating source urls. If not set, will be automatically created using the git remote. Supports {path}, {line}, {gitRevision} placeholders\",\n    help_gitRevision:\n        \"Use specified revision instead of the last revision for linking to GitHub/Bitbucket source files. Has no effect if disableSources is set\",\n    help_gitRemote:\n        \"Use the specified remote for linking to GitHub/Bitbucket source files. Has no effect if disableGit or disableSources is set\",\n    help_disableGit:\n        \"Assume that all can be linked to with the sourceLinkTemplate, sourceLinkTemplate must be set if this is enabled. {path} will be rooted at basePath\",\n    help_displayBasePath:\n        \"Specifies the base path to be used when displaying file paths. If not specified, basePath is used.\",\n    help_excludeTags: \"Remove the listed block/modifier tags from doc comments\",\n    help_notRenderedTags: \"Tags which will be preserved in doc comments, but not rendered when creating output\",\n    help_cascadedModifierTags: \"Modifier tags which should be copied to all children of the parent reflection\",\n    help_preservedTypeAnnotationTags: \"Block tags whose type annotations should be preserved in the output.\",\n    help_readme:\n        \"Path to the readme file that should be displayed on the index page. Pass `none` to disable the index page and start the documentation on the globals page\",\n    help_basePath: \"Specifies a path which links may be resolved relative to.\",\n    help_cname: \"Set the CNAME file text, it's useful for custom domains on GitHub Pages\",\n    help_favicon: \"Path to favicon to include as the site icon\",\n    help_sourceLinkExternal:\n        \"Specifies that source links should be treated as external links to be opened in a new tab\",\n    help_markdownLinkExternal:\n        \"Specifies that http[s]:// links in comments and markdown files should be treated as external links to be opened in a new tab\",\n    help_githubPages: \"Generate a .nojekyll file to prevent 404 errors in GitHub Pages. Defaults to `true`\",\n    help_hostedBaseUrl:\n        \"Specify a base URL to be used in generating a sitemap.xml in our output folder and canonical links. If not specified, no sitemap will be generated\",\n    help_useHostedBaseUrlForAbsoluteLinks:\n        \"If set, TypeDoc will produce absolute links to pages on your site using the hostedBaseUrl option\",\n    help_hideGenerator: \"Do not print the TypeDoc link at the end of the page\",\n    help_customFooterHtml: \"Custom footer after the TypeDoc link\",\n    help_customFooterHtmlDisableWrapper: \"If set, disables the wrapper element for customFooterHtml\",\n    help_cacheBust: \"Include the generation time in links to static assets\",\n    help_searchInComments:\n        \"If set, the search index will also include comments. This will greatly increase the size of the search index\",\n    help_searchInDocuments:\n        \"If set, the search index will also include documents. This will greatly increase the size of the search index\",\n    help_cleanOutputDir: \"If set, TypeDoc will remove the output directory before writing output\",\n    help_titleLink: \"Set the link the title in the header points to. Defaults to the documentation homepage\",\n    help_navigationLinks: \"Defines links to be included in the header\",\n    help_sidebarLinks: \"Defines links to be included in the sidebar\",\n    help_navigationLeaves: \"Branches of the navigation tree which should not be expanded\",\n    help_headings: \"Determines which optional headings are rendered\",\n    help_sluggerConfiguration: \"Determines how anchors within rendered HTML are determined.\",\n    help_navigation: \"Determines how the navigation sidebar is organized\",\n    help_includeHierarchySummary:\n        \"If set, a reflections hierarchy summary will be rendered to a summary page. Defaults to `true`\",\n    help_visibilityFilters:\n        \"Specify the default visibility for builtin filters and additional filters according to modifier tags\",\n    help_searchCategoryBoosts: \"Configure search to give a relevance boost to selected categories\",\n    help_searchGroupBoosts: 'Configure search to give a relevance boost to selected kinds (eg \"class\")',\n    help_useFirstParagraphOfCommentAsSummary:\n        \"If set and no @summary tag is specified, TypeDoc will use the first paragraph of comments as the short summary in the module/namespace view\",\n    help_jsDocCompatibility:\n        \"Sets compatibility options for comment parsing that increase similarity with JSDoc comments\",\n    help_suppressCommentWarningsInDeclarationFiles:\n        \"Prevents warnings due to unspecified tags from being reported in comments within .d.ts files.\",\n    help_commentStyle: \"Determines how TypeDoc searches for comments\",\n    help_useTsLinkResolution:\n        \"Use TypeScript's link resolution when determining where @link tags point. This only applies to JSDoc style comments\",\n    help_preserveLinkText:\n        \"If set, @link tags without link text will use the text content as the link. If not set, will use the target reflection name\",\n    help_blockTags: \"Block tags which TypeDoc should recognize when parsing comments\",\n    help_inlineTags: \"Inline tags which TypeDoc should recognize when parsing comments\",\n    help_modifierTags: \"Modifier tags which TypeDoc should recognize when parsing comments\",\n    help_categorizeByGroup: \"Specify whether categorization will be done at the group level\",\n    help_groupReferencesByType:\n        \"If set, references will be grouped with the type they refer to rather than in a 'References' group\",\n    help_defaultCategory: \"Specify the default category for reflections without a category\",\n    help_categoryOrder:\n        \"Specify the order in which categories appear. * indicates the relative order for categories not in the list\",\n    help_groupOrder:\n        \"Specify the order in which groups appear. * indicates the relative order for groups not in the list\",\n    help_sort: \"Specify the sort strategy for documented values\",\n    help_sortEntryPoints: \"If set, entry points will be subject to the same sorting rules as other reflections\",\n    help_kindSortOrder: \"Specify the sort order for reflections when 'kind' is specified\",\n    help_watch: \"Watch files for changes and rebuild docs on change\",\n    help_preserveWatchOutput: \"If set, TypeDoc will not clear the screen between compilation runs\",\n    help_skipErrorChecking: \"Do not run TypeScript's type checking before generating docs\",\n    help_help: \"Print this message\",\n    help_version: \"Print TypeDoc's version\",\n    help_showConfig: \"Print the resolved configuration and exit\",\n    help_plugin: \"Specify the npm plugins that should be loaded. Omit to load all installed plugins\",\n    help_logLevel: \"Specify what level of logging should be used\",\n    help_treatWarningsAsErrors: \"If set, all warnings will be treated as errors\",\n    help_treatValidationWarningsAsErrors:\n        \"If set, warnings emitted during validation will be treated as errors. This option cannot be used to disable treatWarningsAsErrors for validation warnings\",\n    help_intentionallyNotExported: \"A list of types which should not produce 'referenced but not documented' warnings\",\n    help_requiredToBeDocumented: \"A list of reflection kinds that must be documented\",\n    help_packagesRequiringDocumentation: \"A list of packages that must be documented\",\n    help_intentionallyNotDocumented:\n        \"A list of full reflection names which should not produce warnings about not being documented\",\n    help_validation: \"Specify which validation steps TypeDoc should perform on your generated documentation\",\n\n    // ==================================================================\n    // Option validation\n    // ==================================================================\n    unknown_option_0_you_may_have_meant_1: `Unknown option '{0}' You may have meant:\\n\\t{1}`,\n    option_0_must_be_between_1_and_2: \"{0} must be between {1} and {2}\",\n    option_0_must_be_equal_to_or_greater_than_1: \"{0} must be equal to or greater than {1}\",\n    option_0_must_be_less_than_or_equal_to_1: \"{0} must be less than or equal to {1}\",\n    option_0_must_be_one_of_1: \"{0} must be one of {1}\",\n    flag_0_is_not_valid_for_1_expected_2: \"The flag '{0}' is not valid for {1}, expected one of {2}\",\n    expected_object_with_flag_values_for_0: \"Expected an object with flag values for {0} or true/false\",\n    flag_values_for_0_must_be_booleans: \"Flag values for {0} must be a boolean\",\n    locales_must_be_an_object:\n        \"The 'locales' option must be set to an object which resembles: { en: { theme_implements: \\\"Implements\\\" }}\",\n    exclude_not_documented_specified_0_valid_values_are_1:\n        `excludeNotDocumentedKinds may only specify known values, and invalid values were provided ({0}). The valid kinds are:\\n{1}`,\n    external_symbol_link_mappings_must_be_object:\n        \"externalSymbolLinkMappings must be a Record<package name, Record<symbol name, link>>\",\n    highlight_theme_0_must_be_one_of_1: \"{0} must be one of the following: {1}\",\n    highlightLanguages_contains_invalid_languages_0:\n        \"highlightLanguages contains invalid languages: {0}, run typedoc --help for a list of supported languages\",\n    hostedBaseUrl_must_start_with_http: \"hostedBaseUrl must start with http:// or https://\",\n    useHostedBaseUrlForAbsoluteLinks_requires_hostedBaseUrl:\n        \"The useHostedBaseUrlForAbsoluteLinks option requires that hostedBaseUrl be set\",\n    favicon_must_have_one_of_the_following_extensions_0: \"Favicon must have one of the following extensions: {0}\",\n    option_0_must_be_an_object: \"The '{0}' option must be a non-array object\",\n    option_0_must_be_an_array_of_string: \"The '{0}' option must be set to an array of strings\",\n    option_0_must_be_an_array_of_string_or_functions: \"The '{0}' option must be set to an array of strings/functions\",\n    option_0_must_be_a_function: \"The '{0}' option must be a function\",\n    option_0_must_be_object_with_urls: `{0} must be an object with string labels as keys and URL values`,\n    visibility_filters_only_include_0: `visibilityFilters can only include the following non-@ keys: {0}`,\n    visibility_filters_must_be_booleans: `All values of visibilityFilters must be booleans`,\n    option_0_values_must_be_numbers: \"All values of {0} must be numbers\",\n    option_0_values_must_be_array_of_tags: \"{0} must be an array of valid tag names\",\n    option_0_specified_1_but_only_2_is_valid:\n        `{0} may only specify known values, and invalid values were provided ({1}). The valid options are:\\n{2}`,\n    option_outputs_must_be_array:\n        `\"outputs\" option must be an array of { name: string, path: string, options?: TypeDocOptions } values.`,\n    specified_output_0_has_not_been_defined: `Specified output \"{0}\" has not been defined.`,\n\n    // https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n    alert_note: \"Note\",\n    alert_tip: \"Tip\",\n    alert_important: \"Important\",\n    alert_warning: \"Warning\",\n    alert_caution: \"Caution\",\n\n    // ReflectionKind singular translations\n    kind_project: \"Project\",\n    kind_module: \"Module\",\n    kind_namespace: \"Namespace\",\n    kind_enum: \"Enumeration\",\n    kind_enum_member: \"Enumeration Member\",\n    kind_variable: \"Variable\",\n    kind_function: \"Function\",\n    kind_class: \"Class\",\n    kind_interface: \"Interface\",\n    kind_constructor: \"Constructor\",\n    kind_property: \"Property\",\n    kind_method: \"Method\",\n    kind_call_signature: \"Call Signature\",\n    kind_index_signature: \"Index Signature\",\n    kind_constructor_signature: \"Constructor Signature\",\n    kind_parameter: \"Parameter\",\n    kind_type_literal: \"Type Literal\",\n    kind_type_parameter: \"Type Parameter\",\n    kind_accessor: \"Accessor\",\n    kind_get_signature: \"Get Signature\",\n    kind_set_signature: \"Set Signature\",\n    kind_type_alias: \"Type Alias\",\n    kind_reference: \"Reference\",\n    kind_document: \"Document\",\n\n    // ReflectionKind plural translations\n    kind_plural_project: \"Projects\",\n    kind_plural_module: \"Modules\",\n    kind_plural_namespace: \"Namespaces\",\n    kind_plural_enum: \"Enumerations\",\n    kind_plural_enum_member: \"Enumeration Members\",\n    kind_plural_variable: \"Variables\",\n    kind_plural_function: \"Functions\",\n    kind_plural_class: \"Classes\",\n    kind_plural_interface: \"Interfaces\",\n    kind_plural_constructor: \"Constructors\",\n    kind_plural_property: \"Properties\",\n    kind_plural_method: \"Methods\",\n    kind_plural_call_signature: \"Call Signatures\",\n    kind_plural_index_signature: \"Index Signatures\",\n    kind_plural_constructor_signature: \"Constructor Signatures\",\n    kind_plural_parameter: \"Parameters\",\n    kind_plural_type_literal: \"Type Literals\",\n    kind_plural_type_parameter: \"Type Parameters\",\n    kind_plural_accessor: \"Accessors\",\n    kind_plural_get_signature: \"Get Signatures\",\n    kind_plural_set_signature: \"Set Signatures\",\n    kind_plural_type_alias: \"Type Aliases\",\n    kind_plural_reference: \"References\",\n    kind_plural_document: \"Documents\",\n\n    // ReflectionFlag translations\n    flag_private: \"Private\",\n    flag_protected: \"Protected\",\n    flag_public: \"Public\",\n    flag_static: \"Static\",\n    flag_external: \"External\",\n    flag_optional: \"Optional\",\n    flag_rest: \"Rest\",\n    flag_abstract: \"Abstract\",\n    flag_const: \"Const\",\n    flag_readonly: \"Readonly\",\n    flag_inherited: \"Inherited\",\n\n    // ==================================================================\n    // Strings that show up in the default theme\n    // ==================================================================\n    // Page headings/labels\n    theme_implements: \"Implements\",\n    theme_indexable: \"Indexable\",\n    theme_type_declaration: \"Type Declaration\",\n    theme_index: \"Index\",\n    theme_hierarchy: \"Hierarchy\",\n    theme_hierarchy_summary: \"Hierarchy Summary\",\n    theme_hierarchy_view_summary: \"View Summary\",\n    theme_implemented_by: \"Implemented by\",\n    theme_defined_in: \"Defined in\",\n    theme_implementation_of: \"Implementation of\",\n    theme_inherited_from: \"Inherited from\",\n    theme_overrides: \"Overrides\",\n    theme_returns: \"Returns\",\n    theme_generated_using_typedoc: \"Generated using TypeDoc\", // If this includes \"TypeDoc\", theme will insert a link at that location.\n    // Search\n    theme_preparing_search_index: \"Preparing search index...\",\n    // Left nav bar\n    theme_loading: \"Loading...\",\n    // Right nav bar\n    theme_settings: \"Settings\",\n    theme_member_visibility: \"Member Visibility\",\n    theme_theme: \"Theme\",\n    theme_os: \"OS\",\n    theme_light: \"Light\",\n    theme_dark: \"Dark\",\n    theme_on_this_page: \"On This Page\",\n\n    // aria-label\n    theme_search: \"Search\",\n    theme_menu: \"Menu\",\n    theme_permalink: \"Permalink\",\n    theme_folder: \"Folder\",\n\n    // Used by the frontend JS\n    // For the English translations only, these should also be added to\n    // src/lib/output/themes/default/assets/typedoc/Application.ts\n    // Also uses theme_folder and singular kinds\n    theme_copy: \"Copy\",\n    theme_copied: \"Copied!\",\n    theme_normally_hidden: \"This member is normally hidden due to your filter settings.\",\n    theme_hierarchy_expand: \"Expand\",\n    theme_hierarchy_collapse: \"Collapse\",\n    theme_search_index_not_available: \"The search index is not available\",\n    theme_search_no_results_found_for_0: \"No results found for {0}\",\n    theme_search_placeholder: \"Search the docs\",\n} as const;\n"
  },
  {
    "path": "src/lib/internationalization/locales/ja.cts",
    "content": "// Please DO NOT include machine generated translations here.\n// If adding a new key, leave it commented out for a native speaker\n// to update.\n\nimport localeUtils = require(\"../locale-utils.cjs\");\n\nexport = localeUtils.buildIncompleteTranslation({\n    loaded_multiple_times_0:\n        \"TypeDoc が複数回読み込まれました。これは通常、TypeDoc を独自にインストールしたプラグインによって発生します。読み込まれたパスは次のとおりです:\\n{0}\",\n    unsupported_ts_version_0:\n        \"サポートされていない TypeScript バージョンで実行されています。TypeDoc がクラッシュした場合は、これが原因です。TypeDoc は {0} をサポートしています。\",\n    no_compiler_options_set:\n        \"コンパイラオプションが設定されていません。これは、TypeDoc が tsconfig.json を見つけられなかったことを意味します。生成されたドキュメントはおそらく空になります。\",\n    loaded_plugin_0: \"プラグイン {0} が読み込まれました\",\n    solution_not_supported_in_watch_mode:\n        \"提供された tsconfig ファイルはソリューション スタイルの tsconfig のように見えますが、これはウォッチ モードではサポートされていません。\",\n    strategy_not_supported_in_watch_mode:\n        \"ウォッチモードの場合、entryPointStrategy は、resolve または expand のいずれかに設定する必要があります。\",\n    found_0_errors_and_1_warnings: \"{0} 件のエラーと {1} 件の警告が見つかりました\",\n    // output_0_could_not_be_generated\n    // output_0_generated_at_1\n    no_entry_points_for_packages:\n        \"パッケージ モードにエントリ ポイントが提供されていないため、ドキュメントを生成できません\",\n    failed_to_find_packages:\n        \"パッケージが見つかりませんでした。package.json を含むエントリ ポイントとして少なくとも 1 つのディレクトリを指定していることを確認してください。\",\n    nested_packages_unsupported_0:\n        \"{0} のプロジェクトでは entryPointStrategy がパッケージに設定されていますが、ネストされたパッケージはサポートされていません\",\n    previous_error_occurred_when_reading_options_for_0:\n        \"前のエラーは、{0} のパッケージのオプションを読み取り中に発生しました\",\n    converting_project_at_0: \"{0} のプロジェクトを変換しています\",\n    failed_to_convert_packages: \"1 つ以上のパッケージの変換に失敗しました。結果は結合されません。\",\n    merging_converted_projects: \"変換されたプロジェクトのマージ\",\n    no_entry_points_to_merge: \"マージするためのエントリポイントが提供されていません\",\n    entrypoint_did_not_match_files_0: \"エントリポイント グロブ {0} はどのファイルにも一致しませんでした\",\n    failed_to_parse_json_0: \"{0} のファイルを json として解析できませんでした\",\n    failed_to_read_0_when_processing_document_tag_in_1:\n        \"{1} のコメントの @document タグの処理中にファイル {0} の読み取りに失敗しました\",\n    failed_to_read_0_when_processing_project_document:\n        \"プロジェクト ドキュメントの追加時にファイル {0} の読み取りに失敗しました\",\n    failed_to_read_0_when_processing_document_child_in_1:\n        \"{1} 内のドキュメントの子を処理するときにファイル {0} の読み取りに失敗しました\",\n    frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values:\n        \"{0} の Frontmatter の子は、文字列の配列または文字列値を持つオブジェクトである必要があります。\",\n    converting_union_as_interface:\n        \"ユニオン型で@interfaceを使用すると、ユニオンのすべてのブランチに存在しないプロパティが破棄されます。TypeDocの出力はソースコードを正確に記述しない可能性があります。\",\n    converting_0_as_class_requires_value_declaration: \"{0} をクラスとして変換するには、非型値を表す宣言が必要です\",\n    converting_0_as_class_without_construct_signatures:\n        \"{0} はクラスとして変換されていますが、コンストラクト シグネチャがありません\",\n    comment_for_0_should_not_contain_block_or_modifier_tags:\n        \"{0} のコメントにはブロックタグや修飾タグを含めることはできません\",\n    symbol_0_has_multiple_declarations_with_comment:\n        \"{0} にはコメント付きの宣言が複数あります。任意のコメントが使用されます\",\n    comments_for_0_are_declared_at_1: \"{0} のコメントは次の場所で宣言されています:\\n{1}\",\n    multiple_type_parameters_on_template_tag_unsupported:\n        \"TypeDoc は、コメント付きの単一の @template タグで定義された複数の型パラメータをサポートしていません。\",\n    failed_to_find_jsdoc_tag_for_name_0:\n        \"コメントを解析した後、{0} の JSDoc タグが見つかりませんでした。バグレポートを提出してください。\",\n    // relative_path_0_is_not_a_file_and_will_not_be_copied_to_output\n    inline_inheritdoc_should_not_appear_in_block_tag_in_comment_at_0:\n        \"インライン @inheritDoc タグはブロック タグ内に出現しないでください。{0} のコメントでは処理されません。\",\n    at_most_one_remarks_tag_expected_in_comment_at_0:\n        \"コメントには最大 1 つの @remarks タグが必要です。{0} のコメントの最初のタグ以外はすべて無視されます。\",\n    at_most_one_returns_tag_expected_in_comment_at_0:\n        \"コメントには最大 1 つの @returns タグが必要です。{0} のコメントの最初のタグ以外はすべて無視されます。\",\n    at_most_one_inheritdoc_tag_expected_in_comment_at_0:\n        \"コメントには最大 1 つの @inheritDoc タグが必要です。{0} のコメントの最初のタグ以外はすべて無視されます。\",\n    content_in_summary_overwritten_by_inheritdoc_in_comment_at_0:\n        \"概要セクションの内容は、{0} のコメントの @inheritDoc タグによって上書きされます。\",\n    content_in_remarks_block_overwritten_by_inheritdoc_in_comment_at_0:\n        \"@remarks ブロックの内容は、{0} のコメントの @inheritDoc タグによって上書きされます。\",\n    example_tag_literal_name:\n        \"サンプルタグの最初の行はサンプル名として文字通り解釈され、テキストのみを含む必要があります。\",\n    inheritdoc_tag_properly_capitalized: \"@inheritDocタグは適切に大文字にする必要があります\",\n    treating_unrecognized_tag_0_as_modifier: \"認識されないタグ {0} を修飾タグとして処理します\",\n    unmatched_closing_brace: \"一致しない閉じ括弧\",\n    unescaped_open_brace_without_inline_tag: \"インラインタグのないエスケープされていない開き括弧が検出されました\",\n    unknown_block_tag_0: \"不明なブロック タグ {0} に遭遇しました\",\n    unknown_inline_tag_0: \"不明なインライン タグ {0} に遭遇しました\",\n    open_brace_within_inline_tag: \"インラインタグ内に開き括弧が見つかりました。これはおそらく間違いです\",\n    inline_tag_not_closed: \"インラインタグが閉じられていない\",\n    failed_to_resolve_link_to_0_in_comment_for_1: \"{1} のコメント内の「{0}」へのリンクを解決できませんでした\",\n    type_0_defined_in_1_is_referenced_by_2_but_not_included_in_docs:\n        \"{1} で定義されている {0} は {2} によって参照されていますが、ドキュメントには含まれていません。\",\n    reflection_0_kind_1_defined_in_2_does_not_have_any_documentation:\n        \"{2} で定義されている {0} ({1}) にはドキュメントがありません\",\n    invalid_intentionally_not_exported_symbols_0:\n        \"次のシンボルは意図的にエクスポートされないものとしてマークされていますが、ドキュメントで参照されていないか、エクスポートされています:\\n{0}\",\n    not_all_search_category_boosts_used_0:\n        \"searchCategoryBoosts で指定されたすべてのカテゴリがドキュメントで使用されているわけではありません。使用されていないカテゴリは次のとおりです:\\n{0}\",\n    not_all_search_group_boosts_used_0:\n        \"searchGroupBoosts で指定されたすべてのグループがドキュメントで使用されているわけではありません。使用されていないグループは次のとおりです:\\n{0}\",\n    comment_for_0_includes_categoryDescription_for_1_but_no_child_in_group:\n        \"{0} のコメントに「{1}」の @categoryDescription が含まれていますが、そのカテゴリに子が配置されていません\",\n    comment_for_0_includes_groupDescription_for_1_but_no_child_in_group:\n        '{0} のコメントに \"{1}\" の @groupDescription が含まれていますが、そのグループには子が配置されていません',\n    label_0_for_1_cannot_be_referenced:\n        '{1} のラベル \"{0}\" は宣言参照では参照できません。ラベルには A ～ Z、0 ～ 9、_ のみを含めることができ、数字で始まることはできません。',\n    failed_to_resolve_link_to_0_in_comment_for_1_may_have_meant_2:\n        `{1} のコメント内の \"{0}\" へのリンクを解決できません。\"{2}\" を意味していた可能性があります。`,\n    failed_to_resolve_link_to_0_in_readme_for_1: `{1} の README ファイル内の \"{0}\" へのリンクを解決できません。`,\n    failed_to_resolve_link_to_0_in_readme_for_1_may_have_meant_2:\n        `{1} の README ファイル内の \"{0}\" へのリンクを解決できません。\"{2}\" を意味していた可能性があります。`,\n    modifier_tag_0_is_mutually_exclusive_with_1_in_comment_for_2:\n        \"修飾子タグ {0} は、{2} のコメント内の {1} と相互に排他的です\",\n    signature_0_has_unused_param_with_name_1:\n        '署名 {0} には、名前が \"{1}\" の @param がありますが、使用されていません。',\n    declaration_reference_in_inheritdoc_for_0_not_fully_parsed:\n        \"{0} の @inheritDoc の宣言参照が完全に解析されていないため、正しく解決されない可能性があります\",\n    failed_to_find_0_to_inherit_comment_from_in_1: \"{1} のコメントからコメントを継承する「{0}」が見つかりませんでした\",\n    reflection_0_tried_to_copy_comment_from_1_but_source_had_no_comment:\n        \"{0} は @inheritDoc を使用して {1} からコメントをコピーしようとしましたが、ソースには関連付けられたコメントがありません\",\n    inheritdoc_circular_inheritance_chain_0: \"@inheritDoc は循環継承チェーンを指定します: {0}\",\n    provided_readme_at_0_could_not_be_read: \"指定された README パス、{0} は読み取れませんでした\",\n    defaulting_project_name:\n        \"--name オプションが指定されておらず、package.json が見つかりませんでした。プロジェクト名を「Documentation」にデフォルト設定します。\",\n    disable_git_set_but_not_source_link_template:\n        \"enableGit は設定されていますが、sourceLinkTemplate が設定されていないため、ソースリンクを生成できません。ソースの追跡を防止するには、sourceLinkTemplate または enableSources を設定します。\",\n    disable_git_set_and_git_revision_used:\n        \"enableGit が設定されており、sourceLinkTemplate に {gitRevision} が含まれていますが、リビジョンが提供されていないため、空の文字列に置き換えられます。\",\n    git_remote_0_not_valid: '提供された Git リモート \"{0}\" は無効です。ソース リンクは壊れます',\n    custom_css_file_0_does_not_exist: \"{0} のカスタム CSS ファイルは存在しません\",\n    unsupported_highlight_language_0_not_highlighted_in_comment_for_1:\n        \"サポートされていないハイライト言語 {0} は、{1} のコメントではハイライトされません。\",\n    unloaded_language_0_not_highlighted_in_comment_for_1:\n        \"言語 {0} のコード ブロックは、highlightLanguages オプションに含まれていないため、{1} のコメントでは強調表示されません。\",\n    yaml_frontmatter_not_an_object: \"YAML フロントマターはオブジェクトであると想定されます\",\n    could_not_write_0: \"{0} を書き込めませんでした\",\n    could_not_empty_output_directory_0: \"出力ディレクトリ {0} を空にできませんでした\",\n    could_not_create_output_directory_0: \"出力ディレクトリ {0} を作成できませんでした\",\n    theme_0_is_not_defined_available_are_1: \"テーマ '{0}' は定義されていません。使用可能なテーマは次のとおりです: {1}\",\n    // no_entry_points_provided:\n    unable_to_find_any_entry_points: \"エントリ ポイントが見つかりません。以前の警告を参照してください\",\n    watch_does_not_support_packages_mode:\n        \"ウォッチモードは「パッケージ」スタイルのエントリポイントをサポートしていません\",\n    watch_does_not_support_merge_mode: \"ウォッチモードでは「マージ」スタイルのエントリポイントはサポートされません\",\n    entry_point_0_not_in_program:\n        \"エントリ ポイント {0} は、tsconfig の 'files' または 'include' オプションによって参照されていません。\",\n    use_expand_or_glob_for_files_in_dir:\n        \"このディレクトリ内のファイルを含める場合は、--entryPointStrategyを設定して展開するか、globを指定します。\",\n    glob_0_did_not_match_any_files: \"グロブ {0} はどのファイルにも一致しませんでした\",\n    entry_point_0_did_not_match_any_files_after_exclude:\n        \"除外パターンを適用した後、グロブ {0} はどのファイルにも一致しませんでした\",\n    entry_point_0_did_not_exist: \"指定されたエントリ ポイント {0} は存在しません\",\n    entry_point_0_did_not_match_any_packages:\n        \"エントリ ポイント glob {0} は、package.json を含むディレクトリと一致しませんでした。\",\n    file_0_not_an_object: \"ファイル {0} はオブジェクトではありません\",\n    serialized_project_referenced_0_not_part_of_project:\n        \"シリアル化されたプロジェクトは、プロジェクトの一部ではないリフレクション {0} を参照しました\",\n    // saved_relative_path_0_resolved_from_1_does_not_exist\n    circular_reference_extends_0: '{0} の \"extends\" フィールドで循環参照が検出されました',\n    failed_resolve_0_to_file_in_1: \"{0} を {1} 内のファイルに解決できませんでした\",\n    option_0_can_only_be_specified_by_config_file: \"'{0}' オプションは設定ファイル経由でのみ指定できます\",\n    option_0_expected_a_value_but_none_provided:\n        \"--{0} には値が期待されていましたが、引数として値が与えられませんでした\",\n    unknown_option_0_may_have_meant_1: \"不明なオプション: {0}。次のオプションを意味している可能性があります:\\n{1}\",\n    typedoc_key_in_0_ignored:\n        \"{0} の 'typedoc' キーは、レガシー パッケージの entryPointStrategy によって使用されており、無視されます。\",\n    typedoc_options_must_be_object_in_0:\n        '{0} の \"typedocOptions\" フィールドを解析できませんでした。フィールドが存在し、オブジェクトが含まれていることを確認してください。',\n    tsconfig_file_0_does_not_exist: \"tsconfig ファイル {0} が存在しません\",\n    tsconfig_file_specifies_options_file:\n        \"tsconfig ファイルの「typedocOptions」は、読み取るオプション ファイルを指定していますが、オプション ファイルは既に読み取られています。これは、設定ミスである可能性があります。\",\n    tsconfig_file_specifies_tsconfig_file:\n        'tsconfig ファイルの \"typedocOptions\" で、読み取る tsconfig ファイルを指定していない可能性があります。',\n    tags_0_defined_in_typedoc_json_overwritten_by_tsdoc_json:\n        \"typedoc.json で定義された {0} は、tsdoc.json の設定によって上書きされます。\",\n    failed_read_tsdoc_json_0: \"{0} の tsdoc.json ファイルの読み取りに失敗しました\",\n    invalid_tsdoc_json_0: \"ファイル {0} は有効な tsdoc.json ファイルではありません\",\n    options_file_0_does_not_exist: \"オプションファイル {0} が存在しません\",\n    failed_read_options_file_0:\n        \"{0} の解析に失敗しました。存在し、オブジェクトをエクスポートしていることを確認してください\",\n    invalid_plugin_0_missing_load_function: \"プラグイン {0} の構造が無効です。ロード関数が見つかりません\",\n    plugin_0_could_not_be_loaded: \"プラグイン {0} を読み込めませんでした\",\n    help_options:\n        \"読み込むべき json オプション ファイルを指定します。指定しない場合、TypeDoc は現在のディレクトリで 'typedoc.json' を検索します。\",\n    help_tsconfig:\n        \"読み込む TypeScript 設定ファイルを指定します。指定しない場合、TypeDoc は現在のディレクトリで 'tsconfig.json' を検索します。\",\n    help_compilerOptions: \"TypeDoc で使用される TypeScript コンパイラ オプションを選択的にオーバーライドします。\",\n    help_lang: \"生成時およびTypeDocのメッセージで使用する言語を設定します\",\n    help_locales:\n        \"指定されたロケールの翻訳を追加します。このオプションは、TypeDoc に公式のロケール サポートが追加されるまでの暫定的な手段として主に使用されます。\",\n    help_packageOptions:\n        \"entryPointStrategy がパッケージに設定されている場合に各パッケージ内で設定されるオプションを設定します。\",\n    help_entryPoints: \"ドキュメントのエントリポイント\",\n    help_entryPointStrategy: \"エントリポイントをドキュメントモジュールに変換するために使用する戦略\",\n    help_alwaysCreateEntryPointModule:\n        \"設定すると、TypeDoc はエントリ ポイントに `Module` を常に作成します (1 つしか提供されていない場合でも)。\",\n    help_projectDocuments:\n        \"生成されたドキュメントのルートに子として追加されるドキュメント。複数のファイルに一致する glob をサポートします。\",\n    help_exclude: \"エントリポイントとして指定されたディレクトリを展開するときに除外するパターンを定義します\",\n    help_externalPattern: \"外部ファイルとみなすべきファイルのパターンを定義する\",\n    help_excludeExternals: \"外部で解決されたシンボルが文書化されないようにする\",\n    help_excludeNotDocumented: \"明示的に文書化されていないシンボルが結果に表示されないようにする\",\n    help_excludeNotDocumentedKinds: \"excludeNotDocumented によって削除できる反射の種類を指定します\",\n    help_excludeInternal: \"@internal でマークされたシンボルがドキュメント化されないようにする\",\n    help_excludeCategories: \"このカテゴリ内のシンボルをドキュメントから除外する\",\n    help_excludeProtected: \"保護された変数とメソッドを無視する\",\n    help_excludeReferences: \"シンボルが複数回エクスポートされた場合、最初のエクスポート以外はすべて無視されます。\",\n    help_externalSymbolLinkMappings: \"ドキュメントに含まれていないシンボルのカスタムリンクを定義する\",\n    // help_out\n    // help_html\n    help_json: \"プロジェクトを説明するJSONファイルが書き込まれる場所とファイル名を指定します\",\n    help_pretty: \"出力JSONをタブでフォーマットするかどうかを指定します\",\n    help_emit: \"TypeDoc が発行する内容を指定します (「docs」、「both」、または「none」)\",\n    help_theme: \"ドキュメントをレンダリングするテーマ名を指定します\",\n    help_lightHighlightTheme: \"ライトモードでコード強調テーマを指定する\",\n    help_darkHighlightTheme: \"ダークモードでのコード強調テーマを指定する\",\n    help_highlightLanguages: \"レンダリング時にコードを強調表示するために読み込まれる言語を指定します\",\n    help_customCss: \"テーマをインポートするためのカスタム CSS ファイルへのパス\",\n    help_markdownItOptions: \"TypeDocが使用するMarkdownパーサーであるmarkdown-itに渡されるオプションを指定します。\",\n    help_markdownItLoader:\n        \"markdown-itインスタンスをロードするときに呼び出されるコールバックを指定します。TypeDocが使用するパーサーのインスタンスが渡されます。\",\n    help_maxTypeConversionDepth: \"変換する型の最大深度を設定する\",\n    help_name: \"テンプレートのヘッダーで使用されるプロジェクト名を設定します\",\n    help_includeVersion: \"プロジェクト名にパッケージバージョンを追加する\",\n    help_disableSources: \"反射を文書化するときに反射のソースの設定を無効にする\",\n    help_sourceLinkTemplate:\n        \"ソース URL を生成するときに使用するリンク テンプレートを指定します。設定されていない場合は、git リモートを使用して自動的に作成されます。{path}、{line}、{gitRevision} プレースホルダーをサポートします。\",\n    help_gitRevision:\n        \"GitHub/Bitbucket ソースファイルへのリンクに、最後のリビジョンではなく指定されたリビジョンを使用します。disableSources が設定されている場合は効果がありません。\",\n    help_gitRemote:\n        \"GitHub/Bitbucket ソースファイルへのリンクに指定されたリモートを使用します。disableGit またはdisableSources が設定されている場合は効果がありません。\",\n    help_disableGit:\n        \"すべてが sourceLinkTemplate でリンクできると仮定します。これが有効な場合は、sourceLinkTemplate を設定する必要があります。{path} は basePath をルートとします。\",\n    help_basePath: \"ファイルパスを表示するときに使用するベースパスを指定します\",\n    help_excludeTags: \"ドキュメントコメントからリストされたブロック/修飾子タグを削除します\",\n    // help_notRenderedTags\n    help_readme:\n        \"インデックス ページに表示される Readme ファイルへのパス。インデックス ページを無効にしてグローバル ページでドキュメントを開始するには、`none` を渡します。\",\n    help_cname: \"CNAMEファイルのテキストを設定します。これはGitHub Pagesのカスタムドメインに便利です。\",\n    help_sourceLinkExternal: \"ソースリンクを外部リンクとして扱い、新しいタブで開くように指定します。\",\n    help_githubPages:\n        \"GitHub Pages で 404 エラーを防ぐために .nojekyll ファイルを生成します。デフォルトは `true` です。\",\n    help_hostedBaseUrl:\n        \"出力フォルダ内の sitemap.xml と正規リンクを生成する際に使用するベース URL を指定します。指定しない場合は、サイトマップは生成されません。\",\n    help_useHostedBaseUrlForAbsoluteLinks:\n        \"設定されている場合、TypeDocはhostedBaseUrlオプションを使用してサイト上のページへの絶対リンクを生成します。\",\n    help_hideGenerator: \"ページの最後にある TypeDoc リンクを印刷しないでください\",\n    help_customFooterHtml: \"TypeDoc リンクの後のカスタム フッター\",\n    help_customFooterHtmlDisableWrapper: \"設定されている場合、customFooterHtml のラッパー要素が無効になります。\",\n    // help_hideTypesInSignatureTitle\n    help_cacheBust: \"静的アセットへのリンクに生成時間を含める\",\n    help_searchInComments:\n        \"設定すると、検索インデックスにコメントも含まれます。これにより、検索インデックスのサイズが大幅に増加します。\",\n    help_searchInDocuments:\n        \"設定すると、検索インデックスにドキュメントも含まれます。これにより、検索インデックスのサイズが大幅に増加します。\",\n    help_cleanOutputDir: \"設定されている場合、TypeDocは出力を書き込む前に出力ディレクトリを削除します。\",\n    help_titleLink: \"ヘッダーのタイトルが指すリンクを設定します。デフォルトはドキュメントのホームページです。\",\n    help_navigationLinks: \"ヘッダーに含めるリンクを定義します\",\n    help_sidebarLinks: \"サイドバーに含めるリンクを定義します\",\n    help_navigationLeaves: \"展開すべきでないナビゲーションツリーのブランチ\",\n    help_navigation: \"ナビゲーションサイドバーの構成方法を決定します\",\n    help_visibilityFilters: \"修飾タグに応じて組み込みフィルターと追加フィルターのデフォルトの表示を指定します\",\n    help_searchCategoryBoosts: \"選択したカテゴリの関連性を高めるために検索を設定する\",\n    help_searchGroupBoosts: \"選択した種類（例：「クラス」）の関連性を高めるように検索を設定します\",\n    help_jsDocCompatibility: \"JSDocコメントとの類似性を高めるコメント解析の互換性オプションを設定します\",\n    help_commentStyle: \"TypeDoc がコメントを検索する方法を決定します\",\n    help_useTsLinkResolution:\n        \"@linkタグが指す場所を決定する際にTypeScriptのリンク解決を使用します。これはJSDocスタイルのコメントにのみ適用されます。\",\n    help_preserveLinkText:\n        \"設定されている場合、リンクテキストのない@linkタグはテキストコンテンツをリンクとして使用します。設定されていない場合は、ターゲットリフレクション名を使用します。\",\n    help_blockTags: \"コメントを解析するときに TypeDoc が認識するブロックタグ\",\n    help_inlineTags: \"TypeDoc がコメントを解析する際に認識するインラインタグ\",\n    help_modifierTags: \"TypeDoc がコメントを解析する際に認識する修飾タグ\",\n    help_categorizeByGroup: \"グループレベルで分類を行うかどうかを指定します\",\n    help_defaultCategory: \"カテゴリのない反射のデフォルトカテゴリを指定します\",\n    help_categoryOrder: \"カテゴリの表示順序を指定します。* はリストにないカテゴリの相対順序を示します。\",\n    help_groupOrder: \"グループの表示順序を指定します。* はリストにないグループの相対順序を示します。\",\n    help_sort: \"文書化された値のソート戦略を指定する\",\n    help_sortEntryPoints: \"設定されている場合、エントリポイントは他のリフレクションと同じソートルールに従います。\",\n    help_kindSortOrder: \"「kind」が指定されている場合、反射のソート順を指定します\",\n    help_watch: \"ファイルの変更を監視し、変更があった場合はドキュメントを再構築する\",\n    help_preserveWatchOutput: \"設定されている場合、TypeDoc はコンパイル実行間で画面をクリアしません。\",\n    help_skipErrorChecking: \"ドキュメントを生成する前にTypeScriptの型チェックを実行しない\",\n    help_help: \"このメッセージを印刷する\",\n    help_version: \"TypeDocのバージョンを印刷\",\n    help_showConfig: \"解決された構成を印刷して終了する\",\n    help_plugin:\n        \"ロードするnpmプラグインを指定します。省略すると、インストールされているすべてのプラグインがロードされます。\",\n    help_logLevel: \"使用するログレベルを指定する\",\n    help_treatWarningsAsErrors: \"設定すると、すべての警告がエラーとして扱われます\",\n    help_treatValidationWarningsAsErrors:\n        \"設定すると、検証中に発行された警告はエラーとして扱われます。このオプションは、検証警告の treatWarningsAsErrors を無効にするために使用することはできません。\",\n    help_intentionallyNotExported: \"「参照されているが文書化されていない」という警告を生成しないタイプのリスト\",\n    help_requiredToBeDocumented: \"文書化する必要がある反射の種類のリスト\",\n    help_validation: \"生成されたドキュメントに対して TypeDoc が実行する検証手順を指定します。\",\n    unknown_option_0_you_may_have_meant_1: \"不明なオプション '{0}' 次のオプションを意味している可能性があります:\\n{1}\",\n    option_0_must_be_between_1_and_2: \"{0} は {1} と {2} の間でなければなりません\",\n    option_0_must_be_equal_to_or_greater_than_1: \"{0} は {1} 以上である必要があります\",\n    option_0_must_be_less_than_or_equal_to_1: \"{0} は {1} 以下である必要があります\",\n    option_0_must_be_one_of_1: \"{0} は {1} のいずれかである必要があります\",\n    flag_0_is_not_valid_for_1_expected_2:\n        \"フラグ '{0}' は {1} に対して有効ではありません。{2} のいずれかである必要があります。\",\n    expected_object_with_flag_values_for_0: \"{0} または true/false のフラグ値を持つオブジェクトが必要です\",\n    flag_values_for_0_must_be_booleans: \"{0} のフラグ値はブール値である必要があります\",\n    locales_must_be_an_object:\n        \"'locales' オプションは、次のようなオブジェクトに設定する必要があります: { en: { theme_implements: \\\"Implements\\\" }}\",\n    exclude_not_documented_specified_0_valid_values_are_1:\n        \"excludeNotDocumentedKinds は既知の値のみを指定できますが、無効な値が指定されました ({0})。有効な種類は次のとおりです:\\n{1}\",\n    external_symbol_link_mappings_must_be_object:\n        \"externalSymbolLinkMappings は、Record<パッケージ名、Record<シンボル名、リンク>> である必要があります。\",\n    highlight_theme_0_must_be_one_of_1: \"{0} は次のいずれかである必要があります: {1}\",\n    highlightLanguages_contains_invalid_languages_0:\n        \"highlightLanguages に無効な言語が含まれています: {0}。サポートされている言語のリストについては typedoc --help を実行してください\",\n    hostedBaseUrl_must_start_with_http: \"hostedBaseUrl は http:// または https:// で始まる必要があります\",\n    useHostedBaseUrlForAbsoluteLinks_requires_hostedBaseUrl:\n        \"useHostedBaseUrlForAbsoluteLinksオプションではhostedBaseUrlを設定する必要があります\",\n    option_0_must_be_an_object: \"'{0}' オプションは配列以外のオブジェクトである必要があります\",\n    option_0_must_be_a_function: \"'{0}' オプションは関数である必要があります\",\n    option_0_must_be_object_with_urls:\n        \"{0} は、キーとして文字列ラベル、URL 値として文字列ラベルを持つオブジェクトである必要があります。\",\n    visibility_filters_only_include_0: \"visibilityFilters には、次の非 @ キーのみを含めることができます: {0}\",\n    visibility_filters_must_be_booleans: \"visibilityFilters のすべての値はブール値である必要があります\",\n    option_0_values_must_be_numbers: \"{0} のすべての値は数値である必要があります\",\n    option_0_values_must_be_array_of_tags: \"{0} は有効なタグ名の配列である必要があります\",\n    option_0_specified_1_but_only_2_is_valid:\n        \"{0} は既知の値のみを指定できますが、無効な値が指定されました ({1})。有効な並べ替え戦略は次のとおりです:\\n{2}\",\n    kind_project: \"プロジェクト\",\n    kind_module: \"モジュール\",\n    kind_namespace: \"名前空間\",\n    kind_enum: \"列挙\",\n    kind_enum_member: \"列挙メンバー\",\n    kind_variable: \"変数\",\n    kind_function: \"関数\",\n    kind_class: \"クラス\",\n    kind_interface: \"インターフェイス\",\n    kind_constructor: \"コンストラクター\",\n    kind_property: \"プロパティ\",\n    kind_method: \"メソッド\",\n    kind_call_signature: \"コールシグネチャ\",\n    kind_index_signature: \"インデックスシグネチャ\",\n    kind_constructor_signature: \"コンストラクターシグネチャ\",\n    kind_parameter: \"パラメーター\",\n    kind_type_literal: \"型リテラル\",\n    kind_type_parameter: \"型パラメーター\",\n    kind_accessor: \"アクセッサー\",\n    kind_get_signature: \"署名を取得する\",\n    kind_set_signature: \"署名を設定する\",\n    kind_type_alias: \"型エイリアス\",\n    kind_reference: \"リファレンス\",\n    kind_document: \"ドキュメント\",\n    kind_plural_project: \"プロジェクト\",\n    kind_plural_module: \"モジュール\",\n    kind_plural_namespace: \"名前空間\",\n    kind_plural_enum: \"列挙\",\n    kind_plural_enum_member: \"列挙メンバー\",\n    kind_plural_variable: \"変数\",\n    kind_plural_function: \"関数\",\n    kind_plural_class: \"クラス\",\n    kind_plural_interface: \"インターフェイス\",\n    kind_plural_constructor: \"コンストラクター\",\n    kind_plural_property: \"プロパティ\",\n    kind_plural_method: \"メソッド\",\n    kind_plural_call_signature: \"コールシグネチャ\",\n    kind_plural_index_signature: \"インデックスシグネチャ\",\n    kind_plural_constructor_signature: \"コンストラクターシグネチャ\",\n    kind_plural_parameter: \"パラメータ\",\n    kind_plural_type_literal: \"型リテラル\",\n    kind_plural_type_parameter: \"型パラメーター\",\n    kind_plural_accessor: \"アクセッサー\",\n    kind_plural_get_signature: \"署名を取得する\",\n    kind_plural_set_signature: \"署名を設定する\",\n    kind_plural_type_alias: \"型エイリアス\",\n    kind_plural_reference: \"リファレンス\",\n    kind_plural_document: \"ドキュメント\",\n    flag_protected: \"保護\",\n    flag_private: \"非公開\",\n    flag_external: \"外部\",\n    flag_inherited: \"継承\",\n    flag_public: \"公開\",\n    flag_static: \"静的\",\n    flag_optional: \"オプション\",\n    flag_rest: \"REST パラメータ\",\n    flag_abstract: \"抽象\",\n    flag_const: \"定数\",\n    flag_readonly: \"読み取り専用\",\n    theme_implements: \"実装\",\n    theme_indexable: \"インデックス可能\",\n    theme_type_declaration: \"型宣言\",\n    theme_index: \"インデックス\",\n    theme_hierarchy: \"階層\",\n    theme_implemented_by: \"実装者\",\n    theme_defined_in: \"定義\",\n    theme_implementation_of: \"の実装\",\n    theme_inherited_from: \"継承元\",\n    theme_overrides: \"上書き\",\n    theme_returns: \"戻り値\",\n    theme_generated_using_typedoc: \"TypeDocを使用して生成\",\n    theme_preparing_search_index: \"検索インデックスを準備しています...\",\n    theme_search_index_not_available: \"検索インデックスは利用できません\",\n    theme_settings: \"テーマ設定\",\n    theme_member_visibility: \"メンバーの可視性\",\n    theme_theme: \"配色\",\n    theme_os: \"自動\",\n    theme_light: \"ライト\",\n    theme_dark: \"ダーク\",\n    theme_on_this_page: \"このページ\",\n    theme_search: \"検索\",\n    theme_menu: \"メニュー\",\n    theme_permalink: \"パーマリンク\",\n    tag_see: \"参照\",\n    tag_group: \"所属グループ\",\n    tag_example: \"例\",\n    theme_copy: \"コピー\",\n    theme_copied: \"コピー完了！\",\n    theme_normally_hidden: \"このメンバーは、フィルター設定のため、通常は非表示になっています。\",\n    theme_loading: \"読み込み中...\",\n});\n"
  },
  {
    "path": "src/lib/internationalization/locales/ko.cts",
    "content": "// Please DO NOT include machine generated translations here.\n// If adding a new key, leave it commented out for a native speaker\n// to update.\n\nimport localeUtils = require(\"../locale-utils.cjs\");\n\nexport = localeUtils.buildIncompleteTranslation({\n    // output_0_could_not_be_generated\n    // output_0_generated_at_1\n\n    no_entry_points_for_packages: \"패키지 모드에 대한 진입점이 제공되지 않았으므로 문서를 생성할 수 없습니다\",\n    failed_to_find_packages:\n        \"패키지를 찾지 못했습니다. 적어도 하나의 디렉터리를 package.json을 포함하는 진입점으로 제공했는지 확인하세요\",\n    nested_packages_unsupported_0: \"{0} 프로젝트의 entryPointStrategy가 패키지인데 중첩된 패키지는 지원되지 않습니다\",\n    previous_error_occurred_when_reading_options_for_0: \"{0} 위치의 패키지 옵션을 읽는 중에 이전 오류가 발생했습니다\",\n    converting_project_at_0: \"{0} 위치의 프로젝트 변환 중\",\n    failed_to_convert_packages: \"하나 이상의 패키지를 변환하지 못했습니다. 결과가 병합되지 않을 것입니다\",\n    merging_converted_projects: \"변환된 프로젝트 병합 중\",\n\n    no_entry_points_to_merge: \"병합할 진입점이 제공되지 않았습니다\",\n    entrypoint_did_not_match_files_0: \"진입점 글로브 {0}이(가) 어떤 파일과도 일치하지 않았습니다\",\n    frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values:\n        \"{0}의 Frontmatter children은 문자열 배열이나 문자열 값을 갖는 객체여야 합니다\",\n\n    inline_inheritdoc_should_not_appear_in_block_tag_in_comment_at_0:\n        \"{0} 위치의 주석에서 인라인 @inheritDoc 태그는 블록 태그 안에 나타나서는 안 됩니다\",\n    at_most_one_remarks_tag_expected_in_comment_at_0: \"주석에서 @remarks 태그는 최대 하나만 예상됩니다. {0}\",\n    at_most_one_returns_tag_expected_in_comment_at_0: \"주석에서 @returns 태그는 최대 하나만 예상됩니다. {0}\",\n    at_most_one_inheritdoc_tag_expected_in_comment_at_0: \"주석에서 @inheritDoc 태그는 최대 하나만 예상됩니다. {0}\",\n    content_in_summary_overwritten_by_inheritdoc_in_comment_at_0:\n        \"주석에서 요약 부분의 내용이 @inheritDoc 태그에 의해 덮어쓰여집니다. {0}\",\n    content_in_remarks_block_overwritten_by_inheritdoc_in_comment_at_0:\n        \"주석에서 @remarks 블록의 내용이 @inheritDoc 태그에 의해 덮어쓰여집니다. {0}\",\n    example_tag_literal_name: \"예제 태그의 첫 번째 줄은 예제 이름으로 사용됩니다. 텍스트만 포함해야 합니다\",\n    inheritdoc_tag_properly_capitalized: \"@inheritDoc 태그는 올바르게 대문자화되어야 합니다\",\n    invalid_intentionally_not_exported_symbols_0:\n        \"다음 심볼은 의도적으로 내보내지 않았지만 문서화에서 참조되지 않았거나 내보내졌습니다:\\n\\t{0}\",\n    defaulting_project_name:\n        '--name 옵션이 지정되지 않았고 package.json도 발견되지 않았습니다. 프로젝트 이름을 \"Documentation\"으로 기본 설정합니다',\n    // no_entry_points_provided:\n    unable_to_find_any_entry_points: \"어떤 진입점도 찾을 수 없습니다. 이전 경고를 확인하세요\",\n    watch_does_not_support_packages_mode: \"워치 모드는 'packages' 스타일 진입점을 지원하지 않습니다\",\n    watch_does_not_support_merge_mode: \"워치 모드는 'merge' 스타일 진입점을 지원하지 않습니다\",\n    help_options:\n        \"로드할 JSON 옵션 파일을 지정합니다. 지정하지 않으면 TypeDoc은 현재 디렉터리의 'typedoc.json'을 찾습니다\",\n    help_tsconfig:\n        \"로드할 TypeScript 구성 파일을 지정합니다. 지정하지 않으면 TypeDoc은 현재 디렉터리의 'tsconfig.json'을 찾습니다\",\n    help_compilerOptions: \"TypeDoc이 사용할 TypeScript 컴파일러 옵션을 선택적으로 재정의합니다\",\n    help_lang: \"생성 및 TypeDoc 메시지에 사용할 언어를 설정합니다\",\n    help_locales:\n        \"특정 로케일에 대한 번역을 추가합니다. 이 옵션은 주로 TypeDoc에서 공식 로케일 지원이 추가될 때까지 임시 방편으로 사용됩니다\",\n    help_packageOptions: \"entryPointStrategy가 패키지로 설정된 경우 각 패키지에 설정될 옵션을 설정합니다\",\n\n    help_entryPoints: \"문서화할 진입점입니다\",\n    help_entryPointStrategy: \"진입점을 문서 모듈로 변환하는 데 사용할 전략입니다\",\n    help_alwaysCreateEntryPointModule: \"설정 시 TypeDoc은 하나의 진입점만 제공되더라도 항상 'Module'을 생성합니다\",\n    help_projectDocuments: \"생성된 문서의 루트에 추가될 문서입니다. 복수 파일을 매치하기 위한 글로브를 지원합니다\",\n    help_exclude: \"진입점으로 지정된 디렉터리 확장 시 제외할 패턴을 정의합니다\",\n    help_externalPattern: \"외부로 간주될 파일 패턴을 정의합니다\",\n    help_excludeExternals: \"외부로 해결된 심볼이 문서화되지 않도록 방지합니다\",\n    help_excludeNotDocumented: \"명시적으로 문서화되지 않은 심볼이 결과에 표시되지 않도록 방지합니다\",\n    help_excludeNotDocumentedKinds: \"excludeNotDocumented로 제거될 리플렉션 유형을 지정합니다\",\n    help_excludeInternal: \"@internal로 표시된 심볼이 문서화되지 않도록 방지합니다\",\n    help_excludeCategories: \"문서에서 제외할 카테고리 내의 심볼을 제외합니다\",\n    help_excludeProtected: \"보호된 변수와 메서드를 무시합니다\",\n    help_excludeReferences: \"심볼이 여러 번 내보내진 경우 첫 번째 내보내기를 제외하고 모두 무시합니다\",\n    help_externalSymbolLinkMappings: \"문서에 포함되지 않은 심볼에 대한 사용자 정의 링크를 정의합니다\",\n    // help_out\n    // help_html\n    help_json: \"프로젝트를 설명하는 JSON 파일의 위치와 파일 이름을 지정합니다\",\n    help_pretty: \"출력 JSON을 탭으로 포맷팅할 지 여부를 지정합니다\",\n    help_emit: \"TypeDoc이 생성할 내용을 지정합니다. 'docs', 'both', 'none' 중 하나를 선택합니다\",\n    help_theme: \"문서를 렌더링할 테마 이름을 지정합니다\",\n    help_lightHighlightTheme: \"라이트 모드에서 코드 하이라이팅 테마를 지정합니다\",\n    help_darkHighlightTheme: \"다크 모드에서 코드 하이라이팅 테마를 지정합니다\",\n    help_highlightLanguages: \"렌더링 시 코드 하이라이팅에 사용될 언어를 지정합니다\",\n    help_customCss: \"테마에서 가져올 사용자 지정 CSS 파일의 경로\",\n    help_markdownItOptions: \"TypeDoc이 사용하는 markdown-it에 전달할 옵션을 지정합니다\",\n    help_markdownItLoader:\n        \"markdown-it 인스턴스를 로드할 때 호출될 콜백을 지정합니다. TypeDoc이 사용할 파서 인스턴스를 전달받습니다\",\n    help_maxTypeConversionDepth: \"변환될 타입의 최대 깊이를 설정합니다\",\n    help_name: \"템플릿 헤더에 사용할 프로젝트 이름을 설정합니다\",\n    help_includeVersion: \"프로젝트 이름에 패키지 버전을 추가합니다\",\n    help_disableSources: \"문서화할 때 리플렉션의 소스 설정을 비활성화합니다\",\n    help_sourceLinkTemplate:\n        \"소스 URL 생성 시 사용할 링크 템플릿을 지정합니다. 설정하지 않으면 자동으로 git 원격 저장소에서 생성됩니다. {path}, {line}, {gitRevision} 플레이스홀더를 지원합니다\",\n    help_gitRevision:\n        \"GitHub/Bitbucket 소스 파일에 대한 링크를 생성할 때 사용할 특정 리비전을 지정합니다. disableSources가 설정된 경우에만 유효합니다\",\n    help_gitRemote:\n        \"GitHub/Bitbucket 소스 파일에 대한 링크를 생성할 때 사용할 특정 원격 저장소를 지정합니다. disableGit 또는 disableSources가 설정된 경우에만 유효합니다\",\n    help_disableGit:\n        \"모든 것을 sourceLinkTemplate로 링크할 수 있도록 가정합니다. 이 옵션을 사용하려면 sourceLinkTemplate이 설정되어 있어야 합니다. {path}는 basePath에서 시작됩니다\",\n    help_basePath: \"파일 경로를 표시할 때 사용할 기본 경로를 지정합니다\",\n    help_excludeTags: \"문서 주석에서 제거할 블록/수정자 태그를 지정합니다\",\n    // help_notRenderedTags\n    help_readme:\n        \"인덱스 페이지에 표시할 readme 파일의 경로를 지정합니다. 'none'을 전달하여 인덱스 페이지를 비활성화하고 글로벌 페이지에서 문서화를 시작합니다\",\n    help_cname: \"GitHub Pages의 사용자 정의 도메인에 유용한 CNAME 파일 텍스트를 설정합니다\",\n    help_sourceLinkExternal: \"소스 링크를 외부 링크로 취급하여 새 탭에서 열도록 지정합니다\",\n    help_githubPages: \"GitHub Pages에서 404 오류를 방지하기 위해 .nojekyll 파일을 생성합니다. 기본값은 `true`입니다\",\n    help_hostedBaseUrl:\n        \"생성된 sitemap.xml 및 출력 폴더에서 사용할 베이스 URL을 지정합니다. 지정하지 않으면 sitemap이 생성되지 않습니다\",\n    help_useHostedBaseUrlForAbsoluteLinks:\n        \"사이트의 페이지에 대해 hostedBaseUrl 옵션을 사용하여 절대 링크를 생성하도록 지정합니다\",\n    help_hideGenerator: \"페이지 끝에 TypeDoc 링크를 출력하지 않습니다\",\n    help_customFooterHtml: \"TypeDoc 링크 뒤에 사용자 정의 푸터를 지정합니다\",\n    help_customFooterHtmlDisableWrapper: \"customFooterHtml의 래퍼 요소를 비활성화합니다\",\n    // help_hideTypesInSignatureTitle\n    help_cacheBust: \"정적 자산의 링크에 생성 시간을 포함합니다\",\n    help_searchInComments: \"검색 인덱스에 주석도 포함합니다. 이 옵션을 사용하면 검색 인덱스의 크기가 크게 증가합니다\",\n    help_searchInDocuments: \"검색 인덱스에 문서도 포함합니다. 이 옵션을 사용하면 검색 인덱스의 크기가 크게 증가합니다\",\n    help_cleanOutputDir: \"출력 디렉터리를 작성하기 전에 TypeDoc이 제거하도록 지정합니다\",\n    help_titleLink: \"헤더의 제목이 가리키는 링크를 설정합니다. 기본값은 문서 홈페이지입니다\",\n    help_navigationLinks: \"헤더에 포함될 링크를 정의합니다\",\n    help_sidebarLinks: \"사이드바에 포함될 링크를 정의합니다\",\n    help_navigationLeaves: \"확장되지 않아야 할 네비게이션 트리의 가지를 정의합니다\",\n    help_navigation: \"네비게이션 사이드바의 구성 방식을 결정합니다\",\n    help_visibilityFilters: \"기본 내장 필터 및 수정자 태그에 대한 기본 가시성을 지정합니다\",\n    help_searchCategoryBoosts: \"선택한 카테고리에 대해 검색에서 중요도 부스트를 구성합니다\",\n    help_searchGroupBoosts: \"선택한 종류(예: '클래스')에 대해 검색에서 중요도 부스트를 구성합니다\",\n    help_jsDocCompatibility: \"JSDoc 주석과 유사성을 높이기 위한 주석 파싱의 호환성 옵션을 설정합니다\",\n    help_commentStyle: \"TypeDoc이 주석을 검색하는 방식을 결정합니다\",\n    help_useTsLinkResolution:\n        \"TypeScript 링크 해결을 사용하여 @link 태그가 가리키는 위치를 결정합니다. 이 옵션은 JSDoc 스타일 주석에만 적용됩니다\",\n    help_preserveLinkText:\n        \"링크 텍스트가 없는 @link 태그는 텍스트 내용을 링크로 사용합니다. 설정되지 않으면 대상 리플렉션 이름을 사용합니다\",\n    help_blockTags: \"TypeDoc이 주석을 파싱할 때 인식할 블록 태그를 지정합니다\",\n    help_inlineTags: \"TypeDoc이 주석을 파싱할 때 인식할 인라인 태그를 지정합니다\",\n    help_modifierTags: \"TypeDoc이 주석을 파싱할 때 인식할 수정자 태그를 지정합니다\",\n    help_categorizeByGroup: \"카테고리화가 그룹 수준에서 수행될지 여부를 지정합니다\",\n    help_defaultCategory: \"카테고리가 지정되지 않은 리플렉션의 기본 카테고리를 지정합니다\",\n    help_categoryOrder: \"카테고리가 표시될 순서를 지정합니다. *은 리스트에 없는 카테고리의 상대적 순서를 나타냅니다\",\n    help_groupOrder: \"그룹이 표시될 순서를 지정합니다. *은 리스트에 없는 그룹의 상대적 순서를 나타냅니다\",\n    help_sort: \"문서화된 값에 대한 정렬 전략을 지정합니다\",\n    help_sortEntryPoints: \"진입점이 다른 리플렉션과 동일한 정렬 규칙을 따를지 여부를 지정합니다\",\n    help_kindSortOrder: \"'kind'가 지정된 경우 리플렉션의 정렬 순서를 지정합니다\",\n    help_watch: \"파일 변경을 감지하고 문서를 다시 빌드할지 여부를 지정합니다\",\n    help_preserveWatchOutput: \"TypeDoc이 컴파일 실행 간에 화면을 지우지 않도록 지정합니다\",\n    help_skipErrorChecking: \"TypeScript의 타입 체크를 실행하지 않고 문서를 생성하지 않도록 지정합니다\",\n    help_help: \"해당 메시지을 출력합니다\",\n\n    help_version: \"TypeDoc의 버전을 출력합니다\",\n    help_showConfig: \"해결된 구성을 출력하고 종료합니다\",\n    help_plugin: \"로드할 npm 플러그인을 지정합니다. 생략하면 설치된 모든 플러그인이 로드됩니다\",\n    help_logLevel: \"사용할 로깅 레벨을 지정합니다\",\n    help_treatWarningsAsErrors: \"모든 경고를 오류로 처리합니다\",\n    help_treatValidationWarningsAsErrors:\n        \"검증 중 경고를 오류로 처리합니다. 이 옵션은 검증 경고에 대해 treatWarningsAsErrors를 비활성화할 수 없습니다\",\n    help_intentionallyNotExported: \"'참조되었지만 문서화되지 않았음' 경고를 생성하지 않을 유형의 목록\",\n    help_requiredToBeDocumented: \"문서화해야 할 리플렉션 종류의 목록\",\n    help_validation: \"생성된 문서에 대해 TypeDoc이 수행할 검증 단계를 지정합니다\",\n    option_0_must_be_between_1_and_2: \"{0}은(는) {1}과(와) {2} 사이어야 합니다\",\n    option_0_must_be_equal_to_or_greater_than_1: \"{0}은(는) {1} 이상이어야 합니다\",\n    option_0_must_be_less_than_or_equal_to_1: \"{0}은(는) {1} 이하여야 합니다\",\n    option_0_must_be_one_of_1: \"{0}은(는) 다음 중 하나여야 합니다: {1}\",\n    flag_0_is_not_valid_for_1_expected_2: \"플래그 '{0}'은(는) {1}에 대해 유효하지 않습니다. {2} 중 하나가 예상됩니다\",\n    expected_object_with_flag_values_for_0:\n        \"{0}에 대해 플래그 값이 포함된 객체가 예상됩니다. true/false도 사용할 수 있습니다\",\n    flag_values_for_0_must_be_booleans: \"{0}에 대한 플래그 값은 불리언이어야 합니다\",\n    locales_must_be_an_object:\n        \"'locales' 옵션은 'en: { theme_implements: \\\"Implements\\\" }'와 비슷한 객체로 설정되어야 합니다\",\n    external_symbol_link_mappings_must_be_object:\n        \"externalSymbolLinkMappings는 Record<package name, Record<symbol name, link>> 형태여야 합니다\",\n    highlight_theme_0_must_be_one_of_1: \"{0}은(는) 다음 중 하나여야 합니다: {1}\",\n    highlightLanguages_contains_invalid_languages_0:\n        \"highlightLanguages에 유효하지 않은 언어가 포함되어 있습니다: {0}. 지원하는 언어 목록을 확인하려면 typedoc --help를 실행하세요\",\n    hostedBaseUrl_must_start_with_http: \"hostedBaseUrl은 'http://' 또는 'https://'로 시작해야 합니다\",\n    useHostedBaseUrlForAbsoluteLinks_requires_hostedBaseUrl:\n        \"useHostedBaseUrlForAbsoluteLinks 옵션을 사용하려면 hostedBaseUrl이 설정되어 있어야 합니다\",\n    option_0_must_be_an_object: \"'{0}' 옵션은 배열이 아닌 객체여야 합니다\",\n    option_0_must_be_a_function: \"'{0}' 옵션은 함수여야 합니다\",\n    option_0_values_must_be_numbers: \"{0}의 모든 값은 숫자여야 합니다\",\n    option_0_values_must_be_array_of_tags: \"{0}은(는) 유효한 태그 이름 배열이어야 합니다\",\n\n    loaded_multiple_times_0:\n        \"TypeDoc가 여러 번 로드되었습니다. 일반적으로 자체적으로 설치된 TypeDoc을 가진 플러그인들이 이를 일으킵니다. 로드된 경로는 다음과 같습니다:\\n\\t{0}\",\n    unsupported_ts_version_0:\n        \"지원되지 않는 Typescript 버전으로 실행 중입니다! TypeDoc이 충돌이 생기는 경우 이것이 그 이유가 됩니다. TypeDoc {0}을 지원합니다.\",\n    no_compiler_options_set:\n        \"컴파일러 옵션이 설정되지 않았습니다. 이는 TypeDoc이 tsconfig.json을 찾지 못했음을 의미할 수 있습니다. 생성된 문서는 비어 있을 수 있습니다.\",\n\n    loaded_plugin_0: `로드된 플러그인 {0}`,\n\n    solution_not_supported_in_watch_mode:\n        \"제공된 tsconfig 파일은 watch 모드에서 지원되지 않는 솔루션 스타일 tsconfig처럼 보입니다.\",\n    strategy_not_supported_in_watch_mode: \"watch 모드에서는 EntryPointStrategy를 확인 또는 확장으로 설정해야 합니다.\",\n    found_0_errors_and_1_warnings: \"{0}개의 오류와 {1}개의 경고를 발견했습니다.\",\n\n    // ReflectionFlag translations\n    flag_private: \"Private\",\n    flag_protected: \"Protected\",\n    flag_public: \"Public\",\n    flag_static: \"Static\",\n    flag_external: \"External\",\n    flag_optional: \"Optional\",\n    flag_rest: \"Rest\",\n    flag_abstract: \"Abstract\",\n    flag_const: \"Const\",\n    flag_readonly: \"Readonly\",\n    flag_inherited: \"Inherited\",\n\n    kind_project: \"프로젝트\",\n    kind_module: \"모듈\",\n    kind_namespace: \"네임스페이스\",\n    kind_enum: \"열거형\",\n    kind_enum_member: \"포함된 값\",\n    kind_variable: \"변수\",\n    kind_function: \"함수\",\n    kind_class: \"클래스\",\n    kind_interface: \"인터페이스\",\n    kind_constructor: \"생성자\",\n    kind_property: \"속성\",\n    kind_method: \"메소드\",\n    kind_call_signature: \"호출 시그니쳐\",\n    kind_index_signature: \"인덱스 시그니쳐\",\n    kind_constructor_signature: \"생성자 시그니쳐\",\n    kind_parameter: \"매개변수\",\n    kind_type_literal: \"타입 리터럴\",\n    kind_type_parameter: \"타입 매개변수\",\n    kind_accessor: \"접근자\",\n    kind_get_signature: \"get 시그니쳐\",\n    kind_set_signature: \"set 시그니쳐\",\n    kind_type_alias: \"타입 별칭\",\n    kind_reference: \"참조\",\n    kind_document: \"문서\",\n\n    kind_plural_project: \"프로젝트\",\n    kind_plural_module: \"모듈\",\n    kind_plural_namespace: \"네임스페이스\",\n    kind_plural_enum: \"열거형\",\n    kind_plural_enum_member: \"포함된 값\",\n    kind_plural_variable: \"변수\",\n    kind_plural_function: \"함수\",\n    kind_plural_class: \"클래스\",\n    kind_plural_interface: \"인터페이스\",\n    kind_plural_constructor: \"생성자\",\n    kind_plural_property: \"속성\",\n    kind_plural_method: \"메소드\",\n    kind_plural_call_signature: \"호출 시그니쳐\",\n    kind_plural_index_signature: \"인덱스 시그니쳐\",\n    kind_plural_constructor_signature: \"생성자 시그니쳐\",\n    kind_plural_parameter: \"매개변수\",\n    kind_plural_type_literal: \"타입 리터럴\",\n    kind_plural_type_parameter: \"타입 매개변수\",\n    kind_plural_accessor: \"접근자\",\n    kind_plural_get_signature: \"get 시그니쳐\",\n    kind_plural_set_signature: \"set 시그니쳐\",\n    kind_plural_type_alias: \"타입 별칭\",\n    kind_plural_reference: \"참조\",\n    kind_plural_document: \"문서\",\n\n    theme_implements: \"구현한 타입\",\n    theme_indexable: \"인덱싱 가능\",\n    theme_type_declaration: \"타입 선언\",\n    theme_index: \"둘러보기\",\n    theme_hierarchy: \"계층\",\n    theme_implemented_by: \"구현\",\n    theme_defined_in: \"정의 위치:\",\n    theme_implementation_of: \"구현하는 타입:\",\n    theme_inherited_from: \"상속받은 타입:\",\n    theme_overrides: \"오버라이드 대상:\",\n    theme_returns: \"반환 형식:\",\n    theme_generated_using_typedoc: \"TypeDoc으로 생성됨\",\n\n    theme_preparing_search_index: \"검색 색인 준비 중...\",\n    theme_search_index_not_available: \"검색 색인을 사용할 수 없습니다.\",\n\n    theme_settings: \"설정\",\n    theme_member_visibility: \"필터\",\n    theme_theme: \"테마\",\n    theme_os: \"시스템\",\n    theme_light: \"라이트\",\n    theme_dark: \"다크\",\n    theme_on_this_page: \"목차\",\n\n    theme_search: \"검색\",\n    theme_menu: \"메뉴\",\n    theme_permalink: \"링크\",\n});\n"
  },
  {
    "path": "src/lib/internationalization/locales/zh.cts",
    "content": "// Please DO NOT include machine generated translations here.\n// If adding a new key, leave it commented out for a native speaker\n// to update.\n\nimport localeUtils = require(\"../locale-utils.cjs\");\n\nexport = localeUtils.buildIncompleteTranslation({\n    loaded_multiple_times_0: \"TypeDoc 已加载多次。这通常是由具有自己的 TypeDoc 安装的插件引起的。加载的路径为：\\n{0}\",\n    unsupported_ts_version_0:\n        \"您正在使用不受支持的 TypeScript 版本运行！如果 TypeDoc 崩溃，这就是原因。TypeDoc 支持 {0}\",\n    no_compiler_options_set: \"未设置编译器选项。这可能意味着 TypeDoc 没有找到你的 tsconfig.json。生成的文档可能为空\",\n\n    loaded_plugin_0: \"已加载插件 {0}\",\n\n    solution_not_supported_in_watch_mode: \"提供的 tsconfig 文件看起来像解决方案样式的 tsconfig，在监视模式下不受支持\",\n    strategy_not_supported_in_watch_mode: \"对于监视模式，entryPointStrategy 必须设置为 resolve 或 expand\",\n    file_0_changed_restarting: \"配置文件 {0} 已更改：需要重新启动……\",\n    file_0_changed_rebuilding: \"文件 {0} 已更改：正在重新构建输出……\",\n    found_0_errors_and_1_warnings: \"发现 {0} 个错误和 {1} 个警告\",\n\n    output_0_could_not_be_generated: \"由于以上错误无法生成 {0} 输出\",\n    output_0_generated_at_1: \"已生成 {0} 输出，位于 {1}\",\n\n    no_entry_points_for_packages: \"没有为包模式提供入口点，无法生成文档\",\n    failed_to_find_packages: \"找不到任何软件包，请确保您至少提供了一个包含 package.json 的目录作为入口点\",\n    nested_packages_unsupported_0: \"位于 {0} 的项目已将 entryPointStrategy 设置为包，但不支持嵌套包\",\n    package_option_0_should_be_specified_at_root: \"由 packageOptions 设置的选项 {0} 仅在根级别有效\",\n    previous_error_occurred_when_reading_options_for_0: \"读取 {0} 处的包的选项时发生上一个错误\",\n    converting_project_at_0: \"正在转换 {0} 处的项目\",\n    failed_to_convert_packages: \"无法转换一个或多个包，结果将不会合并在一起\",\n    merging_converted_projects: \"合并转换后的项目\",\n\n    no_entry_points_to_merge: \"没有提供合并的入口点\",\n    entrypoint_did_not_match_files_0: \"入口点 glob {0} 与任何文件均不匹配\",\n    failed_to_parse_json_0: \"无法将 {0} 处的文件解析为 json\",\n\n    failed_to_read_0_when_processing_document_tag_in_1: \"处理 {1} 中注释的 @document 标签时无法读取文件 {0}\",\n    failed_to_read_0_when_processing_project_document: \"添加项目文档时无法读取文件 {0}\",\n    failed_to_read_0_when_processing_document_child_in_1: \"处理 {1} 中的文档子项时无法读取文件 {0}\",\n    frontmatter_children_0_should_be_an_array_of_strings_or_object_with_string_values:\n        \"{0} 中的 Frontmatter 子项应为字符串数组或具有字符串值的对象\",\n    converting_union_as_interface:\n        \"在联合类型上使用 @interface 将丢弃联合所有分支上不存在的属性。TypeDoc 的输出可能无法准确描述您的源代码\",\n    converting_0_as_class_requires_value_declaration: \"将 {0} 转换为类需要表示非类型值的声明\",\n    converting_0_as_class_without_construct_signatures: \"{0} 正在转换为类，但没有任何构造签名\",\n\n    comment_for_0_should_not_contain_block_or_modifier_tags: \"{0} 的注释不应包含任何块级标签或修饰符标签\",\n\n    symbol_0_has_multiple_declarations_with_comment: \"{0} 有多个带注释的声明。将使用任意注释\",\n    comments_for_0_are_declared_at_1: \"{0} 的注释声明于：\\n{1}\",\n\n    // comments/parser.ts\n    multiple_type_parameters_on_template_tag_unsupported:\n        \"TypeDoc 不支持在带有注释的单个 @template 标签中定义多个类型参数\",\n    failed_to_find_jsdoc_tag_for_name_0: \"解析注释后无法找到 {0} 的 JSDoc 标签，请提交错误报告\",\n    relative_path_0_is_not_a_file_and_will_not_be_copied_to_output:\n        \"找不到相对路径 {0} 对应的文件，该文件不会被复制至输出目录\",\n\n    inline_inheritdoc_should_not_appear_in_block_tag_in_comment_at_0:\n        \"内联 @inheritDoc 标签不应出现在块级标签内，因为它不会在 {0} 处的注释中被处理。\",\n    at_most_one_remarks_tag_expected_in_comment_at_0:\n        \"注释中最多应有一个 @remarks 标签，忽略 {0} 处注释中除第一个标签之外的所有标签\",\n    at_most_one_returns_tag_expected_in_comment_at_0:\n        \"注释中最多应有一个 @returns 标签，忽略 {0} 处注释中除第一个标签之外的所有标签\",\n    at_most_one_inheritdoc_tag_expected_in_comment_at_0:\n        \"注释中最多应有一个 @inheritDoc 标签，忽略 {0} 处注释中除第一个标签之外的所有标签\",\n    content_in_summary_overwritten_by_inheritdoc_in_comment_at_0:\n        \"摘要部分的内容将被 {0} 处注释中的 @inheritDoc 标签覆盖\",\n    content_in_remarks_block_overwritten_by_inheritdoc_in_comment_at_0:\n        \"@remarks 块中的内容将被 {0} 处注释中的 @inheritDoc 标签覆盖\",\n    example_tag_literal_name: \"示例标签的第一行将按原样作为示例名称，并且只能包含文本\",\n    inheritdoc_tag_properly_capitalized: \"@inheritDoc 标签应正确大写\",\n    treating_unrecognized_tag_0_as_modifier: \"将无法识别的标签 {0} 视为修饰标签\",\n    unmatched_closing_brace: \"不匹配的右括号\",\n    unescaped_open_brace_without_inline_tag: \"遇到未转义的无内联标签的开括号\",\n    unknown_block_tag_0: \"遇到未知的块级标签 {0}\",\n    unknown_inline_tag_0: \"遇到未知的内联标签 {0}\",\n    open_brace_within_inline_tag: \"在内联标签中遇到左括号，这可能是一个错误\",\n    inline_tag_not_closed: \"内联标签未关闭\",\n\n    // validation\n    comment_for_0_links_to_1_not_included_in_docs_use_external_link_2:\n        `{0} 注释中指向 “{1}” 的已解析的链接不会被包含在文档中。请将 {2} 导出或添加至 externalSymbolLinkMappings 选项以修复该警告`,\n    failed_to_resolve_link_to_0_in_comment_for_1: \"无法解析 {1} 注释中指向 “{0}” 的链接\",\n    failed_to_resolve_link_to_0_in_comment_for_1_may_have_meant_2:\n        \"无法解析 {1} 的注释中指向 “{0}” 的链接。您可能想要 “{2}”\",\n    failed_to_resolve_link_to_0_in_readme_for_1: \"无法解析 {1} 的自述文件中指向 “{0}” 的链接\",\n    failed_to_resolve_link_to_0_in_readme_for_1_may_have_meant_2:\n        \"无法解析 {1} 的自述文件中指向 “{0}” 的链接。您可能想要 “{2}”\",\n    failed_to_resolve_link_to_0_in_document_1: \"无法解析文档 {1} 中指向 “{0}” 的链接\",\n    failed_to_resolve_link_to_0_in_document_1_may_have_meant_2:\n        \"无法解析文档 {1} 中指向 “{0}” 的链接。您可能想要 “{2}”\",\n    type_0_defined_in_1_is_referenced_by_2_but_not_included_in_docs: \"{0} 在 {1} 中定义，被 {2} 引用，但未包含在文档中\",\n    reflection_0_kind_1_defined_in_2_does_not_have_any_documentation: \"{0} ({1})，在 {2} 中定义，没有任何文档\",\n    invalid_intentionally_not_documented_names_0:\n        \"以下的限定反射名称被设定为刻意无文档说明，但它们要么未在文档中被引用，要么已有文档说明：\\n\\t{0}\",\n    invalid_intentionally_not_exported_symbols_0:\n        \"以下符号被设定为刻意非导出，但它们要么未在文档中被引用，要么已为导出符号：\\n{0}\",\n    reflection_0_has_unused_mergeModuleWith_tag: \"{0} 中存在无法解析的 @mergeModuleWith 标签\",\n    reflection_0_links_to_1_with_text_2_but_resolved_to_3:\n        \"“{0}”中的链接“{2}”指向“{1}”，目标虽然存在但并没有直接的链接，因此将改为链接至“{3}”。\",\n\n    // conversion plugins\n    not_all_search_category_boosts_used_0:\n        \"文档中并未使用 searchCategoryBoosts 中指定的所有类别。未使用的类别包括：\\n{0}\",\n    not_all_search_group_boosts_used_0: \"文档中并未使用 searchGroupBoosts 中指定的所有组。未使用的组为：\\n{0}\",\n    comment_for_0_includes_categoryDescription_for_1_but_no_child_in_group:\n        \"{0} 的注释中包含了 “{1}” 的 @categoryDescription，但该类别中没有子项\",\n    comment_for_0_includes_groupDescription_for_1_but_no_child_in_group:\n        \"{0} 的注释中包含了 “{1}” 的 @groupDescription，但该分组中没有子项\",\n    comment_for_0_specifies_1_as_sort_strategy_but_only_2_is_valid:\n        `{0} 的注释中指定的 “{1}” 的 @sortStrategy 无效，以下是有效的选项：\\n\\t{2}`,\n    label_0_for_1_cannot_be_referenced:\n        \"无法使用声明引用来引用 {1} 的标签“{0}”。标签只能包含 A-Z、0-9 和 _，并且不能以数字开头\",\n    modifier_tag_0_is_mutually_exclusive_with_1_in_comment_for_2: \"修饰符标签 {0} 与 {2} 注释中的 {1} 互斥\",\n    signature_0_has_unused_param_with_name_1: \"签名 {0} 有一个名为“{1}”的 @param，但未被使用\",\n    declaration_reference_in_inheritdoc_for_0_not_fully_parsed:\n        \"@inheritDoc 中对 {0} 的声明引用未完全解析，可能会解析不正确\",\n    failed_to_find_0_to_inherit_comment_from_in_1: \"在 {1} 的注释中找不到要继承的注释“{0}”\",\n    reflection_0_tried_to_copy_comment_from_1_but_source_had_no_comment:\n        \"{0} 尝试使用 @inheritDoc 从 {1} 复制注释，但源没有相关注释\",\n    inheritdoc_circular_inheritance_chain_0: \"@inheritDoc 指定循环继承链：{0}\",\n    provided_readme_at_0_could_not_be_read: \"提供的 README 路径无法读取 {0}\",\n    defaulting_project_name: \"未指定 --name 选项，并且未找到 package.json。将项目名称默认为“Documentation”\",\n    disable_git_set_but_not_source_link_template:\n        \"已设置 disableGit，但未设置 sourceLinkTemplate，因此无法生成源代码链接。设置 sourceLinkTemplate 或 disableSources 以停用源代码跟踪\",\n    disable_git_set_and_git_revision_used:\n        \"disableGit 已设置，并且 sourceLinkTemplate 包含 {gitRevision}，由于未提供修订，因此将替换为空字符串\",\n    git_remote_0_not_valid: \"提供的 git 远程“{0}”无效。源链接将失效\",\n    reflection_0_tried_to_merge_into_child_1: \"反射 {0} 尝试使用 @mergeModuleWith 合并到其子项之一：{1}\",\n\n    include_0_in_1_specified_2_resolved_to_3_does_not_exist:\n        \"{1} 的注释中 {0} 标签指定了包含 “{2}”，解析为 “{3}”，该文件并不存在或并非文件。\",\n    include_0_in_1_specified_2_circular_include_3: \"{1} 的注释中 {0} 标签指定了包含 “{2}”，导致了循环包含：\\n\\t{3}\",\n    include_0_tag_in_1_specified_2_file_3_region_4_region_not_found:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件找不到该区域。`,\n    include_0_tag_in_1_region_2_region_not_supported: `{1} 中的 标签 {0} 指定了 “{2}”，但尚不支持对应的文件扩展名。`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件中找不到该区域的结束注释。`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件中找不到该区域的起始注释。`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件中该区域的结束注释出现了多次。`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件中该区域的起始注释出现了多次。`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件中该区域出现了多次。`,\n    include_0_tag_in_1_specified_2_file_3_region_4_region_empty:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中标记为 “{4}” 的区域，但在对应的文件中该区域不包含内容或仅包含空白字符。`,\n    include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中的 {4} 行，但指定的行范围无效。`,\n    include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines:\n        `{1} 中的标签 {0} 指定 “{2}” 以包含文件 “{3}” 中的 {4} 行，但该文件只有 {5} 行。`,\n\n    // output plugins\n    custom_css_file_0_does_not_exist: \"{0} 处的自定义 CSS 文件不存在\",\n    custom_js_file_0_does_not_exist: \"{0} 处的自定义 JavaScript 文件不存在\",\n    unsupported_highlight_language_0_not_highlighted_in_comment_for_1:\n        \"{1} 的注释中使用了不支持的高亮语言 {0} ，因此该语言将不会被高亮\",\n    unloaded_language_0_not_highlighted_in_comment_for_1:\n        \"{1} 的注释中语言为 {0} 的代码块将不会被高亮，因为该语言未包含在 highlightLanguages 选项中\",\n    yaml_frontmatter_not_an_object: \"YAML Frontmatter 应当为对象\",\n\n    // renderer\n    could_not_write_0: \"无法写入 {0}\",\n    could_not_empty_output_directory_0: \"无法清空输出目录 {0}\",\n    could_not_create_output_directory_0: \"无法创建输出目录 {0}\",\n    theme_0_is_not_defined_available_are_1: \"主题“{0}”未定义。可用主题为：{1}\",\n    router_0_is_not_defined_available_are_1: `路由 “{0}” 未定义。可用的路由为：{1}`,\n    reflection_0_links_to_1_but_anchor_does_not_exist_try_2: \"{0} 链接至 {1}，但对应锚点不存在。你是否是指：\\n\\t{2}\",\n\n    // entry points\n    no_entry_points_provided: \"没有提供入口点，这可能是配置错误\",\n    unable_to_find_any_entry_points: \"无法找到任何入口点。请参阅先前的警告\",\n    watch_does_not_support_packages_mode: \"监视模式不支持“包”样式的入口点\",\n    watch_does_not_support_merge_mode: \"监视模式不支持“合并”样式的入口点\",\n    entry_point_0_not_in_program: \"入口点 {0} 未被 tsconfig 中的“files”或“include”选项引用\",\n    failed_to_resolve_0_to_ts_path: \"无法将 package.json 中的入口点 {0} 解析至 TypeScript 源文件\",\n    use_expand_or_glob_for_files_in_dir: \"如果要包含此目录中的文件，请设置 --entryPointStrategy 以展开或指定 glob\",\n    glob_0_did_not_match_any_files: \"glob {0} 与任何文件均不匹配\",\n    entry_point_0_did_not_match_any_files_after_exclude: \"应用排除模式后，glob {0} 没有匹配任何文件\",\n    entry_point_0_did_not_exist: \"提供的入口点 {0} 不存在\",\n    entry_point_0_did_not_match_any_packages: \"入口点 glob {0} 与任何包含 package.json 的目录不匹配\",\n    file_0_not_an_object: \"文件 {0} 不是对象\",\n\n    // deserialization\n    serialized_project_referenced_0_not_part_of_project: \"序列化项目引用了反射 {0}，但它不是项目的一部分\",\n    saved_relative_path_0_resolved_from_1_does_not_exist: \"序列化项目引用的 {0} 不存在或无法在 {1} 下找到\",\n\n    // options\n    circular_reference_extends_0: \"{0} 的“extends”字段出现循环引用\",\n    failed_resolve_0_to_file_in_1: \"无法将 {0} 解析为 {1} 中的文件\",\n\n    glob_0_should_use_posix_slash:\n        `该 glob “{0}” 中转义了不是特殊字符的字符。输入 TypeDoc 的 glob 可能不会使用 Windows 路径分隔符（\\\\），请尝试将其替换为 POSIX 路径分隔符（/）`,\n    option_0_can_only_be_specified_by_config_file: \"“{0}”选项只能通过配置文件指定\",\n    option_0_expected_a_value_but_none_provided: \"--{0} 需要一个值，但没有给出任何参数\",\n    unknown_option_0_may_have_meant_1: \"未知选项：{0}，你可能指的是：\\n\\t{1}\",\n\n    typedoc_key_in_0_ignored: \"{0} 中的“typedoc”键已被旧包 entryPointStrategy 使用，将被忽略\",\n    typedoc_options_must_be_object_in_0: \"无法解析 {0} 中的“typedocOptions”字段，请确保它存在且包含对象\",\n    tsconfig_file_0_does_not_exist: \"tsconfig 文件 {0} 不存在\",\n    tsconfig_file_specifies_options_file:\n        \"tsconfig 文件中的“typedocOptions”指定要读取的选项文件，但该选项文件已被读取。这可能是配置错误\",\n    tsconfig_file_specifies_tsconfig_file: \"tsconfig 文件中的“typedocOptions”可能未指定要读取的 tsconfig 文件\",\n    tags_0_defined_in_typedoc_json_overwritten_by_tsdoc_json: \"typedoc.json 中定义的 {0} 将被 tsdoc.json 中的配置覆盖\",\n    failed_read_tsdoc_json_0: \"无法读取位于 {0} 的 tsdoc.json 文件\",\n    invalid_tsdoc_json_0: \"文件 {0} 不是有效的 tsdoc.json 文件\",\n\n    options_file_0_does_not_exist: \"选项文件 {0} 不存在\",\n    failed_read_options_file_0: \"无法解析 {0}，请确保其存在并导出对象\",\n\n    // plugins\n    invalid_plugin_0_missing_load_function: \"插件 {0} 中的结构无效，未找到加载函数\",\n    plugin_0_could_not_be_loaded: \"无法加载插件 {0}\",\n\n    // option declarations help\n    help_options: \"指定应加载的 json 选项文件。如果未指定，TypeDoc 将在当前目录中查找“typedoc.json”\",\n    help_tsconfig: \"指定应加载的 TypeScript 配置文件。如果未指定，TypeDoc 将在当前目录中查找“tsconfig.json”\",\n    help_compilerOptions: \"有选择地覆盖 TypeDoc 使用的 TypeScript 编译器选项\",\n    help_lang: \"设置生成和 TypeDoc 消息中使用的语言\",\n    help_locales: \"为指定语言环境添加翻译。此选项主要用作在等待官方语言环境支持添加到 TypeDoc 时的权宜之计\",\n    help_packageOptions: \"当 entryPointStrategy 设置为包时，设置将在每个包中设置的选项\",\n\n    help_entryPoints: \"文档的入口点\",\n    help_entryPointStrategy: \"将入口点转换为文档模块所采用的策略\",\n    help_alwaysCreateEntryPointModule: \"设置后，TypeDoc 将始终为入口点创建一个“模块”，即使只提供了一个\",\n    help_projectDocuments: \"应作为子项添加到生成文档根目录中的文档。支持使用 glob 匹配多个文件\",\n    help_exclude: \"定义在扩展指定为入口点的目录时要排除的模式\",\n    help_externalPattern: \"定义应被视为外部的文件的模式\",\n    help_excludeExternals: \"防止记录外部解析的符号\",\n    help_excludeNotDocumented: \"防止未明确记录的符号出现在结果中\",\n    help_excludeNotDocumentedKinds: \"指定可以通过 excludeNotDocumented 删除的反射类型\",\n    help_excludeInternal: \"防止标有 @internal 的符号被记录\",\n    help_excludeCategories: \"从文档中排除此类别中的符号\",\n    help_excludeProtected: \"忽略受保护的变量和方法\",\n    help_excludeReferences: \"如果一个符号被导出多次，则忽略除第一次导出之外的所有导出\",\n    help_externalSymbolLinkMappings: \"为文档中未包含的符号定义自定义链接\",\n    help_out: \"指定默认类型输出的文档写入的位置。插件可能会改变默认的输出类型。\",\n    help_html: \"指定 HTML 文档写入的位置\",\n    help_json: \"指定描述项目的 JSON 文件写入的位置和文件名\",\n    help_pretty: \"指定输出 JSON 是否应使用制表符进行格式化\",\n    help_emit: \"指定 TypeDoc 应发出的内容，“docs”、“both”或“none”\",\n    help_theme: \"指定用于呈现文档的主题名称\",\n    help_router: \"指定需要使用路由的名称以决定文档中文件的命名方式\",\n    help_lightHighlightTheme: \"指定浅色模式下的代码高亮主题\",\n    help_darkHighlightTheme: \"指定暗黑模式下的代码高亮主题\",\n    help_highlightLanguages: \"指定渲染时将加载的代码高亮语言\",\n    help_ignoredHighlightLanguages: \"指定哪些语言将被视为支持的代码高亮语言，但不会在运行时被语法高亮\",\n    help_typePrintWidth: \"渲染类型时触发自动换行的代码宽度\",\n    help_customCss: \"要导入主题的自定义 CSS 文件的路径\",\n    help_customJs: \"要导入的自定义 JS 文件的路径\",\n    help_markdownItOptions: \"指定传递给 markdown-it（TypeDoc 使用的 Markdown 解析器）的选项\",\n    help_markdownItLoader: \"指定加载 markdown-it 实例时要调用的回调。将传递 TypeDoc 将使用的解析器实例\",\n    help_maxTypeConversionDepth: \"设置要转换类型的最大深度\",\n    help_name: \"设置将在模板标题中使用的项目名称\",\n    help_includeVersion: \"将软件包版本添加到项目名称中\",\n    help_disableSources: \"记录反射时禁用设置反射源\",\n    help_sourceLinkTemplate:\n        \"指定生成源 URL 时要使用的链接模板。如果未设置，将使用 git remote 自动创建。支持 {path}、{line}、{gitRevision} 占位符\",\n    help_gitRevision:\n        \"使用指定修订版本而不是最新修订版本来链接到 GitHub/Bitbucket 源文件。如果设置了 disableSources，则无效\",\n    help_gitRemote: \"使用指定的远程链接到 GitHub/Bitbucket 源文件。如果设置了 disableGit 或 disableSources，则无效\",\n    help_disableGit:\n        \"假设所有内容都可以通过 sourceLinkTemplate 进行链接，如果启用此功能，则必须设置 sourceLinkTemplate。{path} 将以 basePath 为根\",\n    help_basePath: \"指定显示文件路径时使用的基本路径\",\n    help_excludeTags: \"从文档注释中删除列出的块级/修饰符标签\",\n    help_notRenderedTags: \"保留在文档注释中但在创建输出时不渲染的标签\",\n    help_cascadedModifierTags: \"需要从父反射复制至所有子反射的修饰符标签\",\n    help_readme: \"应显示在索引页上的自述文件路径。传递“none”以禁用索引页并在全局页上启动文档\",\n    help_cname: \"设置 CNAME 文件文本，这对于 GitHub Pages 上的自定义域很有用\",\n    help_favicon: \"作为站点图标包含的 favicon 的路径\",\n    help_sourceLinkExternal: \"指定哪些源代码链接应被视为外部链接，并在新选项卡中打开\",\n    help_markdownLinkExternal: \"指定注释与 Markdown 文件中哪些 http[s]:// 链接应被视为外部链接，并在新选项卡中打开\",\n    help_githubPages: \"生成 .nojekyll 文件以防止 GitHub Pages 中出现 404 错误。默认为“true”\",\n    help_hostedBaseUrl:\n        \"指定用于在我们的输出文件夹和规范链接中生成 sitemap.xml 的基本 URL。如果未指定，则不会生成站点地图\",\n    help_useHostedBaseUrlForAbsoluteLinks: \"如果设置，TypeDoc 将使用 hostingBaseUrl 选项生成到您网站页面的绝对链接\",\n    help_hideGenerator: \"不要打印页面末尾的 TypeDoc 链接\",\n    help_customFooterHtml: \"TypeDoc 链接后的自定义页脚\",\n    help_customFooterHtmlDisableWrapper: \"如果设置，则禁用 customFooterHtml 的包装元素\",\n    help_cacheBust: \"在静态资产链接中包含生成时间\",\n    help_searchInComments: \"如果设置，搜索索引还将包括注释。这将大大增加搜索索引的大小\",\n    help_searchInDocuments: \"如果设置，搜索索引还将包含文档。这将大大增加搜索索引的大小\",\n    help_cleanOutputDir: \"如果设置，TypeDoc 将在写入输出之前删除输出目录\",\n    help_titleLink: \"设置页眉中的标题指向的链接。默认为文档主页\",\n    help_navigationLinks: \"定义要包含在标题中的链接\",\n    help_sidebarLinks: \"定义要包含在侧边栏中的链接\",\n    help_navigationLeaves: \"导航树中不应扩展的分支\",\n    help_headings: \"确定标题是否需要被渲染\",\n    help_sluggerConfiguration: \"确定渲染的 HTML 中锚点的确定方式\",\n    help_navigation: \"确定导航侧边栏的组织方式\",\n    help_includeHierarchySummary: \"如果设置，反射的层级一览将被渲染至概述页面。默认为 `true`\",\n    help_visibilityFilters: \"根据修饰符标签指定内置过滤器和附加过滤器的默认可见性\",\n    help_searchCategoryBoosts: \"配置搜索以提高所选类别的相关性\",\n    help_searchGroupBoosts: \"配置搜索以增强所选种类（例如“类别”）的相关性\",\n    help_useFirstParagraphOfCommentAsSummary:\n        \"如果设置，且没有指定 @summary 标签，TypeDoc 会使用注释的第一行作为在模块/命名空间一览里的概述\",\n    help_jsDocCompatibility: \"设置注释解析的兼容性选项，以增加与 JSDoc 注释的相似度\",\n    help_suppressCommentWarningsInDeclarationFiles: \"阻止 .d.ts 文件的注释中因为存在未指定的标签而弹出的警告。\",\n    help_commentStyle: \"确定 TypeDoc 如何搜索注释\",\n    help_useTsLinkResolution: \"使用 TypeScript 的链接解析来确定 @link 标签指向的位置。这仅适用于 JSDoc 样式注释\",\n    help_preserveLinkText: \"如果设置，不带链接文本的 @link 标签将使用文本内容作为链接。如果未设置，将使用目标反射名称\",\n    help_blockTags: \"TypeDoc 在解析注释时应该识别的块级标签\",\n    help_inlineTags: \"TypeDoc 在解析注释时应该识别的内联标签\",\n    help_modifierTags: \"TypeDoc 在解析注释时应该识别的修饰符标签\",\n    help_categorizeByGroup: \"指定是否在组级别进行分类\",\n    help_groupReferencesByType: \"如果设置，引用将按照它们的类型进行分类，而非直接分在“引用”类型中\",\n    help_defaultCategory: \"为没有类别的反射指定默认类别\",\n    help_categoryOrder: \"指定类别出现的顺序。* 表示不在列表中的类别的相对顺序\",\n    help_groupOrder: \"指定组的显示顺序。* 表示不在列表中的组的相对顺序\",\n    help_sort: \"指定记录值的排序策略\",\n    help_sortEntryPoints: \"如果设置，入口点将遵循与其他反射相同的排序规则\",\n    help_kindSortOrder: \"当指定“种类”时指定反射的排序顺序\",\n    help_watch: \"监视文件的变化并在发生更改时重建文档\",\n    help_preserveWatchOutput: \"如果设置，TypeDoc 将不会在编译运行之间清除屏幕\",\n    help_skipErrorChecking: \"在生成文档之前不要运行 TypeScript 的类型检查\",\n    help_help: \"打印此消息\",\n    help_version: \"打印 TypeDoc 的版本\",\n    help_showConfig: \"打印解析后的配置并退出\",\n    help_plugin: \"指定应加载的 npm 插件。省略则加载所有已安装的插件\",\n    help_logLevel: \"指定应使用什么级别的日志记录\",\n    help_treatWarningsAsErrors: \"如果设置，所有警告都将被视为错误\",\n    help_treatValidationWarningsAsErrors:\n        \"如果设置，验证期间发出的警告将被视为错误。此选项不能用于禁用验证警告的 treatWarningsAsErrors\",\n    help_intentionallyNotExported: \"不会因为“引用但并未导出”而产生警告的符号列表\",\n    help_requiredToBeDocumented: \"需要有文档说明的反射类型列表\",\n    help_packagesRequiringDocumentation: \"需要有文档说明的包的列表\",\n    help_intentionallyNotDocumented: \"不会因为无文档说明而产生警告的完整反射名称列表\",\n    help_validation: \"指定 TypeDoc 应对生成的文档执行哪些验证步骤\",\n\n    // ==================================================================\n    // Option validation\n    // ==================================================================\n    unknown_option_0_you_may_have_meant_1: \"未知选项“{0}” 你可能指的是：\\n{1}\",\n    option_0_must_be_between_1_and_2: \"{0} 必须介于 {1} 和 {2} 之间\",\n    option_0_must_be_equal_to_or_greater_than_1: \"{0} 必须等于或大于 {1}\",\n    option_0_must_be_less_than_or_equal_to_1: \"{0} 必须小于或等于 {1}\",\n    option_0_must_be_one_of_1: \"{0} 必须是 {1} 之一\",\n    flag_0_is_not_valid_for_1_expected_2: \"标志“{0}”对 {1} 无效，应为 {2} 之一\",\n    expected_object_with_flag_values_for_0: \"预期为一个带有标志值为 {0} 或 true/false 的对象\",\n    flag_values_for_0_must_be_booleans: \"{0} 的标志值必须是布尔值\",\n    locales_must_be_an_object: \"'locales' 选项必须设置为类似于以下对象：{ en: { theme_implements: \\\"Implements\\\" }}\",\n    exclude_not_documented_specified_0_valid_values_are_1:\n        \"excludeNotDocumentedKinds 只能指定已知值，并且提供了无效值 ({0})。有效类型为：\\n{1}\",\n    external_symbol_link_mappings_must_be_object:\n        \"externalSymbolLinkMappings 必须是 Record<package name, Record<symbol name, link>>\",\n    highlight_theme_0_must_be_one_of_1: \"{0} 必须是下列之一：{1}\",\n    highlightLanguages_contains_invalid_languages_0:\n        \"highlightLanguages 包含无效语言：{0}，运行 typedoc --help 获取受支持语言的列表\",\n    hostedBaseUrl_must_start_with_http: \"hostingBaseUrl 必须以 http:// 或 https:// 开头\",\n    useHostedBaseUrlForAbsoluteLinks_requires_hostedBaseUrl:\n        \"useHostedBaseUrlForAbsoluteLinks 选项要求设置 hostingBaseUrl\",\n    favicon_must_have_one_of_the_following_extensions_0: \"favicon 的后缀名必须是下列之一：{0}\",\n    option_0_must_be_an_object: \"“{0}”选项必须是非数组对象\",\n    option_0_must_be_an_array_of_string: \"“{0}”选项必须是字符串数组\",\n    option_0_must_be_an_array_of_string_or_functions: \"“{0}”选项必须是由字符串或函数构成的数组\",\n    option_0_must_be_a_function: \"‘{0}’ 选项必须是一个函数\",\n    option_0_must_be_object_with_urls: \"{0} 必须是具有字符串标签作为键和 URL 值的对象\",\n    visibility_filters_only_include_0: \"visibilityFilters 只能包含以下非@键：{0}\",\n    visibility_filters_must_be_booleans: \"visibilityFilters 的所有值都必须是布尔值\",\n    option_0_values_must_be_numbers: \"{0} 的所有值都必须是数字\",\n    option_0_values_must_be_array_of_tags: \"{0} 必须是有效标签名称的数组\",\n    option_0_specified_1_but_only_2_is_valid: \"{0} 只能指定已知值，并且提供了无效值 ({1})。有效的排序策略为：\\n{2}\",\n    option_outputs_must_be_array:\n        \"“outputs” 选项必须为一个数组，其成员均为 { name: string, path: string, options?: TypeDocOptions }。\",\n    specified_output_0_has_not_been_defined: \"指定的输出类型 {0} 未被定义。\",\n\n    // https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts\n    alert_note: \"注意\",\n    alert_tip: \"提示\",\n    alert_important: \"重要\",\n    alert_warning: \"警告\",\n    alert_caution: \"小心\",\n\n    // ReflectionKind singular translations\n    kind_project: \"项目\",\n    kind_module: \"模块\",\n    kind_namespace: \"命名空间\",\n    kind_enum: \"枚举\",\n    kind_enum_member: \"枚举成员\",\n    kind_variable: \"变量\",\n    kind_function: \"函数\",\n    kind_class: \"类\",\n    kind_interface: \"接口\",\n    kind_constructor: \"构造函数\",\n    kind_property: \"属性\",\n    kind_method: \"方法\",\n    kind_call_signature: \"调用签名\",\n    kind_index_signature: \"索引签名\",\n    kind_constructor_signature: \"构造函数签名\",\n    kind_parameter: \"参数\",\n    kind_type_literal: \"类型字面量\",\n    kind_type_parameter: \"类型参数\",\n    kind_accessor: \"访问器\",\n    kind_get_signature: \"Getter 签名\",\n    kind_set_signature: \"Setter 签名\",\n    kind_type_alias: \"类型别名\",\n    kind_reference: \"参考\",\n    kind_document: \"文档\",\n\n    // ReflectionKind plural translations\n    kind_plural_project: \"项目\",\n    kind_plural_module: \"模块\",\n    kind_plural_namespace: \"命名空间\",\n    kind_plural_enum: \"枚举\",\n    kind_plural_enum_member: \"枚举成员\",\n    kind_plural_variable: \"变量\",\n    kind_plural_function: \"函数\",\n    kind_plural_class: \"类\",\n    kind_plural_interface: \"接口\",\n    kind_plural_constructor: \"构造函数\",\n    kind_plural_property: \"属性\",\n    kind_plural_method: \"方法\",\n    kind_plural_call_signature: \"调用签名\",\n    kind_plural_index_signature: \"索引签名\",\n    kind_plural_constructor_signature: \"构造函数签名\",\n    kind_plural_parameter: \"参数\",\n    kind_plural_type_literal: \"类型字面量\",\n    kind_plural_type_parameter: \"类型参数\",\n    kind_plural_accessor: \"访问器\",\n    kind_plural_get_signature: \"Getter 签名\",\n    kind_plural_set_signature: \"Setter 签名\",\n    kind_plural_type_alias: \"类型别名\",\n    kind_plural_reference: \"参考\",\n    kind_plural_document: \"文档\",\n\n    // ReflectionFlag translations\n    flag_private: \"私有\",\n    flag_protected: \"受保护\",\n    flag_public: \"公开\",\n    flag_static: \"静态\",\n    flag_external: \"外部\",\n    flag_optional: \"可选\",\n    flag_rest: \"动态参数\",\n    flag_abstract: \"抽象\",\n    flag_const: \"常量\",\n    flag_readonly: \"只读\",\n    flag_inherited: \"继承\",\n\n    // ==================================================================\n    // Strings that show up in the default theme\n    // ==================================================================\n    // Page headings/labels\n    theme_implements: \"实现\",\n    theme_indexable: \"可索引\",\n    theme_type_declaration: \"类型声明\",\n    theme_index: \"索引\",\n    theme_hierarchy: \"层级\",\n    theme_hierarchy_summary: \"层级一览\",\n    theme_hierarchy_view_summary: \"查看层级一览\",\n    theme_implemented_by: \"实现于\",\n    theme_defined_in: \"定义于\",\n    theme_implementation_of: \"实现了\",\n    theme_inherited_from: \"继承自\",\n    theme_overrides: \"重写了\",\n    theme_returns: \"返回\",\n    theme_generated_using_typedoc: \"使用 TypeDoc 生成\", // If this includes \"TypeDoc\", theme will insert a link at that location.\n    // Search\n    theme_preparing_search_index: \"正在准备搜索索引...\",\n    // Left nav bar\n    theme_loading: \"加载中……\",\n    // Right nav bar\n    theme_settings: \"显示设置\",\n    theme_member_visibility: \"成员可见性\",\n    theme_theme: \"配色\",\n    theme_os: \"自动\",\n    theme_light: \"浅色\",\n    theme_dark: \"深色\",\n    theme_on_this_page: \"目录\",\n\n    // aria-label\n    theme_search: \"搜索\",\n    theme_menu: \"菜单\",\n    theme_permalink: \"永久链接\",\n    theme_folder: \"文件夹\",\n\n    // Used by the frontend JS\n    // For the English translations only, these should also be added to\n    // src/lib/output/themes/default/assets/typedoc/Application.ts\n    // Also uses theme_folder and singular kinds\n    theme_copy: \"复制\",\n    theme_copied: \"已复制！\",\n    theme_normally_hidden: \"由于您的过滤器设置，该成员已被隐藏。\",\n    theme_hierarchy_expand: \"展开\",\n    theme_hierarchy_collapse: \"折叠\",\n    theme_search_index_not_available: \"搜索索引不可用\",\n    theme_search_no_results_found_for_0: \"找不到包含 {0} 的结果\",\n    theme_search_placeholder: \"搜索文档\",\n\n    // Block tags\n    tag_defaultValue: \"默认值\",\n    tag_deprecated: \"已被弃用\",\n    tag_example: \"示例\",\n    tag_param: \"参数\",\n    tag_privateRemarks: \"私有备注\",\n    tag_remarks: \"备注\",\n    tag_returns: \"返回\",\n    tag_see: \"参阅\",\n    tag_throws: \"抛出\",\n    tag_typeParam: \"类型参数\",\n    tag_author: \"作者\",\n    tag_callback: \"回调\",\n    tag_category: \"类别\",\n    tag_categoryDescription: \"类别描述\",\n    tag_default: \"默认值\",\n    tag_document: \"文档\",\n    tag_extends: \"继承自\",\n    tag_augments: \"继承自\",\n    tag_yields: \"生成\",\n    tag_group: \"分组\",\n    tag_groupDescription: \"分组描述\",\n    tag_import: \"导入\",\n    tag_inheritDoc: \"继承文档\",\n    tag_jsx: \"JSX\",\n    tag_license: \"许可协议\",\n    tag_module: \"模块\",\n    tag_mergeModuleWith: \"合并模块至\",\n    tag_prop: \"属性\",\n    tag_property: \"属性\",\n    tag_return: \"返回\",\n    tag_satisfies: \"满足\",\n    tag_since: \"添加于\",\n    tag_sortStrategy: \"排序策略\",\n    tag_template: \"类型参数\",\n    tag_type: \"类型\",\n    tag_typedef: \"类型定义\",\n    tag_summary: \"概述\",\n    tag_preventInline: \"取消内联\",\n    tag_inlineType: \"内联类型\",\n    tag_preventExpand: \"取消扩展\",\n    tag_expandType: \"扩展类型\",\n\n    // Inline tags\n    tag_link: \"链接\",\n    tag_label: \"标记\",\n    tag_linkcode: \"链接\",\n    tag_linkplain: \"链接\",\n    tag_include: \"包含\",\n    tag_includeCode: \"包含\",\n\n    // Modifier tags\n    tag_alpha: \"alpha\",\n    tag_beta: \"beta\",\n    tag_eventProperty: \"事件属性\",\n    tag_experimental: \"实验性\",\n    tag_internal: \"内部成员\",\n    tag_override: \"重写\",\n    tag_packageDocumentation: \"包文档\",\n    tag_public: \"公共成员\",\n    tag_readonly: \"只读\",\n    tag_sealed: \"无法继承\",\n    tag_virtual: \"虚函数\",\n    tag_abstract: \"抽象类\",\n    tag_class: \"类\",\n    tag_disableGroups: \"禁用分组\",\n    tag_enum: \"枚举\",\n    tag_event: \"事件\",\n    tag_expand: \"展开\",\n    tag_hidden: \"隐藏\",\n    tag_hideCategories: \"在类别中隐藏\",\n    tag_hideconstructor: \"隐藏构造器\",\n    tag_hideGroups: \"在分组中隐藏\",\n    tag_ignore: \"隐藏\",\n    tag_inline: \"内联\",\n    tag_interface: \"接口\",\n    tag_namespace: \"命名空间\",\n    tag_function: \"函数\",\n    tag_overload: \"重载\",\n    tag_private: \"私有成员\",\n    tag_protected: \"受保护成员\",\n    tag_showCategories: \"在类别中显示\",\n    tag_showGroups: \"在分组中显示\",\n    tag_useDeclaredType: \"使用声明类型\",\n    tag_primaryExport: \"主要导出\",\n});\n"
  },
  {
    "path": "src/lib/internationalization/translatable.ts",
    "content": "import type { blockTags, inlineTags, modifierTags } from \"../utils/options/tsdoc-defaults.js\";\nimport translatable from \"./locales/en.cjs\";\n\nexport type BuiltinTranslatableStringArgs =\n    & {\n        [K in keyof typeof translatable]: BuildTranslationArguments<\n            (typeof translatable)[K]\n        >;\n    }\n    & Record<\n        | (typeof blockTags)[number]\n        | (typeof inlineTags)[number]\n        | (typeof modifierTags)[number] extends `@${infer T}` ? `tag_${T}` :\n            never,\n        []\n    >;\n\ntype BuildTranslationArguments<\n    T extends string,\n    Acc extends any[] = [],\n> = T extends `${string}{${bigint}}${infer R}` ? BuildTranslationArguments<R, [...Acc, string]> :\n    Acc;\n\nexport type BuiltinTranslatableStringConstraints = {\n    [K in keyof BuiltinTranslatableStringArgs]: TranslationConstraint[BuiltinTranslatableStringArgs[K][\"length\"]];\n};\n\ntype BuildConstraint<\n    T extends number,\n    Acc extends string = \"\",\n    U extends number = T,\n> = [T] extends [never] ? `${Acc}${string}` :\n    T extends T ? BuildConstraint<Exclude<U, T>, `${Acc}${string}{${T}}`> :\n    never;\n\n// Combinatorially explosive, but shouldn't matter for us, since we only need a few iterations.\ntype TranslationConstraint = [\n    string,\n    BuildConstraint<0>,\n    BuildConstraint<0 | 1>,\n    BuildConstraint<0 | 1 | 2>,\n    BuildConstraint<0 | 1 | 2 | 3>,\n    BuildConstraint<0 | 1 | 2 | 3 | 4>,\n    BuildConstraint<0 | 1 | 2 | 3 | 4 | 5>,\n];\n\n// Compiler errors here which says a property is missing indicates that the value on translatable\n// is not a literal string. It should be so that TypeDoc's placeholder replacement detection\n// can validate that all placeholders have been specified.\n({}) satisfies {\n    [\n        K in keyof typeof translatable as string extends (typeof translatable)[K] ? K :\n            never\n    ]: never;\n};\n\n// Compiler errors here which says a property is missing indicates that the key on translatable\n// contains a placeholder _0/_1, etc. but the value does not match the expected constraint.\ntranslatable satisfies {\n    [K in keyof typeof translatable]: K extends `${string}_1${string}` ? TranslationConstraint[2] :\n        K extends `${string}_0${string}` ? TranslationConstraint[1] :\n        TranslationConstraint[0];\n};\n"
  },
  {
    "path": "src/lib/models/Comment.ts",
    "content": "import { assertNever, i18n, NonEnumerable, type NormalizedPath, removeIf, type TagString } from \"#utils\";\nimport type { Reflection, ReflectionId } from \"./Reflection.js\";\nimport { ReflectionSymbolId } from \"./ReflectionSymbolId.js\";\n\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport type { FileId } from \"./FileRegistry.js\";\n\n/**\n * Represents a parsed piece of a comment.\n * @category Comments\n * @see {@link JSONOutput.CommentDisplayPart}\n */\nexport type CommentDisplayPart =\n    /**\n     * Represents a plain text portion of the comment, may contain markdown\n     */\n    | { kind: \"text\"; text: string }\n    /**\n     * Represents a code block separated out form the plain text entry so\n     * that TypeDoc knows to skip it when parsing relative links and inline tags.\n     */\n    | { kind: \"code\"; text: string }\n    | InlineTagDisplayPart\n    | RelativeLinkDisplayPart;\n\n/**\n * Represents an inline tag like `{@link Foo}`\n *\n * The `@link`, `@linkcode`, and `@linkplain` tags may have a `target`\n * property set indicating which reflection/url they link to. They may also\n * have a `tsLinkText` property which includes the part of the `text` which\n * TypeScript thinks should be displayed as the link text.\n * @category Comments\n * @expand\n */\nexport interface InlineTagDisplayPart {\n    kind: \"inline-tag\";\n    tag: TagString;\n    text: string;\n    target?: Reflection | string | ReflectionSymbolId;\n    tsLinkText?: string;\n}\n\n/**\n * Represents a reference to a path relative to where the comment resides.\n * This is used to detect and copy relative image links.\n *\n * Use {@link FileRegistry} to determine what path on disc this refers to.\n *\n * This is used for relative links within comments/documents.\n * It is used to mark pieces of text which need to be replaced\n * to make links work properly.\n * @category Comments\n * @expand\n */\nexport interface RelativeLinkDisplayPart {\n    kind: \"relative-link\";\n    /**\n     * The original relative text from the parsed comment.\n     */\n    text: string;\n    /**\n     * A link to either some document outside of the project or a reflection.\n     * This may be `undefined` if the relative path does not exist.\n     */\n    target: FileId | undefined;\n    /**\n     * Anchor within the target page, validated after rendering if possible\n     */\n    targetAnchor: string | undefined;\n}\n\n/**\n * A model that represents a single TypeDoc comment tag.\n *\n * Tags are stored in the {@link Comment.blockTags} property.\n * @category Comments\n */\nexport class CommentTag {\n    /**\n     * The name of this tag, e.g. `@returns`, `@example`\n     */\n    tag: TagString;\n\n    /**\n     * Some tags, (`@typedef`, `@param`, `@property`, etc.) may have a user defined identifier associated with them.\n     * If this tag is one of those, it will be parsed out and included here.\n     */\n    name?: string;\n\n    /**\n     * Optional type annotation associated with this tag. TypeDoc will remove type annotations unless explicitly\n     * requested by the user with the `preservedTypeAnnotationTags` option.\n     */\n    typeAnnotation?: string;\n\n    /**\n     * The actual body text of this tag.\n     */\n    content: CommentDisplayPart[];\n\n    /**\n     * A flag which may be set by plugins to prevent TypeDoc from rendering this tag, if the plugin provides\n     * custom rendering. Note: This flag is **not** serialized, it is expected to be set just before the comment\n     * is rendered.\n     */\n    skipRendering = false;\n\n    /**\n     * Create a new CommentTag instance.\n     */\n    constructor(tag: TagString, text: CommentDisplayPart[]) {\n        this.tag = tag;\n        this.content = text;\n    }\n\n    /**\n     * Checks if this block tag is roughly equal to the other tag.\n     * This isn't exactly equal, but just \"roughly equal\" by the tag\n     * text.\n     */\n    similarTo(other: CommentTag) {\n        return (\n            this.tag === other.tag &&\n            this.name === other.name &&\n            Comment.combineDisplayParts(this.content) ===\n                Comment.combineDisplayParts(other.content)\n        );\n    }\n\n    clone(): CommentTag {\n        const tag = new CommentTag(\n            this.tag,\n            Comment.cloneDisplayParts(this.content),\n        );\n        if (this.name) {\n            tag.name = this.name;\n        }\n        if (this.typeAnnotation) {\n            tag.typeAnnotation = this.typeAnnotation;\n        }\n        return tag;\n    }\n\n    toObject(): JSONOutput.CommentTag {\n        return {\n            tag: this.tag,\n            name: this.name,\n            content: Comment.serializeDisplayParts(this.content),\n            typeAnnotation: this.typeAnnotation,\n        };\n    }\n\n    fromObject(de: Deserializer, obj: JSONOutput.CommentTag) {\n        // tag already set by Comment.fromObject\n        this.name = obj.name;\n        this.typeAnnotation = obj.typeAnnotation;\n        this.content = Comment.deserializeDisplayParts(de, obj.content);\n    }\n}\n\n/**\n * A model that represents a comment.\n *\n * Instances of this model are created by the CommentPlugin. You can retrieve comments\n * through the {@link DeclarationReflection.comment} property.\n * @category Comments\n */\nexport class Comment {\n    /**\n     * Debugging utility for combining parts into a simple string. Not suitable for\n     * rendering, but can be useful in tests.\n     */\n    static combineDisplayParts(\n        parts: readonly CommentDisplayPart[] | undefined,\n    ): string {\n        let result = \"\";\n\n        for (const item of parts || []) {\n            switch (item.kind) {\n                case \"text\":\n                case \"code\":\n                case \"relative-link\":\n                    result += item.text;\n                    break;\n                case \"inline-tag\":\n                    result += `{${item.tag} ${item.text}}`;\n                    break;\n                default:\n                    assertNever(item);\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Helper utility to clone {@link Comment#summary} or {@link CommentTag#content}\n     */\n    static cloneDisplayParts(\n        parts: readonly CommentDisplayPart[],\n    ): CommentDisplayPart[] {\n        return parts.map((p) => ({ ...p }));\n    }\n\n    // Since display parts are plain objects, this lives here\n    static serializeDisplayParts(\n        parts: CommentDisplayPart[],\n    ): JSONOutput.CommentDisplayPart[];\n    /** @hidden no point in showing this signature in api docs */\n    static serializeDisplayParts(\n        parts: CommentDisplayPart[] | undefined,\n    ): JSONOutput.CommentDisplayPart[] | undefined;\n    static serializeDisplayParts(\n        parts: CommentDisplayPart[] | undefined,\n    ): JSONOutput.CommentDisplayPart[] | undefined {\n        return parts?.map((part) => {\n            switch (part.kind) {\n                case \"text\":\n                case \"code\":\n                    return { ...part };\n                case \"inline-tag\": {\n                    let target: JSONOutput.InlineTagDisplayPart[\"target\"];\n                    if (typeof part.target === \"string\") {\n                        target = part.target;\n                    } else if (part.target) {\n                        if (\"id\" in part.target) {\n                            target = part.target.id;\n                        } else {\n                            target = part.target.toObject();\n                        }\n                    }\n                    return {\n                        ...part,\n                        target,\n                    };\n                }\n                case \"relative-link\": {\n                    return {\n                        ...part,\n                    } satisfies JSONOutput.CommentDisplayPart;\n                }\n            }\n        });\n    }\n\n    // Since display parts are plain objects, this lives here\n    static deserializeDisplayParts(\n        de: Deserializer,\n        parts: JSONOutput.CommentDisplayPart[],\n    ): CommentDisplayPart[] {\n        const links: [\n            ReflectionId,\n            InlineTagDisplayPart | RelativeLinkDisplayPart,\n        ][] = [];\n        const files: [FileId, RelativeLinkDisplayPart][] = [];\n\n        const result = parts.map((part): CommentDisplayPart => {\n            switch (part.kind) {\n                case \"text\":\n                case \"code\":\n                    return { ...part };\n                case \"inline-tag\": {\n                    if (typeof part.target === \"number\") {\n                        const part2 = {\n                            kind: part.kind,\n                            tag: part.tag,\n                            text: part.text,\n                            target: undefined,\n                            tsLinkText: part.tsLinkText,\n                        } satisfies InlineTagDisplayPart;\n                        links.push([part.target, part2]);\n                        return part2;\n                    } else if (\n                        typeof part.target === \"string\" ||\n                        part.target === undefined\n                    ) {\n                        return {\n                            kind: \"inline-tag\",\n                            tag: part.tag,\n                            text: part.text,\n                            target: part.target,\n                            tsLinkText: part.tsLinkText,\n                        } satisfies InlineTagDisplayPart;\n                    } else if (typeof part.target === \"object\") {\n                        return {\n                            kind: \"inline-tag\",\n                            tag: part.tag,\n                            text: part.text,\n                            target: new ReflectionSymbolId(part.target),\n                            tsLinkText: part.tsLinkText,\n                        } satisfies InlineTagDisplayPart;\n                    } else {\n                        assertNever(part.target);\n                    }\n                    break;\n                }\n                case \"relative-link\": {\n                    if (part.target) {\n                        const part2 = {\n                            kind: \"relative-link\",\n                            text: part.text,\n                            target: null!,\n                            targetAnchor: part.targetAnchor,\n                        } satisfies RelativeLinkDisplayPart;\n                        files.push([part.target, part2]);\n                        return part2;\n                    }\n                    return {\n                        ...part,\n                        target: undefined,\n                        targetAnchor: part.targetAnchor,\n                    };\n                }\n            }\n        });\n\n        if (links.length || files.length) {\n            de.defer((project) => {\n                for (const [oldFileId, part] of files) {\n                    part.target = de.oldFileIdToNewFileId[oldFileId];\n                }\n                for (const [oldId, part] of links) {\n                    part.target = project.getReflectionById(\n                        de.oldIdToNewId[oldId] ?? -1,\n                    );\n                    if (!part.target) {\n                        de.logger.warn(\n                            i18n.serialized_project_referenced_0_not_part_of_project(\n                                oldId.toString(),\n                            ),\n                        );\n                    }\n                }\n            });\n        }\n\n        return result;\n    }\n\n    /**\n     * Splits the provided parts into a header (first line, as a string)\n     * and body (remaining lines). If the header line contains inline tags\n     * they will be serialized to a string.\n     */\n    static splitPartsToHeaderAndBody(parts: readonly CommentDisplayPart[]): {\n        header: string;\n        body: CommentDisplayPart[];\n    } {\n        let index = parts.findIndex((part): boolean => {\n            switch (part.kind) {\n                case \"text\":\n                case \"code\":\n                    return part.text.includes(\"\\n\");\n                case \"inline-tag\":\n                case \"relative-link\":\n                    return false;\n            }\n        });\n\n        if (index === -1) {\n            return {\n                header: Comment.combineDisplayParts(parts),\n                body: [],\n            };\n        }\n\n        // Do not split a code block, stop the header at the end of the previous block\n        if (parts[index].kind === \"code\") {\n            --index;\n        }\n\n        if (index === -1) {\n            return { header: \"\", body: Comment.cloneDisplayParts(parts) };\n        }\n\n        let header = Comment.combineDisplayParts(parts.slice(0, index));\n        const split = parts[index].text.indexOf(\"\\n\");\n\n        let body: CommentDisplayPart[];\n        if (split === -1) {\n            header += parts[index].text;\n            body = Comment.cloneDisplayParts(parts.slice(index + 1));\n        } else {\n            header += parts[index].text.substring(0, split);\n            body = Comment.cloneDisplayParts(parts.slice(index));\n            body[0].text = body[0].text.substring(split + 1);\n        }\n\n        if (!body[0].text) {\n            body.shift();\n        }\n\n        return { header: header.trim(), body };\n    }\n\n    /**\n     * The content of the comment which is not associated with a block tag.\n     */\n    summary: CommentDisplayPart[];\n\n    /**\n     * All associated block level tags.\n     */\n    blockTags: CommentTag[] = [];\n\n    /**\n     * All modifier tags present on the comment, e.g. `@alpha`, `@beta`.\n     */\n    modifierTags: Set<TagString> = new Set();\n\n    /**\n     * Label associated with this reflection, if any (https://tsdoc.org/pages/tags/label/)\n     */\n    label?: string;\n\n    /**\n     * Full path to the file where this comment originated from, if any.\n     * This field will not be serialized, so will not be present when handling JSON-revived reflections.\n     *\n     * Note: This field is non-enumerable to make testing comment contents with `deepEqual` easier.\n     */\n    @NonEnumerable\n    sourcePath?: NormalizedPath;\n\n    /**\n     * Internal discovery ID used to prevent symbol comments from\n     * being duplicated on signatures. Only set when the comment was created\n     * from a `ts.CommentRange`.\n     * @internal\n     */\n    @NonEnumerable\n    discoveryId?: number;\n\n    /**\n     * If the comment was inherited from a different \"parent\" declaration\n     * (see #2545), then it is desirable to know this as any `@param` tags\n     * which do not apply should not cause warnings. This is not serialized,\n     * and only set when the comment was created from a `ts.CommentRange`.\n     */\n    @NonEnumerable\n    inheritedFromParentDeclaration?: boolean;\n\n    /**\n     * Creates a new Comment instance.\n     */\n    constructor(\n        summary: CommentDisplayPart[] = [],\n        blockTags: CommentTag[] = [],\n        modifierTags: Set<TagString> = new Set(),\n    ) {\n        this.summary = summary;\n        this.blockTags = blockTags;\n        this.modifierTags = modifierTags;\n        extractLabelTag(this);\n    }\n\n    /**\n     * Gets either the `@summary` tag, or a short version of the comment summary\n     * section for rendering in module/namespace pages.\n     */\n    getShortSummary(useFirstParagraph: boolean): readonly CommentDisplayPart[] {\n        const tag = this.getTag(\"@summary\");\n        if (tag) return tag.content;\n        if (!useFirstParagraph) return [];\n\n        let partsEnd = this.summary.findIndex((part) => {\n            switch (part.kind) {\n                case \"text\":\n                    return part.text.includes(\"\\n\\n\");\n                case \"code\":\n                    return part.text.includes(\"\\n\");\n                case \"inline-tag\":\n                case \"relative-link\":\n                    return false;\n                default:\n                    assertNever(part);\n            }\n        });\n        const foundEnd = partsEnd !== -1;\n        if (partsEnd === -1) {\n            partsEnd = this.summary.length - 1;\n        }\n\n        const summaryParts = this.summary.slice(0, partsEnd);\n\n        if (partsEnd !== -1) {\n            const text = this.summary[partsEnd].text;\n            const paragraphEnd = text.indexOf(\"\\n\\n\");\n            if (paragraphEnd !== -1) {\n                summaryParts.push({\n                    ...this.summary[partsEnd],\n                    text: text.slice(0, paragraphEnd),\n                });\n            } else if (!foundEnd) {\n                summaryParts.push(this.summary[partsEnd]);\n            }\n        }\n\n        return summaryParts;\n    }\n\n    /**\n     * Checks if this comment is roughly equal to the other comment.\n     * This isn't exactly equal, but just \"roughly equal\" by the comment\n     * text.\n     */\n    similarTo(other: Comment): boolean {\n        if (\n            Comment.combineDisplayParts(this.summary) !==\n                Comment.combineDisplayParts(other.summary)\n        ) {\n            return false;\n        }\n\n        // Ignore modifier tags, as they could cause false negatives\n        // if a cascaded modifier tag is present in one comment but not the other.\n\n        if (this.blockTags.length !== other.blockTags.length) {\n            return false;\n        }\n\n        for (let i = 0; i < this.blockTags.length; ++i) {\n            if (!this.blockTags[i].similarTo(other.blockTags[i])) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Create a deep clone of this comment.\n     */\n    clone() {\n        const comment = new Comment(\n            Comment.cloneDisplayParts(this.summary),\n            this.blockTags.map((tag) => tag.clone()),\n            new Set(this.modifierTags),\n        );\n        comment.discoveryId = this.discoveryId;\n        comment.sourcePath = this.sourcePath;\n        comment.inheritedFromParentDeclaration = this.inheritedFromParentDeclaration;\n        return comment;\n    }\n\n    /**\n     * Returns true if this comment is completely empty.\n     * @internal\n     */\n    isEmpty() {\n        return !this.hasVisibleComponent() && this.modifierTags.size === 0;\n    }\n\n    /**\n     * Checks if this comment contains any visible text.\n     *\n     * @returns TRUE when this reflection has a visible comment.\n     */\n    hasVisibleComponent(notRenderedTags?: readonly TagString[]): boolean {\n        if (this.summary.some((x) => x.kind !== \"text\" || x.text !== \"\")) {\n            return true;\n        }\n\n        if (notRenderedTags) {\n            return this.blockTags.some(tag => !notRenderedTags.includes(tag.tag));\n        } else {\n            return this.blockTags.length > 0;\n        }\n    }\n\n    /**\n     * Test whether this comment contains a tag with the given name.\n     *\n     * @param tagName  The name of the tag to look for.\n     * @returns TRUE when this comment contains a tag with the given name, otherwise FALSE.\n     */\n    hasModifier(tagName: TagString): boolean {\n        return this.modifierTags.has(tagName);\n    }\n\n    removeModifier(tagName: TagString) {\n        this.modifierTags.delete(tagName);\n    }\n\n    /**\n     * Return the first tag with the given name.\n     *\n     * @param tagName  The name of the tag to look for.\n     * @returns The found tag or undefined.\n     */\n    getTag(tagName: TagString): CommentTag | undefined {\n        return this.blockTags.find((tag) => tag.tag === tagName);\n    }\n\n    /**\n     * Get all tags with the given tag name.\n     */\n    getTags(tagName: TagString): CommentTag[] {\n        return this.blockTags.filter((tag) => tag.tag === tagName);\n    }\n\n    getIdentifiedTag(identifier: string, tagName: TagString) {\n        return this.blockTags.find(\n            (tag) => tag.tag === tagName && tag.name === identifier,\n        );\n    }\n\n    /**\n     * Removes all block tags with the given tag name from the comment.\n     * @param tagName\n     */\n    removeTags(tagName: TagString) {\n        removeIf(this.blockTags, (tag) => tag.tag === tagName);\n    }\n\n    toObject(serializer: Serializer): JSONOutput.Comment {\n        return {\n            summary: Comment.serializeDisplayParts(this.summary),\n            blockTags: serializer.toObjectsOptional(this.blockTags),\n            modifierTags: this.modifierTags.size > 0\n                ? Array.from(this.modifierTags)\n                : undefined,\n            label: this.label,\n        };\n    }\n\n    fromObject(de: Deserializer, obj: JSONOutput.Comment) {\n        this.summary = Comment.deserializeDisplayParts(de, obj.summary);\n        this.blockTags = obj.blockTags?.map((tagObj) => {\n            const tag = new CommentTag(tagObj.tag, []);\n            de.fromObject(tag, tagObj);\n            return tag;\n        }) || [];\n        this.modifierTags = new Set(obj.modifierTags);\n        this.label = obj.label;\n    }\n}\n\nfunction extractLabelTag(comment: Comment) {\n    const index = comment.summary.findIndex(\n        (part) => part.kind === \"inline-tag\" && part.tag === \"@label\",\n    );\n\n    if (index !== -1) {\n        comment.label = comment.summary.splice(index, 1)[0].text;\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ContainerReflection.ts",
    "content": "import { Reflection, type TraverseCallback, TraverseProperty } from \"./Reflection.js\";\nimport { ReflectionCategory } from \"./ReflectionCategory.js\";\nimport { ReflectionGroup } from \"./ReflectionGroup.js\";\nimport { ReflectionKind } from \"./kind.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport type { DocumentReflection } from \"./DocumentReflection.js\";\nimport type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport { assertNever, removeIfPresent } from \"#utils\";\n\n/**\n * @category Reflections\n */\nexport abstract class ContainerReflection extends Reflection {\n    /**\n     * The children of this reflection. Do not add reflections to this array\n     * manually. Instead call {@link addChild}.\n     */\n    children?: Array<DeclarationReflection>;\n\n    /**\n     * Documents associated with this reflection.\n     *\n     * These are not children as including them as children requires code handle both\n     * types, despite being mostly unrelated and handled separately.\n     *\n     * Including them here in a separate array neatly handles that problem, but also\n     * introduces another one for rendering. When rendering, documents should really\n     * actually be considered part of the \"children\" of a reflection. For this reason,\n     * we also maintain a list of child declarations with child documents which is used\n     * when rendering.\n     */\n    documents?: Array<DocumentReflection>;\n\n    /**\n     * Union of the {@link children} and {@link documents} arrays which dictates the\n     * sort order for rendering.\n     */\n    childrenIncludingDocuments?: Array<\n        DeclarationReflection | DocumentReflection\n    >;\n\n    /**\n     * All children grouped by their kind.\n     */\n    groups?: ReflectionGroup[];\n\n    /**\n     * All children grouped by their category.\n     */\n    categories?: ReflectionCategory[];\n\n    /**\n     * Return a list of all children of a certain kind.\n     *\n     * @param kind  The desired kind of children.\n     * @returns     An array containing all children with the desired kind.\n     */\n    getChildrenByKind(kind: ReflectionKind): DeclarationReflection[] {\n        return (this.children || []).filter((child) => child.kindOf(kind));\n    }\n\n    addChild(child: Reflection) {\n        if (child.isDeclaration()) {\n            this.children ||= [];\n            this.children.push(child);\n\n            this.childrenIncludingDocuments ||= [];\n            this.childrenIncludingDocuments.push(child);\n        } else if (child.isDocument()) {\n            this.documents ||= [];\n            this.documents.push(child);\n\n            this.childrenIncludingDocuments ||= [];\n            this.childrenIncludingDocuments.push(child);\n        } else if (this.isDeclaration() && child.isSignature()) {\n            switch (child.kind) {\n                case ReflectionKind.CallSignature:\n                case ReflectionKind.ConstructorSignature:\n                    this.signatures ||= [];\n                    this.signatures.push(child);\n                    break;\n                case ReflectionKind.IndexSignature:\n                    this.indexSignatures ||= [];\n                    this.indexSignatures.push(child);\n                    break;\n                case ReflectionKind.GetSignature:\n                case ReflectionKind.SetSignature:\n                    throw new Error(\"Unsupported child type: \" + ReflectionKind[child.kind]);\n                default:\n                    assertNever(child.kind);\n            }\n        } else {\n            throw new Error(\"Unsupported child type: \" + ReflectionKind[child.kind]);\n        }\n    }\n\n    removeChild(child: DeclarationReflection | DocumentReflection) {\n        if (child.isDeclaration()) {\n            removeIfPresent(this.children, child);\n            if (this.children?.length === 0) {\n                delete this.children;\n            }\n        } else {\n            removeIfPresent(this.documents, child);\n            if (this.documents?.length === 0) {\n                delete this.documents;\n            }\n        }\n\n        removeIfPresent(this.childrenIncludingDocuments, child);\n        if (this.childrenIncludingDocuments?.length === 0) {\n            delete this.childrenIncludingDocuments;\n        }\n    }\n\n    override isContainer(): this is ContainerReflection {\n        return true;\n    }\n\n    override traverse(callback: TraverseCallback) {\n        for (const child of this.children?.slice() || []) {\n            if (callback(child, TraverseProperty.Children) === false) {\n                return;\n            }\n        }\n\n        for (const child of this.documents?.slice() || []) {\n            if (callback(child, TraverseProperty.Documents) === false) {\n                return;\n            }\n        }\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ContainerReflection {\n        return {\n            ...super.toObject(serializer),\n            children: serializer.toObjectsOptional(this.children),\n            documents: serializer.toObjectsOptional(this.documents),\n            // If we only have one type of child, don't bother writing the duplicate info about\n            // ordering with documents to the serialized file.\n            childrenIncludingDocuments: this.children?.length && this.documents?.length\n                ? this.childrenIncludingDocuments?.map((refl) => refl.id)\n                : undefined,\n            groups: serializer.toObjectsOptional(this.groups),\n            categories: serializer.toObjectsOptional(this.categories),\n        };\n    }\n\n    override fromObject(de: Deserializer, obj: JSONOutput.ContainerReflection) {\n        super.fromObject(de, obj);\n        this.children = de.reviveMany(obj.children, (child) => de.constructReflection(child));\n        this.documents = de.reviveMany(obj.documents, (child) => de.constructReflection(child));\n\n        const byId = new Map<\n            number,\n            DeclarationReflection | DocumentReflection\n        >();\n        for (const child of this.children || []) {\n            byId.set(child.id, child);\n        }\n        for (const child of this.documents || []) {\n            byId.set(child.id, child);\n        }\n        for (const id of obj.childrenIncludingDocuments || []) {\n            const child = byId.get(de.oldIdToNewId[id] ?? -1);\n            if (child) {\n                this.childrenIncludingDocuments ||= [];\n                this.childrenIncludingDocuments.push(child);\n                byId.delete(de.oldIdToNewId[id] ?? -1);\n            }\n        }\n        if (byId.size) {\n            // Anything left in byId wasn't included in the childrenIncludingDocuments array.\n            this.childrenIncludingDocuments ||= [];\n            this.childrenIncludingDocuments.push(...byId.values());\n        }\n\n        this.groups = de.reviveMany(\n            obj.groups,\n            (group) => new ReflectionGroup(group.title, this),\n        );\n        this.categories = de.reviveMany(\n            obj.categories,\n            (cat) => new ReflectionCategory(cat.title),\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/models/DeclarationReflection.ts",
    "content": "import { type ReferenceType, ReflectionType, type SomeType } from \"./types.js\";\nimport { type ReflectionId, type TraverseCallback, TraverseProperty } from \"./Reflection.js\";\nimport { ContainerReflection } from \"./ContainerReflection.js\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\nimport type { TypeParameterReflection } from \"./TypeParameterReflection.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport { Comment, type CommentDisplayPart } from \"./Comment.js\";\nimport { SourceReference } from \"./SourceReference.js\";\nimport { ReflectionSymbolId } from \"./ReflectionSymbolId.js\";\nimport { ReflectionKind } from \"./kind.js\";\nimport { i18n } from \"#utils\";\n\n/**\n * Stores hierarchical type data.\n *\n * @see {@link DeclarationReflection.typeHierarchy}\n */\nexport interface DeclarationHierarchy {\n    /**\n     * The types represented by this node in the hierarchy.\n     */\n    types: SomeType[];\n\n    /**\n     * The next hierarchy level.\n     */\n    next?: DeclarationHierarchy;\n\n    /**\n     * Is this the entry containing the target type?\n     */\n    isTarget?: boolean;\n}\n\n/**\n * A reflection that represents a single declaration emitted by the TypeScript compiler.\n *\n * All parts of a project are represented by DeclarationReflection instances. The actual\n * kind of a reflection is stored in its `kind` member.\n * @category Reflections\n */\nexport class DeclarationReflection extends ContainerReflection {\n    readonly variant = \"declaration\" as \"declaration\" | \"reference\";\n\n    /**\n     * A list of all source files that contributed to this reflection.\n     */\n    sources?: SourceReference[];\n\n    /**\n     * Precomputed boost for search results, may be less than 1 to de-emphasize this member in search results.\n     * Does NOT include group/category values as they are computed when building the JS index.\n     *\n     * This is exposed purely for plugin use, see #3036 for details.\n     */\n    relevanceBoost?: number;\n\n    /**\n     * The escaped name of this declaration assigned by the TS compiler if there is an associated symbol.\n     * This is used to retrieve properties for analyzing inherited members.\n     *\n     * Not serialized, only useful during conversion. This is a `ts.__String`.\n     * @internal\n     */\n    escapedName?: string;\n\n    /**\n     * The type of the reflection.\n     *\n     * If the reflection represents a variable or a property, this is the value type.<br />\n     * If the reflection represents a signature, this is the return type.\n     */\n    type?: SomeType;\n\n    typeParameters?: TypeParameterReflection[];\n\n    /**\n     * A list of call signatures attached to this declaration.\n     *\n     * TypeDoc creates one declaration per function that may contain one or more\n     * signature reflections.\n     */\n    signatures?: SignatureReflection[];\n\n    /**\n     * The index signature of this declaration.\n     */\n    indexSignatures?: SignatureReflection[];\n\n    /**\n     * The get signature of this declaration.\n     */\n    getSignature?: SignatureReflection;\n\n    /**\n     * The set signature of this declaration.\n     */\n    setSignature?: SignatureReflection;\n\n    /**\n     * The default value of this reflection.\n     *\n     * Applies to function parameters, variables, and properties.\n     */\n    defaultValue?: string;\n\n    /**\n     * A type that points to the reflection that has been overwritten by this reflection.\n     *\n     * Applies to interface and class members.\n     */\n    overwrites?: ReferenceType;\n\n    /**\n     * A type that points to the reflection this reflection has been inherited from.\n     *\n     * Applies to interface and class members.\n     */\n    inheritedFrom?: ReferenceType;\n\n    /**\n     * A type that points to the reflection this reflection is the implementation of.\n     *\n     * Applies to class members.\n     */\n    implementationOf?: ReferenceType;\n\n    /**\n     * A list of all types this reflection extends (e.g. the parent classes).\n     */\n    extendedTypes?: SomeType[];\n\n    /**\n     * A list of all types that extend this reflection (e.g. the subclasses).\n     */\n    extendedBy?: ReferenceType[];\n\n    /**\n     * A list of all types this reflection implements.\n     */\n    implementedTypes?: SomeType[];\n\n    /**\n     * A list of all types that implement this reflection.\n     */\n    implementedBy?: ReferenceType[];\n\n    /**\n     * Contains a simplified representation of the type hierarchy suitable for being\n     * rendered in templates.\n     */\n    typeHierarchy?: DeclarationHierarchy;\n\n    /**\n     * The contents of the readme file of the module when found.\n     */\n    readme?: CommentDisplayPart[];\n\n    /**\n     * The version of the module when found.\n     */\n    packageVersion?: string;\n\n    override isDeclaration(): this is DeclarationReflection {\n        return true;\n    }\n\n    override hasGetterOrSetter(): boolean {\n        return !!this.getSignature || !!this.setSignature;\n    }\n\n    getAllSignatures(): SignatureReflection[] {\n        let result: SignatureReflection[] = [];\n\n        if (this.signatures) {\n            result = result.concat(this.signatures);\n        }\n        if (this.indexSignatures) {\n            result = result.concat(this.indexSignatures);\n        }\n        if (this.getSignature) {\n            result.push(this.getSignature);\n        }\n        if (this.setSignature) {\n            result.push(this.setSignature);\n        }\n\n        return result;\n    }\n\n    getNonIndexSignatures(): SignatureReflection[] {\n        return ([] as SignatureReflection[]).concat(\n            this.signatures ?? [],\n            this.setSignature ?? [],\n            this.getSignature ?? [],\n        );\n    }\n\n    getProperties(): DeclarationReflection[] {\n        if (this.children?.length) {\n            return this.children;\n        }\n\n        if (this.type?.type === \"reflection\") {\n            return this.type.declaration.children ?? [];\n        }\n        return [];\n    }\n\n    getChildOrTypePropertyByName(\n        path: string[],\n    ): DeclarationReflection | undefined {\n        if (this.type?.type === \"reflection\") {\n            for (const child of this.type.declaration.children || []) {\n                if (path[0] === child.name) {\n                    if (path.length === 1) {\n                        return child;\n                    }\n                    return child.getChildOrTypePropertyByName(path.slice(1));\n                }\n            }\n        }\n\n        for (const child of this.children || []) {\n            if (path[0] === child.name) {\n                if (path.length === 1) {\n                    return child;\n                }\n                return child.getChildOrTypePropertyByName(path.slice(1));\n            }\n        }\n\n        return undefined;\n    }\n\n    override traverse(callback: TraverseCallback) {\n        for (const parameter of this.typeParameters?.slice() || []) {\n            if (callback(parameter, TraverseProperty.TypeParameter) === false) {\n                return;\n            }\n        }\n\n        if (this.type instanceof ReflectionType) {\n            if (\n                callback(\n                    this.type.declaration,\n                    TraverseProperty.TypeLiteral,\n                ) === false\n            ) {\n                return;\n            }\n        }\n\n        for (const signature of this.signatures?.slice() || []) {\n            if (callback(signature, TraverseProperty.Signatures) === false) {\n                return;\n            }\n        }\n\n        for (const signature of this.indexSignatures?.slice() || []) {\n            if (\n                callback(signature, TraverseProperty.IndexSignature) === false\n            ) {\n                return;\n            }\n        }\n\n        if (this.getSignature) {\n            if (\n                callback(this.getSignature, TraverseProperty.GetSignature) ===\n                    false\n            ) {\n                return;\n            }\n        }\n\n        if (this.setSignature) {\n            if (\n                callback(this.setSignature, TraverseProperty.SetSignature) ===\n                    false\n            ) {\n                return;\n            }\n        }\n\n        super.traverse(callback);\n    }\n\n    /**\n     * Return a string representation of this reflection.\n     */\n    override toString(): string {\n        let result = super.toString();\n\n        if (this.typeParameters) {\n            const parameters: string[] = this.typeParameters.map(\n                (parameter) => parameter.name,\n            );\n            result += \"<\" + parameters.join(\", \") + \">\";\n        }\n\n        if (this.type) {\n            result += \": \" + this.type.toString();\n        }\n\n        return result;\n    }\n\n    override toObject(\n        serializer: Serializer,\n    ): JSONOutput.DeclarationReflection {\n        return {\n            ...super.toObject(serializer),\n            variant: this.variant,\n            packageVersion: this.packageVersion,\n            sources: serializer.toObjectsOptional(this.sources),\n            relevanceBoost: this.relevanceBoost === 1 ? undefined : this.relevanceBoost,\n            typeParameters: serializer.toObjectsOptional(this.typeParameters),\n            type: serializer.toObject(this.type),\n            signatures: serializer.toObjectsOptional(this.signatures),\n            indexSignatures: serializer.toObjectsOptional(this.indexSignatures),\n            getSignature: serializer.toObject(this.getSignature),\n            setSignature: serializer.toObject(this.setSignature),\n            defaultValue: this.defaultValue,\n            overwrites: serializer.toObject(this.overwrites),\n            inheritedFrom: serializer.toObject(this.inheritedFrom),\n            implementationOf: serializer.toObject(this.implementationOf),\n            extendedTypes: serializer.toObjectsOptional(this.extendedTypes),\n            extendedBy: serializer.toObjectsOptional(this.extendedBy),\n            implementedTypes: serializer.toObjectsOptional(\n                this.implementedTypes,\n            ),\n            implementedBy: serializer.toObjectsOptional(this.implementedBy),\n            readme: Comment.serializeDisplayParts(this.readme),\n        };\n    }\n\n    override fromObject(\n        de: Deserializer,\n        obj: JSONOutput.DeclarationReflection | JSONOutput.ProjectReflection,\n    ): void {\n        super.fromObject(de, obj);\n\n        if (obj.readme) {\n            this.readme = Comment.deserializeDisplayParts(de, obj.readme);\n        }\n\n        // This happens when merging multiple projects together.\n        // If updating this, also check ProjectReflection.fromObject.\n        if (obj.variant === \"project\") {\n            this.kind = ReflectionKind.Module;\n            this.packageVersion = obj.packageVersion;\n            this.project.files.fromObject(de, obj.files || {});\n\n            de.defer(() => {\n                for (const [id, sid] of Object.entries(obj.symbolIdMap || {})) {\n                    const refl = this.project.getReflectionById(\n                        de.oldIdToNewId[+id as ReflectionId] ?? -1,\n                    );\n                    if (refl) {\n                        this.project.registerSymbolId(\n                            refl,\n                            new ReflectionSymbolId(sid),\n                        );\n                    } else {\n                        de.logger.warn(i18n.serialized_project_referenced_0_not_part_of_project(id));\n                    }\n                }\n            });\n            return;\n        }\n\n        this.packageVersion = obj.packageVersion;\n        this.sources = de.reviveMany(\n            obj.sources,\n            (src) => new SourceReference(src.fileName, src.line, src.character),\n        );\n        this.relevanceBoost = obj.relevanceBoost;\n\n        this.typeParameters = de.reviveMany(obj.typeParameters, (tp) => de.constructReflection(tp));\n        this.type = de.revive(obj.type, (t) => de.constructType(t));\n        this.signatures = de.reviveMany(obj.signatures, (r) => de.constructReflection(r));\n\n        this.indexSignatures = de.reviveMany(obj.indexSignatures, (r) => de.constructReflection(r));\n        this.getSignature = de.revive(obj.getSignature, (r) => de.constructReflection(r));\n        this.setSignature = de.revive(obj.setSignature, (r) => de.constructReflection(r));\n        this.defaultValue = obj.defaultValue;\n        this.overwrites = de.reviveType(obj.overwrites);\n        this.inheritedFrom = de.reviveType(obj.inheritedFrom);\n        this.implementationOf = de.reviveType(obj.implementationOf);\n        this.extendedTypes = de.reviveMany(obj.extendedTypes, (t) => de.reviveType(t));\n        this.extendedBy = de.reviveMany(obj.extendedBy, (t) => de.reviveType(t));\n        this.implementedTypes = de.reviveMany(obj.implementedTypes, (t) => de.reviveType(t));\n        this.implementedBy = de.reviveMany(obj.implementedBy, (t) => de.reviveType(t));\n    }\n}\n"
  },
  {
    "path": "src/lib/models/DocumentReflection.ts",
    "content": "import type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport { Comment, type CommentDisplayPart } from \"./Comment.js\";\nimport { Reflection, type TraverseCallback, TraverseProperty } from \"./Reflection.js\";\nimport { ReflectionKind } from \"./kind.js\";\n\n/**\n * Non-TS reflection type which is used to represent markdown documents included in the docs.\n */\nexport class DocumentReflection extends Reflection {\n    override readonly variant = \"document\";\n\n    /**\n     * The content to be displayed on the page for this reflection.\n     */\n    content: CommentDisplayPart[];\n\n    /**\n     * Frontmatter included in document\n     */\n    frontmatter: Record<string, unknown>;\n\n    /**\n     * A precomputed boost derived from the searchCategoryBoosts and searchGroupBoosts options, used when\n     * boosting search relevance scores at runtime. May be modified by plugins.\n     */\n    relevanceBoost?: number;\n\n    /**\n     * Child documents, if any are present.\n     */\n    children?: DocumentReflection[];\n\n    constructor(\n        name: string,\n        parent: Reflection,\n        content: CommentDisplayPart[],\n        frontmatter: Record<string, unknown>,\n    ) {\n        super(name, ReflectionKind.Document, parent);\n        this.content = content;\n        this.frontmatter = frontmatter;\n\n        if (typeof frontmatter[\"title\"] === \"string\") {\n            this.name = frontmatter[\"title\"];\n            delete frontmatter[\"title\"];\n        }\n    }\n\n    addChild(child: DocumentReflection) {\n        this.children ||= [];\n        this.children.push(child);\n    }\n\n    override isDocument(): this is DocumentReflection {\n        return true;\n    }\n\n    override traverse(callback: TraverseCallback): void {\n        for (const child of this.children || []) {\n            if (callback(child, TraverseProperty.Documents) === false) {\n                return;\n            }\n        }\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.DocumentReflection {\n        return {\n            ...super.toObject(serializer),\n            variant: this.variant,\n            content: Comment.serializeDisplayParts(this.content),\n            frontmatter: this.frontmatter,\n            relevanceBoost: this.relevanceBoost,\n            children: serializer.toObjectsOptional(this.children),\n        };\n    }\n\n    override fromObject(de: Deserializer, obj: JSONOutput.DocumentReflection) {\n        super.fromObject(de, obj);\n        this.content = Comment.deserializeDisplayParts(de, obj.content);\n        this.frontmatter = obj.frontmatter;\n        this.relevanceBoost = obj.relevanceBoost;\n        this.children = de.reviveMany(obj.children, (obj) => de.constructReflection(obj));\n    }\n}\n"
  },
  {
    "path": "src/lib/models/FileRegistry.ts",
    "content": "import type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport type { ProjectReflection, Reflection } from \"./index.js\";\nimport type { ReflectionId } from \"./Reflection.js\";\nimport { type NormalizedPath, NormalizedPathUtils } from \"#utils\";\n\nexport type FileId = number & { __mediaIdBrand: never };\n\nexport class FileRegistry {\n    protected nextId = 1;\n\n    // The combination of these two make up the registry\n    protected mediaToReflection = new Map<FileId, ReflectionId>();\n    protected mediaToPath = new Map<FileId, NormalizedPath>();\n\n    protected reflectionToPath = new Map<ReflectionId, NormalizedPath>();\n    protected pathToMedia = new Map<NormalizedPath, FileId>();\n\n    // Lazily created as we get names for rendering\n    protected names = new Map<FileId, string>();\n    protected nameUsage = new Map<string, number>();\n\n    registerAbsolute(absolute: NormalizedPath): {\n        target: FileId;\n        anchor: string | undefined;\n    } {\n        const anchorIndex = absolute.indexOf(\"#\");\n        let anchor: string | undefined = undefined;\n        if (anchorIndex !== -1) {\n            anchor = absolute.substring(anchorIndex + 1);\n            absolute = absolute.substring(0, anchorIndex) as NormalizedPath;\n        }\n\n        const existing = this.pathToMedia.get(absolute);\n        if (existing) {\n            return { target: existing, anchor };\n        }\n\n        this.mediaToPath.set(this.nextId as FileId, absolute);\n        this.pathToMedia.set(absolute, this.nextId as FileId);\n\n        return { target: this.nextId++ as FileId, anchor };\n    }\n\n    /**\n     * Registers the specified path as the canonical file for this reflection\n     */\n    registerReflection(absolute: NormalizedPath, reflection: Reflection) {\n        const { target } = this.registerAbsolute(absolute);\n        this.reflectionToPath.set(reflection.id, absolute);\n        this.mediaToReflection.set(target, reflection.id);\n    }\n\n    /**\n     * Registers the specified path as a path which should be resolved to the specified\n     * reflection. A reflection *may* be associated with multiple paths.\n     */\n    registerReflectionPath(absolute: NormalizedPath, reflection: Reflection) {\n        const { target } = this.registerAbsolute(absolute);\n        this.mediaToReflection.set(target, reflection.id);\n    }\n\n    getReflectionPath(reflection: Reflection): string | undefined {\n        return this.reflectionToPath.get(reflection.id);\n    }\n\n    register(\n        sourcePath: NormalizedPath,\n        relativePath: NormalizedPath,\n    ): { target: FileId; anchor: string | undefined } | undefined {\n        return this.registerAbsolute(\n            NormalizedPathUtils.resolve(NormalizedPathUtils.dirname(sourcePath), relativePath),\n        );\n    }\n\n    removeReflection(reflection: Reflection): void {\n        const absolute = this.reflectionToPath.get(reflection.id);\n        if (absolute) {\n            const media = this.pathToMedia.get(absolute)!;\n            this.mediaToReflection.delete(media);\n        }\n    }\n\n    resolve(\n        id: FileId,\n        project: ProjectReflection,\n    ): string | Reflection | undefined {\n        const reflId = this.mediaToReflection.get(id);\n        if (typeof reflId === \"number\") {\n            return project.getReflectionById(reflId);\n        }\n        return this.mediaToPath.get(id);\n    }\n\n    resolvePath(id: FileId): string | undefined {\n        return this.mediaToPath.get(id);\n    }\n\n    getName(id: FileId): string | undefined {\n        const absolute = this.mediaToPath.get(id);\n        if (!absolute) return;\n\n        if (this.names.has(id)) {\n            return this.names.get(id);\n        }\n\n        const file = NormalizedPathUtils.basename(absolute);\n        if (!this.nameUsage.has(file)) {\n            this.nameUsage.set(file, 1);\n            this.names.set(id, file);\n        } else {\n            const { name, ext } = NormalizedPathUtils.splitFilename(file);\n            let counter = this.nameUsage.get(file)!;\n            while (this.nameUsage.has(`${name}-${counter}${ext}`)) {\n                ++counter;\n            }\n            this.nameUsage.set(file, counter + 1);\n            this.nameUsage.set(`${name}-${counter}${ext}`, counter + 1);\n            this.names.set(id, `${name}-${counter}${ext}`);\n        }\n\n        return this.names.get(id);\n    }\n\n    getNameToAbsoluteMap(): ReadonlyMap<string, string> {\n        const result = new Map<string, string>();\n        for (const [id, name] of this.names.entries()) {\n            result.set(name, this.mediaToPath.get(id)!);\n        }\n        return result;\n    }\n\n    toObject(ser: Serializer): JSONOutput.FileRegistry {\n        const result: JSONOutput.FileRegistry = {\n            entries: {},\n            reflections: {},\n        };\n\n        for (const [key, val] of this.mediaToPath.entries()) {\n            result.entries[key] = NormalizedPathUtils.relative(ser.projectRoot, val);\n        }\n        for (const [key, val] of this.mediaToReflection.entries()) {\n            // A registry may be shared by multiple projects. When serializing,\n            // only save reflection mapping for reflections in the serialized project.\n            if (ser.project.getReflectionById(val)) {\n                result.reflections[key] = val;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Revive a file registry from disc.\n     * Note that in the packages context this may be called multiple times on\n     * a single object, and should merge in files from the other registries.\n     */\n    fromObject(de: Deserializer, obj: JSONOutput.FileRegistry): void {\n        for (const [fileId, path] of Object.entries(obj.entries)) {\n            const absolute = NormalizedPathUtils.resolve(de.projectRoot, path);\n            de.oldFileIdToNewFileId[+fileId as FileId] = this.registerAbsolute(absolute).target;\n        }\n\n        de.defer((project) => {\n            for (const [fileId, reflId] of Object.entries(obj.reflections)) {\n                const refl = project.getReflectionById(\n                    de.oldIdToNewId[reflId]!,\n                );\n                if (refl) {\n                    this.mediaToReflection.set(\n                        de.oldFileIdToNewFileId[+fileId as FileId]!,\n                        refl.id,\n                    );\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ParameterReflection.ts",
    "content": "import type { SomeType } from \"./index.js\";\nimport { ReflectionType } from \"./types.js\";\nimport { Reflection, type TraverseCallback, TraverseProperty } from \"./Reflection.js\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\n\n/**\n * @category Reflections\n */\nexport class ParameterReflection extends Reflection {\n    readonly variant = \"param\";\n\n    declare parent?: SignatureReflection;\n\n    defaultValue?: string;\n\n    type?: SomeType;\n\n    override traverse(callback: TraverseCallback) {\n        if (this.type instanceof ReflectionType) {\n            if (\n                callback(\n                    this.type.declaration,\n                    TraverseProperty.TypeLiteral,\n                ) === false\n            ) {\n                return;\n            }\n        }\n    }\n\n    override isParameter(): this is ParameterReflection {\n        return true;\n    }\n\n    /**\n     * Return a string representation of this reflection.\n     */\n    override toString() {\n        return (\n            super.toString() + (this.type ? \": \" + this.type.toString() : \"\")\n        );\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ParameterReflection {\n        return {\n            ...super.toObject(serializer),\n            variant: this.variant,\n            type: serializer.toObject(this.type),\n            defaultValue: this.defaultValue,\n        };\n    }\n\n    override fromObject(\n        de: Deserializer,\n        obj: JSONOutput.ParameterReflection,\n    ): void {\n        super.fromObject(de, obj);\n        this.type = de.reviveType(obj.type);\n        this.defaultValue = obj.defaultValue;\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ProjectReflection.ts",
    "content": "import { type Reflection, type ReflectionId, TraverseProperty } from \"./Reflection.js\";\nimport { ContainerReflection } from \"./ContainerReflection.js\";\nimport { ReferenceReflection } from \"./ReferenceReflection.js\";\nimport type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\nimport type { ParameterReflection } from \"./ParameterReflection.js\";\nimport { IntrinsicType, makeRecursiveVisitor, type Type } from \"./types.js\";\nimport type { TypeParameterReflection } from \"./TypeParameterReflection.js\";\nimport { ReflectionKind } from \"./kind.js\";\nimport { Comment, type CommentDisplayPart } from \"./Comment.js\";\nimport { ReflectionSymbolId } from \"./ReflectionSymbolId.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport {\n    assertNever,\n    DefaultMap,\n    i18n,\n    NonEnumerable,\n    type NormalizedPath,\n    removeIfPresent,\n    StableKeyMap,\n} from \"#utils\";\nimport type { DocumentReflection } from \"./DocumentReflection.js\";\nimport type { FileRegistry } from \"./FileRegistry.js\";\n\n// Keep this in sync with JSONOutput.SCHEMA_VERSION\nexport const JSON_SCHEMA_VERSION = \"2.0\";\n\n/**\n * A reflection that represents the root of the project.\n *\n * The project reflection acts as a global index, one may receive all reflections\n * and source files of the processed project through this reflection.\n * @category Reflections\n */\nexport class ProjectReflection extends ContainerReflection {\n    readonly variant = \"project\";\n\n    // Used to resolve references.\n    @NonEnumerable\n    private symbolToReflectionIdMap: Map<\n        ReflectionSymbolId,\n        number | number[]\n    > = new StableKeyMap();\n\n    @NonEnumerable\n    private reflectionIdToSymbolIdMap = new Map<number, ReflectionSymbolId>();\n\n    @NonEnumerable\n    private removedSymbolIds = new StableKeyMap<ReflectionSymbolId, true>();\n\n    // Maps a reflection ID to all references eventually referring to it.\n    @NonEnumerable\n    private referenceGraph?: Map<number, number[]>;\n\n    // Maps a reflection ID to all reflections with it as their parent.\n    @NonEnumerable\n    private reflectionChildren = new DefaultMap<number, number[]>(() => []);\n\n    /**\n     * A list of all reflections within the project. DO NOT MUTATE THIS OBJECT.\n     * All mutation should be done via {@link registerReflection} and {@link removeReflection}\n     * to ensure that links to reflections remain valid.\n     *\n     * This may be replaced with a `Map<number, Reflection>` someday.\n     */\n    @NonEnumerable\n    reflections: { [id: number]: Reflection } = {};\n\n    /**\n     * The name of the package that this reflection documents according to package.json.\n     */\n    packageName?: string;\n\n    /**\n     * The version of the package that this reflection documents according to package.json.\n     */\n    packageVersion?: string;\n\n    /**\n     * The contents of the readme.md file of the project when found.\n     */\n    readme?: CommentDisplayPart[];\n\n    /**\n     * Object which describes where to find content for relative links.\n     */\n    readonly files: FileRegistry;\n\n    constructor(name: string, registry: FileRegistry) {\n        super(name, ReflectionKind.Project);\n        this.reflections[this.id] = this;\n        this.files = registry;\n    }\n\n    /**\n     * Return whether this reflection is the root / project reflection.\n     */\n    override isProject(): this is ProjectReflection {\n        return true;\n    }\n\n    /**\n     * Return a list of all reflections in this project of a certain kind.\n     *\n     * @param kind  The desired kind of reflection.\n     * @returns     An array containing all reflections with the desired kind.\n     */\n    getReflectionsByKind(kind: ReflectionKind): Reflection[] {\n        return Object.values(this.reflections).filter((reflection) => reflection.kindOf(kind));\n    }\n\n    /**\n     * Registers the given reflection so that it can be quickly looked up by helper methods.\n     * Should be called for *every* reflection added to the project.\n     *\n     * Note: During conversion, `Context.registerReflection` should be used instead so\n     * that symbols can be saved for later use.\n     */\n    registerReflection(\n        reflection: Reflection,\n        id: ReflectionSymbolId | undefined,\n        filePath: NormalizedPath | undefined,\n    ) {\n        this.referenceGraph = undefined;\n        if (reflection.parent) {\n            this.reflectionChildren\n                .get(reflection.parent.id)\n                .push(reflection.id);\n        }\n        this.reflections[reflection.id] = reflection;\n\n        if (id) {\n            this.registerSymbolId(reflection, id);\n        }\n\n        if (filePath) {\n            this.files.registerReflection(filePath, reflection);\n        }\n    }\n\n    /**\n     * Removes references to reflections contained within the provided type.\n     * Plugins which overwrite types on reflections should pass the type to this\n     * method before overwriting the property.\n     * @since 0.26.6\n     */\n    removeTypeReflections(type: Type | undefined) {\n        type?.visit(\n            makeRecursiveVisitor({\n                reflection: (type) => {\n                    this.removeReflection(type.declaration);\n                },\n            }),\n        );\n    }\n\n    /**\n     * Removes a reflection from the documentation. Can be used by plugins to filter reflections\n     * out of the generated documentation. Has no effect if the reflection is not present in the\n     * project.\n     */\n    removeReflection(reflection: Reflection) {\n        // Remove the reflection...\n        this._removeReflection(reflection);\n\n        // And now try to remove references to it in the parent reflection.\n        // This might not find anything if someone called removeReflection on a member of a union\n        // but I think that could only be caused by a plugin doing something weird, not by a regular\n        // user... so this is probably good enough for now. Reflections that live on types are\n        // kind of half-real anyways.\n        const parent = reflection.parent as DeclarationReflection | undefined;\n        parent?.traverse((child, property) => {\n            if (child !== reflection) {\n                return true; // Continue iteration\n            }\n\n            switch (property) {\n                case TraverseProperty.Children:\n                case TraverseProperty.Documents:\n                    parent.removeChild(\n                        reflection as\n                            | DeclarationReflection\n                            | DocumentReflection,\n                    );\n                    break;\n                case TraverseProperty.GetSignature:\n                    delete parent.getSignature;\n                    break;\n                case TraverseProperty.IndexSignature:\n                    removeIfPresent(\n                        parent.indexSignatures,\n                        reflection as SignatureReflection,\n                    );\n                    if (!parent.indexSignatures?.length) {\n                        delete parent.indexSignatures;\n                    }\n                    break;\n                case TraverseProperty.Parameters:\n                    removeIfPresent(\n                        (reflection.parent as SignatureReflection).parameters,\n                        reflection as ParameterReflection,\n                    );\n                    if (\n                        !(reflection.parent as SignatureReflection).parameters\n                            ?.length\n                    ) {\n                        delete (reflection.parent as SignatureReflection)\n                            .parameters;\n                    }\n                    break;\n                case TraverseProperty.SetSignature:\n                    delete parent.setSignature;\n                    break;\n                case TraverseProperty.Signatures:\n                    removeIfPresent(\n                        parent.signatures,\n                        reflection as SignatureReflection,\n                    );\n                    if (!parent.signatures?.length) {\n                        delete parent.signatures;\n                    }\n                    break;\n                case TraverseProperty.TypeLiteral:\n                    parent.type = new IntrinsicType(\"Object\");\n                    break;\n                case TraverseProperty.TypeParameter:\n                    removeIfPresent(\n                        parent.typeParameters,\n                        reflection as TypeParameterReflection,\n                    );\n                    if (!parent.typeParameters?.length) {\n                        delete parent.typeParameters;\n                    }\n                    break;\n                default:\n                    assertNever(property);\n            }\n\n            return false; // Stop iteration\n        });\n    }\n\n    /** @internal */\n    mergeReflections(\n        source: DeclarationReflection,\n        target: DeclarationReflection | ProjectReflection,\n    ) {\n        // First, tell the children about their new parent\n        delete this.referenceGraph;\n        const oldChildrenIds = this.reflectionChildren.getNoInsert(source.id) || [];\n\n        const newChildren = this.reflectionChildren.get(target.id);\n\n        for (const childId of oldChildrenIds) {\n            const childRefl = this.getReflectionById(childId);\n\n            // To avoid conflicting with some plugins which do this surgery somewhat incorrectly\n            // (typedoc-plugin-merge-modules and likely others I'm not aware of) only move children\n            // which are still children\n            if (childRefl?.parent === source) {\n                childRefl.parent = target;\n                newChildren.push(childId);\n                target.addChild(childRefl);\n            }\n        }\n\n        // Then remove the now-empty parent\n        this.reflectionChildren.delete(source.id);\n        this.removeReflection(source);\n\n        // And remove any outdated collections of children on the new parent.\n        // So long as this is used before REVIVE(-100) or EVENT_BEGIN_RESOLVE(-100)\n        // this will make the appropriate plugin rebuild the lists.\n        delete target.groups;\n        delete target.categories;\n    }\n\n    /**\n     * Remove a reflection without updating the parent reflection to remove references to the removed reflection.\n     */\n    private _removeReflection(reflection: Reflection) {\n        this.files.removeReflection(reflection);\n\n        // Remove references pointing to this reflection\n        const graph = this.getReferenceGraph();\n        for (const id of graph.get(reflection.id) ?? []) {\n            const ref = this.getReflectionById(id);\n            if (ref) {\n                this.removeReflection(ref);\n            }\n        }\n        graph.delete(reflection.id);\n\n        // Remove children of this reflection\n        for (\n            const childId of this.reflectionChildren.getNoInsert(\n                reflection.id,\n            ) || []\n        ) {\n            const child = this.getReflectionById(childId);\n            // Only remove if the child's parent is still actually this reflection.\n            // This might not be the case if a plugin has moved this reflection to another parent.\n            // (typedoc-plugin-merge-modules)\n            if (child?.parent === reflection) {\n                this._removeReflection(child);\n            }\n        }\n        this.reflectionChildren.delete(reflection.id);\n\n        // Remove references from the TS symbol to this reflection.\n        const symbolId = this.reflectionIdToSymbolIdMap.get(reflection.id);\n        if (symbolId) {\n            const saved = this.symbolToReflectionIdMap.get(symbolId);\n            if (saved === reflection.id) {\n                this.symbolToReflectionIdMap.delete(symbolId);\n                this.removedSymbolIds.set(symbolId, true);\n            } else if (typeof saved === \"object\") {\n                removeIfPresent(saved, reflection.id);\n                if (saved.length === 0) {\n                    this.removedSymbolIds.set(symbolId, true);\n                }\n            }\n        }\n\n        this.reflectionIdToSymbolIdMap.delete(reflection.id);\n        delete this.reflections[reflection.id];\n    }\n\n    /**\n     * Gets the reflection registered for the given reflection ID, or undefined if it is not present\n     * in the project.\n     */\n    getReflectionById(id: number): Reflection | undefined {\n        return this.reflections[id];\n    }\n\n    /**\n     * Gets the reflection associated with the given symbol id, if it exists.\n     * If there are multiple reflections associated with this symbol, gets the first one.\n     * @internal\n     */\n    getReflectionFromSymbolId(\n        symbolId: ReflectionSymbolId,\n    ): Reflection | undefined {\n        return this.getReflectionsFromSymbolId(symbolId)[0];\n    }\n\n    /** @internal */\n    getReflectionsFromSymbolId(symbolId: ReflectionSymbolId) {\n        const id = this.symbolToReflectionIdMap.get(symbolId);\n        if (typeof id === \"number\") {\n            return [this.getReflectionById(id)!];\n        } else if (typeof id === \"object\") {\n            return id.map((id) => this.getReflectionById(id)!);\n        }\n\n        return [];\n    }\n\n    /** @internal */\n    getSymbolIdFromReflection(reflection: Reflection) {\n        return this.reflectionIdToSymbolIdMap.get(reflection.id);\n    }\n\n    /** @internal */\n    registerSymbolId(reflection: Reflection, id: ReflectionSymbolId) {\n        this.removedSymbolIds.delete(id);\n        this.reflectionIdToSymbolIdMap.set(reflection.id, id);\n\n        const previous = this.symbolToReflectionIdMap.get(id);\n        if (typeof previous !== \"undefined\") {\n            if (typeof previous === \"number\") {\n                this.symbolToReflectionIdMap.set(id, [previous, reflection.id]);\n            } else {\n                previous.push(reflection.id);\n            }\n        } else {\n            this.symbolToReflectionIdMap.set(id, reflection.id);\n        }\n    }\n\n    symbolIdHasBeenRemoved(id: ReflectionSymbolId) {\n        return this.removedSymbolIds.has(id);\n    }\n\n    private getReferenceGraph(): Map<number, number[]> {\n        if (!this.referenceGraph) {\n            this.referenceGraph = new Map();\n            for (const id in this.reflections) {\n                const ref = this.reflections[id];\n                if (ref instanceof ReferenceReflection) {\n                    const target = ref.tryGetTargetReflection();\n                    if (target) {\n                        const refs = this.referenceGraph.get(target.id) ?? [];\n                        refs.push(ref.id);\n                        this.referenceGraph.set(target.id, refs);\n                    }\n                }\n            }\n        }\n\n        return this.referenceGraph;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ProjectReflection {\n        const symbolIdMap: Record<number, JSONOutput.ReflectionSymbolId> = {};\n        this.reflectionIdToSymbolIdMap.forEach((sid, id) => {\n            symbolIdMap[id] = sid.toObject();\n        });\n\n        return {\n            schemaVersion: JSON_SCHEMA_VERSION,\n            ...super.toObject(serializer),\n            variant: this.variant,\n            packageName: this.packageName,\n            packageVersion: this.packageVersion,\n            readme: Comment.serializeDisplayParts(this.readme),\n            symbolIdMap,\n            files: serializer.toObject(this.files),\n        };\n    }\n\n    override fromObject(\n        de: Deserializer,\n        obj: JSONOutput.ProjectReflection,\n    ): void {\n        super.fromObject(de, obj);\n        // If updating this, also check the block in DeclarationReflection.fromObject.\n        this.packageName = obj.packageName;\n        this.packageVersion = obj.packageVersion;\n        if (obj.readme) {\n            this.readme = Comment.deserializeDisplayParts(de, obj.readme);\n        }\n        this.files.fromObject(de, obj.files || {});\n\n        de.defer(() => {\n            // Unnecessary conditional in release\n            for (const [id, sid] of Object.entries(obj.symbolIdMap || {})) {\n                const refl = this.getReflectionById(de.oldIdToNewId[+id as ReflectionId] ?? -1);\n                if (refl) {\n                    this.registerSymbolId(refl, new ReflectionSymbolId(sid));\n                } else {\n                    de.logger.warn(i18n.serialized_project_referenced_0_not_part_of_project(id));\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ReferenceReflection.ts",
    "content": "import { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport { ReflectionKind } from \"./kind.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport type { Reflection, ReflectionId } from \"./Reflection.js\";\n\n/**\n * Describes a reflection which does not exist at this location, but is referenced. Used for imported reflections.\n *\n * ```ts\n * // a.ts\n * export const a = 1;\n * // b.ts\n * import { a } from './a';\n * // Here to avoid extra work we create a reference to the original reflection in module a instead\n * // of copying the reflection.\n * export { a };\n * ```\n * @category Reflections\n */\nexport class ReferenceReflection extends DeclarationReflection {\n    override readonly variant = \"reference\";\n\n    private _target: number;\n\n    /**\n     * Creates a reference reflection. Should only be used within the factory function.\n     * @internal\n     */\n    constructor(name: string, reflection: Reflection, parent?: Reflection) {\n        super(name, ReflectionKind.Reference, parent);\n        this._target = reflection.id;\n    }\n\n    /**\n     * Tries to get the reflection that is referenced. This may be another reference reflection.\n     * To fully resolve any references, use {@link tryGetTargetReflectionDeep}.\n     */\n    tryGetTargetReflection(): Reflection | undefined {\n        return this.project.getReflectionById(this._target);\n    }\n\n    /**\n     * Tries to get the reflection that is referenced, this will fully resolve references.\n     * To only resolve one reference, use {@link tryGetTargetReflection}.\n     */\n    tryGetTargetReflectionDeep(): Reflection | undefined {\n        let result = this.tryGetTargetReflection();\n        while (result instanceof ReferenceReflection) {\n            result = result.tryGetTargetReflection();\n        }\n        return result;\n    }\n\n    /**\n     * Gets the reflection that is referenced. This may be another reference reflection.\n     * To fully resolve any references, use {@link getTargetReflectionDeep}.\n     */\n    getTargetReflection(): Reflection {\n        const target = this.tryGetTargetReflection();\n        if (!target) {\n            throw new Error(\"Reference was unresolved.\");\n        }\n        return target;\n    }\n\n    /**\n     * Gets the reflection that is referenced, this will fully resolve references.\n     * To only resolve one reference, use {@link getTargetReflection}.\n     */\n    getTargetReflectionDeep(): Reflection {\n        let result = this.getTargetReflection();\n        while (result instanceof ReferenceReflection) {\n            result = result.getTargetReflection();\n        }\n        return result;\n    }\n\n    override getChildByName(arg: string | string[]): Reflection | undefined {\n        return this.getTargetReflection().getChildByName(arg);\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ReferenceReflection {\n        return {\n            ...super.toObject(serializer),\n            variant: this.variant,\n            target: this.tryGetTargetReflection()?.id ?? -1 as ReflectionId,\n        };\n    }\n\n    override fromObject(\n        de: Deserializer,\n        obj: JSONOutput.ReferenceReflection,\n    ): void {\n        super.fromObject(de, obj);\n        de.defer((project) => {\n            this._target = project.getReflectionById(de.oldIdToNewId[obj.target] ?? -1)\n                ?.id ?? -1;\n        });\n    }\n}\n"
  },
  {
    "path": "src/lib/models/Reflection.ts",
    "content": "import { Comment } from \"./Comment.js\";\nimport { splitUnquotedString } from \"./utils.js\";\nimport type { ProjectReflection } from \"./ProjectReflection.js\";\nimport { i18n, type NeverIfInternal, NonEnumerable, type TagString, type TranslatedString } from \"#utils\";\nimport { ReflectionKind } from \"./kind.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport type { ReflectionVariant } from \"./variant.js\";\nimport type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport type { DocumentReflection } from \"./DocumentReflection.js\";\nimport type { ParameterReflection } from \"./ParameterReflection.js\";\nimport type { ReferenceReflection } from \"./ReferenceReflection.js\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\nimport type { TypeParameterReflection } from \"./TypeParameterReflection.js\";\nimport type { ContainerReflection } from \"./ContainerReflection.js\";\n\n/**\n * Current reflection id.\n */\nlet REFLECTION_ID = 0;\n\n/**\n * Reset the reflection id.\n *\n * Used by the test cases to ensure the reflection ids won't change between runs.\n */\nexport function resetReflectionID() {\n    REFLECTION_ID = 0;\n}\n\nexport enum ReflectionFlag {\n    None = 0,\n    Private = 1 << 0,\n    Protected = 1 << 1,\n    Public = 1 << 2,\n    Static = 1 << 3,\n    External = 1 << 4,\n    Optional = 1 << 5,\n    Rest = 1 << 6,\n    Abstract = 1 << 7,\n    Const = 1 << 8,\n    Readonly = 1 << 9,\n    Inherited = 1 << 10,\n}\n\nconst relevantFlags: ReflectionFlag[] = [\n    ReflectionFlag.Private,\n    ReflectionFlag.Protected,\n    ReflectionFlag.Static,\n    ReflectionFlag.Optional,\n    ReflectionFlag.Abstract,\n    ReflectionFlag.Const,\n    ReflectionFlag.Readonly,\n];\n\n/**\n * This must extend Array in order to work with Handlebar's each helper.\n */\nexport class ReflectionFlags {\n    private flags = ReflectionFlag.None;\n\n    hasFlag(flag: ReflectionFlag) {\n        return (flag & this.flags) !== 0;\n    }\n\n    /**\n     * Is this a private member?\n     */\n    get isPrivate(): boolean {\n        return this.hasFlag(ReflectionFlag.Private);\n    }\n\n    /**\n     * Is this a protected member?\n     */\n    get isProtected(): boolean {\n        return this.hasFlag(ReflectionFlag.Protected);\n    }\n\n    /**\n     * Is this a public member?\n     */\n    get isPublic(): boolean {\n        return this.hasFlag(ReflectionFlag.Public);\n    }\n\n    /**\n     * Is this a static member?\n     */\n    get isStatic(): boolean {\n        return this.hasFlag(ReflectionFlag.Static);\n    }\n\n    /**\n     * Is this a declaration from an external document?\n     */\n    get isExternal(): boolean {\n        return this.hasFlag(ReflectionFlag.External);\n    }\n\n    /**\n     * Whether this reflection is an optional component or not.\n     *\n     * Applies to function parameters and object members.\n     */\n    get isOptional(): boolean {\n        return this.hasFlag(ReflectionFlag.Optional);\n    }\n\n    /**\n     * Whether it's a rest parameter, like `foo(...params);`.\n     */\n    get isRest(): boolean {\n        return this.hasFlag(ReflectionFlag.Rest);\n    }\n\n    get isAbstract(): boolean {\n        return this.hasFlag(ReflectionFlag.Abstract);\n    }\n\n    get isConst() {\n        return this.hasFlag(ReflectionFlag.Const);\n    }\n\n    get isReadonly() {\n        return this.hasFlag(ReflectionFlag.Readonly);\n    }\n\n    get isInherited() {\n        return this.hasFlag(ReflectionFlag.Inherited);\n    }\n\n    setFlag(flag: ReflectionFlag, set: boolean) {\n        switch (flag) {\n            case ReflectionFlag.Private:\n                this.setSingleFlag(ReflectionFlag.Private, set);\n                if (set) {\n                    this.setFlag(ReflectionFlag.Protected, false);\n                    this.setFlag(ReflectionFlag.Public, false);\n                }\n                break;\n            case ReflectionFlag.Protected:\n                this.setSingleFlag(ReflectionFlag.Protected, set);\n                if (set) {\n                    this.setFlag(ReflectionFlag.Private, false);\n                    this.setFlag(ReflectionFlag.Public, false);\n                }\n                break;\n            case ReflectionFlag.Public:\n                this.setSingleFlag(ReflectionFlag.Public, set);\n                if (set) {\n                    this.setFlag(ReflectionFlag.Private, false);\n                    this.setFlag(ReflectionFlag.Protected, false);\n                }\n                break;\n            default:\n                this.setSingleFlag(flag, set);\n        }\n    }\n\n    static flagString(flag: ReflectionFlag) {\n        switch (flag) {\n            case ReflectionFlag.None:\n                throw new Error(\"Should be unreachable\");\n            case ReflectionFlag.Private:\n                return i18n.flag_private();\n            case ReflectionFlag.Protected:\n                return i18n.flag_protected();\n            case ReflectionFlag.Public:\n                return i18n.flag_public();\n            case ReflectionFlag.Static:\n                return i18n.flag_static();\n            case ReflectionFlag.External:\n                return i18n.flag_external();\n            case ReflectionFlag.Optional:\n                return i18n.flag_optional();\n            case ReflectionFlag.Rest:\n                return i18n.flag_rest();\n            case ReflectionFlag.Abstract:\n                return i18n.flag_abstract();\n            case ReflectionFlag.Const:\n                return i18n.flag_const();\n            case ReflectionFlag.Readonly:\n                return i18n.flag_readonly();\n            case ReflectionFlag.Inherited:\n                return i18n.flag_inherited();\n        }\n    }\n\n    getFlagStrings() {\n        const strings: TranslatedString[] = [];\n        for (const flag of relevantFlags) {\n            if (this.hasFlag(flag)) {\n                strings.push(ReflectionFlags.flagString(flag));\n            }\n        }\n        return strings;\n    }\n\n    private setSingleFlag(flag: ReflectionFlag, set: boolean) {\n        if (!set && this.hasFlag(flag)) {\n            this.flags ^= flag;\n        } else if (set && !this.hasFlag(flag)) {\n            this.flags |= flag;\n        }\n    }\n\n    private static serializedFlags = [\n        \"isPrivate\",\n        \"isProtected\",\n        \"isPublic\",\n        \"isStatic\",\n        \"isExternal\",\n        \"isOptional\",\n        \"isRest\",\n        \"isAbstract\",\n        \"isConst\",\n        \"isReadonly\",\n        \"isInherited\",\n    ] as const;\n\n    toObject(): JSONOutput.ReflectionFlags {\n        return Object.fromEntries(\n            ReflectionFlags.serializedFlags\n                .filter((flag) => this[flag])\n                .map((flag) => [flag, true]),\n        );\n    }\n\n    fromObject(obj: JSONOutput.ReflectionFlags) {\n        for (const key of Object.keys(obj)) {\n            const flagName = key.substring(2); // isPublic => Public\n            if (flagName in ReflectionFlag) {\n                this.setFlag(\n                    ReflectionFlag[flagName as keyof typeof ReflectionFlag],\n                    true,\n                );\n            }\n        }\n    }\n}\n\nexport enum TraverseProperty {\n    Children,\n    Documents,\n    Parameters,\n    TypeLiteral,\n    TypeParameter,\n    Signatures,\n    IndexSignature,\n    GetSignature,\n    SetSignature,\n}\n\nexport interface TraverseCallback {\n    /**\n     * May return false to bail out of any further iteration. To preserve backwards compatibility, if\n     * a function returns undefined, iteration must continue.\n     */\n    (\n        reflection: Reflection,\n        property: TraverseProperty,\n    ): boolean | NeverIfInternal<void>;\n}\n\nexport type ReflectionVisitor = {\n    [K in keyof ReflectionVariant]?: (refl: ReflectionVariant[K]) => void;\n};\n\n/**\n * Alias for a `number` which references a reflection.\n * `-1` may be used for an invalid reflection ID.\n */\nexport type ReflectionId = number & { __reflectionIdBrand: never };\n\n/**\n * Base class for all reflection classes.\n *\n * While generating a documentation, TypeDoc generates an instance of {@link ProjectReflection}\n * as the root for all reflections within the project. All other reflections are represented\n * by the {@link DeclarationReflection} class.\n *\n * This base class exposes the basic properties one may use to traverse the reflection tree.\n * You can use the {@link ContainerReflection.children} and {@link parent} properties to walk the tree. The {@link ContainerReflection.groups} property\n * contains a list of all children grouped and sorted for rendering.\n * @category Reflections\n */\nexport abstract class Reflection {\n    /**\n     * Discriminator representing the type of reflection represented by this object.\n     */\n    abstract readonly variant: keyof ReflectionVariant;\n\n    /**\n     * Unique id of this reflection.\n     */\n    id: ReflectionId;\n\n    /**\n     * The symbol name of this reflection.\n     */\n    name: string;\n\n    /**\n     * The kind of this reflection.\n     */\n    kind: ReflectionKind;\n\n    flags: ReflectionFlags = new ReflectionFlags();\n\n    /**\n     * The reflection this reflection is a child of.\n     */\n    @NonEnumerable // So that it doesn't show up in console.log\n    parent?: Reflection;\n\n    @NonEnumerable\n    project: ProjectReflection;\n\n    /**\n     * The parsed documentation comment attached to this reflection.\n     */\n    comment?: Comment;\n\n    constructor(name: string, kind: ReflectionKind, parent?: Reflection) {\n        this.id = REFLECTION_ID++ as ReflectionId;\n        this.parent = parent;\n        this.project = parent?.project || (this as any as ProjectReflection);\n        this.name = name;\n        this.kind = kind;\n\n        // If our parent is external, we are too.\n        if (parent?.flags.isExternal) {\n            this.setFlag(ReflectionFlag.External);\n        }\n    }\n\n    /**\n     * Test whether this reflection is of the given kind.\n     */\n    kindOf(kind: ReflectionKind | ReflectionKind[]): boolean {\n        const kindFlags = Array.isArray(kind)\n            ? kind.reduce((a, b) => a | b, 0)\n            : kind;\n        return (this.kind & kindFlags) !== 0;\n    }\n\n    /**\n     * Return the full name of this reflection. Intended for use in debugging. For log messages\n     * intended to be displayed to the user for them to fix, prefer {@link getFriendlyFullName} instead.\n     *\n     * The full name contains the name of this reflection and the names of all parent reflections.\n     *\n     * @param separator  Separator used to join the names of the reflections.\n     * @returns The full name of this reflection.\n     */\n    getFullName(separator = \".\"): string {\n        if (this.parent && !this.parent.isProject()) {\n            return this.parent.getFullName(separator) + separator + this.name;\n        } else {\n            return this.name;\n        }\n    }\n\n    /**\n     * Return the full name of this reflection, with signature names dropped if possible without\n     * introducing ambiguity in the name.\n     */\n    getFriendlyFullName(): string {\n        if (this.parent && !this.parent.isProject()) {\n            if (\n                this.kindOf(\n                    ReflectionKind.ConstructorSignature |\n                        ReflectionKind.CallSignature |\n                        ReflectionKind.GetSignature |\n                        ReflectionKind.SetSignature,\n                )\n            ) {\n                return this.parent.getFriendlyFullName();\n            }\n\n            return this.parent.getFriendlyFullName() + \".\" + this.name;\n        } else {\n            return this.name;\n        }\n    }\n\n    /**\n     * Set a flag on this reflection.\n     */\n    setFlag(flag: ReflectionFlag, value = true) {\n        this.flags.setFlag(flag, value);\n    }\n\n    /**\n     * Checks if this reflection has a comment which contains any visible text.\n     *\n     * @returns TRUE when this reflection has a visible comment.\n     */\n    hasComment(notRenderedTags?: readonly TagString[]): boolean {\n        return this.comment ? this.comment.hasVisibleComponent(notRenderedTags) : false;\n    }\n\n    hasGetterOrSetter(): boolean {\n        return false;\n    }\n\n    /**\n     * Return a child by its name.\n     *\n     * @param arg The name hierarchy of the child to look for.\n     * @returns The found child or undefined.\n     */\n    getChildByName(arg: string | string[]): Reflection | undefined {\n        const names: string[] = Array.isArray(arg)\n            ? arg\n            : splitUnquotedString(arg, \".\");\n        const name = names[0];\n        let result: Reflection | undefined;\n\n        this.traverse((child) => {\n            if (child.name === name) {\n                if (names.length <= 1) {\n                    result = child;\n                } else {\n                    result = child.getChildByName(names.slice(1));\n                }\n                return false;\n            }\n            return true;\n        });\n\n        return result;\n    }\n\n    /**\n     * Return whether this reflection is the root / project reflection.\n     */\n    isProject(): this is ProjectReflection {\n        return false;\n    }\n    isDeclaration(): this is DeclarationReflection {\n        return false;\n    }\n    isSignature(): this is SignatureReflection {\n        return false;\n    }\n    isTypeParameter(): this is TypeParameterReflection {\n        return false;\n    }\n    isParameter(): this is ParameterReflection {\n        return false;\n    }\n    isDocument(): this is DocumentReflection {\n        return false;\n    }\n    isReference(): this is ReferenceReflection {\n        return this.variant === \"reference\";\n    }\n    isContainer(): this is ContainerReflection {\n        return false;\n    }\n\n    /**\n     * Check if this reflection or any of its parents have been marked with the `@deprecated` tag.\n     */\n    isDeprecated(): boolean {\n        let signaturesDeprecated = false as boolean;\n        this.visit({\n            declaration(decl) {\n                if (\n                    decl.signatures?.length &&\n                    decl.signatures.every((sig) => sig.comment?.getTag(\"@deprecated\"))\n                ) {\n                    signaturesDeprecated = true;\n                }\n            },\n        });\n\n        if (signaturesDeprecated || this.comment?.getTag(\"@deprecated\")) {\n            return true;\n        }\n\n        return this.parent?.isDeprecated() ?? false;\n    }\n\n    /**\n     * Traverse most potential child reflections of this reflection.\n     *\n     * Note: This may not necessarily traverse child reflections contained within the `type` property\n     * of the reflection, and should not be relied on for this. Support for checking object types will likely be removed in v0.29.\n     *\n     * The given callback will be invoked for all children, signatures and type parameters\n     * attached to this reflection.\n     *\n     * @param callback  The callback function that should be applied for each child reflection.\n     */\n    abstract traverse(callback: TraverseCallback): void;\n\n    visit(visitor: ReflectionVisitor) {\n        visitor[this.variant]?.(this as never);\n    }\n\n    /**\n     * Return a string representation of this reflection.\n     */\n    toString(): string {\n        return ReflectionKind[this.kind] + \" \" + this.name;\n    }\n\n    /**\n     * Return a string representation of this reflection and all of its children.\n     *\n     * Note: This is intended as a debug tool only, output may change between patch versions.\n     *\n     * @param indent  Used internally to indent child reflections.\n     */\n    toStringHierarchy(indent = \"\") {\n        const lines = [indent + this.toString()];\n\n        indent += \"  \";\n        this.traverse((child) => {\n            lines.push(child.toStringHierarchy(indent));\n            return true;\n        });\n\n        return lines.join(\"\\n\");\n    }\n\n    toObject(serializer: Serializer): JSONOutput.Reflection {\n        return {\n            id: this.id,\n            name: this.name,\n            variant: this.variant,\n            kind: this.kind,\n            flags: this.flags.toObject(),\n            comment: this.comment && !this.comment.isEmpty()\n                ? serializer.toObject(this.comment)\n                : undefined,\n        };\n    }\n\n    fromObject(de: Deserializer, obj: JSONOutput.Reflection) {\n        // DO NOT copy id from obj. When deserializing reflections\n        // they should be given new ids since they belong to a different project.\n        this.name = obj.name;\n        // Skip copying variant, we know it's already the correct value because the deserializer\n        // will construct the correct class type.\n        this.kind = obj.kind;\n        this.flags.fromObject(obj.flags);\n        // Parent is set during construction, so we don't need to do it here.\n        this.comment = de.revive(obj.comment, () => new Comment());\n        // url, anchor, hasOwnDocument, _alias, _aliases are set during rendering and only relevant during render.\n        // It doesn't make sense to serialize them to json, or restore them.\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ReflectionCategory.ts",
    "content": "import { Comment } from \"./Comment.js\";\nimport type { CommentDisplayPart, DeclarationReflection, DocumentReflection } from \"./index.js\";\nimport type { Deserializer, JSONOutput } from \"#serialization\";\n\n/**\n * A category of reflections.\n *\n * Reflection categories are created by the ´CategoryPlugin´ in the resolving phase\n * of the dispatcher. The main purpose of categories is to be able to more easily\n * render human readable children lists in templates.\n */\nexport class ReflectionCategory {\n    /**\n     * The title, a string representation of this category.\n     */\n    title: string;\n\n    /**\n     * The user specified description, if any, set with `@categoryDescription`\n     */\n    description?: CommentDisplayPart[];\n\n    /**\n     * All reflections of this category.\n     */\n    children: Array<DeclarationReflection | DocumentReflection> = [];\n\n    /**\n     * Create a new ReflectionCategory instance.\n     *\n     * @param title The title of this category.\n     */\n    constructor(title: string) {\n        this.title = title;\n    }\n\n    toObject(): JSONOutput.ReflectionCategory {\n        return {\n            title: this.title,\n            description: this.description\n                ? Comment.serializeDisplayParts(this.description)\n                : undefined,\n            children: this.children.length > 0\n                ? this.children.map((child) => child.id)\n                : undefined,\n        };\n    }\n\n    fromObject(de: Deserializer, obj: JSONOutput.ReflectionCategory) {\n        if (obj.description) {\n            this.description = Comment.deserializeDisplayParts(\n                de,\n                obj.description,\n            );\n        }\n\n        if (obj.children) {\n            de.defer((project) => {\n                for (const childId of obj.children || []) {\n                    const child = project.getReflectionById(\n                        de.oldIdToNewId[childId] ?? -1,\n                    );\n                    if (child?.isDeclaration() || child?.isDocument()) {\n                        this.children.push(child);\n                    }\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ReflectionGroup.ts",
    "content": "import { ReflectionCategory } from \"./ReflectionCategory.js\";\nimport { Comment } from \"./Comment.js\";\nimport type { CommentDisplayPart, DeclarationReflection, DocumentReflection, Reflection } from \"./index.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\n\n/**\n * A group of reflections. All reflections in a group are of the same kind.\n *\n * Reflection groups are created by the ´GroupHandler´ in the resolving phase\n * of the dispatcher. The main purpose of groups is to be able to more easily\n * render human readable children lists in templates.\n */\nexport class ReflectionGroup {\n    /**\n     * The title, a string representation of the typescript kind, of this group.\n     */\n    title: string;\n\n    /**\n     * User specified description via `@groupDescription`, if specified.\n     */\n    description?: CommentDisplayPart[];\n\n    /**\n     * All reflections of this group.\n     */\n    children: Array<DeclarationReflection | DocumentReflection> = [];\n\n    /**\n     * Categories contained within this group.\n     */\n    categories?: ReflectionCategory[];\n\n    /**\n     * Create a new ReflectionGroup instance.\n     *\n     * @param title The title of this group.\n     * @param owningReflection The reflection containing this group, useful for changing rendering based on a comment on a reflection.\n     */\n    constructor(\n        title: string,\n        readonly owningReflection: Reflection,\n    ) {\n        this.title = title;\n    }\n\n    toObject(serializer: Serializer): JSONOutput.ReflectionGroup {\n        return {\n            title: this.title,\n            description: this.description\n                ? Comment.serializeDisplayParts(this.description)\n                : undefined,\n            children: this.children.length > 0\n                ? this.children.map((child) => child.id)\n                : undefined,\n            categories: serializer.toObjectsOptional(this.categories),\n        };\n    }\n\n    fromObject(de: Deserializer, obj: JSONOutput.ReflectionGroup) {\n        if (obj.description) {\n            this.description = Comment.deserializeDisplayParts(\n                de,\n                obj.description,\n            );\n        }\n\n        if (obj.categories) {\n            this.categories = obj.categories.map((catObj) => {\n                const cat = new ReflectionCategory(catObj.title);\n                de.fromObject(cat, catObj);\n                return cat;\n            });\n        }\n\n        if (obj.children) {\n            de.defer((project) => {\n                for (const childId of obj.children || []) {\n                    const child = project.getReflectionById(\n                        de.oldIdToNewId[childId] ?? -1,\n                    );\n                    if (child?.isDeclaration() || child?.isDocument()) {\n                        this.children.push(child);\n                    }\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/models/ReflectionSymbolId.ts",
    "content": "import type { JSONOutput } from \"#serialization\";\nimport { type DeclarationReference, type NormalizedPath } from \"#utils\";\nimport { splitUnquotedString } from \"./utils.js\";\n\n/**\n * See {@link ReflectionSymbolId}\n */\nexport type ReflectionSymbolIdString = string & {\n    readonly __reflectionSymbolId: unique symbol;\n};\n\n/**\n * This exists so that TypeDoc can store a unique identifier for a `ts.Symbol` without\n * keeping a reference to the `ts.Symbol` itself. This identifier should be stable across\n * runs so long as the symbol is exported from the same file.\n */\nexport class ReflectionSymbolId {\n    /**\n     * This will only be used if we somehow cannot find a package.json file for\n     * source code. This is very unlikely, but if it occurs then the {@link packageName}\n     * will be set to this string, and {@link packagePath} will have the absolute path\n     * to the source file.\n     */\n    static readonly UNKNOWN_PACKAGE = \"<unknown>\";\n\n    /**\n     * The name of the package which this symbol ID resides within.\n     */\n    readonly packageName: string;\n\n    /**\n     * Path to the source file containing this symbol.\n     * Note that this is NOT an absolute path, but a package-relative path according\n     * to the directory containing package.json for the package name.\n     */\n    readonly packagePath: NormalizedPath;\n\n    /**\n     * Qualified name of this symbol within the source file.\n     */\n    readonly qualifiedName: string;\n\n    /**\n     * Note: This is **not** serialized. It exists for sorting by declaration order, but\n     * should not be needed when deserializing from JSON.\n     * Will be set to `Infinity` if the ID was deserialized from JSON.\n     */\n    pos: number = Infinity;\n\n    /**\n     * Note: This is **not** serialized. It exists to support detection of the differences between\n     * symbols which share declarations, but are instantiated with different type parameters.\n     * This will be `NaN` if the symbol reference is not transient.\n     * Note: This can only be non-NaN if {@link pos} is finite.\n     */\n    transientId: number = NaN;\n\n    /**\n     * Note: This is **not** serialized, only {@link packageName} and {@link packagePath} path\n     * information is preserved when serializing. This is set so that it is available to plugins\n     * when initially converting a project.\n     *\n     * @privateRemarks\n     * This is used by typedoc-plugin-dt-links to determine the path to read to get the source\n     * code of a definitely typed package.\n     */\n    fileName?: NormalizedPath;\n\n    constructor(json: JSONOutput.ReflectionSymbolId) {\n        this.packageName = json.packageName;\n        this.packagePath = json.packagePath;\n        this.qualifiedName = json.qualifiedName;\n    }\n\n    getStableKey(): ReflectionSymbolIdString {\n        if (Number.isFinite(this.pos)) {\n            return `${this.packageName}\\0${this.packagePath}\\0${this.qualifiedName}\\0${this.pos}\\0${this.transientId}` as ReflectionSymbolIdString;\n        } else {\n            return `${this.packageName}\\0${this.packagePath}\\0${this.qualifiedName}` as ReflectionSymbolIdString;\n        }\n    }\n\n    toDeclarationReference(): DeclarationReference {\n        return {\n            resolutionStart: \"global\",\n            moduleSource: this.packageName,\n            symbolReference: {\n                path: splitUnquotedString(this.qualifiedName, \".\").map(\n                    (path) => ({\n                        navigation: \".\",\n                        path,\n                    }),\n                ),\n            },\n        };\n    }\n\n    toObject(): JSONOutput.ReflectionSymbolId {\n        return {\n            packageName: this.packageName,\n            packagePath: this.packagePath,\n            qualifiedName: this.qualifiedName,\n        };\n    }\n}\n"
  },
  {
    "path": "src/lib/models/SignatureReflection.ts",
    "content": "import { type ReferenceType, ReflectionType, type SomeType } from \"./types.js\";\nimport { Reflection, type TraverseCallback, TraverseProperty } from \"./Reflection.js\";\nimport type { ParameterReflection } from \"./ParameterReflection.js\";\nimport type { TypeParameterReflection } from \"./TypeParameterReflection.js\";\nimport type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport type { ReflectionKind } from \"./kind.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport { SourceReference } from \"./SourceReference.js\";\n\n/**\n * @category Reflections\n */\nexport class SignatureReflection extends Reflection {\n    readonly variant = \"signature\";\n\n    // ESLint is wrong, we're restricting types to be more narrow.\n    // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n    constructor(\n        name: string,\n        kind: SignatureReflection[\"kind\"],\n        parent: DeclarationReflection,\n    ) {\n        super(name, kind, parent);\n    }\n\n    declare kind:\n        | ReflectionKind.SetSignature\n        | ReflectionKind.GetSignature\n        | ReflectionKind.IndexSignature\n        | ReflectionKind.CallSignature\n        | ReflectionKind.ConstructorSignature;\n\n    declare parent: DeclarationReflection;\n\n    /**\n     * A list of all source files that contributed to this reflection.\n     */\n    sources?: SourceReference[];\n\n    parameters?: ParameterReflection[];\n\n    typeParameters?: TypeParameterReflection[];\n\n    type?: SomeType;\n\n    /**\n     * A type that points to the reflection that has been overwritten by this reflection.\n     *\n     * Applies to interface and class members.\n     */\n    overwrites?: ReferenceType;\n\n    /**\n     * A type that points to the reflection this reflection has been inherited from.\n     *\n     * Applies to interface and class members.\n     */\n    inheritedFrom?: ReferenceType;\n\n    /**\n     * A type that points to the reflection this reflection is the implementation of.\n     *\n     * Applies to class members.\n     */\n    implementationOf?: ReferenceType;\n\n    override traverse(callback: TraverseCallback) {\n        if (this.type instanceof ReflectionType) {\n            if (\n                callback(\n                    this.type.declaration,\n                    TraverseProperty.TypeLiteral,\n                ) === false\n            ) {\n                return;\n            }\n        }\n\n        for (const parameter of this.typeParameters?.slice() || []) {\n            if (callback(parameter, TraverseProperty.TypeParameter) === false) {\n                return;\n            }\n        }\n\n        for (const parameter of this.parameters?.slice() || []) {\n            if (callback(parameter, TraverseProperty.Parameters) === false) {\n                return;\n            }\n        }\n    }\n\n    override isSignature(): this is SignatureReflection {\n        return true;\n    }\n\n    /**\n     * Return a string representation of this reflection.\n     */\n    override toString(): string {\n        let result = super.toString();\n\n        if (this.typeParameters) {\n            const parameters: string[] = this.typeParameters.map(\n                (parameter) => parameter.name,\n            );\n            result += \"<\" + parameters.join(\", \") + \">\";\n        }\n\n        if (this.type) {\n            result += \": \" + this.type.toString();\n        }\n\n        return result;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.SignatureReflection {\n        return {\n            ...super.toObject(serializer),\n            variant: this.variant,\n            sources: serializer.toObjectsOptional(this.sources),\n            typeParameters: serializer.toObjectsOptional(this.typeParameters),\n            parameters: serializer.toObjectsOptional(this.parameters),\n            type: serializer.toObject(this.type),\n            overwrites: serializer.toObject(this.overwrites),\n            inheritedFrom: serializer.toObject(this.inheritedFrom),\n            implementationOf: serializer.toObject(this.implementationOf),\n        };\n    }\n\n    override fromObject(\n        de: Deserializer,\n        obj: JSONOutput.SignatureReflection,\n    ): void {\n        super.fromObject(de, obj);\n\n        this.sources = de.reviveMany(\n            obj.sources,\n            (t) => new SourceReference(t.fileName, t.line, t.character),\n        );\n        this.typeParameters = de.reviveMany(obj.typeParameters, (t) => de.constructReflection(t));\n        this.parameters = de.reviveMany(obj.parameters, (t) => de.constructReflection(t));\n        this.type = de.reviveType(obj.type);\n        this.overwrites = de.reviveType(obj.overwrites);\n        this.inheritedFrom = de.reviveType(obj.inheritedFrom);\n        this.implementationOf = de.reviveType(obj.implementationOf);\n    }\n}\n"
  },
  {
    "path": "src/lib/models/SourceReference.ts",
    "content": "import type { Deserializer, JSONOutput } from \"#serialization\";\n\n/**\n * Represents references of reflections to their defining source files.\n *\n * @see {@link DeclarationReflection.sources}\n */\nexport class SourceReference {\n    /**\n     * The filename of the source file.\n     */\n    fileName: string;\n\n    /**\n     * The absolute filename of the source file.\n     * @internal\n     */\n    fullFileName: string;\n\n    /**\n     * The one based number of the line that emitted the declaration.\n     */\n    line: number;\n\n    /**\n     * The index of the character that emitted the declaration.\n     */\n    character: number;\n\n    /**\n     * URL for displaying the source file.\n     */\n    url?: string;\n\n    constructor(fileName: string, line: number, character: number) {\n        this.fileName = fileName;\n        this.fullFileName = fileName;\n        this.line = line;\n        this.character = character;\n    }\n\n    equals(other: SourceReference) {\n        return (\n            this.fullFileName == other.fullFileName &&\n            this.line === other.line &&\n            this.character === other.character\n        );\n    }\n\n    toObject(): JSONOutput.SourceReference {\n        return {\n            fileName: this.fileName,\n            line: this.line,\n            character: this.character,\n            url: this.url,\n        };\n    }\n\n    fromObject(_de: Deserializer, obj: JSONOutput.SourceReference) {\n        this.url = obj.url;\n    }\n}\n"
  },
  {
    "path": "src/lib/models/TypeParameterReflection.ts",
    "content": "import type { SomeType } from \"./types.js\";\nimport { Reflection, type TraverseCallback } from \"./Reflection.js\";\nimport type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport { ReflectionKind } from \"./kind.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\n\n/**\n * Modifier flags for type parameters, added in TS 4.7\n * @enum\n */\nexport const VarianceModifier = {\n    in: \"in\",\n    out: \"out\",\n    inOut: \"in out\",\n} as const;\nexport type VarianceModifier = (typeof VarianceModifier)[keyof typeof VarianceModifier];\n\n/**\n * @category Reflections\n */\nexport class TypeParameterReflection extends Reflection {\n    readonly variant = \"typeParam\";\n\n    declare parent?: DeclarationReflection | SignatureReflection;\n\n    type?: SomeType;\n\n    default?: SomeType;\n\n    varianceModifier?: VarianceModifier;\n\n    constructor(\n        name: string,\n        parent: Reflection,\n        varianceModifier: VarianceModifier | undefined,\n    ) {\n        super(name, ReflectionKind.TypeParameter, parent);\n        this.varianceModifier = varianceModifier;\n    }\n\n    override isTypeParameter(): this is TypeParameterReflection {\n        return true;\n    }\n\n    override toObject(\n        serializer: Serializer,\n    ): JSONOutput.TypeParameterReflection {\n        return {\n            ...super.toObject(serializer),\n            variant: this.variant,\n            type: serializer.toObject(this.type),\n            default: serializer.toObject(this.default),\n            varianceModifier: this.varianceModifier,\n        };\n    }\n\n    override fromObject(\n        de: Deserializer,\n        obj: JSONOutput.TypeParameterReflection,\n    ): void {\n        super.fromObject(de, obj);\n        this.type = de.reviveType(obj.type);\n        this.default = de.reviveType(obj.default);\n        this.varianceModifier = obj.varianceModifier;\n    }\n\n    override traverse(_callback: TraverseCallback): void {\n        // do nothing, no child reflections.\n    }\n}\n"
  },
  {
    "path": "src/lib/models/index.ts",
    "content": "export * from \"./Comment.js\";\nexport * from \"./ContainerReflection.js\";\nexport * from \"./DeclarationReflection.js\";\nexport * from \"./DocumentReflection.js\";\nexport * from \"./FileRegistry.js\";\nexport * from \"./kind.js\";\nexport * from \"./ParameterReflection.js\";\nexport { ProjectReflection } from \"./ProjectReflection.js\";\nexport * from \"./ReferenceReflection.js\";\nexport * from \"./Reflection.js\";\nexport * from \"./ReflectionCategory.js\";\nexport * from \"./ReflectionGroup.js\";\nexport * from \"./ReflectionSymbolId.js\";\nexport * from \"./SignatureReflection.js\";\nexport * from \"./SourceReference.js\";\nexport * from \"./TypeParameterReflection.js\";\nexport * from \"./types.js\";\nexport * from \"./utils.js\";\nexport * from \"./variant.js\";\n"
  },
  {
    "path": "src/lib/models/kind.ts",
    "content": "import { type EnumKeys, i18n } from \"#utils\";\n\n/**\n * Defines the available reflection kinds.\n * @category Reflections\n */\nexport enum ReflectionKind {\n    Project = 0x1,\n    Module = 0x2,\n    Namespace = 0x4,\n    Enum = 0x8,\n    EnumMember = 0x10,\n    Variable = 0x20,\n    Function = 0x40,\n    Class = 0x80,\n    Interface = 0x100,\n    Constructor = 0x200,\n    Property = 0x400,\n    Method = 0x800,\n    CallSignature = 0x1000,\n    IndexSignature = 0x2000,\n    ConstructorSignature = 0x4000,\n    Parameter = 0x8000,\n    TypeLiteral = 0x10000,\n    TypeParameter = 0x20000,\n    Accessor = 0x40000,\n    GetSignature = 0x80000,\n    SetSignature = 0x100000,\n    TypeAlias = 0x200000,\n    Reference = 0x400000,\n    /**\n     * Generic non-ts content to be included in the generated docs as its own page.\n     */\n    Document = 0x800000,\n}\n\n/** @category Reflections */\nexport namespace ReflectionKind {\n    export type KindString = EnumKeys<typeof ReflectionKind>;\n\n    /** @internal */\n    export const All = ReflectionKind.Reference * 2 - 1;\n\n    /** @internal */\n    export const ClassOrInterface = ReflectionKind.Class | ReflectionKind.Interface;\n    /** @internal */\n    export const VariableOrProperty = ReflectionKind.Variable | ReflectionKind.Property;\n    /** @internal */\n    export const FunctionOrMethod = ReflectionKind.Function | ReflectionKind.Method;\n    /** @internal */\n    export const ClassMember = ReflectionKind.Accessor |\n        ReflectionKind.Constructor |\n        ReflectionKind.Method |\n        ReflectionKind.Property;\n    /** @internal */\n    export const SomeSignature = ReflectionKind.CallSignature |\n        ReflectionKind.IndexSignature |\n        ReflectionKind.ConstructorSignature |\n        ReflectionKind.GetSignature |\n        ReflectionKind.SetSignature;\n    /** @internal */\n    export const SomeModule = ReflectionKind.Namespace | ReflectionKind.Module;\n    /** @internal */\n    export const SomeType = ReflectionKind.Interface |\n        ReflectionKind.TypeLiteral |\n        ReflectionKind.TypeParameter |\n        ReflectionKind.TypeAlias;\n    /** @internal */\n    export const SomeValue = ReflectionKind.Variable | ReflectionKind.Function;\n    /** @internal */\n    export const SomeMember = ReflectionKind.EnumMember |\n        ReflectionKind.Property |\n        ReflectionKind.Method |\n        ReflectionKind.Accessor;\n    /** @internal */\n    export const SomeExport = ReflectionKind.Module |\n        ReflectionKind.Namespace |\n        ReflectionKind.Enum |\n        ReflectionKind.Variable |\n        ReflectionKind.Function |\n        ReflectionKind.Class |\n        ReflectionKind.Interface |\n        ReflectionKind.TypeAlias |\n        ReflectionKind.Reference;\n    /** @internal */\n    export const MayContainDocuments = SomeExport | ReflectionKind.Project | ReflectionKind.Document;\n    /** @internal */\n    export const ExportContainer = ReflectionKind.SomeModule | ReflectionKind.Project;\n\n    /** @internal */\n    export const Inheritable = ReflectionKind.Accessor |\n        ReflectionKind.IndexSignature |\n        ReflectionKind.Property |\n        ReflectionKind.Method |\n        ReflectionKind.Constructor;\n\n    /** @internal */\n    export const ContainsCallSignatures = ReflectionKind.Constructor |\n        ReflectionKind.Function |\n        ReflectionKind.Method;\n\n    // The differences between Type/Value here only really matter for\n    // possibly merged declarations where we have multiple reflections.\n    /** @internal */\n    export const TypeReferenceTarget = ReflectionKind.Interface |\n        ReflectionKind.TypeAlias |\n        ReflectionKind.Class |\n        ReflectionKind.Enum;\n    /** @internal */\n    export const ValueReferenceTarget = ReflectionKind.Module |\n        ReflectionKind.Namespace |\n        ReflectionKind.Variable |\n        ReflectionKind.Function;\n\n    /**\n     * Note: This does not include Class/Interface, even though they technically could contain index signatures\n     * @internal\n     */\n    export const SignatureContainer = ContainsCallSignatures | ReflectionKind.Accessor;\n\n    /** @internal */\n    export const VariableContainer = SomeModule | ReflectionKind.Project;\n\n    /** @internal */\n    export const MethodContainer = ClassOrInterface |\n        VariableOrProperty |\n        FunctionOrMethod |\n        ReflectionKind.TypeLiteral;\n\n    export function singularString(kind: ReflectionKind) {\n        switch (kind) {\n            case ReflectionKind.Project:\n                return i18n.kind_project();\n            case ReflectionKind.Module:\n                return i18n.kind_module();\n            case ReflectionKind.Namespace:\n                return i18n.kind_namespace();\n            case ReflectionKind.Enum:\n                return i18n.kind_enum();\n            case ReflectionKind.EnumMember:\n                return i18n.kind_enum_member();\n            case ReflectionKind.Variable:\n                return i18n.kind_variable();\n            case ReflectionKind.Function:\n                return i18n.kind_function();\n            case ReflectionKind.Class:\n                return i18n.kind_class();\n            case ReflectionKind.Interface:\n                return i18n.kind_interface();\n            case ReflectionKind.Constructor:\n                return i18n.kind_constructor();\n            case ReflectionKind.Property:\n                return i18n.kind_property();\n            case ReflectionKind.Method:\n                return i18n.kind_method();\n            case ReflectionKind.CallSignature:\n                return i18n.kind_call_signature();\n            case ReflectionKind.IndexSignature:\n                return i18n.kind_index_signature();\n            case ReflectionKind.ConstructorSignature:\n                return i18n.kind_constructor_signature();\n            case ReflectionKind.Parameter:\n                return i18n.kind_parameter();\n            case ReflectionKind.TypeLiteral:\n                return i18n.kind_type_literal();\n            case ReflectionKind.TypeParameter:\n                return i18n.kind_type_parameter();\n            case ReflectionKind.Accessor:\n                return i18n.kind_accessor();\n            case ReflectionKind.GetSignature:\n                return i18n.kind_get_signature();\n            case ReflectionKind.SetSignature:\n                return i18n.kind_set_signature();\n            case ReflectionKind.TypeAlias:\n                return i18n.kind_type_alias();\n            case ReflectionKind.Reference:\n                return i18n.kind_reference();\n            case ReflectionKind.Document:\n                return i18n.kind_document();\n        }\n    }\n\n    export function pluralString(kind: ReflectionKind): string {\n        switch (kind) {\n            case ReflectionKind.Project:\n                return i18n.kind_plural_project();\n            case ReflectionKind.Module:\n                return i18n.kind_plural_module();\n            case ReflectionKind.Namespace:\n                return i18n.kind_plural_namespace();\n            case ReflectionKind.Enum:\n                return i18n.kind_plural_enum();\n            case ReflectionKind.EnumMember:\n                return i18n.kind_plural_enum_member();\n            case ReflectionKind.Variable:\n                return i18n.kind_plural_variable();\n            case ReflectionKind.Function:\n                return i18n.kind_plural_function();\n            case ReflectionKind.Class:\n                return i18n.kind_plural_class();\n            case ReflectionKind.Interface:\n                return i18n.kind_plural_interface();\n            case ReflectionKind.Constructor:\n                return i18n.kind_plural_constructor();\n            case ReflectionKind.Property:\n                return i18n.kind_plural_property();\n            case ReflectionKind.Method:\n                return i18n.kind_plural_method();\n            case ReflectionKind.CallSignature:\n                return i18n.kind_plural_call_signature();\n            case ReflectionKind.IndexSignature:\n                return i18n.kind_plural_index_signature();\n            case ReflectionKind.ConstructorSignature:\n                return i18n.kind_plural_constructor_signature();\n            case ReflectionKind.Parameter:\n                return i18n.kind_plural_parameter();\n            case ReflectionKind.TypeLiteral:\n                return i18n.kind_plural_type_literal();\n            case ReflectionKind.TypeParameter:\n                return i18n.kind_plural_type_parameter();\n            case ReflectionKind.Accessor:\n                return i18n.kind_plural_accessor();\n            case ReflectionKind.GetSignature:\n                return i18n.kind_plural_get_signature();\n            case ReflectionKind.SetSignature:\n                return i18n.kind_plural_set_signature();\n            case ReflectionKind.TypeAlias:\n                return i18n.kind_plural_type_alias();\n            case ReflectionKind.Reference:\n                return i18n.kind_plural_reference();\n            case ReflectionKind.Document:\n                return i18n.kind_plural_document();\n        }\n    }\n\n    export function classString(kind: ReflectionKind): string {\n        return `tsd-kind-${\n            ReflectionKind[kind]\n                .replace(/(.)([A-Z])/g, (_m, a, b) => `${a}-${b}`)\n                .toLowerCase()\n        }`;\n    }\n}\n"
  },
  {
    "path": "src/lib/models/types.ts",
    "content": "import type { Reflection, ReflectionId } from \"./Reflection.js\";\nimport type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport type { ProjectReflection } from \"./ProjectReflection.js\";\nimport type { Deserializer, JSONOutput, Serializer } from \"#serialization\";\nimport { ReflectionSymbolId } from \"./ReflectionSymbolId.js\";\nimport type { DeclarationReference } from \"#utils\";\nimport { ReflectionKind } from \"./kind.js\";\nimport { Comment, type CommentDisplayPart } from \"./Comment.js\";\nimport { i18n, joinArray, NonEnumerable } from \"#utils\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\n\n/**\n * Base class of all type definitions.\n * @category Types\n */\nexport abstract class Type {\n    /**\n     * The type name identifier.\n     */\n    abstract readonly type: keyof TypeKindMap;\n\n    /**\n     * Return a string representation of this type.\n     */\n    toString(): string {\n        return this.stringify(TypeContext.none);\n    }\n\n    /**\n     * Visit this type, returning the value returned by the visitor.\n     */\n    visit<T, A extends any[] = []>(visitor: TypeVisitor<T, A>, ...args: A): T;\n    visit<T, A extends any[] = []>(\n        visitor: Partial<TypeVisitor<T, A>>,\n        ...args: A\n    ): T | undefined;\n    visit(\n        visitor: Partial<TypeVisitor<unknown, any[]>>,\n        ...args: any[]\n    ): unknown {\n        return visitor[this.type]?.(this as never, ...args);\n    }\n\n    stringify(context: TypeContext) {\n        if (this.needsParenthesis(context)) {\n            return `(${this.getTypeString()})`;\n        }\n        return this.getTypeString();\n    }\n\n    abstract toObject(serializer: Serializer): JSONOutput.SomeType;\n\n    // Nothing to do for the majority of types.\n    fromObject(_de: Deserializer, _obj: JSONOutput.SomeType) {}\n\n    abstract needsParenthesis(context: TypeContext): boolean;\n\n    /**\n     * Implementation method for `toString`. `needsParenthesis` will be used to determine if\n     * the returned string should be wrapped in parenthesis.\n     */\n    protected abstract getTypeString(): string;\n\n    /**\n     * Return the estimated size of the type if it was all printed on one line.\n     */\n    estimatePrintWidth(): number {\n        return this.getTypeString().length;\n    }\n}\n\n/** @category Types */\nexport interface TypeKindMap {\n    array: ArrayType;\n    conditional: ConditionalType;\n    indexedAccess: IndexedAccessType;\n    inferred: InferredType;\n    intersection: IntersectionType;\n    intrinsic: IntrinsicType;\n    literal: LiteralType;\n    mapped: MappedType;\n    optional: OptionalType;\n    predicate: PredicateType;\n    query: QueryType;\n    reference: ReferenceType;\n    reflection: ReflectionType;\n    rest: RestType;\n    templateLiteral: TemplateLiteralType;\n    tuple: TupleType;\n    namedTupleMember: NamedTupleMember;\n    typeOperator: TypeOperatorType;\n    union: UnionType;\n    unknown: UnknownType;\n}\n\nexport type TypeVisitor<T = void, A extends any[] = []> = {\n    [K in TypeKind]: (type: TypeKindMap[K], ...args: A) => T;\n};\n\nexport function makeRecursiveVisitor(\n    visitor: Partial<TypeVisitor>,\n): TypeVisitor {\n    const recursiveVisitor: TypeVisitor = {\n        namedTupleMember(type) {\n            visitor.namedTupleMember?.(type);\n            type.element.visit(recursiveVisitor);\n        },\n        templateLiteral(type) {\n            visitor.templateLiteral?.(type);\n            for (const [h] of type.tail) {\n                h.visit(recursiveVisitor);\n            }\n        },\n        array(type) {\n            visitor.array?.(type);\n            type.elementType.visit(recursiveVisitor);\n        },\n        conditional(type) {\n            visitor.conditional?.(type);\n            type.checkType.visit(recursiveVisitor);\n            type.extendsType.visit(recursiveVisitor);\n            type.trueType.visit(recursiveVisitor);\n            type.falseType.visit(recursiveVisitor);\n        },\n        indexedAccess(type) {\n            visitor.indexedAccess?.(type);\n            type.indexType.visit(recursiveVisitor);\n            type.objectType.visit(recursiveVisitor);\n        },\n        inferred(type) {\n            visitor.inferred?.(type);\n            type.constraint?.visit(recursiveVisitor);\n        },\n        intersection(type) {\n            visitor.intersection?.(type);\n            type.types.forEach((t) => t.visit(recursiveVisitor));\n        },\n        intrinsic(type) {\n            visitor.intrinsic?.(type);\n        },\n        literal(type) {\n            visitor.literal?.(type);\n        },\n        mapped(type) {\n            visitor.mapped?.(type);\n            type.nameType?.visit(recursiveVisitor);\n            type.parameterType.visit(recursiveVisitor);\n            type.templateType.visit(recursiveVisitor);\n        },\n        optional(type) {\n            visitor.optional?.(type);\n            type.elementType.visit(recursiveVisitor);\n        },\n        predicate(type) {\n            visitor.predicate?.(type);\n            type.targetType?.visit(recursiveVisitor);\n        },\n        query(type) {\n            visitor.query?.(type);\n            type.queryType.visit(recursiveVisitor);\n        },\n        reference(type) {\n            visitor.reference?.(type);\n            type.typeArguments?.forEach((t) => t.visit(recursiveVisitor));\n        },\n        reflection(type) {\n            visitor.reflection?.(type);\n            // Future: This should maybe recurse too?\n            // See the validator in exports.ts for how to do it.\n        },\n        rest(type) {\n            visitor.rest?.(type);\n            type.elementType.visit(recursiveVisitor);\n        },\n        tuple(type) {\n            visitor.tuple?.(type);\n            type.elements.forEach((t) => t.visit(recursiveVisitor));\n        },\n        typeOperator(type) {\n            visitor.typeOperator?.(type);\n            type.target.visit(recursiveVisitor);\n        },\n        union(type) {\n            visitor.union?.(type);\n            type.types.forEach((t) => t.visit(recursiveVisitor));\n        },\n        unknown(type) {\n            visitor.unknown?.(type);\n        },\n    };\n    return recursiveVisitor;\n}\n\n/** @category Types */\nexport type TypeKind = keyof TypeKindMap;\n\n/** @category Types */\nexport type SomeType = TypeKindMap[keyof TypeKindMap];\n\n/**\n * Enumeration that can be used when traversing types to track the location of recursion.\n * Used by TypeDoc internally to track when to output parenthesis when rendering.\n * @enum\n */\nexport const TypeContext = {\n    none: \"none\",\n    templateLiteralElement: \"templateLiteralElement\", // `${here}`\n    arrayElement: \"arrayElement\", // here[]\n    indexedAccessElement: \"indexedAccessElement\", // {}[here]\n    conditionalCheck: \"conditionalCheck\", // here extends 1 ? 2 : 3\n    conditionalExtends: \"conditionalExtends\", // 1 extends here ? 2 : 3\n    conditionalTrue: \"conditionalTrue\", // 1 extends 2 ? here : 3\n    conditionalFalse: \"conditionalFalse\", // 1 extends 2 ? 3 : here\n    indexedIndex: \"indexedIndex\", // {}[here]\n    indexedObject: \"indexedObject\", // here[1]\n    inferredConstraint: \"inferredConstraint\", // 1 extends infer X extends here ? 1 : 2\n    intersectionElement: \"intersectionElement\", // here & 1\n    mappedName: \"mappedName\", // { [k in string as here]: 1 }\n    mappedParameter: \"mappedParameter\", // { [k in here]: 1 }\n    mappedTemplate: \"mappedTemplate\", // { [k in string]: here }\n    optionalElement: \"optionalElement\", // [here?]\n    predicateTarget: \"predicateTarget\", // (): X is here\n    queryTypeTarget: \"queryTypeTarget\", // typeof here, can only ever be a ReferenceType\n    typeOperatorTarget: \"typeOperatorTarget\", // keyof here\n    referenceTypeArgument: \"referenceTypeArgument\", // X<here>\n    restElement: \"restElement\", // [...here]\n    tupleElement: \"tupleElement\", // [here]\n    unionElement: \"unionElement\", // here | 1\n} as const;\nexport type TypeContext = (typeof TypeContext)[keyof typeof TypeContext];\n\n/**\n * Represents an array type.\n *\n * ```ts\n * let value: string[];\n * ```\n * @category Types\n */\nexport class ArrayType extends Type {\n    override readonly type = \"array\";\n\n    /**\n     * @param elementType The type of the elements in the array.\n     */\n    constructor(public elementType: SomeType) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return this.elementType.stringify(TypeContext.arrayElement) + \"[]\";\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ArrayType {\n        return {\n            type: this.type,\n            elementType: serializer.toObject(this.elementType),\n        };\n    }\n}\n\n/**\n * Represents a conditional type.\n *\n * ```ts\n * let value: Check extends Extends ? True : False;\n * ```\n * @category Types\n */\nexport class ConditionalType extends Type {\n    override readonly type = \"conditional\";\n\n    constructor(\n        public checkType: SomeType,\n        public extendsType: SomeType,\n        public trueType: SomeType,\n        public falseType: SomeType,\n    ) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return [\n            this.checkType.stringify(TypeContext.conditionalCheck),\n            \"extends\",\n            this.extendsType.stringify(TypeContext.conditionalExtends),\n            \"?\",\n            this.trueType.stringify(TypeContext.conditionalTrue),\n            \":\",\n            this.falseType.stringify(TypeContext.conditionalFalse),\n        ].join(\" \");\n    }\n\n    override needsParenthesis(context: TypeContext): boolean {\n        const map: Record<TypeContext, boolean> = {\n            none: false,\n            templateLiteralElement: false,\n            arrayElement: true,\n            indexedAccessElement: false,\n            conditionalCheck: true,\n            conditionalExtends: true,\n            conditionalTrue: false,\n            conditionalFalse: false,\n            indexedIndex: false,\n            indexedObject: true,\n            inferredConstraint: true,\n            intersectionElement: true,\n            mappedName: false,\n            mappedParameter: false,\n            mappedTemplate: false,\n            optionalElement: true,\n            predicateTarget: false,\n            queryTypeTarget: false,\n            typeOperatorTarget: true,\n            referenceTypeArgument: false,\n            restElement: true,\n            tupleElement: false,\n            unionElement: true,\n        };\n\n        return map[context];\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ConditionalType {\n        return {\n            type: this.type,\n            checkType: serializer.toObject(this.checkType),\n            extendsType: serializer.toObject(this.extendsType),\n            trueType: serializer.toObject(this.trueType),\n            falseType: serializer.toObject(this.falseType),\n        };\n    }\n}\n\n/**\n * Represents an indexed access type.\n * @category Types\n */\nexport class IndexedAccessType extends Type {\n    override readonly type = \"indexedAccess\";\n\n    constructor(\n        public objectType: SomeType,\n        public indexType: SomeType,\n    ) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return [\n            this.objectType.stringify(TypeContext.indexedObject),\n            \"[\",\n            this.indexType.stringify(TypeContext.indexedIndex),\n            \"]\",\n        ].join(\"\");\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.IndexedAccessType {\n        return {\n            type: this.type,\n            indexType: serializer.toObject(this.indexType),\n            objectType: serializer.toObject(this.objectType),\n        };\n    }\n}\n\n/**\n * Represents an inferred type, U in the example below.\n *\n * ```ts\n * type Z = Promise<string> extends Promise<infer U> : never\n * ```\n * @category Types\n */\nexport class InferredType extends Type {\n    override readonly type = \"inferred\";\n\n    constructor(\n        public name: string,\n        public constraint?: SomeType,\n    ) {\n        super();\n    }\n\n    protected override getTypeString() {\n        if (this.constraint) {\n            return `infer ${this.name} extends ${\n                this.constraint.stringify(\n                    TypeContext.inferredConstraint,\n                )\n            }`;\n        }\n        return `infer ${this.name}`;\n    }\n\n    override needsParenthesis(context: TypeContext): boolean {\n        const map: Record<TypeContext, boolean> = {\n            none: false,\n            templateLiteralElement: false,\n            arrayElement: true,\n            indexedAccessElement: false,\n            conditionalCheck: false,\n            conditionalExtends: false,\n            conditionalTrue: false,\n            conditionalFalse: false,\n            indexedIndex: false,\n            indexedObject: true,\n            inferredConstraint: false,\n            intersectionElement: false,\n            mappedName: false,\n            mappedParameter: false,\n            mappedTemplate: false,\n            optionalElement: true,\n            predicateTarget: false,\n            queryTypeTarget: false,\n            typeOperatorTarget: false,\n            referenceTypeArgument: false,\n            restElement: true,\n            tupleElement: false,\n            unionElement: false,\n        };\n\n        return map[context];\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.InferredType {\n        return {\n            type: this.type,\n            name: this.name,\n            constraint: serializer.toObject(this.constraint),\n        };\n    }\n}\n\n/**\n * Represents an intersection type.\n *\n * ```ts\n * let value: A & B;\n * ```\n * @category Types\n */\nexport class IntersectionType extends Type {\n    override readonly type = \"intersection\";\n\n    constructor(public types: SomeType[]) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return this.types\n            .map((t) => t.stringify(TypeContext.intersectionElement))\n            .join(\" & \");\n    }\n\n    override needsParenthesis(context: TypeContext): boolean {\n        const map: Record<TypeContext, boolean> = {\n            none: false,\n            templateLiteralElement: false,\n            arrayElement: true,\n            indexedAccessElement: false,\n            conditionalCheck: true,\n            conditionalExtends: false,\n            conditionalTrue: false,\n            conditionalFalse: false,\n            indexedIndex: false,\n            indexedObject: true,\n            inferredConstraint: false,\n            intersectionElement: false,\n            mappedName: false,\n            mappedParameter: false,\n            mappedTemplate: false,\n            optionalElement: true,\n            predicateTarget: false,\n            queryTypeTarget: false,\n            typeOperatorTarget: true,\n            referenceTypeArgument: false,\n            restElement: true,\n            tupleElement: false,\n            unionElement: false,\n        };\n\n        return map[context];\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.IntersectionType {\n        return {\n            type: this.type,\n            types: this.types.map((t) => serializer.toObject(t)),\n        };\n    }\n}\n\n/**\n * Represents an intrinsic type like `string` or `boolean`.\n *\n * ```ts\n * let value: number;\n * ```\n * @category Types\n */\nexport class IntrinsicType extends Type {\n    override readonly type = \"intrinsic\";\n\n    constructor(public name: string) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return this.name;\n    }\n\n    override toObject(): JSONOutput.IntrinsicType {\n        return {\n            type: this.type,\n            name: this.name,\n        };\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n}\n\n/**\n * Represents a literal type.\n *\n * ```ts\n * type A = \"A\"\n * type B = 1\n * ```\n * @category Types\n */\nexport class LiteralType extends Type {\n    override readonly type = \"literal\";\n\n    constructor(public value: string | number | boolean | null | bigint) {\n        super();\n    }\n\n    /**\n     * Return a string representation of this type.\n     */\n    protected override getTypeString(): string {\n        if (typeof this.value === \"bigint\") {\n            return this.value.toString() + \"n\";\n        }\n        return JSON.stringify(this.value);\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(): JSONOutput.LiteralType {\n        if (typeof this.value === \"bigint\") {\n            return {\n                type: this.type,\n                value: {\n                    value: this.value.toString().replace(\"-\", \"\"),\n                    negative: this.value < BigInt(\"0\"),\n                },\n            };\n        }\n\n        return {\n            type: this.type,\n            value: this.value,\n        };\n    }\n}\n\n/**\n * Represents a mapped type.\n *\n * ```ts\n * { -readonly [K in Parameter as Name]?: Template }\n * ```\n * @category Types\n */\nexport class MappedType extends Type {\n    override readonly type = \"mapped\";\n\n    constructor(\n        public parameter: string,\n        public parameterType: SomeType,\n        public templateType: SomeType,\n        public readonlyModifier?: \"+\" | \"-\",\n        public optionalModifier?: \"+\" | \"-\",\n        public nameType?: SomeType,\n    ) {\n        super();\n    }\n\n    protected override getTypeString(): string {\n        const read = {\n            \"+\": \"readonly \",\n            \"-\": \"-readonly \",\n            \"\": \"\",\n        }[this.readonlyModifier ?? \"\"];\n\n        const opt = {\n            \"+\": \"?\",\n            \"-\": \"-?\",\n            \"\": \"\",\n        }[this.optionalModifier ?? \"\"];\n\n        const parts = [\n            \"{ \",\n            read,\n            \"[\",\n            this.parameter,\n            \" in \",\n            this.parameterType.stringify(TypeContext.mappedParameter),\n        ];\n\n        if (this.nameType) {\n            parts.push(\" as \", this.nameType.stringify(TypeContext.mappedName));\n        }\n\n        parts.push(\n            \"]\",\n            opt,\n            \": \",\n            this.templateType.stringify(TypeContext.mappedTemplate),\n            \" }\",\n        );\n        return parts.join(\"\");\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.MappedType {\n        return {\n            type: this.type,\n            parameter: this.parameter,\n            parameterType: serializer.toObject(this.parameterType),\n            templateType: serializer.toObject(this.templateType),\n            readonlyModifier: this.readonlyModifier,\n            optionalModifier: this.optionalModifier,\n            nameType: serializer.toObject(this.nameType),\n        };\n    }\n}\n\n/**\n * Represents an optional type\n * ```ts\n * type Z = [1, 2?]\n * //           ^^\n * ```\n * @category Types\n */\nexport class OptionalType extends Type {\n    override readonly type = \"optional\";\n\n    constructor(public elementType: SomeType) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return this.elementType.stringify(TypeContext.optionalElement) + \"?\";\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.OptionalType {\n        return {\n            type: this.type,\n            elementType: serializer.toObject(this.elementType),\n        };\n    }\n}\n\n/**\n * Represents a type predicate.\n *\n * ```ts\n * function isString(x: unknown): x is string {}\n * function assert(condition: boolean): asserts condition {}\n * ```\n * @category Types\n */\nexport class PredicateType extends Type {\n    override readonly type = \"predicate\";\n\n    /**\n     * Create a new PredicateType instance.\n     *\n     * @param name The identifier name which is tested by the predicate.\n     * @param asserts True if the type is of the form `asserts val is string`,\n     *                false if the type is of the form `val is string`\n     * @param targetType The type that the identifier is tested to be.\n     *                   May be undefined if the type is of the form `asserts val`.\n     *                   Will be defined if the type is of the form `asserts val is string` or `val is string`.\n     */\n    constructor(\n        public name: string,\n        public asserts: boolean,\n        public targetType?: SomeType,\n    ) {\n        super();\n    }\n\n    /**\n     * Return a string representation of this type.\n     */\n    protected override getTypeString() {\n        const out = this.asserts ? [\"asserts\", this.name] : [this.name];\n        if (this.targetType) {\n            out.push(\n                \"is\",\n                this.targetType.stringify(TypeContext.predicateTarget),\n            );\n        }\n\n        return out.join(\" \");\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.PredicateType {\n        return {\n            type: this.type,\n            name: this.name,\n            asserts: this.asserts,\n            targetType: serializer.toObject(this.targetType),\n        };\n    }\n}\n\n/**\n * Represents a type that is constructed by querying the type of a reflection.\n * ```ts\n * const x = 1\n * type Z = typeof x // query on reflection for x\n * ```\n * @category Types\n */\nexport class QueryType extends Type {\n    override readonly type = \"query\";\n\n    constructor(public queryType: ReferenceType) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return `typeof ${\n            this.queryType.stringify(\n                TypeContext.queryTypeTarget,\n            )\n        }`;\n    }\n\n    /**\n     * @privateRemarks\n     * An argument could be made that this ought to return true for indexedObject\n     * since precedence is different than on the value side... if someone really cares\n     * they can easily use a custom theme to change this.\n     */\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.QueryType {\n        return {\n            type: this.type,\n            queryType: serializer.toObject(this.queryType),\n        };\n    }\n}\n\n/**\n * Represents a type that refers to another reflection like a class, interface or enum.\n *\n * ```ts\n * let value: MyClass<T>;\n * ```\n * @category Types\n */\nexport class ReferenceType extends Type {\n    override readonly type = \"reference\";\n\n    /**\n     * The name of the referenced type.\n     *\n     * If the symbol cannot be found because it's not part of the documentation this\n     * can be used to represent the type.\n     */\n    name: string;\n\n    /**\n     * The type arguments of this reference.\n     */\n    typeArguments?: SomeType[];\n\n    /**\n     * The resolved reflection.\n     */\n    get reflection(): Reflection | undefined {\n        if (typeof this._target === \"number\") {\n            return this._project?.getReflectionById(this._target);\n        }\n        const resolvePotential = this._project?.getReflectionsFromSymbolId(\n            this._target,\n        );\n        if (!resolvePotential?.length) {\n            return;\n        }\n\n        const kind = this.preferValues\n            ? ReflectionKind.ValueReferenceTarget\n            : ReflectionKind.TypeReferenceTarget;\n\n        const resolved = resolvePotential.find((refl) => refl.kindOf(kind)) ||\n            resolvePotential.find((refl) => refl.kindOf(~kind))!;\n\n        // Do not mark the type as resolved at this point so that if it\n        // points to a member which is removed (e.g. by typedoc-plugin-zod)\n        // and then replaced it still ends up pointing at the right reflection.\n        // We will lock type reference resolution when serializing to JSON.\n        // this._target = resolved.id;\n\n        return resolved;\n    }\n\n    /**\n     * Sometimes a few properties are more important than the rest\n     * of the properties within a type. This occurs most often with\n     * object parameters, where users want to specify `@param foo.bar`\n     * to highlight something about the `bar` property.\n     *\n     * Does NOT support nested properties.\n     */\n    highlightedProperties?: Map<string, CommentDisplayPart[]>;\n\n    /**\n     * If not resolved, the symbol id of the reflection, otherwise undefined.\n     */\n    get symbolId(): ReflectionSymbolId | undefined {\n        if (!this.reflection && typeof this._target === \"object\") {\n            return this._target;\n        }\n    }\n\n    /**\n     * Checks if this type is a reference type because it uses a name, but is intentionally not pointing\n     * to a reflection. This happens for type parameters and when representing a mapped type.\n     */\n    isIntentionallyBroken(): boolean {\n        if (\n            typeof this._target === \"object\" &&\n            this._project?.symbolIdHasBeenRemoved(this._target)\n        ) {\n            return true;\n        }\n        return this._target === -1 || this.refersToTypeParameter;\n    }\n\n    /**\n     * Convert this reference type to a declaration reference used for resolution of external types.\n     */\n    toDeclarationReference(): DeclarationReference {\n        return {\n            resolutionStart: \"global\",\n            moduleSource: this.package,\n            symbolReference: {\n                path: this.qualifiedName\n                    .split(\".\")\n                    .map((p) => ({ path: p, navigation: \".\" })),\n            },\n        };\n    }\n\n    /**\n     * The fully qualified name of the referenced type, relative to the file it is defined in.\n     * This will usually be the same as `name`, unless namespaces are used.\n     */\n    qualifiedName: string;\n\n    /**\n     * The package that this type is referencing.\n     */\n    package?: string;\n\n    /**\n     * If this reference type refers to a reflection defined by a project not being rendered,\n     * points to the url that this type should be linked to.\n     */\n    externalUrl?: string;\n\n    /**\n     * If set, no warnings about something not being exported should be created\n     * since this may be referring to a type created with `infer X` which will not\n     * be registered on the project.\n     */\n    refersToTypeParameter = false;\n\n    /**\n     * If set, will prefer reflections with {@link ReflectionKind | ReflectionKinds} which represent\n     * values rather than those which represent types.\n     */\n    preferValues = false;\n\n    private _target: ReflectionSymbolId | ReflectionId;\n    @NonEnumerable\n    private _project: ProjectReflection | null;\n\n    private constructor(\n        name: string,\n        target: ReflectionSymbolId | Reflection | ReflectionId,\n        project: ProjectReflection | null,\n        qualifiedName: string,\n    ) {\n        super();\n        this.name = name;\n        if (typeof target === \"number\") {\n            this._target = target;\n        } else {\n            this._target = \"variant\" in target ? target.id : target;\n        }\n        this._project = project;\n        this.qualifiedName = qualifiedName;\n    }\n\n    static createUnresolvedReference(\n        name: string,\n        target: ReflectionSymbolId,\n        project: ProjectReflection,\n        qualifiedName: string,\n    ) {\n        return new ReferenceType(name, target, project, qualifiedName);\n    }\n\n    static createResolvedReference(\n        name: string,\n        target: Reflection | ReflectionId,\n        project: ProjectReflection | null,\n    ) {\n        return new ReferenceType(name, target, project, name);\n    }\n\n    /**\n     * This is used for type parameters, which don't actually point to something,\n     * and also for temporary references which will be cleaned up with real references\n     * later during conversion.\n     * @internal\n     */\n    static createBrokenReference(name: string, project: ProjectReflection, packageName: string | undefined) {\n        const ref = new ReferenceType(name, -1 as ReflectionId, project, name);\n        ref.package = packageName;\n        return ref;\n    }\n\n    protected override getTypeString() {\n        const name = this.reflection ? this.reflection.name : this.name;\n        let typeArgs = \"\";\n\n        if (this.typeArguments && this.typeArguments.length > 0) {\n            typeArgs += \"<\";\n            typeArgs += this.typeArguments\n                .map((arg) => arg.stringify(TypeContext.referenceTypeArgument))\n                .join(\", \");\n            typeArgs += \">\";\n        }\n\n        return name + typeArgs;\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ReferenceType {\n        let target: JSONOutput.ReferenceType[\"target\"];\n        if (typeof this._target === \"number\") {\n            target = this._target;\n        } else if (this._project?.symbolIdHasBeenRemoved(this._target)) {\n            target = -1 as ReflectionId;\n        } else if (this.reflection) {\n            target = this.reflection.id;\n        } else {\n            target = this._target.toObject();\n        }\n\n        const result: JSONOutput.ReferenceType = {\n            type: this.type,\n            target,\n            typeArguments: serializer.toObjectsOptional(this.typeArguments),\n            name: this.name,\n            package: this.package,\n            externalUrl: this.externalUrl,\n        };\n\n        if (this.name !== this.qualifiedName) {\n            result.qualifiedName = this.qualifiedName;\n        }\n\n        if (this.refersToTypeParameter) {\n            result.refersToTypeParameter = true;\n        }\n\n        if (typeof target !== \"number\" && this.preferValues) {\n            result.preferValues = true;\n        }\n\n        if (this.highlightedProperties) {\n            result.highlightedProperties = Object.fromEntries(\n                Array.from(\n                    this.highlightedProperties.entries(),\n                    ([key, parts]) => {\n                        return [\n                            key,\n                            Comment.serializeDisplayParts(parts),\n                        ];\n                    },\n                ),\n            );\n        }\n\n        return result;\n    }\n\n    override fromObject(de: Deserializer, obj: JSONOutput.ReferenceType): void {\n        this.typeArguments = de.reviveMany(obj.typeArguments, (t) => de.constructType(t));\n        if (typeof obj.target === \"number\") {\n            if (obj.target === -1) {\n                this._target = -1 as ReflectionId;\n            } else {\n                de.defer((project) => {\n                    const target = project.getReflectionById(\n                        de.oldIdToNewId[obj.target as ReflectionId] ?? -1,\n                    );\n                    if (target) {\n                        this._project = project;\n                        this._target = target.id;\n                    } else {\n                        de.logger.warn(\n                            i18n.serialized_project_referenced_0_not_part_of_project(\n                                JSON.stringify(obj.target),\n                            ),\n                        );\n                    }\n                });\n            }\n        } else {\n            this._project = de.project!;\n            this._target = new ReflectionSymbolId(obj.target);\n        }\n\n        this.qualifiedName = obj.qualifiedName ?? obj.name;\n        this.package = obj.package;\n        this.refersToTypeParameter = !!obj.refersToTypeParameter;\n        this.preferValues = !!obj.preferValues;\n\n        if (obj.highlightedProperties) {\n            this.highlightedProperties = new Map();\n            for (\n                const [key, parts] of Object.entries(\n                    obj.highlightedProperties,\n                )\n            ) {\n                this.highlightedProperties.set(\n                    key,\n                    Comment.deserializeDisplayParts(de, parts),\n                );\n            }\n        }\n    }\n}\n\n/**\n * Represents a type which has it's own reflection like literal types.\n * This type will likely go away at some point and be replaced by a dedicated\n * `ObjectType`. Allowing reflections to be nested within types causes much\n * pain in the rendering code.\n *\n * ```ts\n * let value: { a: string, b: number };\n * ```\n * @category Types\n */\nexport class ReflectionType extends Type {\n    override readonly type = \"reflection\";\n\n    constructor(public declaration: DeclarationReflection) {\n        super();\n    }\n\n    protected override getTypeString() {\n        const parts: string[] = [];\n        const sigs = this.declaration.getNonIndexSignatures();\n        for (const sig of sigs) {\n            parts.push(sigStr(sig, \": \"));\n        }\n\n        for (const p of this.declaration.children || []) {\n            parts.push(`${p.name}${propertySep(p)} ${typeStr(p.type)}`);\n        }\n        for (const s of this.declaration.indexSignatures || []) {\n            parts.push(sigStr(s, \": \", \"[]\"));\n        }\n\n        if (sigs.length === 1 && parts.length === 1) {\n            return sigStr(sigs[0], \" => \");\n        }\n\n        if (parts.length === 0) {\n            return \"{}\";\n        }\n\n        return `{ ${parts.join(\"; \")} }`;\n    }\n\n    override needsParenthesis(where: TypeContext): boolean {\n        if (this.declaration.children || this.declaration.indexSignatures) {\n            return false;\n        }\n\n        if (this.declaration.signatures?.length === 1) {\n            return where === TypeContext.arrayElement || where === TypeContext.unionElement;\n        }\n\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.ReflectionType {\n        return {\n            type: this.type,\n            declaration: serializer.toObject(this.declaration),\n        };\n    }\n}\n\n/**\n * Represents a rest type\n * ```ts\n * type Z = [1, ...2[]]\n * //           ^^^^^^\n * ```\n * @category Types\n */\nexport class RestType extends Type {\n    override readonly type = \"rest\";\n\n    constructor(public elementType: SomeType) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return `...${this.elementType.stringify(TypeContext.restElement)}`;\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.RestType {\n        return {\n            type: this.type,\n            elementType: serializer.toObject(this.elementType),\n        };\n    }\n}\n\n/**\n * TS 4.1 template literal types\n * ```ts\n * type Z = `${'a' | 'b'}${'a' | 'b'}`\n * ```\n * @category Types\n */\nexport class TemplateLiteralType extends Type {\n    override readonly type = \"templateLiteral\";\n\n    constructor(\n        public head: string,\n        public tail: [SomeType, string][],\n    ) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return [\n            \"`\",\n            this.head,\n            ...this.tail.map(([type, text]) => {\n                return (\n                    \"${\" +\n                    type.stringify(TypeContext.templateLiteralElement) +\n                    \"}\" +\n                    text\n                );\n            }),\n            \"`\",\n        ].join(\"\");\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.TemplateLiteralType {\n        return {\n            type: this.type,\n            head: this.head,\n            tail: this.tail.map(([type, text]) => [\n                serializer.toObject(type),\n                text,\n            ]),\n        };\n    }\n}\n\n/**\n * Represents a tuple type.\n *\n * ```ts\n * let value: [string, boolean];\n * ```\n * @category Types\n */\nexport class TupleType extends Type {\n    override readonly type = \"tuple\";\n\n    /**\n     * @param elements The ordered type elements of the tuple type.\n     */\n    constructor(public elements: SomeType[]) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return (\n            \"[\" +\n            this.elements\n                .map((t) => t.stringify(TypeContext.tupleElement))\n                .join(\", \") +\n            \"]\"\n        );\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.TupleType {\n        return {\n            type: this.type,\n            elements: serializer.toObjectsOptional(this.elements),\n        };\n    }\n}\n\n/**\n * Represents a named member of a tuple type.\n *\n * ```ts\n * let value: [name: string];\n * ```\n * @category Types\n */\nexport class NamedTupleMember extends Type {\n    override readonly type = \"namedTupleMember\";\n\n    constructor(\n        public name: string,\n        public isOptional: boolean,\n        public element: SomeType,\n    ) {\n        super();\n    }\n\n    /**\n     * Return a string representation of this type.\n     */\n    protected override getTypeString() {\n        return `${this.name}${this.isOptional ? \"?\" : \"\"}: ${this.element.stringify(TypeContext.tupleElement)}`;\n    }\n\n    override needsParenthesis(): boolean {\n        return false;\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.NamedTupleMemberType {\n        return {\n            type: this.type,\n            name: this.name,\n            isOptional: this.isOptional,\n            element: serializer.toObject(this.element),\n        };\n    }\n}\n\n/**\n * Represents a type operator type.\n *\n * ```ts\n * class A {}\n * class B<T extends keyof A> {}\n * ```\n * @category Types\n */\nexport class TypeOperatorType extends Type {\n    override readonly type = \"typeOperator\";\n\n    constructor(\n        public target: SomeType,\n        public operator: \"keyof\" | \"unique\" | \"readonly\",\n    ) {\n        super();\n    }\n\n    protected override getTypeString() {\n        return `${this.operator} ${\n            this.target.stringify(\n                TypeContext.typeOperatorTarget,\n            )\n        }`;\n    }\n\n    override needsParenthesis(context: TypeContext): boolean {\n        const map: Record<TypeContext, boolean> = {\n            none: false,\n            templateLiteralElement: false,\n            arrayElement: true,\n            indexedAccessElement: false,\n            conditionalCheck: false,\n            conditionalExtends: false,\n            conditionalTrue: false,\n            conditionalFalse: false,\n            indexedIndex: false,\n            indexedObject: true,\n            inferredConstraint: false,\n            intersectionElement: false,\n            mappedName: false,\n            mappedParameter: false,\n            mappedTemplate: false,\n            optionalElement: true,\n            predicateTarget: false,\n            queryTypeTarget: false,\n            typeOperatorTarget: false,\n            referenceTypeArgument: false,\n            restElement: false,\n            tupleElement: false,\n            unionElement: false,\n        };\n\n        return map[context];\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.TypeOperatorType {\n        return {\n            type: this.type,\n            operator: this.operator,\n            target: serializer.toObject(this.target),\n        };\n    }\n}\n\n/**\n * Represents an union type.\n *\n * ```ts\n * let value: string | string[];\n * ```\n * @category Types\n */\nexport class UnionType extends Type {\n    override readonly type = \"union\";\n\n    /**\n     * If present, there should be as many items in this array as there are items in the {@link types} array.\n     *\n     * This member is only valid on unions which are on {@link DeclarationReflection.type | DeclarationReflection.type} with a\n     * {@link ReflectionKind} `kind` of `TypeAlias`. Specifying it on any other union is undefined behavior.\n     */\n    elementSummaries?: CommentDisplayPart[][];\n\n    constructor(public types: SomeType[]) {\n        super();\n    }\n\n    protected override getTypeString(): string {\n        return this.types\n            .map((t) => t.stringify(TypeContext.unionElement))\n            .join(\" | \");\n    }\n\n    override needsParenthesis(context: TypeContext): boolean {\n        const map: Record<TypeContext, boolean> = {\n            none: false,\n            templateLiteralElement: false,\n            arrayElement: true,\n            indexedAccessElement: false,\n            conditionalCheck: true,\n            conditionalExtends: false,\n            conditionalTrue: false,\n            conditionalFalse: false,\n            indexedIndex: false,\n            indexedObject: true,\n            inferredConstraint: false,\n            intersectionElement: true,\n            mappedName: false,\n            mappedParameter: false,\n            mappedTemplate: false,\n            optionalElement: true,\n            predicateTarget: false,\n            queryTypeTarget: false,\n            typeOperatorTarget: true,\n            referenceTypeArgument: false,\n            restElement: false,\n            tupleElement: false,\n            unionElement: false,\n        };\n\n        return map[context];\n    }\n\n    override fromObject(de: Deserializer, obj: JSONOutput.UnionType): void {\n        if (obj.elementSummaries) {\n            this.elementSummaries = obj.elementSummaries.map((parts) => Comment.deserializeDisplayParts(de, parts));\n        }\n    }\n\n    override toObject(serializer: Serializer): JSONOutput.UnionType {\n        return {\n            type: this.type,\n            types: this.types.map((t) => serializer.toObject(t)),\n            elementSummaries: this.elementSummaries?.map((parts) => Comment.serializeDisplayParts(parts)),\n        };\n    }\n}\n\n/**\n * Represents all unknown types that cannot be converted by TypeDoc.\n * @category Types\n */\nexport class UnknownType extends Type {\n    override readonly type = \"unknown\";\n\n    /**\n     * A string representation of the type as returned from TypeScript compiler.\n     */\n    name: string;\n\n    constructor(name: string) {\n        super();\n        this.name = name;\n    }\n\n    protected override getTypeString() {\n        return this.name;\n    }\n\n    /**\n     * Always returns true if not at the root level, we have no idea what's in here, so wrap it in parenthesis\n     * to be extra safe.\n     */\n    override needsParenthesis(context: TypeContext): boolean {\n        return context !== TypeContext.none;\n    }\n\n    override toObject(): JSONOutput.UnknownType {\n        return {\n            type: this.type,\n            name: this.name,\n        };\n    }\n}\n\nfunction propertySep(refl: Reflection) {\n    return refl.flags.isOptional ? \"?:\" : \":\";\n}\n\nfunction typeStr(type: Type | undefined) {\n    return type?.toString() ?? \"any\";\n}\n\nfunction sigStr(sig: SignatureReflection, sep: string, brackets = \"()\") {\n    const params = joinArray(\n        sig.parameters,\n        \", \",\n        (p) => `${p.name}${propertySep(p)} ${typeStr(p.type)}`,\n    );\n    return `${brackets[0]}${params}${brackets[1]}${sep}${typeStr(sig.type)}`;\n}\n"
  },
  {
    "path": "src/lib/models/utils.ts",
    "content": "export function splitUnquotedString(\n    input: string,\n    delimiter: string,\n): string[] {\n    if (input.startsWith(delimiter)) {\n        return splitUnquotedString(\n            input.substring(delimiter.length),\n            delimiter,\n        );\n    }\n    if (input.startsWith('\"')) {\n        // the part inside the quotes should not be split, the rest should\n        const closingQuoteIndex = input.indexOf('\"', 1);\n        if (closingQuoteIndex === -1) {\n            // Unmatched quotes, just split it\n            return input.split(delimiter);\n        }\n        if (closingQuoteIndex === input.length - 1) {\n            return [input];\n        } else {\n            const remainder = input.substring(closingQuoteIndex + 1);\n            return [\n                input.substring(0, closingQuoteIndex + 1),\n                ...splitUnquotedString(remainder, delimiter),\n            ];\n        }\n    } else {\n        return input.split(delimiter);\n    }\n}\n"
  },
  {
    "path": "src/lib/models/variant.ts",
    "content": "import type { DeclarationReflection } from \"./DeclarationReflection.js\";\nimport type { DocumentReflection } from \"./DocumentReflection.js\";\nimport type { ParameterReflection } from \"./ParameterReflection.js\";\nimport type { ProjectReflection } from \"./ProjectReflection.js\";\nimport type { ReferenceReflection } from \"./ReferenceReflection.js\";\nimport type { SignatureReflection } from \"./SignatureReflection.js\";\nimport type { TypeParameterReflection } from \"./TypeParameterReflection.js\";\n\n/**\n * A map of known {@link Reflection} concrete subclasses.\n * This is used during deserialization to reconstruct serialized objects.\n */\nexport interface ReflectionVariant {\n    declaration: DeclarationReflection;\n    param: ParameterReflection;\n    project: ProjectReflection;\n    reference: ReferenceReflection;\n    signature: SignatureReflection;\n    typeParam: TypeParameterReflection;\n    document: DocumentReflection;\n}\n\nexport type SomeReflection = ReflectionVariant[keyof ReflectionVariant];\n"
  },
  {
    "path": "src/lib/output/components.ts",
    "content": "import * as Path from \"path\";\n\nimport { AbstractComponent } from \"../utils/component.js\";\nimport type { ProjectReflection } from \"../models/index.js\";\nimport type { Renderer } from \"./renderer.js\";\nimport { PageEvent, RendererEvent } from \"./events.js\";\nimport { Option } from \"../utils/index.js\";\n\nexport abstract class RendererComponent extends AbstractComponent<\n    Renderer,\n    {}\n> {}\n\n/**\n * A plugin for the renderer that reads the current render context.\n */\nexport abstract class ContextAwareRendererComponent extends RendererComponent {\n    /**\n     * The project that is currently processed.\n     */\n    protected project?: ProjectReflection;\n\n    /**\n     * The reflection that is currently processed.\n     */\n    protected page?: PageEvent;\n\n    /**\n     * The url of the document that is being currently generated.\n     * Set when a page begins rendering.\n     *\n     * Defaulted to '.' so that tests don't have to set up events.\n     */\n    private location = \".\";\n\n    /**\n     * Regular expression to test if a string looks like an external url.\n     */\n    protected urlPrefix = /^(http|ftp)s?:\\/\\//;\n\n    protected get hostedBaseUrl() {\n        const url = this.application.options.getValue(\"hostedBaseUrl\");\n        return !url || url.endsWith(\"/\") ? url : url + \"/\";\n    }\n\n    @Option(\"useHostedBaseUrlForAbsoluteLinks\")\n    private accessor useHostedBaseUrlForAbsoluteLinks!: boolean;\n\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(RendererEvent.BEGIN, this.onBeginRenderer.bind(this));\n        this.owner.on(PageEvent.BEGIN, this.onBeginPage.bind(this));\n        this.owner.on(RendererEvent.END, () => this.absoluteToRelativePathMap.clear());\n    }\n\n    private absoluteToRelativePathMap = new Map<string, string>();\n\n    /**\n     * Transform the given absolute path into a relative path.\n     *\n     * @param absolute  The absolute path to transform.\n     * @returns A path relative to the document currently processed.\n     */\n    public getRelativeUrl(absolute: string): string {\n        if (this.urlPrefix.test(absolute)) {\n            return absolute;\n        } else {\n            const key = `${this.location}:${absolute}`;\n            let path = this.absoluteToRelativePathMap.get(key);\n            if (path) return path;\n\n            if (this.useHostedBaseUrlForAbsoluteLinks) {\n                path = new URL(absolute, this.hostedBaseUrl).toString();\n            } else {\n                path = Path.posix.relative(this.location, absolute) || \".\";\n            }\n\n            this.absoluteToRelativePathMap.set(key, path);\n            return path;\n        }\n    }\n\n    /**\n     * Triggered before the renderer starts rendering a project.\n     *\n     * @param event  An event object describing the current render operation.\n     */\n    protected onBeginRenderer(event: RendererEvent) {\n        this.project = event.project;\n    }\n\n    /**\n     * Triggered before a document will be rendered.\n     *\n     * @param page  An event object describing the current render operation.\n     */\n    protected onBeginPage(page: PageEvent) {\n        this.location = Path.posix.dirname(page.url);\n        this.page = page;\n    }\n}\n"
  },
  {
    "path": "src/lib/output/events.ts",
    "content": "import type { ProjectReflection } from \"../models/ProjectReflection.js\";\nimport {\n    type DeclarationReflection,\n    type DocumentReflection,\n    Reflection,\n    type ReflectionKind,\n} from \"../models/index.js\";\nimport type { PageDefinition, PageKind, RouterTarget } from \"./router.js\";\nimport { type Icons } from \"./themes/default/partials/icon.js\";\n\n/**\n * An event emitted by the {@link Renderer} class at the very beginning and\n * ending of the entire rendering process.\n *\n * @see {@link Renderer.EVENT_BEGIN}\n * @see {@link Renderer.EVENT_END}\n */\nexport class RendererEvent {\n    /**\n     * The project the renderer is currently processing.\n     */\n    readonly project: ProjectReflection;\n\n    /**\n     * The path of the directory the documentation should be written to.\n     */\n    readonly outputDirectory: string;\n\n    /**\n     * A list of all pages that will be generated.\n     */\n    pages: PageDefinition[];\n\n    /**\n     * Triggered before the renderer starts rendering a project.\n     * @event\n     */\n    static readonly BEGIN = \"beginRender\";\n\n    /**\n     * Triggered after the renderer has written all documents.\n     * @event\n     */\n    static readonly END = \"endRender\";\n\n    constructor(\n        outputDirectory: string,\n        project: ProjectReflection,\n        pages: PageDefinition[],\n    ) {\n        this.outputDirectory = outputDirectory;\n        this.project = project;\n        this.pages = pages;\n    }\n}\n\nexport interface PageHeading {\n    link: string;\n    text: string;\n    level?: number;\n    kind?: ReflectionKind;\n    classes?: string;\n    icon?: keyof Icons & (string | number);\n}\n\n/**\n * An event emitted by the {@link Renderer} class before and after the\n * markup of a page is rendered.\n *\n * @see {@link Renderer.EVENT_BEGIN_PAGE}\n * @see {@link Renderer.EVENT_END_PAGE}\n */\nexport class PageEvent<out Model extends RouterTarget = RouterTarget> {\n    /**\n     * The project the renderer is currently processing.\n     */\n    project!: ProjectReflection;\n\n    /**\n     * The filename the page will be written to.\n     */\n    filename!: string;\n\n    /**\n     * The url this page will be located at.\n     */\n    url!: string;\n\n    /**\n     * The type of page this is.\n     */\n    pageKind!: PageKind;\n\n    /**\n     * The model that should be rendered on this page.\n     */\n    readonly model: Model;\n\n    /**\n     * The final html content of this page.\n     *\n     * Should be rendered by layout templates and can be modified by plugins.\n     */\n    contents?: string;\n\n    /**\n     * Links to content within this page that should be rendered in the page navigation.\n     * This is built when rendering the document content.\n     */\n    pageHeadings: PageHeading[] = [];\n\n    /**\n     * Sections of the page, generally set by `@group`s\n     */\n    pageSections = [\n        {\n            title: \"\",\n            headings: this.pageHeadings,\n        },\n    ];\n\n    /**\n     * Start a new section of the page. Sections are collapsible within\n     * the \"On This Page\" sidebar.\n     */\n    startNewSection(title: string) {\n        this.pageHeadings = [];\n        this.pageSections.push({\n            title,\n            headings: this.pageHeadings,\n        });\n    }\n\n    /**\n     * Triggered before a document will be rendered.\n     * @event\n     */\n    static readonly BEGIN = \"beginPage\";\n\n    /**\n     * Triggered after a document has been rendered, just before it is written to disc.\n     * @event\n     */\n    static readonly END = \"endPage\";\n\n    constructor(model: Model) {\n        this.model = model;\n    }\n\n    isReflectionEvent(): this is PageEvent<Reflection> {\n        return this.model instanceof Reflection;\n    }\n}\n\n/**\n * An event emitted when markdown is being parsed. Allows other plugins to manipulate the result.\n *\n * @see {@link MarkdownEvent.PARSE}\n */\nexport class MarkdownEvent {\n    /**\n     * The unparsed original text.\n     */\n    readonly originalText: string;\n\n    /**\n     * The parsed output.\n     */\n    parsedText: string;\n\n    /**\n     * The page that this markdown is being parsed for.\n     */\n    readonly page: PageEvent;\n\n    /**\n     * Triggered on the renderer when this plugin parses a markdown string.\n     * @event\n     */\n    static readonly PARSE = \"parseMarkdown\";\n\n    constructor(page: PageEvent, originalText: string, parsedText: string) {\n        this.page = page;\n        this.originalText = originalText;\n        this.parsedText = parsedText;\n    }\n}\n\n/**\n * An event emitted when the search index is being prepared.\n */\nexport class IndexEvent {\n    /**\n     * Triggered on the renderer when the search index is being prepared.\n     * @event\n     */\n    static readonly PREPARE_INDEX = \"prepareIndex\";\n\n    /**\n     * May be filtered by plugins to reduce the results available.\n     * Additional items *should not* be added to this array.\n     *\n     * If you remove an index from this array, you must also remove the\n     * same index from {@link searchFields}. The {@link removeResult} helper\n     * will do this for you.\n     */\n    searchResults: Array<DeclarationReflection | DocumentReflection>;\n\n    /**\n     * Additional search fields to be used when creating the search index.\n     * `name`, `comment` and `document` may be specified to overwrite TypeDoc's search fields.\n     *\n     * Do not use `id` as a custom search field.\n     */\n    searchFields: Record<string, string>[];\n\n    /**\n     * Weights for the fields defined in `searchFields`. The default will weight\n     * `name` as 10x more important than comment and document content.\n     *\n     * If a field added to {@link searchFields} is not added to this object, it\n     * will **not** be searchable.\n     *\n     * Do not replace this object, instead, set new properties on it for custom search\n     * fields added by your plugin.\n     */\n    readonly searchFieldWeights: Record<string, number> = {\n        name: 10,\n        comment: 1,\n        document: 1,\n    };\n\n    /**\n     * Remove a search result by index.\n     */\n    removeResult(index: number) {\n        this.searchResults.splice(index, 1);\n        this.searchFields.splice(index, 1);\n    }\n\n    constructor(\n        searchResults: Array<DeclarationReflection | DocumentReflection>,\n    ) {\n        this.searchResults = searchResults;\n        this.searchFields = Array.from(\n            { length: this.searchResults.length },\n            () => ({}),\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/output/formatter.tsx",
    "content": "// Heavily based on https://yorickpeterse.com/articles/how-to-write-a-code-formatter/\n// Implements roughly the same algorithm as Prettier\n\nimport { ok } from \"assert\";\nimport { LiteralType, ReferenceType, type SomeType, TypeContext, type TypeVisitor } from \"../models/types.js\";\nimport { aggregate, assertNever, JSX } from \"#utils\";\nimport { getKindClass, getUniquePath, stringify } from \"./themes/lib.js\";\nimport {\n    type DeclarationReflection,\n    type ParameterReflection,\n    type Reflection,\n    ReflectionKind,\n    type SignatureReflection,\n    type TypeParameterReflection,\n} from \"../models/index.js\";\nimport type { Router } from \"./index.js\";\n\n// Non breaking space\nconst INDENT = \"\\u00A0\\u00A0\\u00A0\\u00A0\";\n\nexport type FormatterNode =\n    | { type: \"text\"; content: string }\n    | { type: \"element\"; content: JSX.Element; length: number }\n    | { type: \"line\" }\n    | { type: \"space_or_line\" }\n    | { type: \"indent\"; content: FormatterNode[] }\n    | { type: \"group\"; id: number; content: FormatterNode[] }\n    | { type: \"nodes\"; content: FormatterNode[] }\n    | {\n        type: \"if_wrap\";\n        id: number;\n        true: FormatterNode;\n        false: FormatterNode;\n    };\n\nconst emptyNode = textNode(\"\");\n\nfunction space() {\n    return textNode(\" \");\n}\nfunction textNode(content: string): FormatterNode {\n    return { type: \"text\", content };\n}\nfunction simpleElement(element: JSX.Element): FormatterNode {\n    ok(element.children.length === 1);\n    ok(typeof element.children[0] === \"string\");\n    return {\n        type: \"element\",\n        content: element,\n        length: element.children[0].length,\n    };\n}\nfunction line(): FormatterNode {\n    return { type: \"line\" };\n}\nfunction spaceOrLine(): FormatterNode {\n    return { type: \"space_or_line\" };\n}\nfunction indent(content: FormatterNode[]): FormatterNode {\n    return { type: \"indent\", content };\n}\nfunction group(id: number, content: FormatterNode[]): FormatterNode {\n    return { type: \"group\", id, content };\n}\nfunction nodes(...content: FormatterNode[]): FormatterNode {\n    return { type: \"nodes\", content };\n}\nfunction ifWrap(\n    id: number,\n    trueBranch: FormatterNode,\n    falseBranch: FormatterNode = emptyNode,\n): FormatterNode {\n    return { type: \"if_wrap\", id, true: trueBranch, false: falseBranch };\n}\n\nfunction join<T>(\n    joiner: FormatterNode,\n    list: readonly T[],\n    cb: (x: T) => FormatterNode,\n): FormatterNode {\n    const content: FormatterNode[] = [];\n\n    for (const item of list) {\n        if (content.length > 0) {\n            content.push(joiner);\n        }\n        content.push(cb(item));\n    }\n\n    return { type: \"nodes\", content };\n}\n\nfunction nodeWidth(node: FormatterNode, wrapped: Set<number>): number {\n    switch (node.type) {\n        case \"text\":\n            return node.content.length;\n        case \"element\":\n            return node.length;\n        case \"line\":\n            return 0;\n        case \"space_or_line\":\n            return 1;\n        case \"indent\":\n        case \"group\":\n        case \"nodes\":\n            return aggregate(node.content, (n) => nodeWidth(n, wrapped));\n        case \"if_wrap\":\n            return wrapped.has(node.id)\n                ? nodeWidth(node.true, wrapped)\n                : nodeWidth(node.false, wrapped);\n    }\n}\n\nexport enum Wrap {\n    Detect = 0,\n    Enable = 1,\n}\n\n/**\n * Responsible for rendering nodes\n */\nexport class FormattedCodeGenerator {\n    private buffer: Array<JSX.Element | string> = [];\n    /** Indentation level, not number of chars */\n    private indent = 0;\n    /** The number of characters on the current line */\n    private size: number;\n    /** Maximum number of characters allowed per line */\n    private max: number;\n    /** Groups which need to be wrapped */\n    private wrapped = new Set<number>();\n\n    constructor(maxWidth: number = 80, startWidth = 0) {\n        this.max = maxWidth;\n        this.size = startWidth;\n    }\n\n    forceWrap(wrapped: Set<number>) {\n        for (const id of wrapped) {\n            this.wrapped.add(id);\n        }\n    }\n\n    toElement(): JSX.Element {\n        return <>{this.buffer}</>;\n    }\n\n    node(node: FormatterNode, wrap: Wrap): void {\n        switch (node.type) {\n            case \"nodes\": {\n                for (const n of node.content) {\n                    this.node(n, wrap);\n                }\n                break;\n            }\n            case \"group\": {\n                const width = aggregate(node.content, (n) => nodeWidth(n, this.wrapped));\n                let wrap: Wrap;\n                if (this.size + width > this.max || this.wrapped.has(node.id)) {\n                    this.wrapped.add(node.id);\n                    wrap = Wrap.Enable;\n                } else {\n                    wrap = Wrap.Detect;\n                }\n                for (const n of node.content) {\n                    this.node(n, wrap);\n                }\n                break;\n            }\n            case \"if_wrap\": {\n                if (this.wrapped.has(node.id)) {\n                    this.node(node.true, Wrap.Enable);\n                } else {\n                    this.node(node.false, wrap);\n                }\n                break;\n            }\n            case \"text\": {\n                this.text(node.content, node.content.length);\n                break;\n            }\n            case \"element\": {\n                this.text(node.content, node.length);\n                break;\n            }\n            case \"line\": {\n                if (wrap == Wrap.Enable) {\n                    this.newLine();\n                }\n                break;\n            }\n            case \"space_or_line\": {\n                if (wrap === Wrap.Enable) {\n                    this.newLine();\n                } else {\n                    this.text(\" \", 1);\n                }\n                break;\n            }\n            case \"indent\": {\n                if (wrap === Wrap.Enable) {\n                    this.size += INDENT.length;\n                    this.indent += 1;\n                    this.buffer.push(INDENT);\n                    for (const n of node.content) {\n                        this.node(n, wrap);\n                    }\n                    this.indent -= 1;\n                } else {\n                    for (const n of node.content) {\n                        this.node(n, wrap);\n                    }\n                }\n                break;\n            }\n            default:\n                assertNever(node);\n        }\n    }\n\n    private text(value: string | JSX.Element, chars: number) {\n        this.size += chars;\n        this.buffer.push(value);\n    }\n\n    private newLine() {\n        this.size = INDENT.length + this.indent;\n        const last = this.buffer[this.buffer.length - 1];\n        if (typeof last === \"string\") {\n            this.buffer[this.buffer.length - 1] = last.trimEnd();\n        }\n        this.buffer.push(<br />);\n        this.buffer.push(INDENT.repeat(this.indent));\n    }\n}\n\nconst typeBuilder: TypeVisitor<\n    FormatterNode,\n    [FormattedCodeBuilder, { topLevelLinks: boolean }]\n> = {\n    array(type, builder) {\n        return nodes(\n            builder.type(type.elementType, TypeContext.arrayElement),\n            simpleElement(<span class=\"tsd-signature-symbol\">[]</span>),\n        );\n    },\n    conditional(type, builder) {\n        const id = builder.newId();\n        return group(id, [\n            builder.type(type.checkType, TypeContext.conditionalCheck),\n            space(),\n            simpleElement(<span class=\"tsd-signature-keyword\">extends</span>),\n            space(),\n            builder.type(type.extendsType, TypeContext.conditionalExtends),\n            spaceOrLine(),\n            indent([\n                simpleElement(<span class=\"tsd-signature-symbol\">?</span>),\n                space(),\n                builder.type(type.trueType, TypeContext.conditionalTrue),\n                spaceOrLine(),\n                simpleElement(<span class=\"tsd-signature-symbol\">:</span>),\n                space(),\n                builder.type(type.falseType, TypeContext.conditionalFalse),\n            ]),\n        ]);\n    },\n    indexedAccess(type, builder) {\n        let indexType = builder.type(type.indexType, TypeContext.indexedIndex);\n\n        if (\n            type.objectType instanceof ReferenceType &&\n            type.objectType.reflection &&\n            type.indexType instanceof LiteralType &&\n            typeof type.indexType.value === \"string\"\n        ) {\n            const childReflection = type.objectType.reflection.getChildByName([\n                type.indexType.value,\n            ]);\n            if (childReflection) {\n                const displayed = stringify(type.indexType.value);\n\n                if (builder.router.hasUrl(childReflection)) {\n                    indexType = {\n                        type: \"element\",\n                        content: (\n                            <a href={builder.urlTo(childReflection)}>\n                                <span class=\"tsd-signature-type\">\n                                    {displayed}\n                                </span>\n                            </a>\n                        ),\n                        length: displayed.length,\n                    };\n                } else {\n                    indexType = {\n                        type: \"element\",\n                        content: <span class=\"tsd-signature-type\">{displayed}</span>,\n                        length: displayed.length,\n                    };\n                }\n            }\n        }\n\n        return nodes(\n            builder.type(type.objectType, TypeContext.indexedObject),\n            simpleElement(<span class=\"tsd-signature-symbol\">[</span>),\n            indexType,\n            simpleElement(<span class=\"tsd-signature-symbol\">]</span>),\n        );\n    },\n    inferred(type, builder) {\n        const simple = nodes(\n            simpleElement(<span class=\"tsd-signature-keyword\">infer</span>),\n            space(),\n            simpleElement(\n                <span class=\"tsd-kind-type-parameter\">{type.name}</span>,\n            ),\n        );\n\n        if (type.constraint) {\n            const id = builder.newId();\n            return group(id, [\n                simple,\n                space(),\n                simpleElement(\n                    <span class=\"tsd-signature-keyword\">extends</span>,\n                ),\n                spaceOrLine(),\n                indent([\n                    builder.type(\n                        type.constraint,\n                        TypeContext.inferredConstraint,\n                    ),\n                ]),\n            ]);\n        }\n\n        return simple;\n    },\n    intersection(type, builder) {\n        // Prettier doesn't do smart wrapping here like we do with unions\n        // so... TypeDoc won't either, at least for now.\n        return join(\n            nodes(\n                space(),\n                simpleElement(<span class=\"tsd-signature-symbol\">&amp;</span>),\n                space(),\n            ),\n            type.types,\n            (type) => builder.type(type, TypeContext.intersectionElement),\n        );\n    },\n    intrinsic(type) {\n        return simpleElement(\n            <span class=\"tsd-signature-type\">{type.name}</span>,\n        );\n    },\n    literal(type) {\n        return simpleElement(\n            <span class=\"tsd-signature-type\">{stringify(type.value)}</span>,\n        );\n    },\n    mapped(type, builder) {\n        const parts: FormatterNode[] = [];\n\n        switch (type.readonlyModifier) {\n            case \"+\":\n                parts.push(\n                    simpleElement(\n                        <span class=\"tsd-signature-keyword\">readonly</span>,\n                    ),\n                    space(),\n                );\n                break;\n            case \"-\":\n                parts.push(\n                    simpleElement(<span class=\"tsd-signature-symbol\">-</span>),\n                    simpleElement(\n                        <span class=\"tsd-signature-keyword\">readonly</span>,\n                    ),\n                    space(),\n                );\n                break;\n        }\n\n        parts.push(\n            simpleElement(<span class=\"tsd-signature-symbol\">[</span>),\n            simpleElement(\n                <span class=\"tsd-kind-type-parameter\">{type.parameter}</span>,\n            ),\n            space(),\n            simpleElement(<span class=\"tsd-signature-keyword\">in</span>),\n            space(),\n            builder.type(type.parameterType, TypeContext.mappedParameter),\n        );\n\n        if (type.nameType) {\n            parts.push(\n                space(),\n                simpleElement(<span class=\"tsd-signature-keyword\">as</span>),\n                space(),\n                builder.type(type.nameType, TypeContext.mappedName),\n            );\n        }\n\n        parts.push(simpleElement(<span class=\"tsd-signature-symbol\">]</span>));\n\n        switch (type.optionalModifier) {\n            case \"+\":\n                parts.push(\n                    simpleElement(<span class=\"tsd-signature-symbol\">?:</span>),\n                );\n                break;\n            case \"-\":\n                parts.push(\n                    simpleElement(\n                        <span class=\"tsd-signature-symbol\">-?:</span>,\n                    ),\n                );\n                break;\n            default:\n                parts.push(\n                    simpleElement(<span class=\"tsd-signature-symbol\">:</span>),\n                );\n        }\n\n        parts.push(\n            space(),\n            builder.type(type.templateType, TypeContext.mappedTemplate),\n        );\n\n        return group(builder.newId(), [\n            simpleElement(<span class=\"tsd-signature-symbol\">{\"{\"}</span>),\n            spaceOrLine(),\n            indent(parts),\n            spaceOrLine(),\n            simpleElement(<span class=\"tsd-signature-symbol\">{\"}\"}</span>),\n        ]);\n    },\n    namedTupleMember(type, builder) {\n        return nodes(\n            textNode(type.name),\n            type.isOptional\n                ? simpleElement(<span class=\"tsd-signature-symbol\">?:</span>)\n                : simpleElement(<span class=\"tsd-signature-symbol\">:</span>),\n            space(),\n            builder.type(type.element, TypeContext.none),\n        );\n    },\n    optional(type, builder) {\n        return nodes(\n            builder.type(type.elementType, TypeContext.optionalElement),\n            simpleElement(<span class=\"tsd-signature-symbol\">?</span>),\n        );\n    },\n    predicate(type, builder) {\n        const content: FormatterNode[] = [];\n        if (type.asserts) {\n            content.push(\n                simpleElement(\n                    <span class=\"tsd-signature-keyword\">asserts</span>,\n                ),\n                space(),\n            );\n        }\n\n        content.push(\n            simpleElement(<span class=\"tsd-kind-parameter\">{type.name}</span>),\n        );\n\n        if (type.targetType) {\n            content.push(\n                space(),\n                simpleElement(<span class=\"tsd-signature-keyword\">is</span>),\n                space(),\n                builder.type(type.targetType, TypeContext.predicateTarget),\n            );\n        }\n\n        return nodes(...content);\n    },\n    query(type, builder) {\n        return nodes(\n            simpleElement(<span class=\"tsd-signature-keyword\">typeof</span>),\n            space(),\n            builder.type(type.queryType, TypeContext.queryTypeTarget),\n        );\n    },\n    reference(type, builder) {\n        const reflection = type.reflection;\n        let name: FormatterNode;\n\n        if (reflection) {\n            if (reflection.kindOf(ReflectionKind.TypeParameter)) {\n                if (builder.router.hasUrl(reflection)) {\n                    name = simpleElement(\n                        <a\n                            class=\"tsd-signature-type tsd-kind-type-parameter\"\n                            href={builder.urlTo(reflection)}\n                        >\n                            {reflection.name}\n                        </a>,\n                    );\n                } else {\n                    name = simpleElement(\n                        <span class=\"tsd-signature-type tsd-kind-type-parameter\">\n                            {reflection.name}\n                        </span>,\n                    );\n                }\n            } else {\n                name = join(\n                    simpleElement(<span class=\"tsd-signature-symbol\">.</span>),\n                    getUniquePath(reflection),\n                    (item) => {\n                        if (builder.router.hasUrl(item)) {\n                            return simpleElement(\n                                <a\n                                    href={builder.urlTo(item)}\n                                    class={\"tsd-signature-type \" +\n                                        getKindClass(item)}\n                                >\n                                    {item.name}\n                                </a>,\n                            );\n                        }\n\n                        return simpleElement(\n                            <span\n                                class={\"tsd-signature-type \" + getKindClass(item)}\n                            >\n                                {item.name}\n                            </span>,\n                        );\n                    },\n                );\n            }\n        } else if (type.externalUrl) {\n            if (type.externalUrl === \"#\") {\n                name = simpleElement(\n                    <span class=\"tsd-signature-type external\">\n                        {type.name}\n                    </span>,\n                );\n            } else {\n                name = simpleElement(\n                    <a\n                        href={type.externalUrl}\n                        class=\"tsd-signature-type external\"\n                        target=\"_blank\"\n                    >\n                        {type.name}\n                    </a>,\n                );\n            }\n        } else if (type.refersToTypeParameter) {\n            name = simpleElement(\n                <span class=\"tsd-signature-type tsd-kind-type-parameter\">\n                    {type.name}\n                </span>,\n            );\n        } else {\n            name = simpleElement(\n                <span class=\"tsd-signature-type\">{type.name}</span>,\n            );\n        }\n\n        if (type.typeArguments?.length) {\n            const id = builder.newId();\n            return group(id, [\n                name,\n                simpleElement(<span class=\"tsd-signature-symbol\">{\"<\"}</span>),\n                line(),\n                indent([\n                    join(\n                        nodes(\n                            simpleElement(\n                                <span class=\"tsd-signature-symbol\">,</span>,\n                            ),\n                            spaceOrLine(),\n                        ),\n                        type.typeArguments,\n                        (item) =>\n                            builder.type(\n                                item,\n                                TypeContext.referenceTypeArgument,\n                            ),\n                    ),\n                    ifWrap(\n                        id,\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">,</span>,\n                        ),\n                    ),\n                ]),\n                line(),\n                simpleElement(<span class=\"tsd-signature-symbol\">{\">\"}</span>),\n            ]);\n        }\n\n        return name;\n    },\n    reflection(type, builder, options) {\n        return builder.reflection(type.declaration, options);\n    },\n    rest(type, builder) {\n        return nodes(\n            simpleElement(<span class=\"tsd-signature-symbol\">...</span>),\n            builder.type(type.elementType, TypeContext.restElement),\n        );\n    },\n    templateLiteral(type, builder) {\n        const content: FormatterNode[] = [];\n        content.push(\n            simpleElement(<span class=\"tsd-signature-symbol\">`</span>),\n        );\n\n        if (type.head) {\n            content.push(\n                simpleElement(\n                    <span class=\"tsd-signature-type\">{type.head}</span>,\n                ),\n            );\n        }\n\n        for (const item of type.tail) {\n            content.push(\n                simpleElement(<span class=\"tsd-signature-symbol\">{\"${\"}</span>),\n                builder.type(item[0], TypeContext.templateLiteralElement),\n                simpleElement(<span class=\"tsd-signature-symbol\">{\"}\"}</span>),\n            );\n            if (item[1]) {\n                content.push(\n                    simpleElement(\n                        <span class=\"tsd-signature-type\">{item[1]}</span>,\n                    ),\n                );\n            }\n        }\n\n        content.push(\n            simpleElement(<span class=\"tsd-signature-symbol\">`</span>),\n        );\n\n        return nodes(...content);\n    },\n    tuple(type, builder) {\n        const id = builder.newId();\n\n        return group(id, [\n            simpleElement(<span class=\"tsd-signature-symbol\">[</span>),\n            line(),\n            indent([\n                join(\n                    nodes(\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">,</span>,\n                        ),\n                        spaceOrLine(),\n                    ),\n                    type.elements,\n                    (item) => builder.type(item, TypeContext.tupleElement),\n                ),\n            ]),\n            ifWrap(\n                id,\n                simpleElement(<span class=\"tsd-signature-symbol\">,</span>),\n            ),\n            line(),\n            simpleElement(<span class=\"tsd-signature-symbol\">]</span>),\n        ]);\n    },\n    typeOperator(type, builder) {\n        return nodes(\n            simpleElement(\n                <span class=\"tsd-signature-keyword\">{type.operator}</span>,\n            ),\n            space(),\n            builder.type(type.target, TypeContext.typeOperatorTarget),\n        );\n    },\n    union(type, builder) {\n        const parentId = builder.id;\n        const id = builder.newId();\n        const pipe = simpleElement(<span class=\"tsd-signature-symbol\">|</span>);\n\n        const elements = type.types.flatMap((type, i) => [\n            i == 0 ? ifWrap(id, nodes(pipe, space())) : space(),\n            builder.type(type, TypeContext.unionElement),\n            spaceOrLine(),\n            pipe,\n        ]);\n        elements.pop(); // Remove last pipe\n        elements.pop(); // Remove last spaceOrLine\n\n        return group(id, [\n            ifWrap(parentId, emptyNode, line()),\n            ifWrap(parentId, nodes(...elements), indent(elements)),\n        ]);\n    },\n    unknown(type) {\n        return textNode(type.name);\n    },\n};\n\n/**\n * Responsible for generating Nodes from a type tree.\n */\nexport class FormattedCodeBuilder {\n    forceWrap = new Set<number>();\n    id = 0;\n\n    constructor(\n        readonly router: Router,\n        readonly relativeReflection: Reflection,\n    ) {}\n\n    urlTo(refl: Reflection) {\n        return this.router.relativeUrl(this.relativeReflection, refl);\n    }\n\n    newId() {\n        return ++this.id;\n    }\n\n    type(\n        type: SomeType | undefined,\n        where: TypeContext,\n        options: { topLevelLinks: boolean } = { topLevelLinks: false },\n    ): FormatterNode {\n        if (!type) {\n            return simpleElement(<span class=\"tsd-signature-type\">any</span>);\n        }\n\n        if (type.needsParenthesis(where)) {\n            const id = this.newId();\n            return group(id, [\n                textNode(\"(\"),\n                line(),\n                indent([type.visit(typeBuilder, this, options)]),\n                line(),\n                textNode(\")\"),\n            ]);\n        }\n        return type.visit(typeBuilder, this, options);\n    }\n\n    reflection(\n        reflection: DeclarationReflection,\n        options: { topLevelLinks: boolean },\n    ): FormatterNode {\n        const members: FormatterNode[] = [];\n        const children = reflection.getProperties();\n\n        for (const item of children) {\n            this.member(members, item, options);\n        }\n\n        if (reflection.indexSignatures) {\n            for (const index of reflection.indexSignatures) {\n                members.push(\n                    nodes(\n                        ...(index.flags.isReadonly\n                            ? [\n                                simpleElement(\n                                    <span class=\"tsd-signature-keyword\">\n                                        readonly\n                                    </span>,\n                                ),\n                                space(),\n                            ]\n                            : []),\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">[</span>,\n                        ),\n                        simpleElement(\n                            <span class={getKindClass(index)}>\n                                {index.parameters![0].name}\n                            </span>,\n                        ),\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">:</span>,\n                        ),\n                        space(),\n                        this.type(index.parameters![0].type, TypeContext.none),\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">]:</span>,\n                        ),\n                        space(),\n                        this.type(index.type, TypeContext.none),\n                    ),\n                );\n            }\n        }\n\n        if (!members.length && reflection.signatures?.length === 1) {\n            return this.signature(reflection.signatures[0], {\n                hideName: true,\n                arrowStyle: true,\n            });\n        }\n\n        for (const item of reflection.signatures || []) {\n            members.push(this.signature(item, { hideName: true }));\n        }\n\n        if (members.length) {\n            const id = this.newId();\n            if (options.topLevelLinks) {\n                this.forceWrap.add(id);\n            }\n            return group(id, [\n                simpleElement(<span class=\"tsd-signature-symbol\">{\"{\"}</span>),\n                spaceOrLine(),\n                indent([\n                    join(\n                        nodes(\n                            simpleElement(\n                                <span class=\"tsd-signature-symbol\">;</span>,\n                            ),\n                            spaceOrLine(),\n                        ),\n                        members,\n                        (node) => node,\n                    ),\n                ]),\n                ifWrap(\n                    id,\n                    simpleElement(<span class=\"tsd-signature-symbol\">;</span>),\n                ),\n                spaceOrLine(),\n                simpleElement(<span class=\"tsd-signature-symbol\">{\"}\"}</span>),\n            ]);\n        }\n\n        return simpleElement(<span class=\"tsd-signature-symbol\">{\"{}\"}</span>);\n    }\n\n    typeAlias(item: DeclarationReflection) {\n        return nodes(\n            simpleElement(<span class=\"tsd-signature-keyword\">type</span>),\n            space(),\n            simpleElement(<span class={getKindClass(item)}>{item.name}</span>),\n            this.typeParameters(item),\n            space(),\n            simpleElement(<span class=\"tsd-signature-symbol\">{\"=\"}</span>),\n            space(),\n            this.reflection(item, { topLevelLinks: true }),\n        );\n    }\n\n    interface(item: DeclarationReflection) {\n        return nodes(\n            simpleElement(<span class=\"tsd-signature-keyword\">interface</span>),\n            space(),\n            simpleElement(<span class={getKindClass(item)}>{item.name}</span>),\n            this.typeParameters(item),\n            space(),\n            this.reflection(item, { topLevelLinks: true }),\n        );\n    }\n\n    member(\n        members: FormatterNode[],\n        item: DeclarationReflection,\n        options: { topLevelLinks: boolean },\n    ): void {\n        if (item.getSignature && item.setSignature) {\n            members.push(\n                this.signature(item.getSignature, options),\n                this.signature(item.setSignature, options),\n            );\n            return;\n        }\n\n        if (item.getSignature) {\n            members.push(this.signature(item.getSignature, options));\n            return;\n        }\n\n        if (item.setSignature) {\n            members.push(this.signature(item.setSignature, options));\n            return;\n        }\n\n        if (item.signatures) {\n            members.push(\n                ...item.signatures.map((sig) => this.signature(sig, options)),\n            );\n            return;\n        }\n\n        members.push(\n            nodes(\n                this.propertyName(item, options),\n                simpleElement(\n                    <span class=\"tsd-signature-symbol\">\n                        {item.flags.isOptional ? \"?:\" : \":\"}\n                    </span>,\n                ),\n                space(),\n                this.type(item.type, TypeContext.none),\n            ),\n        );\n    }\n\n    signature(\n        sig: SignatureReflection,\n        options: {\n            topLevelLinks?: boolean;\n            hideName?: boolean;\n            arrowStyle?: boolean;\n        },\n    ): FormatterNode {\n        let name: FormatterNode = options.hideName\n            ? emptyNode\n            : this.propertyName(sig, options);\n        switch (sig.kind) {\n            case ReflectionKind.ConstructorSignature: {\n                let label = emptyNode;\n                if (sig.flags.isAbstract) {\n                    label = nodes(\n                        simpleElement(\n                            <span class=\"tsd-signature-keyword\">abstract</span>,\n                        ),\n                        space(),\n                    );\n                }\n                label = nodes(\n                    label,\n                    simpleElement(\n                        <span class=\"tsd-signature-keyword\">new</span>,\n                    ),\n                    space(),\n                );\n                name = nodes(label, name);\n                break;\n            }\n            case ReflectionKind.GetSignature: {\n                name = nodes(\n                    simpleElement(\n                        <span class=\"tsd-signature-keyword\">get</span>,\n                    ),\n                    space(),\n                    name,\n                );\n                break;\n            }\n            case ReflectionKind.SetSignature: {\n                name = nodes(\n                    simpleElement(\n                        <span class=\"tsd-signature-keyword\">set</span>,\n                    ),\n                    space(),\n                    name,\n                );\n                break;\n            }\n        }\n\n        const id = this.newId();\n        return group(id, [\n            name,\n            sig.parent.flags.isOptional ? simpleElement(<span class=\"tsd-signature-symbol\">?</span>) : emptyNode,\n            this.typeParameters(sig),\n            ...this.parameters(sig, id),\n            nodes(\n                options.arrowStyle ? space() : emptyNode,\n                simpleElement(\n                    <span class=\"tsd-signature-symbol\">\n                        {options.arrowStyle ? \"=>\" : \":\"}\n                    </span>,\n                ),\n                space(),\n                this.type(sig.type, TypeContext.none),\n            ),\n        ]);\n    }\n\n    private typeParameters(\n        sig: SignatureReflection | DeclarationReflection,\n    ): FormatterNode {\n        if (!sig.typeParameters?.length) {\n            return emptyNode;\n        }\n\n        const id = this.newId();\n        return group(id, [\n            simpleElement(<span class=\"tsd-signature-symbol\">{\"<\"}</span>),\n            line(),\n            indent([\n                join(\n                    nodes(\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">,</span>,\n                        ),\n                        spaceOrLine(),\n                    ),\n                    sig.typeParameters,\n                    (item) => this.typeParameter(item),\n                ),\n            ]),\n            ifWrap(\n                id,\n                simpleElement(<span class=\"tsd-signature-symbol\">,</span>),\n            ),\n            line(),\n            simpleElement(<span class=\"tsd-signature-symbol\">{\">\"}</span>),\n        ]);\n    }\n\n    private typeParameter(param: TypeParameterReflection) {\n        let prefix = emptyNode;\n        if (param.flags.isConst) {\n            prefix = nodes(\n                simpleElement(<span class=\"tsd-signature-keyword\">const</span>),\n                space(),\n            );\n        }\n        if (param.varianceModifier) {\n            prefix = nodes(\n                prefix,\n                simpleElement(\n                    <span class=\"tsd-signature-keyword\">\n                        {param.varianceModifier}\n                    </span>,\n                ),\n                space(),\n            );\n        }\n\n        const content = [prefix];\n\n        if (this.router.hasUrl(param)) {\n            content.push(\n                simpleElement(\n                    <a\n                        class=\"tsd-signature-type tsd-kind-type-parameter\"\n                        href={this.urlTo(param)}\n                    >\n                        {param.name}\n                    </a>,\n                ),\n            );\n        } else {\n            content.push(\n                simpleElement(\n                    <span class=\"tsd-signature-type tsd-kind-type-parameter\">\n                        {param.name}\n                    </span>,\n                ),\n            );\n        }\n\n        if (param.type) {\n            content.push(\n                space(),\n                simpleElement(\n                    <span class=\"tsd-signature-keyword\">extends</span>,\n                ),\n                spaceOrLine(),\n                indent([this.type(param.type, TypeContext.none)]),\n            );\n        }\n\n        if (param.default) {\n            content.push(\n                space(),\n                simpleElement(<span class=\"tsd-signature-symbol\">=</span>),\n                space(),\n                this.type(param.default, TypeContext.none),\n            );\n        }\n\n        return group(this.newId(), content);\n    }\n\n    private parameters(sig: SignatureReflection, id: number): FormatterNode[] {\n        if (!sig.parameters?.length) {\n            return [\n                simpleElement(<span class=\"tsd-signature-symbol\">()</span>),\n            ];\n        }\n\n        return [\n            simpleElement(<span class=\"tsd-signature-symbol\">(</span>),\n            line(),\n            indent([\n                join(\n                    nodes(\n                        simpleElement(\n                            <span class=\"tsd-signature-symbol\">,</span>,\n                        ),\n                        spaceOrLine(),\n                    ),\n                    sig.parameters,\n                    (item) => this.parameter(item),\n                ),\n            ]),\n            ifWrap(\n                id,\n                simpleElement(<span class=\"tsd-signature-symbol\">,</span>),\n            ),\n            line(),\n            simpleElement(<span class=\"tsd-signature-symbol\">)</span>),\n        ];\n    }\n\n    private parameter(param: ParameterReflection) {\n        const content: FormatterNode[] = [];\n        if (param.flags.isRest) {\n            content.push(\n                simpleElement(<span class=\"tsd-signature-symbol\">...</span>),\n            );\n        }\n        content.push(\n            simpleElement(<span class=\"tsd-kind-parameter\">{param.name}</span>),\n        );\n\n        if (param.flags.isOptional || param.defaultValue) {\n            content.push(\n                simpleElement(<span class=\"tsd-signature-symbol\">?:</span>),\n            );\n        } else {\n            content.push(\n                simpleElement(<span class=\"tsd-signature-symbol\">:</span>),\n            );\n        }\n        // Tricky: We don't introduce a branch here via group()\n        // the branch may be introduced by the union type if the parameter\n        // value is a union.\n        const id = this.newId();\n        content.push(ifWrap(id, emptyNode, space()));\n        content.push(this.type(param.type, TypeContext.none));\n        return nodes(...content);\n    }\n\n    private propertyName(\n        reflection: Reflection,\n        options: { topLevelLinks?: boolean },\n    ): FormatterNode {\n        const entityName = /^[A-Z_$][\\w$]*$/i.test(reflection.name)\n            ? reflection.name\n            : JSON.stringify(reflection.name);\n\n        if (options.topLevelLinks) {\n            return simpleElement(\n                <a\n                    class={getKindClass(reflection)}\n                    href={this.urlTo(reflection)}\n                >\n                    {entityName}\n                </a>,\n            );\n        }\n        return simpleElement(\n            <span class={getKindClass(reflection)}>{entityName}</span>,\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/output/index.ts",
    "content": "export { IndexEvent, MarkdownEvent, PageEvent, type PageHeading, RendererEvent } from \"./events.js\";\nexport { Renderer, type RendererEvents } from \"./renderer.js\";\nexport type { RendererHooks } from \"./renderer.js\";\nexport { Theme } from \"./theme.js\";\nexport { DefaultTheme, type NavigationElement, type RenderTemplate } from \"./themes/default/DefaultTheme.js\";\nexport { DefaultThemeRenderContext } from \"./themes/default/DefaultThemeRenderContext.js\";\nexport type { Icons } from \"./themes/default/partials/icon.js\";\nexport { Slugger } from \"./themes/default/Slugger.js\";\n\nexport {\n    BaseRouter,\n    CategoryRouter,\n    GroupRouter,\n    KindDirRouter,\n    KindRouter,\n    type PageDefinition,\n    PageKind,\n    type Router,\n    type RouterTarget,\n    StructureDirRouter,\n    StructureRouter,\n} from \"./router.js\";\n"
  },
  {
    "path": "src/lib/output/output.ts",
    "content": "import { i18n, type TranslatedString } from \"#utils\";\nimport type { Application } from \"../application.js\";\nimport type { ProjectReflection } from \"../models/index.js\";\nimport { type OutputSpecification, ParameterType, type StringDeclarationOption } from \"../utils/options/declaration.js\";\nimport { nicePath } from \"../utils/paths.js\";\n\nexport class Outputs {\n    private outputs = new Map<\n        string,\n        (path: string, project: ProjectReflection) => Promise<void>\n    >();\n\n    private defaultOutput = \"html\";\n\n    constructor(readonly application: Application) {}\n\n    addOutput(\n        name: string,\n        output: (path: string, project: ProjectReflection) => Promise<void>,\n    ) {\n        if (this.outputs.has(name)) {\n            throw new Error(`Output type '${name}' has already been defined`);\n        }\n        this.outputs.set(name, output);\n    }\n\n    setDefaultOutputName(name: string) {\n        this.defaultOutput = name;\n    }\n\n    getOutputSpecs(): OutputSpecification[] {\n        const options = this.application.options;\n\n        let outputs: OutputSpecification[] = [];\n\n        const outputShortcuts = options\n            .getDeclarations()\n            .filter(\n                (decl) => decl.type === ParameterType.Path && decl.outputShortcut,\n            );\n\n        // --out is a special case. It isn't marked as a shortcut as what it is\n        // a shortcut for may be modified by plugins. However, it is effectively\n        // treated as an output shortcut, so check it here.\n        if (options.isSet(\"out\")) {\n            outputs.push({\n                name: this.defaultOutput,\n                path: options.getValue(\"out\"),\n            });\n        }\n        for (const shortcut of outputShortcuts) {\n            if (options.isSet(shortcut.name as \"html\")) {\n                outputs.push({\n                    name: (shortcut as StringDeclarationOption).outputShortcut!,\n                    path: options.getValue(shortcut.name as \"html\"),\n                });\n            }\n        }\n\n        // If no shortcuts have been defined, use the dedicated outputs option\n        if (outputs.length === 0) {\n            outputs = options.getValue(\"outputs\") || [];\n        }\n\n        // If no outputs have been defined, just write the default output.\n        if (!outputs.length) {\n            outputs.push({\n                name: this.defaultOutput,\n                path: options.getValue(\"out\"),\n            });\n        }\n\n        return outputs;\n    }\n\n    async writeOutputs(project: ProjectReflection): Promise<void> {\n        const outputs = this.getOutputSpecs();\n\n        for (const output of outputs) {\n            await this.writeOutput(output, project);\n        }\n    }\n\n    async writeOutput(output: OutputSpecification, project: ProjectReflection) {\n        const options = this.application.options;\n        const snap = options.snapshot();\n        const writer = this.outputs.get(output.name);\n        if (!writer) {\n            this.application.logger.error(\n                i18n.specified_output_0_has_not_been_defined(\n                    output.name,\n                ),\n            );\n            return;\n        }\n\n        if (!this.application.setOptions(output.options || {}, true)) {\n            options.restore(snap);\n            return;\n        }\n\n        const preErrors = this.application.logger.errorCount;\n\n        const start = Date.now();\n        try {\n            await writer(output.path, project);\n        } catch (error) {\n            const message = error instanceof Error ? error.message : String(error);\n            this.application.logger.error(message as TranslatedString);\n        }\n\n        if (this.application.logger.errorCount === preErrors) {\n            this.application.logger.info(\n                i18n.output_0_generated_at_1(\n                    output.name,\n                    nicePath(output.path),\n                ),\n            );\n        } else {\n            this.application.logger.error(\n                i18n.output_0_could_not_be_generated(\n                    output.name,\n                ),\n            );\n        }\n\n        this.application.logger.verbose(\n            `${output.name} took ${Date.now() - start}ms`,\n        );\n\n        options.restore(snap);\n    }\n}\n"
  },
  {
    "path": "src/lib/output/plugins/AssetsPlugin.ts",
    "content": "import { RendererComponent } from \"../components.js\";\nimport { RendererEvent } from \"../events.js\";\nimport { copySync, isFile, readFile, writeFileSync } from \"../../utils/fs.js\";\nimport { DefaultTheme } from \"../themes/default/DefaultTheme.js\";\nimport { getStyles } from \"../../utils/highlighter.js\";\nimport { type EnumKeys, getEnumKeys, i18n, type NormalizedPath } from \"#utils\";\nimport { existsSync } from \"fs\";\nimport { extname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { Renderer } from \"../index.js\";\nimport { ReflectionKind } from \"../../models/index.js\";\nimport { Option } from \"../../utils/index.js\";\n\n/**\n * A plugin that copies the subdirectory ´assets´ from the current themes\n * source folder to the output directory.\n */\nexport class AssetsPlugin extends RendererComponent {\n    @Option(\"favicon\")\n    private accessor favicon!: NormalizedPath;\n\n    @Option(\"customCss\")\n    private accessor customCss!: NormalizedPath;\n\n    @Option(\"customJs\")\n    private accessor customJs!: NormalizedPath;\n\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(RendererEvent.BEGIN, this.onRenderBegin.bind(this));\n        this.owner.on(RendererEvent.END, this.onRenderEnd.bind(this));\n    }\n\n    getTranslatedStrings() {\n        const translations: Record<string, string> = {\n            copy: i18n.theme_copy(),\n            copied: i18n.theme_copied(),\n            normally_hidden: i18n.theme_normally_hidden(),\n            hierarchy_expand: i18n.theme_hierarchy_expand(),\n            hierarchy_collapse: i18n.theme_hierarchy_collapse(),\n            folder: i18n.theme_folder(),\n\n            search_index_not_available: i18n.theme_search_index_not_available(),\n            search_no_results_found_for_0: i18n.theme_search_no_results_found_for_0(\n                \"{0}\",\n            ),\n        };\n\n        for (const key of getEnumKeys(ReflectionKind)) {\n            const kind = ReflectionKind[key as EnumKeys<typeof ReflectionKind>];\n            translations[`kind_${kind}`] = ReflectionKind.singularString(kind);\n        }\n\n        return translations;\n    }\n\n    private onRenderBegin(event: RendererEvent) {\n        const dest = join(event.outputDirectory, \"assets\");\n\n        if (\n            !/^https?:\\/\\//i.test(this.favicon) &&\n            [\".ico\", \".png\", \".svg\"].includes(extname(this.favicon))\n        ) {\n            copySync(\n                this.favicon,\n                join(dest, \"favicon\" + extname(this.favicon)),\n            );\n        }\n\n        if (this.customCss) {\n            this.application.watchFile(this.customCss);\n            if (existsSync(this.customCss)) {\n                copySync(this.customCss, join(dest, \"custom.css\"));\n            } else {\n                this.application.logger.error(\n                    i18n.custom_css_file_0_does_not_exist(\n                        this.customCss,\n                    ),\n                );\n            }\n        }\n\n        if (this.customJs) {\n            this.application.watchFile(this.customJs);\n            if (existsSync(this.customJs)) {\n                copySync(this.customJs, join(dest, \"custom.js\"));\n            } else {\n                this.application.logger.error(\n                    i18n.custom_js_file_0_does_not_exist(\n                        this.customJs,\n                    ),\n                );\n            }\n        }\n    }\n\n    /**\n     * Triggered before the renderer starts rendering a project.\n     *\n     * @param event  An event object describing the current render operation.\n     */\n    private onRenderEnd(event: RendererEvent) {\n        if (this.owner.theme instanceof DefaultTheme) {\n            const src = join(\n                fileURLToPath(import.meta.url),\n                \"../../../../../static\",\n            );\n            const dest = join(event.outputDirectory, \"assets\");\n            copySync(join(src, \"style.css\"), join(dest, \"style.css\"));\n\n            const mainJs = readFile(join(src, \"main.js\"));\n            writeFileSync(\n                join(dest, \"main.js\"),\n                [\n                    '\"use strict\";',\n                    `window.translations=${JSON.stringify(this.getTranslatedStrings())};`,\n                    mainJs,\n                ].join(\"\\n\"),\n            );\n\n            writeFileSync(join(dest, \"highlight.css\"), getStyles());\n\n            const media = join(event.outputDirectory, \"media\");\n            const toCopy = event.project.files.getNameToAbsoluteMap();\n            for (const [fileName, absolute] of toCopy.entries()) {\n                if (isFile(absolute)) {\n                    copySync(absolute, join(media, fileName));\n                } else {\n                    this.application.logger.warn(\n                        i18n.relative_path_0_is_not_a_file_and_will_not_be_copied_to_output(absolute),\n                    );\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/output/plugins/HierarchyPlugin.ts",
    "content": "import * as Path from \"path\";\nimport { RendererComponent } from \"../components.js\";\nimport { RendererEvent } from \"../events.js\";\nimport { writeFile } from \"../../utils/index.js\";\nimport { DefaultTheme } from \"../themes/default/DefaultTheme.js\";\n\nimport type { Renderer } from \"../index.js\";\nimport { getHierarchyRoots, getKindClass, getUniquePath } from \"../themes/lib.js\";\nimport type { DeclarationReflection } from \"../../models/index.js\";\nimport { compressJson } from \"../../utils/compress.js\";\n\ninterface JsonHierarchyElement {\n    name: string;\n    kind: number;\n    url: string;\n    children?: number[];\n    uniqueNameParents?: number[];\n    class: string;\n}\n\ninterface JsonHierarchy {\n    // ids of root instances\n    roots: number[];\n    reflections: Record<number, JsonHierarchyElement>;\n}\n\nexport class HierarchyPlugin extends RendererComponent {\n    constructor(renderer: Renderer) {\n        super(renderer);\n        this.owner.on(RendererEvent.BEGIN, this.onRendererBegin.bind(this));\n    }\n\n    private onRendererBegin(_event: RendererEvent) {\n        if (!(this.owner.theme instanceof DefaultTheme)) {\n            return;\n        }\n\n        this.owner.preRenderAsyncJobs.push((event) => this.buildHierarchy(event));\n    }\n\n    private async buildHierarchy(event: RendererEvent) {\n        const project = event.project;\n\n        const hierarchy: JsonHierarchy = {\n            roots: getHierarchyRoots(project).map((refl) => refl.id),\n            reflections: {},\n        };\n\n        const queue = [...hierarchy.roots];\n\n        while (queue.length) {\n            const id = queue.pop()!;\n            const refl = project.getReflectionById(id) as DeclarationReflection;\n            if (id in hierarchy.reflections) continue;\n\n            const url = this.owner.router!.getFullUrl(refl);\n            if (!url) continue;\n\n            const jsonRecord: JsonHierarchyElement = {\n                name: refl.name,\n                kind: refl.kind,\n                url,\n                class: getKindClass(refl),\n            };\n\n            const path = getUniquePath(refl);\n            if (path.length > 1) {\n                jsonRecord.uniqueNameParents = path\n                    .slice(0, -1)\n                    .map((r) => r.id);\n                queue.push(...jsonRecord.uniqueNameParents);\n            }\n\n            const children = [\n                ...(refl.implementedBy || []),\n                ...(refl.extendedBy || []),\n            ];\n\n            for (const child of children) {\n                if (child.reflection) {\n                    jsonRecord.children ||= [];\n                    jsonRecord.children.push(child.reflection.id);\n                }\n            }\n            if (jsonRecord.children) {\n                queue.push(...jsonRecord.children);\n            }\n\n            hierarchy.reflections[id] = jsonRecord;\n        }\n\n        const hierarchyJs = Path.join(\n            event.outputDirectory,\n            \"assets\",\n            \"hierarchy.js\",\n        );\n\n        await writeFile(\n            hierarchyJs,\n            `window.hierarchyData = \"${await compressJson(hierarchy)}\"`,\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/output/plugins/IconsPlugin.tsx",
    "content": "import { RendererComponent } from \"../components.js\";\nimport { RendererEvent } from \"../events.js\";\nimport { writeFile } from \"../../utils/fs.js\";\nimport { DefaultTheme } from \"../themes/default/DefaultTheme.js\";\nimport { join } from \"path\";\nimport { JSX } from \"#utils\";\nimport type { Renderer } from \"../index.js\";\n\nconst ICONS_JS = `\n(function() {\n    addIcons();\n    function addIcons() {\n        if (document.readyState === \"loading\") return document.addEventListener(\"DOMContentLoaded\", addIcons);\n        const svg = document.body.appendChild(document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\"));\n        svg.innerHTML = \\`SVG_HTML\\`;\n        svg.style.display = \"none\";\n        if (location.protocol === \"file:\") updateUseElements();\n    }\n\n    function updateUseElements() {\n        document.querySelectorAll(\"use\").forEach(el => {\n            if (el.getAttribute(\"href\").includes(\"#icon-\")) {\n                el.setAttribute(\"href\", el.getAttribute(\"href\").replace(/.*#/, \"#\"));\n            }\n        });\n    }\n})()\n`.trim();\n\n/**\n * Plugin which is responsible for creating an icons.js file that embeds the icon SVGs\n * within the page on page load to reduce page sizes.\n */\nexport class IconsPlugin extends RendererComponent {\n    iconHtml?: string;\n\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(RendererEvent.BEGIN, this.onBeginRender.bind(this));\n    }\n\n    private onBeginRender(_event: RendererEvent) {\n        if (this.owner.theme instanceof DefaultTheme) {\n            this.owner.postRenderAsyncJobs.push((event) => this.onRenderEnd(event));\n        }\n    }\n\n    private async onRenderEnd(event: RendererEvent) {\n        const children: JSX.Element[] = [];\n        const icons = (this.owner.theme as DefaultTheme).icons;\n\n        for (const [name, icon] of Object.entries(icons)) {\n            children.push(\n                <g id={`icon-${name}`} class=\"tsd-no-select\">\n                    {icon.call(icons).children}\n                </g>,\n            );\n        }\n\n        const svg = JSX.renderElement(<svg xmlns=\"http://www.w3.org/2000/svg\">{children}</svg>);\n        const js = ICONS_JS.replace(\"SVG_HTML\", JSX.renderElement(<>{children}</>).replaceAll(\"`\", \"\\\\`\"));\n\n        const svgPath = join(event.outputDirectory, \"assets/icons.svg\");\n        const jsPath = join(event.outputDirectory, \"assets/icons.js\");\n\n        await Promise.all([writeFile(svgPath, svg), writeFile(jsPath, js)]);\n    }\n}\n"
  },
  {
    "path": "src/lib/output/plugins/JavascriptIndexPlugin.ts",
    "content": "import * as Path from \"path\";\nimport lunr from \"lunr\";\n\nimport { type Comment, type DeclarationReflection, type DocumentReflection, Reflection } from \"../../models/index.js\";\nimport { RendererComponent } from \"../components.js\";\nimport { IndexEvent, RendererEvent } from \"../events.js\";\nimport { Option, writeFile } from \"../../utils/index.js\";\nimport { DefaultTheme } from \"../themes/default/DefaultTheme.js\";\nimport type { Renderer } from \"../index.js\";\nimport { GroupPlugin } from \"../../converter/plugins/GroupPlugin.js\";\nimport { CategoryPlugin } from \"../../converter/plugins/CategoryPlugin.js\";\nimport { compressJson } from \"../../utils/compress.js\";\nimport { i18n } from \"#utils\";\n\n/**\n * Keep this in sync with the interface in src/lib/output/themes/default/assets/typedoc/components/Search.ts\n */\ninterface SearchDocument {\n    kind: number;\n    name: string;\n    url: string;\n    classes?: string;\n    parent?: string;\n    icon?: string | number;\n}\n\n/**\n * A plugin that exports an index of the project to a javascript file.\n *\n * The resulting javascript file can be used to build a simple search function.\n */\nexport class JavascriptIndexPlugin extends RendererComponent {\n    @Option(\"searchInComments\")\n    private accessor searchComments!: boolean;\n\n    @Option(\"searchInDocuments\")\n    private accessor searchDocuments!: boolean;\n\n    @Option(\"searchGroupBoosts\")\n    private accessor searchGroupBoosts!: Record<string, number>;\n\n    @Option(\"searchCategoryBoosts\")\n    private accessor searchCategoryBoosts!: Record<string, number>;\n\n    @Option(\"groupReferencesByType\")\n    accessor groupReferencesByType!: boolean;\n\n    private unusedGroupBoosts = new Set<string>();\n    private unusedCatBoosts = new Set<string>();\n\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(RendererEvent.BEGIN, this.onRendererBegin.bind(this));\n    }\n\n    private onRendererBegin(_event: RendererEvent) {\n        this.unusedGroupBoosts = new Set(Object.keys(this.searchGroupBoosts));\n        this.unusedCatBoosts = new Set(Object.keys(this.searchCategoryBoosts));\n\n        if (!(this.owner.theme instanceof DefaultTheme)) {\n            return;\n        }\n\n        this.owner.preRenderAsyncJobs.push((event) => this.buildSearchIndex(event));\n    }\n\n    private async buildSearchIndex(event: RendererEvent) {\n        const theme = this.owner.theme as DefaultTheme;\n\n        const rows: SearchDocument[] = [];\n\n        const initialSearchResults = this.owner\n            .router!.getLinkTargets()\n            .filter(\n                (refl) =>\n                    refl instanceof Reflection &&\n                    (refl.isDeclaration() || refl.isDocument()) &&\n                    refl.name &&\n                    !refl.flags.isExternal,\n            ) as Array<DeclarationReflection | DocumentReflection>;\n\n        const indexEvent = new IndexEvent(initialSearchResults);\n\n        this.owner.trigger(IndexEvent.PREPARE_INDEX, indexEvent);\n\n        const builder = new lunr.Builder();\n        builder.pipeline.add(lunr.trimmer);\n\n        builder.ref(\"id\");\n        for (\n            const [key, boost] of Object.entries(\n                indexEvent.searchFieldWeights,\n            )\n        ) {\n            builder.field(key, { boost });\n        }\n\n        for (const reflection of indexEvent.searchResults) {\n            const boost = this.getBoost(reflection);\n\n            if (boost <= 0) {\n                continue;\n            }\n\n            let parent = reflection.parent;\n            if (parent?.isProject()) {\n                parent = undefined;\n            }\n\n            const row: SearchDocument = {\n                kind: reflection.kind,\n                name: reflection.name,\n                url: theme.router.getFullUrl(reflection),\n                classes: theme.getReflectionClasses(reflection),\n            };\n\n            const icon = theme.getReflectionIcon(reflection);\n            if (icon !== reflection.kind) {\n                row.icon = icon;\n            }\n\n            if (parent) {\n                row.parent = parent.getFullName();\n            }\n\n            builder.add(\n                {\n                    name: reflection.name,\n                    comment: this.getCommentSearchText(reflection),\n                    document: this.getDocumentSearchText(reflection),\n                    ...indexEvent.searchFields[rows.length],\n                    id: rows.length,\n                },\n                { boost },\n            );\n            rows.push(row);\n        }\n\n        const index = builder.build();\n\n        const jsonFileName = Path.join(\n            event.outputDirectory,\n            \"assets\",\n            \"search.js\",\n        );\n\n        const data = {\n            rows,\n            index,\n        };\n        await writeFile(\n            jsonFileName,\n            `window.searchData = \"${await compressJson(data)}\";`,\n        );\n\n        if (\n            this.unusedGroupBoosts.size &&\n            this.application.options.isSet(\"searchGroupBoosts\")\n        ) {\n            this.application.logger.warn(\n                i18n.not_all_search_group_boosts_used_0(\n                    Array.from(this.unusedGroupBoosts).join(\"\\n\\t\"),\n                ),\n            );\n        }\n\n        if (\n            this.unusedCatBoosts.size &&\n            this.application.options.isSet(\"searchCategoryBoosts\")\n        ) {\n            this.application.logger.warn(\n                i18n.not_all_search_category_boosts_used_0(\n                    Array.from(this.unusedCatBoosts).join(\"\\n\\t\"),\n                ),\n            );\n        }\n    }\n\n    private getBoost(refl: DeclarationReflection | DocumentReflection): number {\n        let boost = refl.relevanceBoost ?? 1;\n\n        for (\n            const group of GroupPlugin.getGroups(\n                refl,\n                this.groupReferencesByType,\n            )\n        ) {\n            boost *= this.searchGroupBoosts[group] ?? 1;\n            this.unusedGroupBoosts.delete(group);\n        }\n\n        for (const cat of CategoryPlugin.getCategories(refl)) {\n            boost *= this.searchCategoryBoosts[cat] ?? 1;\n            this.unusedCatBoosts.delete(cat);\n        }\n\n        return boost;\n    }\n\n    private getCommentSearchText(reflection: Reflection) {\n        if (!this.searchComments) return;\n\n        const comments: Comment[] = [];\n        if (reflection.comment) comments.push(reflection.comment);\n        if (reflection.isDeclaration()) {\n            reflection.signatures?.forEach(\n                (s) => s.comment && comments.push(s.comment),\n            );\n            if (reflection.getSignature?.comment) {\n                comments.push(reflection.getSignature.comment);\n            }\n            if (reflection.setSignature?.comment) {\n                comments.push(reflection.setSignature.comment);\n            }\n        }\n\n        if (!comments.length) {\n            return;\n        }\n\n        return comments\n            .flatMap((c) => {\n                return [...c.summary, ...c.blockTags.flatMap((t) => t.content)];\n            })\n            .map((part) => part.text)\n            .join(\"\\n\");\n    }\n\n    private getDocumentSearchText(reflection: Reflection) {\n        if (!this.searchDocuments) return;\n\n        if (reflection.isDocument()) {\n            return reflection.content.flatMap((c) => c.text).join(\"\\n\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/output/plugins/NavigationPlugin.ts",
    "content": "import * as Path from \"path\";\nimport { RendererComponent } from \"../components.js\";\nimport { RendererEvent } from \"../events.js\";\nimport { writeFile } from \"../../utils/index.js\";\nimport { DefaultTheme } from \"../themes/default/DefaultTheme.js\";\nimport type { Renderer } from \"../index.js\";\nimport { compressJson } from \"../../utils/compress.js\";\n\nexport class NavigationPlugin extends RendererComponent {\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(RendererEvent.BEGIN, this.onRendererBegin.bind(this));\n    }\n\n    private onRendererBegin(_event: RendererEvent) {\n        if (!(this.owner.theme instanceof DefaultTheme)) {\n            return;\n        }\n        this.owner.preRenderAsyncJobs.push((event) => this.buildNavigationIndex(event));\n    }\n\n    private async buildNavigationIndex(event: RendererEvent) {\n        const navigationJs = Path.join(\n            event.outputDirectory,\n            \"assets\",\n            \"navigation.js\",\n        );\n\n        const nav = (this.owner.theme as DefaultTheme).getNavigation(\n            event.project,\n        );\n\n        await writeFile(\n            navigationJs,\n            `window.navigationData = \"${await compressJson(nav)}\"`,\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/output/plugins/SitemapPlugin.ts",
    "content": "import Path from \"path\";\nimport { RendererComponent } from \"../components.js\";\nimport { RendererEvent } from \"../events.js\";\nimport { DefaultTheme } from \"../themes/default/DefaultTheme.js\";\nimport { writeFile } from \"#node-utils\";\nimport { escapeHtml, JSX } from \"#utils\";\nimport type { Renderer } from \"../index.js\";\n\nexport class SitemapPlugin extends RendererComponent {\n    private get hostedBaseUrl() {\n        const url = this.application.options.getValue(\"hostedBaseUrl\");\n        return !url || url.endsWith(\"/\") ? url : url + \"/\";\n    }\n\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(RendererEvent.BEGIN, this.onRendererBegin.bind(this));\n    }\n\n    private onRendererBegin(_event: RendererEvent) {\n        if (!(this.owner.theme instanceof DefaultTheme)) {\n            return;\n        }\n        if (!this.hostedBaseUrl) {\n            return;\n        }\n\n        this.owner.hooks.on(\"head.begin\", (context) => {\n            if (context.page.url === \"index.html\") {\n                return {\n                    tag: \"link\",\n                    props: { rel: \"canonical\", href: this.hostedBaseUrl },\n                    children: [],\n                };\n            }\n            return { tag: JSX.Fragment, props: null, children: [] };\n        });\n\n        this.owner.preRenderAsyncJobs.push((event) => this.buildSitemap(event));\n    }\n\n    private async buildSitemap(event: RendererEvent) {\n        // cSpell:words lastmod urlset\n        const sitemapXml = Path.join(event.outputDirectory, \"sitemap.xml\");\n        const lastmod = new Date(this.owner.renderStartTime).toISOString();\n\n        const urls: XmlElementData[] = event.pages.map((page) => {\n            return {\n                tag: \"url\",\n                children: [\n                    {\n                        tag: \"loc\",\n                        children: new URL(\n                            page.url,\n                            this.hostedBaseUrl,\n                        ).toString(),\n                    },\n                    {\n                        tag: \"lastmod\",\n                        children: lastmod,\n                    },\n                ],\n            };\n        });\n\n        const sitemap = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n` +\n            stringifyXml({\n                tag: \"urlset\",\n                attr: { xmlns: \"http://www.sitemaps.org/schemas/sitemap/0.9\" },\n                children: urls,\n            }) +\n            \"\\n\";\n\n        await writeFile(sitemapXml, sitemap);\n    }\n}\n\ninterface XmlElementData {\n    attr?: Record<string, string>;\n    tag: string;\n    children: XmlElementData[] | string;\n}\n\nfunction stringifyXml(xml: XmlElementData, indent = 0) {\n    const parts = [\"\\t\".repeat(indent), \"<\", xml.tag];\n\n    for (const [key, val] of Object.entries(xml.attr || {})) {\n        parts.push(\" \", key, '=\"', escapeHtml(val), '\"');\n    }\n\n    parts.push(\">\");\n\n    if (typeof xml.children === \"string\") {\n        parts.push(escapeHtml(xml.children));\n    } else {\n        for (const child of xml.children) {\n            parts.push(\"\\n\");\n            parts.push(stringifyXml(child, indent + 1));\n        }\n        parts.push(\"\\n\", \"\\t\".repeat(indent));\n    }\n\n    parts.push(\"</\", xml.tag, \">\");\n\n    return parts.join(\"\");\n}\n"
  },
  {
    "path": "src/lib/output/plugins/index.ts",
    "content": "export { MarkedPlugin } from \"../themes/MarkedPlugin.js\";\nexport { AssetsPlugin } from \"./AssetsPlugin.js\";\nexport { HierarchyPlugin } from \"./HierarchyPlugin.js\";\nexport { IconsPlugin } from \"./IconsPlugin.js\";\nexport { JavascriptIndexPlugin } from \"./JavascriptIndexPlugin.js\";\nexport { NavigationPlugin } from \"./NavigationPlugin.js\";\nexport { SitemapPlugin } from \"./SitemapPlugin.js\";\n"
  },
  {
    "path": "src/lib/output/renderer.ts",
    "content": "/**\n * Holds all logic used render and output the final documentation.\n *\n * The {@link Renderer} class is the central controller within this namespace. When invoked it creates\n * an instance of {@link Theme} which defines the layout of the documentation and fires a\n * series of {@link RendererEvent} events. Instances of {@link BasePlugin} can listen to these events and\n * alter the generated output.\n */\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport type { Application } from \"../application.js\";\nimport type { Theme } from \"./theme.js\";\nimport { IndexEvent, type MarkdownEvent, PageEvent, RendererEvent } from \"./events.js\";\nimport type { ProjectReflection } from \"../models/ProjectReflection.js\";\nimport { writeFileSync } from \"../utils/fs.js\";\nimport { DefaultTheme } from \"./themes/default/DefaultTheme.js\";\nimport { AbstractComponent, Option } from \"../utils/index.js\";\nimport type { Comment, Reflection } from \"../models/index.js\";\nimport type { DefaultThemeRenderContext } from \"./themes/default/DefaultThemeRenderContext.js\";\nimport { EventHooks, i18n, JSX } from \"#utils\";\n\nimport {\n    AssetsPlugin,\n    HierarchyPlugin,\n    IconsPlugin,\n    JavascriptIndexPlugin,\n    MarkedPlugin,\n    NavigationPlugin,\n    SitemapPlugin,\n} from \"./plugins/index.js\";\nimport {\n    CategoryRouter,\n    GroupRouter,\n    KindDirRouter,\n    KindRouter,\n    type PageDefinition,\n    type Router,\n    StructureDirRouter,\n    StructureRouter,\n} from \"./router.js\";\n\n/**\n * Describes the hooks available to inject output in the default theme.\n * If the available hooks don't let you put something where you'd like, please open an issue!\n */\nexport interface RendererHooks {\n    /**\n     * Applied immediately after the opening `<head>` tag.\n     */\n    \"head.begin\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before the closing `</head>` tag.\n     */\n    \"head.end\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately after the opening `<body>` tag.\n     */\n    \"body.begin\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before the closing `</body>` tag.\n     */\n    \"body.end\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before the main template.\n     */\n    \"content.begin\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately after the main template.\n     */\n    \"content.end\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before calling `context.sidebar`.\n     */\n    \"sidebar.begin\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately after calling `context.sidebar`.\n     */\n    \"sidebar.end\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before calling `context.pageSidebar`.\n     */\n    \"pageSidebar.begin\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately after calling `context.pageSidebar`.\n     */\n    \"pageSidebar.end\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before the \"Generated by TypeDoc\" link in the footer.\n     */\n    \"footer.begin\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately after the \"Generated by TypeDoc\" link in the footer.\n     */\n    \"footer.end\": [DefaultThemeRenderContext];\n\n    /**\n     * Applied immediately before a comment's tags are rendered.\n     *\n     * This may be used to set {@link Models.CommentTag.skipRendering} on any tags which\n     * should not be rendered.\n     */\n    \"comment.beforeTags\": [DefaultThemeRenderContext, Comment, Reflection];\n\n    /**\n     * Applied immediately after a comment's tags are rendered.\n     *\n     * This may be used to set {@link Models.CommentTag.skipRendering} on any tags which\n     * should not be rendered as this hook is called before the tags are actually\n     * rendered.\n     */\n    \"comment.afterTags\": [DefaultThemeRenderContext, Comment, Reflection];\n}\n\nexport interface RendererEvents {\n    beginRender: [RendererEvent];\n    beginPage: [PageEvent];\n    endPage: [PageEvent];\n    endRender: [RendererEvent];\n\n    parseMarkdown: [MarkdownEvent];\n    prepareIndex: [IndexEvent];\n}\n\n/**\n * The renderer processes a {@link ProjectReflection} using a {@link Theme} instance and writes\n * the emitted html documents to a output directory. You can specify which theme should be used\n * using the `--theme <name>` command line argument.\n *\n * {@link Renderer} is a subclass of {@link EventDispatcher} and triggers a series of events while\n * a project is being processed. You can listen to these events to control the flow or manipulate\n * the output.\n *\n *  * {@link Renderer.EVENT_BEGIN}<br>\n *    Triggered before the renderer starts rendering a project. The listener receives\n *    an instance of {@link RendererEvent}.\n *\n *    * {@link Renderer.EVENT_BEGIN_PAGE}<br>\n *      Triggered before a document will be rendered. The listener receives an instance of\n *      {@link PageEvent}.\n *\n *    * {@link Renderer.EVENT_END_PAGE}<br>\n *      Triggered after a document has been rendered, just before it is written to disc. The\n *      listener receives an instance of {@link PageEvent}.\n *\n *  * {@link Renderer.EVENT_END}<br>\n *    Triggered after the renderer has written all documents. The listener receives\n *    an instance of {@link RendererEvent}.\n *\n * * {@link Renderer.EVENT_PREPARE_INDEX}<br>\n *    Triggered when the JavascriptIndexPlugin is preparing the search index. Listeners receive\n *    an instance of {@link IndexEvent}.\n *\n * @summary Writes HTML output from TypeDoc's models\n * @group None\n */\nexport class Renderer extends AbstractComponent<Application, RendererEvents> {\n    private routers = new Map<string, new (app: Application) => Router>([\n        [\"kind\", KindRouter],\n        [\"structure\", StructureRouter],\n        [\"kind-dir\", KindDirRouter],\n        [\"structure-dir\", StructureDirRouter],\n        [\"group\", GroupRouter],\n        [\"category\", CategoryRouter],\n    ]);\n\n    private themes = new Map<string, new (renderer: Renderer) => Theme>([\n        [\"default\", DefaultTheme],\n    ]);\n\n    /** @event */\n    static readonly EVENT_BEGIN_PAGE = PageEvent.BEGIN;\n    /** @event */\n    static readonly EVENT_END_PAGE = PageEvent.END;\n    /** @event */\n    static readonly EVENT_BEGIN = RendererEvent.BEGIN;\n    /** @event */\n    static readonly EVENT_END = RendererEvent.END;\n\n    /** @event */\n    static readonly EVENT_PREPARE_INDEX = IndexEvent.PREPARE_INDEX;\n\n    /**\n     * A list of async jobs which must be completed *before* rendering output.\n     * They will be called after {@link RendererEvent.BEGIN} has fired, but before any files have been written.\n     *\n     * This may be used by plugins to register work that must be done to prepare output files. For example: asynchronously\n     * transform markdown to HTML.\n     *\n     * Note: This array is cleared after calling the contained functions on each {@link Renderer.render} call.\n     */\n    preRenderAsyncJobs: Array<(output: RendererEvent) => Promise<void>> = [];\n\n    /**\n     * A list of async jobs which must be completed after rendering output files but before generation is considered successful.\n     * These functions will be called after all documents have been written to the filesystem.\n     *\n     * This may be used by plugins to register work that must be done to finalize output files. For example: asynchronously\n     * generating an image referenced in a render hook.\n     *\n     * Note: This array is cleared after calling the contained functions on each {@link Renderer.render} call.\n     */\n    postRenderAsyncJobs: Array<(output: RendererEvent) => Promise<void>> = [];\n\n    /**\n     * The theme that is used to render the documentation.\n     */\n    theme?: Theme;\n\n    /**\n     * The router which is used to determine the pages to render and\n     * how to link between pages.\n     */\n    router?: Router;\n\n    /**\n     * Hooks which will be called when rendering pages.\n     * Note:\n     * - Hooks added during output will be discarded at the end of rendering.\n     * - Hooks added during a page render will be discarded at the end of that page's render.\n     *\n     * See {@link RendererHooks} for a description of each available hook, and when it will be called.\n     */\n    hooks = new EventHooks<RendererHooks, JSX.Element>();\n\n    /** @internal */\n    @Option(\"theme\")\n    private accessor themeName!: string;\n\n    /** @internal */\n    @Option(\"router\")\n    private accessor routerName!: string;\n\n    @Option(\"cleanOutputDir\")\n    private accessor cleanOutputDir!: boolean;\n\n    @Option(\"cname\")\n    private accessor cname!: string;\n\n    @Option(\"githubPages\")\n    private accessor githubPages!: boolean;\n\n    /** @internal */\n    @Option(\"cacheBust\")\n    accessor cacheBust!: boolean;\n\n    @Option(\"pretty\")\n    private accessor pretty!: boolean;\n\n    renderStartTime = -1;\n\n    markedPlugin: MarkedPlugin;\n\n    constructor(owner: Application) {\n        super(owner);\n\n        this.markedPlugin = new MarkedPlugin(this);\n        new AssetsPlugin(this);\n        new IconsPlugin(this);\n        new HierarchyPlugin(this);\n        new JavascriptIndexPlugin(this);\n        new NavigationPlugin(this);\n        new SitemapPlugin(this);\n    }\n\n    /**\n     * Define a new theme that can be used to render output.\n     * This API will likely be changing at some point, to allow more easily overriding parts of the theme without\n     * requiring additional boilerplate.\n     * @param name\n     * @param theme\n     */\n    defineTheme(name: string, theme: new (renderer: Renderer) => Theme) {\n        if (this.themes.has(name)) {\n            throw new Error(`The theme \"${name}\" has already been defined.`);\n        }\n        this.themes.set(name, theme);\n    }\n\n    /** @internal intended for test usage only */\n    removeTheme(name: string) {\n        this.themes.delete(name);\n    }\n\n    /**\n     * Define a new router that can be used to determine the output structure.\n     * @param name\n     * @param router\n     */\n    defineRouter(name: string, router: new (app: Application) => Router) {\n        if (this.routers.has(name)) {\n            throw new Error(`The router \"${name}\" has already been defined.`);\n        }\n        this.routers.set(name, router);\n    }\n\n    /** @internal intended for test usage only */\n    removeRouter(name: string) {\n        this.routers.delete(name);\n    }\n\n    /**\n     * Render the given project reflection to the specified output directory.\n     *\n     * @param project  The project that should be rendered.\n     * @param outputDirectory  The path of the directory the documentation should be rendered to.\n     */\n    async render(\n        project: ProjectReflection,\n        outputDirectory: string,\n    ): Promise<void> {\n        JSX.setRenderSettings({ pretty: this.pretty });\n\n        const momento = this.hooks.saveMomento();\n        this.renderStartTime = Date.now();\n\n        if (\n            !this.prepareRouter() ||\n            !this.prepareTheme() ||\n            !(await this.prepareOutputDirectory(outputDirectory))\n        ) {\n            return;\n        }\n\n        const pages = this.router!.buildPages(project);\n\n        const output = new RendererEvent(outputDirectory, project, pages);\n        this.trigger(RendererEvent.BEGIN, output);\n        await this.runPreRenderJobs(output);\n\n        this.application.logger.verbose(\n            `There are ${pages.length} pages to write.`,\n        );\n        for (const page of pages) {\n            this.renderDocument(outputDirectory, page, project);\n        }\n\n        this.postRenderAsyncJobs.push(async o => await this.theme!.postRender(o));\n        await Promise.all(this.postRenderAsyncJobs.map((job) => job(output)));\n        this.postRenderAsyncJobs = [];\n\n        this.trigger(RendererEvent.END, output);\n\n        this.theme = void 0;\n        this.router = void 0;\n        this.hooks.restoreMomento(momento);\n    }\n\n    private async runPreRenderJobs(output: RendererEvent) {\n        const start = Date.now();\n\n        this.preRenderAsyncJobs.push(async o => await this.theme!.preRender(o));\n        await Promise.all(this.preRenderAsyncJobs.map((job) => job(output)));\n        this.preRenderAsyncJobs = [];\n\n        this.application.logger.verbose(\n            `Pre render async jobs took ${Date.now() - start}ms`,\n        );\n    }\n\n    /**\n     * Render a single page.\n     *\n     * @param page An event describing the current page.\n     * @return TRUE if the page has been saved to disc, otherwise FALSE.\n     */\n    private renderDocument(outputDirectory: string, page: PageDefinition, project: ProjectReflection) {\n        const momento = this.hooks.saveMomento();\n\n        const event = new PageEvent(page.model);\n        event.url = page.url;\n        event.filename = path.join(outputDirectory, page.url);\n        event.pageKind = page.kind;\n        event.project = project;\n\n        this.trigger(PageEvent.BEGIN, event);\n\n        event.contents = this.theme!.render(event);\n\n        this.trigger(PageEvent.END, event);\n        this.hooks.restoreMomento(momento);\n\n        try {\n            writeFileSync(event.filename, event.contents);\n        } catch (error) {\n            this.application.logger.error(\n                i18n.could_not_write_0(event.filename),\n            );\n        }\n    }\n\n    private prepareRouter(): boolean {\n        if (!this.theme) {\n            const ctor = this.routers.get(this.routerName);\n            if (!ctor) {\n                this.application.logger.error(\n                    i18n.router_0_is_not_defined_available_are_1(\n                        this.routerName,\n                        [...this.routers.keys()].join(\", \"),\n                    ),\n                );\n                return false;\n            } else {\n                this.router = new ctor(this.application);\n            }\n        }\n\n        return true;\n    }\n\n    private prepareTheme(): boolean {\n        if (!this.theme) {\n            const ctor = this.themes.get(this.themeName);\n            if (!ctor) {\n                this.application.logger.error(\n                    i18n.theme_0_is_not_defined_available_are_1(\n                        this.themeName,\n                        [...this.themes.keys()].join(\", \"),\n                    ),\n                );\n                return false;\n            } else {\n                this.theme = new ctor(this);\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Prepare the output directory. If the directory does not exist, it will be\n     * created. If the directory exists, it will be emptied.\n     *\n     * @param directory  The path to the directory that should be prepared.\n     * @returns TRUE if the directory could be prepared, otherwise FALSE.\n     */\n    private async prepareOutputDirectory(directory: string): Promise<boolean> {\n        if (this.cleanOutputDir) {\n            try {\n                await fs.promises.rm(directory, {\n                    recursive: true,\n                    force: true,\n                });\n            } catch (error) {\n                this.application.logger.warn(\n                    i18n.could_not_empty_output_directory_0(\n                        directory,\n                    ),\n                );\n                return false;\n            }\n        }\n\n        try {\n            fs.mkdirSync(directory, { recursive: true });\n        } catch (error) {\n            this.application.logger.error(\n                i18n.could_not_create_output_directory_0(\n                    directory,\n                ),\n            );\n            return false;\n        }\n\n        if (this.githubPages) {\n            try {\n                const text = \"TypeDoc added this file to prevent GitHub Pages from \" +\n                    \"using Jekyll. You can turn off this behavior by setting \" +\n                    \"the `githubPages` option to false.\";\n\n                fs.writeFileSync(path.join(directory, \".nojekyll\"), text);\n            } catch (error) {\n                this.application.logger.warn(\n                    i18n.could_not_write_0(\n                        path.join(directory, \".nojekyll\"),\n                    ),\n                );\n                return false;\n            }\n        }\n\n        if (this.cname) {\n            fs.writeFileSync(path.join(directory, \"CNAME\"), this.cname);\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/lib/output/router.ts",
    "content": "import type { Application } from \"../application.js\";\nimport { CategoryPlugin } from \"../converter/plugins/CategoryPlugin.js\";\nimport { GroupPlugin } from \"../converter/plugins/GroupPlugin.js\";\nimport { type DeclarationReflection, ProjectReflection, Reflection, ReflectionKind } from \"../models/index.js\";\nimport { createNormalizedUrl } from \"#node-utils\";\nimport { Option, type TypeDocOptionMap } from \"../utils/index.js\";\nimport { Slugger } from \"./themes/default/Slugger.js\";\nimport { getHierarchyRoots } from \"./themes/lib.js\";\n\n/**\n * The type of page which should be rendered. This may be extended in the future.\n *\n * Note: TypeDoc any string may be used as the page kind. TypeDoc defines a few\n * described by this object.\n * @enum\n */\nexport const PageKind = {\n    Index: \"index\",\n    Reflection: \"reflection\",\n    Document: \"document\",\n    Hierarchy: \"hierarchy\",\n} as const;\nexport type PageKind = (typeof PageKind)[keyof typeof PageKind] | string & {};\n\n/**\n * A router target is something that may be linked to within a page. Notably,\n * {@link Reflection} is compatible with this interface. TypeDoc supports non-reflection\n * router targets, but does not currently create any.\n */\nexport type RouterTarget = {\n    name: string;\n    parent: RouterTarget;\n} | Reflection;\n\nexport interface PageDefinition<out Model extends RouterTarget = RouterTarget> {\n    readonly url: string;\n    readonly kind: PageKind;\n    readonly model: Model;\n}\n\nfunction getFullName(target: RouterTarget): string {\n    if (target instanceof ProjectReflection) {\n        return target.name;\n    }\n    const parts: string[] = [target.name];\n    let current: RouterTarget = target;\n    while (!(current instanceof ProjectReflection)) {\n        parts.unshift(current.name);\n        current = current.parent!;\n    }\n    return parts.join(\".\");\n}\n\n/**\n * Interface which routers must conform to.\n */\nexport interface Router {\n    /**\n     * Should return a list of pages which should be rendered.\n     * This will be called once per render.\n     */\n    buildPages(project: ProjectReflection): PageDefinition[];\n\n    /**\n     * Can be used to check if the target can be linked to.\n     */\n    hasUrl(target: RouterTarget): boolean;\n\n    /**\n     * Get a list of all targets which can be linked to.\n     * This is used for creating the search index.\n     */\n    getLinkTargets(): RouterTarget[];\n\n    /**\n     * Gets an anchor for this target within its containing page.\n     * May be undefined if this target owns its own page.\n     */\n    getAnchor(refl: RouterTarget): string | undefined;\n\n    /**\n     * Returns true if the target has its own page, false if embedded within\n     * another page.\n     */\n    hasOwnDocument(refl: RouterTarget): boolean;\n\n    /**\n     * Should return a URL which when clicked on the page containing `from`\n     * takes the user to the page/anchor containing `to`.\n     */\n    relativeUrl(from: RouterTarget, to: RouterTarget): string;\n\n    /**\n     * Should return a URL relative to the project base. This is used for\n     * determining links to items in the assets folder.\n     */\n    baseRelativeUrl(from: RouterTarget, target: string): string;\n\n    /**\n     * Get the full URL to the target. In TypeDoc's default router this\n     * is equivalent to `relativeUrl(project, refl)`, but this might not be\n     * the case for custom routers which place the project somewhere else\n     * besides `index.html`.\n     *\n     * The URL returned by this by the frontend JS when building dynamic URLs\n     * for the search, full hierarchy, and navigation components.\n     */\n    getFullUrl(refl: RouterTarget): string;\n\n    /**\n     * Responsible for getting a slugger for the given target. If a\n     * target is not associated with a page, the slugger for the parent\n     * target should be returned instead.\n     */\n    getSlugger(reflection: RouterTarget): Slugger;\n}\n\n/**\n * Base router class intended to make it easier to implement a router.\n *\n * Child classes need only {@link getIdealBaseName}, this class will take care\n * of the recursing through child reflections.\n * @group Routers\n */\nexport abstract class BaseRouter implements Router {\n    extension = \".html\";\n\n    // Note: This will always contain lowercased names to avoid issues with\n    // case-insensitive file systems.\n    protected usedFileNames = new Set<string>();\n    protected sluggers = new Map<RouterTarget, Slugger>();\n    protected fullUrls = new Map<RouterTarget, string>();\n    protected anchors = new Map<RouterTarget, string>();\n\n    @Option(\"sluggerConfiguration\")\n    protected accessor sluggerConfiguration!: TypeDocOptionMap[\"sluggerConfiguration\"];\n\n    @Option(\"includeHierarchySummary\")\n    protected accessor includeHierarchySummary!: boolean;\n\n    constructor(readonly application: Application) {}\n\n    /**\n     * Should return the base-relative desired file name for a router target.\n     * This name may not be used exactly as TypeDoc will detect conflicts\n     * and automatically introduce a unique identifier to the URL to resolve\n     * them.\n     */\n    protected abstract getIdealBaseName(reflection: RouterTarget): string;\n\n    buildPages(project: ProjectReflection): PageDefinition[] {\n        this.usedFileNames = new Set();\n        this.sluggers = new Map([\n            [project, new Slugger(this.sluggerConfiguration)],\n        ]);\n\n        const pages: PageDefinition[] = [];\n\n        if (project.readme?.length) {\n            pages.push({\n                url: this.getFileName(\"index\"),\n                kind: PageKind.Index,\n                model: project,\n            });\n            pages.push({\n                url: this.getFileName(\"modules\"),\n                kind: PageKind.Reflection,\n                model: project,\n            });\n        } else {\n            pages.push({\n                url: this.getFileName(\"index\"),\n                kind: PageKind.Reflection,\n                model: project,\n            });\n        }\n\n        this.fullUrls.set(project, pages[pages.length - 1].url);\n\n        if (this.includeHierarchySummary && getHierarchyRoots(project)) {\n            pages.push({\n                url: this.getFileName(\"hierarchy\"),\n                kind: PageKind.Hierarchy,\n                model: project,\n            });\n        }\n\n        for (const child of project.childrenIncludingDocuments || []) {\n            this.buildChildPages(child, pages);\n        }\n\n        return pages;\n    }\n\n    hasUrl(target: RouterTarget): boolean {\n        return this.fullUrls.has(target);\n    }\n\n    getLinkTargets(): RouterTarget[] {\n        return Array.from(this.fullUrls.keys());\n    }\n\n    getAnchor(target: RouterTarget): string | undefined {\n        if (!this.anchors.has(target)) {\n            this.application.logger.verbose(\n                `${getFullName(target)} does not have an anchor but one was requested, this is a bug in the theme`,\n            );\n        }\n        return this.anchors.get(target);\n    }\n\n    hasOwnDocument(target: RouterTarget): boolean {\n        return this.anchors.get(target) === undefined && this.hasUrl(target);\n    }\n\n    relativeUrl(from: RouterTarget, to: RouterTarget): string {\n        let slashes = 0;\n        while (!this.hasOwnDocument(from)) {\n            // We know we must have a parent here as the Project is the only\n            // root level element without a parent, and the project always has\n            // an own document.\n            from = from.parent as RouterTarget;\n        }\n\n        let toPage = to;\n        while (!this.hasOwnDocument(toPage)) {\n            toPage = toPage.parent as RouterTarget;\n        }\n\n        // We unfortunately have to special case ProjectReflection as it is\n        // the model used twice for rendering. This should be changed in a\n        // future version to remove this hackery.\n        if (from === toPage && !(to instanceof ProjectReflection)) {\n            return to === toPage ? \"\" : `#${this.getAnchor(to)}`;\n        }\n\n        const fromUrl = this.getFullUrl(from);\n        const toUrl = this.getFullUrl(to);\n        let equal = true;\n        let start = 0;\n\n        for (let i = 0; i < fromUrl.length; ++i) {\n            equal = equal && fromUrl[i] === toUrl[i];\n            if (fromUrl[i] === \"/\") {\n                if (equal) {\n                    start = i + 1;\n                } else {\n                    ++slashes;\n                }\n            }\n        }\n\n        // If equal is still set, we're going to a page either in\n        // the same directory as this page, or a lower directory,\n        // don't bother going up directories just to come back down.\n        if (equal) {\n            return toUrl.substring(start);\n        }\n\n        // Otherwise, go up until we get to the common directory\n        // and then back down to the target path.\n        return \"../\".repeat(slashes) + toUrl.substring(start);\n    }\n\n    baseRelativeUrl(from: RouterTarget, target: string): string {\n        let slashes = 0;\n        const full = this.getFullUrl(from);\n        for (let i = 0; i < full.length; ++i) {\n            if (full[i] === \"/\") ++slashes;\n        }\n\n        // #2910 avoid urls like \".././\"\n        if (target == \"./\" && slashes !== 0) {\n            return \"../\".repeat(slashes);\n        }\n\n        return \"../\".repeat(slashes) + target;\n    }\n\n    getFullUrl(target: RouterTarget): string {\n        const url = this.fullUrls.get(target);\n        if (!url) {\n            throw new Error(\n                `Tried to get a URL of a router target ${getFullName(target)} which did not receive a URL`,\n            );\n        }\n\n        return url;\n    }\n\n    getSlugger(target: RouterTarget): Slugger {\n        if (this.sluggers.has(target)) {\n            return this.sluggers.get(target)!;\n        }\n        // A slugger should always be defined at least for the project\n        return this.getSlugger(target.parent as RouterTarget);\n    }\n\n    /**\n     * Should the page kind to use if a reflection should have its own rendered\n     * page in the output. Note that once `undefined` is returned, children of\n     * that reflection will not have their own document.\n     */\n    protected getPageKind(target: RouterTarget): PageKind | undefined {\n        if (!(target instanceof Reflection)) {\n            return undefined;\n        }\n\n        const pageReflectionKinds = ReflectionKind.Class |\n            ReflectionKind.Interface |\n            ReflectionKind.Enum |\n            ReflectionKind.Module |\n            ReflectionKind.Namespace |\n            ReflectionKind.TypeAlias |\n            ReflectionKind.Function |\n            ReflectionKind.Variable;\n        const documentReflectionKinds = ReflectionKind.Document;\n\n        if (target.kindOf(pageReflectionKinds)) {\n            return PageKind.Reflection;\n        }\n\n        if (target.kindOf(documentReflectionKinds)) {\n            return PageKind.Document;\n        }\n    }\n\n    protected buildChildPages(\n        target: RouterTarget,\n        outPages: PageDefinition[],\n    ): void {\n        const kind = this.getPageKind(target);\n        if (kind) {\n            const idealName = this.getIdealBaseName(target);\n            const actualName = this.getFileName(idealName);\n            this.fullUrls.set(target, actualName);\n            this.sluggers.set(\n                target,\n                new Slugger(this.sluggerConfiguration),\n            );\n\n            outPages.push({\n                kind,\n                model: target,\n                url: actualName,\n            });\n\n            if (target instanceof Reflection) {\n                target.traverse((child) => {\n                    this.buildChildPages(child, outPages);\n                    return true;\n                });\n            }\n        } else {\n            this.buildAnchors(target, target.parent!);\n        }\n    }\n\n    protected buildAnchors(\n        target: RouterTarget,\n        pageTarget: RouterTarget,\n    ): void {\n        if (!(target instanceof Reflection) || !(pageTarget instanceof Reflection)) {\n            return;\n        }\n\n        if (\n            !target.isDeclaration() &&\n            !target.isSignature() &&\n            !target.isTypeParameter()\n        ) {\n            return;\n        }\n\n        // We support linking to reflections for types directly contained within an export\n        // but not any deeper. This is because TypeDoc may or may not render the type details\n        // for a property depending on whether or not it is deemed useful, and defining a link\n        // which might not be used may result in a link being generated which isn't valid. #2808.\n        // This should be kept in sync with the renderingChildIsUseful function.\n        if (\n            target.kindOf(ReflectionKind.TypeLiteral) &&\n            (!target.parent?.kindOf(ReflectionKind.SomeExport) ||\n                (target.parent as DeclarationReflection).type?.type !==\n                    \"reflection\")\n        ) {\n            return;\n        }\n\n        if (!target.kindOf(ReflectionKind.TypeLiteral)) {\n            let refl: Reflection | undefined = target;\n            const parts = [refl.name];\n            while (refl.parent && refl.parent !== pageTarget) {\n                refl = refl.parent;\n                // Avoid duplicate names for signatures and useless __type in anchors\n                if (\n                    !refl.kindOf(\n                        ReflectionKind.TypeLiteral |\n                            ReflectionKind.FunctionOrMethod,\n                    )\n                ) {\n                    parts.unshift(refl.name);\n                }\n            }\n\n            const anchor = this.getSlugger(pageTarget).slug(\n                parts.join(\".\"),\n            );\n\n            this.fullUrls.set(\n                target,\n                this.fullUrls.get(pageTarget)! + \"#\" + anchor,\n            );\n            this.anchors.set(target, anchor);\n        }\n\n        target.traverse((child) => {\n            this.buildAnchors(child, pageTarget);\n            return true;\n        });\n    }\n\n    /** Strip non-url safe characters from the specified string. */\n    protected getUrlSafeName(name: string): string {\n        return createNormalizedUrl(name);\n    }\n\n    protected getFileName(baseName: string): string {\n        const lowerBaseName = baseName.toLocaleLowerCase();\n        if (this.usedFileNames.has(lowerBaseName)) {\n            let index = 1;\n            while (this.usedFileNames.has(`${lowerBaseName}-${index}`)) {\n                ++index;\n            }\n\n            this.usedFileNames.add(`${lowerBaseName}-${index}`);\n            return `${baseName}-${index}${this.extension}`;\n        }\n\n        this.usedFileNames.add(lowerBaseName);\n        return `${baseName}${this.extension}`;\n    }\n}\n\n/**\n * Router which places reflections in folders according to their kind.\n * @group Routers\n */\nexport class KindRouter extends BaseRouter {\n    directories = new Map<ReflectionKind, string>([\n        [ReflectionKind.Class, \"classes\"],\n        [ReflectionKind.Interface, \"interfaces\"],\n        [ReflectionKind.Enum, \"enums\"],\n        [ReflectionKind.Namespace, \"modules\"],\n        [ReflectionKind.Module, \"modules\"],\n        [ReflectionKind.TypeAlias, \"types\"],\n        [ReflectionKind.Function, \"functions\"],\n        [ReflectionKind.Variable, \"variables\"],\n        [ReflectionKind.Document, \"documents\"],\n    ]);\n\n    protected override getIdealBaseName(reflection: Reflection): string {\n        const dir = this.directories.get(reflection.kind)!;\n        const parts = [createNormalizedUrl(reflection.name)];\n        while (reflection.parent && !reflection.parent.isProject()) {\n            reflection = reflection.parent;\n            parts.unshift(createNormalizedUrl(reflection.name));\n        }\n\n        const baseName = parts.join(\".\");\n        return `${dir}/${baseName}`;\n    }\n}\n\n/**\n * Router which places reflections in folders according to their kind,\n * but creates each page as `/index.html` to allow for clean URLs.\n * @group Routers\n */\nexport class KindDirRouter extends KindRouter {\n    private fixLink(link: string) {\n        return link.replace(/\\/index\\.html(#|$)/, \"/$1\");\n    }\n\n    protected override buildChildPages(\n        reflection: Reflection,\n        outPages: PageDefinition[],\n    ): void {\n        this.extension = `/index.html`;\n        return super.buildChildPages(reflection, outPages);\n    }\n\n    override getFullUrl(refl: Reflection): string {\n        return this.fixLink(super.getFullUrl(refl));\n    }\n\n    override relativeUrl(from: Reflection, to: Reflection): string {\n        return this.fixLink(super.relativeUrl(from, to));\n    }\n}\n\n/**\n * Router which places reflections in folders according to the module structure.\n * @group Routers\n */\nexport class StructureRouter extends BaseRouter {\n    protected override getIdealBaseName(reflection: Reflection): string {\n        // Special case: Modules allow slashes in their name. We actually want\n        // to allow that here to mirror file structures.\n        const parts = [...reflection.name.split(\"/\").map(createNormalizedUrl)];\n        while (reflection.parent && !reflection.parent.isProject()) {\n            reflection = reflection.parent;\n            parts.unshift(\n                ...reflection.name.split(\"/\").map(createNormalizedUrl),\n            );\n        }\n\n        // This should only happen if someone tries to break things with @module\n        // I don't think it will ever occur in normal usage.\n        if (parts.includes(\"..\")) {\n            throw new Error(\n                \"structure router cannot be used with a project that has a name containing '..'\",\n            );\n        }\n\n        return parts.join(\"/\");\n    }\n}\n\n/**\n * Router which places reflections in folders according to the module structure,\n * but creates each page as `/index.html` to allow for clean URLs.\n * @group Routers\n */\nexport class StructureDirRouter extends StructureRouter {\n    private fixLink(link: string) {\n        return link.replace(/\\/index\\.html(#|$)/, \"/$1\");\n    }\n\n    protected override buildChildPages(\n        reflection: Reflection,\n        outPages: PageDefinition[],\n    ): void {\n        this.extension = `/index.html`;\n        return super.buildChildPages(reflection, outPages);\n    }\n\n    override getFullUrl(refl: Reflection): string {\n        return this.fixLink(super.getFullUrl(refl));\n    }\n\n    override relativeUrl(from: Reflection, to: Reflection): string {\n        return this.fixLink(super.relativeUrl(from, to));\n    }\n}\n\n/**\n * Router which places reflections in folders according to `@group` tags.\n * @group Routers\n */\nexport class GroupRouter extends BaseRouter {\n    @Option(\"groupReferencesByType\")\n    private accessor groupReferencesByType!: boolean;\n\n    private getGroup(reflection: Reflection) {\n        if (reflection.isDeclaration() || reflection.isDocument()) {\n            const group = GroupPlugin.getGroups(\n                reflection,\n                this.groupReferencesByType,\n            );\n\n            return group.values().next().value!;\n        }\n\n        throw new Error(\n            \"Tried to render a non declaration/document to a page, not supported by GroupRouter\",\n        );\n    }\n\n    protected override getIdealBaseName(reflection: Reflection): string {\n        const group = this.getGroup(reflection)\n            .split(\"/\")\n            .map(createNormalizedUrl)\n            .join(\"/\");\n        const parts = [createNormalizedUrl(reflection.name)];\n        while (reflection.parent && !reflection.parent.isProject()) {\n            reflection = reflection.parent;\n            parts.unshift(createNormalizedUrl(reflection.name));\n        }\n\n        const baseName = parts.join(\".\");\n        return `${group}/${baseName}`;\n    }\n}\n\n/**\n * Router which places reflections in folders according to `@category` tags.\n * @group Routers\n */\nexport class CategoryRouter extends BaseRouter {\n    @Option(\"defaultCategory\")\n    private accessor defaultCategory!: string;\n\n    private getCategory(reflection: Reflection) {\n        if (reflection.isDeclaration() || reflection.isDocument()) {\n            const cats = CategoryPlugin.getCategories(reflection);\n            return cats.size\n                ? cats.values().next().value!\n                : this.defaultCategory;\n        }\n\n        throw new Error(\n            \"Tried to render a non declaration/document to a page, not supported by GroupRouter\",\n        );\n    }\n\n    protected override getIdealBaseName(reflection: Reflection): string {\n        const cat = this.getCategory(reflection)\n            .split(\"/\")\n            .map(createNormalizedUrl)\n            .join(\"/\");\n        const parts = [createNormalizedUrl(reflection.name)];\n        while (reflection.parent && !reflection.parent.isProject()) {\n            reflection = reflection.parent;\n            parts.unshift(createNormalizedUrl(reflection.name));\n        }\n\n        const baseName = parts.join(\".\");\n        return `${cat}/${baseName}`;\n    }\n}\n"
  },
  {
    "path": "src/lib/output/theme.ts",
    "content": "import type { Renderer } from \"./renderer.js\";\nimport { RendererComponent } from \"./components.js\";\nimport type { PageEvent, RendererEvent } from \"./events.js\";\n\n/**\n * Base class of all themes.\n *\n * The theme class determines how a page is rendered. It is loosely coupled with a router\n * class instance which is also created by the {@link Renderer} class.\n */\nexport abstract class Theme extends RendererComponent {\n    /**\n     * Renders the provided page to a string, which will be written to disk by the {@link Renderer}\n     */\n    abstract render(event: PageEvent): string;\n\n    /**\n     * Optional hook to call pre-render jobs\n     */\n    async preRender(_event: RendererEvent): Promise<void> {}\n\n    /**\n     * Optional hook to call post-render jobs\n     */\n    async postRender(_event: RendererEvent): Promise<void> {}\n}\n"
  },
  {
    "path": "src/lib/output/themes/MarkedPlugin.tsx",
    "content": "import MarkdownIt from \"markdown-it\";\n// @types/markdown-it is busted, this type isn't exported with ESM.\nimport type md from \"markdown-it\" with { \"resolution-mode\": \"require\" };\n\nimport { ContextAwareRendererComponent } from \"../components.js\";\nimport { MarkdownEvent, type PageEvent, RendererEvent } from \"../events.js\";\nimport { Option, type ValidationOptions } from \"../../utils/index.js\";\nimport { highlight, isLoadedLanguage, isSupportedLanguage } from \"../../utils/highlighter.js\";\nimport type { BundledTheme } from \"@gerrit0/mini-shiki\";\nimport { assertNever, escapeHtml, i18n, JSX, type TranslatedString } from \"#utils\";\nimport type { DefaultThemeRenderContext, Renderer } from \"../index.js\";\nimport { anchorIcon } from \"./default/partials/anchor-icon.js\";\nimport {\n    type CommentDisplayPart,\n    Reflection,\n    ReflectionKind,\n    type RelativeLinkDisplayPart,\n} from \"../../models/index.js\";\nimport type { RouterTarget } from \"../router.js\";\n\ntype Namable = { name: string; parent?: Namable };\nfunction getFriendlyFullName(target: Namable): string {\n    if (target instanceof Reflection) {\n        return target.getFriendlyFullName();\n    }\n\n    if (target.parent) {\n        return target.name;\n    }\n    const parts: string[] = [target.name];\n    let current: Namable = target;\n    while (current.parent) {\n        parts.unshift(current.name);\n        current = current.parent!;\n    }\n    return parts.join(\".\");\n}\n\n/**\n * Implements markdown and relativeURL helpers for templates.\n * @internal\n */\nexport class MarkedPlugin extends ContextAwareRendererComponent {\n    @Option(\"lightHighlightTheme\")\n    accessor lightTheme!: BundledTheme;\n\n    @Option(\"darkHighlightTheme\")\n    accessor darkTheme!: BundledTheme;\n\n    @Option(\"markdownItOptions\")\n    accessor markdownItOptions!: Record<string, unknown>;\n\n    @Option(\"markdownLinkExternal\")\n    accessor markdownLinkExternal!: boolean;\n\n    @Option(\"validation\")\n    accessor validation!: ValidationOptions;\n\n    private parser?: MarkdownIt;\n\n    private renderedRelativeLinks: {\n        source: RouterTarget;\n        target: RouterTarget;\n        link: RelativeLinkDisplayPart;\n    }[] = [];\n\n    /**\n     * This needing to be here really feels hacky... probably some nicer way to do this.\n     * Revisit in 0.28.\n     */\n    private renderContext: DefaultThemeRenderContext = null!;\n    private lastHeaderSlug = \"\";\n\n    constructor(owner: Renderer) {\n        super(owner);\n        this.owner.on(MarkdownEvent.PARSE, this.onParseMarkdown.bind(this));\n        this.owner.on(RendererEvent.END, this.onEnd.bind(this));\n    }\n\n    /**\n     * Highlight the syntax of the given text using Shiki.\n     *\n     * @param text  The text that should be highlighted.\n     * @param lang  The language that should be used to highlight the string.\n     * @return A html string with syntax highlighting.\n     */\n    public getHighlighted(text: string, lang?: string): string {\n        lang = lang || \"typescript\";\n        lang = lang.toLowerCase();\n        if (!isLoadedLanguage(lang)) {\n            if (isSupportedLanguage(lang)) {\n                this.application.logger.warn(\n                    i18n.unloaded_language_0_not_highlighted_in_comment_for_1(\n                        lang,\n                        getFriendlyFullName(this.page?.model || { name: \"(unknown)\" }),\n                    ),\n                );\n            } else {\n                this.application.logger.warn(\n                    i18n.unsupported_highlight_language_0_not_highlighted_in_comment_for_1(\n                        lang,\n                        getFriendlyFullName(this.page?.model || { name: \"(unknown)\" }),\n                    ),\n                );\n            }\n            return text;\n        }\n\n        return highlight(text, lang);\n    }\n\n    /**\n     * Parse the given markdown string and return the resulting html.\n     *\n     * @param input  The markdown string that should be parsed.\n     * @returns The resulting html string.\n     */\n    public parseMarkdown(\n        input: string | readonly CommentDisplayPart[],\n        page: PageEvent<any>,\n        context: DefaultThemeRenderContext,\n    ) {\n        let markdown = input;\n        if (typeof markdown !== \"string\") {\n            markdown = this.displayPartsToMarkdown(page, context, markdown);\n        }\n\n        this.renderContext = context;\n        const event = new MarkdownEvent(page, markdown, markdown);\n\n        this.owner.trigger(MarkdownEvent.PARSE, event);\n        this.renderContext = null!;\n        return event.parsedText;\n    }\n\n    private displayPartsToMarkdown(\n        page: PageEvent<Reflection>,\n        context: DefaultThemeRenderContext,\n        parts: readonly CommentDisplayPart[],\n    ): string {\n        const useHtml = !!this.markdownItOptions[\"html\"];\n        const result: string[] = [];\n\n        for (const part of parts) {\n            switch (part.kind) {\n                case \"text\":\n                case \"code\":\n                    result.push(part.text);\n                    break;\n                case \"inline-tag\":\n                    switch (part.tag) {\n                        case \"@label\":\n                        case \"@inheritdoc\": // Shouldn't happen\n                            break; // Not rendered.\n                        case \"@link\":\n                        case \"@linkcode\":\n                        case \"@linkplain\": {\n                            if (part.target) {\n                                let url: string | undefined;\n                                let kindClass: string | undefined;\n                                if (typeof part.target === \"string\") {\n                                    url = part.target === \"#\" ? undefined : part.target;\n                                } else if (\"id\" in part.target) {\n                                    // No point in trying to resolve a ReflectionSymbolId at this point, we've already\n                                    // tried and failed during the resolution step. Warnings related to those broken links\n                                    // have already been emitted.\n                                    kindClass = ReflectionKind.classString(part.target.kind);\n                                    if (context.router.hasUrl(part.target)) {\n                                        url = context.urlTo(part.target);\n                                    }\n\n                                    // If we don't have a URL the user probably linked to some deeply nested property\n                                    // which doesn't get an assigned URL. We'll walk upwards until we find a reflection\n                                    // which has a URL and link to that instead.\n                                    if (typeof url === \"undefined\") {\n                                        // Walk upwards to find something we can link to.\n                                        let target = part.target.parent!;\n                                        while (!context.router.hasUrl(target)) {\n                                            target = target.parent!;\n                                        }\n\n                                        // We know we'll always end up with a URL here eventually as the\n                                        // project always has a URL.\n                                        url = context.urlTo(target);\n\n                                        if (this.validation.rewrittenLink) {\n                                            this.application.logger.warn(\n                                                i18n\n                                                    .reflection_0_links_to_1_with_text_2_but_resolved_to_3(\n                                                        page.model.getFriendlyFullName(),\n                                                        part.target.getFriendlyFullName(),\n                                                        part.text,\n                                                        target.getFriendlyFullName(),\n                                                    ),\n                                            );\n                                        }\n                                    }\n\n                                    // If the url goes to this page, render as `#`\n                                    // to go to the top of the page.\n                                    if (url == \"\") {\n                                        url = \"#\";\n                                    }\n                                }\n\n                                if (useHtml) {\n                                    const text = part.tag === \"@linkcode\" ? `<code>${part.text}</code>` : part.text;\n                                    result.push(\n                                        url\n                                            ? `<a href=\"${url}\"${kindClass ? ` class=\"${kindClass}\"` : \"\"}>${text}</a>`\n                                            : part.text,\n                                    );\n                                } else {\n                                    const text = part.tag === \"@linkcode\" ? \"`\" + part.text + \"`\" : part.text;\n                                    result.push(url ? `[${text}](${url})` : text);\n                                }\n                            } else {\n                                result.push(part.text);\n                            }\n                            break;\n                        }\n                        default:\n                            // Hmm... probably want to be able to render these somehow, so custom inline tags can be given\n                            // special rendering rules. Future capability. For now, just render their text.\n                            result.push(`{${part.tag} ${part.text}}`);\n                            break;\n                    }\n                    break;\n                case \"relative-link\":\n                    switch (typeof part.target) {\n                        case \"number\": {\n                            const refl = page.project.files.resolve(part.target, page.model.project);\n                            let url: string | undefined;\n                            if (typeof refl === \"object\") {\n                                // #3006, this is an unfortunate heuristic. If there is a relative link to the project\n                                // the user probably created it by linking to the directory of the project or to\n                                // the project's readme. Since the readme doesn't get its own reflection, we can't\n                                // reliably disambiguate this and instead will arbitrarily decide to reference the\n                                // root index page in this case.\n                                if (refl.isProject()) {\n                                    url = context.relativeURL(\"./\");\n                                } else {\n                                    url = context.urlTo(refl);\n                                }\n                            } else {\n                                const fileName = page.project.files.getName(part.target);\n                                if (fileName) {\n                                    url = context.relativeURL(`media/${fileName}`);\n                                }\n                            }\n\n                            if (typeof url !== \"undefined\") {\n                                if (part.targetAnchor) {\n                                    url += \"#\" + part.targetAnchor;\n\n                                    if (typeof refl === \"object\") {\n                                        this.renderedRelativeLinks.push({\n                                            source: this.page!.model,\n                                            target: refl,\n                                            link: part,\n                                        });\n                                    }\n                                }\n                                result.push(url);\n                                break;\n                            }\n                        }\n                        // fall through\n                        case \"undefined\":\n                            result.push(part.text);\n                            break;\n                    }\n                    break;\n                default:\n                    assertNever(part);\n            }\n        }\n\n        return result.join(\"\");\n    }\n\n    private onEnd() {\n        for (const { source, target, link } of this.renderedRelativeLinks) {\n            const slugger = this.owner.router!.getSlugger(target);\n            if (!slugger.hasAnchor(link.targetAnchor!)) {\n                this.application.logger.warn(\n                    i18n.reflection_0_links_to_1_but_anchor_does_not_exist_try_2(\n                        getFriendlyFullName(source),\n                        link.text,\n                        slugger\n                            .getSimilarAnchors(link.targetAnchor!)\n                            .map((a) => link.text.replace(/#.*/, \"#\" + a))\n                            .join(\"\\n\\t\"),\n                    ),\n                );\n            }\n        }\n\n        // In case we're in watch mode\n        this.renderedRelativeLinks = [];\n    }\n\n    /**\n     * Triggered before the renderer starts rendering a project.\n     *\n     * @param event  An event object describing the current render operation.\n     */\n    protected override onBeginRenderer(event: RendererEvent) {\n        super.onBeginRenderer(event);\n        this.setupParser();\n    }\n\n    private getSlugger() {\n        return this.owner.router!.getSlugger(this.page!.model);\n    }\n\n    /**\n     * Creates an object with options that are passed to the markdown parser.\n     *\n     * @returns The options object for the markdown parser.\n     */\n    private setupParser() {\n        this.parser = MarkdownIt({\n            ...this.markdownItOptions,\n            highlight: (code, lang) => {\n                code = this.getHighlighted(code, lang || \"ts\");\n                code = code.replace(/\\n$/, \"\") + \"\\n\";\n\n                if (!lang) {\n                    return `<pre><code>${code}</code><button>${i18n.theme_copy()}</button></pre>\\n`;\n                }\n\n                return `<pre><code class=\"${\n                    escapeHtml(lang)\n                }\">${code}</code><button type=\"button\">${i18n.theme_copy()}</button></pre>\\n`;\n            },\n        });\n\n        githubAlertMarkdownPlugin(this.parser);\n\n        const loader = this.application.options.getValue(\"markdownItLoader\");\n        loader(this.parser);\n\n        function defaultRender(\n            tokens: md.Token[],\n            idx: number,\n            options: md.Options,\n            _env: any,\n            self: md.Renderer,\n        ): string {\n            return self.renderToken(tokens, idx, options);\n        }\n\n        // Add anchor links for headings in readme, and add them to the \"On this page\" section\n        const headingOpenRenderer = this.parser.renderer.rules[\"heading_open\"] || defaultRender;\n        this.parser.renderer.rules[\"heading_open\"] = (tokens, idx, options, env, self) => {\n            const token = tokens[idx];\n            const content = getTokenTextContent(tokens[idx + 1]);\n            const level = token.markup.length;\n\n            const slug = this.getSlugger().slug(content);\n            this.lastHeaderSlug = slug;\n\n            this.page!.pageHeadings.push({\n                link: `#${slug}`,\n                text: content,\n                level,\n            });\n\n            token.attrSet(\"id\", slug);\n            token.attrSet(\"class\", \"tsd-anchor-link\");\n\n            return headingOpenRenderer(tokens, idx, options, env, self);\n        };\n\n        const headingCloseRenderer = this.parser.renderer.rules[\"heading_close\"] || defaultRender;\n        this.parser.renderer.rules[\"heading_close\"] = (...args) => {\n            return `${JSX.renderElement(anchorIcon(this.renderContext, this.lastHeaderSlug))}${\n                headingCloseRenderer(...args)\n            }`;\n        };\n\n        const linkOpenRenderer = this.parser.renderer.rules[\"link_open\"] || defaultRender;\n        this.parser.renderer.rules[\"link_open\"] = (tokens, idx, options, env, self) => {\n            const token = tokens[idx];\n            const href = token.attrGet(\"href\");\n            if (href) {\n                // Note: This doesn't catch @link tags to reflections as those\n                // will be relative links. This will likely have to change with\n                // the introduction of support for customized routers whenever\n                // that becomes a real thing.\n                if (\n                    this.markdownLinkExternal &&\n                    /^https?:\\/\\//i.test(href) &&\n                    !(href + \"/\").startsWith(this.hostedBaseUrl)\n                ) {\n                    token.attrSet(\"target\", \"_blank\");\n                    const classes = token.attrGet(\"class\")?.split(\" \") || [];\n                    classes.push(\"external\");\n                    token.attrSet(\"class\", classes.join(\" \"));\n                }\n\n                token.attrSet(\"href\", href);\n            }\n\n            return linkOpenRenderer(tokens, idx, options, env, self);\n        };\n\n        // Don't need custom rendering here as this is a TypeDoc-provided rule name\n        this.parser.renderer.rules[\"alert_open\"] = (tokens, idx) => {\n            const icon = this.renderContext.icons[tokens[idx].attrGet(\"icon\") as AlertIconName];\n            const iconHtml = JSX.renderElement(icon());\n\n            return `<div class=\"${tokens[idx].attrGet(\"class\")}\"><div class=\"tsd-alert-title\">${iconHtml}<span>${\n                tokens[idx].attrGet(\"alert\")\n            }</span></div>`;\n        };\n    }\n\n    /**\n     * Triggered when {@link MarkedPlugin} parses a markdown string.\n     *\n     * @param event\n     */\n    onParseMarkdown(event: MarkdownEvent) {\n        event.parsedText = this.parser!.render(event.parsedText);\n    }\n}\n\nfunction getTokenTextContent(token: md.Token): string {\n    // If there are children, we want their text content, not the full text content\n    if (token.children) {\n        return token.children.map(getTokenTextContent).join(\"\");\n    }\n\n    // If this is a simple text fragment, use its content\n    if (token.type === \"text\") {\n        return token.content;\n    }\n\n    // Otherwise this is some type of metadata token (e.g. header_open)\n    // or a HTML tag token. Don't include it in the text content.\n    return \"\";\n}\n\nconst kindNames = [\"note\", \"tip\", \"important\", \"warning\", \"caution\"];\nconst iconNames = [\"alertNote\", \"alertTip\", \"alertImportant\", \"alertWarning\", \"alertCaution\"] as const;\ntype AlertIconName = (typeof iconNames)[number];\nconst kindTranslations: Array<() => TranslatedString> = [\n    () => i18n.alert_note(),\n    () => i18n.alert_tip(),\n    () => i18n.alert_important(),\n    () => i18n.alert_warning(),\n    () => i18n.alert_caution(),\n];\n\nfunction githubAlertMarkdownPlugin(md: MarkdownIt) {\n    md.core.ruler.after(\"block\", \"typedoc-github-alert-plugin\", (state) => {\n        const bqStarts: number[] = [];\n\n        for (let i = 0; i < state.tokens.length; ++i) {\n            const token = state.tokens[i];\n            if (token.type === \"blockquote_open\") {\n                bqStarts.push(i);\n            } else if (token.type === \"blockquote_close\") {\n                if (bqStarts.length === 1) {\n                    checkForAlert(state.tokens, bqStarts[0], i);\n                }\n                bqStarts.pop();\n            }\n        }\n    });\n}\n\nfunction checkForAlert(tokens: md.Token[], start: number, end: number) {\n    let alertKind = -1;\n\n    // Search for the first \"inline\" token. That will be the blockquote text.\n    for (let i = start; i < end; ++i) {\n        if (tokens[i].type === \"inline\") {\n            // Check for `[!NOTE]`\n            const kindString = tokens[i].content.match(/^\\[!(\\w+)\\]/);\n            const kindIndex = kindNames.indexOf(kindString?.[1].toLowerCase() || \"\");\n            if (kindIndex !== -1) {\n                tokens[i].content = tokens[i].content.substring(kindString![0].length);\n                alertKind = kindIndex;\n            }\n            break;\n        }\n    }\n\n    // If we found an alert, then replace the blockquote_open and blockquote_close tokens with\n    // alert_open and alert_close tokens that can be rendered specially.\n    if (alertKind === -1) return;\n\n    tokens[start].type = \"alert_open\";\n    tokens[start].tag = \"div\";\n    tokens[start].attrPush([\"class\", `tsd-alert tsd-alert-${kindNames[alertKind]}`]);\n    tokens[start].attrPush([\"alert\", kindTranslations[alertKind]()]);\n    tokens[start].attrPush([\"icon\", iconNames[alertKind]]);\n\n    tokens[end].type = \"alert_close\";\n    tokens[end].tag = \"div\";\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/DefaultTheme.tsx",
    "content": "import { Theme } from \"../../theme.js\";\nimport type { Renderer } from \"../../renderer.js\";\nimport {\n    type ContainerReflection,\n    type DeclarationReflection,\n    type DocumentReflection,\n    type ProjectReflection,\n    ReferenceReflection,\n    type Reflection,\n    ReflectionCategory,\n    ReflectionGroup,\n    ReflectionKind,\n} from \"../../../models/index.js\";\nimport type { PageEvent, RendererEvent } from \"../../events.js\";\nimport type { MarkedPlugin } from \"../../plugins/index.js\";\nimport { DefaultThemeRenderContext } from \"./DefaultThemeRenderContext.js\";\nimport { getIcons, type Icons } from \"./partials/icon.js\";\nimport { filterMap, JSX, type TagString } from \"#utils\";\nimport { classNames, getDisplayName, toStyleClass } from \"../lib.js\";\nimport { PageKind, type Router } from \"../../router.js\";\nimport { loadHighlighter, Option } from \"#node-utils\";\nimport type { BundledLanguage, BundledTheme as ShikiTheme } from \"@gerrit0/mini-shiki\";\n\nexport interface NavigationElement {\n    text: string;\n    path?: string;\n    kind?: ReflectionKind;\n    class?: string;\n    children?: NavigationElement[];\n    icon?: string | number;\n}\n\n/**\n * @param data the reflection to render\n * @returns either a string to be written to the file, or an element to be serialized and then written.\n */\nexport type RenderTemplate<T> = (data: T) => JSX.Element | string;\n\nexport class DefaultTheme extends Theme {\n    // Note: This will always contain lowercased names to avoid issues with\n    // case-insensitive file systems.\n    usedFileNames = new Set<string>();\n\n    /** @internal */\n    markedPlugin: MarkedPlugin;\n\n    router: Router;\n\n    /**\n     * The icons which will actually be rendered. The source of truth lives on the theme, and\n     * the {@link DefaultThemeRenderContext.icons} member will produce references to these.\n     *\n     * These icons will be written twice. Once to an `icons.svg` file in the assets directory\n     * which will be referenced by icons on the context, and once to an `icons.js` file so that\n     * references to the icons can be dynamically embedded within the page for use by the search\n     * dropdown and when loading the page on `file://` urls.\n     *\n     * Custom themes may overwrite this entire object or individual properties on it to customize\n     * the icons used within the page, however TypeDoc currently assumes that all icons are svg\n     * elements, so custom themes must also use svg elements.\n     */\n    icons: Icons;\n\n    ContextClass = DefaultThemeRenderContext;\n\n    @Option(\"lightHighlightTheme\")\n    private accessor lightTheme!: ShikiTheme;\n\n    @Option(\"darkHighlightTheme\")\n    private accessor darkTheme!: ShikiTheme;\n\n    @Option(\"highlightLanguages\")\n    private accessor highlightLanguages!: string[];\n\n    @Option(\"ignoredHighlightLanguages\")\n    private accessor ignoredHighlightLanguages!: string[];\n\n    getRenderContext(pageEvent: PageEvent<Reflection>) {\n        return new this.ContextClass(this.router, this, pageEvent, this.application.options);\n    }\n\n    documentTemplate = (pageEvent: PageEvent<DocumentReflection>) => {\n        return this.getRenderContext(pageEvent).documentTemplate(pageEvent);\n    };\n    reflectionTemplate = (pageEvent: PageEvent<ContainerReflection>) => {\n        return this.getRenderContext(pageEvent).reflectionTemplate(pageEvent);\n    };\n    indexTemplate = (pageEvent: PageEvent<ProjectReflection>) => {\n        return this.getRenderContext(pageEvent).indexTemplate(pageEvent);\n    };\n    hierarchyTemplate = (pageEvent: PageEvent<ProjectReflection>) => {\n        return this.getRenderContext(pageEvent).hierarchyTemplate(pageEvent);\n    };\n    defaultLayoutTemplate = (pageEvent: PageEvent<Reflection>, template: RenderTemplate<PageEvent<Reflection>>) => {\n        return this.getRenderContext(pageEvent).defaultLayout(template, pageEvent);\n    };\n\n    getReflectionClasses(reflection: Reflection) {\n        const filters = this.application.options.getValue(\"visibilityFilters\") as Record<string, boolean>;\n        return getReflectionClasses(reflection, filters);\n    }\n\n    /**\n     * This is used so that themes may define multiple icons for modified icons (e.g. method, and inherited method)\n     */\n    getReflectionIcon(reflection: Reflection): keyof this[\"icons\"] & (string | number) {\n        return reflection.kind;\n    }\n\n    /**\n     * Create a new DefaultTheme instance.\n     *\n     * @param renderer  The renderer this theme is attached to.\n     */\n    constructor(renderer: Renderer) {\n        super(renderer);\n        this.icons = getIcons();\n        this.markedPlugin = renderer.markedPlugin;\n        this.router = renderer.router!;\n    }\n\n    render(page: PageEvent): string {\n        const templateMapping: Record<string, (_: PageEvent<never>) => JSX.Element> = {\n            [PageKind.Index]: this.indexTemplate,\n            [PageKind.Document]: this.documentTemplate,\n            [PageKind.Hierarchy]: this.hierarchyTemplate,\n            [PageKind.Reflection]: this.reflectionTemplate,\n        };\n\n        const template = templateMapping[page.pageKind];\n\n        if (!template) {\n            throw new Error(`TypeDoc's DefaultTheme does not support the page kind ${page.pageKind}`);\n        }\n\n        if (!page.isReflectionEvent()) {\n            throw new Error(\n                `TypeDoc's DefaultTheme requires that a page model be a reflection when rendering ${page.pageKind}`,\n            );\n        }\n\n        const templateOutput = this.defaultLayoutTemplate(page, template as RenderTemplate<PageEvent<Reflection>>);\n        return \"<!DOCTYPE html>\" + JSX.renderElement(templateOutput) + \"\\n\";\n    }\n\n    override async preRender(_event: RendererEvent): Promise<void> {\n        await loadHighlighter(\n            this.lightTheme,\n            this.darkTheme,\n            // Checked in option validation\n            this.highlightLanguages as BundledLanguage[],\n            this.ignoredHighlightLanguages,\n        );\n    }\n\n    private _navigationCache: NavigationElement[] | undefined;\n\n    /**\n     * If implementing a custom theme, it is recommended to override {@link buildNavigation} instead.\n     */\n    getNavigation(project: ProjectReflection): NavigationElement[] {\n        // This is ok because currently TypeDoc wipes out the theme after each render.\n        // Might need to change in the future, but it's fine for now.\n        if (this._navigationCache) {\n            return this._navigationCache;\n        }\n\n        return (this._navigationCache = this.buildNavigation(project));\n    }\n\n    buildNavigation(project: ProjectReflection): NavigationElement[] {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const theme = this;\n        const router = this.router;\n        const opts = this.application.options.getValue(\"navigation\");\n        const leaves = this.application.options.getValue(\"navigationLeaves\");\n\n        return getNavigationElements(project) || [];\n\n        function toNavigation(\n            element: ReflectionCategory | ReflectionGroup | DeclarationReflection | DocumentReflection,\n        ): NavigationElement | undefined {\n            if (opts.excludeReferences && element instanceof ReferenceReflection) {\n                return;\n            }\n\n            const children = getNavigationElements(element);\n            if (element instanceof ReflectionCategory || element instanceof ReflectionGroup) {\n                if (!children?.length) {\n                    return;\n                }\n\n                return {\n                    text: element.title,\n                    children,\n                };\n            }\n\n            const icon = theme.getReflectionIcon(element) === element.kind\n                ? undefined\n                : theme.getReflectionIcon(element);\n\n            return {\n                text: getDisplayName(element),\n                path: router.getFullUrl(element),\n                kind: element.kind & ReflectionKind.Project ? undefined : element.kind,\n                class: classNames({ deprecated: element.isDeprecated() }, theme.getReflectionClasses(element)),\n                children: children?.length ? children : undefined,\n                icon,\n            };\n        }\n\n        function getNavigationElements(\n            parent:\n                | ReflectionCategory\n                | ReflectionGroup\n                | DeclarationReflection\n                | ProjectReflection\n                | DocumentReflection,\n        ): undefined | NavigationElement[] {\n            if (parent instanceof ReflectionCategory) {\n                return filterMap(parent.children, toNavigation);\n            }\n\n            if (parent instanceof ReflectionGroup) {\n                if (shouldShowCategories(parent.owningReflection, opts) && parent.categories) {\n                    return filterMap(parent.categories, toNavigation);\n                }\n                return filterMap(parent.children, toNavigation);\n            }\n\n            if (leaves.includes(parent.getFullName())) {\n                return;\n            }\n\n            if (!parent.kindOf(ReflectionKind.MayContainDocuments)) {\n                return;\n            }\n\n            if (parent.isDocument()) {\n                return filterMap(parent.children, toNavigation);\n            }\n\n            if (!parent.kindOf(ReflectionKind.SomeModule | ReflectionKind.Project)) {\n                // Tricky: Non-module children don't show up in the navigation pane,\n                //   but any documents added by them should.\n                return filterMap(parent.documents, toNavigation);\n            }\n\n            if (parent.categories && shouldShowCategories(parent, opts)) {\n                return filterMapWithNoneCollection(parent.categories);\n            }\n\n            if (parent.groups && shouldShowGroups(parent, opts)) {\n                return filterMapWithNoneCollection(parent.groups);\n            }\n\n            if (opts.includeFolders && parent.childrenIncludingDocuments?.some((child) => child.name.includes(\"/\"))) {\n                return deriveModuleFolders(parent.childrenIncludingDocuments);\n            }\n\n            return filterMap(parent.childrenIncludingDocuments, toNavigation);\n        }\n\n        function filterMapWithNoneCollection(reflection: ReflectionGroup[] | ReflectionCategory[]) {\n            const none = reflection.find((x) => x.title.toLocaleLowerCase() === \"none\");\n            const others = reflection.filter((x) => x.title.toLocaleLowerCase() !== \"none\");\n\n            const mappedOthers = filterMap(others, toNavigation);\n\n            if (none) {\n                const noneMappedChildren = filterMap(none.children, toNavigation);\n                return [...noneMappedChildren, ...mappedOthers];\n            }\n\n            return mappedOthers;\n        }\n\n        function deriveModuleFolders(children: Array<DeclarationReflection | DocumentReflection>) {\n            const result: NavigationElement[] = [];\n\n            const resolveOrCreateParents = (\n                path: string[],\n                root: NavigationElement[] = result,\n            ): NavigationElement[] => {\n                if (path.length > 1) {\n                    const inner = root.find((el) => el.text === path[0]);\n                    if (inner) {\n                        inner.children ||= [];\n                        return resolveOrCreateParents(path.slice(1), inner.children);\n                    } else {\n                        root.push({\n                            text: path[0],\n                            children: [],\n                        });\n                        return resolveOrCreateParents(path.slice(1), root[root.length - 1].children);\n                    }\n                }\n\n                return root;\n            };\n\n            // Note: This might end up putting a module within another module if we document\n            // both foo/index.ts and foo/bar.ts.\n            for (const child of children.filter((c) => router.hasOwnDocument(c))) {\n                const nav = toNavigation(child);\n                if (nav) {\n                    const parts = child.name.split(\"/\");\n                    const collection = resolveOrCreateParents(parts);\n                    nav.text = parts[parts.length - 1];\n                    collection.push(nav);\n                }\n            }\n\n            // Now merge single-possible-paths together so we don't have folders in our navigation\n            // which contain only another single folder.\n            if (opts.compactFolders) {\n                const queue = [...result];\n                while (queue.length) {\n                    const review = queue.shift()!;\n                    queue.push(...(review.children || []));\n                    if (review.kind || review.path) continue;\n\n                    if (review.children?.length === 1) {\n                        const copyFrom = review.children[0];\n                        const fullName = `${review.text}/${copyFrom.text}`;\n                        delete review.children;\n                        Object.assign(review, copyFrom);\n                        review.text = fullName;\n                        queue.push(review);\n                    }\n                }\n            }\n\n            return result;\n        }\n    }\n}\n\nfunction getReflectionClasses(reflection: Reflection, filters: Record<string, boolean>) {\n    const classes = new Set<string>();\n\n    // Filter classes should match up with the settings function in\n    // partials/navigation.tsx.\n    for (const key of Object.keys(filters)) {\n        if (key === \"inherited\") {\n            if (reflection.flags.isInherited) {\n                classes.add(\"tsd-is-inherited\");\n            }\n        } else if (key === \"protected\") {\n            if (reflection.flags.isProtected) {\n                classes.add(\"tsd-is-protected\");\n            }\n        } else if (key === \"private\") {\n            if (reflection.flags.isPrivate) {\n                classes.add(\"tsd-is-private\");\n            }\n        } else if (key === \"external\") {\n            if (reflection.flags.isExternal) {\n                classes.add(\"tsd-is-external\");\n            }\n        } else if (key.startsWith(\"@\")) {\n            if (key === \"@deprecated\") {\n                if (reflection.isDeprecated()) {\n                    classes.add(toStyleClass(`tsd-is-${key.substring(1)}`));\n                }\n            } else if (\n                reflection.comment?.hasModifier(key as TagString) ||\n                reflection.comment?.getTag(key as TagString)\n            ) {\n                classes.add(toStyleClass(`tsd-is-${key.substring(1)}`));\n            } else if (reflection.isDeclaration()) {\n                const ownSignatures = reflection.getNonIndexSignatures();\n                // Check methods and accessors, find common tags, elevate\n                if (\n                    ownSignatures.length &&\n                    ownSignatures.every(\n                        (refl) => refl.comment?.hasModifier(key as TagString) || refl.comment?.getTag(key as TagString),\n                    )\n                ) {\n                    classes.add(toStyleClass(`tsd-is-${key.substring(1)}`));\n                }\n            }\n        }\n    }\n\n    return Array.from(classes).join(\" \");\n}\n\nfunction shouldShowCategories(reflection: Reflection, opts: { includeCategories: boolean; includeGroups: boolean }) {\n    if (opts.includeCategories) {\n        return !reflection.comment?.hasModifier(\"@hideCategories\");\n    }\n    return reflection.comment?.hasModifier(\"@showCategories\") === true;\n}\n\nfunction shouldShowGroups(reflection: Reflection, opts: { includeCategories: boolean; includeGroups: boolean }) {\n    if (opts.includeGroups) {\n        return !reflection.comment?.hasModifier(\"@hideGroups\");\n    }\n    return reflection.comment?.hasModifier(\"@showGroups\") === true;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/DefaultThemeRenderContext.ts",
    "content": "import type { PageEvent, Renderer } from \"../../index.js\";\nimport type { CommentDisplayPart, Reflection } from \"../../../models/index.js\";\nimport { type Options } from \"../../../utils/index.js\";\nimport type { DefaultTheme } from \"./DefaultTheme.js\";\nimport { defaultLayout } from \"./layouts/default.js\";\nimport { index } from \"./partials/index.js\";\nimport { breadcrumbs } from \"./partials/breadcrumb.js\";\nimport {\n    commentShortSummary,\n    commentSummary,\n    commentTags,\n    reflectionFlags,\n    renderDisplayParts,\n} from \"./partials/comment.js\";\nimport { footer } from \"./partials/footer.js\";\nimport { header } from \"./partials/header.js\";\nimport { hierarchy } from \"./partials/hierarchy.js\";\nimport { buildRefIcons, type Icons } from \"./partials/icon.js\";\nimport { member } from \"./partials/member.js\";\nimport { memberDeclaration } from \"./partials/member.declaration.js\";\nimport { memberGetterSetter } from \"./partials/member.getterSetter.js\";\nimport { memberSignatureBody } from \"./partials/member.signature.body.js\";\nimport { memberSignatureTitle } from \"./partials/member.signature.title.js\";\nimport { memberSignatures } from \"./partials/member.signatures.js\";\nimport { memberSources } from \"./partials/member.sources.js\";\nimport { members } from \"./partials/members.js\";\nimport { navigation, pageNavigation, pageSidebar, settings, sidebar, sidebarLinks } from \"./partials/navigation.js\";\nimport { reflectionPreview } from \"./partials/reflectionPreview.js\";\nimport { toolbar } from \"./partials/toolbar.js\";\nimport { type } from \"./partials/type.js\";\nimport { typeAndParent } from \"./partials/typeAndParent.js\";\nimport { typeParameters } from \"./partials/typeParameters.js\";\nimport { indexTemplate } from \"./templates/index.js\";\nimport { documentTemplate } from \"./templates/document.js\";\nimport { hierarchyTemplate } from \"./templates/hierarchy.js\";\nimport { reflectionTemplate } from \"./templates/reflection.js\";\nimport { typeDeclaration, typeDetails, typeDetailsIfUseful } from \"./partials/typeDetails.js\";\nimport { moduleMemberSummary, moduleReflection } from \"./partials/moduleReflection.js\";\nimport type { Router } from \"../../router.js\";\nimport type { JSX, NeverIfInternal } from \"#utils\";\n\nfunction bind<F, L extends any[], R>(fn: (f: F, ...a: L) => R, first: F) {\n    return (...r: L) => fn(first, ...r);\n}\n\nexport class DefaultThemeRenderContext {\n    private _refIcons: Icons;\n    options: Options;\n\n    model: Reflection;\n\n    constructor(\n        readonly router: Router,\n        readonly theme: DefaultTheme,\n        public page: PageEvent<Reflection>,\n        options: Options,\n    ) {\n        this._refIcons = buildRefIcons(theme.icons, this);\n        this.options = options;\n        this.model = page.model;\n    }\n\n    /**\n     * Icons available for use within the page.\n     * When getting an icon for a reflection, {@link reflectionIcon} should be used so\n     * that themes which define multiple icon variants can correctly specify which icon\n     * they want to be used.\n     *\n     * Note: This creates a reference to icons declared by {@link DefaultTheme.icons},\n     * to customize icons, that object must be modified instead.\n     */\n    get icons(): Readonly<Icons> {\n        return this._refIcons;\n    }\n\n    /**\n     * Do not override this method, override {@link DefaultTheme.getReflectionIcon} instead.\n     */\n    reflectionIcon = (reflection: Reflection): JSX.Element => {\n        return this.icons[this.theme.getReflectionIcon(reflection)]();\n    };\n\n    get slugger() {\n        return this.router.getSlugger(this.page.model);\n    }\n\n    hook: Renderer[\"hooks\"][\"emit\"] = (...params) => {\n        return this.theme.owner.hooks.emit(...params);\n    };\n\n    /** Avoid this in favor of urlTo if possible */\n    relativeURL = (url: string, cacheBust = false) => {\n        const result = this.router.baseRelativeUrl(this.page.model, url);\n        if (cacheBust && this.theme.owner.cacheBust) {\n            return result + `?cache=${this.theme.owner.renderStartTime}`;\n        }\n        return result;\n    };\n\n    getAnchor = (reflection: Reflection): string | undefined => {\n        return this.router.getAnchor(reflection);\n    };\n\n    urlTo = (reflection: Reflection): string | undefined => {\n        return this.router.relativeUrl(this.page.model, reflection);\n    };\n\n    markdown = (\n        md: readonly CommentDisplayPart[] | NeverIfInternal<string | undefined>,\n    ) => {\n        return this.theme.markedPlugin.parseMarkdown(md || \"\", this.page, this);\n    };\n\n    /** Renders user comment markdown wrapped in a tsd-comment div */\n    displayParts = bind(renderDisplayParts, this);\n\n    getNavigation = () => this.theme.getNavigation(this.page.project);\n\n    getReflectionClasses = (refl: Reflection) => this.theme.getReflectionClasses(refl);\n\n    documentTemplate = bind(documentTemplate, this);\n    reflectionTemplate = bind(reflectionTemplate, this);\n    indexTemplate = bind(indexTemplate, this);\n    hierarchyTemplate = bind(hierarchyTemplate, this);\n    defaultLayout = bind(defaultLayout, this);\n\n    /**\n     * Rendered just after the description for a reflection.\n     * This can be used to render a shortened type display of a reflection that the\n     * rest of the page expands on.\n     *\n     * Note: Will not be called for variables/type aliases, as they are summarized\n     * by their type declaration, which is already rendered by {@link DefaultThemeRenderContext.memberDeclaration}\n     */\n    reflectionPreview = bind(reflectionPreview, this);\n\n    /**\n     * Used to render additional details about a type. This is used to implement\n     * the `@expand` tag, comments on union members, comments on object type members...\n     */\n    typeDetails = bind(typeDetails, this);\n\n    /**\n     * Should call the {@link typeDetails} helper if rendering additional details\n     * about the type will provide the user with more information about the type.\n     */\n    typeDetailsIfUseful = bind(typeDetailsIfUseful, this);\n\n    /**\n     * Wrapper around {@link typeDetails} which checks if it is useful\n     * and includes a \"Type Declaration\" header.\n     */\n    typeDeclaration = bind(typeDeclaration, this);\n\n    breadcrumbs = bind(breadcrumbs, this);\n    commentShortSummary = bind(commentShortSummary, this);\n    commentSummary = bind(commentSummary, this);\n    commentTags = bind(commentTags, this);\n    reflectionFlags = bind(reflectionFlags, this);\n    footer = bind(footer, this);\n    header = bind(header, this);\n    hierarchy = bind(hierarchy, this);\n    index = bind(index, this);\n    member = bind(member, this);\n    moduleReflection = bind(moduleReflection, this);\n    moduleMemberSummary = bind(moduleMemberSummary, this);\n    memberDeclaration = bind(memberDeclaration, this);\n    memberGetterSetter = bind(memberGetterSetter, this);\n    memberSignatureBody = bind(memberSignatureBody, this);\n    memberSignatureTitle = bind(memberSignatureTitle, this);\n    memberSignatures = bind(memberSignatures, this);\n    memberSources = bind(memberSources, this);\n    members = bind(members, this);\n    sidebar = bind(sidebar, this);\n    pageSidebar = bind(pageSidebar, this);\n    sidebarLinks = bind(sidebarLinks, this);\n    settings = bind(settings, this);\n    navigation = bind(navigation, this);\n    pageNavigation = bind(pageNavigation, this);\n    toolbar = bind(toolbar, this);\n    type = bind(type, this);\n    typeAndParent = bind(typeAndParent, this);\n    typeParameters = bind(typeParameters, this);\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/Slugger.ts",
    "content": "import { getSimilarValues } from \"#utils\";\nimport type { TypeDocOptionMap } from \"#node-utils\";\n\n/**\n * Responsible for getting a unique anchor for elements within a page.\n */\nexport class Slugger {\n    private seen = new Map<string, number>();\n\n    private serialize(value: string) {\n        // There are quite a few trade-offs here. We used to remove HTML tags here,\n        // but TypeDoc now removes the HTML tags before passing text into the slug\n        // method, which allows us to skip doing that here. This improves the slugger\n        // generation for headers which look like the following:\n        // (html allowed in markdown)\n        // # test &lt;t&gt;\n        // (html disallowed in markdown)\n        // # test <t>\n        // both of the above should slug to test-t\n\n        const slug = value\n            .trim()\n            // remove unwanted chars\n            .replace(\n                /[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g,\n                \"\",\n            )\n            // change whitespace to dash\n            .replace(/\\s/g, \"-\")\n            // combine adjacent dashes\n            .replace(/--+/, \"-\");\n\n        // #3065 unfortunately some headers might result in a desired slug which is\n        // completely empty. In that case, we still need to return *something* so that\n        // we don't end up generating an empty anchor, which is invalid according to the\n        // spec. GitHub's slugger rules don't handle this, so I've somewhat arbitrarily\n        // chosen \"_\" here. If GitHub ever fixes that issue, this might need to be adjusted.\n        return slug || \"_\";\n    }\n\n    constructor(private options: TypeDocOptionMap[\"sluggerConfiguration\"]) {}\n\n    slug(value: string) {\n        const originalSlug = this.serialize(value);\n        const lowerOriginalSlug = originalSlug.toLocaleLowerCase();\n        let count = 0;\n        let slug = lowerOriginalSlug;\n        if (this.seen.has(lowerOriginalSlug)) {\n            count = this.seen.get(lowerOriginalSlug)!;\n            do {\n                count++;\n                slug = `${lowerOriginalSlug}-${count}`;\n            } while (this.seen.has(slug));\n        }\n        this.seen.set(lowerOriginalSlug, count);\n        if (!this.options.lowercase) {\n            return count === 0 ? originalSlug : `${originalSlug}-${count}`;\n        }\n        return slug;\n    }\n\n    hasAnchor(anchor: string) {\n        return this.seen.has(anchor);\n    }\n\n    getSimilarAnchors(anchor: string) {\n        return getSimilarValues(this.seen.keys(), anchor);\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/bootstrap.ts",
    "content": "import { Application, registerComponent } from \"./typedoc/Application.js\";\nimport { initSearch } from \"./typedoc/components/Search.js\";\nimport { Toggle } from \"./typedoc/components/Toggle.js\";\nimport { Filter } from \"./typedoc/components/Filter.js\";\nimport { Accordion } from \"./typedoc/components/Accordion.js\";\nimport { initTheme } from \"./typedoc/Theme.js\";\nimport { initNav } from \"./typedoc/Navigation.js\";\nimport { initHierarchy } from \"./typedoc/Hierarchy.js\";\n\nregisterComponent(Toggle, \"a[data-toggle]\");\nregisterComponent(Accordion, \".tsd-accordion\");\nregisterComponent(Filter, \".tsd-filter-item input[type=checkbox]\");\n\nconst themeChoice = document.getElementById(\"tsd-theme\");\nif (themeChoice) {\n    initTheme(themeChoice as HTMLOptionElement);\n}\n\ndeclare global {\n    var app: Application;\n}\nconst app = new Application();\n\nObject.defineProperty(window, \"app\", { value: app });\n\ninitSearch();\ninitNav();\ninitHierarchy();\n\nif (\"virtualKeyboard\" in navigator) {\n    // @ts-ignore\n    navigator.virtualKeyboard.overlaysContent = true;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/Application.ts",
    "content": "import type { IComponentOptions } from \"./Component.js\";\nimport { storage } from \"./utils/storage.js\";\n\ndeclare global {\n    interface Window {\n        translations: {\n            copy: string;\n            copied: string;\n            normally_hidden: string;\n            hierarchy_expand: string;\n            hierarchy_collapse: string;\n            search_index_not_available: string;\n            search_no_results_found_for_0: string;\n\n            // Kind strings for icons\n            folder: string;\n            [k: `kind_${number}`]: string;\n        };\n        TypeDoc: {\n            disableWritingLocalStorage: () => void;\n            disableLocalStorage: () => void;\n            enableLocalStorage: () => void;\n        };\n    }\n}\n\nwindow.TypeDoc ||= {\n    disableWritingLocalStorage() {\n        storage.disableWritingLocalStorage();\n    },\n    disableLocalStorage: () => {\n        storage.disable();\n    },\n    enableLocalStorage: () => {\n        storage.enable();\n    },\n};\n\n// For debugging with a watch build\nwindow.translations ||= {\n    copy: \"Copy\",\n    copied: \"Copied!\",\n    normally_hidden: \"This member is normally hidden due to your filter settings.\",\n    hierarchy_expand: \"Expand\",\n    hierarchy_collapse: \"Collapse\",\n    search_index_not_available: \"The search index is not available\",\n    search_no_results_found_for_0: \"No results found for {0}\",\n\n    folder: \"Folder\",\n    kind_1: \"Project\",\n    kind_2: \"Module\",\n    kind_4: \"Namespace\",\n    kind_8: \"Enumeration\",\n    kind_16: \"Enumeration Member\",\n    kind_32: \"Variable\",\n    kind_64: \"Function\",\n    kind_128: \"Class\",\n    kind_256: \"Interface\",\n    kind_512: \"Constructor\",\n    kind_1024: \"Property\",\n    kind_2048: \"Method\",\n    kind_4096: \"Call Signature\",\n    kind_8192: \"Index Signature\",\n    kind_16384: \"Constructor Signature\",\n    kind_32768: \"Parameter\",\n    kind_65536: \"Type Literal\",\n    kind_131072: \"Type Parameter\",\n    kind_262144: \"Accessor\",\n    kind_524288: \"Get Signature\",\n    kind_1048576: \"Set Signature\",\n    kind_2097152: \"Type Alias\",\n    kind_4194304: \"Reference\",\n    kind_8388608: \"Document\",\n};\n\n/**\n * Component definition.\n */\nexport interface IComponent {\n    constructor: new (options: IComponentOptions) => unknown;\n    selector: string;\n}\n\n/**\n * List of all known components.\n */\nconst components: IComponent[] = [];\n\n/**\n * Register a new component.\n */\nexport function registerComponent(\n    constructor: IComponent[\"constructor\"],\n    selector: string,\n) {\n    components.push({\n        selector: selector,\n        constructor: constructor,\n    });\n}\n\n/**\n * TypeDoc application class.\n */\nexport class Application {\n    alwaysVisibleMember: HTMLElement | null = null;\n    constructor() {\n        this.createComponents(document.body);\n        this.ensureFocusedElementVisible();\n        this.listenForCodeCopies();\n        window.addEventListener(\"hashchange\", () => this.ensureFocusedElementVisible());\n\n        // We're on a *really* slow network connection and the inline JS\n        // has already made the page display.\n        if (!document.body.style.display) {\n            this.ensureFocusedElementVisible();\n            this.updateIndexVisibility();\n            this.scrollToHash();\n        }\n    }\n\n    /**\n     * Create all components beneath the given element.\n     */\n    public createComponents(context: HTMLElement) {\n        components.forEach((c) => {\n            context.querySelectorAll<HTMLElement>(c.selector).forEach((el) => {\n                if (!el.dataset[\"hasInstance\"]) {\n                    new c.constructor({ el, app: this });\n                    el.dataset[\"hasInstance\"] = String(true);\n                }\n            });\n        });\n    }\n\n    public filterChanged() {\n        this.ensureFocusedElementVisible();\n    }\n\n    public showPage() {\n        if (!document.body.style.display) return;\n        document.body.style.removeProperty(\"display\");\n        this.ensureFocusedElementVisible();\n        this.updateIndexVisibility();\n        this.scrollToHash();\n    }\n\n    public scrollToHash() {\n        // Because we hid the entire page until the navigation loaded or we hit a timeout,\n        // we have to manually resolve the url hash here.\n        if (location.hash) {\n            const reflAnchor = document.getElementById(\n                location.hash.substring(1),\n            );\n            if (!reflAnchor) return;\n            reflAnchor.scrollIntoView({ behavior: \"instant\", block: \"start\" });\n        }\n    }\n\n    public ensureActivePageVisible() {\n        const pageLink = document.querySelector(\".tsd-navigation .current\");\n        let iter = pageLink?.parentElement;\n        while (iter && !iter.classList.contains(\".tsd-navigation\")) {\n            // Expand parent namespaces if collapsed, and this module\n            if (iter instanceof HTMLDetailsElement) {\n                iter.open = true;\n            }\n            iter = iter.parentElement;\n        }\n\n        if (pageLink && !checkVisible(pageLink)) {\n            const top = pageLink.getBoundingClientRect().top -\n                document.documentElement.clientHeight / 4;\n            // If we are showing three columns, this will scroll the site menu down to\n            // show the page we just loaded in the navigation.\n            document.querySelector(\".site-menu\")!.scrollTop = top;\n            // If we are showing two columns\n            document.querySelector(\".col-sidebar\")!.scrollTop = top;\n        }\n    }\n\n    public updateIndexVisibility() {\n        const indexAccordion = document.querySelector<HTMLDetailsElement>(\".tsd-index-content\");\n        const oldOpen = indexAccordion?.open;\n        if (indexAccordion) {\n            indexAccordion.open = true;\n        }\n\n        // Hide index headings where all index items are hidden.\n        // offsetParent == null checks for display: none\n        document\n            .querySelectorAll<HTMLElement>(\".tsd-index-section\")\n            .forEach((el) => {\n                el.style.display = \"block\";\n                const allChildrenHidden = Array.from(\n                    el.querySelectorAll<HTMLElement>(\".tsd-index-link\"),\n                ).every((child) => child.offsetParent == null);\n\n                el.style.display = allChildrenHidden ? \"none\" : \"block\";\n            });\n\n        if (indexAccordion) {\n            indexAccordion.open = oldOpen!;\n        }\n    }\n\n    /**\n     * Ensures that if a user was linked to a reflection which is hidden because of filter\n     * settings, that reflection is still shown.\n     */\n    private ensureFocusedElementVisible() {\n        if (this.alwaysVisibleMember) {\n            this.alwaysVisibleMember.classList.remove(\"always-visible\");\n            this.alwaysVisibleMember.firstElementChild!.remove();\n            this.alwaysVisibleMember = null;\n        }\n\n        if (!location.hash) return;\n\n        const reflAnchor = document.getElementById(location.hash.substring(1));\n        if (!reflAnchor) return;\n\n        let reflContainer = reflAnchor.parentElement!;\n        while (reflContainer && reflContainer.tagName !== \"SECTION\") {\n            reflContainer = reflContainer.parentElement!;\n        }\n\n        if (!reflContainer) {\n            // This is probably a link in the readme, doesn't have a containing section\n            return;\n        }\n\n        // Ensure the group this reflection is contained within is visible.\n        const wasHidden = reflContainer.offsetParent == null;\n        let sectionContainer = reflContainer;\n        while (sectionContainer !== document.body) {\n            if (sectionContainer instanceof HTMLDetailsElement) {\n                sectionContainer.open = true;\n            }\n            sectionContainer = sectionContainer.parentElement!;\n        }\n\n        if (reflContainer.offsetParent == null) {\n            this.alwaysVisibleMember = reflContainer;\n\n            reflContainer.classList.add(\"always-visible\");\n\n            const warning = document.createElement(\"p\");\n            warning.classList.add(\"warning\");\n            warning.textContent = window.translations.normally_hidden;\n\n            reflContainer.prepend(warning);\n        }\n\n        if (wasHidden) {\n            reflAnchor.scrollIntoView();\n        }\n    }\n\n    private listenForCodeCopies() {\n        document.querySelectorAll(\"pre > button\").forEach((button) => {\n            let timeout: ReturnType<typeof setTimeout>;\n            button.addEventListener(\"click\", () => {\n                if (button.previousElementSibling instanceof HTMLElement) {\n                    navigator.clipboard.writeText(\n                        button.previousElementSibling.innerText.trim(),\n                    );\n                }\n                button.textContent = window.translations.copied;\n                button.classList.add(\"visible\");\n                clearTimeout(timeout);\n                timeout = setTimeout(() => {\n                    button.classList.remove(\"visible\");\n                    timeout = setTimeout(() => {\n                        button.textContent = window.translations.copy;\n                    }, 100);\n                }, 1000);\n            });\n        });\n    }\n}\n\n// https://stackoverflow.com/a/5354536/7186598\nfunction checkVisible(elm: Element) {\n    const rect = elm.getBoundingClientRect();\n    const viewHeight = Math.max(\n        document.documentElement.clientHeight,\n        window.innerHeight,\n    );\n    return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/Component.ts",
    "content": "import { Application } from \"./Application.js\";\n\nexport interface IComponentOptions {\n    app: Application;\n    el: HTMLElement;\n}\n\n/**\n * TypeDoc component class.\n */\nexport class Component<E extends HTMLElement = HTMLElement> {\n    protected el: E;\n    protected app: Application;\n\n    constructor(options: IComponentOptions) {\n        this.el = options.el as E;\n        this.app = options.app;\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/EventTarget.ts",
    "content": "export interface IEventListener<T> {\n    (evt: CustomEvent<T>): void;\n}\n\n/**\n * TypeDoc event target class.\n */\nexport class EventTarget {\n    private listeners: Record<string, IEventListener<any>[]> = {};\n\n    public addEventListener<T>(type: string, callback: IEventListener<T>) {\n        if (!(type in this.listeners)) {\n            this.listeners[type] = [];\n        }\n        this.listeners[type].push(callback);\n    }\n\n    public removeEventListener<T>(type: string, callback: IEventListener<T>) {\n        if (!(type in this.listeners)) {\n            return;\n        }\n        const stack = this.listeners[type];\n        for (let i = 0, l = stack.length; i < l; i++) {\n            if (stack[i] === callback) {\n                stack.splice(i, 1);\n                return;\n            }\n        }\n    }\n\n    public dispatchEvent<T>(event: CustomEvent<T>) {\n        if (!(event.type in this.listeners)) {\n            return true;\n        }\n        const stack = this.listeners[event.type].slice();\n\n        for (let i = 0, l = stack.length; i < l; i++) {\n            stack[i].call(this, event);\n        }\n        return !event.defaultPrevented;\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/Hierarchy.ts",
    "content": "import { decompressJson } from \"./utils/decompress\";\n\ndeclare global {\n    interface Window {\n        // Base64 encoded data url, gzipped, JSON encoded JsonHierarchy\n        hierarchyData?: string;\n    }\n}\n\ninterface JsonHierarchyElement {\n    name: string;\n    kind: number;\n    url: string;\n    children?: number[];\n    uniqueNameParents?: number[];\n    class: string;\n}\n\ninterface JsonHierarchy {\n    // ids of root instances\n    roots: number[];\n    reflections: Record<number, JsonHierarchyElement>;\n}\n\nlet BASE_URL = document.documentElement.dataset.base!;\nif (!BASE_URL.endsWith(\"/\")) BASE_URL += \"/\";\n\nexport function initHierarchy() {\n    if (document.querySelector(\".tsd-full-hierarchy\")) {\n        initFullHierarchy();\n    } else if (document.querySelector(\".tsd-hierarchy\")) {\n        initPartialHierarchy();\n    }\n}\n\nfunction initFullHierarchy() {\n    document.addEventListener(\"click\", (event) => {\n        let target = event.target as HTMLElement;\n        while (target.parentElement && target.parentElement.tagName != \"LI\") {\n            target = target.parentElement;\n        }\n\n        if (target.dataset.dropdown) {\n            target.dataset.dropdown = String(\n                target.dataset.dropdown !== \"true\",\n            );\n        }\n    });\n\n    const hierarchyRefs = new Map<string, HTMLElement>();\n    const duplicates = new Set<string>();\n\n    for (\n        const el of document.querySelectorAll<HTMLElement>(\n            \".tsd-full-hierarchy [data-refl]\",\n        )\n    ) {\n        const children = el.querySelector(\"ul\");\n\n        if (hierarchyRefs.has(el.dataset.refl!)) {\n            duplicates.add(el.dataset.refl!);\n        } else if (children) {\n            hierarchyRefs.set(el.dataset.refl!, children);\n        }\n    }\n\n    for (const dup of duplicates) {\n        addExpandButton(dup);\n    }\n\n    function addExpandButton(reflId: string) {\n        const expanded = hierarchyRefs\n            .get(reflId)!\n            .cloneNode(true) as HTMLElement;\n        expanded.querySelectorAll(\"[id]\").forEach((el) => {\n            el.removeAttribute(\"id\");\n        });\n        expanded\n            .querySelectorAll<HTMLElement>(\"[data-dropdown]\")\n            .forEach((el) => {\n                el.dataset.dropdown = \"false\";\n            });\n\n        for (\n            const owner of document.querySelectorAll(\n                `[data-refl=\"${reflId}\"]`,\n            )\n        ) {\n            const icon = makeIcon();\n            const ul = owner.querySelector(\"ul\");\n            owner.insertBefore(icon, ul);\n            icon.dataset.dropdown = String(!!ul);\n\n            if (!ul) {\n                owner.appendChild(expanded.cloneNode(true));\n            }\n        }\n    }\n}\n\nfunction initPartialHierarchy() {\n    const script = document.getElementById(\"tsd-hierarchy-script\");\n    if (!script) return;\n\n    script.addEventListener(\"load\", buildHierarchyToggle);\n    buildHierarchyToggle();\n}\n\nasync function buildHierarchyToggle() {\n    const container = document.querySelector<HTMLElement>(\n        \".tsd-panel.tsd-hierarchy:has(h4 a)\",\n    );\n    if (!container || !window.hierarchyData) return;\n\n    const baseReflId = +container.dataset.refl!;\n    const hierarchy: JsonHierarchy = await decompressJson(window.hierarchyData);\n\n    const collapsedHierarchy = container.querySelector(\"ul\")!;\n    const expandedHierarchy = document.createElement(\"ul\");\n    expandedHierarchy.classList.add(\"tsd-hierarchy\");\n    buildExpandedHierarchy(expandedHierarchy, hierarchy, baseReflId);\n\n    // No point in showing the expand button if it will be the same content.\n    // It won't be the exact same innerHTML due to links being generated less\n    // intelligently here than in the theme (though they still go to the same place)\n    // but if there are the same number of elements in the hierarchy, there's\n    // no point.\n    if (\n        collapsedHierarchy.querySelectorAll(\"li\").length ==\n            expandedHierarchy.querySelectorAll(\"li\").length\n    ) {\n        return;\n    }\n\n    const expandCollapseButton = document.createElement(\"span\");\n    expandCollapseButton.classList.add(\"tsd-hierarchy-toggle\");\n    expandCollapseButton.textContent = window.translations.hierarchy_expand;\n    container\n        .querySelector(\"h4 a\")\n        ?.insertAdjacentElement(\"afterend\", expandCollapseButton);\n    expandCollapseButton.insertAdjacentText(\"beforebegin\", \", \");\n    expandCollapseButton.addEventListener(\"click\", () => {\n        if (\n            expandCollapseButton.textContent ===\n                window.translations.hierarchy_expand\n        ) {\n            collapsedHierarchy.insertAdjacentElement(\n                \"afterend\",\n                expandedHierarchy,\n            );\n            collapsedHierarchy.remove();\n            expandCollapseButton.textContent = window.translations.hierarchy_collapse;\n        } else {\n            expandedHierarchy.insertAdjacentElement(\n                \"afterend\",\n                collapsedHierarchy,\n            );\n            expandedHierarchy.remove();\n            expandCollapseButton.textContent = window.translations.hierarchy_expand;\n        }\n    });\n}\n\nfunction buildExpandedHierarchy(\n    container: HTMLElement,\n    hierarchy: JsonHierarchy,\n    id: number,\n) {\n    // Figure out which roots contain the target ID\n    const roots = hierarchy.roots.filter((root) => rootContainsElement(hierarchy, root, id));\n\n    for (const root of roots) {\n        container.appendChild(followHierarchy(hierarchy, root, id)!);\n    }\n}\n\nfunction followHierarchy(\n    hierarchy: JsonHierarchy,\n    id: number,\n    targetId: number,\n    seen = new Set(),\n): HTMLElement | undefined {\n    if (seen.has(id)) return;\n    seen.add(id);\n\n    const item = hierarchy.reflections[id];\n    const container = document.createElement(\"li\");\n    container.classList.add(\"tsd-hierarchy-item\");\n\n    if (id === targetId) {\n        const text = container.appendChild(document.createElement(\"span\"));\n        text.textContent = item.name;\n        text.classList.add(\"tsd-hierarchy-target\");\n    } else {\n        for (const parent of item.uniqueNameParents || []) {\n            const parentItem = hierarchy.reflections[parent];\n            const link = container.appendChild(document.createElement(\"a\"));\n            link.textContent = parentItem.name;\n            link.href = BASE_URL + parentItem.url;\n            link.className = parentItem.class + \" tsd-signature-type\";\n            container.append(document.createTextNode(\".\"));\n        }\n        const link = container.appendChild(document.createElement(\"a\"));\n        link.textContent = hierarchy.reflections[id].name;\n        link.href = BASE_URL + item.url;\n        link.className = item.class + \" tsd-signature-type\";\n    }\n\n    if (item.children) {\n        const ul = container.appendChild(document.createElement(\"ul\"));\n        ul.classList.add(\"tsd-hierarchy\");\n        for (const child of item.children) {\n            const h = followHierarchy(hierarchy, child, targetId, seen);\n            if (h) ul.appendChild(h);\n        }\n    }\n\n    seen.delete(id);\n    return container;\n}\n\nfunction rootContainsElement(\n    hierarchy: JsonHierarchy,\n    rootId: number,\n    id: number,\n) {\n    if (rootId === id) {\n        return true;\n    }\n\n    const seen = new Set<JsonHierarchyElement>();\n    const queue = [hierarchy.reflections[rootId]];\n    while (queue.length) {\n        const item = queue.pop()!;\n        if (seen.has(item)) continue;\n        seen.add(item);\n\n        for (const child of item.children || []) {\n            if (child === id) {\n                return true;\n            }\n            queue.push(hierarchy.reflections[child]);\n        }\n    }\n\n    return false;\n}\n\nfunction makeIcon() {\n    const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    svg.setAttribute(\"width\", \"20\");\n    svg.setAttribute(\"height\", \"20\");\n    svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n    svg.setAttribute(\"fill\", \"none\");\n    svg.innerHTML = `<use href=\"#icon-chevronDown\"></use>`;\n    return svg;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/Navigation.ts",
    "content": "import { decompressJson } from \"./utils/decompress\";\n\nexport interface NavigationElement {\n    text: string;\n    path?: string;\n    kind?: number;\n    class?: string;\n    children?: NavigationElement[];\n    icon?: string | number;\n}\n\nlet BASE_URL: string;\n\ndeclare global {\n    interface Window {\n        // Base64 encoded data url, gzipped, JSON encoded NavigationElement[]\n        navigationData?: string;\n    }\n}\n\nexport function initNav() {\n    const script = document.getElementById(\"tsd-nav-script\");\n    if (!script) return;\n\n    script.addEventListener(\"load\", buildNav);\n    buildNav();\n}\n\nasync function buildNav() {\n    const container = document.getElementById(\"tsd-nav-container\");\n    if (!container || !window.navigationData) return;\n\n    const nav: NavigationElement[] = await decompressJson(\n        window.navigationData,\n    );\n\n    BASE_URL = document.documentElement.dataset.base!;\n    if (!BASE_URL.endsWith(\"/\")) BASE_URL += \"/\";\n    container.innerHTML = \"\";\n    for (const el of nav) {\n        buildNavElement(el, container, []);\n    }\n\n    window.app.createComponents(container);\n    window.app.showPage();\n    window.app.ensureActivePageVisible();\n}\n\nfunction buildNavElement(\n    el: NavigationElement,\n    parent: HTMLElement,\n    path: string[],\n) {\n    const li = parent.appendChild(document.createElement(\"li\"));\n\n    if (el.children) {\n        const fullPath = [...path, el.text];\n        const details = li.appendChild(document.createElement(\"details\"));\n        details.className = el.class\n            ? `${el.class} tsd-accordion`\n            : \"tsd-accordion\";\n\n        const summary = details.appendChild(document.createElement(\"summary\"));\n        summary.className = \"tsd-accordion-summary\";\n        summary.dataset.key = fullPath.join(\"$\");\n        // Would be nice to not hardcode this here, if someone overwrites the chevronDown icon with an <img>\n        // then this won't work... going to wait to worry about that until it actually breaks some custom theme.\n        // Also very annoying that we can't encode the svg in the cache, since that gets duplicated here...\n        // If that breaks someone, we probably have to get the svg element from the cached div (and include them..)\n        // and clone that into place...\n        summary.innerHTML =\n            `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"><use href=\"#icon-chevronDown\"></use></svg>`;\n        addNavText(el, summary);\n\n        const data = details.appendChild(document.createElement(\"div\"));\n        data.className = \"tsd-accordion-details\";\n        const ul = data.appendChild(document.createElement(\"ul\"));\n        ul.className = \"tsd-nested-navigation\";\n\n        for (const child of el.children) {\n            buildNavElement(child, ul, fullPath);\n        }\n    } else {\n        addNavText(el, li, el.class);\n    }\n}\n\nfunction addNavText(\n    el: NavigationElement,\n    parent: HTMLElement,\n    classes?: string | 0,\n) {\n    if (el.path) {\n        const a = parent.appendChild(document.createElement(\"a\"));\n        a.href = BASE_URL + el.path; // relativity!\n        if (classes) {\n            a.className = classes;\n        }\n        if (location.pathname === a.pathname && !a.href.includes(\"#\")) {\n            a.classList.add(\"current\");\n            a.ariaCurrent = \"page\";\n        }\n        if (el.kind) {\n            const label = window.translations[`kind_${el.kind}`].replaceAll(\n                '\"',\n                \"&quot;\",\n            );\n            a.innerHTML =\n                `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" class=\"tsd-kind-icon\" aria-label=\"${label}\"><use href=\"#icon-${\n                    el.icon || el.kind\n                }\"></use></svg>`;\n        }\n        a.appendChild(wbr(el.text, document.createElement(\"span\")));\n    } else {\n        const span = parent.appendChild(document.createElement(\"span\"));\n        const label = window.translations.folder.replaceAll('\"', \"&quot;\");\n        span.innerHTML =\n            `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" class=\"tsd-kind-icon\" aria-label=\"${label}\"><use href=\"#icon-folder\"></use></svg>`;\n        span.appendChild(wbr(el.text, document.createElement(\"span\")));\n    }\n}\n\nfunction wbr(str: string, element: HTMLElement) {\n    // Keep this in sync with the same helper in lib.tsx\n    // We use lookahead/lookbehind to indicate where the string should\n    // be split without consuming a character.\n    // (?<=[^A-Z])(?=[A-Z]) -- regular camel cased text\n    // (?<=[A-Z])(?=[A-Z][a-z]) -- acronym\n    // (?<=[_-])(?=[^_-]) -- snake\n    const parts = str.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);\n    for (let i = 0; i < parts.length; ++i) {\n        if (i !== 0) {\n            element.appendChild(document.createElement(\"wbr\"));\n        }\n        element.appendChild(document.createTextNode(parts[i]));\n    }\n\n    return element;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/Theme.ts",
    "content": "import { storage } from \"./utils/storage.js\";\n\ntype ThemeChoice = \"os\" | \"light\" | \"dark\";\n\nexport function initTheme(choices: HTMLOptionElement) {\n    const savedTheme = (storage.getItem(\"tsd-theme\") as ThemeChoice) || \"os\";\n    choices.value = savedTheme;\n    setTheme(savedTheme);\n\n    choices.addEventListener(\"change\", () => {\n        storage.setItem(\"tsd-theme\", choices.value);\n        setTheme(choices.value as ThemeChoice);\n    });\n}\n\n// Also see:\n// - src/lib/output/themes/defaults/layouts/default.tsx\n// - src/lib/utils/highlighter.tsx\nfunction setTheme(theme: ThemeChoice) {\n    document.documentElement.dataset.theme = theme;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/components/Accordion.ts",
    "content": "import { Component, IComponentOptions } from \"../Component.js\";\nimport { storage } from \"../utils/storage.js\";\n\nconst ACCORDION_INSTANCES = new Map<string, AccordionImpl>();\n\nclass AccordionImpl {\n    open: boolean;\n    accordions: HTMLDetailsElement[] = [];\n    key: string;\n\n    constructor(key: string, open: boolean) {\n        this.key = key;\n        this.open = open;\n    }\n\n    add(accordion: HTMLDetailsElement) {\n        this.accordions.push(accordion);\n        accordion.open = this.open;\n        accordion.addEventListener(\"toggle\", () => {\n            this.toggle(accordion.open);\n        });\n    }\n\n    toggle(open: boolean) {\n        for (const acc of this.accordions) {\n            acc.open = open;\n        }\n        storage.setItem(this.key, open.toString());\n    }\n}\n\n/**\n * Handles accordion dropdown behavior.\n */\nexport class Accordion extends Component<HTMLDetailsElement> {\n    constructor(options: IComponentOptions) {\n        super(options);\n\n        const summary = this.el.querySelector(\"summary\")!;\n\n        // Safari is broken and doesn't let you click on a link within\n        // a <summary> tag, so we have to manually handle clicks there.\n        const link = summary.querySelector(\"a\");\n        if (link) {\n            link.addEventListener(\"click\", () => {\n                location.assign(link.href);\n            });\n        }\n\n        const key = `tsd-accordion-${\n            summary.dataset.key ??\n                summary.textContent!.trim().replace(/\\s+/g, \"-\").toLowerCase()\n        }`;\n\n        let inst: AccordionImpl;\n        if (ACCORDION_INSTANCES.has(key)) {\n            inst = ACCORDION_INSTANCES.get(key)!;\n        } else {\n            const stored = storage.getItem(key);\n            const open = stored ? stored === \"true\" : this.el.open;\n            inst = new AccordionImpl(key, open);\n            ACCORDION_INSTANCES.set(key, inst);\n        }\n\n        inst.add(this.el);\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/components/Filter.ts",
    "content": "import { Component, IComponentOptions } from \"../Component.js\";\nimport { storage } from \"../utils/storage.js\";\n\nconst style = document.head.appendChild(document.createElement(\"style\"));\nstyle.dataset.for = \"filters\";\n\n/** Filter classes, true if they will currently show, false otherwise */\nconst filters: Record<string, boolean> = {};\n\nexport function classListWillBeFiltered(classList: string): boolean {\n    for (const className of classList.split(/\\s+/)) {\n        // There might be other classes in the list besides just what we filter on\n        if (filters.hasOwnProperty(className) && !filters[className]) {\n            return true;\n        }\n    }\n    return false;\n}\n\n/**\n * Handles sidebar filtering functionality.\n */\nexport class Filter extends Component<HTMLInputElement> {\n    /**\n     * The class name & ID by which to store the filter value.\n     */\n    private readonly key: string;\n\n    /**\n     * Current filter value, to keep in sync with checkbox state.\n     */\n    private value: boolean;\n\n    constructor(options: IComponentOptions) {\n        super(options);\n        this.key = `filter-${this.el.name}`;\n        this.value = this.el.checked;\n        this.el.addEventListener(\"change\", () => {\n            this.setLocalStorage(this.el.checked);\n        });\n        this.setLocalStorage(this.fromLocalStorage());\n\n        style.innerHTML += `html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; }\\n`;\n        this.app.updateIndexVisibility();\n    }\n\n    /**\n     * Retrieve value from storage.\n     */\n    private fromLocalStorage(): boolean {\n        const fromStorage = storage.getItem(this.key);\n        return fromStorage ? fromStorage === \"true\" : this.el.checked;\n    }\n\n    /**\n     * Set value to local storage.\n     *\n     * @param value  Value to set.\n     */\n    private setLocalStorage(value: boolean): void {\n        storage.setItem(this.key, value.toString());\n        this.value = value;\n        this.handleValueChange();\n    }\n\n    /**\n     * Synchronize DOM based on value change.\n     */\n    private handleValueChange(): void {\n        this.el.checked = this.value;\n        document.documentElement.classList.toggle(this.key, this.value);\n\n        filters[`tsd-is-${this.el.name}`] = this.value;\n\n        this.app.filterChanged();\n        this.app.updateIndexVisibility();\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/components/Search.ts",
    "content": "import { debounce } from \"../utils/debounce.js\";\nimport { Index } from \"lunr\";\nimport { decompressJson } from \"../utils/decompress.js\";\nimport { openModal, setUpModal } from \"../utils/modal.js\";\nimport { classListWillBeFiltered } from \"./Filter.js\";\n\n/**\n * Keep this in sync with the interface in src/lib/output/plugins/JavascriptIndexPlugin.ts\n * It's not imported because these are separate TS projects today.\n */\ninterface SearchDocument {\n    id: number;\n\n    kind: number;\n    name: string;\n    url: string;\n    classes?: string;\n    parent?: string;\n    icon?: string | number;\n}\n\ninterface IData {\n    rows: SearchDocument[];\n    index: object;\n}\n\ndeclare global {\n    interface Window {\n        searchData?: string;\n    }\n}\n\ninterface SearchState {\n    base: string;\n    data?: IData;\n    index?: Index;\n}\n\n/** Counter to get unique IDs for options */\nlet optionsIdCounter = 0;\n\n/**\n * Populates search data into `state`, if available.\n * Removes default loading message\n */\nasync function updateIndex(state: SearchState, status: HTMLElement) {\n    if (!window.searchData) return;\n\n    const data: IData = await decompressJson(window.searchData);\n\n    state.data = data;\n    state.index = Index.load(data.index);\n\n    status.innerHTML = \"\";\n}\n\nexport function initSearch() {\n    const trigger = document.getElementById(\n        \"tsd-search-trigger\",\n    ) as HTMLButtonElement | null;\n\n    const searchEl = document.getElementById(\n        \"tsd-search\",\n    ) as HTMLDialogElement | null;\n\n    const field = document.getElementById(\n        \"tsd-search-input\",\n    ) as HTMLInputElement | null;\n\n    const results = document.getElementById(\"tsd-search-results\");\n\n    const searchScript = document.getElementById(\n        \"tsd-search-script\",\n    ) as HTMLScriptElement | null;\n\n    const status = document.getElementById(\"tsd-search-status\");\n\n    if (!(trigger && searchEl && field && results && searchScript && status)) {\n        throw new Error(\"Search controls missing\");\n    }\n\n    const state: SearchState = {\n        base: document.documentElement.dataset.base!,\n    };\n    if (!state.base.endsWith(\"/\")) {\n        state.base += \"/\";\n    }\n\n    searchScript.addEventListener(\"error\", () => {\n        const message = window.translations.search_index_not_available;\n        updateStatusEl(status, message);\n    });\n    searchScript.addEventListener(\"load\", () => {\n        updateIndex(state, status);\n    });\n    updateIndex(state, status);\n\n    bindEvents({ trigger, searchEl, results, field, status }, state);\n}\n\nfunction bindEvents(\n    elements: {\n        trigger: HTMLButtonElement;\n        searchEl: HTMLDialogElement;\n        results: HTMLElement;\n        field: HTMLInputElement;\n        status: HTMLElement;\n    },\n    state: SearchState,\n) {\n    const { field, results, searchEl, status, trigger } = elements;\n\n    setUpModal(searchEl, { closeOnClick: true });\n\n    function showSearch() {\n        openModal(searchEl);\n        field.setSelectionRange(0, field.value.length);\n    }\n\n    trigger.addEventListener(\"click\", showSearch);\n\n    field.addEventListener(\n        \"input\",\n        debounce(() => {\n            updateResults(results, field, status, state);\n        }, 200),\n    );\n\n    field.addEventListener(\"keydown\", (e) => {\n        if (\n            results.childElementCount === 0 ||\n            e.ctrlKey ||\n            e.metaKey ||\n            e.altKey\n        ) {\n            return;\n        }\n\n        // Get the visually focused element, if any\n        const currentId = field.getAttribute(\"aria-activedescendant\");\n        const current = currentId ? document.getElementById(currentId) : null;\n\n        // Remove visual focus on cursor position change\n        if (current) {\n            let verticalArrowSelection = false;\n            let cursorPosChange = false;\n            switch (e.key) {\n                case \"Home\":\n                case \"End\":\n                case \"ArrowLeft\":\n                case \"ArrowRight\":\n                    cursorPosChange = true;\n                    break;\n                case \"ArrowDown\":\n                case \"ArrowUp\":\n                    verticalArrowSelection = e.shiftKey;\n                    break;\n            }\n            if (verticalArrowSelection || cursorPosChange) {\n                removeVisualFocus(field);\n            }\n        }\n\n        if (e.shiftKey) return;\n\n        switch (e.key) {\n            case \"Enter\":\n                current?.querySelector(\"a\")?.click();\n                break;\n            case \"ArrowUp\":\n                setNextResult(results, field, current, -1);\n                e.preventDefault();\n                break;\n            case \"ArrowDown\":\n                setNextResult(results, field, current, 1);\n                e.preventDefault();\n                break;\n        }\n    });\n\n    function visualBlurHandler() {\n        removeVisualFocus(field);\n    }\n\n    field.addEventListener(\"change\", visualBlurHandler);\n    field.addEventListener(\"blur\", visualBlurHandler);\n    field.addEventListener(\"click\", visualBlurHandler);\n\n    /**\n     * Start searching by pressing slash, or Ctrl+K\n     */\n    document.body.addEventListener(\"keydown\", (e) => {\n        if (e.altKey || e.metaKey || e.shiftKey) return;\n\n        const ctrlK = e.ctrlKey && e.key === \"k\";\n        const slash = !e.ctrlKey && !isKeyboardActive() && e.key === \"/\";\n\n        if (ctrlK || slash) {\n            e.preventDefault();\n            showSearch();\n        }\n    });\n}\n\nfunction updateResults(\n    results: HTMLElement,\n    query: HTMLInputElement,\n    status: HTMLElement,\n    state: SearchState,\n) {\n    // Don't clear results if loading state is not ready,\n    // because loading or error message can be removed.\n    if (!state.index || !state.data) return;\n\n    results.innerHTML = \"\";\n    status.innerHTML = \"\";\n    optionsIdCounter += 1;\n\n    const searchText = query.value.trim();\n\n    // Perform a wildcard search\n    let res: Index.Result[];\n    if (searchText) {\n        // Create a wildcard out of space-separated words in the query,\n        // ignoring any extra spaces\n        const searchWithWildcards = searchText\n            .split(\" \")\n            .map((x) => {\n                return x.length ? `*${x}*` : \"\";\n            })\n            .join(\" \");\n\n        res = state.index\n            .search(searchWithWildcards)\n            // filter out active *filters* manually, since lunr doesn't support it.\n            .filter(({ ref }) => {\n                const classes = state.data!.rows[Number(ref)].classes;\n                return !classes || !classListWillBeFiltered(classes);\n            });\n    } else {\n        // Set empty `res` to prevent getting random results with wildcard search\n        // when the `searchText` is empty.\n        res = [];\n    }\n\n    if (res.length === 0 && searchText) {\n        const message = window.translations.search_no_results_found_for_0.replace(\n            \"{0}\",\n            ` \"<strong>${escapeHtml(searchText)}</strong>\" `,\n        );\n        updateStatusEl(status, message);\n        return;\n    }\n\n    for (let i = 0; i < res.length; i++) {\n        const item = res[i];\n        const row = state.data.rows[Number(item.ref)];\n        let boost = 1;\n\n        // boost by exact match on name\n        if (row.name.toLowerCase().startsWith(searchText.toLowerCase())) {\n            boost *= 10 / (1 + Math.abs(row.name.length - searchText.length));\n        }\n\n        item.score *= boost;\n    }\n\n    res.sort((a, b) => b.score - a.score);\n\n    const c = Math.min(10, res.length);\n    for (let i = 0; i < c; i++) {\n        const row = state.data.rows[Number(res[i].ref)];\n        const label = window.translations[`kind_${row.kind}`].replaceAll(\n            '\"',\n            \"&quot;\",\n        );\n        const icon =\n            `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" class=\"tsd-kind-icon\" aria-label=\"${label}\"><use href=\"#icon-${\n                row.icon || row.kind\n            }\"></use></svg>`;\n\n        // Highlight the matched part of the query in the search results\n        let name = highlightMatches(row.name, searchText);\n        if (globalThis.DEBUG_SEARCH_WEIGHTS) {\n            name += ` (score: ${res[i].score.toFixed(2)})`;\n        }\n        if (row.parent) {\n            name = `<span class=\"parent\">\n                ${highlightMatches(row.parent, searchText)}.</span>${name}`;\n        }\n\n        const item = document.createElement(\"li\");\n        item.id = `tsd-search:${optionsIdCounter}-${i}`;\n        item.role = \"option\";\n        item.ariaSelected = \"false\";\n        item.classList.value = row.classes ?? \"\";\n\n        const anchor = document.createElement(\"a\");\n        // Make links unfocusable inside option\n        anchor.tabIndex = -1;\n        anchor.href = state.base + row.url;\n        anchor.innerHTML = icon + `<span class=\"text\">${name}</span>`;\n        item.append(anchor);\n\n        results.appendChild(item);\n    }\n}\n\n/**\n * Move the highlight within the result set.\n */\nfunction setNextResult(\n    results: HTMLElement,\n    field: HTMLInputElement,\n    current: Element | null,\n    dir: 1 | -1,\n) {\n    let next: Element | null;\n    // If there's no active descendant, select the first or last\n    if (dir === 1) {\n        next = current?.nextElementSibling || results.firstElementChild;\n    } else {\n        next = current?.previousElementSibling || results.lastElementChild;\n    }\n\n    // When only one child is present.\n    if (next === current) return;\n\n    // bad markup\n    if (!next || next.role !== \"option\") {\n        console.error(\"Option missing\");\n        return;\n    }\n\n    next.ariaSelected = \"true\";\n    next.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n    field.setAttribute(\"aria-activedescendant\", next.id);\n    current?.setAttribute(\"aria-selected\", \"false\");\n}\n\nfunction removeVisualFocus(field: HTMLInputElement) {\n    const currentId = field.getAttribute(\"aria-activedescendant\");\n    const current = currentId ? document.getElementById(currentId) : null;\n\n    current?.setAttribute(\"aria-selected\", \"false\");\n    field.setAttribute(\"aria-activedescendant\", \"\");\n}\n\nfunction highlightMatches(text: string, search: string) {\n    if (search === \"\") {\n        return text;\n    }\n\n    const lowerText = text.toLocaleLowerCase();\n    const lowerSearch = search.toLocaleLowerCase();\n\n    const parts: string[] = [];\n    let lastIndex = 0;\n    let index = lowerText.indexOf(lowerSearch);\n    while (index != -1) {\n        parts.push(\n            escapeHtml(text.substring(lastIndex, index)),\n            `<mark>${\n                escapeHtml(\n                    text.substring(index, index + lowerSearch.length),\n                )\n            }</mark>`,\n        );\n\n        lastIndex = index + lowerSearch.length;\n        index = lowerText.indexOf(lowerSearch, lastIndex);\n    }\n\n    parts.push(escapeHtml(text.substring(lastIndex)));\n\n    return parts.join(\"\");\n}\n\nconst SPECIAL_HTML = {\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    \"'\": \"&#039;\",\n    '\"': \"&quot;\",\n} as const;\n\nfunction escapeHtml(text: string) {\n    return text.replace(\n        /[&<>\"'\"]/g,\n        (match) => SPECIAL_HTML[match as keyof typeof SPECIAL_HTML],\n    );\n}\n\n/**\n * Updates the status element, with aria-live attribute, which should be announced to the user.\n * @param message Message to set as **innerHTML** in a wrapper element, if not empty.\n */\nfunction updateStatusEl(status: HTMLElement, message: string) {\n    status.innerHTML = message ? `<div>${message}</div>` : \"\";\n}\n\n/**\n * <input /> that don't take printable character input from keyboard,\n * to avoid catching \"/\" when active.\n *\n * based on [MDN: input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#input_types)\n */\nconst inputWithoutKeyboard = [\n    \"button\",\n    \"checkbox\",\n    \"file\",\n    \"hidden\",\n    \"image\",\n    \"radio\",\n    \"range\",\n    \"reset\",\n    \"submit\",\n];\n\n/** Checks whether keyboard is active, i.e. an input is focused */\nfunction isKeyboardActive() {\n    const activeElement = document.activeElement as HTMLElement | null;\n    if (!activeElement) return false;\n\n    if (\n        activeElement.isContentEditable ||\n        activeElement.tagName === \"TEXTAREA\" ||\n        activeElement.tagName === \"SEARCH\"\n    ) {\n        return true;\n    }\n\n    return (\n        activeElement.tagName === \"INPUT\" &&\n        !inputWithoutKeyboard.includes((activeElement as HTMLInputElement).type)\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/components/Toggle.ts",
    "content": "import { Component, IComponentOptions } from \"../Component.js\";\nimport { hasPointerMoved, pointerDown, pointerUp } from \"../utils/pointer.js\";\n\nexport class Toggle extends Component {\n    active?: boolean;\n\n    className: string;\n\n    constructor(options: IComponentOptions) {\n        super(options);\n\n        this.className = this.el.dataset[\"toggle\"] || \"\";\n        this.el.addEventListener(pointerUp, (e) => this.onPointerUp(e));\n        this.el.addEventListener(\"click\", (e) => e.preventDefault());\n        document.addEventListener(pointerDown, (e) => this.onDocumentPointerDown(e));\n        document.addEventListener(pointerUp, (e) => this.onDocumentPointerUp(e));\n    }\n\n    setActive(value: boolean) {\n        if (this.active == value) return;\n        this.active = value;\n\n        document.documentElement.classList.toggle(\n            \"has-\" + this.className,\n            value,\n        );\n        this.el.classList.toggle(\"active\", value);\n\n        const transition = (this.active ? \"to-has-\" : \"from-has-\") + this.className;\n        document.documentElement.classList.add(transition);\n        setTimeout(\n            () => document.documentElement.classList.remove(transition),\n            500,\n        );\n    }\n\n    onPointerUp(event: Event) {\n        if (hasPointerMoved) return;\n        this.setActive(true);\n        event.preventDefault();\n    }\n\n    onDocumentPointerDown(e: Event) {\n        if (this.active) {\n            if (\n                (e.target as HTMLElement).closest(\n                    \".col-sidebar, .tsd-filter-group\",\n                )\n            ) {\n                return;\n            }\n\n            this.setActive(false);\n        }\n    }\n\n    onDocumentPointerUp(e: Event) {\n        if (hasPointerMoved) return;\n        if (this.active) {\n            if ((e.target as HTMLElement).closest(\".col-sidebar\")) {\n                const link = (e.target as HTMLElement).closest(\"a\");\n                if (link) {\n                    let href = window.location.href;\n                    if (href.indexOf(\"#\") != -1) {\n                        href = href.substring(0, href.indexOf(\"#\"));\n                    }\n                    if (link.href.substring(0, href.length) == href) {\n                        setTimeout(() => this.setActive(false), 250);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/utils/debounce.ts",
    "content": "export const debounce = (fn: () => void, wait: number = 100) => {\n    let timeout: ReturnType<typeof setTimeout>;\n    return () => {\n        clearTimeout(timeout);\n        timeout = setTimeout(() => fn(), wait);\n    };\n};\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/utils/decompress.ts",
    "content": "/**\n * Decompresses Base64-encoded deflate compressed data and parses it into a JSON object.\n *\n * @param base64 - The Base64-encoded string representing the deflate-compressed JSON string.\n * @returns A promise that resolves to the parsed JSON object.\n */\nexport async function decompressJson(base64: string) {\n    const binaryData = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n    const blob = new Blob([binaryData]);\n    const decompressedStream = blob\n        .stream()\n        .pipeThrough(new DecompressionStream(\"deflate\"));\n    const decompressedText = await new Response(decompressedStream).text();\n    return JSON.parse(decompressedText);\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/utils/modal.ts",
    "content": "/**\n * @module\n *\n * Browsers allow scrolling of page with native dialog, which is a UX issue.\n *\n * `@starting-style` and `overlay` aren't well supported in FF, and only available in latest versions of chromium,\n * hence, a custom overlay workaround is required.\n *\n * Workaround:\n *\n * - Append a custom overlay element (a div) to `document.body`,\n *   this does **NOT** handle nested modals,\n *   as the overlay div cannot be in the top layer, which wouldn't overshadow the parent modal.\n *\n * - Add exit animation on dialog and overlay, without actually closing them\n * - Listen for `animationend` event, and close the modal immediately\n *\n * @see\n * - The \"[right](https://frontendmasters.com/blog/animating-dialog/)\" way to animate modals\n * - [Workaround](https://github.com/whatwg/html/issues/7732#issuecomment-2437820350) to prevent background scrolling\n */\n\n// Constants\nconst CLOSING_CLASS = \"closing\";\nconst OVERLAY_ID = \"tsd-overlay\";\n\n/** Fills the gap that scrollbar occupies. Call when the modal is opened */\nfunction hideScrollbar() {\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n    // Should be computed *before* body overflow is set to hidden\n    const width = Math.abs(\n        window.innerWidth - document.documentElement.clientWidth,\n    );\n\n    document.body.style.overflow = \"hidden\";\n\n    // Give padding to element to balance the hidden scrollbar width\n    document.body.style.paddingRight = `${width}px`;\n}\n\n/** Resets style changes made by {@link hideScrollbar} */\nfunction resetScrollbar() {\n    document.body.style.removeProperty(\"overflow\");\n    document.body.style.removeProperty(\"padding-right\");\n}\n\ntype Modal = HTMLDialogElement;\n\n/**\n * Must be called to setup a modal element properly for entry and exit side-effects.\n *\n * Adds event listeners to the modal element, for the closing animation.\n *\n * Adds workaround to fix scrolling issues caused by default browser behavior.\n *\n * **Note**:\n * - Do not use native `show`, `showModal` or `close` methods when using this.\n * - `cancel` event is overridden.\n *\n * @param options Configure modal behavior\n * @param options.closeOnEsc Defaults to true\n * @param options.closeOnClick Closes modal when clicked on overlay, defaults to false.\n */\nexport function setUpModal(\n    modal: Modal,\n    options?: {\n        closeOnEsc?: boolean;\n        closeOnClick?: boolean;\n    },\n) {\n    // Event listener for closing animation\n    // Closes the modal on *any* animation if it has the CLOSING_CLASS\n    // If another animation is needed, make the animation longer than the actual closing animation\n    modal.addEventListener(\"animationend\", () => {\n        if (!modal.classList.contains(CLOSING_CLASS)) return;\n\n        modal.classList.remove(CLOSING_CLASS);\n        document.getElementById(OVERLAY_ID)?.remove();\n        modal.close();\n        resetScrollbar();\n    });\n\n    // Override modal cancel behavior, hopefully all browsers have same behavior\n    // > When a `<dialog>` is dismissed with the `Esc` key, both the `cancel` and `close` events are fired.\n    // https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/cancel_event\n    modal.addEventListener(\"cancel\", (e) => {\n        e.preventDefault();\n        closeModal(modal);\n    });\n\n    if (options?.closeOnClick) {\n        document.addEventListener(\n            \"click\",\n            (e) => {\n                if (modal.open && !modal.contains(e.target as HTMLElement)) {\n                    closeModal(modal);\n                }\n            },\n            true, // Disable invoking this handler in bubbling phase\n        );\n    }\n}\n\n/** Opens modal and adds overlay */\nexport function openModal(modal: Modal) {\n    if (modal.open) return;\n\n    const overlay = document.createElement(\"div\");\n    overlay.id = OVERLAY_ID;\n    document.body.appendChild(overlay);\n\n    modal.showModal();\n    hideScrollbar();\n}\n\n/** Initiates modal closing */\nexport function closeModal(modal: Modal) {\n    if (!modal.open) return;\n    const overlay = document.getElementById(OVERLAY_ID);\n    overlay?.classList.add(CLOSING_CLASS);\n    modal.classList.add(CLOSING_CLASS);\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/utils/pointer.ts",
    "content": "/**\n * Simple point interface.\n */\nexport interface Point {\n    x: number;\n    y: number;\n}\n\n/**\n * Event name of the pointer down event.\n */\nexport let pointerDown: string = \"mousedown\";\n\n/**\n * Event name of the pointer move event.\n */\nexport let pointerMove: string = \"mousemove\";\n\n/**\n * Event name of the pointer up event.\n */\nexport let pointerUp: string = \"mouseup\";\n\n/**\n * Position the pointer was pressed at.\n */\nexport const pointerDownPosition: Point = { x: 0, y: 0 };\n\n/**\n * Should the next click on the document be suppressed?\n */\nexport let preventNextClick: boolean = false;\n\n/**\n * Is the pointer down?\n */\nexport let isPointerDown: boolean = false;\n\n/**\n * Is the pointer a touch point?\n */\nexport let isPointerTouch: boolean = false;\n\n/**\n * Did the pointer move since the last down event?\n */\nexport let hasPointerMoved: boolean = false;\n\n/**\n * Is the user agent a mobile agent?\n */\nexport const isMobile: boolean = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n    navigator.userAgent,\n);\ndocument.documentElement.classList.add(isMobile ? \"is-mobile\" : \"not-mobile\");\n\nif (isMobile && \"ontouchstart\" in document.documentElement) {\n    isPointerTouch = true;\n    pointerDown = \"touchstart\";\n    pointerMove = \"touchmove\";\n    pointerUp = \"touchend\";\n}\n\ndocument.addEventListener(pointerDown, (e) => {\n    isPointerDown = true;\n    hasPointerMoved = false;\n    const t = pointerDown == \"touchstart\"\n        ? (e as TouchEvent).targetTouches[0]\n        : (e as MouseEvent);\n    pointerDownPosition.y = t.pageY || 0;\n    pointerDownPosition.x = t.pageX || 0;\n});\n\ndocument.addEventListener(pointerMove, (e) => {\n    if (!isPointerDown) return;\n    if (!hasPointerMoved) {\n        const t = pointerDown == \"touchstart\"\n            ? (e as TouchEvent).targetTouches[0]\n            : (e as MouseEvent);\n        const x = pointerDownPosition.x - (t.pageX || 0);\n        const y = pointerDownPosition.y - (t.pageY || 0);\n        hasPointerMoved = Math.sqrt(x * x + y * y) > 10;\n    }\n});\n\ndocument.addEventListener(pointerUp, () => {\n    isPointerDown = false;\n});\n\ndocument.addEventListener(\"click\", (e) => {\n    if (preventNextClick) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        preventNextClick = false;\n    }\n});\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/utils/storage.ts",
    "content": "// This exists to abstract away the horrible fact that accessing localStorage can throw\n// an exception depending on a user's browser settings. Can't even check typeof localStorage\n// so we're stuck with a try..catch.\n\nexport interface MinimalStorage {\n    getItem(key: string): string | null;\n    setItem(key: string, value: string): void;\n}\n\nlet _storage: MinimalStorage;\n\nconst noOpStorageImpl: MinimalStorage = {\n    getItem() {\n        return null;\n    },\n    setItem() {},\n};\n\nlet localStorageImpl: MinimalStorage;\n\ntry {\n    localStorageImpl = localStorage;\n    _storage = localStorageImpl;\n} catch {\n    localStorageImpl = noOpStorageImpl;\n    _storage = noOpStorageImpl;\n}\n\nexport const storage = {\n    getItem: (key: string) => _storage.getItem(key),\n    setItem: (key: string, value: string) => _storage.setItem(key, value),\n    disableWritingLocalStorage() {\n        _storage = noOpStorageImpl;\n    },\n    disable() {\n        localStorage.clear();\n        _storage = noOpStorageImpl;\n    },\n    enable() {\n        _storage = localStorageImpl;\n    },\n};\n"
  },
  {
    "path": "src/lib/output/themes/default/assets/typedoc/utils/throttle.ts",
    "content": "export const throttle = <A extends any[]>(\n    fn: (...args: A) => void,\n    wait = 100,\n) => {\n    let time = Date.now();\n    return (...args: A) => {\n        if (time + wait - Date.now() < 0) {\n            fn(...args);\n            time = Date.now();\n        }\n    };\n};\n"
  },
  {
    "path": "src/lib/output/themes/default/layouts/default.tsx",
    "content": "import type { RenderTemplate } from \"../../../index.js\";\nimport type { Reflection } from \"../../../../models/index.js\";\nimport { JSX } from \"#utils\";\nimport type { PageEvent } from \"../../../events.js\";\nimport { getDisplayName, getHierarchyRoots } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { extname } from \"path\";\n\nfunction favicon(context: DefaultThemeRenderContext) {\n    const fav = context.options.getValue(\"favicon\");\n    if (!fav) return null;\n\n    if (/^https?:\\/\\//i.test(fav)) {\n        return <link rel=\"icon\" href={fav} />;\n    }\n\n    switch (extname(fav)) {\n        case \".ico\":\n            return <link rel=\"icon\" href={context.relativeURL(\"assets/favicon.ico\", true)} />;\n        case \".png\":\n            return <link rel=\"icon\" href={context.relativeURL(\"assets/favicon.png\", true)} type=\"image/png\" />;\n        case \".svg\":\n            return <link rel=\"icon\" href={context.relativeURL(\"assets/favicon.svg\", true)} type=\"image/svg+xml\" />;\n        default:\n            return null;\n    }\n}\n\n// See #2760\nfunction buildSiteMetadata(context: DefaultThemeRenderContext) {\n    try {\n        // We have to know where we are hosted in order to generate this block\n        const url = new URL(context.options.getValue(\"hostedBaseUrl\"));\n\n        // No point in generating this if we aren't the root page on the site\n        if (url.pathname !== \"/\") {\n            return null;\n        }\n\n        return (\n            <script type=\"application/ld+json\">\n                <JSX.Raw\n                    html={JSON.stringify({\n                        \"@context\": \"https://schema.org\",\n                        \"@type\": \"WebSite\",\n                        name: context.model.project.name,\n                        url: url.toString(),\n                    })}\n                />\n            </script>\n        );\n    } catch {\n        return null;\n    }\n}\n\nexport const defaultLayout = (\n    context: DefaultThemeRenderContext,\n    template: RenderTemplate<PageEvent<Reflection>>,\n    props: PageEvent<Reflection>,\n) => (\n    <html class=\"default\" lang={context.options.getValue(\"lang\")} data-base={context.relativeURL(\"./\")}>\n        <head>\n            <meta charset=\"utf-8\" />\n            {context.hook(\"head.begin\", context)}\n            <meta http-equiv=\"x-ua-compatible\" content=\"IE=edge\" />\n            <title>\n                {props.model.isProject()\n                    ? getDisplayName(props.model)\n                    : `${getDisplayName(props.model)} | ${getDisplayName(props.project)}`}\n            </title>\n            {favicon(context)}\n            {props.url === \"index.html\" && buildSiteMetadata(context)}\n            <meta name=\"description\" content={\"Documentation for \" + props.project.name} />\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n            <link rel=\"stylesheet\" href={context.relativeURL(\"assets/style.css\", true)} />\n            <link rel=\"stylesheet\" href={context.relativeURL(\"assets/highlight.css\", true)} />\n            {context.options.getValue(\"customCss\") && (\n                <link rel=\"stylesheet\" href={context.relativeURL(\"assets/custom.css\", true)} />\n            )}\n            <script defer src={context.relativeURL(\"assets/main.js\", true)}></script>\n            {context.options.getValue(\"customJs\") && (\n                <script defer src={context.relativeURL(\"assets/custom.js\", true)}></script>\n            )}\n            <script async src={context.relativeURL(\"assets/icons.js\", true)} id=\"tsd-icons-script\"></script>\n            <script async src={context.relativeURL(\"assets/search.js\", true)} id=\"tsd-search-script\"></script>\n            <script async src={context.relativeURL(\"assets/navigation.js\", true)} id=\"tsd-nav-script\"></script>\n            {!!getHierarchyRoots(props.project).length && (\n                <script async src={context.relativeURL(\"assets/hierarchy.js\", true)} id=\"tsd-hierarchy-script\"></script>\n            )}\n            {context.hook(\"head.end\", context)}\n        </head>\n        <body>\n            {context.hook(\"body.begin\", context)}\n            <script>\n                <JSX.Raw html='document.documentElement.dataset.theme = localStorage.getItem(\"tsd-theme\") || \"os\";' />\n                {/* Hide the entire page for up to 0.5 seconds so that if navigating between pages on a fast */}\n                {/* device the navigation pane doesn't appear to flash if it loads just after the page displays. */}\n                {/* This could still happen if we're unlucky, but from experimenting with Firefox's throttling */}\n                {/* settings, this appears to be a reasonable tradeoff between displaying page content without the */}\n                {/* navigation on exceptionally slow connections and not having the navigation obviously repaint. */}\n                <JSX.Raw html='document.body.style.display=\"none\";' />\n                <JSX.Raw html='setTimeout(() => window.app?app.showPage():document.body.style.removeProperty(\"display\"),500)' />\n            </script>\n            {context.toolbar(props)}\n\n            <div class=\"container container-main\">\n                <div class=\"col-content\">\n                    {context.hook(\"content.begin\", context)}\n                    {context.header(props)}\n                    {template(props)}\n                    {context.hook(\"content.end\", context)}\n                </div>\n                <div class=\"col-sidebar\">\n                    <div class=\"page-menu\">\n                        {context.hook(\"pageSidebar.begin\", context)}\n                        {context.pageSidebar(props)}\n                        {context.hook(\"pageSidebar.end\", context)}\n                    </div>\n                    <div class=\"site-menu\">\n                        {context.hook(\"sidebar.begin\", context)}\n                        {context.sidebar(props)}\n                        {context.hook(\"sidebar.end\", context)}\n                    </div>\n                </div>\n            </div>\n\n            {context.footer()}\n\n            <div class=\"overlay\"></div>\n\n            {context.hook(\"body.end\", context)}\n        </body>\n    </html>\n);\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/anchor-icon.tsx",
    "content": "import type { Reflection } from \"../../../../models/index.js\";\nimport { i18n, JSX } from \"#utils\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nexport function anchorIcon(context: DefaultThemeRenderContext, anchor: string | undefined) {\n    if (!anchor) return <></>;\n\n    return (\n        <a href={`#${anchor}`} aria-label={i18n.theme_permalink()} class=\"tsd-anchor-icon\">\n            {context.icons.anchor()}\n        </a>\n    );\n}\n\nexport function anchorTargetIfPresent(context: DefaultThemeRenderContext, refl: Reflection) {\n    return context.router.hasUrl(refl) ? context.router.getAnchor(refl) : undefined;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/breadcrumb.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { JSX } from \"#utils\";\nimport type { Reflection } from \"../../../../models/index.js\";\n\nexport function breadcrumbs(context: DefaultThemeRenderContext, props: Reflection): JSX.Element {\n    const path: Reflection[] = [];\n    let refl: Reflection = props;\n    while (refl.parent) {\n        path.push(refl);\n        refl = refl.parent;\n    }\n\n    return (\n        <ul class=\"tsd-breadcrumb\" aria-label=\"Breadcrumb\">\n            {path.reverse().map((r, index) => (\n                <li>\n                    <a href={context.urlTo(r)} aria-current={index === path.length - 1 ? \"page\" : undefined}>\n                        {r.name}\n                    </a>\n                </li>\n            ))}\n        </ul>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/comment.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { JSX, translateTagName } from \"#utils\";\nimport { type CommentDisplayPart, type Reflection, ReflectionKind } from \"../../../../models/index.js\";\nimport { anchorIcon } from \"./anchor-icon.js\";\nimport { join } from \"../../lib.js\";\n\n// Note: Comment modifiers are handled in `renderFlags`\n\nexport function renderDisplayParts(\n    { markdown }: DefaultThemeRenderContext,\n    parts: readonly CommentDisplayPart[] | undefined,\n) {\n    if (!parts?.length) return;\n\n    return (\n        <div class=\"tsd-comment tsd-typography\">\n            <JSX.Raw html={markdown(parts)} />\n        </div>\n    );\n}\n\nexport function commentShortSummary(context: DefaultThemeRenderContext, props: Reflection) {\n    let shortSummary: readonly CommentDisplayPart[] | undefined;\n    if (props.isDocument()) {\n        if (typeof props.frontmatter[\"summary\"] === \"string\") {\n            shortSummary = [{ kind: \"text\", text: props.frontmatter[\"summary\"] }];\n        }\n    } else {\n        shortSummary = props.comment?.getShortSummary(context.options.getValue(\"useFirstParagraphOfCommentAsSummary\"));\n    }\n\n    if (!shortSummary?.length && props.isDeclaration() && props.signatures?.length) {\n        return commentShortSummary(context, props.signatures[0]);\n    }\n\n    if (!shortSummary?.some((part) => part.text)) return;\n\n    return context.displayParts(shortSummary);\n}\n\nexport function commentSummary(context: DefaultThemeRenderContext, props: Reflection) {\n    if (props.comment?.summary.some((part) => part.text)) {\n        return context.displayParts(props.comment.summary);\n    }\n\n    const target = (props.isDeclaration() || props.isParameter()) && props.type?.type === \"reference\"\n        ? props.type.reflection\n        : undefined;\n\n    if (target?.comment?.hasModifier(\"@expand\") && target?.comment?.summary.some((part) => part.text)) {\n        return context.displayParts(target.comment.summary);\n    }\n}\n\nexport function commentTags(context: DefaultThemeRenderContext, props: Reflection) {\n    if (!props.comment) return;\n\n    const skipSave = props.comment.blockTags.map((tag) => tag.skipRendering);\n\n    const skippedTags = context.options.getValue(\"notRenderedTags\");\n    const beforeTags = context.hook(\"comment.beforeTags\", context, props.comment, props);\n    const afterTags = context.hook(\"comment.afterTags\", context, props.comment, props);\n\n    const tags = props.kindOf(ReflectionKind.SomeSignature)\n        ? props.comment.blockTags.filter(\n            (tag) => tag.tag !== \"@returns\" && !tag.skipRendering && !skippedTags.includes(tag.tag),\n        )\n        : props.comment.blockTags.filter((tag) => !tag.skipRendering && !skippedTags.includes(tag.tag));\n\n    skipSave.forEach((skip, i) => (props.comment!.blockTags[i].skipRendering = skip));\n\n    const tagsContents = tags.map((item) => {\n        const name = item.name\n            ? `${translateTagName(item.tag)}: ${item.name}`\n            : translateTagName(item.tag);\n\n        const anchor = context.slugger.slug(name);\n\n        return (\n            <>\n                <div class={`tsd-tag-${item.tag.substring(1)}`}>\n                    <h4 class=\"tsd-anchor-link\" id={anchor}>\n                        {name}\n                        {anchorIcon(context, anchor)}\n                    </h4>\n                    {item.typeAnnotation && <span class=\"tsd-type-annotation\">{item.typeAnnotation}</span>}\n                    <JSX.Raw html={context.markdown(item.content)} />\n                </div>\n            </>\n        );\n    });\n\n    return (\n        <>\n            {beforeTags}\n            {tagsContents.length > 0 && (\n                <div class=\"tsd-comment tsd-typography\">\n                    {tagsContents}\n                </div>\n            )}\n            {afterTags}\n        </>\n    );\n}\n\nexport function reflectionFlags(context: DefaultThemeRenderContext, props: Reflection) {\n    const flagsNotRendered = context.options.getValue(\"notRenderedTags\");\n    const allFlags = props.flags.getFlagStrings();\n    if (props.comment) {\n        for (const tag of props.comment.modifierTags) {\n            if (!flagsNotRendered.includes(tag)) {\n                allFlags.push(translateTagName(tag));\n            }\n        }\n    }\n\n    return join(\" \", allFlags, (item) => <code class=\"tsd-tag\">{item}</code>);\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/footer.tsx",
    "content": "import { i18n, JSX } from \"#utils\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nexport function footer(context: DefaultThemeRenderContext) {\n    const hideGenerator = context.options.getValue(\"hideGenerator\");\n    let generatorDisplay = <></>;\n    if (!hideGenerator) {\n        const message = i18n.theme_generated_using_typedoc();\n\n        // Only handles one occurrence, but that's all I expect...\n        const index = message.indexOf(\"TypeDoc\");\n        if (index == -1) {\n            generatorDisplay = <p class=\"tsd-generator\">{message}</p>;\n        } else {\n            const pre = message.substring(0, index);\n            const post = message.substring(index + \"TypeDoc\".length);\n            generatorDisplay = (\n                <p class=\"tsd-generator\">\n                    {pre}\n                    <a href=\"https://typedoc.org/\" target=\"_blank\">\n                        TypeDoc\n                    </a>\n                    {post}\n                </p>\n            );\n        }\n    }\n\n    const customFooterHtml = context.options.getValue(\"customFooterHtml\");\n    let customFooterDisplay = <></>;\n    if (customFooterHtml) {\n        if (context.options.getValue(\"customFooterHtmlDisableWrapper\")) {\n            customFooterDisplay = <JSX.Raw html={customFooterHtml} />;\n        } else {\n            customFooterDisplay = (\n                <p>\n                    <JSX.Raw html={customFooterHtml} />\n                </p>\n            );\n        }\n    }\n\n    return (\n        <footer>\n            {context.hook(\"footer.begin\", context)}\n            {generatorDisplay}\n            {customFooterDisplay}\n            {context.hook(\"footer.end\", context)}\n        </footer>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/header.tsx",
    "content": "import { classNames, getDisplayName, hasTypeParameters, join } from \"../../lib.js\";\nimport { JSX } from \"#utils\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport type { PageEvent } from \"../../../events.js\";\nimport { type Reflection, ReflectionKind } from \"../../../../models/index.js\";\n\nexport const header = (context: DefaultThemeRenderContext, props: PageEvent<Reflection>) => {\n    const opts = context.options.getValue(\"headings\");\n\n    // Don't render on the index page or the class hierarchy page\n    // We should probably someday render on the class hierarchy page, but currently breadcrumbs\n    // are entirely dependent on the reflection hierarchy, so it doesn't make sense today.\n    const renderBreadcrumbs = props.url !== \"index.html\" && props.url !== \"hierarchy.html\";\n\n    // Titles are always rendered on DeclarationReflection pages and the modules page for the project.\n    // They are also rendered on the readme + document pages if configured to do so by the user.\n    let renderTitle: boolean;\n    let titleKindString = \"\";\n    if (props.model.isProject()) {\n        if (props.url === \"index.html\" && props.model.readme?.length) {\n            renderTitle = opts.readme;\n        } else {\n            renderTitle = true;\n        }\n    } else if (props.model.isDocument()) {\n        renderTitle = opts.document;\n    } else {\n        renderTitle = true;\n        titleKindString = ReflectionKind.singularString(props.model.kind) + \" \";\n    }\n\n    return (\n        <div class=\"tsd-page-title\">\n            {renderBreadcrumbs && context.breadcrumbs(props.model)}\n            {renderTitle && (\n                <h1 class={classNames({ deprecated: props.model.isDeprecated() })}>\n                    {titleKindString}\n                    {getDisplayName(props.model)}\n                    {hasTypeParameters(props.model) && (\n                        <>\n                            {\"<\"}\n                            {join(\", \", props.model.typeParameters, (item) => item.name)}\n                            {\">\"}\n                        </>\n                    )}\n                    {context.reflectionFlags(props.model)}\n                </h1>\n            )}\n        </div>\n    );\n};\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/hierarchy.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { i18n, JSX } from \"#utils\";\nimport type { DeclarationHierarchy, Type } from \"../../../../models/index.js\";\n\nconst isLinkedReferenceType = (type: Type) =>\n    type.visit({\n        reference: (ref) => ref.reflection !== undefined,\n    }) ?? false;\n\nfunction hasAnyLinkedReferenceType(h: DeclarationHierarchy | undefined): boolean {\n    if (!h) return false;\n\n    if (!h.isTarget && h.types.some(isLinkedReferenceType)) return true;\n\n    return hasAnyLinkedReferenceType(h.next);\n}\n\nexport function hierarchy(context: DefaultThemeRenderContext, typeHierarchy: DeclarationHierarchy | undefined) {\n    if (!typeHierarchy) return;\n\n    const summaryLink = context.options.getValue(\"includeHierarchySummary\") && hasAnyLinkedReferenceType(typeHierarchy)\n        ? (\n            <>\n                {\" \"}\n                (\n                <a href={context.relativeURL(\"hierarchy.html\") + \"#\" + context.model.getFullName()}>\n                    {i18n.theme_hierarchy_view_summary()}\n                </a>\n                )\n            </>\n        )\n        : <></>;\n\n    return (\n        <section class=\"tsd-panel tsd-hierarchy\" data-refl={context.model.id}>\n            <h4>\n                {i18n.theme_hierarchy()}\n                {summaryLink}\n            </h4>\n\n            {hierarchyList(context, typeHierarchy)}\n        </section>\n    );\n}\n\nfunction hierarchyList(context: DefaultThemeRenderContext, props: DeclarationHierarchy) {\n    return (\n        <ul class=\"tsd-hierarchy\">\n            {props.types.map((item, i, l) => (\n                <li class=\"tsd-hierarchy-item\">\n                    {props.isTarget ? <span class=\"tsd-hierarchy-target\">{item.toString()}</span> : context.type(item)}\n                    {i === l.length - 1 && !!props.next && hierarchyList(context, props.next)}\n                </li>\n            ))}\n        </ul>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/icon.tsx",
    "content": "// The alert icons in this file were taken from https://github.com/primer/octicons\n// which is under a MIT license https://github.com/primer/octicons/blob/main/LICENSE\n\nimport assert from \"assert\";\nimport { ReflectionKind } from \"../../../../models/index.js\";\nimport { i18n, JSX, type TranslatedString } from \"#utils\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nconst kindIcon = (letterPath: JSX.Element, color: string, label: TranslatedString, circular = false) => (\n    <svg class=\"tsd-kind-icon\" viewBox=\"0 0 24 24\" aria-label={label}>\n        <rect\n            fill=\"var(--color-icon-background)\"\n            stroke={color}\n            stroke-width=\"1.5\"\n            x=\"1\"\n            y=\"1\"\n            width=\"22\"\n            height=\"22\"\n            rx={circular ? \"12\" : \"6\"}\n        />\n        {letterPath}\n    </svg>\n);\n\nconst textIcon = (letter: string, color: string, label: TranslatedString, circular = false) =>\n    kindIcon(\n        <text fill=\"var(--color-icon-text)\" x=\"50%\" y=\"50%\" dy=\"0.35em\" text-anchor=\"middle\">\n            {letter}\n        </text>,\n        color,\n        label,\n        circular,\n    );\n\nexport function buildRefIcons(icons: Icons, context: DefaultThemeRenderContext): Icons {\n    const refs: Record<string, () => JSX.Element> = {};\n\n    for (const [name, builder] of Object.entries(icons)) {\n        const jsx = builder.call(icons);\n        assert(jsx.tag === \"svg\", \"TypeDoc's frontend assumes that icons are written as svg elements\");\n        // This one cannot be cached because the CSS selector depends on targeting SVG elements\n        // within it. Ick. Surely there's a nicer way?\n        if (name === \"checkbox\") {\n            refs[name] = () => jsx;\n            continue;\n        }\n\n        const ref = (\n            <svg {...jsx.props} id={undefined}>\n                <use href={`${context.relativeURL(\"assets/icons.svg\")}#icon-${name}`} />\n            </svg>\n        );\n        refs[name] = () => ref;\n    }\n\n    return refs as unknown as Icons;\n}\n\nexport interface Icons extends Record<ReflectionKind, () => JSX.Element> {\n    chevronDown(): JSX.Element;\n    checkbox(): JSX.Element;\n    menu(): JSX.Element;\n    search(): JSX.Element;\n    /** @deprecated */\n    chevronSmall(): JSX.Element;\n    anchor(): JSX.Element;\n    folder(): JSX.Element;\n    alertNote(): JSX.Element;\n    alertTip(): JSX.Element;\n    alertImportant(): JSX.Element;\n    alertWarning(): JSX.Element;\n    alertCaution(): JSX.Element;\n}\n\nexport function getIcons(): Icons {\n    return {\n        [ReflectionKind.Accessor]: () => textIcon(\"A\", \"var(--color-ts-accessor)\", i18n.kind_accessor(), true),\n        [ReflectionKind.CallSignature]() {\n            return this[ReflectionKind.Function]();\n        },\n        [ReflectionKind.Class]: () => textIcon(\"C\", \"var(--color-ts-class)\", i18n.kind_class()),\n        [ReflectionKind.Constructor]: () => textIcon(\"C\", \"var(--color-ts-constructor)\", i18n.kind_constructor(), true),\n        [ReflectionKind.ConstructorSignature]() {\n            return this[ReflectionKind.Constructor]();\n        },\n        [ReflectionKind.Enum]: () => textIcon(\"E\", \"var(--color-ts-enum)\", i18n.kind_enum()),\n        [ReflectionKind.EnumMember]: () => textIcon(\"P\", \"var(--color-ts-property)\", i18n.kind_enum_member(), true),\n        [ReflectionKind.Function]: () => textIcon(\"F\", \"var(--color-ts-function)\", i18n.kind_function()),\n        [ReflectionKind.GetSignature]() {\n            return this[ReflectionKind.Accessor]();\n        },\n        [ReflectionKind.IndexSignature]: () =>\n            textIcon(\"P\", \"var(--color-ts-property)\", i18n.kind_index_signature(), true),\n        [ReflectionKind.Interface]: () => textIcon(\"I\", \"var(--color-ts-interface)\", i18n.kind_interface()),\n        [ReflectionKind.Method]: () => textIcon(\"M\", \"var(--color-ts-method)\", i18n.kind_method(), true),\n        [ReflectionKind.Module]: () => textIcon(\"M\", \"var(--color-ts-module)\", i18n.kind_module()),\n        [ReflectionKind.Namespace]: () => textIcon(\"N\", \"var(--color-ts-namespace)\", i18n.kind_namespace()),\n        [ReflectionKind.Parameter]() {\n            return this[ReflectionKind.Property]();\n        },\n        [ReflectionKind.Project]() {\n            return this[ReflectionKind.Module]();\n        },\n        [ReflectionKind.Property]: () => textIcon(\"P\", \"var(--color-ts-property)\", i18n.kind_property(), true),\n        [ReflectionKind.Reference]: () => textIcon(\"R\", \"var(--color-ts-reference)\", i18n.kind_reference(), true),\n        [ReflectionKind.SetSignature]() {\n            return this[ReflectionKind.Accessor]();\n        },\n        [ReflectionKind.TypeAlias]: () => textIcon(\"T\", \"var(--color-ts-type-alias)\", i18n.kind_type_alias()),\n        [ReflectionKind.TypeLiteral]() {\n            return this[ReflectionKind.TypeAlias]();\n        },\n        [ReflectionKind.TypeParameter]() {\n            return this[ReflectionKind.TypeAlias]();\n        },\n        [ReflectionKind.Variable]: () => textIcon(\"V\", \"var(--color-ts-variable)\", i18n.kind_variable()),\n        [ReflectionKind.Document]: () =>\n            kindIcon(\n                <g stroke=\"var(--color-icon-text)\" fill=\"none\" stroke-width=\"1.5\">\n                    <polygon points=\"6,5 6,19 18,19, 18,10 13,5\" />\n                    <line x1=\"9\" y1=\"9\" x2=\"13\" y2=\"9\" />\n                    <line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\" />\n                    <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\" />\n                </g>,\n                \"var(--color-document)\",\n                i18n.kind_document(),\n            ),\n        folder: () =>\n            kindIcon(\n                <g stroke=\"var(--color-icon-text)\" fill=\"none\" stroke-width=\"1.5\">\n                    <polygon points=\"5,5 10,5 12,8 19,8 19,18 5,18\" />\n                </g>,\n                \"var(--color-document)\",\n                i18n.theme_folder(),\n            ),\n        chevronDown: () => (\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n                <path\n                    d=\"M4.93896 8.531L12 15.591L19.061 8.531L16.939 6.409L12 11.349L7.06098 6.409L4.93896 8.531Z\"\n                    fill=\"var(--color-icon-text)\"\n                />\n            </svg>\n        ),\n        chevronSmall: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                <path\n                    d=\"M1.5 5.50969L8 11.6609L14.5 5.50969L12.5466 3.66086L8 7.96494L3.45341 3.66086L1.5 5.50969Z\"\n                    fill=\"var(--color-icon-text)\"\n                />\n            </svg>\n        ),\n        checkbox: () => (\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n                <rect class=\"tsd-checkbox-background\" width=\"30\" height=\"30\" x=\"1\" y=\"1\" rx=\"6\" fill=\"none\" />\n                <path\n                    class=\"tsd-checkbox-checkmark\"\n                    d=\"M8.35422 16.8214L13.2143 21.75L24.6458 10.25\"\n                    stroke=\"none\"\n                    stroke-width=\"3.5\"\n                    stroke-linejoin=\"round\"\n                    fill=\"none\"\n                />\n            </svg>\n        ),\n        menu: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                {[\"3\", \"7\", \"11\"].map((y) => <rect x=\"1\" y={y} width=\"14\" height=\"2\" fill=\"var(--color-icon-text)\" />)}\n            </svg>\n        ),\n        search: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                <path\n                    d=\"M15.7824 13.833L12.6666 10.7177C12.5259 10.5771 12.3353 10.499 12.1353 10.499H11.6259C12.4884 9.39596 13.001 8.00859 13.001 6.49937C13.001 2.90909 10.0914 0 6.50048 0C2.90959 0 0 2.90909 0 6.49937C0 10.0896 2.90959 12.9987 6.50048 12.9987C8.00996 12.9987 9.39756 12.4863 10.5008 11.6239V12.1332C10.5008 12.3332 10.5789 12.5238 10.7195 12.6644L13.8354 15.7797C14.1292 16.0734 14.6042 16.0734 14.8948 15.7797L15.7793 14.8954C16.0731 14.6017 16.0731 14.1267 15.7824 13.833ZM6.50048 10.499C4.29094 10.499 2.50018 8.71165 2.50018 6.49937C2.50018 4.29021 4.28781 2.49976 6.50048 2.49976C8.71001 2.49976 10.5008 4.28708 10.5008 6.49937C10.5008 8.70852 8.71314 10.499 6.50048 10.499Z\"\n                    fill=\"var(--color-icon-text)\"\n                />\n            </svg>\n        ),\n        anchor: () => (\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n                <g stroke-width=\"2\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n                    <path d=\"M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5\" />\n                    <path d=\"M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5\" />\n                </g>\n            </svg>\n        ),\n        alertNote: () => (\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                <path\n                    fill=\"var(--color-alert-note)\"\n                    d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\n                />\n            </svg>\n        ),\n        alertTip: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                <path\n                    fill=\"var(--color-alert-tip)\"\n                    d=\"M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z\"\n                />\n            </svg>\n        ),\n        alertImportant: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                <path\n                    fill=\"var(--color-alert-important)\"\n                    d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\n                />\n            </svg>\n        ),\n        alertWarning: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                <path\n                    fill=\"var(--color-alert-warning)\"\n                    d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\n                />\n            </svg>\n        ),\n        alertCaution: () => (\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                <path\n                    fill=\"var(--color-alert-caution)\"\n                    d=\"M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\n                />\n            </svg>\n        ),\n    };\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/index.tsx",
    "content": "import { classNames, getMemberSections, isNoneSection, type MemberSection, renderName } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { i18n, JSX } from \"#utils\";\nimport type { ContainerReflection } from \"../../../../models/index.js\";\n\nfunction renderSection(\n    { urlTo, reflectionIcon, getReflectionClasses, markdown }: DefaultThemeRenderContext,\n    item: MemberSection,\n) {\n    return (\n        <section class=\"tsd-index-section\">\n            {!isNoneSection(item) && <h3 class=\"tsd-index-heading\">{item.title}</h3>}\n            {item.description && (\n                <div class=\"tsd-comment tsd-typography\">\n                    <JSX.Raw html={markdown(item.description)} />\n                </div>\n            )}\n            <div class=\"tsd-index-list\">\n                {item.children.map((item) => (\n                    <>\n                        <a\n                            href={urlTo(item)}\n                            class={classNames(\n                                { \"tsd-index-link\": true, deprecated: item.isDeprecated() },\n                                getReflectionClasses(item),\n                            )}\n                        >\n                            {reflectionIcon(item)}\n                            <span>{renderName(item)}</span>\n                        </a>\n                        {\"\\n\"}\n                    </>\n                ))}\n            </div>\n        </section>\n    );\n}\n\nexport function index(context: DefaultThemeRenderContext, props: ContainerReflection) {\n    const sections = getMemberSections(props);\n\n    return (\n        <>\n            <section class=\"tsd-panel-group tsd-index-group\">\n                <section class=\"tsd-panel tsd-index-panel\">\n                    <details class=\"tsd-index-content tsd-accordion\" open={true}>\n                        <summary class=\"tsd-accordion-summary tsd-index-summary\">\n                            {context.icons.chevronDown()}\n                            <h5 class=\"tsd-index-heading uppercase\">\n                                {i18n.theme_index()}\n                            </h5>\n                        </summary>\n                        <div class=\"tsd-accordion-details\">{sections.map(s => renderSection(context, s))}</div>\n                    </details>\n                </section>\n            </section>\n        </>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.declaration.tsx",
    "content": "import type { DeclarationReflection } from \"#models\";\nimport { JSX } from \"#utils\";\nimport { FormattedCodeBuilder, FormattedCodeGenerator, type FormatterNode, Wrap } from \"../../../formatter.js\";\nimport { hasTypeParameters } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nfunction shouldRenderDefaultValue(props: DeclarationReflection) {\n    const defaultValue = props.defaultValue;\n\n    if (defaultValue === undefined) {\n        return false;\n    }\n\n    /** Fix for #2717. If type is the same as value the default value is omitted */\n    if (props.type && props.type.type === \"literal\") {\n        const reflectionTypeString = props.type.toString();\n\n        if (reflectionTypeString === defaultValue) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport function memberDeclaration(context: DefaultThemeRenderContext, props: DeclarationReflection) {\n    const builder = new FormattedCodeBuilder(context.router, context.model);\n    const content: FormatterNode[] = [];\n    builder.member(content, props, { topLevelLinks: false });\n    const generator = new FormattedCodeGenerator(context.options.getValue(\"typePrintWidth\"));\n    generator.node({ type: \"nodes\", content }, Wrap.Detect);\n\n    return (\n        <>\n            <div class=\"tsd-signature\">\n                {generator.toElement()}\n                {shouldRenderDefaultValue(props) && (\n                    <span class=\"tsd-signature-symbol\">\n                        {\" = \"}\n                        {props.defaultValue}\n                    </span>\n                )}\n            </div>\n\n            {context.commentSummary(props)}\n\n            {hasTypeParameters(props) && context.typeParameters(props.typeParameters)}\n\n            {props.type && context.typeDeclaration(props, props.type)}\n\n            {context.commentTags(props)}\n\n            {context.memberSources(props)}\n        </>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.getterSetter.tsx",
    "content": "import type { DeclarationReflection } from \"../../../../models/index.js\";\nimport { JSX } from \"#utils\";\nimport { classNames } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nexport const memberGetterSetter = (context: DefaultThemeRenderContext, props: DeclarationReflection) => (\n    <>\n        <ul\n            class={classNames(\n                {\n                    \"tsd-signatures\": true,\n                },\n                context.getReflectionClasses(props),\n            )}\n        >\n            {!!props.getSignature && (\n                <li>\n                    <div class=\"tsd-signature\" id={context.getAnchor(props.getSignature)}>\n                        {context.memberSignatureTitle(props.getSignature)}\n                    </div>\n                    <div class=\"tsd-description\">{context.memberSignatureBody(props.getSignature)}</div>\n                </li>\n            )}\n            {!!props.setSignature && (\n                <li>\n                    <div class=\"tsd-signature\" id={context.getAnchor(props.setSignature)}>\n                        {context.memberSignatureTitle(props.setSignature)}\n                    </div>\n                    <div class=\"tsd-description\">{context.memberSignatureBody(props.setSignature)}</div>\n                </li>\n            )}\n        </ul>\n    </>\n);\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.signature.body.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { i18n, JSX } from \"#utils\";\nimport type { SignatureReflection } from \"../../../../models/index.js\";\nimport { hasTypeParameters } from \"../../lib.js\";\n\nexport function memberSignatureBody(\n    context: DefaultThemeRenderContext,\n    props: SignatureReflection,\n    { hideSources = false }: { hideSources?: boolean } = {},\n) {\n    const returnsTag = props.comment?.getTag(\"@returns\");\n\n    return (\n        <>\n            {context.reflectionFlags(props)}\n            {context.commentSummary(props)}\n\n            {hasTypeParameters(props) && context.typeParameters(props.typeParameters)}\n\n            {props.parameters && props.parameters.length > 0 && (\n                <div class=\"tsd-parameters\">\n                    <h4 class=\"tsd-parameters-title\">{i18n.kind_plural_parameter()}</h4>\n                    <ul class=\"tsd-parameter-list\">\n                        {props.parameters.map((item) => (\n                            <li>\n                                <span>\n                                    {context.reflectionFlags(item)}\n                                    {item.flags.isRest && <span class=\"tsd-signature-symbol\">...</span>}\n                                    <span class=\"tsd-kind-parameter\">{item.name}</span>\n                                    {\": \"}\n                                    {context.type(item.type)}\n                                    {item.defaultValue != null && (\n                                        <span class=\"tsd-signature-symbol\">\n                                            {\" = \"}\n                                            {item.defaultValue}\n                                        </span>\n                                    )}\n                                </span>\n                                {context.commentSummary(item)}\n                                {context.commentTags(item)}\n                                {context.typeDetailsIfUseful(item, item.type)}\n                            </li>\n                        ))}\n                    </ul>\n                </div>\n            )}\n            {props.type && (\n                <>\n                    <h4 class=\"tsd-returns-title\">\n                        {i18n.theme_returns()} {context.type(props.type)}\n                    </h4>\n                    {returnsTag && <JSX.Raw html={context.markdown(returnsTag.content)} />}\n                    {context.typeDetailsIfUseful(props, props.type)}\n                </>\n            )}\n\n            {context.commentTags(props)}\n\n            {!hideSources && context.memberSources(props)}\n        </>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.signature.title.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { type SignatureReflection } from \"../../../../models/index.js\";\nimport { FormattedCodeBuilder, FormattedCodeGenerator, Wrap } from \"../../../formatter.js\";\n\nexport function memberSignatureTitle(\n    context: DefaultThemeRenderContext,\n    props: SignatureReflection,\n    options: { hideName?: boolean } = {},\n) {\n    const builder = new FormattedCodeBuilder(context.router, context.model);\n    const tree = builder.signature(props, options);\n    const generator = new FormattedCodeGenerator(context.options.getValue(\"typePrintWidth\"));\n    generator.node(tree, Wrap.Detect);\n    return generator.toElement();\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.signatures.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { JSX } from \"#utils\";\nimport type { DeclarationReflection } from \"../../../../models/index.js\";\nimport { anchorIcon } from \"./anchor-icon.js\";\nimport { classNames } from \"../../lib.js\";\n\nexport const memberSignatures = (context: DefaultThemeRenderContext, props: DeclarationReflection) => (\n    <>\n        <ul class={classNames({ \"tsd-signatures\": true }, context.getReflectionClasses(props))}>\n            {props.signatures?.map((item) => (\n                <li class={context.getReflectionClasses(item)}>\n                    <div class=\"tsd-signature tsd-anchor-link\" id={context.getAnchor(item)}>\n                        {context.memberSignatureTitle(item)}\n                        {anchorIcon(context, context.getAnchor(item))}\n                    </div>\n                    <div class=\"tsd-description\">{context.memberSignatureBody(item)}</div>\n                </li>\n            ))}\n        </ul>\n    </>\n);\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.sources.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { i18n, JSX } from \"#utils\";\nimport type { DeclarationReflection, SignatureReflection, SourceReference } from \"../../../../models/index.js\";\n\nfunction sourceLink(context: DefaultThemeRenderContext, item: SourceReference) {\n    if (!item.url) {\n        return (\n            <li>\n                {i18n.theme_defined_in()} {item.fileName}:{item.line}\n            </li>\n        );\n    }\n\n    if (context.options.getValue(\"sourceLinkExternal\")) {\n        return (\n            <li>\n                {i18n.theme_defined_in()}{\" \"}\n                <a href={item.url} class=\"external\" target=\"_blank\">\n                    {item.fileName}:{item.line}\n                </a>\n            </li>\n        );\n    }\n\n    return (\n        <li>\n            {i18n.theme_defined_in()}{\" \"}\n            <a href={item.url}>\n                {item.fileName}:{item.line}\n            </a>\n        </li>\n    );\n}\n\nexport const memberSources = (\n    context: DefaultThemeRenderContext,\n    props: SignatureReflection | DeclarationReflection,\n) => {\n    const sources: JSX.Element[] = [];\n\n    if (props.implementationOf) {\n        sources.push(\n            <p>\n                {i18n.theme_implementation_of()} {context.typeAndParent(props.implementationOf)}\n            </p>,\n        );\n    }\n    if (props.inheritedFrom) {\n        sources.push(\n            <p>\n                {i18n.theme_inherited_from()} {context.typeAndParent(props.inheritedFrom)}\n            </p>,\n        );\n    }\n    if (props.overwrites) {\n        sources.push(\n            <p>\n                {i18n.theme_overrides()} {context.typeAndParent(props.overwrites)}\n            </p>,\n        );\n    }\n    if (props.sources?.length) {\n        sources.push(<ul>{props.sources.map((item) => sourceLink(context, item))}</ul>);\n    }\n\n    if (sources.length === 0) {\n        return <></>;\n    }\n\n    return <aside class=\"tsd-sources\">{sources}</aside>;\n};\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/member.tsx",
    "content": "import { classNames, getDisplayName, wbr } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { JSX } from \"#utils\";\nimport { type DeclarationReflection, type DocumentReflection } from \"../../../../models/index.js\";\nimport { anchorIcon } from \"./anchor-icon.js\";\n\nexport function member(context: DefaultThemeRenderContext, props: DeclarationReflection | DocumentReflection) {\n    const anchor = context.getAnchor(props);\n\n    context.page.pageHeadings.push({\n        link: `#${anchor}`,\n        text: getDisplayName(props),\n        kind: props.kind,\n        classes: context.getReflectionClasses(props),\n        icon: context.theme.getReflectionIcon(props),\n    });\n\n    // With the default url derivation, we'll never hit this case as documents are always placed into their\n    // own pages. Handle it here in case someone creates a custom url scheme which embeds guides within the page.\n    if (props.isDocument()) {\n        return (\n            <section class={classNames({ \"tsd-panel\": true, \"tsd-member\": true }, context.getReflectionClasses(props))}>\n                {!!props.name && (\n                    <h3 class=\"tsd-anchor-link\" id={anchor}>\n                        {context.reflectionFlags(props)}\n                        <span class={classNames({ deprecated: props.isDeprecated() })}>{wbr(props.name)}</span>\n                        {anchorIcon(context, anchor)}\n                    </h3>\n                )}\n                <div class=\"tsd-comment tsd-typography\">\n                    <JSX.Raw html={context.markdown(props.content)} />\n                </div>\n            </section>\n        );\n    }\n\n    return (\n        <section class={classNames({ \"tsd-panel\": true, \"tsd-member\": true }, context.getReflectionClasses(props))}>\n            {!!props.name && (\n                <h3 class=\"tsd-anchor-link\" id={anchor}>\n                    {context.reflectionFlags(props)}\n                    <span class={classNames({ deprecated: props.isDeprecated() })}>{wbr(props.name)}</span>\n                    {anchorIcon(context, anchor)}\n                </h3>\n            )}\n            {props.signatures\n                ? context.memberSignatures(props)\n                : props.hasGetterOrSetter()\n                ? context.memberGetterSetter(props)\n                : context.memberDeclaration(props)}\n\n            {props.groups?.map((item) =>\n                item.children.map((item) => !context.router.hasOwnDocument(item) && context.member(item))\n            )}\n        </section>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/members.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { JSX } from \"#utils\";\nimport { type ContainerReflection } from \"../../../../models/index.js\";\nimport { getMemberSections, isNoneSection } from \"../../lib.js\";\n\nexport function members(context: DefaultThemeRenderContext, props: ContainerReflection) {\n    const sections = getMemberSections(props, (child) => !context.router.hasOwnDocument(child));\n\n    return (\n        <>\n            {sections.map((section) => {\n                if (isNoneSection(section)) {\n                    return (\n                        <section class=\"tsd-panel-group tsd-member-group\">\n                            {section.children.map((item) => context.member(item))}\n                        </section>\n                    );\n                }\n\n                context.page.startNewSection(section.title);\n\n                return (\n                    <details class=\"tsd-panel-group tsd-member-group tsd-accordion\" open>\n                        <summary class=\"tsd-accordion-summary\" data-key={\"section-\" + section.title}>\n                            {context.icons.chevronDown()}\n                            <h2>\n                                {section.title}\n                            </h2>\n                        </summary>\n                        <section>{section.children.map((item) => context.member(item))}</section>\n                    </details>\n                );\n            })}\n        </>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/moduleReflection.tsx",
    "content": "import {\n    type DeclarationReflection,\n    type DocumentReflection,\n    type ProjectReflection,\n    ReferenceReflection,\n    type Reflection,\n    ReflectionKind,\n} from \"../../../../models/index.js\";\nimport { JSX } from \"#utils\";\nimport { classNames, getDisplayName, getMemberSections, getUniquePath, isNoneSection, join } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { anchorIcon } from \"./anchor-icon.js\";\n\nexport function moduleReflection(context: DefaultThemeRenderContext, mod: DeclarationReflection | ProjectReflection) {\n    const sections = getMemberSections(mod);\n\n    return (\n        <>\n            {mod.hasComment(context.options.getValue(\"notRenderedTags\")) && (\n                <section class=\"tsd-panel tsd-comment\">\n                    {context.commentSummary(mod)}\n                    {context.commentTags(mod)}\n                </section>\n            )}\n\n            {mod.isDeclaration() && mod.kind === ReflectionKind.Module && !!mod.readme?.length && (\n                <section class=\"tsd-panel tsd-typography\">\n                    <JSX.Raw html={context.markdown(mod.readme)} />\n                </section>\n            )}\n\n            {sections.map((section) => {\n                if (!isNoneSection(section)) {\n                    context.page.startNewSection(section.title);\n                }\n\n                const content = (\n                    <>\n                        {section.description && (\n                            <div class=\"tsd-comment tsd-typography\">\n                                <JSX.Raw html={context.markdown(section.description)} />\n                            </div>\n                        )}\n                        <dl class=\"tsd-member-summaries\">\n                            {section.children.map((item) => context.moduleMemberSummary(item))}\n                        </dl>\n                    </>\n                );\n\n                if (isNoneSection(section)) {\n                    return (\n                        <section class=\"tsd-panel-group tsd-member-group\">\n                            {content}\n                        </section>\n                    );\n                }\n\n                return (\n                    <details class=\"tsd-panel-group tsd-member-group tsd-accordion\" open>\n                        <summary class=\"tsd-accordion-summary\" data-key={\"section-\" + section.title}>\n                            {context.icons.chevronDown()}\n                            <h2>\n                                {section.title}\n                            </h2>\n                        </summary>\n                        {content}\n                    </details>\n                );\n            })}\n        </>\n    );\n}\n\nexport function moduleMemberSummary(\n    context: DefaultThemeRenderContext,\n    member: DeclarationReflection | DocumentReflection,\n) {\n    const id = member.isReference() ? context.getAnchor(member)! : context.slugger.slug(member.name);\n    context.page.pageHeadings.push({\n        link: `#${id}`,\n        text: getDisplayName(member),\n        kind: member instanceof ReferenceReflection ? member.getTargetReflectionDeep().kind : member.kind,\n        classes: context.getReflectionClasses(member),\n        icon: context.theme.getReflectionIcon(member),\n    });\n\n    let name: JSX.Element;\n    if (member instanceof ReferenceReflection) {\n        const target = member.getTargetReflectionDeep();\n\n        name = (\n            <span class=\"tsd-member-summary-name\">\n                {context.reflectionIcon(target)}\n                <span class={classNames({ deprecated: member.isDeprecated() })}>{member.name}</span>\n                <span>&nbsp;{\"\\u2192\"}&nbsp;</span>\n                {uniqueName(context, target)}\n                {anchorIcon(context, id)}\n            </span>\n        );\n    } else {\n        name = (\n            <span class=\"tsd-member-summary-name\">\n                {context.reflectionIcon(member)}\n                <a class={classNames({ deprecated: member.isDeprecated() })} href={context.urlTo(member)}>\n                    {member.name}\n                </a>\n                {anchorIcon(context, id)}\n            </span>\n        );\n    }\n\n    return (\n        <>\n            <dt class={classNames({ \"tsd-member-summary\": true }, context.getReflectionClasses(member))} id={id}>\n                {name}\n            </dt>\n            <dd class={classNames({ \"tsd-member-summary\": true }, context.getReflectionClasses(member))}>\n                {context.commentShortSummary(member)}\n            </dd>\n        </>\n    );\n}\n\n// Note: This version of uniqueName does NOT include colors... they looked weird to me\n// when looking at a module page.\nfunction uniqueName(context: DefaultThemeRenderContext, reflection: Reflection) {\n    const name = join(\n        \".\",\n        getUniquePath(reflection),\n        (item) => (\n            <a href={context.urlTo(item)} class={classNames({ deprecated: item.isDeprecated() })}>\n                {item.name}\n            </a>\n        ),\n    );\n\n    return <>{name}</>;\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/navigation.tsx",
    "content": "import { type Reflection, ReflectionFlag, ReflectionFlags } from \"../../../../models/index.js\";\nimport { i18n, JSX, type TagString, translateTagName } from \"#utils\";\nimport type { PageEvent, PageHeading } from \"../../../events.js\";\nimport { classNames, getDisplayName, wbr } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nexport function sidebar(context: DefaultThemeRenderContext, props: PageEvent<Reflection>) {\n    return (\n        <>\n            {context.sidebarLinks()}\n            {context.navigation(props)}\n        </>\n    );\n}\n\nfunction buildFilterItem(context: DefaultThemeRenderContext, name: string, displayName: string, defaultValue: boolean) {\n    return (\n        <li class=\"tsd-filter-item\">\n            <label class=\"tsd-filter-input\">\n                <input type=\"checkbox\" id={`tsd-filter-${name}`} name={name} checked={defaultValue} />\n                {context.icons.checkbox()}\n                <span>{displayName}</span>\n            </label>\n        </li>\n    );\n}\n\nexport function sidebarLinks(context: DefaultThemeRenderContext) {\n    const links = Object.entries(context.options.getValue(\"sidebarLinks\"));\n    const navLinks = Object.entries(context.options.getValue(\"navigationLinks\"));\n\n    if (!links.length && !navLinks.length) return null;\n    return (\n        <nav id=\"tsd-sidebar-links\" class=\"tsd-navigation\">\n            {links.map(([label, url]) => <a href={url}>{label}</a>)}\n            {navLinks.map(([label, url]) => (\n                <a href={url} class=\"tsd-nav-link\">\n                    {label}\n                </a>\n            ))}\n        </nav>\n    );\n}\n\nconst flagOptionNameToReflectionFlag = {\n    protected: ReflectionFlag.Protected,\n    private: ReflectionFlag.Private,\n    external: ReflectionFlag.External,\n    inherited: ReflectionFlag.Inherited,\n};\n\nexport function settings(context: DefaultThemeRenderContext) {\n    const defaultFilters = context.options.getValue(\"visibilityFilters\") as Record<string, boolean>;\n\n    const visibilityOptions: JSX.Element[] = [];\n\n    for (const key of Object.keys(defaultFilters)) {\n        if (key.startsWith(\"@\")) {\n            const filterName = key\n                .substring(1)\n                .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n                .toLowerCase();\n\n            visibilityOptions.push(\n                buildFilterItem(\n                    context,\n                    filterName,\n                    translateTagName(key as TagString),\n                    defaultFilters[key],\n                ),\n            );\n        } else if (\n            (key === \"protected\" && !context.options.getValue(\"excludeProtected\")) ||\n            (key === \"private\" && !context.options.getValue(\"excludePrivate\")) ||\n            (key === \"external\" && !context.options.getValue(\"excludeExternals\")) ||\n            key === \"inherited\"\n        ) {\n            visibilityOptions.push(\n                buildFilterItem(\n                    context,\n                    key,\n                    ReflectionFlags.flagString(flagOptionNameToReflectionFlag[key]),\n                    defaultFilters[key],\n                ),\n            );\n        }\n    }\n\n    // Settings panel above navigation\n    return (\n        <div class=\"tsd-navigation settings\">\n            <details class=\"tsd-accordion\" open={false}>\n                <summary class=\"tsd-accordion-summary\">\n                    {context.icons.chevronDown()}\n                    <h3>\n                        {i18n.theme_settings()}\n                    </h3>\n                </summary>\n                <div class=\"tsd-accordion-details\">\n                    {!!visibilityOptions.length && (\n                        <div class=\"tsd-filter-visibility\">\n                            <span class=\"settings-label\">{i18n.theme_member_visibility()}</span>\n                            <ul id=\"tsd-filter-options\">{...visibilityOptions}</ul>\n                        </div>\n                    )}\n                    <div class=\"tsd-theme-toggle\">\n                        <label class=\"settings-label\" for=\"tsd-theme\">\n                            {i18n.theme_theme()}\n                        </label>\n                        <select id=\"tsd-theme\">\n                            <option value=\"os\">{i18n.theme_os()}</option>\n                            <option value=\"light\">{i18n.theme_light()}</option>\n                            <option value=\"dark\">{i18n.theme_dark()}</option>\n                        </select>\n                    </div>\n                </div>\n            </details>\n        </div>\n    );\n}\n\nexport const navigation = function navigation(context: DefaultThemeRenderContext, props: PageEvent<Reflection>) {\n    return (\n        <nav class=\"tsd-navigation\">\n            <a\n                href={context.urlTo(props.project)}\n                class={classNames({\n                    current: props.url === context.router.getFullUrl(props.model) && props.model.isProject(),\n                })}\n            >\n                {getDisplayName(props.project)}\n            </a>\n            <ul class=\"tsd-small-nested-navigation\" id=\"tsd-nav-container\">\n                <li>{i18n.theme_loading()}</li>\n            </ul>\n        </nav>\n    );\n};\n\nexport function pageSidebar(context: DefaultThemeRenderContext, props: PageEvent<Reflection>) {\n    return (\n        <>\n            {context.settings()}\n            {context.pageNavigation(props)}\n        </>\n    );\n}\n\nfunction buildSectionNavigation(context: DefaultThemeRenderContext, headings: PageHeading[]) {\n    const levels: JSX.Element[][] = [[]];\n\n    function finalizeLevel(finishedHandlingHeadings: boolean) {\n        const level = levels.pop()!;\n        if (levels[levels.length - 1].length === 0 && finishedHandlingHeadings) {\n            levels[levels.length - 1] = level;\n            return;\n        }\n\n        const built = (\n            <ul>\n                {level.map((l) => <li>{l}</li>)}\n            </ul>\n        );\n        levels[levels.length - 1].push(built);\n    }\n\n    function getInferredHeadingLevel(heading: PageHeading) {\n        if (heading.level) {\n            // Regular heading\n            return heading.level + 2;\n        }\n        if (heading.kind) {\n            // Reflection\n            return 2;\n        }\n\n        // Group/category\n        return 1;\n    }\n\n    for (const heading of headings) {\n        const inferredLevel = getInferredHeadingLevel(heading);\n        while (inferredLevel < levels.length) {\n            finalizeLevel(false);\n        }\n        while (inferredLevel > levels.length) {\n            // Lower level than before\n            levels.push([]);\n        }\n\n        levels[levels.length - 1].push(\n            <a href={heading.link} class={classNames({}, heading.classes)}>\n                {heading.icon && context.icons[heading.icon]()}\n                <span>{wbr(heading.text)}</span>\n            </a>,\n        );\n    }\n\n    while (levels.length > 1) {\n        finalizeLevel(true);\n    }\n\n    levels.unshift([]);\n    finalizeLevel(true);\n    return levels[0];\n}\n\nexport function pageNavigation(context: DefaultThemeRenderContext, props: PageEvent<Reflection>) {\n    if (!props.pageSections.some((sect) => sect.headings.length)) {\n        return <></>;\n    }\n\n    const sections: JSX.Children = [];\n\n    for (const section of props.pageSections) {\n        if (section.title) {\n            sections.push(\n                <details open class=\"tsd-accordion tsd-page-navigation-section\">\n                    <summary class=\"tsd-accordion-summary\" data-key={`section-${section.title}`}>\n                        {context.icons.chevronDown()}\n                        {section.title}\n                    </summary>\n                    <div>{buildSectionNavigation(context, section.headings)}</div>\n                </details>,\n            );\n        } else {\n            sections.push(buildSectionNavigation(context, section.headings));\n        }\n    }\n\n    return (\n        <details open={true} class=\"tsd-accordion tsd-page-navigation\">\n            <summary class=\"tsd-accordion-summary\">\n                {context.icons.chevronDown()}\n                <h3>\n                    {i18n.theme_on_this_page()}\n                </h3>\n            </summary>\n            <div class=\"tsd-accordion-details\">{sections}</div>\n        </details>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/reflectionPreview.tsx",
    "content": "import { DeclarationReflection, type Reflection, ReflectionKind } from \"../../../../models/index.js\";\nimport { JSX } from \"#utils\";\nimport { FormattedCodeBuilder, FormattedCodeGenerator, Wrap } from \"../../../formatter.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nexport function reflectionPreview(context: DefaultThemeRenderContext, props: Reflection) {\n    if (!(props instanceof DeclarationReflection)) return;\n\n    // Each property of the interface will have a member rendered later on the page describing it, so generate\n    // a type-like object with links to each member. Don't do this if we don't have any children as it will\n    // generate a broken looking interface. (See TraverseCallback)\n    if (props.kindOf(ReflectionKind.Interface) && props.children) {\n        const builder = new FormattedCodeBuilder(context.router, context.model);\n        const tree = builder.interface(props);\n        const generator = new FormattedCodeGenerator(context.options.getValue(\"typePrintWidth\"));\n        generator.forceWrap(builder.forceWrap); // Ensure elements are added to new lines.\n        generator.node(tree, Wrap.Enable);\n\n        return <div class=\"tsd-signature\">{generator.toElement()}</div>;\n    }\n\n    if (props.kindOf(ReflectionKind.TypeAlias) && props.children) {\n        const builder = new FormattedCodeBuilder(context.router, context.model);\n        const tree = builder.typeAlias(props);\n        const generator = new FormattedCodeGenerator(context.options.getValue(\"typePrintWidth\"));\n        generator.forceWrap(builder.forceWrap); // Ensure elements are added to new lines.\n        generator.node(tree, Wrap.Enable);\n\n        return <div class=\"tsd-signature\">{generator.toElement()}</div>;\n    }\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/toolbar.tsx",
    "content": "import type { Reflection } from \"../../../../models/index.js\";\nimport { i18n, JSX } from \"#utils\";\nimport type { PageEvent } from \"../../../events.js\";\nimport { getDisplayName } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\n\nexport const toolbar = (context: DefaultThemeRenderContext, props: PageEvent<Reflection>) => (\n    <header class=\"tsd-page-toolbar\">\n        <div class=\"tsd-toolbar-contents container\">\n            <a href={context.options.getValue(\"titleLink\") || context.relativeURL(\"index.html\")} class=\"title\">\n                {getDisplayName(props.project)}\n            </a>\n\n            <div id=\"tsd-toolbar-links\">\n                {Object.entries(context.options.getValue(\"navigationLinks\")).map(([label, url]) => (\n                    <a href={url}>{label}</a>\n                ))}\n            </div>\n\n            <button id=\"tsd-search-trigger\" class=\"tsd-widget\" aria-label={i18n.theme_search()}>\n                {context.icons.search()}\n            </button>\n            <dialog id=\"tsd-search\" aria-label={i18n.theme_search()}>\n                <input\n                    role=\"combobox\"\n                    id=\"tsd-search-input\"\n                    aria-controls=\"tsd-search-results\"\n                    aria-autocomplete=\"list\"\n                    aria-expanded=\"true\"\n                    spellcheck={false}\n                    autocapitalize=\"off\"\n                    autocomplete=\"off\"\n                    placeholder={i18n.theme_search_placeholder()}\n                    maxLength={100}\n                />\n\n                <ul role=\"listbox\" id=\"tsd-search-results\"></ul>\n                <div id=\"tsd-search-status\" aria-live=\"polite\" aria-atomic=\"true\">\n                    <div>{i18n.theme_preparing_search_index()}</div>\n                </div>\n            </dialog>\n\n            <a\n                href=\"#\"\n                class=\"tsd-widget menu\"\n                id=\"tsd-toolbar-menu-trigger\"\n                data-toggle=\"menu\"\n                aria-label={i18n.theme_menu()}\n            >\n                {context.icons.menu()}\n            </a>\n        </div>\n    </header>\n);\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/type.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { FormattedCodeBuilder, FormattedCodeGenerator, Wrap } from \"../../../formatter.js\";\nimport { type SomeType, TypeContext } from \"../../../../models/types.js\";\n\nexport function type(\n    context: DefaultThemeRenderContext,\n    type: SomeType | undefined,\n    options: { topLevelLinks: boolean } = { topLevelLinks: false },\n) {\n    const builder = new FormattedCodeBuilder(context.router, context.model);\n    const tree = builder.type(type, TypeContext.none, options);\n    const generator = new FormattedCodeGenerator(context.options.getValue(\"typePrintWidth\"));\n    generator.node(tree, Wrap.Detect);\n    return generator.toElement();\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/typeAndParent.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { ArrayType, ReferenceType, SignatureReflection, type Type } from \"#models\";\nimport { JSX } from \"#utils\";\n\nexport const typeAndParent = (context: DefaultThemeRenderContext, props: Type): JSX.Element => {\n    if (props instanceof ArrayType) {\n        return (\n            <>\n                {context.typeAndParent(props.elementType)}\n                []\n            </>\n        );\n    }\n\n    if (props instanceof ReferenceType) {\n        if (props.reflection) {\n            const refl = props.reflection instanceof SignatureReflection ? props.reflection.parent : props.reflection;\n            const parent = refl.parent!;\n\n            return (\n                <>\n                    {<a href={context.urlTo(parent)}>{parent.name}</a>}.{<a href={context.urlTo(refl)}>{refl.name}</a>}\n                </>\n            );\n        } else if (props.externalUrl) {\n            if (props.externalUrl === \"#\") {\n                return <>{props.toString()}</>;\n            } else {\n                return <a href={props.externalUrl} class=\"external\" target=\"_blank\">{props.name}</a>;\n            }\n        }\n    }\n\n    return <>{props.toString()}</>;\n};\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/typeDetails.tsx",
    "content": "import {\n    Comment,\n    type CommentDisplayPart,\n    type DeclarationReflection,\n    Reflection,\n    ReflectionKind,\n    type SignatureReflection,\n} from \"../../../../models/index.js\";\nimport type { ReferenceType, SomeType, TypeVisitor } from \"../../../../models/types.js\";\nimport { assert, i18n, JSX, type TagString } from \"#utils\";\nimport { classNames, getKindClass } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport { anchorTargetIfPresent } from \"./anchor-icon.js\";\n\nfunction renderingTypeDetailsIsUseful(\n    container: Reflection,\n    type: SomeType,\n    notRenderedTags: readonly TagString[],\n): boolean {\n    const isUsefulVisitor: Partial<TypeVisitor<boolean>> = {\n        array(type) {\n            return renderingTypeDetailsIsUseful(container, type.elementType, notRenderedTags);\n        },\n        intersection(type) {\n            return type.types.some(t => renderingTypeDetailsIsUseful(container, t, notRenderedTags));\n        },\n        union(type) {\n            return !!type.elementSummaries ||\n                type.types.some(t => renderingTypeDetailsIsUseful(container, t, notRenderedTags));\n        },\n        reflection(type) {\n            return renderingChildIsUseful(type.declaration, notRenderedTags);\n        },\n        reference(type) {\n            return shouldExpandReference(container, type);\n        },\n    };\n\n    return type.visit(isUsefulVisitor) ?? false;\n}\n\nexport function typeDeclaration(\n    context: DefaultThemeRenderContext,\n    reflectionOwningType: Reflection,\n    type: SomeType,\n): JSX.Children {\n    assert(\n        reflectionOwningType instanceof Reflection,\n        \"typeDeclaration(reflectionOwningType, type) called incorrectly\",\n    );\n\n    if (renderingTypeDetailsIsUseful(reflectionOwningType, type, context.options.getValue(\"notRenderedTags\"))) {\n        return (\n            <div class=\"tsd-type-declaration\">\n                <h4>{i18n.theme_type_declaration()}</h4>\n                {context.typeDetails(reflectionOwningType, type, true)}\n            </div>\n        );\n    }\n    return null;\n}\n\ntype ExpandTypeInfo = { expandType: Set<string>; preventExpand: Set<string> };\nconst expandTypeCache = new WeakMap<Reflection, ExpandTypeInfo>();\n\nfunction getExpandTypeInfo(refl: Reflection): ExpandTypeInfo {\n    const cache = expandTypeCache.get(refl);\n    if (cache) return cache;\n\n    const expandType = new Set<string>();\n    const preventExpand = new Set<string>();\n    if (!refl.isProject()) {\n        const info = getExpandTypeInfo(refl.parent!);\n        for (const item of info.expandType) {\n            expandType.add(item);\n        }\n        for (const item of info.preventExpand) {\n            preventExpand.add(item);\n        }\n    }\n\n    for (const tag of refl.comment?.blockTags || []) {\n        if (tag.tag === \"@expandType\") {\n            const name = Comment.combineDisplayParts(tag.content);\n            expandType.add(name);\n            preventExpand.delete(name);\n        } else if (tag.tag === \"@preventExpand\") {\n            const name = Comment.combineDisplayParts(tag.content);\n            preventExpand.add(name);\n            expandType.delete(name);\n        }\n    }\n\n    expandTypeCache.set(refl, { expandType, preventExpand });\n    return { expandType, preventExpand };\n}\n\nconst expanded = new Set<Reflection>();\nfunction shouldExpandReference(container: Reflection, reference: ReferenceType) {\n    const target = reference.reflection;\n    if (!target) {\n        // If it doesn't exist, expand only if there are specific properties\n        // which the user annotated. Assume they know what they're doing.\n        return reference.highlightedProperties !== undefined;\n    }\n\n    // Prevent expansion of non-types\n    if (!target.kindOf(ReflectionKind.TypeAlias | ReflectionKind.Interface)) return false;\n\n    // Prevent recursive expand\n    if (expanded.has(target)) return false;\n\n    const info = getExpandTypeInfo(container);\n\n    // Expand if the user explicitly requested it with @param or @expand\n    if (reference.highlightedProperties || target.comment?.hasModifier(\"@expand\") || info.expandType.has(target.name)) {\n        return !info.preventExpand.has(target.name);\n    }\n\n    return false;\n}\n\nexport function typeDetails(\n    context: DefaultThemeRenderContext,\n    reflectionOwningType: Reflection,\n    type: SomeType,\n    renderAnchors: boolean,\n): JSX.Children {\n    return typeDetailsImpl(context, reflectionOwningType, type, renderAnchors);\n}\n\nexport function typeDetailsImpl(\n    context: DefaultThemeRenderContext,\n    reflectionOwningType: Reflection,\n    type: SomeType,\n    renderAnchors: boolean,\n    highlighted?: Map<string, CommentDisplayPart[]>,\n): JSX.Children {\n    const result = type.visit<JSX.Children>({\n        array(type) {\n            return context.typeDetails(reflectionOwningType, type.elementType, renderAnchors);\n        },\n        intersection(type) {\n            return type.types.map((t) => context.typeDetails(reflectionOwningType, t, renderAnchors));\n        },\n        union(type) {\n            const result: JSX.Children = [];\n            for (let i = 0; i < type.types.length; ++i) {\n                result.push(\n                    <li>\n                        {context.type(type.types[i])}\n                        {context.displayParts(type.elementSummaries?.[i])}\n                        {context.typeDetailsIfUseful(reflectionOwningType, type.types[i])}\n                    </li>,\n                );\n            }\n            return <ul>{result}</ul>;\n        },\n        reflection(type) {\n            const declaration = type.declaration;\n            if (highlighted) {\n                return highlightedDeclarationDetails(context, declaration, renderAnchors, highlighted);\n            }\n            return declarationDetails(context, declaration, renderAnchors);\n        },\n        reference(reference) {\n            if (shouldExpandReference(reflectionOwningType, reference)) {\n                const target = reference.reflection;\n                if (!target?.isDeclaration()) {\n                    return highlightedPropertyDetails(context, reference.highlightedProperties);\n                }\n\n                // Ensure we don't go into an infinite loop here\n                expanded.add(target);\n                const details = target.type\n                    ? context.typeDetails(reflectionOwningType, target.type, renderAnchors)\n                    : declarationDetails(context, target, renderAnchors);\n                expanded.delete(target);\n                return details;\n            }\n        },\n        // tuple??\n    });\n\n    if (!result && highlighted) {\n        return highlightedPropertyDetails(context, highlighted);\n    }\n\n    return result;\n}\n\nexport function typeDetailsIfUseful(\n    context: DefaultThemeRenderContext,\n    reflectionOwningType: Reflection,\n    type: SomeType | undefined,\n): JSX.Children {\n    assert(\n        reflectionOwningType instanceof Reflection,\n        \"typeDetailsIfUseful(reflectionOwningType, type) called incorrectly\",\n    );\n\n    if (type && renderingTypeDetailsIsUseful(reflectionOwningType, type, context.options.getValue(\"notRenderedTags\"))) {\n        return context.typeDetails(reflectionOwningType, type, false);\n    }\n}\n\nfunction highlightedPropertyDetails(\n    context: DefaultThemeRenderContext,\n    highlighted?: Map<string, CommentDisplayPart[]>,\n) {\n    if (!highlighted?.size) return;\n\n    return (\n        <ul class=\"tsd-parameters\">\n            {Array.from(highlighted.entries(), ([name, parts]) => {\n                return (\n                    <li class=\"tsd-parameter\">\n                        <h5>\n                            <span>{name}</span>\n                        </h5>\n                        {context.displayParts(parts)}\n                    </li>\n                );\n            })}\n        </ul>\n    );\n}\n\nfunction highlightedDeclarationDetails(\n    context: DefaultThemeRenderContext,\n    declaration: DeclarationReflection,\n    renderAnchors: boolean,\n    highlightedProperties?: Map<string, CommentDisplayPart[]>,\n) {\n    return (\n        <ul class=\"tsd-parameters\">\n            {declaration\n                .getProperties()\n                ?.map(\n                    (child) =>\n                        highlightedProperties?.has(child.name) &&\n                        renderChild(context, child, renderAnchors, highlightedProperties.get(child.name)),\n                )}\n        </ul>\n    );\n}\n\nfunction declarationDetails(\n    context: DefaultThemeRenderContext,\n    declaration: DeclarationReflection,\n    renderAnchors: boolean,\n): JSX.Children {\n    return (\n        <>\n            {context.commentSummary(declaration)}\n            <ul class=\"tsd-parameters\">\n                {declaration.signatures && (\n                    <li class=\"tsd-parameter-signature\">\n                        <ul class={classNames({ \"tsd-signatures\": true }, context.getReflectionClasses(declaration))}>\n                            {declaration.signatures.map((item) => {\n                                const anchor = context.router.hasUrl(item) ? context.getAnchor(item) : undefined;\n\n                                return (\n                                    <>\n                                        <li class=\"tsd-signature\" id={anchor}>\n                                            {context.memberSignatureTitle(item, {\n                                                hideName: true,\n                                            })}\n                                        </li>\n                                        <li class=\"tsd-description\">\n                                            {context.memberSignatureBody(item, {\n                                                hideSources: true,\n                                            })}\n                                        </li>\n                                    </>\n                                );\n                            })}\n                        </ul>\n                    </li>\n                )}\n                {declaration.indexSignatures?.map((index) => renderIndexSignature(context, index))}\n                {declaration.getProperties()?.map((child) => renderChild(context, child, renderAnchors))}\n            </ul>\n        </>\n    );\n}\n\nfunction renderChild(\n    context: DefaultThemeRenderContext,\n    child: DeclarationReflection,\n    renderAnchors: boolean,\n    highlight?: CommentDisplayPart[],\n) {\n    if (child.signatures) {\n        return (\n            <li class=\"tsd-parameter\">\n                <h5 id={anchorTargetIfPresent(context, child)}>\n                    {child.flags.isRest && <span class=\"tsd-signature-symbol\">...</span>}\n                    <span class={getKindClass(child)}>{child.name}</span>\n                    <span class=\"tsd-signature-symbol\">{child.flags.isOptional && \"?\"}:</span> function\n                </h5>\n\n                {context.memberSignatures(child)}\n            </li>\n        );\n    }\n\n    function highlightOrComment(refl: Reflection) {\n        if (highlight) {\n            return context.displayParts(highlight);\n        }\n        return (\n            <>\n                {context.commentSummary(refl)}\n                {context.commentTags(refl)}\n            </>\n        );\n    }\n\n    // standard type\n    if (child.type) {\n        const notRenderedTags = context.options.getValue(\"notRenderedTags\");\n\n        return (\n            <li class=\"tsd-parameter\">\n                <h5 id={anchorTargetIfPresent(context, child)}>\n                    {context.reflectionFlags(child)}\n                    {child.flags.isRest && <span class=\"tsd-signature-symbol\">...</span>}\n                    <span class={getKindClass(child)}>{child.name}</span>\n                    <span class=\"tsd-signature-symbol\">\n                        {child.flags.isOptional && \"?\"}\n                        {\": \"}\n                    </span>\n                    {context.type(child.type)}\n                </h5>\n                {highlightOrComment(child)}\n                {child.getProperties().some(prop => renderingChildIsUseful(prop, notRenderedTags)) && (\n                    <ul class=\"tsd-parameters\">\n                        {child.getProperties().map((c) => renderChild(context, c, renderAnchors))}\n                    </ul>\n                )}\n            </li>\n        );\n    }\n\n    // getter/setter\n    return (\n        <>\n            {child.getSignature && (\n                <li class=\"tsd-parameter\">\n                    <h5 id={anchorTargetIfPresent(context, child)}>\n                        {context.reflectionFlags(child.getSignature)}\n                        <span class=\"tsd-signature-keyword\">get</span>{\" \"}\n                        <span class={getKindClass(child)}>{child.name}</span>\n                        <span class=\"tsd-signature-symbol\">():</span> {context.type(child.getSignature.type)}\n                    </h5>\n\n                    {highlightOrComment(child.getSignature)}\n                </li>\n            )}\n            {child.setSignature && (\n                <li class=\"tsd-parameter\">\n                    <h5 id={!child.getSignature ? anchorTargetIfPresent(context, child) : undefined}>\n                        {context.reflectionFlags(child.setSignature)}\n                        <span class=\"tsd-signature-keyword\">set</span>{\" \"}\n                        <span class={getKindClass(child)}>{child.name}</span>\n                        <span class=\"tsd-signature-symbol\">(</span>\n                        {child.setSignature.parameters?.map((item) => (\n                            <>\n                                {item.name}\n                                <span class=\"tsd-signature-symbol\">:</span> {context.type(item.type)}\n                            </>\n                        ))}\n                        <span class=\"tsd-signature-symbol\">):</span> {context.type(child.setSignature.type)}\n                    </h5>\n\n                    {highlightOrComment(child.setSignature)}\n                </li>\n            )}\n        </>\n    );\n}\n\nfunction renderIndexSignature(context: DefaultThemeRenderContext, index: SignatureReflection) {\n    return (\n        <li class=\"tsd-parameter-index-signature\">\n            <h5>\n                {index.flags.isReadonly && (\n                    <>\n                        <span class=\"tsd-signature-keyword\">readonly</span>\n                        {\" \"}\n                    </>\n                )}\n                <span class=\"tsd-signature-symbol\">[</span>\n                {index.parameters!.map((item) => (\n                    <>\n                        <span class={getKindClass(item)}>{item.name}</span>\n                        {\": \"}\n                        {context.type(item.type)}\n                    </>\n                ))}\n                <span class=\"tsd-signature-symbol\">]:</span> {context.type(index.type)}\n            </h5>\n            {context.commentSummary(index)}\n            {context.commentTags(index)}\n            {context.typeDeclaration(index, index.type!)}\n        </li>\n    );\n}\n\nfunction renderingChildIsUseful(refl: DeclarationReflection, notRenderedTags: readonly TagString[]) {\n    // Object types directly under a variable/type alias will always be considered useful.\n    // This probably isn't ideal, but it is an easy thing to check when assigning URLs\n    // in the default theme, so we'll make the assumption that those properties ought to always\n    // be rendered.\n    // This should be kept in sync with the DefaultTheme.applyAnchorUrl function.\n    if (\n        refl.kindOf(ReflectionKind.TypeLiteral) &&\n        refl.parent?.kindOf(ReflectionKind.SomeExport) &&\n        (refl.parent as DeclarationReflection).type?.type === \"reflection\"\n    ) {\n        return true;\n    }\n\n    if (renderingThisChildIsUseful(refl, notRenderedTags)) {\n        return true;\n    }\n\n    return refl.getProperties().some(prop => renderingThisChildIsUseful(prop, notRenderedTags));\n}\n\nfunction renderingThisChildIsUseful(refl: DeclarationReflection, notRenderedTags: readonly TagString[]) {\n    if (refl.hasComment(notRenderedTags)) return true;\n\n    const declaration = refl.type?.type === \"reflection\" ? refl.type.declaration : refl;\n    if (declaration.hasComment(notRenderedTags)) return true;\n\n    return declaration.getAllSignatures().some((sig) => {\n        return sig.hasComment(notRenderedTags) || sig.parameters?.some((p) => p.hasComment(notRenderedTags));\n    });\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/partials/typeParameters.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport type { TypeParameterReflection } from \"../../../../models/index.js\";\nimport { i18n, JSX } from \"#utils\";\nimport { anchorTargetIfPresent } from \"./anchor-icon.js\";\n\nexport function typeParameters(context: DefaultThemeRenderContext, typeParameters: TypeParameterReflection[]) {\n    return (\n        <>\n            <section class=\"tsd-panel\">\n                <h4>{i18n.kind_plural_type_parameter()}</h4>\n                <ul class=\"tsd-type-parameter-list\">\n                    {typeParameters.map((item) => (\n                        <li>\n                            <span id={anchorTargetIfPresent(context, item)}>\n                                {item.flags.isConst && (\n                                    <>\n                                        <span class=\"tsd-signature-keyword\">const</span>\n                                        {\" \"}\n                                    </>\n                                )}\n                                {item.varianceModifier && (\n                                    <>\n                                        <span class=\"tsd-signature-keyword\">{item.varianceModifier}</span>\n                                        {\" \"}\n                                    </>\n                                )}\n                                <span class=\"tsd-kind-type-parameter\">{item.name}</span>\n                                {!!item.type && (\n                                    <>\n                                        {\" \"}\n                                        <span class=\"tsd-signature-keyword\">extends</span> {context.type(item.type)}\n                                    </>\n                                )}\n                                {!!item.default && (\n                                    <>\n                                        {\" = \"}\n                                        {context.type(item.default)}\n                                    </>\n                                )}\n                            </span>\n                            {context.commentSummary(item)}\n                            {context.commentTags(item)}\n                        </li>\n                    ))}\n                </ul>\n            </section>\n        </>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/templates/document.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport type { DocumentReflection } from \"../../../../models/index.js\";\nimport type { PageEvent } from \"../../../events.js\";\nimport { JSX } from \"#utils\";\n\nexport const documentTemplate = ({ markdown }: DefaultThemeRenderContext, props: PageEvent<DocumentReflection>) => (\n    <div class=\"tsd-panel tsd-typography\">\n        <JSX.Raw html={markdown(props.model.content)} />\n    </div>\n);\n"
  },
  {
    "path": "src/lib/output/themes/default/templates/hierarchy.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport type { PageEvent } from \"../../../events.js\";\nimport { i18n, JSX } from \"#utils\";\nimport { getHierarchyRoots } from \"../../lib.js\";\nimport type { DeclarationReflection, ProjectReflection } from \"../../../../models/index.js\";\n\nfunction fullHierarchy(\n    context: DefaultThemeRenderContext,\n    root: DeclarationReflection,\n    seen: Set<DeclarationReflection>,\n) {\n    if (seen.has(root)) {\n        return (\n            <li data-refl={root.id}>\n                <a href={context.urlTo(root)}>\n                    {context.reflectionIcon(root)}\n                    {root.name}\n                </a>\n            </li>\n        );\n    }\n    seen.add(root);\n\n    const children: JSX.Element[] = [];\n    for (const child of [...(root.implementedBy || []), ...(root.extendedBy || [])]) {\n        if (child.reflection) {\n            children.push(fullHierarchy(context, child.reflection as DeclarationReflection, seen));\n        }\n    }\n\n    // Note: We don't use root.anchor for the anchor, because those are built on a per page basis.\n    // And classes/interfaces get their own page, so all the anchors will be empty anyways.\n    // Full name should be safe here, since this list only includes classes/interfaces.\n    return (\n        <li data-refl={root.id} id={root.getFullName()}>\n            <a href={context.urlTo(root)}>\n                {context.reflectionIcon(root)}\n                {root.name}\n            </a>\n            {!!children.length && <ul>{children}</ul>}\n        </li>\n    );\n}\n\nexport function hierarchyTemplate(context: DefaultThemeRenderContext, props: PageEvent<ProjectReflection>) {\n    const seen = new Set<DeclarationReflection>();\n\n    return (\n        <>\n            <h2>{i18n.theme_hierarchy_summary()}</h2>\n            {getHierarchyRoots(props.project).map((root) => (\n                <ul class=\"tsd-full-hierarchy\">{fullHierarchy(context, root, seen)}</ul>\n            ))}\n        </>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/default/templates/index.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport type { ProjectReflection } from \"../../../../models/index.js\";\nimport type { PageEvent } from \"../../../events.js\";\nimport { JSX } from \"#utils\";\n\nexport const indexTemplate = ({ markdown }: DefaultThemeRenderContext, props: PageEvent<ProjectReflection>) => (\n    <div class=\"tsd-panel tsd-typography\">\n        <JSX.Raw html={markdown(props.model.readme || [])} />\n    </div>\n);\n"
  },
  {
    "path": "src/lib/output/themes/default/templates/reflection.tsx",
    "content": "import { classNames, getKindClass, hasTypeParameters } from \"../../lib.js\";\nimport type { DefaultThemeRenderContext } from \"../DefaultThemeRenderContext.js\";\nimport type { PageEvent } from \"../../../events.js\";\nimport {\n    type ContainerReflection,\n    DeclarationReflection,\n    ReflectionKind,\n    type SignatureReflection,\n} from \"../../../../models/index.js\";\nimport { i18n, JSX } from \"#utils\";\n\nexport function reflectionTemplate(context: DefaultThemeRenderContext, props: PageEvent<ContainerReflection>) {\n    if (\n        props.model.kindOf(ReflectionKind.TypeAlias | ReflectionKind.Variable) &&\n        props.model instanceof DeclarationReflection &&\n        props.model.type\n    ) {\n        return context.memberDeclaration(props.model);\n    }\n\n    if (\n        props.model.kindOf(ReflectionKind.ExportContainer) &&\n        (props.model.isDeclaration() || props.model.isProject())\n    ) {\n        return context.moduleReflection(props.model);\n    }\n\n    return (\n        <>\n            {props.model.hasComment(context.options.getValue(\"notRenderedTags\")) && (\n                <section class=\"tsd-panel tsd-comment\">\n                    {context.commentSummary(props.model)}\n                    {context.commentTags(props.model)}\n                </section>\n            )}\n\n            {context.reflectionPreview(props.model)}\n\n            {hasTypeParameters(props.model) && <>{context.typeParameters(props.model.typeParameters)}</>}\n            {props.model instanceof DeclarationReflection && (\n                <>\n                    {context.hierarchy(props.model.typeHierarchy)}\n\n                    {!!props.model.implementedTypes && (\n                        <section class=\"tsd-panel\">\n                            <h4>{i18n.theme_implements()}</h4>\n                            <ul class=\"tsd-hierarchy\">\n                                {props.model.implementedTypes.map((item) => <li>{context.type(item)}</li>)}\n                            </ul>\n                        </section>\n                    )}\n                    {!!props.model.implementedBy && (\n                        <section class=\"tsd-panel\">\n                            <h4>{i18n.theme_implemented_by()}</h4>\n                            <ul class=\"tsd-hierarchy\">\n                                {props.model.implementedBy.map((item) => <li>{context.type(item)}</li>)}\n                            </ul>\n                        </section>\n                    )}\n                    {!!props.model.signatures?.length && (\n                        <section class=\"tsd-panel\">{context.memberSignatures(props.model)}</section>\n                    )}\n                    {!!props.model.indexSignatures?.length && (\n                        <section class=\"tsd-panel\">\n                            <h4 class=\"tsd-before-signature\">{i18n.theme_indexable()}</h4>\n                            <ul class=\"tsd-signatures\">\n                                {props.model.indexSignatures.map((index) => renderIndexSignature(context, index))}\n                            </ul>\n                        </section>\n                    )}\n                    {!props.model.signatures && context.memberSources(props.model)}\n                </>\n            )}\n            {!!props.model.childrenIncludingDocuments?.length && context.index(props.model)}\n            {context.members(props.model)}\n        </>\n    );\n}\n\nfunction renderIndexSignature(context: DefaultThemeRenderContext, index: SignatureReflection) {\n    return (\n        <li class={classNames({ \"tsd-index-signature\": true }, context.getReflectionClasses(index))}>\n            <div class=\"tsd-signature\">\n                {index.flags.isReadonly && (\n                    <>\n                        <span class=\"tsd-signature-keyword\">readonly</span>\n                        {\" \"}\n                    </>\n                )}\n                <span class=\"tsd-signature-symbol\">[</span>\n                {index.parameters!.map((item) => (\n                    <>\n                        <span class={getKindClass(item)}>{item.name}</span>: {context.type(item.type)}\n                    </>\n                ))}\n                <span class=\"tsd-signature-symbol\">]:</span> {context.type(index.type)}\n            </div>\n            {context.commentSummary(index)}\n            {context.commentTags(index)}\n            {context.typeDetailsIfUseful(index, index.type)}\n        </li>\n    );\n}\n"
  },
  {
    "path": "src/lib/output/themes/lib.tsx",
    "content": "import type { DefaultThemeRenderContext } from \"../index.js\";\nimport {\n    type CommentDisplayPart,\n    type ContainerReflection,\n    DeclarationReflection,\n    type DocumentReflection,\n    ProjectReflection,\n    ReferenceReflection,\n    type Reflection,\n    ReflectionKind,\n    SignatureReflection,\n    type TypeParameterReflection,\n} from \"../../models/index.js\";\nimport { DefaultMap, filterMap, JSX } from \"#utils\";\n\nexport function stringify(data: unknown) {\n    if (typeof data === \"bigint\") {\n        return data.toString() + \"n\";\n    }\n    return JSON.stringify(data);\n}\n\nexport function getDisplayName(refl: Reflection): string {\n    let version = \"\";\n    if ((refl instanceof DeclarationReflection || refl instanceof ProjectReflection) && refl.packageVersion) {\n        version = ` - v${refl.packageVersion}`;\n    }\n\n    return `${refl.name}${version}`;\n}\n\nexport function toStyleClass(str: string): string {\n    return str.replace(/(\\w)([A-Z])/g, (_m, m1: string, m2: string) => m1 + \"-\" + m2).toLowerCase();\n}\n\nexport function getKindClass(refl: Reflection): string {\n    if (refl instanceof ReferenceReflection) {\n        return getKindClass(refl.getTargetReflectionDeep());\n    }\n    return ReflectionKind.classString(refl.kind);\n}\n\n/**\n * Insert word break tags ``<wbr>`` into the given string.\n *\n * Breaks the given string at ``_``, ``-`` and capital letters.\n *\n * @param str The string that should be split.\n * @return The original string containing ``<wbr>`` tags where possible.\n */\nexport function wbr(str: string): (string | JSX.Element)[] {\n    // Keep this in sync with the same helper in Navigation.ts\n    // We use lookahead/lookbehind to indicate where the string should\n    // be split without consuming a character.\n    // (?<=[^A-Z])(?=[A-Z]) -- regular camel cased text\n    // (?<=[A-Z])(?=[A-Z][a-z]) -- acronym\n    // (?<=[_-])(?=[^_-]) -- snake\n    const parts = str.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);\n    return parts.flatMap(p => [p, <wbr />]).slice(0, -1);\n}\n\nexport function join<T>(joiner: JSX.Children, list: readonly T[], cb: (x: T) => JSX.Children) {\n    const result: JSX.Children = [];\n\n    for (const item of list) {\n        if (result.length > 0) {\n            result.push(joiner);\n        }\n        result.push(cb(item));\n    }\n\n    return <>{result}</>;\n}\n\nexport function classNames(names: Record<string, boolean | null | undefined>, extraCss?: string) {\n    const css = Object.keys(names)\n        .filter((key) => names[key])\n        .concat(extraCss || \"\")\n        .join(\" \")\n        .trim()\n        .replace(/\\s+/g, \" \");\n    return css.length ? css : undefined;\n}\n\nexport function hasTypeParameters(\n    reflection: Reflection,\n): reflection is Reflection & { typeParameters: TypeParameterReflection[] } {\n    return (\n        (reflection instanceof DeclarationReflection || reflection instanceof SignatureReflection) &&\n        reflection.typeParameters != null &&\n        reflection.typeParameters.length > 0\n    );\n}\n\nexport function renderTypeParametersSignature(\n    context: DefaultThemeRenderContext,\n    typeParameters: readonly TypeParameterReflection[] | undefined,\n): JSX.Element {\n    if (!typeParameters || typeParameters.length === 0) return <></>;\n\n    return (\n        <>\n            <span class=\"tsd-signature-symbol\">{\"<\"}</span>\n            {join(<span class=\"tsd-signature-symbol\">{\", \"}</span>, typeParameters, (item) => (\n                <>\n                    {(item.flags.isConst || item.varianceModifier) && (\n                        <span class=\"tsd-signature-keyword\">\n                            {item.flags.isConst && \"const \"}\n                            {item.varianceModifier && `${item.varianceModifier} `}\n                        </span>\n                    )}\n                    <span class=\"tsd-signature-type tsd-kind-type-parameter\">{item.name}</span>\n                    {!!item.type && (\n                        <>\n                            {\" \"}\n                            <span class=\"tsd-signature-keyword\">extends</span> {context.type(item.type)}\n                        </>\n                    )}\n                </>\n            ))}\n            <span class=\"tsd-signature-symbol\">{\">\"}</span>\n        </>\n    );\n}\n\n/**\n * Renders the reflection name with an additional `?` if optional.\n */\nexport function renderName(refl: Reflection) {\n    if (refl.flags.isOptional) {\n        return <>{wbr(refl.name)}?</>;\n    }\n\n    return wbr(refl.name);\n}\n\n// This is cached to avoid slowness with large projects.\nconst rootsCache = new WeakMap<ProjectReflection, DeclarationReflection[]>();\nexport function getHierarchyRoots(project: ProjectReflection): DeclarationReflection[] {\n    const cached = rootsCache.get(project);\n    if (cached) return cached;\n\n    const allClasses = project.getReflectionsByKind(ReflectionKind.ClassOrInterface) as DeclarationReflection[];\n\n    const roots = allClasses.filter((refl) => {\n        // If nobody extends this class, there's no possible hierarchy to display.\n        if (!refl.implementedBy && !refl.extendedBy) {\n            return false;\n        }\n\n        // If we don't extend anything, then we are a root\n        if (!refl.implementedTypes && !refl.extendedTypes) {\n            return true;\n        }\n\n        // We might still be a root, if our extended/implemented types are not included\n        // in the documentation.\n        const types = [...(refl.implementedTypes || []), ...(refl.extendedTypes || [])];\n\n        return types.every(\n            (type) =>\n                !type.visit({\n                    reference(ref) {\n                        return ref.reflection !== undefined;\n                    },\n                }),\n        );\n    });\n\n    const result = roots.sort((a, b) => a.name.localeCompare(b.name));\n    rootsCache.set(project, result);\n    return result;\n}\n\nexport function isNoneSection(section: MemberSection) {\n    return section.title.toLocaleLowerCase() === \"none\";\n}\n\nfunction sortNoneSectionFirst(a: MemberSection, b: MemberSection) {\n    if (isNoneSection(a)) {\n        return -1;\n    }\n    if (isNoneSection(b)) {\n        return 1;\n    }\n    return 0;\n}\n\nexport interface MemberSection {\n    title: string;\n    description?: CommentDisplayPart[];\n    children: Array<DocumentReflection | DeclarationReflection>;\n}\n\nexport function getMemberSections(\n    parent: ContainerReflection,\n    childFilter: (refl: Reflection) => boolean = () => true,\n): MemberSection[] {\n    if (parent.categories?.length) {\n        return filterMap(parent.categories, (cat) => {\n            const children = cat.children.filter(childFilter);\n            if (!children.length) return;\n            return {\n                title: cat.title,\n                description: cat.description,\n                children,\n            };\n        }).sort(sortNoneSectionFirst);\n    }\n\n    if (parent.groups?.length) {\n        return parent.groups.flatMap((group) => {\n            if (group.categories?.length) {\n                return filterMap(group.categories.slice().sort(sortNoneSectionFirst), (cat) => {\n                    const children = cat.children.filter(childFilter);\n                    if (!children.length) return;\n                    return {\n                        title: isNoneSection(cat) ? group.title : `${group.title} - ${cat.title}`,\n                        description: cat.description,\n                        children,\n                    };\n                });\n            }\n\n            const children = group.children.filter(childFilter);\n            if (!children.length) return [];\n            return {\n                title: group.title,\n                description: group.description,\n                children,\n            };\n        }).sort(sortNoneSectionFirst);\n    }\n\n    if (parent.children?.length) {\n        return [{\n            title: \"none\",\n            children: parent.children || [],\n        }];\n    }\n\n    return [];\n}\n\nconst nameCollisionCache = new WeakMap<ProjectReflection, DefaultMap<string, number>>();\nfunction getNameCollisionCount(project: ProjectReflection, name: string): number {\n    let collisions = nameCollisionCache.get(project);\n    if (collisions === undefined) {\n        collisions = new DefaultMap(() => 0);\n        for (const reflection of project.getReflectionsByKind(ReflectionKind.SomeExport)) {\n            collisions.set(reflection.name, collisions.get(reflection.name) + 1);\n        }\n        nameCollisionCache.set(project, collisions);\n    }\n    return collisions.get(name);\n}\n\nfunction getNamespacedPath(reflection: Reflection): Reflection[] {\n    const path = [reflection];\n    let parent = reflection.parent;\n    while (parent?.kindOf(ReflectionKind.Namespace)) {\n        path.unshift(parent);\n        parent = parent.parent;\n    }\n    return path;\n}\n\n/**\n * Returns a (hopefully) globally unique path for the given reflection.\n *\n * This only works for exportable symbols, so e.g. methods are not affected by this.\n *\n * If the given reflection has a globally unique name already, then it will be returned as is. If the name is\n * ambiguous (i.e. there are two classes with the same name in different namespaces), then the namespaces path of the\n * reflection will be returned.\n */\nexport function getUniquePath(reflection: Reflection): Reflection[] {\n    if (reflection.kindOf(ReflectionKind.SomeExport)) {\n        if (getNameCollisionCount(reflection.project, reflection.name) >= 2) {\n            return getNamespacedPath(reflection);\n        }\n    }\n    return [reflection];\n}\n"
  },
  {
    "path": "src/lib/serialization/components.ts",
    "content": "import type { Serializer } from \"./serializer.js\";\nimport type { ModelToObject } from \"./schema.js\";\n\n/**\n * Represents Serializer plugin component.\n *\n * Like Converter plugins each {@link Serializer} plugin defines a predicate that instructs if an\n * object can be serialized by it. This is done dynamically at runtime via a `supports` method.\n */\nexport interface SerializerComponent<T extends object> {\n    /**\n     * The priority this serializer should be executed with.\n     * A higher priority means the {@link Serializer} will be applied earlier.\n     */\n    readonly priority: number;\n\n    /**\n     * Technically this should return `item is T`, but that doesn't play nicely\n     * with inference, so allow the looser `boolean` return type.\n     * @param item\n     */\n    supports(item: unknown): boolean;\n\n    toObject(\n        item: T,\n        obj: Partial<ModelToObject<T>>,\n        serializer: Serializer,\n    ): Partial<ModelToObject<T>>;\n}\n"
  },
  {
    "path": "src/lib/serialization/deserializer.ts",
    "content": "import {\n    ArrayType,\n    ConditionalType,\n    DeclarationReflection,\n    DocumentReflection,\n    type FileId,\n    type FileRegistry,\n    IndexedAccessType,\n    InferredType,\n    IntersectionType,\n    IntrinsicType,\n    LiteralType,\n    MappedType,\n    NamedTupleMember,\n    OptionalType,\n    ParameterReflection,\n    PredicateType,\n    ProjectReflection,\n    QueryType,\n    ReferenceReflection,\n    ReferenceType,\n    Reflection,\n    type ReflectionId,\n    ReflectionKind,\n    ReflectionType,\n    type ReflectionVariant,\n    RestType,\n    SignatureReflection,\n    type SomeType,\n    TemplateLiteralType,\n    TupleType,\n    type TypeKindMap,\n    TypeOperatorType,\n    TypeParameterReflection,\n    UnionType,\n    UnknownType,\n} from \"#models\";\nimport { assert, insertPrioritySorted, type Logger, type NormalizedPath } from \"#utils\";\nimport * as JSONOutput from \"./schema.js\";\n\nexport interface DeserializerComponent {\n    priority: number;\n    supports(model: unknown, obj: unknown): boolean;\n    fromObject(model: unknown, obj: unknown): void;\n}\n\nexport interface Deserializable<T> {\n    fromObject(d: Deserializer, o: T): void;\n}\n\nconst supportedSchemaVersions = [JSONOutput.SCHEMA_VERSION];\n\n/**\n * Deserializes TypeDoc's JSON output back to {@link Reflection} instances.\n *\n * @group None\n * @summary Deserializes TypeDoc's JSON output\n */\nexport class Deserializer {\n    private deferred: Array<(project: ProjectReflection) => void> = [];\n    private deserializers: DeserializerComponent[] = [];\n    private activeReflection: Reflection[] = [];\n\n    reflectionBuilders: {\n        [K in keyof ReflectionVariant]: (\n            parent: NonNullable<ReflectionVariant[K][\"parent\"]>,\n            obj: JSONOutput.ModelToObject<ReflectionVariant[K]>,\n        ) => ReflectionVariant[K];\n    } = {\n        declaration(parent, obj) {\n            return new DeclarationReflection(obj.name, obj.kind, parent);\n        },\n        document(parent, obj) {\n            return new DocumentReflection(obj.name, parent, [], {});\n        },\n        param(parent, obj) {\n            return new ParameterReflection(obj.name, obj.kind, parent);\n        },\n        project() {\n            throw new Error(\n                \"Not supported, use Deserializer.reviveProject(s) instead.\",\n            );\n        },\n        reference(parent, obj): ReferenceReflection {\n            // Ugly, but we don't have a reference yet!\n            return new ReferenceReflection(\n                obj.name,\n                /* target */ parent,\n                parent,\n            );\n        },\n        signature(parent, obj) {\n            return new SignatureReflection(\n                obj.name,\n                obj.kind as SignatureReflection[\"kind\"],\n                parent,\n            );\n        },\n        typeParam(parent, obj) {\n            return new TypeParameterReflection(obj.name, parent, void 0);\n        },\n    };\n\n    typeBuilders: {\n        [K in keyof TypeKindMap]: (\n            obj: JSONOutput.ModelToObject<TypeKindMap[K]>,\n            de: Deserializer,\n        ) => TypeKindMap[K];\n    } = {\n        array(obj, de) {\n            return new ArrayType(de.reviveType(obj.elementType));\n        },\n        conditional(obj, de) {\n            return new ConditionalType(\n                de.reviveType(obj.checkType),\n                de.reviveType(obj.extendsType),\n                de.reviveType(obj.trueType),\n                de.reviveType(obj.falseType),\n            );\n        },\n        indexedAccess(obj, de) {\n            return new IndexedAccessType(\n                de.reviveType(obj.objectType),\n                de.reviveType(obj.indexType),\n            );\n        },\n        inferred(obj, de) {\n            return new InferredType(obj.name, de.reviveType(obj.constraint));\n        },\n        intersection(obj, de) {\n            return new IntersectionType(obj.types.map((t) => de.reviveType(t)));\n        },\n        intrinsic(obj) {\n            return new IntrinsicType(obj.name);\n        },\n        literal(obj) {\n            if (typeof obj.value === \"object\" && obj.value != null) {\n                return new LiteralType(\n                    BigInt(\n                        `${obj.value.negative ? \"-\" : \"\"}${obj.value.value}`,\n                    ),\n                );\n            }\n            return new LiteralType(obj.value);\n        },\n        mapped(obj, de) {\n            return new MappedType(\n                obj.parameter,\n                de.reviveType(obj.parameterType),\n                de.reviveType(obj.templateType),\n                obj.readonlyModifier,\n                obj.optionalModifier,\n                de.reviveType(obj.nameType),\n            );\n        },\n        optional(obj, de) {\n            return new OptionalType(de.reviveType(obj.elementType));\n        },\n        predicate(obj, de) {\n            return new PredicateType(\n                obj.name,\n                obj.asserts,\n                de.reviveType(obj.targetType),\n            );\n        },\n        query(obj, de) {\n            return new QueryType(de.reviveType(obj.queryType));\n        },\n        reference(obj) {\n            // Correct reference will be restored in fromObject\n            return ReferenceType.createResolvedReference(obj.name, -2 as ReflectionId, null);\n        },\n        reflection(obj, de) {\n            return new ReflectionType(\n                de.revive(obj.declaration, (o) => de.constructReflection(o)),\n            );\n        },\n        rest(obj, de) {\n            return new RestType(de.reviveType(obj.elementType));\n        },\n        templateLiteral(obj, de) {\n            return new TemplateLiteralType(\n                obj.head,\n                obj.tail.map(([t, s]) => [de.reviveType(t), s]),\n            );\n        },\n        tuple(obj, de) {\n            return new TupleType(\n                obj.elements?.map((t) => de.reviveType(t)) || [],\n            );\n        },\n        namedTupleMember(obj, de) {\n            return new NamedTupleMember(\n                obj.name,\n                obj.isOptional,\n                de.reviveType(obj.element),\n            );\n        },\n        typeOperator(obj, de) {\n            return new TypeOperatorType(\n                de.reviveType(obj.target),\n                obj.operator,\n            );\n        },\n        union(obj, de) {\n            return new UnionType(obj.types.map((t) => de.reviveType(t)));\n        },\n        unknown(obj) {\n            return new UnknownType(obj.name);\n        },\n    };\n\n    /**\n     * Only set when deserializing.\n     */\n    projectRoot!: NormalizedPath;\n\n    oldIdToNewId: Record<ReflectionId, ReflectionId | undefined> = {};\n    oldFileIdToNewFileId: Record<FileId, FileId | undefined> = {};\n    project: ProjectReflection | undefined;\n\n    constructor(public logger: Logger) {}\n\n    addDeserializer(de: DeserializerComponent): void {\n        insertPrioritySorted(this.deserializers, de);\n    }\n\n    /**\n     * Revive a single project into the structure it was originally created with.\n     * This is generally not appropriate for merging multiple projects since projects may\n     * contain reflections in their root, not inside a module.\n     */\n    reviveProject(\n        name: string,\n        projectObj: JSONOutput.ProjectReflection,\n        options: {\n            projectRoot: NormalizedPath;\n            registry: FileRegistry;\n        },\n    ): ProjectReflection {\n        assert(\n            this.deferred.length === 0,\n            \"Deserializer.defer was called when not deserializing\",\n        );\n\n        if (!supportedSchemaVersions.includes(projectObj.schemaVersion)) {\n            throw new Error(\n                `Attempted to deserialize version \"${projectObj.schemaVersion}\" JSON, which is not supported. Supported versions: ${\n                    supportedSchemaVersions.join(\", \")\n                }`,\n            );\n        }\n\n        const project = new ProjectReflection(\n            name || projectObj.name,\n            options.registry,\n        );\n        this.project = project;\n        this.projectRoot = options.projectRoot;\n        this.oldIdToNewId = { [projectObj.id]: project.id };\n        this.oldFileIdToNewFileId = {};\n        this.fromObject(project, projectObj);\n\n        const deferred = this.deferred;\n        this.deferred = [];\n        for (const def of deferred) {\n            def(project);\n        }\n\n        assert(\n            this.deferred.length === 0,\n            \"Work may not be double deferred when deserializing.\",\n        );\n\n        assert(\n            this.activeReflection.length === 0,\n            \"Imbalanced reflection deserialization\",\n        );\n\n        this.project = undefined;\n        this.projectRoot = undefined!;\n        this.oldIdToNewId = {};\n        this.oldFileIdToNewFileId = {};\n        return project;\n    }\n\n    reviveProjects(\n        name: string,\n        projects: readonly JSONOutput.ProjectReflection[],\n        options: {\n            projectRoot: NormalizedPath;\n            registry: FileRegistry;\n            alwaysCreateEntryPointModule: boolean;\n        },\n    ): ProjectReflection {\n        if (\n            projects.length === 1 &&\n            !options.alwaysCreateEntryPointModule\n        ) {\n            return this.reviveProject(name, projects[0], options);\n        }\n\n        const project = new ProjectReflection(name, options.registry);\n        this.project = project;\n        this.projectRoot = options.projectRoot;\n\n        for (const proj of projects) {\n            assert(\n                this.deferred.length === 0,\n                \"Deserializer.defer was called when not deserializing\",\n            );\n\n            if (!supportedSchemaVersions.includes(proj.schemaVersion)) {\n                throw new Error(\n                    `Attempted to deserialize version \"${proj.schemaVersion}\" JSON, which is not supported. Supported versions: ${\n                        supportedSchemaVersions.join(\", \")\n                    }`,\n                );\n            }\n\n            const projModule = new DeclarationReflection(\n                proj.name,\n                ReflectionKind.Module,\n                project,\n            );\n            project.registerReflection(projModule, undefined, undefined);\n            project.addChild(projModule);\n            this.oldIdToNewId = { [proj.id]: projModule.id };\n            this.oldFileIdToNewFileId = {};\n            this.fromObject(projModule, proj);\n\n            const deferred = this.deferred;\n            this.deferred = [];\n            for (const def of deferred) {\n                def(project);\n            }\n            assert(\n                this.deferred.length === 0,\n                \"Work may not be double deferred when deserializing.\",\n            );\n\n            assert(\n                this.activeReflection.length === 0,\n                \"Imbalanced reflection deserialization\",\n            );\n        }\n\n        this.oldIdToNewId = {};\n        this.oldFileIdToNewFileId = {};\n        this.project = undefined;\n        this.projectRoot = undefined!;\n        return project;\n    }\n\n    revive<T extends object, U extends Deserializable<T>>(\n        source: NonNullable<T>,\n        creator: (obj: T) => U,\n    ): U;\n    revive<T extends object, U extends Deserializable<T>>(\n        source: T | undefined,\n        creator: (obj: T) => U,\n    ): U | undefined;\n    revive<T extends object, U extends Deserializable<T>>(\n        source: T | undefined,\n        creator: (obj: T) => U,\n    ): U | undefined {\n        if (source) {\n            const revived = creator(source);\n            this.fromObject(revived, source);\n            return revived;\n        }\n    }\n\n    reviveMany<T, U extends Deserializable<T>>(\n        sourceArray: T[],\n        creator: (obj: T) => U,\n    ): U[];\n    reviveMany<T, U extends Deserializable<T>>(\n        sourceArray: T[] | undefined,\n        creator: (obj: T) => U,\n    ): U[] | undefined;\n    reviveMany<T, U extends Deserializable<T>>(\n        sourceArray: T[] | undefined,\n        creator: (obj: T) => U,\n    ): U[] | undefined {\n        if (sourceArray) {\n            return sourceArray.map((item) => {\n                const revived = creator(item);\n                this.fromObject(revived, item);\n                return revived;\n            });\n        }\n    }\n\n    reviveType<T extends JSONOutput.SomeType>(obj: T): TypeKindMap[T[\"type\"]];\n    reviveType<T extends JSONOutput.SomeType>(\n        obj: T | undefined,\n    ): TypeKindMap[T[\"type\"]] | undefined;\n    reviveType(obj: JSONOutput.SomeType | undefined): SomeType | undefined {\n        return this.revive(obj, (o) => this.constructType(o));\n    }\n\n    constructReflection<T extends JSONOutput.SomeReflection>(\n        obj: T,\n    ): ReflectionVariant[T[\"variant\"]] {\n        assert(this.activeReflection.length > 0);\n        const result = this.reflectionBuilders[obj.variant](\n            this.activeReflection[this.activeReflection.length - 1] as never,\n            obj as never,\n        );\n        this.oldIdToNewId[obj.id] = result.id;\n        this.project!.registerReflection(result, undefined, undefined);\n\n        return result as any;\n    }\n\n    constructType<T extends JSONOutput.SomeType>(\n        obj: T,\n    ): TypeKindMap[T[\"type\"]] {\n        const result = this.typeBuilders[obj.type](obj as never, this);\n        return result as any;\n    }\n\n    fromObject<T>(\n        receiver: { fromObject(d: Deserializer, o: T): void },\n        obj: T,\n    ) {\n        if (receiver instanceof Reflection) {\n            this.activeReflection.push(receiver);\n        }\n        receiver.fromObject(this, obj);\n\n        for (const de of this.deserializers) {\n            if (de.supports(receiver, obj)) {\n                de.fromObject(receiver, obj);\n            }\n        }\n\n        if (receiver instanceof Reflection) {\n            this.activeReflection.pop();\n        }\n    }\n\n    /**\n     * Defers work until the initial pass of serialization has been completed.\n     * This can be used to set up references which cannot be immediately restored.\n     *\n     * May only be called when deserializing.\n     */\n    defer(cb: (project: ProjectReflection) => void) {\n        this.deferred.push(cb);\n    }\n}\n"
  },
  {
    "path": "src/lib/serialization/events.ts",
    "content": "import type { ProjectReflection } from \"#models\";\nimport type { ProjectReflection as JSONProjectReflection } from \"./schema.js\";\n\n/**\n * An event emitted by the {@link Serializer} class at the very beginning and\n * ending of the a project serialization process.\n *\n * @see {@link Serializer.EVENT_BEGIN}\n * @see {@link Serializer.EVENT_END}\n */\nexport class SerializeEvent {\n    /**\n     * The project the renderer is currently processing.\n     */\n    readonly project: ProjectReflection;\n\n    output: JSONProjectReflection | undefined;\n\n    constructor(project: ProjectReflection, output?: JSONProjectReflection) {\n        this.project = project;\n        this.output = output;\n    }\n}\n"
  },
  {
    "path": "src/lib/serialization/index.ts",
    "content": "export type { SerializerComponent } from \"./components.js\";\nexport { type Deserializable, Deserializer, type DeserializerComponent } from \"./deserializer.js\";\nexport { SerializeEvent } from \"./events.js\";\nexport * as JSONOutput from \"./schema.js\";\nexport { Serializer, type SerializerEvents } from \"./serializer.js\";\n"
  },
  {
    "path": "src/lib/serialization/schema.ts",
    "content": "/**\n * Contains interfaces which describe the JSON output. Each interface is related to a specific type of serializer.\n *\n * ## Plugins\n * Plugins which modify the serialization process can use declaration merging\n * to add custom properties to the exported interfaces.\n * For example, if your custom serializer adds a property to all {@link Reflection} objects:\n * ```ts\n * declare module 'typedoc/dist/lib/serialization/schema' {\n *     export interface AbstractReflection {\n *         myCustomProp: boolean\n *     }\n * }\n * ```\n *\n * If a plugin defines a new Model type, {@link ModelToObject} will not pick up the serializer type and\n * the resulting type will not be included in the return type of {@link Serializer.toObject}.\n * To fix this, use declaration merging to augment the {@link Serializer} class.\n * ```ts\n * declare module 'typedoc/dist/lib/serialization/serializer' {\n *     export interface Serializer {\n *         toObject(value: CustomModel, obj?: Partial<CustomModel>): CustomOutput\n *     }\n * }\n * ```\n *\n * For documentation on the JSON output properties, view the corresponding model.\n * @summary Contains interfaces which describe the JSON output.\n * @module\n */\n\nimport type * as M from \"#models\";\nimport type { IfInternal, NormalizedPath, TagString } from \"#utils\";\n\n// Keep this in sync with JSON_SCHEMA_VERSION in ProjectReflection.ts\nexport const SCHEMA_VERSION = \"2.0\";\n\n/**\n * Describes the mapping from Model types to the corresponding JSON output type.\n */\nexport type ModelToObject<T> = [T] extends [Array<infer U>] ? ModelToObject<U>[] :\n    [M.SomeType] extends [T] ? SomeType :\n    _ModelToObject<T>;\n\n// Order matters here. Some types are subtypes of other types.\ntype _ModelToObject<T> =\n    // Reflections\n    T extends Primitive ? T :\n        Required<T> extends Required<M.ReflectionGroup> ? ReflectionGroup :\n        Required<T> extends Required<M.ReflectionCategory> ? ReflectionCategory :\n        T extends M.ReflectionVariant[keyof M.ReflectionVariant] ? ReflectionVariantMap[T[\"variant\"]] :\n        // Types\n        T extends M.SomeType ? TypeKindMap[T[\"type\"]] :\n        T extends M.Type ? SomeType :\n        // Miscellaneous\n        T extends M.Comment ? Comment :\n        T extends M.CommentTag ? CommentTag :\n        T extends M.CommentDisplayPart ? CommentDisplayPart :\n        T extends M.SourceReference ? SourceReference :\n        T extends M.FileRegistry ? FileRegistry :\n        T extends M.ReflectionSymbolId ? ReflectionSymbolId :\n        never;\n\ntype Primitive = string | number | undefined | null | boolean;\n\n// Separate helper so that we can trigger distribution.\ntype ToSerialized<T> = T extends Primitive ? T :\n    T extends bigint ? { value: string; negative: boolean } :\n    ModelToObject<T>;\n\n/**\n * Helper to describe a set of serialized properties. Primitive types are returned\n * directly, while other models are first passed through ModelToObject.\n * This helper removes the readonly modifier from properties since the result of serialization\n * is a plain object that consumers may modify as they choose, TypeDoc doesn't care.\n */\ntype S<T, K extends keyof T> = {\n    -readonly [K2 in K]: ToSerialized<T[K2]>;\n};\n\nexport type ReflectionId = M.ReflectionId;\nexport type FileId = M.FileId;\n\nexport interface ReflectionSymbolId {\n    packageName: string;\n    packagePath: NormalizedPath;\n    qualifiedName: string;\n}\n\nexport interface ReflectionGroup extends S<M.ReflectionGroup, \"title\" | \"description\" | \"categories\"> {\n    children?: M.ReflectionGroup[\"children\"][number][\"id\"][];\n}\n\nexport interface ReflectionCategory extends S<M.ReflectionCategory, \"title\" | \"description\"> {\n    children?: M.ReflectionCategory[\"children\"][number][\"id\"][];\n}\n\n// Reflections\n\n/** @category Reflections */\nexport interface ReflectionVariantMap {\n    declaration: DeclarationReflection;\n    param: ParameterReflection;\n    project: ProjectReflection;\n    reference: ReferenceReflection;\n    signature: SignatureReflection;\n    typeParam: TypeParameterReflection;\n    document: DocumentReflection;\n}\n\n/** @category Reflections */\nexport type SomeReflection = ReflectionVariantMap[keyof ReflectionVariantMap];\n\n/** @category Reflections */\nexport interface DocumentReflection extends\n    Omit<Reflection, \"variant\">,\n    S<\n        M.DocumentReflection,\n        \"variant\" | \"content\" | \"relevanceBoost\" | \"children\"\n    >\n{\n    frontmatter: Record<string, unknown>;\n}\n\n/** @category Reflections */\nexport interface ReferenceReflection\n    extends Omit<DeclarationReflection, \"variant\">, S<M.ReferenceReflection, \"variant\">\n{\n    /**\n     * -1 if the reference refers to a symbol that does not exist in the documentation.\n     * Otherwise, the reflection ID.\n     */\n    target: ReflectionId;\n}\n\n/** @category Reflections */\nexport interface SignatureReflection extends\n    Omit<Reflection, \"variant\">,\n    S<\n        M.SignatureReflection,\n        | \"variant\"\n        | \"sources\"\n        | \"parameters\"\n        | \"typeParameters\"\n        | \"type\"\n        | \"overwrites\"\n        | \"inheritedFrom\"\n        | \"implementationOf\"\n    >\n{\n}\n\n/** @category Reflections */\nexport interface ParameterReflection\n    extends Omit<Reflection, \"variant\">, S<M.ParameterReflection, \"variant\" | \"type\" | \"defaultValue\">\n{\n    variant: \"param\";\n}\n\n/** @category Reflections */\nexport interface DeclarationReflection extends\n    Omit<ContainerReflection, \"variant\">,\n    S<\n        M.DeclarationReflection,\n        | \"variant\"\n        | \"packageVersion\"\n        | \"sources\"\n        | \"relevanceBoost\"\n        | \"type\"\n        | \"signatures\"\n        | \"indexSignatures\"\n        | \"defaultValue\"\n        | \"overwrites\"\n        | \"inheritedFrom\"\n        | \"implementationOf\"\n        | \"extendedTypes\"\n        | \"extendedBy\"\n        | \"implementedTypes\"\n        | \"implementedBy\"\n        | \"getSignature\"\n        | \"setSignature\"\n        | \"typeParameters\"\n        | \"readme\"\n    >\n{\n}\n\n/** @category Reflections */\nexport interface TypeParameterReflection extends\n    Omit<Reflection, \"variant\">,\n    S<\n        M.TypeParameterReflection,\n        \"variant\" | \"type\" | \"default\" | \"varianceModifier\"\n    >\n{}\n\n/** @category Reflections */\nexport interface ProjectReflection extends\n    Omit<ContainerReflection, \"variant\">,\n    S<\n        M.ProjectReflection,\n        \"variant\" | \"packageName\" | \"packageVersion\" | \"readme\"\n    >\n{\n    /**\n     * Used to determine if TypeDoc supports deserializing the specified json\n     * See {@link SCHEMA_VERSION} for the current version.\n     */\n    schemaVersion: string;\n    symbolIdMap:\n        | Record<ReflectionId, ReflectionSymbolId>\n        | IfInternal<undefined, never>;\n    files: FileRegistry;\n}\n\n/** @category Reflections */\nexport interface ContainerReflection extends\n    Reflection,\n    S<\n        M.ContainerReflection,\n        \"children\" | \"documents\" | \"groups\" | \"categories\"\n    >\n{\n    childrenIncludingDocuments?: ReflectionId[];\n}\n\n/** @category Reflections */\nexport interface Reflection extends S<M.Reflection, \"id\" | \"variant\" | \"name\" | \"kind\" | \"comment\"> {\n    flags: ReflectionFlags;\n}\n\n// Types\n\n/** @category Types */\nexport type SomeType = TypeKindMap[keyof TypeKindMap];\n\n/** @category Types */\nexport type TypeKindMap = {\n    array: ArrayType;\n    conditional: ConditionalType;\n    indexedAccess: IndexedAccessType;\n    inferred: InferredType;\n    intersection: IntersectionType;\n    intrinsic: IntrinsicType;\n    literal: LiteralType;\n    mapped: MappedType;\n    optional: OptionalType;\n    predicate: PredicateType;\n    query: QueryType;\n    reference: ReferenceType;\n    reflection: ReflectionType;\n    rest: RestType;\n    templateLiteral: TemplateLiteralType;\n    tuple: TupleType;\n    namedTupleMember: NamedTupleMemberType;\n    typeOperator: TypeOperatorType;\n    union: UnionType;\n    unknown: UnknownType;\n};\n\n/** @category Types */\nexport interface ArrayType extends Type, S<M.ArrayType, \"type\" | \"elementType\"> {}\n\n/** @category Types */\nexport interface ConditionalType extends\n    Type,\n    S<\n        M.ConditionalType,\n        \"type\" | \"checkType\" | \"extendsType\" | \"trueType\" | \"falseType\"\n    >\n{}\n\n/** @category Types */\nexport interface IndexedAccessType extends Type, S<M.IndexedAccessType, \"type\" | \"indexType\" | \"objectType\"> {}\n\n/** @category Types */\nexport interface InferredType extends Type, S<M.InferredType, \"type\" | \"name\" | \"constraint\"> {}\n\n/** @category Types */\nexport interface IntersectionType extends Type, S<M.IntersectionType, \"type\" | \"types\"> {}\n\n/** @category Types */\nexport interface IntrinsicType extends Type, S<M.IntrinsicType, \"type\" | \"name\"> {}\n\n/** @category Types */\nexport interface OptionalType extends Type, S<M.OptionalType, \"type\" | \"elementType\"> {}\n\n/** @category Types */\nexport interface PredicateType extends Type, S<M.PredicateType, \"type\" | \"name\" | \"asserts\" | \"targetType\"> {}\n\n/** @category Types */\nexport interface QueryType extends Type, S<M.QueryType, \"type\" | \"queryType\"> {}\n\n/** @category Types */\nexport interface ReferenceType extends\n    Type,\n    S<\n        M.ReferenceType,\n        \"type\" | \"name\" | \"typeArguments\" | \"package\" | \"externalUrl\"\n    >\n{\n    target: ReflectionId | ReflectionSymbolId;\n    qualifiedName?: string;\n    refersToTypeParameter?: boolean;\n    preferValues?: boolean;\n    highlightedProperties?: Record<string, CommentDisplayPart[]>;\n}\n\n/** @category Types */\nexport interface ReflectionType extends Type, S<M.ReflectionType, \"type\" | \"declaration\"> {}\n\n/** @category Types */\nexport interface RestType extends Type, S<M.RestType, \"type\" | \"elementType\"> {}\n\n/** @category Types */\nexport interface LiteralType extends Type, S<M.LiteralType, \"type\" | \"value\"> {}\n\n/** @category Types */\nexport interface TupleType extends Type, S<M.TupleType, \"type\"> {\n    elements?: ModelToObject<M.TupleType[\"elements\"]>;\n}\n\n/** @category Types */\nexport interface NamedTupleMemberType extends Type, S<M.NamedTupleMember, \"type\" | \"name\" | \"isOptional\" | \"element\"> {}\n\n/** @category Types */\nexport interface TemplateLiteralType extends Type, S<M.TemplateLiteralType, \"type\" | \"head\"> {\n    tail: [SomeType, string][];\n}\n\n/** @category Types */\nexport interface MappedType extends\n    Type,\n    S<\n        M.MappedType,\n        | \"type\"\n        | \"parameter\"\n        | \"parameterType\"\n        | \"templateType\"\n        | \"readonlyModifier\"\n        | \"optionalModifier\"\n        | \"nameType\"\n    >\n{}\n\n/** @category Types */\nexport interface TypeOperatorType extends Type, S<M.TypeOperatorType, \"type\" | \"operator\" | \"target\"> {}\n\n/** @category Types */\nexport interface UnionType extends Type, S<M.UnionType, \"type\" | \"types\" | \"elementSummaries\"> {}\n\n/** @category Types */\nexport interface UnknownType extends Type, S<M.UnknownType, \"type\" | \"name\"> {}\n\n/** @category Types */\nexport interface Type {}\n\n// Miscellaneous\n\ntype BoolKeys<T> = {\n    [K in keyof T]-?: T[K] extends boolean ? K : never;\n}[keyof T];\n\nexport interface ReflectionFlags extends Partial<S<M.ReflectionFlags, BoolKeys<M.ReflectionFlags>>> {}\n\n/** @category Comments */\nexport interface Comment extends Partial<S<M.Comment, \"blockTags\" | \"label\">> {\n    summary: CommentDisplayPart[];\n    modifierTags?: TagString[];\n}\n\n/** @category Comments */\nexport interface CommentTag extends S<M.CommentTag, \"tag\" | \"name\" | \"typeAnnotation\"> {\n    content: CommentDisplayPart[];\n}\n\n/**\n * @see {@link M.CommentDisplayPart}\n * @category Comments\n */\nexport type CommentDisplayPart =\n    | { kind: \"text\"; text: string }\n    | { kind: \"code\"; text: string }\n    | InlineTagDisplayPart\n    | RelativeLinkDisplayPart;\n\n/**\n * If `target` is a number, it is a reflection ID. If a string, it is a URL.\n * `target` will only be set for `@link`, `@linkcode`, and `@linkplain` tags.\n * @category Comments\n */\nexport interface InlineTagDisplayPart {\n    kind: \"inline-tag\";\n    tag: TagString;\n    text: string;\n    target?: string | ReflectionId | ReflectionSymbolId;\n    tsLinkText?: string;\n}\n\n/**\n * This is used for relative links within comments/documents.\n * It is used to mark pieces of text which need to be replaced\n * to make links work properly.\n */\nexport interface RelativeLinkDisplayPart {\n    kind: \"relative-link\";\n    /**\n     * The original relative text from the parsed comment.\n     */\n    text: string;\n    /**\n     * File ID, if present\n     */\n    target?: FileId;\n    /**\n     * Anchor within the target file, if present\n     */\n    targetAnchor?: string;\n}\n\nexport interface SourceReference extends S<M.SourceReference, \"fileName\" | \"line\" | \"character\" | \"url\"> {}\n\nexport interface FileRegistry {\n    /** Relative path according to the serialization root */\n    entries: Record<FileId, NormalizedPath>;\n    /** File ID to reflection ID */\n    reflections: Record<FileId, ReflectionId>;\n}\n"
  },
  {
    "path": "src/lib/serialization/serializer.ts",
    "content": "import type { ProjectReflection } from \"#models\";\n\nimport { SerializeEvent } from \"./events.js\";\nimport type { ModelToObject } from \"./schema.js\";\nimport type { SerializerComponent } from \"./components.js\";\nimport { EventDispatcher, insertPrioritySorted, type NormalizedPath, removeIfPresent } from \"#utils\";\n\nexport interface SerializerEvents {\n    begin: [SerializeEvent];\n    end: [SerializeEvent];\n}\n\n/**\n * Serializes TypeDoc's models to JSON\n *\n * @group None\n * @summary Serializes TypeDoc's models to JSON\n */\nexport class Serializer extends EventDispatcher<SerializerEvents> {\n    /**\n     * Triggered when the {@link Serializer} begins transforming a project.\n     * @event\n     */\n    static readonly EVENT_BEGIN = \"begin\";\n\n    /**\n     * Triggered when the {@link Serializer} has finished transforming a project.\n     * @event\n     */\n    static readonly EVENT_END = \"end\";\n\n    private serializers: SerializerComponent<any>[] = [];\n\n    /**\n     * Only set when serializing.\n     */\n    projectRoot!: NormalizedPath;\n\n    /**\n     * Only set when serializing\n     */\n    project!: ProjectReflection;\n\n    addSerializer<T extends object>(serializer: SerializerComponent<T>): void {\n        insertPrioritySorted(this.serializers, serializer);\n    }\n\n    removeSerializer(serializer: SerializerComponent<any>): void {\n        removeIfPresent(this.serializers, serializer);\n    }\n\n    toObject<T extends { toObject(serializer: Serializer): ModelToObject<T> }>(\n        value: T,\n    ): ModelToObject<T>;\n    toObject<T extends { toObject(serializer: Serializer): ModelToObject<T> }>(\n        value: T | undefined,\n    ): ModelToObject<T> | undefined;\n    toObject(\n        value: { toObject(serializer: Serializer): any } | undefined,\n    ): unknown {\n        if (value === undefined) {\n            return undefined;\n        }\n\n        return this.serializers\n            .filter((s) => s.supports(value))\n            .reduce(\n                (val, s) => s.toObject(value, val, this),\n                value.toObject(this),\n            );\n    }\n\n    toObjectsOptional<\n        T extends { toObject(serializer: Serializer): ModelToObject<T> },\n    >(value: T[] | undefined): ModelToObject<T>[] | undefined {\n        if (!value || value.length === 0) {\n            return undefined;\n        }\n\n        return value.map((val) => this.toObject(val));\n    }\n\n    /**\n     * Same as toObject but emits {@link Serializer.EVENT_BEGIN} and {@link Serializer.EVENT_END} events.\n     * @param value\n     */\n    projectToObject(\n        value: ProjectReflection,\n        projectRoot: NormalizedPath,\n    ): ModelToObject<ProjectReflection> {\n        this.projectRoot = projectRoot;\n        this.project = value;\n\n        const eventBegin = new SerializeEvent(value);\n        this.trigger(Serializer.EVENT_BEGIN, eventBegin);\n\n        const project = this.toObject(value);\n\n        const eventEnd = new SerializeEvent(value, project);\n        this.trigger(Serializer.EVENT_END, eventEnd);\n\n        this.project = undefined!;\n        this.projectRoot = undefined!;\n\n        return project;\n    }\n}\n"
  },
  {
    "path": "src/lib/types/shiki/shiki.d.ts",
    "content": "// Shiki 1.x declares a `loadWasm` function which takes these types as input.\n// They are declared in the DOM library, but since TypeDoc doesn't use that library,\n// we have to declare some shims, intentionally crafted to not be accidentally\n// constructed.\n\ndeclare namespace WebAssembly {\n    interface Instance {\n        __shikiHack: never;\n        exports: unknown;\n    }\n    interface WebAssemblyInstantiatedSource {\n        __shikiHack: never;\n    }\n    type ImportValue = unknown;\n}\n\ninterface Response {\n    __shikiHack: never;\n}\n"
  },
  {
    "path": "src/lib/types/ts-internal/index.d.ts",
    "content": "import type ts from \"typescript\";\n\n/**\n * Expose the internal TypeScript APIs that are used by TypeDoc\n * @ignore\n */\ndeclare module \"typescript\" {\n    interface Node {\n        // https://github.com/microsoft/TypeScript/blob/v4.1.5/src/compiler/types.ts#L847\n        symbol?: ts.Symbol;\n    }\n\n    interface Symbol {\n        // https://github.com/microsoft/TypeScript/blob/v4.7.4/src/compiler/types.ts#L4941\n        // https://github.com/microsoft/TypeScript/issues/38344\n        parent?: ts.Symbol;\n    }\n\n    interface Type {\n        id: number;\n    }\n\n    // https://github.com/microsoft/TypeScript/blob/v5.0.2/src/compiler/utilities.ts#L7432\n    export function getCheckFlags(symbol: ts.Symbol): CheckFlags;\n\n    export function getAllSuperTypeNodes(node: ts.Node): readonly ts.TypeNode[];\n\n    // https://github.com/microsoft/TypeScript/blob/e213b2af3430bdc9cf5fbc76a8634d832e7aaaaa/src/compiler/types.ts#L5298-L5299\n    export interface UnionType {\n        /* @internal */\n        origin?: ts.Type; // Denormalized union, intersection, or index type in which union originates\n    }\n\n    // https://github.com/microsoft/TypeScript/blob/v4.1.5/src/compiler/types.ts#L4707-L4732\n    /* @internal */\n    export enum CheckFlags {\n        Instantiated = 1 << 0, // Instantiated symbol\n        SyntheticProperty = 1 << 1, // Property in union or intersection type\n        SyntheticMethod = 1 << 2, // Method in union or intersection type\n        Readonly = 1 << 3, // Readonly transient symbol\n        ReadPartial = 1 << 4, // Synthetic property present in some but not all constituents\n        WritePartial = 1 << 5, // Synthetic property present in some but only satisfied by an index signature in others\n        HasNonUniformType = 1 << 6, // Synthetic property with non-uniform type in constituents\n        HasLiteralType = 1 << 7, // Synthetic property with at least one literal type in constituents\n        ContainsPublic = 1 << 8, // Synthetic property with public constituent(s)\n        ContainsProtected = 1 << 9, // Synthetic property with protected constituent(s)\n        ContainsPrivate = 1 << 10, // Synthetic property with private constituent(s)\n        ContainsStatic = 1 << 11, // Synthetic property with static constituent(s)\n        Late = 1 << 12, // Late-bound symbol for a computed property with a dynamic name\n        ReverseMapped = 1 << 13, // Property of reverse-inferred homomorphic mapped type\n        OptionalParameter = 1 << 14, // Optional parameter\n        RestParameter = 1 << 15, // Rest parameter\n        DeferredType = 1 << 16, // Calculation of the type of this symbol is deferred due to processing costs, should be fetched with `getTypeOfSymbolWithDeferredType`\n        HasNeverType = 1 << 17, // Synthetic property with at least one never type in constituents\n        Mapped = 1 << 18, // Property of mapped type\n        StripOptional = 1 << 19, // Strip optionality in mapped property\n        Synthetic = SyntheticProperty | SyntheticMethod,\n        Discriminant = HasNonUniformType | HasLiteralType,\n        Partial = ReadPartial | WritePartial,\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/ValidatingFileRegistry.ts",
    "content": "import { type FileId, FileRegistry } from \"../models/FileRegistry.js\";\nimport type { Deserializer, JSONOutput } from \"#serialization\";\nimport { i18n, type NormalizedPath, NormalizedPathUtils } from \"#utils\";\nimport { existsSync } from \"fs\";\n\nexport class ValidatingFileRegistry extends FileRegistry {\n    basePath: NormalizedPath;\n\n    constructor(basePath: NormalizedPath = \"\") {\n        super();\n        this.basePath = basePath;\n    }\n\n    override register(\n        sourcePath: NormalizedPath,\n        relativePath: NormalizedPath,\n    ): { target: FileId; anchor: string | undefined } | undefined {\n        let absolute = NormalizedPathUtils.resolve(NormalizedPathUtils.dirname(sourcePath), relativePath);\n        let absoluteWithoutAnchor = absolute.replace(/#.*/, \"\");\n        // Note: We allow paths to directories to be registered here, but the AssetsPlugin will not\n        // copy them to the output path. This is so that we can link to directories and associate them\n        // with reflections in packages mode.\n        if (!existsSync(absoluteWithoutAnchor)) {\n            // If the relative path didn't exist normally, also check the path relative to the assetBasePath option\n            if (this.basePath != \"\") {\n                absolute = NormalizedPathUtils.resolve(this.basePath, relativePath);\n                absoluteWithoutAnchor = absolute.replace(/#.*/, \"\");\n                if (!existsSync(absoluteWithoutAnchor)) {\n                    return;\n                }\n            } else {\n                return;\n            }\n        }\n        return this.registerAbsolute(absolute);\n    }\n\n    override fromObject(de: Deserializer, obj: JSONOutput.FileRegistry) {\n        for (const [key, val] of Object.entries(obj.entries)) {\n            const absolute = NormalizedPathUtils.resolve(de.projectRoot, val);\n            if (!existsSync(absolute)) {\n                de.logger.warn(\n                    i18n.saved_relative_path_0_resolved_from_1_does_not_exist(\n                        val,\n                        de.projectRoot,\n                    ),\n                );\n                continue;\n            }\n\n            de.oldFileIdToNewFileId[+key as FileId] = this.registerAbsolute(absolute).target;\n        }\n\n        de.defer((project) => {\n            for (const [media, reflId] of Object.entries(obj.reflections)) {\n                const refl = project.getReflectionById(\n                    de.oldIdToNewId[reflId]!,\n                );\n                if (refl) {\n                    this.mediaToReflection.set(\n                        de.oldFileIdToNewFileId[+media as FileId]!,\n                        refl.id,\n                    );\n                } else {\n                    de.logger.warn(\n                        i18n.serialized_project_referenced_0_not_part_of_project(\n                            reflId.toString(),\n                        ),\n                    );\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/component.ts",
    "content": "import type { Application } from \"../application.js\";\nimport { EventDispatcher } from \"#utils\";\n\n/**\n * Exposes a reference to the root Application component.\n */\nexport interface ComponentHost {\n    readonly application: Application;\n}\n\nexport interface Component<E extends Record<keyof E, unknown[]> = {}> extends AbstractComponent<ComponentHost, E> {}\n\n/**\n * Component base class.  Has an owner (unless it's the application root component),\n * can dispatch events to its children, and has access to the root Application component.\n *\n * @template O type of component's owner.\n */\nexport abstract class AbstractComponent<\n    O extends ComponentHost,\n    E extends Record<keyof E, unknown[]>,\n> extends EventDispatcher<E> implements ComponentHost {\n    /**\n     * The owner of this component instance.\n     */\n    private _componentOwner: O;\n\n    /**\n     * The name of this component as set by the `@Component` decorator.\n     */\n    public componentName!: string;\n\n    /**\n     * Create new Component instance.\n     */\n    constructor(owner: O) {\n        super();\n        this._componentOwner = owner;\n    }\n\n    /**\n     * Return the application / root component instance.\n     */\n    get application(): Application {\n        if (this._componentOwner === null) {\n            return this as any as Application;\n        }\n        return this._componentOwner.application;\n    }\n\n    /**\n     * Return the owner of this component.\n     */\n    get owner(): O {\n        return this._componentOwner === null\n            ? (this as any)\n            : this._componentOwner;\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/compress.ts",
    "content": "import { deflate } from \"zlib\";\nimport { promisify } from \"util\";\n\nconst deflateP = promisify(deflate);\n\n/**\n * Compresses a JSON-serializable object into a Base64-encoded deflate string.\n *\n * @param data - The JSON-serializable object to compress.\n * @returns A promise that resolves to a Base64-encoded string of the deflate-compressed data.\n */\nexport async function compressJson(data: any) {\n    const gz = await deflateP(Buffer.from(JSON.stringify(data)));\n    return gz.toString(\"base64\");\n}\n"
  },
  {
    "path": "src/lib/utils/declaration-maps.ts",
    "content": "import type ts from \"typescript\";\nimport { existsSync } from \"fs\";\nimport { readFile } from \"./fs.js\";\nimport { Validation } from \"#utils\";\nimport { join, relative, resolve } from \"path\";\nimport { getCommonDirectory, normalizePath } from \"./paths.js\";\n\nconst declarationMapCache = new Map<string, string>();\n\nexport function resolveDeclarationMaps(file: string): string {\n    if (!/\\.d\\.[cm]?ts$/.test(file)) return file;\n    if (declarationMapCache.has(file)) return declarationMapCache.get(file)!;\n\n    const mapFile = file + \".map\";\n    if (!existsSync(mapFile)) return file;\n\n    let sourceMap: unknown;\n    try {\n        sourceMap = JSON.parse(readFile(mapFile)) as unknown;\n    } catch {\n        return file;\n    }\n\n    if (\n        Validation.validate(\n            {\n                file: String,\n                sourceRoot: Validation.optional(String),\n                sources: [Array, String],\n            },\n            sourceMap,\n        )\n    ) {\n        // There's a pretty large assumption in here that we only have\n        // 1 source file per js file. This is a pretty standard typescript approach,\n        // but people might do interesting things with transpilation that could break this.\n        let source = sourceMap.sources[0];\n\n        // If we have a sourceRoot, trim any leading slash from the source, and join them\n        // Similar to how it's done at https://github.com/mozilla/source-map/blob/58819f09018d56ef84dc41ba9c93f554e0645169/lib/util.js#L412\n        if (sourceMap.sourceRoot !== undefined) {\n            source = source.replace(/^\\//, \"\");\n            source = join(sourceMap.sourceRoot, source);\n        }\n\n        const result = resolve(mapFile, \"..\", source);\n        declarationMapCache.set(file, result);\n        return result;\n    }\n\n    return file;\n}\n\n// See also: inferEntryPoints in entry-point.ts\nexport function addInferredDeclarationMapPaths(\n    opts: ts.CompilerOptions,\n    files: readonly string[],\n) {\n    const rootDir = opts.rootDir || getCommonDirectory(files);\n    const declDir = opts.declarationDir || opts.outDir || rootDir;\n\n    for (const file of files) {\n        const mapFile = normalizePath(\n            resolve(declDir, relative(rootDir, file)).replace(\n                /\\.([cm]?[tj]s)x?$/,\n                \".d.$1\",\n            ),\n        );\n        declarationMapCache.set(mapFile, file);\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/entry-point.ts",
    "content": "import { join, relative, resolve } from \"path\";\nimport ts from \"typescript\";\nimport * as FS from \"fs\";\nimport { expandPackages } from \"./package-manifest.js\";\nimport { deriveRootDir, getCommonDirectory, MinimatchSet, nicePath, normalizePath } from \"./paths.js\";\nimport type { Options } from \"./options/index.js\";\nimport { discoverPackageJson, glob, inferPackageEntryPointPaths, isDir } from \"./fs.js\";\nimport { assertNever, type GlobString, i18n, type Logger, type NormalizedPath } from \"#utils\";\nimport { addInferredDeclarationMapPaths, resolveDeclarationMaps } from \"./declaration-maps.js\";\n\n/**\n * Defines how entry points are interpreted.\n * @enum\n */\nexport const EntryPointStrategy = {\n    /**\n     * The default behavior in v0.22+, expects all provided entry points as being part of a single program.\n     * Any directories included in the entry point list will result in `dir/index.([cm][tj]s|[tj]sx?)` being used.\n     */\n    Resolve: \"resolve\",\n    /**\n     * The default behavior in v0.21 and earlier. Behaves like the resolve behavior, but will recursively\n     * expand directories into an entry point for each file within the directory.\n     */\n    Expand: \"expand\",\n    /**\n     * Run TypeDoc in each directory passed as an entry point. Once all directories have been converted,\n     * use the merge option to produce final output.\n     */\n    Packages: \"packages\",\n    /**\n     * Merges multiple previously generated output from TypeDoc's --json output together into a single project.\n     */\n    Merge: \"merge\",\n} as const;\n\nexport type EntryPointStrategy = (typeof EntryPointStrategy)[keyof typeof EntryPointStrategy];\n\nexport interface DocumentationEntryPoint {\n    displayName: string;\n    program: ts.Program;\n    sourceFile: ts.SourceFile;\n}\n\nexport interface DocumentEntryPoint {\n    displayName: string;\n    path: NormalizedPath;\n}\n\nexport function inferEntryPoints(logger: Logger, options: Options, programs?: ts.Program[]) {\n    const packageJson = discoverPackageJson(\n        options.packageDir ?? process.cwd(),\n    );\n    if (!packageJson) {\n        logger.warn(i18n.no_entry_points_provided());\n        return [];\n    }\n\n    const pathEntries = inferPackageEntryPointPaths(packageJson.file);\n\n    const entryPoints: DocumentationEntryPoint[] = [];\n\n    programs ||= getEntryPrograms(\n        pathEntries.map((p) => p[1]),\n        logger,\n        options,\n    );\n\n    // See also: addInferredDeclarationMapPaths in symbol-id factory\n    const jsToTsSource = new Map<string, string>();\n    for (const program of programs) {\n        const opts = program.getCompilerOptions();\n        const rootDir = opts.rootDir || getCommonDirectory(program.getRootFileNames());\n        const outDir = opts.outDir || rootDir;\n\n        for (const tsFile of program.getRootFileNames()) {\n            const jsFile = normalizePath(\n                resolve(outDir, relative(rootDir, tsFile)).replace(\n                    /\\.([cm]?)[tj]sx?$/,\n                    \".$1js\",\n                ),\n            );\n            jsToTsSource.set(jsFile, tsFile);\n        }\n    }\n\n    for (const [name, path] of pathEntries) {\n        // Strip leading ./ from the display name\n        const displayName = name.replace(/^\\.\\/?/, \"\");\n        const targetPath = jsToTsSource.get(normalizePath(path)) || resolveDeclarationMaps(path) || path;\n\n        const program = programs.find((p) => p.getSourceFile(targetPath));\n        if (program) {\n            entryPoints.push({\n                displayName,\n                program,\n                sourceFile: program.getSourceFile(targetPath)!,\n            });\n        } else if (/\\.[cm]?js$/.test(path)) {\n            logger.warn(\n                i18n.failed_to_resolve_0_to_ts_path(nicePath(path)),\n            );\n        }\n    }\n\n    if (entryPoints.length === 0) {\n        logger.warn(i18n.no_entry_points_provided());\n        return [];\n    }\n\n    logger.verbose(\n        `Inferred entry points to be:\\n\\t${entryPoints.map(e => nicePath(e.sourceFile.fileName)).join(\"\\n\\t\")}`,\n    );\n\n    return entryPoints;\n}\n\nexport function getEntryPoints(\n    logger: Logger,\n    options: Options,\n): DocumentationEntryPoint[] | undefined {\n    if (!options.isSet(\"entryPoints\")) {\n        logger.warn(i18n.no_entry_points_provided());\n        return [];\n    }\n\n    const entryPoints = options.getValue(\"entryPoints\");\n    const exclude = options.getValue(\"exclude\");\n\n    // May be set explicitly to be an empty array to only include a readme for a package\n    // See #2264\n    if (entryPoints.length === 0) {\n        return [];\n    }\n\n    let result: DocumentationEntryPoint[] | undefined;\n    const strategy = options.getValue(\"entryPointStrategy\");\n    switch (strategy) {\n        case EntryPointStrategy.Resolve:\n            result = getEntryPointsForPaths(\n                logger,\n                expandGlobs(entryPoints, exclude, logger),\n                options,\n            );\n            break;\n\n        case EntryPointStrategy.Expand:\n            result = getExpandedEntryPointsForPaths(\n                logger,\n                expandGlobs(entryPoints, exclude, logger),\n                options,\n            );\n            break;\n\n        case EntryPointStrategy.Merge:\n        case EntryPointStrategy.Packages:\n            // Doesn't really have entry points in the traditional way of how TypeDoc has dealt with them.\n            return [];\n\n        default:\n            assertNever(strategy);\n    }\n\n    if (result.length === 0) {\n        logger.error(i18n.unable_to_find_any_entry_points());\n        return;\n    }\n\n    return result;\n}\n\n/**\n * Document entry points are markdown documents that the user has requested we include in the project with\n * an option rather than a `@document` tag.\n *\n * @returns A list of `.md` files to include in the documentation as documents.\n */\nexport function getDocumentEntryPoints(\n    logger: Logger,\n    options: Options,\n): DocumentEntryPoint[] {\n    const docGlobs = options.getValue(\"projectDocuments\");\n    if (docGlobs.length === 0) {\n        return [];\n    }\n\n    const docPaths = expandGlobs(docGlobs, [], logger);\n\n    // We might want to expand this in the future, there are quite a lot of extensions\n    // that have at some point or another been used for markdown: https://superuser.com/a/285878\n    const supportedFileRegex = /\\.(md|markdown)$/;\n\n    const expanded = expandInputFiles(\n        logger,\n        docPaths,\n        options,\n        supportedFileRegex,\n    );\n    const baseDir = options.getValue(\"displayBasePath\") || options.getValue(\"basePath\") || getCommonDirectory(expanded);\n    return expanded.map((path) => {\n        return {\n            displayName: relative(baseDir, path).replace(/\\.[^.]+$/, \"\"),\n            path,\n        };\n    });\n}\n\nexport function getWatchEntryPoints(\n    logger: Logger,\n    options: Options,\n    program: ts.Program,\n): DocumentationEntryPoint[] | undefined {\n    let result: DocumentationEntryPoint[] | undefined;\n\n    const entryPoints = options.getValue(\"entryPoints\");\n    const exclude = options.getValue(\"exclude\");\n    const strategy = options.getValue(\"entryPointStrategy\");\n\n    switch (strategy) {\n        case EntryPointStrategy.Resolve:\n            if (options.isSet(\"entryPoints\")) {\n                result = getEntryPointsForPaths(\n                    logger,\n                    expandGlobs(entryPoints, exclude, logger),\n                    options,\n                    [program],\n                );\n            } else {\n                result = inferEntryPoints(logger, options, [program]);\n            }\n            break;\n\n        case EntryPointStrategy.Expand:\n            if (options.isSet(\"entryPoints\")) {\n                result = getExpandedEntryPointsForPaths(\n                    logger,\n                    expandGlobs(entryPoints, exclude, logger),\n                    options,\n                    [program],\n                );\n            } else {\n                result = inferEntryPoints(logger, options, [program]);\n            }\n            break;\n\n        case EntryPointStrategy.Packages:\n            logger.error(i18n.watch_does_not_support_packages_mode());\n            break;\n\n        case EntryPointStrategy.Merge:\n            logger.error(i18n.watch_does_not_support_merge_mode());\n            break;\n\n        default:\n            assertNever(strategy);\n    }\n\n    if (result && result.length === 0) {\n        logger.error(i18n.unable_to_find_any_entry_points());\n        return;\n    }\n\n    return result;\n}\n\nexport function getPackageDirectories(\n    logger: Logger,\n    options: Options,\n    packageGlobPaths: GlobString[],\n) {\n    const exclude = new MinimatchSet(options.getValue(\"exclude\"));\n    const rootDir = deriveRootDir(packageGlobPaths);\n\n    // packages arguments are workspace tree roots, or glob patterns\n    // This expands them to leave only leaf packages\n    return expandPackages(logger, rootDir, packageGlobPaths, exclude);\n}\n\nfunction getModuleName(fileName: string, baseDir: string) {\n    return normalizePath(relative(baseDir, fileName)).replace(\n        /(\\/index)?(\\.d)?\\.([cm][tj]s|[tj]sx?)$/,\n        \"\",\n    );\n}\n\n/**\n * Converts a list of file-oriented paths in to DocumentationEntryPoints for conversion.\n * This is in contrast with the package-oriented `getEntryPointsForPackages`\n */\nfunction getEntryPointsForPaths(\n    logger: Logger,\n    inputFiles: string[],\n    options: Options,\n    programs = getEntryPrograms(inputFiles, logger, options),\n): DocumentationEntryPoint[] {\n    const baseDir = options.getValue(\"displayBasePath\") || options.getValue(\"basePath\") ||\n        getCommonDirectory(inputFiles);\n    const entryPoints: DocumentationEntryPoint[] = [];\n    let expandSuggestion = true;\n\n    entryLoop: for (const fileOrDir of inputFiles.map(normalizePath)) {\n        const toCheck: string[] = [fileOrDir];\n        if (!/\\.([cm][tj]s|[tj]sx?)$/.test(fileOrDir)) {\n            toCheck.push(\n                `${fileOrDir}/index.ts`,\n                `${fileOrDir}/index.cts`,\n                `${fileOrDir}/index.mts`,\n                `${fileOrDir}/index.tsx`,\n                `${fileOrDir}/index.js`,\n                `${fileOrDir}/index.cjs`,\n                `${fileOrDir}/index.mjs`,\n                `${fileOrDir}/index.jsx`,\n            );\n        }\n\n        for (const program of programs) {\n            for (const check of toCheck) {\n                const sourceFile = program.getSourceFile(check);\n                if (sourceFile) {\n                    entryPoints.push({\n                        displayName: getModuleName(resolve(check), baseDir),\n                        sourceFile,\n                        program,\n                    });\n                    continue entryLoop;\n                }\n            }\n        }\n\n        logger.warn(\n            i18n.entry_point_0_not_in_program(nicePath(fileOrDir)),\n        );\n        if (expandSuggestion && isDir(fileOrDir)) {\n            expandSuggestion = false;\n            logger.info(i18n.use_expand_or_glob_for_files_in_dir());\n        }\n    }\n\n    return entryPoints;\n}\n\nexport function getExpandedEntryPointsForPaths(\n    logger: Logger,\n    inputFiles: string[],\n    options: Options,\n    programs = getEntryPrograms(inputFiles, logger, options),\n): DocumentationEntryPoint[] {\n    const compilerOptions = options.getCompilerOptions(logger);\n    const supportedFileRegex = compilerOptions.allowJs || compilerOptions.checkJs\n        ? /\\.([cm][tj]s|[tj]sx?)$/\n        : /\\.([cm]ts|tsx?)$/;\n\n    return getEntryPointsForPaths(\n        logger,\n        expandInputFiles(logger, inputFiles, options, supportedFileRegex),\n        options,\n        programs,\n    );\n}\n\nfunction expandGlobs(globs: GlobString[], exclude: GlobString[], logger: Logger) {\n    const excludePatterns = new MinimatchSet(exclude);\n\n    const base = deriveRootDir(globs);\n    const result = globs.flatMap((entry) => {\n        const result = glob(entry, base, {\n            includeDirectories: true,\n            followSymlinks: true,\n        });\n\n        const filtered = result.filter(\n            (file) => file === entry || !excludePatterns.matchesAny(file),\n        );\n\n        if (result.length === 0) {\n            // #2918 - do not pass entry through nicePath here in case it contains\n            // windows path separators which should cause additional warnings.\n            logger.warn(\n                i18n.glob_0_did_not_match_any_files(entry),\n            );\n        } else if (filtered.length === 0) {\n            logger.warn(\n                i18n.entry_point_0_did_not_match_any_files_after_exclude(\n                    entry,\n                ),\n            );\n        } else if (filtered.length !== 1) {\n            logger.verbose(\n                `Expanded ${entry} to:\\n\\t${\n                    filtered\n                        .map(nicePath)\n                        .join(\"\\n\\t\")\n                }`,\n            );\n        }\n\n        return filtered;\n    });\n\n    return result;\n}\n\nfunction getEntryPrograms(\n    inputFiles: string[],\n    logger: Logger,\n    options: Options,\n) {\n    const noTsConfigFound = options.getFileNames().length === 0 &&\n        options.getProjectReferences().length === 0;\n\n    const rootProgram = noTsConfigFound\n        ? ts.createProgram({\n            rootNames: inputFiles,\n            options: options.getCompilerOptions(logger),\n        })\n        : ts.createProgram({\n            rootNames: options.getFileNames(),\n            options: options.getCompilerOptions(logger),\n            projectReferences: options.getProjectReferences(),\n        });\n\n    addInferredDeclarationMapPaths(\n        options.getCompilerOptions(logger),\n        options.getFileNames(),\n    );\n\n    const programs = [rootProgram];\n    // This might be a solution style tsconfig, in which case we need to add a program for each\n    // reference so that the converter can look through each of these.\n    if (rootProgram.getRootFileNames().length === 0) {\n        logger.verbose(\n            \"tsconfig appears to be a solution style tsconfig - creating programs for references\",\n        );\n        const resolvedReferences = rootProgram.getResolvedProjectReferences();\n        for (const ref of resolvedReferences ?? []) {\n            if (!ref) continue; // This indicates bad configuration... will be reported later.\n\n            programs.push(\n                ts.createProgram({\n                    options: options.fixCompilerOptions(\n                        ref.commandLine.options,\n                        logger,\n                    ),\n                    rootNames: ref.commandLine.fileNames,\n                    projectReferences: ref.commandLine.projectReferences,\n                }),\n            );\n\n            addInferredDeclarationMapPaths(\n                ref.commandLine.options,\n                ref.commandLine.fileNames,\n            );\n        }\n    }\n\n    return programs;\n}\n\n/**\n * Expand a list of input files.\n *\n * Searches for directories in the input files list and replaces them with a\n * listing of all TypeScript files within them. One may use the ```--exclude``` option\n * to filter out files with a pattern.\n *\n * @param inputFiles  The list of files that should be expanded.\n * @returns  The list of input files with expanded directories.\n */\nfunction expandInputFiles(\n    logger: Logger,\n    entryPoints: string[],\n    options: Options,\n    supportedFile: RegExp,\n): NormalizedPath[] {\n    const files: NormalizedPath[] = [];\n\n    const exclude = new MinimatchSet(options.getValue(\"exclude\"));\n\n    function add(file: string, entryPoint: boolean) {\n        let stats: FS.Stats;\n        try {\n            stats = FS.statSync(file);\n        } catch {\n            // No permission or a symbolic link, do not resolve.\n            return;\n        }\n        const fileIsDir = stats.isDirectory();\n        if (fileIsDir && !file.endsWith(\"/\")) {\n            file = `${file}/`;\n        }\n\n        if (fileIsDir) {\n            FS.readdirSync(file).forEach((next) => {\n                add(join(file, next), false);\n            });\n        } else if (supportedFile.test(file)) {\n            if (!entryPoint && exclude.matchesAny(file)) {\n                return;\n            }\n            files.push(normalizePath(file));\n        }\n    }\n\n    entryPoints.forEach((file) => {\n        const resolved = resolve(file);\n        if (!FS.existsSync(resolved)) {\n            logger.warn(i18n.entry_point_0_did_not_exist(file));\n            return;\n        }\n\n        add(resolved, true);\n    });\n\n    return files;\n}\n"
  },
  {
    "path": "src/lib/utils/fs.ts",
    "content": "import * as fs from \"fs\";\nimport { promises as fsp } from \"fs\";\nimport { Minimatch } from \"minimatch\";\nimport { dirname, join, relative, resolve } from \"path\";\nimport { escapeRegExp, type GlobString, type NormalizedPath, Validation } from \"#utils\";\nimport { normalizePath } from \"./paths.js\";\nimport { ok } from \"assert\";\n\nexport function isFile(file: string) {\n    try {\n        return fs.statSync(file).isFile();\n    } catch {\n        return false;\n    }\n}\n\nexport function isDir(path: string) {\n    try {\n        return fs.statSync(path).isDirectory();\n    } catch {\n        return false;\n    }\n}\n\n/**\n * Load the given file and return its contents.\n *\n * @param file  The path of the file to read.\n * @returns The files contents.\n */\nexport function readFile(file: string): string {\n    const buffer = fs.readFileSync(file);\n    switch (buffer[0]) {\n        case 0xfe:\n            if (buffer[1] === 0xff) {\n                let i = 0;\n                while (i + 1 < buffer.length) {\n                    const temp = buffer[i];\n                    buffer[i] = buffer[i + 1];\n                    buffer[i + 1] = temp;\n                    i += 2;\n                }\n                return buffer.toString(\"ucs2\", 2);\n            }\n            break;\n        case 0xff:\n            if (buffer[1] === 0xfe) {\n                return buffer.toString(\"ucs2\", 2);\n            }\n            break;\n        case 0xef:\n            if (buffer[1] === 0xbb) {\n                return buffer.toString(\"utf8\", 3);\n            }\n    }\n\n    return buffer.toString(\"utf8\", 0);\n}\n\n/**\n * Write a file to disc.\n *\n * If the containing directory does not exist it will be created.\n *\n * @param fileName  The name of the file that should be written.\n * @param data  The contents of the file.\n */\nexport function writeFileSync(fileName: string, data: string) {\n    fs.mkdirSync(dirname(normalizePath(fileName)), { recursive: true });\n    fs.writeFileSync(normalizePath(fileName), data);\n}\n\n/**\n * Write a file to disc.\n *\n * If the containing directory does not exist it will be created.\n *\n * @param fileName  The name of the file that should be written.\n * @param data  The contents of the file.\n */\nexport async function writeFile(fileName: string, data: string) {\n    await fsp.mkdir(dirname(normalizePath(fileName)), {\n        recursive: true,\n    });\n    await fsp.writeFile(normalizePath(fileName), data);\n}\n\n/**\n * Copy a file or directory recursively.\n */\nexport async function copy(src: string, dest: string): Promise<void> {\n    const stat = await fsp.stat(src);\n\n    if (stat.isDirectory()) {\n        const contained = await fsp.readdir(src);\n        await Promise.all(\n            contained.map((file) => copy(join(src, file), join(dest, file))),\n        );\n    } else if (stat.isFile()) {\n        await fsp.mkdir(dirname(dest), { recursive: true });\n        await fsp.copyFile(src, dest);\n    } else {\n        // Do nothing for FIFO, special devices.\n    }\n}\n\nexport function copySync(src: string, dest: string): void {\n    const stat = fs.statSync(src);\n\n    if (stat.isDirectory()) {\n        const contained = fs.readdirSync(src);\n        contained.forEach((file) => copySync(join(src, file), join(dest, file)));\n    } else if (stat.isFile()) {\n        fs.mkdirSync(dirname(dest), { recursive: true });\n        fs.copyFileSync(src, dest);\n    } else {\n        // Do nothing for FIFO, special devices.\n    }\n}\n\nexport interface DiscoverFilesController {\n    shouldRecurse(childPath: string[]): boolean;\n    matches(path: string): boolean;\n\n    /** Defaults to false */\n    matchDirectories?: boolean;\n    /** Defaults to false */\n    followSymlinks?: boolean;\n}\n\n// cache of fs.realpathSync results to avoid extra I/O\nconst realpathCache: Map<string, string> = new Map();\n\nexport function discoverFiles(\n    rootDir: NormalizedPath,\n    controller: DiscoverFilesController,\n): NormalizedPath[] {\n    const result: NormalizedPath[] = [];\n    const dirs: string[][] = [normalizePath(rootDir).split(\"/\")];\n    // cache of real paths to avoid infinite recursion\n    const symlinkTargetsSeen: Set<string> = new Set();\n    const { matchDirectories = false, followSymlinks = false } = controller;\n    let dir = dirs.shift();\n\n    const handleFile = (path: string) => {\n        const childPath = [...dir!, path].join(\"/\");\n        if (controller.matches(childPath)) {\n            result.push(childPath as NormalizedPath);\n        }\n    };\n\n    const handleDirectory = (path: string) => {\n        const childPath = [...dir!, path];\n        if (controller.shouldRecurse(childPath)) {\n            dirs.push(childPath);\n        }\n    };\n\n    const handleSymlink = (path: string) => {\n        const childPath = [...dir!, path].join(\"/\");\n        let realpath: string;\n        try {\n            realpath = realpathCache.get(childPath) ?? fs.realpathSync(childPath);\n            realpathCache.set(childPath, realpath);\n        } catch {\n            return;\n        }\n\n        if (symlinkTargetsSeen.has(realpath)) {\n            return;\n        }\n        symlinkTargetsSeen.add(realpath);\n\n        try {\n            const stats = fs.statSync(realpath);\n            if (stats.isDirectory()) {\n                handleDirectory(path);\n            } else if (stats.isFile()) {\n                handleFile(path);\n            } else if (stats.isSymbolicLink()) {\n                const dirpath = dir!.join(\"/\");\n                if (dirpath === realpath) {\n                    // special case: real path of symlink is the directory we're currently traversing\n                    return;\n                }\n                const targetPath = relative(dirpath, realpath);\n                handleSymlink(targetPath);\n            } // everything else should be ignored\n        } catch (e) {\n            // invalid symbolic link; ignore\n        }\n    };\n\n    while (dir) {\n        if (matchDirectories && controller.matches(dir.join(\"/\"))) {\n            result.push(dir.join(\"/\") as NormalizedPath);\n        }\n\n        for (\n            const child of fs.readdirSync(dir.join(\"/\"), {\n                withFileTypes: true,\n            })\n        ) {\n            if (child.isFile()) {\n                handleFile(child.name);\n            } else if (child.isDirectory()) {\n                handleDirectory(child.name);\n            } else if (followSymlinks && child.isSymbolicLink()) {\n                handleSymlink(child.name);\n            }\n        }\n\n        dir = dirs.shift();\n    }\n\n    return result;\n}\n\n/**\n * Simpler version of `glob.sync` that only covers our use cases, always ignoring node_modules.\n */\nexport function glob(\n    pattern: GlobString,\n    root: NormalizedPath,\n    options: { includeDirectories?: boolean; followSymlinks?: boolean } = {},\n): NormalizedPath[] {\n    const mini = new Minimatch(pattern);\n    const shouldIncludeNodeModules = pattern.includes(\"node_modules\");\n\n    const controller: DiscoverFilesController = {\n        matches(path) {\n            return mini.match(path);\n        },\n        shouldRecurse(childPath) {\n            // if we _specifically asked_ for something in node_modules, fine, otherwise ignore it\n            // to avoid globs like '**/*.ts' finding all the .d.ts files in node_modules.\n            // however, if the pattern is something like `!**/node_modules/**`, this will also\n            // cause node_modules to be considered, though it will be discarded by minimatch.\n            if (\n                childPath[childPath.length - 1] === \"node_modules\" &&\n                !shouldIncludeNodeModules\n            ) {\n                return false;\n            }\n\n            return mini.set.some((row) => mini.matchOne(childPath, row, /* partial */ true));\n        },\n        matchDirectories: options.includeDirectories,\n        followSymlinks: options.followSymlinks,\n    };\n\n    return discoverFiles(root, controller);\n}\n\nexport function hasTsExtension(path: string): boolean {\n    return /\\.[cm]?ts$|\\.tsx$/.test(path);\n}\n\nexport function hasDeclarationFileExtension(path: string) {\n    return /\\.d\\.[cm]?ts$/.test(path);\n}\n\nexport function discoverInParentDirExactMatch<T extends {}>(\n    name: string,\n    dir: string,\n    read: (content: string) => T | undefined,\n    usedFile?: (path: string) => void,\n): { file: string; content: T } | undefined {\n    if (!isDir(dir)) return;\n\n    const reachedTopDirectory = (dirName: string) => dirName === resolve(join(dirName, \"..\"));\n\n    while (!reachedTopDirectory(dir)) {\n        usedFile?.(join(dir, name));\n        try {\n            const content = read(readFile(join(dir, name)));\n            if (content != null) {\n                return { file: join(dir, name), content };\n            }\n        } catch {\n            // Ignore, file didn't pass validation\n        }\n        dir = resolve(join(dir, \"..\"));\n    }\n}\n\nexport function discoverPackageJson(\n    dir: string,\n    usedFile?: (path: string) => void,\n) {\n    return discoverInParentDirExactMatch(\n        \"package.json\",\n        dir,\n        (content) => {\n            const pkg: unknown = JSON.parse(content);\n            if (\n                Validation.validate(\n                    { name: String, version: Validation.optional(String) },\n                    pkg,\n                )\n            ) {\n                return pkg;\n            }\n        },\n        usedFile,\n    );\n}\n\n// dir -> package info\nconst packageCache = new Map<string, [packageName: string, packageDir: string]>();\n\nexport function findPackageForPath(sourcePath: string): readonly [packageName: string, packageDir: string] | undefined {\n    // Attempt to decide package name from path if it contains \"node_modules\"\n    let startIndex = sourcePath.lastIndexOf(\"node_modules/\");\n    if (startIndex !== -1) {\n        startIndex += \"node_modules/\".length;\n        let stopIndex = sourcePath.indexOf(\"/\", startIndex);\n        // Scoped package, e.g. `@types/node`\n        if (sourcePath[startIndex] === \"@\") {\n            stopIndex = sourcePath.indexOf(\"/\", stopIndex + 1);\n        }\n        const packageName = sourcePath.substring(startIndex, stopIndex);\n        return [packageName, sourcePath.substring(0, stopIndex)];\n    }\n\n    const dir = dirname(sourcePath);\n    const cache = packageCache.get(dir);\n    if (cache) {\n        return cache;\n    }\n\n    const packageJson = discoverPackageJson(dir);\n    if (packageJson) {\n        packageCache.set(dir, [packageJson.content.name, dirname(packageJson.file)]);\n        return [packageJson.content.name, dirname(packageJson.file)];\n    }\n}\n\nexport function inferPackageEntryPointPaths(\n    packagePath: string,\n): [importPath: string, resolvedPath: string][] {\n    const packageDir = normalizePath(dirname(packagePath));\n    const packageJson = JSON.parse(readFile(packagePath));\n    const exports: unknown = packageJson.exports;\n    if (typeof exports === \"string\") {\n        return resolveExport(packageDir, \".\", exports, false);\n    }\n\n    if (!exports || typeof exports !== \"object\") {\n        if (typeof packageJson.main === \"string\") {\n            return [[\".\", resolve(packageDir, packageJson.main)]];\n        }\n\n        return [];\n    }\n\n    const results: [string, string][] = [];\n\n    if (Array.isArray(exports)) {\n        results.push(...resolveExport(packageDir, \".\", exports, true));\n    } else {\n        for (const [importPath, exp] of Object.entries(exports)) {\n            results.push(...resolveExport(packageDir, importPath, exp, false));\n        }\n    }\n\n    return results;\n}\n\nfunction resolveExport(\n    packageDir: NormalizedPath,\n    name: string,\n    exportDeclaration: string | string[] | Record<string, string>,\n    validatePath: boolean,\n): [string, string][] {\n    if (typeof exportDeclaration === \"string\") {\n        return resolveStarredExport(\n            packageDir,\n            name,\n            exportDeclaration,\n            validatePath,\n        );\n    }\n\n    if (Array.isArray(exportDeclaration)) {\n        for (const item of exportDeclaration) {\n            const result = resolveExport(packageDir, name, item, true);\n            if (result.length) {\n                return result;\n            }\n        }\n\n        return [];\n    }\n\n    const EXPORT_CONDITIONS = [\"typedoc\", \"types\", \"import\", \"node\", \"default\"];\n    for (const cond in exportDeclaration) {\n        if (EXPORT_CONDITIONS.includes(cond)) {\n            return resolveExport(\n                packageDir,\n                name,\n                exportDeclaration[cond],\n                false,\n            );\n        }\n    }\n\n    // No recognized export condition\n    return [];\n}\n\nfunction isWildcardName(name: string) {\n    let starCount = 0;\n    for (let i = 0; i < name.length; ++i) {\n        if (name[i] === \"*\") {\n            ++starCount;\n        }\n    }\n    return starCount === 1;\n}\n\nfunction resolveStarredExport(\n    packageDir: NormalizedPath,\n    name: string,\n    exportDeclaration: string,\n    validatePath: boolean,\n): [string, string][] {\n    // Wildcards only do something if there is exactly one star in the name\n    // If there isn't any star in the destination, all entries map to one file\n    // so don't bother enumerating possible files.\n    if (isWildcardName(name) && exportDeclaration.includes(\"*\")) {\n        // Construct a pattern which we can use to determine if a wildcard matches\n        // This will look something like: /^/app\\/package\\/(.*).js$/\n        // The destination may have multiple wildcards, in which case they should\n        // contain the same text, so we replace \"*\" with backreferences for all\n        // but the first occurrence.\n        let first = true;\n        const matcher = new RegExp(\n            \"^\" +\n                escapeRegExp(\n                    normalizePath(packageDir) +\n                        \"/\" +\n                        exportDeclaration.replace(/^\\.\\//, \"\"),\n                ).replaceAll(\"\\\\*\", () => {\n                    if (first) {\n                        first = false;\n                        return \"(.*)\";\n                    }\n                    return \"\\\\1\";\n                }) +\n                \"$\",\n        );\n        const matchedFiles = discoverFiles(packageDir, {\n            matches(path) {\n                return matcher.test(path);\n            },\n            shouldRecurse(path) {\n                return path[path.length - 1] !== \"node_modules\";\n            },\n        });\n\n        return matchedFiles.flatMap((path) => {\n            const starContent = path.match(matcher);\n            ok(starContent, \"impossible, discoverFiles uses matcher\");\n\n            return [[name.replace(\"*\", starContent[1]), path]];\n        });\n    }\n\n    const exportPath = resolve(packageDir, exportDeclaration);\n    if (validatePath && !fs.existsSync(exportPath)) {\n        return [];\n    }\n\n    return [[name, exportPath]];\n}\n"
  },
  {
    "path": "src/lib/utils/general.ts",
    "content": "import { dirname } from \"path\";\nimport url from \"url\";\nimport { url as debuggerUrl } from \"inspector\";\n\n// transform /abs/path/to/typedoc/dist/lib/utils/general -> /abs/path/to/typedoc\nexport const TYPEDOC_ROOT = dirname(\n    dirname(dirname(dirname(url.fileURLToPath(import.meta.url)))),\n);\n\n/**\n * This is a hack to make it possible to detect and warn about installation setups\n * which result in TypeDoc being installed multiple times. If TypeDoc has been loaded\n * multiple times, then parts of it will not work as expected.\n */\nconst loadSymbol = Symbol.for(\"typedoc_loads\");\nconst pathSymbol = Symbol.for(\"typedoc_paths\");\n\ninterface TypeDocGlobals {\n    [loadSymbol]?: number;\n    [pathSymbol]?: string[];\n}\nconst g = globalThis as TypeDocGlobals;\n\ng[loadSymbol] = (g[loadSymbol] || 0) + 1;\ng[pathSymbol] ||= [];\ng[pathSymbol].push(TYPEDOC_ROOT);\n\nexport function hasBeenLoadedMultipleTimes() {\n    return g[loadSymbol] !== 1;\n}\n\nexport function getLoadedPaths() {\n    return g[pathSymbol] || [];\n}\n\nexport function isDebugging() {\n    return !!debuggerUrl();\n}\n"
  },
  {
    "path": "src/lib/utils/highlighter.tsx",
    "content": "import * as shiki from \"@gerrit0/mini-shiki\";\nimport { JSX, unique } from \"#utils\";\nimport assert from \"assert\";\n\nconst tsAliases: [string, string][] = [[\"mts\", \"typescript\"], [\"cts\", \"typescript\"]];\nconst aliases = new Map<string, string>(tsAliases);\nfor (const lang of shiki.bundledLanguagesInfo) {\n    for (const alias of lang.aliases || []) {\n        aliases.set(alias, lang.id);\n    }\n}\n\nconst plaintextLanguages = [\"txt\", \"text\"];\n\nconst supportedLanguages: string[] = unique([\n    ...plaintextLanguages,\n    ...aliases.keys(),\n    ...shiki.bundledLanguagesInfo.map((lang) => lang.id),\n]).sort();\n\nconst supportedThemes: string[] = Object.keys(shiki.bundledThemes);\n\ninterface DoubleHighlighter {\n    supports(lang: string): boolean;\n    highlight(code: string, lang: string): string;\n    getStyles(): string;\n}\n\nclass ShikiHighlighter {\n    private schemes = new Map<string, string>();\n\n    constructor(\n        private highlighter: shiki.ShikiInternal,\n        private light: shiki.BundledTheme,\n        private dark: shiki.BundledTheme,\n    ) {}\n\n    supports(lang: string) {\n        return this.highlighter.getLoadedLanguages().includes(lang);\n    }\n\n    highlight(code: string, lang: string) {\n        const tokens = shiki.codeToTokensWithThemes(this.highlighter, code, {\n            themes: { light: this.light, dark: this.dark },\n            lang: lang as shiki.BundledLanguage,\n        });\n\n        const docEls: JSX.Element[] = [];\n\n        for (const line of tokens) {\n            for (const token of line) {\n                docEls.push(<span class={this.getClass(token.variants)}>{token.content}</span>);\n            }\n\n            docEls.push(<br />);\n        }\n\n        docEls.pop(); // Remove last <br>\n        docEls.pop(); // Remove last <br>\n\n        return JSX.renderElement(<>{docEls}</>);\n    }\n\n    getStyles() {\n        const style: string[] = [\":root {\"];\n        const lightRules: string[] = [];\n        const darkRules: string[] = [];\n\n        let i = 0;\n        for (const key of this.schemes.keys()) {\n            const [light, dark] = key.split(\" | \");\n\n            style.push(`    --light-hl-${i}: ${light};`);\n            style.push(`    --dark-hl-${i}: ${dark};`);\n            lightRules.push(`    --hl-${i}: var(--light-hl-${i});`);\n            darkRules.push(`    --hl-${i}: var(--dark-hl-${i});`);\n            i++;\n        }\n\n        style.push(`    --light-code-background: ${this.highlighter.getTheme(this.light).bg};`);\n        style.push(`    --dark-code-background: ${this.highlighter.getTheme(this.dark).bg};`);\n        lightRules.push(`    --code-background: var(--light-code-background);`);\n        darkRules.push(`    --code-background: var(--dark-code-background);`);\n\n        style.push(\"}\", \"\");\n\n        style.push(\"@media (prefers-color-scheme: light) { :root {\");\n        style.push(...lightRules);\n        style.push(\"} }\", \"\");\n\n        style.push(\"@media (prefers-color-scheme: dark) { :root {\");\n        style.push(...darkRules);\n        style.push(\"} }\", \"\");\n\n        style.push(\":root[data-theme='light'] {\");\n        style.push(...lightRules);\n        style.push(\"}\", \"\");\n\n        style.push(\":root[data-theme='dark'] {\");\n        style.push(...darkRules);\n        style.push(\"}\", \"\");\n\n        for (i = 0; i < this.schemes.size; i++) {\n            style.push(`.hl-${i} { color: var(--hl-${i}); }`);\n        }\n        style.push(\"pre, code { background: var(--code-background); }\", \"\");\n\n        return style.join(\"\\n\");\n    }\n\n    private getClass(variants: Record<string, shiki.TokenStyles>): string {\n        const key = `${variants[\"light\"].color} | ${variants[\"dark\"].color}`;\n        let scheme = this.schemes.get(key);\n        if (scheme == null) {\n            scheme = `hl-${this.schemes.size}`;\n            this.schemes.set(key, scheme);\n        }\n        return scheme;\n    }\n}\n\nclass TestHighlighter implements DoubleHighlighter {\n    supports(): boolean {\n        return true;\n    }\n    highlight(code: string): string {\n        return code;\n    }\n    getStyles(): string {\n        return \"\";\n    }\n}\n\nlet shikiEngine: shiki.RegexEngine | undefined;\nlet highlighter: DoubleHighlighter | undefined;\nlet ignoredLanguages: string[] | undefined;\n\nexport function loadTestHighlighter() {\n    highlighter = new TestHighlighter();\n}\n\nexport async function loadHighlighter(\n    lightTheme: shiki.BundledTheme,\n    darkTheme: shiki.BundledTheme,\n    langs: shiki.BundledLanguage[],\n    ignoredLangs: string[] | undefined,\n) {\n    if (highlighter) return;\n\n    ignoredLanguages = ignoredLangs;\n\n    if (!shikiEngine) {\n        await shiki.loadBuiltinWasm();\n        shikiEngine = await shiki.createOnigurumaEngine();\n    }\n\n    const hl = await shiki.createShikiInternal({\n        engine: shikiEngine,\n        themes: [shiki.bundledThemes[lightTheme], shiki.bundledThemes[darkTheme]],\n        langs: langs.map((lang) => shiki.bundledLanguages[lang]),\n    });\n    highlighter = new ShikiHighlighter(hl, lightTheme, darkTheme);\n}\n\nfunction isPlainLanguage(lang: string) {\n    return ignoredLanguages?.includes(lang) || plaintextLanguages.includes(lang);\n}\n\nexport function isSupportedLanguage(lang: string) {\n    return isPlainLanguage(lang) || supportedLanguages.includes(lang);\n}\n\nexport function getSupportedLanguages(): string[] {\n    return supportedLanguages;\n}\n\nexport function getSupportedThemes(): string[] {\n    return supportedThemes;\n}\n\nexport function isLoadedLanguage(lang: string): boolean {\n    return isPlainLanguage(lang) || highlighter?.supports(lang) || false;\n}\n\nexport function highlight(code: string, lang: string): string {\n    assert(highlighter, \"Tried to highlight with an uninitialized highlighter\");\n\n    if (plaintextLanguages.includes(lang) || ignoredLanguages?.includes(lang)) {\n        return JSX.renderElement(<>{code}</>);\n    }\n\n    return highlighter.highlight(code, aliases.get(lang) ?? lang);\n}\n\nexport function getStyles(): string {\n    assert(highlighter, \"Tried to highlight with an uninitialized highlighter\");\n    return highlighter.getStyles();\n}\n"
  },
  {
    "path": "src/lib/utils/html-entities.ts",
    "content": "// There is a fixed list of named character references which will not be expanded in the future.\n// This file is based on https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references\n// with some modifications to reduce the file size of the original JSON.\n\nexport const htmlEntities = {\n    AElig: { p: [198], c: \"\\u00C6\" },\n    \"AElig;\": { p: [198], c: \"\\u00C6\" },\n    AMP: { p: [38], c: \"\\u0026\" },\n    \"AMP;\": { p: [38], c: \"\\u0026\" },\n    Aacute: { p: [193], c: \"\\u00C1\" },\n    \"Aacute;\": { p: [193], c: \"\\u00C1\" },\n    \"Abreve;\": { p: [258], c: \"\\u0102\" },\n    Acirc: { p: [194], c: \"\\u00C2\" },\n    \"Acirc;\": { p: [194], c: \"\\u00C2\" },\n    \"Acy;\": { p: [1040], c: \"\\u0410\" },\n    \"Afr;\": { p: [120068], c: \"\\uD835\\uDD04\" },\n    Agrave: { p: [192], c: \"\\u00C0\" },\n    \"Agrave;\": { p: [192], c: \"\\u00C0\" },\n    \"Alpha;\": { p: [913], c: \"\\u0391\" },\n    \"Amacr;\": { p: [256], c: \"\\u0100\" },\n    \"And;\": { p: [10835], c: \"\\u2A53\" },\n    \"Aogon;\": { p: [260], c: \"\\u0104\" },\n    \"Aopf;\": { p: [120120], c: \"\\uD835\\uDD38\" },\n    \"ApplyFunction;\": { p: [8289], c: \"\\u2061\" },\n    Aring: { p: [197], c: \"\\u00C5\" },\n    \"Aring;\": { p: [197], c: \"\\u00C5\" },\n    \"Ascr;\": { p: [119964], c: \"\\uD835\\uDC9C\" },\n    \"Assign;\": { p: [8788], c: \"\\u2254\" },\n    Atilde: { p: [195], c: \"\\u00C3\" },\n    \"Atilde;\": { p: [195], c: \"\\u00C3\" },\n    Auml: { p: [196], c: \"\\u00C4\" },\n    \"Auml;\": { p: [196], c: \"\\u00C4\" },\n    \"Backslash;\": { p: [8726], c: \"\\u2216\" },\n    \"Barv;\": { p: [10983], c: \"\\u2AE7\" },\n    \"Barwed;\": { p: [8966], c: \"\\u2306\" },\n    \"Bcy;\": { p: [1041], c: \"\\u0411\" },\n    \"Because;\": { p: [8757], c: \"\\u2235\" },\n    \"Bernoullis;\": { p: [8492], c: \"\\u212C\" },\n    \"Beta;\": { p: [914], c: \"\\u0392\" },\n    \"Bfr;\": { p: [120069], c: \"\\uD835\\uDD05\" },\n    \"Bopf;\": { p: [120121], c: \"\\uD835\\uDD39\" },\n    \"Breve;\": { p: [728], c: \"\\u02D8\" },\n    \"Bscr;\": { p: [8492], c: \"\\u212C\" },\n    \"Bumpeq;\": { p: [8782], c: \"\\u224E\" },\n    \"CHcy;\": { p: [1063], c: \"\\u0427\" },\n    COPY: { p: [169], c: \"\\u00A9\" },\n    \"COPY;\": { p: [169], c: \"\\u00A9\" },\n    \"Cacute;\": { p: [262], c: \"\\u0106\" },\n    \"Cap;\": { p: [8914], c: \"\\u22D2\" },\n    \"CapitalDifferentialD;\": { p: [8517], c: \"\\u2145\" },\n    \"Cayleys;\": { p: [8493], c: \"\\u212D\" },\n    \"Ccaron;\": { p: [268], c: \"\\u010C\" },\n    Ccedil: { p: [199], c: \"\\u00C7\" },\n    \"Ccedil;\": { p: [199], c: \"\\u00C7\" },\n    \"Ccirc;\": { p: [264], c: \"\\u0108\" },\n    \"Cconint;\": { p: [8752], c: \"\\u2230\" },\n    \"Cdot;\": { p: [266], c: \"\\u010A\" },\n    \"Cedilla;\": { p: [184], c: \"\\u00B8\" },\n    \"CenterDot;\": { p: [183], c: \"\\u00B7\" },\n    \"Cfr;\": { p: [8493], c: \"\\u212D\" },\n    \"Chi;\": { p: [935], c: \"\\u03A7\" },\n    \"CircleDot;\": { p: [8857], c: \"\\u2299\" },\n    \"CircleMinus;\": { p: [8854], c: \"\\u2296\" },\n    \"CirclePlus;\": { p: [8853], c: \"\\u2295\" },\n    \"CircleTimes;\": { p: [8855], c: \"\\u2297\" },\n    \"ClockwiseContourIntegral;\": {\n        p: [8754],\n        c: \"\\u2232\",\n    },\n    \"CloseCurlyDoubleQuote;\": { p: [8221], c: \"\\u201D\" },\n    \"CloseCurlyQuote;\": { p: [8217], c: \"\\u2019\" },\n    \"Colon;\": { p: [8759], c: \"\\u2237\" },\n    \"Colone;\": { p: [10868], c: \"\\u2A74\" },\n    \"Congruent;\": { p: [8801], c: \"\\u2261\" },\n    \"Conint;\": { p: [8751], c: \"\\u222F\" },\n    \"ContourIntegral;\": { p: [8750], c: \"\\u222E\" },\n    \"Copf;\": { p: [8450], c: \"\\u2102\" },\n    \"Coproduct;\": { p: [8720], c: \"\\u2210\" },\n    \"CounterClockwiseContourIntegral;\": {\n        p: [8755],\n        c: \"\\u2233\",\n    },\n    \"Cross;\": { p: [10799], c: \"\\u2A2F\" },\n    \"Cscr;\": { p: [119966], c: \"\\uD835\\uDC9E\" },\n    \"Cup;\": { p: [8915], c: \"\\u22D3\" },\n    \"CupCap;\": { p: [8781], c: \"\\u224D\" },\n    \"DD;\": { p: [8517], c: \"\\u2145\" },\n    \"DDotrahd;\": { p: [10513], c: \"\\u2911\" },\n    \"DJcy;\": { p: [1026], c: \"\\u0402\" },\n    \"DScy;\": { p: [1029], c: \"\\u0405\" },\n    \"DZcy;\": { p: [1039], c: \"\\u040F\" },\n    \"Dagger;\": { p: [8225], c: \"\\u2021\" },\n    \"Darr;\": { p: [8609], c: \"\\u21A1\" },\n    \"Dashv;\": { p: [10980], c: \"\\u2AE4\" },\n    \"Dcaron;\": { p: [270], c: \"\\u010E\" },\n    \"Dcy;\": { p: [1044], c: \"\\u0414\" },\n    \"Del;\": { p: [8711], c: \"\\u2207\" },\n    \"Delta;\": { p: [916], c: \"\\u0394\" },\n    \"Dfr;\": { p: [120071], c: \"\\uD835\\uDD07\" },\n    \"DiacriticalAcute;\": { p: [180], c: \"\\u00B4\" },\n    \"DiacriticalDot;\": { p: [729], c: \"\\u02D9\" },\n    \"DiacriticalDoubleAcute;\": { p: [733], c: \"\\u02DD\" },\n    \"DiacriticalGrave;\": { p: [96], c: \"\\u0060\" },\n    \"DiacriticalTilde;\": { p: [732], c: \"\\u02DC\" },\n    \"Diamond;\": { p: [8900], c: \"\\u22C4\" },\n    \"DifferentialD;\": { p: [8518], c: \"\\u2146\" },\n    \"Dopf;\": { p: [120123], c: \"\\uD835\\uDD3B\" },\n    \"Dot;\": { p: [168], c: \"\\u00A8\" },\n    \"DotDot;\": { p: [8412], c: \"\\u20DC\" },\n    \"DotEqual;\": { p: [8784], c: \"\\u2250\" },\n    \"DoubleContourIntegral;\": { p: [8751], c: \"\\u222F\" },\n    \"DoubleDot;\": { p: [168], c: \"\\u00A8\" },\n    \"DoubleDownArrow;\": { p: [8659], c: \"\\u21D3\" },\n    \"DoubleLeftArrow;\": { p: [8656], c: \"\\u21D0\" },\n    \"DoubleLeftRightArrow;\": { p: [8660], c: \"\\u21D4\" },\n    \"DoubleLeftTee;\": { p: [10980], c: \"\\u2AE4\" },\n    \"DoubleLongLeftArrow;\": { p: [10232], c: \"\\u27F8\" },\n    \"DoubleLongLeftRightArrow;\": {\n        p: [10234],\n        c: \"\\u27FA\",\n    },\n    \"DoubleLongRightArrow;\": { p: [10233], c: \"\\u27F9\" },\n    \"DoubleRightArrow;\": { p: [8658], c: \"\\u21D2\" },\n    \"DoubleRightTee;\": { p: [8872], c: \"\\u22A8\" },\n    \"DoubleUpArrow;\": { p: [8657], c: \"\\u21D1\" },\n    \"DoubleUpDownArrow;\": { p: [8661], c: \"\\u21D5\" },\n    \"DoubleVerticalBar;\": { p: [8741], c: \"\\u2225\" },\n    \"DownArrow;\": { p: [8595], c: \"\\u2193\" },\n    \"DownArrowBar;\": { p: [10515], c: \"\\u2913\" },\n    \"DownArrowUpArrow;\": { p: [8693], c: \"\\u21F5\" },\n    \"DownBreve;\": { p: [785], c: \"\\u0311\" },\n    \"DownLeftRightVector;\": { p: [10576], c: \"\\u2950\" },\n    \"DownLeftTeeVector;\": { p: [10590], c: \"\\u295E\" },\n    \"DownLeftVector;\": { p: [8637], c: \"\\u21BD\" },\n    \"DownLeftVectorBar;\": { p: [10582], c: \"\\u2956\" },\n    \"DownRightTeeVector;\": { p: [10591], c: \"\\u295F\" },\n    \"DownRightVector;\": { p: [8641], c: \"\\u21C1\" },\n    \"DownRightVectorBar;\": { p: [10583], c: \"\\u2957\" },\n    \"DownTee;\": { p: [8868], c: \"\\u22A4\" },\n    \"DownTeeArrow;\": { p: [8615], c: \"\\u21A7\" },\n    \"Downarrow;\": { p: [8659], c: \"\\u21D3\" },\n    \"Dscr;\": { p: [119967], c: \"\\uD835\\uDC9F\" },\n    \"Dstrok;\": { p: [272], c: \"\\u0110\" },\n    \"ENG;\": { p: [330], c: \"\\u014A\" },\n    ETH: { p: [208], c: \"\\u00D0\" },\n    \"ETH;\": { p: [208], c: \"\\u00D0\" },\n    Eacute: { p: [201], c: \"\\u00C9\" },\n    \"Eacute;\": { p: [201], c: \"\\u00C9\" },\n    \"Ecaron;\": { p: [282], c: \"\\u011A\" },\n    Ecirc: { p: [202], c: \"\\u00CA\" },\n    \"Ecirc;\": { p: [202], c: \"\\u00CA\" },\n    \"Ecy;\": { p: [1069], c: \"\\u042D\" },\n    \"Edot;\": { p: [278], c: \"\\u0116\" },\n    \"Efr;\": { p: [120072], c: \"\\uD835\\uDD08\" },\n    Egrave: { p: [200], c: \"\\u00C8\" },\n    \"Egrave;\": { p: [200], c: \"\\u00C8\" },\n    \"Element;\": { p: [8712], c: \"\\u2208\" },\n    \"Emacr;\": { p: [274], c: \"\\u0112\" },\n    \"EmptySmallSquare;\": { p: [9723], c: \"\\u25FB\" },\n    \"EmptyVerySmallSquare;\": { p: [9643], c: \"\\u25AB\" },\n    \"Eogon;\": { p: [280], c: \"\\u0118\" },\n    \"Eopf;\": { p: [120124], c: \"\\uD835\\uDD3C\" },\n    \"Epsilon;\": { p: [917], c: \"\\u0395\" },\n    \"Equal;\": { p: [10869], c: \"\\u2A75\" },\n    \"EqualTilde;\": { p: [8770], c: \"\\u2242\" },\n    \"Equilibrium;\": { p: [8652], c: \"\\u21CC\" },\n    \"Escr;\": { p: [8496], c: \"\\u2130\" },\n    \"Esim;\": { p: [10867], c: \"\\u2A73\" },\n    \"Eta;\": { p: [919], c: \"\\u0397\" },\n    Euml: { p: [203], c: \"\\u00CB\" },\n    \"Euml;\": { p: [203], c: \"\\u00CB\" },\n    \"Exists;\": { p: [8707], c: \"\\u2203\" },\n    \"ExponentialE;\": { p: [8519], c: \"\\u2147\" },\n    \"Fcy;\": { p: [1060], c: \"\\u0424\" },\n    \"Ffr;\": { p: [120073], c: \"\\uD835\\uDD09\" },\n    \"FilledSmallSquare;\": { p: [9724], c: \"\\u25FC\" },\n    \"FilledVerySmallSquare;\": { p: [9642], c: \"\\u25AA\" },\n    \"Fopf;\": { p: [120125], c: \"\\uD835\\uDD3D\" },\n    \"ForAll;\": { p: [8704], c: \"\\u2200\" },\n    \"Fouriertrf;\": { p: [8497], c: \"\\u2131\" },\n    \"Fscr;\": { p: [8497], c: \"\\u2131\" },\n    \"GJcy;\": { p: [1027], c: \"\\u0403\" },\n    GT: { p: [62], c: \"\\u003E\" },\n    \"GT;\": { p: [62], c: \"\\u003E\" },\n    \"Gamma;\": { p: [915], c: \"\\u0393\" },\n    \"Gammad;\": { p: [988], c: \"\\u03DC\" },\n    \"Gbreve;\": { p: [286], c: \"\\u011E\" },\n    \"Gcedil;\": { p: [290], c: \"\\u0122\" },\n    \"Gcirc;\": { p: [284], c: \"\\u011C\" },\n    \"Gcy;\": { p: [1043], c: \"\\u0413\" },\n    \"Gdot;\": { p: [288], c: \"\\u0120\" },\n    \"Gfr;\": { p: [120074], c: \"\\uD835\\uDD0A\" },\n    \"Gg;\": { p: [8921], c: \"\\u22D9\" },\n    \"Gopf;\": { p: [120126], c: \"\\uD835\\uDD3E\" },\n    \"GreaterEqual;\": { p: [8805], c: \"\\u2265\" },\n    \"GreaterEqualLess;\": { p: [8923], c: \"\\u22DB\" },\n    \"GreaterFullEqual;\": { p: [8807], c: \"\\u2267\" },\n    \"GreaterGreater;\": { p: [10914], c: \"\\u2AA2\" },\n    \"GreaterLess;\": { p: [8823], c: \"\\u2277\" },\n    \"GreaterSlantEqual;\": { p: [10878], c: \"\\u2A7E\" },\n    \"GreaterTilde;\": { p: [8819], c: \"\\u2273\" },\n    \"Gscr;\": { p: [119970], c: \"\\uD835\\uDCA2\" },\n    \"Gt;\": { p: [8811], c: \"\\u226B\" },\n    \"HARDcy;\": { p: [1066], c: \"\\u042A\" },\n    \"Hacek;\": { p: [711], c: \"\\u02C7\" },\n    \"Hat;\": { p: [94], c: \"\\u005E\" },\n    \"Hcirc;\": { p: [292], c: \"\\u0124\" },\n    \"Hfr;\": { p: [8460], c: \"\\u210C\" },\n    \"HilbertSpace;\": { p: [8459], c: \"\\u210B\" },\n    \"Hopf;\": { p: [8461], c: \"\\u210D\" },\n    \"HorizontalLine;\": { p: [9472], c: \"\\u2500\" },\n    \"Hscr;\": { p: [8459], c: \"\\u210B\" },\n    \"Hstrok;\": { p: [294], c: \"\\u0126\" },\n    \"HumpDownHump;\": { p: [8782], c: \"\\u224E\" },\n    \"HumpEqual;\": { p: [8783], c: \"\\u224F\" },\n    \"IEcy;\": { p: [1045], c: \"\\u0415\" },\n    \"IJlig;\": { p: [306], c: \"\\u0132\" },\n    \"IOcy;\": { p: [1025], c: \"\\u0401\" },\n    Iacute: { p: [205], c: \"\\u00CD\" },\n    \"Iacute;\": { p: [205], c: \"\\u00CD\" },\n    Icirc: { p: [206], c: \"\\u00CE\" },\n    \"Icirc;\": { p: [206], c: \"\\u00CE\" },\n    \"Icy;\": { p: [1048], c: \"\\u0418\" },\n    \"Idot;\": { p: [304], c: \"\\u0130\" },\n    \"Ifr;\": { p: [8465], c: \"\\u2111\" },\n    Igrave: { p: [204], c: \"\\u00CC\" },\n    \"Igrave;\": { p: [204], c: \"\\u00CC\" },\n    \"Im;\": { p: [8465], c: \"\\u2111\" },\n    \"Imacr;\": { p: [298], c: \"\\u012A\" },\n    \"ImaginaryI;\": { p: [8520], c: \"\\u2148\" },\n    \"Implies;\": { p: [8658], c: \"\\u21D2\" },\n    \"Int;\": { p: [8748], c: \"\\u222C\" },\n    \"Integral;\": { p: [8747], c: \"\\u222B\" },\n    \"Intersection;\": { p: [8898], c: \"\\u22C2\" },\n    \"InvisibleComma;\": { p: [8291], c: \"\\u2063\" },\n    \"InvisibleTimes;\": { p: [8290], c: \"\\u2062\" },\n    \"Iogon;\": { p: [302], c: \"\\u012E\" },\n    \"Iopf;\": { p: [120128], c: \"\\uD835\\uDD40\" },\n    \"Iota;\": { p: [921], c: \"\\u0399\" },\n    \"Iscr;\": { p: [8464], c: \"\\u2110\" },\n    \"Itilde;\": { p: [296], c: \"\\u0128\" },\n    \"Iukcy;\": { p: [1030], c: \"\\u0406\" },\n    Iuml: { p: [207], c: \"\\u00CF\" },\n    \"Iuml;\": { p: [207], c: \"\\u00CF\" },\n    \"Jcirc;\": { p: [308], c: \"\\u0134\" },\n    \"Jcy;\": { p: [1049], c: \"\\u0419\" },\n    \"Jfr;\": { p: [120077], c: \"\\uD835\\uDD0D\" },\n    \"Jopf;\": { p: [120129], c: \"\\uD835\\uDD41\" },\n    \"Jscr;\": { p: [119973], c: \"\\uD835\\uDCA5\" },\n    \"Jsercy;\": { p: [1032], c: \"\\u0408\" },\n    \"Jukcy;\": { p: [1028], c: \"\\u0404\" },\n    \"KHcy;\": { p: [1061], c: \"\\u0425\" },\n    \"KJcy;\": { p: [1036], c: \"\\u040C\" },\n    \"Kappa;\": { p: [922], c: \"\\u039A\" },\n    \"Kcedil;\": { p: [310], c: \"\\u0136\" },\n    \"Kcy;\": { p: [1050], c: \"\\u041A\" },\n    \"Kfr;\": { p: [120078], c: \"\\uD835\\uDD0E\" },\n    \"Kopf;\": { p: [120130], c: \"\\uD835\\uDD42\" },\n    \"Kscr;\": { p: [119974], c: \"\\uD835\\uDCA6\" },\n    \"LJcy;\": { p: [1033], c: \"\\u0409\" },\n    LT: { p: [60], c: \"\\u003C\" },\n    \"LT;\": { p: [60], c: \"\\u003C\" },\n    \"Lacute;\": { p: [313], c: \"\\u0139\" },\n    \"Lambda;\": { p: [923], c: \"\\u039B\" },\n    \"Lang;\": { p: [10218], c: \"\\u27EA\" },\n    \"Laplacetrf;\": { p: [8466], c: \"\\u2112\" },\n    \"Larr;\": { p: [8606], c: \"\\u219E\" },\n    \"Lcaron;\": { p: [317], c: \"\\u013D\" },\n    \"Lcedil;\": { p: [315], c: \"\\u013B\" },\n    \"Lcy;\": { p: [1051], c: \"\\u041B\" },\n    \"LeftAngleBracket;\": { p: [10216], c: \"\\u27E8\" },\n    \"LeftArrow;\": { p: [8592], c: \"\\u2190\" },\n    \"LeftArrowBar;\": { p: [8676], c: \"\\u21E4\" },\n    \"LeftArrowRightArrow;\": { p: [8646], c: \"\\u21C6\" },\n    \"LeftCeiling;\": { p: [8968], c: \"\\u2308\" },\n    \"LeftDoubleBracket;\": { p: [10214], c: \"\\u27E6\" },\n    \"LeftDownTeeVector;\": { p: [10593], c: \"\\u2961\" },\n    \"LeftDownVector;\": { p: [8643], c: \"\\u21C3\" },\n    \"LeftDownVectorBar;\": { p: [10585], c: \"\\u2959\" },\n    \"LeftFloor;\": { p: [8970], c: \"\\u230A\" },\n    \"LeftRightArrow;\": { p: [8596], c: \"\\u2194\" },\n    \"LeftRightVector;\": { p: [10574], c: \"\\u294E\" },\n    \"LeftTee;\": { p: [8867], c: \"\\u22A3\" },\n    \"LeftTeeArrow;\": { p: [8612], c: \"\\u21A4\" },\n    \"LeftTeeVector;\": { p: [10586], c: \"\\u295A\" },\n    \"LeftTriangle;\": { p: [8882], c: \"\\u22B2\" },\n    \"LeftTriangleBar;\": { p: [10703], c: \"\\u29CF\" },\n    \"LeftTriangleEqual;\": { p: [8884], c: \"\\u22B4\" },\n    \"LeftUpDownVector;\": { p: [10577], c: \"\\u2951\" },\n    \"LeftUpTeeVector;\": { p: [10592], c: \"\\u2960\" },\n    \"LeftUpVector;\": { p: [8639], c: \"\\u21BF\" },\n    \"LeftUpVectorBar;\": { p: [10584], c: \"\\u2958\" },\n    \"LeftVector;\": { p: [8636], c: \"\\u21BC\" },\n    \"LeftVectorBar;\": { p: [10578], c: \"\\u2952\" },\n    \"Leftarrow;\": { p: [8656], c: \"\\u21D0\" },\n    \"Leftrightarrow;\": { p: [8660], c: \"\\u21D4\" },\n    \"LessEqualGreater;\": { p: [8922], c: \"\\u22DA\" },\n    \"LessFullEqual;\": { p: [8806], c: \"\\u2266\" },\n    \"LessGreater;\": { p: [8822], c: \"\\u2276\" },\n    \"LessLess;\": { p: [10913], c: \"\\u2AA1\" },\n    \"LessSlantEqual;\": { p: [10877], c: \"\\u2A7D\" },\n    \"LessTilde;\": { p: [8818], c: \"\\u2272\" },\n    \"Lfr;\": { p: [120079], c: \"\\uD835\\uDD0F\" },\n    \"Ll;\": { p: [8920], c: \"\\u22D8\" },\n    \"Lleftarrow;\": { p: [8666], c: \"\\u21DA\" },\n    \"Lmidot;\": { p: [319], c: \"\\u013F\" },\n    \"LongLeftArrow;\": { p: [10229], c: \"\\u27F5\" },\n    \"LongLeftRightArrow;\": { p: [10231], c: \"\\u27F7\" },\n    \"LongRightArrow;\": { p: [10230], c: \"\\u27F6\" },\n    \"Longleftarrow;\": { p: [10232], c: \"\\u27F8\" },\n    \"Longleftrightarrow;\": { p: [10234], c: \"\\u27FA\" },\n    \"Longrightarrow;\": { p: [10233], c: \"\\u27F9\" },\n    \"Lopf;\": { p: [120131], c: \"\\uD835\\uDD43\" },\n    \"LowerLeftArrow;\": { p: [8601], c: \"\\u2199\" },\n    \"LowerRightArrow;\": { p: [8600], c: \"\\u2198\" },\n    \"Lscr;\": { p: [8466], c: \"\\u2112\" },\n    \"Lsh;\": { p: [8624], c: \"\\u21B0\" },\n    \"Lstrok;\": { p: [321], c: \"\\u0141\" },\n    \"Lt;\": { p: [8810], c: \"\\u226A\" },\n    \"Map;\": { p: [10501], c: \"\\u2905\" },\n    \"Mcy;\": { p: [1052], c: \"\\u041C\" },\n    \"MediumSpace;\": { p: [8287], c: \"\\u205F\" },\n    \"Mellintrf;\": { p: [8499], c: \"\\u2133\" },\n    \"Mfr;\": { p: [120080], c: \"\\uD835\\uDD10\" },\n    \"MinusPlus;\": { p: [8723], c: \"\\u2213\" },\n    \"Mopf;\": { p: [120132], c: \"\\uD835\\uDD44\" },\n    \"Mscr;\": { p: [8499], c: \"\\u2133\" },\n    \"Mu;\": { p: [924], c: \"\\u039C\" },\n    \"NJcy;\": { p: [1034], c: \"\\u040A\" },\n    \"Nacute;\": { p: [323], c: \"\\u0143\" },\n    \"Ncaron;\": { p: [327], c: \"\\u0147\" },\n    \"Ncedil;\": { p: [325], c: \"\\u0145\" },\n    \"Ncy;\": { p: [1053], c: \"\\u041D\" },\n    \"NegativeMediumSpace;\": { p: [8203], c: \"\\u200B\" },\n    \"NegativeThickSpace;\": { p: [8203], c: \"\\u200B\" },\n    \"NegativeThinSpace;\": { p: [8203], c: \"\\u200B\" },\n    \"NegativeVeryThinSpace;\": { p: [8203], c: \"\\u200B\" },\n    \"NestedGreaterGreater;\": { p: [8811], c: \"\\u226B\" },\n    \"NestedLessLess;\": { p: [8810], c: \"\\u226A\" },\n    \"NewLine;\": { p: [10], c: \"\\u000A\" },\n    \"Nfr;\": { p: [120081], c: \"\\uD835\\uDD11\" },\n    \"NoBreak;\": { p: [8288], c: \"\\u2060\" },\n    \"NonBreakingSpace;\": { p: [160], c: \"\\u00A0\" },\n    \"Nopf;\": { p: [8469], c: \"\\u2115\" },\n    \"Not;\": { p: [10988], c: \"\\u2AEC\" },\n    \"NotCongruent;\": { p: [8802], c: \"\\u2262\" },\n    \"NotCupCap;\": { p: [8813], c: \"\\u226D\" },\n    \"NotDoubleVerticalBar;\": { p: [8742], c: \"\\u2226\" },\n    \"NotElement;\": { p: [8713], c: \"\\u2209\" },\n    \"NotEqual;\": { p: [8800], c: \"\\u2260\" },\n    \"NotEqualTilde;\": {\n        p: [8770, 824],\n        c: \"\\u2242\\u0338\",\n    },\n    \"NotExists;\": { p: [8708], c: \"\\u2204\" },\n    \"NotGreater;\": { p: [8815], c: \"\\u226F\" },\n    \"NotGreaterEqual;\": { p: [8817], c: \"\\u2271\" },\n    \"NotGreaterFullEqual;\": {\n        p: [8807, 824],\n        c: \"\\u2267\\u0338\",\n    },\n    \"NotGreaterGreater;\": {\n        p: [8811, 824],\n        c: \"\\u226B\\u0338\",\n    },\n    \"NotGreaterLess;\": { p: [8825], c: \"\\u2279\" },\n    \"NotGreaterSlantEqual;\": {\n        p: [10878, 824],\n        c: \"\\u2A7E\\u0338\",\n    },\n    \"NotGreaterTilde;\": { p: [8821], c: \"\\u2275\" },\n    \"NotHumpDownHump;\": {\n        p: [8782, 824],\n        c: \"\\u224E\\u0338\",\n    },\n    \"NotHumpEqual;\": {\n        p: [8783, 824],\n        c: \"\\u224F\\u0338\",\n    },\n    \"NotLeftTriangle;\": { p: [8938], c: \"\\u22EA\" },\n    \"NotLeftTriangleBar;\": {\n        p: [10703, 824],\n        c: \"\\u29CF\\u0338\",\n    },\n    \"NotLeftTriangleEqual;\": { p: [8940], c: \"\\u22EC\" },\n    \"NotLess;\": { p: [8814], c: \"\\u226E\" },\n    \"NotLessEqual;\": { p: [8816], c: \"\\u2270\" },\n    \"NotLessGreater;\": { p: [8824], c: \"\\u2278\" },\n    \"NotLessLess;\": {\n        p: [8810, 824],\n        c: \"\\u226A\\u0338\",\n    },\n    \"NotLessSlantEqual;\": {\n        p: [10877, 824],\n        c: \"\\u2A7D\\u0338\",\n    },\n    \"NotLessTilde;\": { p: [8820], c: \"\\u2274\" },\n    \"NotNestedGreaterGreater;\": {\n        p: [10914, 824],\n        c: \"\\u2AA2\\u0338\",\n    },\n    \"NotNestedLessLess;\": {\n        p: [10913, 824],\n        c: \"\\u2AA1\\u0338\",\n    },\n    \"NotPrecedes;\": { p: [8832], c: \"\\u2280\" },\n    \"NotPrecedesEqual;\": {\n        p: [10927, 824],\n        c: \"\\u2AAF\\u0338\",\n    },\n    \"NotPrecedesSlantEqual;\": { p: [8928], c: \"\\u22E0\" },\n    \"NotReverseElement;\": { p: [8716], c: \"\\u220C\" },\n    \"NotRightTriangle;\": { p: [8939], c: \"\\u22EB\" },\n    \"NotRightTriangleBar;\": {\n        p: [10704, 824],\n        c: \"\\u29D0\\u0338\",\n    },\n    \"NotRightTriangleEqual;\": { p: [8941], c: \"\\u22ED\" },\n    \"NotSquareSubset;\": {\n        p: [8847, 824],\n        c: \"\\u228F\\u0338\",\n    },\n    \"NotSquareSubsetEqual;\": { p: [8930], c: \"\\u22E2\" },\n    \"NotSquareSuperset;\": {\n        p: [8848, 824],\n        c: \"\\u2290\\u0338\",\n    },\n    \"NotSquareSupersetEqual;\": {\n        p: [8931],\n        c: \"\\u22E3\",\n    },\n    \"NotSubset;\": { p: [8834, 8402], c: \"\\u2282\\u20D2\" },\n    \"NotSubsetEqual;\": { p: [8840], c: \"\\u2288\" },\n    \"NotSucceeds;\": { p: [8833], c: \"\\u2281\" },\n    \"NotSucceedsEqual;\": {\n        p: [10928, 824],\n        c: \"\\u2AB0\\u0338\",\n    },\n    \"NotSucceedsSlantEqual;\": { p: [8929], c: \"\\u22E1\" },\n    \"NotSucceedsTilde;\": {\n        p: [8831, 824],\n        c: \"\\u227F\\u0338\",\n    },\n    \"NotSuperset;\": {\n        p: [8835, 8402],\n        c: \"\\u2283\\u20D2\",\n    },\n    \"NotSupersetEqual;\": { p: [8841], c: \"\\u2289\" },\n    \"NotTilde;\": { p: [8769], c: \"\\u2241\" },\n    \"NotTildeEqual;\": { p: [8772], c: \"\\u2244\" },\n    \"NotTildeFullEqual;\": { p: [8775], c: \"\\u2247\" },\n    \"NotTildeTilde;\": { p: [8777], c: \"\\u2249\" },\n    \"NotVerticalBar;\": { p: [8740], c: \"\\u2224\" },\n    \"Nscr;\": { p: [119977], c: \"\\uD835\\uDCA9\" },\n    Ntilde: { p: [209], c: \"\\u00D1\" },\n    \"Ntilde;\": { p: [209], c: \"\\u00D1\" },\n    \"Nu;\": { p: [925], c: \"\\u039D\" },\n    \"OElig;\": { p: [338], c: \"\\u0152\" },\n    Oacute: { p: [211], c: \"\\u00D3\" },\n    \"Oacute;\": { p: [211], c: \"\\u00D3\" },\n    Ocirc: { p: [212], c: \"\\u00D4\" },\n    \"Ocirc;\": { p: [212], c: \"\\u00D4\" },\n    \"Ocy;\": { p: [1054], c: \"\\u041E\" },\n    \"Odblac;\": { p: [336], c: \"\\u0150\" },\n    \"Ofr;\": { p: [120082], c: \"\\uD835\\uDD12\" },\n    Ograve: { p: [210], c: \"\\u00D2\" },\n    \"Ograve;\": { p: [210], c: \"\\u00D2\" },\n    \"Omacr;\": { p: [332], c: \"\\u014C\" },\n    \"Omega;\": { p: [937], c: \"\\u03A9\" },\n    \"Omicron;\": { p: [927], c: \"\\u039F\" },\n    \"Oopf;\": { p: [120134], c: \"\\uD835\\uDD46\" },\n    \"OpenCurlyDoubleQuote;\": { p: [8220], c: \"\\u201C\" },\n    \"OpenCurlyQuote;\": { p: [8216], c: \"\\u2018\" },\n    \"Or;\": { p: [10836], c: \"\\u2A54\" },\n    \"Oscr;\": { p: [119978], c: \"\\uD835\\uDCAA\" },\n    Oslash: { p: [216], c: \"\\u00D8\" },\n    \"Oslash;\": { p: [216], c: \"\\u00D8\" },\n    Otilde: { p: [213], c: \"\\u00D5\" },\n    \"Otilde;\": { p: [213], c: \"\\u00D5\" },\n    \"Otimes;\": { p: [10807], c: \"\\u2A37\" },\n    Ouml: { p: [214], c: \"\\u00D6\" },\n    \"Ouml;\": { p: [214], c: \"\\u00D6\" },\n    \"OverBar;\": { p: [8254], c: \"\\u203E\" },\n    \"OverBrace;\": { p: [9182], c: \"\\u23DE\" },\n    \"OverBracket;\": { p: [9140], c: \"\\u23B4\" },\n    \"OverParenthesis;\": { p: [9180], c: \"\\u23DC\" },\n    \"PartialD;\": { p: [8706], c: \"\\u2202\" },\n    \"Pcy;\": { p: [1055], c: \"\\u041F\" },\n    \"Pfr;\": { p: [120083], c: \"\\uD835\\uDD13\" },\n    \"Phi;\": { p: [934], c: \"\\u03A6\" },\n    \"Pi;\": { p: [928], c: \"\\u03A0\" },\n    \"PlusMinus;\": { p: [177], c: \"\\u00B1\" },\n    \"Poincareplane;\": { p: [8460], c: \"\\u210C\" },\n    \"Popf;\": { p: [8473], c: \"\\u2119\" },\n    \"Pr;\": { p: [10939], c: \"\\u2ABB\" },\n    \"Precedes;\": { p: [8826], c: \"\\u227A\" },\n    \"PrecedesEqual;\": { p: [10927], c: \"\\u2AAF\" },\n    \"PrecedesSlantEqual;\": { p: [8828], c: \"\\u227C\" },\n    \"PrecedesTilde;\": { p: [8830], c: \"\\u227E\" },\n    \"Prime;\": { p: [8243], c: \"\\u2033\" },\n    \"Product;\": { p: [8719], c: \"\\u220F\" },\n    \"Proportion;\": { p: [8759], c: \"\\u2237\" },\n    \"Proportional;\": { p: [8733], c: \"\\u221D\" },\n    \"Pscr;\": { p: [119979], c: \"\\uD835\\uDCAB\" },\n    \"Psi;\": { p: [936], c: \"\\u03A8\" },\n    QUOT: { p: [34], c: \"\\u0022\" },\n    \"QUOT;\": { p: [34], c: \"\\u0022\" },\n    \"Qfr;\": { p: [120084], c: \"\\uD835\\uDD14\" },\n    \"Qopf;\": { p: [8474], c: \"\\u211A\" },\n    \"Qscr;\": { p: [119980], c: \"\\uD835\\uDCAC\" },\n    \"RBarr;\": { p: [10512], c: \"\\u2910\" },\n    REG: { p: [174], c: \"\\u00AE\" },\n    \"REG;\": { p: [174], c: \"\\u00AE\" },\n    \"Racute;\": { p: [340], c: \"\\u0154\" },\n    \"Rang;\": { p: [10219], c: \"\\u27EB\" },\n    \"Rarr;\": { p: [8608], c: \"\\u21A0\" },\n    \"Rarrtl;\": { p: [10518], c: \"\\u2916\" },\n    \"Rcaron;\": { p: [344], c: \"\\u0158\" },\n    \"Rcedil;\": { p: [342], c: \"\\u0156\" },\n    \"Rcy;\": { p: [1056], c: \"\\u0420\" },\n    \"Re;\": { p: [8476], c: \"\\u211C\" },\n    \"ReverseElement;\": { p: [8715], c: \"\\u220B\" },\n    \"ReverseEquilibrium;\": { p: [8651], c: \"\\u21CB\" },\n    \"ReverseUpEquilibrium;\": { p: [10607], c: \"\\u296F\" },\n    \"Rfr;\": { p: [8476], c: \"\\u211C\" },\n    \"Rho;\": { p: [929], c: \"\\u03A1\" },\n    \"RightAngleBracket;\": { p: [10217], c: \"\\u27E9\" },\n    \"RightArrow;\": { p: [8594], c: \"\\u2192\" },\n    \"RightArrowBar;\": { p: [8677], c: \"\\u21E5\" },\n    \"RightArrowLeftArrow;\": { p: [8644], c: \"\\u21C4\" },\n    \"RightCeiling;\": { p: [8969], c: \"\\u2309\" },\n    \"RightDoubleBracket;\": { p: [10215], c: \"\\u27E7\" },\n    \"RightDownTeeVector;\": { p: [10589], c: \"\\u295D\" },\n    \"RightDownVector;\": { p: [8642], c: \"\\u21C2\" },\n    \"RightDownVectorBar;\": { p: [10581], c: \"\\u2955\" },\n    \"RightFloor;\": { p: [8971], c: \"\\u230B\" },\n    \"RightTee;\": { p: [8866], c: \"\\u22A2\" },\n    \"RightTeeArrow;\": { p: [8614], c: \"\\u21A6\" },\n    \"RightTeeVector;\": { p: [10587], c: \"\\u295B\" },\n    \"RightTriangle;\": { p: [8883], c: \"\\u22B3\" },\n    \"RightTriangleBar;\": { p: [10704], c: \"\\u29D0\" },\n    \"RightTriangleEqual;\": { p: [8885], c: \"\\u22B5\" },\n    \"RightUpDownVector;\": { p: [10575], c: \"\\u294F\" },\n    \"RightUpTeeVector;\": { p: [10588], c: \"\\u295C\" },\n    \"RightUpVector;\": { p: [8638], c: \"\\u21BE\" },\n    \"RightUpVectorBar;\": { p: [10580], c: \"\\u2954\" },\n    \"RightVector;\": { p: [8640], c: \"\\u21C0\" },\n    \"RightVectorBar;\": { p: [10579], c: \"\\u2953\" },\n    \"Rightarrow;\": { p: [8658], c: \"\\u21D2\" },\n    \"Ropf;\": { p: [8477], c: \"\\u211D\" },\n    \"RoundImplies;\": { p: [10608], c: \"\\u2970\" },\n    \"Rrightarrow;\": { p: [8667], c: \"\\u21DB\" },\n    \"Rscr;\": { p: [8475], c: \"\\u211B\" },\n    \"Rsh;\": { p: [8625], c: \"\\u21B1\" },\n    \"RuleDelayed;\": { p: [10740], c: \"\\u29F4\" },\n    \"SHCHcy;\": { p: [1065], c: \"\\u0429\" },\n    \"SHcy;\": { p: [1064], c: \"\\u0428\" },\n    \"SOFTcy;\": { p: [1068], c: \"\\u042C\" },\n    \"Sacute;\": { p: [346], c: \"\\u015A\" },\n    \"Sc;\": { p: [10940], c: \"\\u2ABC\" },\n    \"Scaron;\": { p: [352], c: \"\\u0160\" },\n    \"Scedil;\": { p: [350], c: \"\\u015E\" },\n    \"Scirc;\": { p: [348], c: \"\\u015C\" },\n    \"Scy;\": { p: [1057], c: \"\\u0421\" },\n    \"Sfr;\": { p: [120086], c: \"\\uD835\\uDD16\" },\n    \"ShortDownArrow;\": { p: [8595], c: \"\\u2193\" },\n    \"ShortLeftArrow;\": { p: [8592], c: \"\\u2190\" },\n    \"ShortRightArrow;\": { p: [8594], c: \"\\u2192\" },\n    \"ShortUpArrow;\": { p: [8593], c: \"\\u2191\" },\n    \"Sigma;\": { p: [931], c: \"\\u03A3\" },\n    \"SmallCircle;\": { p: [8728], c: \"\\u2218\" },\n    \"Sopf;\": { p: [120138], c: \"\\uD835\\uDD4A\" },\n    \"Sqrt;\": { p: [8730], c: \"\\u221A\" },\n    \"Square;\": { p: [9633], c: \"\\u25A1\" },\n    \"SquareIntersection;\": { p: [8851], c: \"\\u2293\" },\n    \"SquareSubset;\": { p: [8847], c: \"\\u228F\" },\n    \"SquareSubsetEqual;\": { p: [8849], c: \"\\u2291\" },\n    \"SquareSuperset;\": { p: [8848], c: \"\\u2290\" },\n    \"SquareSupersetEqual;\": { p: [8850], c: \"\\u2292\" },\n    \"SquareUnion;\": { p: [8852], c: \"\\u2294\" },\n    \"Sscr;\": { p: [119982], c: \"\\uD835\\uDCAE\" },\n    \"Star;\": { p: [8902], c: \"\\u22C6\" },\n    \"Sub;\": { p: [8912], c: \"\\u22D0\" },\n    \"Subset;\": { p: [8912], c: \"\\u22D0\" },\n    \"SubsetEqual;\": { p: [8838], c: \"\\u2286\" },\n    \"Succeeds;\": { p: [8827], c: \"\\u227B\" },\n    \"SucceedsEqual;\": { p: [10928], c: \"\\u2AB0\" },\n    \"SucceedsSlantEqual;\": { p: [8829], c: \"\\u227D\" },\n    \"SucceedsTilde;\": { p: [8831], c: \"\\u227F\" },\n    \"SuchThat;\": { p: [8715], c: \"\\u220B\" },\n    \"Sum;\": { p: [8721], c: \"\\u2211\" },\n    \"Sup;\": { p: [8913], c: \"\\u22D1\" },\n    \"Superset;\": { p: [8835], c: \"\\u2283\" },\n    \"SupersetEqual;\": { p: [8839], c: \"\\u2287\" },\n    \"Supset;\": { p: [8913], c: \"\\u22D1\" },\n    THORN: { p: [222], c: \"\\u00DE\" },\n    \"THORN;\": { p: [222], c: \"\\u00DE\" },\n    \"TRADE;\": { p: [8482], c: \"\\u2122\" },\n    \"TSHcy;\": { p: [1035], c: \"\\u040B\" },\n    \"TScy;\": { p: [1062], c: \"\\u0426\" },\n    \"Tab;\": { p: [9], c: \"\\u0009\" },\n    \"Tau;\": { p: [932], c: \"\\u03A4\" },\n    \"Tcaron;\": { p: [356], c: \"\\u0164\" },\n    \"Tcedil;\": { p: [354], c: \"\\u0162\" },\n    \"Tcy;\": { p: [1058], c: \"\\u0422\" },\n    \"Tfr;\": { p: [120087], c: \"\\uD835\\uDD17\" },\n    \"Therefore;\": { p: [8756], c: \"\\u2234\" },\n    \"Theta;\": { p: [920], c: \"\\u0398\" },\n    \"ThickSpace;\": {\n        p: [8287, 8202],\n        c: \"\\u205F\\u200A\",\n    },\n    \"ThinSpace;\": { p: [8201], c: \"\\u2009\" },\n    \"Tilde;\": { p: [8764], c: \"\\u223C\" },\n    \"TildeEqual;\": { p: [8771], c: \"\\u2243\" },\n    \"TildeFullEqual;\": { p: [8773], c: \"\\u2245\" },\n    \"TildeTilde;\": { p: [8776], c: \"\\u2248\" },\n    \"Topf;\": { p: [120139], c: \"\\uD835\\uDD4B\" },\n    \"TripleDot;\": { p: [8411], c: \"\\u20DB\" },\n    \"Tscr;\": { p: [119983], c: \"\\uD835\\uDCAF\" },\n    \"Tstrok;\": { p: [358], c: \"\\u0166\" },\n    Uacute: { p: [218], c: \"\\u00DA\" },\n    \"Uacute;\": { p: [218], c: \"\\u00DA\" },\n    \"Uarr;\": { p: [8607], c: \"\\u219F\" },\n    \"Uarrocir;\": { p: [10569], c: \"\\u2949\" },\n    \"Ubrcy;\": { p: [1038], c: \"\\u040E\" },\n    \"Ubreve;\": { p: [364], c: \"\\u016C\" },\n    Ucirc: { p: [219], c: \"\\u00DB\" },\n    \"Ucirc;\": { p: [219], c: \"\\u00DB\" },\n    \"Ucy;\": { p: [1059], c: \"\\u0423\" },\n    \"Udblac;\": { p: [368], c: \"\\u0170\" },\n    \"Ufr;\": { p: [120088], c: \"\\uD835\\uDD18\" },\n    Ugrave: { p: [217], c: \"\\u00D9\" },\n    \"Ugrave;\": { p: [217], c: \"\\u00D9\" },\n    \"Umacr;\": { p: [362], c: \"\\u016A\" },\n    \"UnderBar;\": { p: [95], c: \"\\u005F\" },\n    \"UnderBrace;\": { p: [9183], c: \"\\u23DF\" },\n    \"UnderBracket;\": { p: [9141], c: \"\\u23B5\" },\n    \"UnderParenthesis;\": { p: [9181], c: \"\\u23DD\" },\n    \"Union;\": { p: [8899], c: \"\\u22C3\" },\n    \"UnionPlus;\": { p: [8846], c: \"\\u228E\" },\n    \"Uogon;\": { p: [370], c: \"\\u0172\" },\n    \"Uopf;\": { p: [120140], c: \"\\uD835\\uDD4C\" },\n    \"UpArrow;\": { p: [8593], c: \"\\u2191\" },\n    \"UpArrowBar;\": { p: [10514], c: \"\\u2912\" },\n    \"UpArrowDownArrow;\": { p: [8645], c: \"\\u21C5\" },\n    \"UpDownArrow;\": { p: [8597], c: \"\\u2195\" },\n    \"UpEquilibrium;\": { p: [10606], c: \"\\u296E\" },\n    \"UpTee;\": { p: [8869], c: \"\\u22A5\" },\n    \"UpTeeArrow;\": { p: [8613], c: \"\\u21A5\" },\n    \"Uparrow;\": { p: [8657], c: \"\\u21D1\" },\n    \"Updownarrow;\": { p: [8661], c: \"\\u21D5\" },\n    \"UpperLeftArrow;\": { p: [8598], c: \"\\u2196\" },\n    \"UpperRightArrow;\": { p: [8599], c: \"\\u2197\" },\n    \"Upsi;\": { p: [978], c: \"\\u03D2\" },\n    \"Upsilon;\": { p: [933], c: \"\\u03A5\" },\n    \"Uring;\": { p: [366], c: \"\\u016E\" },\n    \"Uscr;\": { p: [119984], c: \"\\uD835\\uDCB0\" },\n    \"Utilde;\": { p: [360], c: \"\\u0168\" },\n    Uuml: { p: [220], c: \"\\u00DC\" },\n    \"Uuml;\": { p: [220], c: \"\\u00DC\" },\n    \"VDash;\": { p: [8875], c: \"\\u22AB\" },\n    \"Vbar;\": { p: [10987], c: \"\\u2AEB\" },\n    \"Vcy;\": { p: [1042], c: \"\\u0412\" },\n    \"Vdash;\": { p: [8873], c: \"\\u22A9\" },\n    \"Vdashl;\": { p: [10982], c: \"\\u2AE6\" },\n    \"Vee;\": { p: [8897], c: \"\\u22C1\" },\n    \"Verbar;\": { p: [8214], c: \"\\u2016\" },\n    \"Vert;\": { p: [8214], c: \"\\u2016\" },\n    \"VerticalBar;\": { p: [8739], c: \"\\u2223\" },\n    \"VerticalLine;\": { p: [124], c: \"\\u007C\" },\n    \"VerticalSeparator;\": { p: [10072], c: \"\\u2758\" },\n    \"VerticalTilde;\": { p: [8768], c: \"\\u2240\" },\n    \"VeryThinSpace;\": { p: [8202], c: \"\\u200A\" },\n    \"Vfr;\": { p: [120089], c: \"\\uD835\\uDD19\" },\n    \"Vopf;\": { p: [120141], c: \"\\uD835\\uDD4D\" },\n    \"Vscr;\": { p: [119985], c: \"\\uD835\\uDCB1\" },\n    \"Vvdash;\": { p: [8874], c: \"\\u22AA\" },\n    \"Wcirc;\": { p: [372], c: \"\\u0174\" },\n    \"Wedge;\": { p: [8896], c: \"\\u22C0\" },\n    \"Wfr;\": { p: [120090], c: \"\\uD835\\uDD1A\" },\n    \"Wopf;\": { p: [120142], c: \"\\uD835\\uDD4E\" },\n    \"Wscr;\": { p: [119986], c: \"\\uD835\\uDCB2\" },\n    \"Xfr;\": { p: [120091], c: \"\\uD835\\uDD1B\" },\n    \"Xi;\": { p: [926], c: \"\\u039E\" },\n    \"Xopf;\": { p: [120143], c: \"\\uD835\\uDD4F\" },\n    \"Xscr;\": { p: [119987], c: \"\\uD835\\uDCB3\" },\n    \"YAcy;\": { p: [1071], c: \"\\u042F\" },\n    \"YIcy;\": { p: [1031], c: \"\\u0407\" },\n    \"YUcy;\": { p: [1070], c: \"\\u042E\" },\n    Yacute: { p: [221], c: \"\\u00DD\" },\n    \"Yacute;\": { p: [221], c: \"\\u00DD\" },\n    \"Ycirc;\": { p: [374], c: \"\\u0176\" },\n    \"Ycy;\": { p: [1067], c: \"\\u042B\" },\n    \"Yfr;\": { p: [120092], c: \"\\uD835\\uDD1C\" },\n    \"Yopf;\": { p: [120144], c: \"\\uD835\\uDD50\" },\n    \"Yscr;\": { p: [119988], c: \"\\uD835\\uDCB4\" },\n    \"Yuml;\": { p: [376], c: \"\\u0178\" },\n    \"ZHcy;\": { p: [1046], c: \"\\u0416\" },\n    \"Zacute;\": { p: [377], c: \"\\u0179\" },\n    \"Zcaron;\": { p: [381], c: \"\\u017D\" },\n    \"Zcy;\": { p: [1047], c: \"\\u0417\" },\n    \"Zdot;\": { p: [379], c: \"\\u017B\" },\n    \"ZeroWidthSpace;\": { p: [8203], c: \"\\u200B\" },\n    \"Zeta;\": { p: [918], c: \"\\u0396\" },\n    \"Zfr;\": { p: [8488], c: \"\\u2128\" },\n    \"Zopf;\": { p: [8484], c: \"\\u2124\" },\n    \"Zscr;\": { p: [119989], c: \"\\uD835\\uDCB5\" },\n    aacute: { p: [225], c: \"\\u00E1\" },\n    \"aacute;\": { p: [225], c: \"\\u00E1\" },\n    \"abreve;\": { p: [259], c: \"\\u0103\" },\n    \"ac;\": { p: [8766], c: \"\\u223E\" },\n    \"acE;\": { p: [8766, 819], c: \"\\u223E\\u0333\" },\n    \"acd;\": { p: [8767], c: \"\\u223F\" },\n    acirc: { p: [226], c: \"\\u00E2\" },\n    \"acirc;\": { p: [226], c: \"\\u00E2\" },\n    acute: { p: [180], c: \"\\u00B4\" },\n    \"acute;\": { p: [180], c: \"\\u00B4\" },\n    \"acy;\": { p: [1072], c: \"\\u0430\" },\n    aelig: { p: [230], c: \"\\u00E6\" },\n    \"aelig;\": { p: [230], c: \"\\u00E6\" },\n    \"af;\": { p: [8289], c: \"\\u2061\" },\n    \"afr;\": { p: [120094], c: \"\\uD835\\uDD1E\" },\n    agrave: { p: [224], c: \"\\u00E0\" },\n    \"agrave;\": { p: [224], c: \"\\u00E0\" },\n    \"alefsym;\": { p: [8501], c: \"\\u2135\" },\n    \"aleph;\": { p: [8501], c: \"\\u2135\" },\n    \"alpha;\": { p: [945], c: \"\\u03B1\" },\n    \"amacr;\": { p: [257], c: \"\\u0101\" },\n    \"amalg;\": { p: [10815], c: \"\\u2A3F\" },\n    amp: { p: [38], c: \"\\u0026\" },\n    \"amp;\": { p: [38], c: \"\\u0026\" },\n    \"and;\": { p: [8743], c: \"\\u2227\" },\n    \"andand;\": { p: [10837], c: \"\\u2A55\" },\n    \"andd;\": { p: [10844], c: \"\\u2A5C\" },\n    \"andslope;\": { p: [10840], c: \"\\u2A58\" },\n    \"andv;\": { p: [10842], c: \"\\u2A5A\" },\n    \"ang;\": { p: [8736], c: \"\\u2220\" },\n    \"ange;\": { p: [10660], c: \"\\u29A4\" },\n    \"angle;\": { p: [8736], c: \"\\u2220\" },\n    \"angmsd;\": { p: [8737], c: \"\\u2221\" },\n    \"angmsdaa;\": { p: [10664], c: \"\\u29A8\" },\n    \"angmsdab;\": { p: [10665], c: \"\\u29A9\" },\n    \"angmsdac;\": { p: [10666], c: \"\\u29AA\" },\n    \"angmsdad;\": { p: [10667], c: \"\\u29AB\" },\n    \"angmsdae;\": { p: [10668], c: \"\\u29AC\" },\n    \"angmsdaf;\": { p: [10669], c: \"\\u29AD\" },\n    \"angmsdag;\": { p: [10670], c: \"\\u29AE\" },\n    \"angmsdah;\": { p: [10671], c: \"\\u29AF\" },\n    \"angrt;\": { p: [8735], c: \"\\u221F\" },\n    \"angrtvb;\": { p: [8894], c: \"\\u22BE\" },\n    \"angrtvbd;\": { p: [10653], c: \"\\u299D\" },\n    \"angsph;\": { p: [8738], c: \"\\u2222\" },\n    \"angst;\": { p: [197], c: \"\\u00C5\" },\n    \"angzarr;\": { p: [9084], c: \"\\u237C\" },\n    \"aogon;\": { p: [261], c: \"\\u0105\" },\n    \"aopf;\": { p: [120146], c: \"\\uD835\\uDD52\" },\n    \"ap;\": { p: [8776], c: \"\\u2248\" },\n    \"apE;\": { p: [10864], c: \"\\u2A70\" },\n    \"apacir;\": { p: [10863], c: \"\\u2A6F\" },\n    \"ape;\": { p: [8778], c: \"\\u224A\" },\n    \"apid;\": { p: [8779], c: \"\\u224B\" },\n    \"apos;\": { p: [39], c: \"\\u0027\" },\n    \"approx;\": { p: [8776], c: \"\\u2248\" },\n    \"approxeq;\": { p: [8778], c: \"\\u224A\" },\n    aring: { p: [229], c: \"\\u00E5\" },\n    \"aring;\": { p: [229], c: \"\\u00E5\" },\n    \"ascr;\": { p: [119990], c: \"\\uD835\\uDCB6\" },\n    \"ast;\": { p: [42], c: \"\\u002A\" },\n    \"asymp;\": { p: [8776], c: \"\\u2248\" },\n    \"asympeq;\": { p: [8781], c: \"\\u224D\" },\n    atilde: { p: [227], c: \"\\u00E3\" },\n    \"atilde;\": { p: [227], c: \"\\u00E3\" },\n    auml: { p: [228], c: \"\\u00E4\" },\n    \"auml;\": { p: [228], c: \"\\u00E4\" },\n    \"awconint;\": { p: [8755], c: \"\\u2233\" },\n    \"awint;\": { p: [10769], c: \"\\u2A11\" },\n    \"bNot;\": { p: [10989], c: \"\\u2AED\" },\n    \"backcong;\": { p: [8780], c: \"\\u224C\" },\n    \"backepsilon;\": { p: [1014], c: \"\\u03F6\" },\n    \"backprime;\": { p: [8245], c: \"\\u2035\" },\n    \"backsim;\": { p: [8765], c: \"\\u223D\" },\n    \"backsimeq;\": { p: [8909], c: \"\\u22CD\" },\n    \"barvee;\": { p: [8893], c: \"\\u22BD\" },\n    \"barwed;\": { p: [8965], c: \"\\u2305\" },\n    \"barwedge;\": { p: [8965], c: \"\\u2305\" },\n    \"bbrk;\": { p: [9141], c: \"\\u23B5\" },\n    \"bbrktbrk;\": { p: [9142], c: \"\\u23B6\" },\n    \"bcong;\": { p: [8780], c: \"\\u224C\" },\n    \"bcy;\": { p: [1073], c: \"\\u0431\" },\n    \"bdquo;\": { p: [8222], c: \"\\u201E\" },\n    \"becaus;\": { p: [8757], c: \"\\u2235\" },\n    \"because;\": { p: [8757], c: \"\\u2235\" },\n    \"bemptyv;\": { p: [10672], c: \"\\u29B0\" },\n    \"bepsi;\": { p: [1014], c: \"\\u03F6\" },\n    \"bernou;\": { p: [8492], c: \"\\u212C\" },\n    \"beta;\": { p: [946], c: \"\\u03B2\" },\n    \"beth;\": { p: [8502], c: \"\\u2136\" },\n    \"between;\": { p: [8812], c: \"\\u226C\" },\n    \"bfr;\": { p: [120095], c: \"\\uD835\\uDD1F\" },\n    \"bigcap;\": { p: [8898], c: \"\\u22C2\" },\n    \"bigcirc;\": { p: [9711], c: \"\\u25EF\" },\n    \"bigcup;\": { p: [8899], c: \"\\u22C3\" },\n    \"bigodot;\": { p: [10752], c: \"\\u2A00\" },\n    \"bigoplus;\": { p: [10753], c: \"\\u2A01\" },\n    \"bigotimes;\": { p: [10754], c: \"\\u2A02\" },\n    \"bigsqcup;\": { p: [10758], c: \"\\u2A06\" },\n    \"bigstar;\": { p: [9733], c: \"\\u2605\" },\n    \"bigtriangledown;\": { p: [9661], c: \"\\u25BD\" },\n    \"bigtriangleup;\": { p: [9651], c: \"\\u25B3\" },\n    \"biguplus;\": { p: [10756], c: \"\\u2A04\" },\n    \"bigvee;\": { p: [8897], c: \"\\u22C1\" },\n    \"bigwedge;\": { p: [8896], c: \"\\u22C0\" },\n    \"bkarow;\": { p: [10509], c: \"\\u290D\" },\n    \"blacklozenge;\": { p: [10731], c: \"\\u29EB\" },\n    \"blacksquare;\": { p: [9642], c: \"\\u25AA\" },\n    \"blacktriangle;\": { p: [9652], c: \"\\u25B4\" },\n    \"blacktriangledown;\": { p: [9662], c: \"\\u25BE\" },\n    \"blacktriangleleft;\": { p: [9666], c: \"\\u25C2\" },\n    \"blacktriangleright;\": { p: [9656], c: \"\\u25B8\" },\n    \"blank;\": { p: [9251], c: \"\\u2423\" },\n    \"blk12;\": { p: [9618], c: \"\\u2592\" },\n    \"blk14;\": { p: [9617], c: \"\\u2591\" },\n    \"blk34;\": { p: [9619], c: \"\\u2593\" },\n    \"block;\": { p: [9608], c: \"\\u2588\" },\n    \"bne;\": { p: [61, 8421], c: \"\\u003D\\u20E5\" },\n    \"bnequiv;\": { p: [8801, 8421], c: \"\\u2261\\u20E5\" },\n    \"bnot;\": { p: [8976], c: \"\\u2310\" },\n    \"bopf;\": { p: [120147], c: \"\\uD835\\uDD53\" },\n    \"bot;\": { p: [8869], c: \"\\u22A5\" },\n    \"bottom;\": { p: [8869], c: \"\\u22A5\" },\n    \"bowtie;\": { p: [8904], c: \"\\u22C8\" },\n    \"boxDL;\": { p: [9559], c: \"\\u2557\" },\n    \"boxDR;\": { p: [9556], c: \"\\u2554\" },\n    \"boxDl;\": { p: [9558], c: \"\\u2556\" },\n    \"boxDr;\": { p: [9555], c: \"\\u2553\" },\n    \"boxH;\": { p: [9552], c: \"\\u2550\" },\n    \"boxHD;\": { p: [9574], c: \"\\u2566\" },\n    \"boxHU;\": { p: [9577], c: \"\\u2569\" },\n    \"boxHd;\": { p: [9572], c: \"\\u2564\" },\n    \"boxHu;\": { p: [9575], c: \"\\u2567\" },\n    \"boxUL;\": { p: [9565], c: \"\\u255D\" },\n    \"boxUR;\": { p: [9562], c: \"\\u255A\" },\n    \"boxUl;\": { p: [9564], c: \"\\u255C\" },\n    \"boxUr;\": { p: [9561], c: \"\\u2559\" },\n    \"boxV;\": { p: [9553], c: \"\\u2551\" },\n    \"boxVH;\": { p: [9580], c: \"\\u256C\" },\n    \"boxVL;\": { p: [9571], c: \"\\u2563\" },\n    \"boxVR;\": { p: [9568], c: \"\\u2560\" },\n    \"boxVh;\": { p: [9579], c: \"\\u256B\" },\n    \"boxVl;\": { p: [9570], c: \"\\u2562\" },\n    \"boxVr;\": { p: [9567], c: \"\\u255F\" },\n    \"boxbox;\": { p: [10697], c: \"\\u29C9\" },\n    \"boxdL;\": { p: [9557], c: \"\\u2555\" },\n    \"boxdR;\": { p: [9554], c: \"\\u2552\" },\n    \"boxdl;\": { p: [9488], c: \"\\u2510\" },\n    \"boxdr;\": { p: [9484], c: \"\\u250C\" },\n    \"boxh;\": { p: [9472], c: \"\\u2500\" },\n    \"boxhD;\": { p: [9573], c: \"\\u2565\" },\n    \"boxhU;\": { p: [9576], c: \"\\u2568\" },\n    \"boxhd;\": { p: [9516], c: \"\\u252C\" },\n    \"boxhu;\": { p: [9524], c: \"\\u2534\" },\n    \"boxminus;\": { p: [8863], c: \"\\u229F\" },\n    \"boxplus;\": { p: [8862], c: \"\\u229E\" },\n    \"boxtimes;\": { p: [8864], c: \"\\u22A0\" },\n    \"boxuL;\": { p: [9563], c: \"\\u255B\" },\n    \"boxuR;\": { p: [9560], c: \"\\u2558\" },\n    \"boxul;\": { p: [9496], c: \"\\u2518\" },\n    \"boxur;\": { p: [9492], c: \"\\u2514\" },\n    \"boxv;\": { p: [9474], c: \"\\u2502\" },\n    \"boxvH;\": { p: [9578], c: \"\\u256A\" },\n    \"boxvL;\": { p: [9569], c: \"\\u2561\" },\n    \"boxvR;\": { p: [9566], c: \"\\u255E\" },\n    \"boxvh;\": { p: [9532], c: \"\\u253C\" },\n    \"boxvl;\": { p: [9508], c: \"\\u2524\" },\n    \"boxvr;\": { p: [9500], c: \"\\u251C\" },\n    \"bprime;\": { p: [8245], c: \"\\u2035\" },\n    \"breve;\": { p: [728], c: \"\\u02D8\" },\n    brvbar: { p: [166], c: \"\\u00A6\" },\n    \"brvbar;\": { p: [166], c: \"\\u00A6\" },\n    \"bscr;\": { p: [119991], c: \"\\uD835\\uDCB7\" },\n    \"bsemi;\": { p: [8271], c: \"\\u204F\" },\n    \"bsim;\": { p: [8765], c: \"\\u223D\" },\n    \"bsime;\": { p: [8909], c: \"\\u22CD\" },\n    \"bsol;\": { p: [92], c: \"\\u005C\" },\n    \"bsolb;\": { p: [10693], c: \"\\u29C5\" },\n    \"bsolhsub;\": { p: [10184], c: \"\\u27C8\" },\n    \"bull;\": { p: [8226], c: \"\\u2022\" },\n    \"bullet;\": { p: [8226], c: \"\\u2022\" },\n    \"bump;\": { p: [8782], c: \"\\u224E\" },\n    \"bumpE;\": { p: [10926], c: \"\\u2AAE\" },\n    \"bumpe;\": { p: [8783], c: \"\\u224F\" },\n    \"bumpeq;\": { p: [8783], c: \"\\u224F\" },\n    \"cacute;\": { p: [263], c: \"\\u0107\" },\n    \"cap;\": { p: [8745], c: \"\\u2229\" },\n    \"capand;\": { p: [10820], c: \"\\u2A44\" },\n    \"capbrcup;\": { p: [10825], c: \"\\u2A49\" },\n    \"capcap;\": { p: [10827], c: \"\\u2A4B\" },\n    \"capcup;\": { p: [10823], c: \"\\u2A47\" },\n    \"capdot;\": { p: [10816], c: \"\\u2A40\" },\n    \"caps;\": { p: [8745, 65024], c: \"\\u2229\\uFE00\" },\n    \"caret;\": { p: [8257], c: \"\\u2041\" },\n    \"caron;\": { p: [711], c: \"\\u02C7\" },\n    \"ccaps;\": { p: [10829], c: \"\\u2A4D\" },\n    \"ccaron;\": { p: [269], c: \"\\u010D\" },\n    ccedil: { p: [231], c: \"\\u00E7\" },\n    \"ccedil;\": { p: [231], c: \"\\u00E7\" },\n    \"ccirc;\": { p: [265], c: \"\\u0109\" },\n    \"ccups;\": { p: [10828], c: \"\\u2A4C\" },\n    \"ccupssm;\": { p: [10832], c: \"\\u2A50\" },\n    \"cdot;\": { p: [267], c: \"\\u010B\" },\n    cedil: { p: [184], c: \"\\u00B8\" },\n    \"cedil;\": { p: [184], c: \"\\u00B8\" },\n    \"cemptyv;\": { p: [10674], c: \"\\u29B2\" },\n    cent: { p: [162], c: \"\\u00A2\" },\n    \"cent;\": { p: [162], c: \"\\u00A2\" },\n    \"centerdot;\": { p: [183], c: \"\\u00B7\" },\n    \"cfr;\": { p: [120096], c: \"\\uD835\\uDD20\" },\n    \"chcy;\": { p: [1095], c: \"\\u0447\" },\n    \"check;\": { p: [10003], c: \"\\u2713\" },\n    \"checkmark;\": { p: [10003], c: \"\\u2713\" },\n    \"chi;\": { p: [967], c: \"\\u03C7\" },\n    \"cir;\": { p: [9675], c: \"\\u25CB\" },\n    \"cirE;\": { p: [10691], c: \"\\u29C3\" },\n    \"circ;\": { p: [710], c: \"\\u02C6\" },\n    \"circeq;\": { p: [8791], c: \"\\u2257\" },\n    \"circlearrowleft;\": { p: [8634], c: \"\\u21BA\" },\n    \"circlearrowright;\": { p: [8635], c: \"\\u21BB\" },\n    \"circledR;\": { p: [174], c: \"\\u00AE\" },\n    \"circledS;\": { p: [9416], c: \"\\u24C8\" },\n    \"circledast;\": { p: [8859], c: \"\\u229B\" },\n    \"circledcirc;\": { p: [8858], c: \"\\u229A\" },\n    \"circleddash;\": { p: [8861], c: \"\\u229D\" },\n    \"cire;\": { p: [8791], c: \"\\u2257\" },\n    \"cirfnint;\": { p: [10768], c: \"\\u2A10\" },\n    \"cirmid;\": { p: [10991], c: \"\\u2AEF\" },\n    \"cirscir;\": { p: [10690], c: \"\\u29C2\" },\n    \"clubs;\": { p: [9827], c: \"\\u2663\" },\n    \"clubsuit;\": { p: [9827], c: \"\\u2663\" },\n    \"colon;\": { p: [58], c: \"\\u003A\" },\n    \"colone;\": { p: [8788], c: \"\\u2254\" },\n    \"coloneq;\": { p: [8788], c: \"\\u2254\" },\n    \"comma;\": { p: [44], c: \"\\u002C\" },\n    \"commat;\": { p: [64], c: \"\\u0040\" },\n    \"comp;\": { p: [8705], c: \"\\u2201\" },\n    \"compfn;\": { p: [8728], c: \"\\u2218\" },\n    \"complement;\": { p: [8705], c: \"\\u2201\" },\n    \"complexes;\": { p: [8450], c: \"\\u2102\" },\n    \"cong;\": { p: [8773], c: \"\\u2245\" },\n    \"congdot;\": { p: [10861], c: \"\\u2A6D\" },\n    \"conint;\": { p: [8750], c: \"\\u222E\" },\n    \"copf;\": { p: [120148], c: \"\\uD835\\uDD54\" },\n    \"coprod;\": { p: [8720], c: \"\\u2210\" },\n    copy: { p: [169], c: \"\\u00A9\" },\n    \"copy;\": { p: [169], c: \"\\u00A9\" },\n    \"copysr;\": { p: [8471], c: \"\\u2117\" },\n    \"crarr;\": { p: [8629], c: \"\\u21B5\" },\n    \"cross;\": { p: [10007], c: \"\\u2717\" },\n    \"cscr;\": { p: [119992], c: \"\\uD835\\uDCB8\" },\n    \"csub;\": { p: [10959], c: \"\\u2ACF\" },\n    \"csube;\": { p: [10961], c: \"\\u2AD1\" },\n    \"csup;\": { p: [10960], c: \"\\u2AD0\" },\n    \"csupe;\": { p: [10962], c: \"\\u2AD2\" },\n    \"ctdot;\": { p: [8943], c: \"\\u22EF\" },\n    \"cudarrl;\": { p: [10552], c: \"\\u2938\" },\n    \"cudarrr;\": { p: [10549], c: \"\\u2935\" },\n    \"cuepr;\": { p: [8926], c: \"\\u22DE\" },\n    \"cuesc;\": { p: [8927], c: \"\\u22DF\" },\n    \"cularr;\": { p: [8630], c: \"\\u21B6\" },\n    \"cularrp;\": { p: [10557], c: \"\\u293D\" },\n    \"cup;\": { p: [8746], c: \"\\u222A\" },\n    \"cupbrcap;\": { p: [10824], c: \"\\u2A48\" },\n    \"cupcap;\": { p: [10822], c: \"\\u2A46\" },\n    \"cupcup;\": { p: [10826], c: \"\\u2A4A\" },\n    \"cupdot;\": { p: [8845], c: \"\\u228D\" },\n    \"cupor;\": { p: [10821], c: \"\\u2A45\" },\n    \"cups;\": { p: [8746, 65024], c: \"\\u222A\\uFE00\" },\n    \"curarr;\": { p: [8631], c: \"\\u21B7\" },\n    \"curarrm;\": { p: [10556], c: \"\\u293C\" },\n    \"curlyeqprec;\": { p: [8926], c: \"\\u22DE\" },\n    \"curlyeqsucc;\": { p: [8927], c: \"\\u22DF\" },\n    \"curlyvee;\": { p: [8910], c: \"\\u22CE\" },\n    \"curlywedge;\": { p: [8911], c: \"\\u22CF\" },\n    curren: { p: [164], c: \"\\u00A4\" },\n    \"curren;\": { p: [164], c: \"\\u00A4\" },\n    \"curvearrowleft;\": { p: [8630], c: \"\\u21B6\" },\n    \"curvearrowright;\": { p: [8631], c: \"\\u21B7\" },\n    \"cuvee;\": { p: [8910], c: \"\\u22CE\" },\n    \"cuwed;\": { p: [8911], c: \"\\u22CF\" },\n    \"cwconint;\": { p: [8754], c: \"\\u2232\" },\n    \"cwint;\": { p: [8753], c: \"\\u2231\" },\n    \"cylcty;\": { p: [9005], c: \"\\u232D\" },\n    \"dArr;\": { p: [8659], c: \"\\u21D3\" },\n    \"dHar;\": { p: [10597], c: \"\\u2965\" },\n    \"dagger;\": { p: [8224], c: \"\\u2020\" },\n    \"daleth;\": { p: [8504], c: \"\\u2138\" },\n    \"darr;\": { p: [8595], c: \"\\u2193\" },\n    \"dash;\": { p: [8208], c: \"\\u2010\" },\n    \"dashv;\": { p: [8867], c: \"\\u22A3\" },\n    \"dbkarow;\": { p: [10511], c: \"\\u290F\" },\n    \"dblac;\": { p: [733], c: \"\\u02DD\" },\n    \"dcaron;\": { p: [271], c: \"\\u010F\" },\n    \"dcy;\": { p: [1076], c: \"\\u0434\" },\n    \"dd;\": { p: [8518], c: \"\\u2146\" },\n    \"ddagger;\": { p: [8225], c: \"\\u2021\" },\n    \"ddarr;\": { p: [8650], c: \"\\u21CA\" },\n    \"ddotseq;\": { p: [10871], c: \"\\u2A77\" },\n    deg: { p: [176], c: \"\\u00B0\" },\n    \"deg;\": { p: [176], c: \"\\u00B0\" },\n    \"delta;\": { p: [948], c: \"\\u03B4\" },\n    \"demptyv;\": { p: [10673], c: \"\\u29B1\" },\n    \"dfisht;\": { p: [10623], c: \"\\u297F\" },\n    \"dfr;\": { p: [120097], c: \"\\uD835\\uDD21\" },\n    \"dharl;\": { p: [8643], c: \"\\u21C3\" },\n    \"dharr;\": { p: [8642], c: \"\\u21C2\" },\n    \"diam;\": { p: [8900], c: \"\\u22C4\" },\n    \"diamond;\": { p: [8900], c: \"\\u22C4\" },\n    \"diamondsuit;\": { p: [9830], c: \"\\u2666\" },\n    \"diams;\": { p: [9830], c: \"\\u2666\" },\n    \"die;\": { p: [168], c: \"\\u00A8\" },\n    \"digamma;\": { p: [989], c: \"\\u03DD\" },\n    \"disin;\": { p: [8946], c: \"\\u22F2\" },\n    \"div;\": { p: [247], c: \"\\u00F7\" },\n    divide: { p: [247], c: \"\\u00F7\" },\n    \"divide;\": { p: [247], c: \"\\u00F7\" },\n    \"divideontimes;\": { p: [8903], c: \"\\u22C7\" },\n    \"divonx;\": { p: [8903], c: \"\\u22C7\" },\n    \"djcy;\": { p: [1106], c: \"\\u0452\" },\n    \"dlcorn;\": { p: [8990], c: \"\\u231E\" },\n    \"dlcrop;\": { p: [8973], c: \"\\u230D\" },\n    \"dollar;\": { p: [36], c: \"\\u0024\" },\n    \"dopf;\": { p: [120149], c: \"\\uD835\\uDD55\" },\n    \"dot;\": { p: [729], c: \"\\u02D9\" },\n    \"doteq;\": { p: [8784], c: \"\\u2250\" },\n    \"doteqdot;\": { p: [8785], c: \"\\u2251\" },\n    \"dotminus;\": { p: [8760], c: \"\\u2238\" },\n    \"dotplus;\": { p: [8724], c: \"\\u2214\" },\n    \"dotsquare;\": { p: [8865], c: \"\\u22A1\" },\n    \"doublebarwedge;\": { p: [8966], c: \"\\u2306\" },\n    \"downarrow;\": { p: [8595], c: \"\\u2193\" },\n    \"downdownarrows;\": { p: [8650], c: \"\\u21CA\" },\n    \"downharpoonleft;\": { p: [8643], c: \"\\u21C3\" },\n    \"downharpoonright;\": { p: [8642], c: \"\\u21C2\" },\n    \"drbkarow;\": { p: [10512], c: \"\\u2910\" },\n    \"drcorn;\": { p: [8991], c: \"\\u231F\" },\n    \"drcrop;\": { p: [8972], c: \"\\u230C\" },\n    \"dscr;\": { p: [119993], c: \"\\uD835\\uDCB9\" },\n    \"dscy;\": { p: [1109], c: \"\\u0455\" },\n    \"dsol;\": { p: [10742], c: \"\\u29F6\" },\n    \"dstrok;\": { p: [273], c: \"\\u0111\" },\n    \"dtdot;\": { p: [8945], c: \"\\u22F1\" },\n    \"dtri;\": { p: [9663], c: \"\\u25BF\" },\n    \"dtrif;\": { p: [9662], c: \"\\u25BE\" },\n    \"duarr;\": { p: [8693], c: \"\\u21F5\" },\n    \"duhar;\": { p: [10607], c: \"\\u296F\" },\n    \"dwangle;\": { p: [10662], c: \"\\u29A6\" },\n    \"dzcy;\": { p: [1119], c: \"\\u045F\" },\n    \"dzigrarr;\": { p: [10239], c: \"\\u27FF\" },\n    \"eDDot;\": { p: [10871], c: \"\\u2A77\" },\n    \"eDot;\": { p: [8785], c: \"\\u2251\" },\n    eacute: { p: [233], c: \"\\u00E9\" },\n    \"eacute;\": { p: [233], c: \"\\u00E9\" },\n    \"easter;\": { p: [10862], c: \"\\u2A6E\" },\n    \"ecaron;\": { p: [283], c: \"\\u011B\" },\n    \"ecir;\": { p: [8790], c: \"\\u2256\" },\n    ecirc: { p: [234], c: \"\\u00EA\" },\n    \"ecirc;\": { p: [234], c: \"\\u00EA\" },\n    \"ecolon;\": { p: [8789], c: \"\\u2255\" },\n    \"ecy;\": { p: [1101], c: \"\\u044D\" },\n    \"edot;\": { p: [279], c: \"\\u0117\" },\n    \"ee;\": { p: [8519], c: \"\\u2147\" },\n    \"efDot;\": { p: [8786], c: \"\\u2252\" },\n    \"efr;\": { p: [120098], c: \"\\uD835\\uDD22\" },\n    \"eg;\": { p: [10906], c: \"\\u2A9A\" },\n    egrave: { p: [232], c: \"\\u00E8\" },\n    \"egrave;\": { p: [232], c: \"\\u00E8\" },\n    \"egs;\": { p: [10902], c: \"\\u2A96\" },\n    \"egsdot;\": { p: [10904], c: \"\\u2A98\" },\n    \"el;\": { p: [10905], c: \"\\u2A99\" },\n    \"elinters;\": { p: [9191], c: \"\\u23E7\" },\n    \"ell;\": { p: [8467], c: \"\\u2113\" },\n    \"els;\": { p: [10901], c: \"\\u2A95\" },\n    \"elsdot;\": { p: [10903], c: \"\\u2A97\" },\n    \"emacr;\": { p: [275], c: \"\\u0113\" },\n    \"empty;\": { p: [8709], c: \"\\u2205\" },\n    \"emptyset;\": { p: [8709], c: \"\\u2205\" },\n    \"emptyv;\": { p: [8709], c: \"\\u2205\" },\n    \"emsp13;\": { p: [8196], c: \"\\u2004\" },\n    \"emsp14;\": { p: [8197], c: \"\\u2005\" },\n    \"emsp;\": { p: [8195], c: \"\\u2003\" },\n    \"eng;\": { p: [331], c: \"\\u014B\" },\n    \"ensp;\": { p: [8194], c: \"\\u2002\" },\n    \"eogon;\": { p: [281], c: \"\\u0119\" },\n    \"eopf;\": { p: [120150], c: \"\\uD835\\uDD56\" },\n    \"epar;\": { p: [8917], c: \"\\u22D5\" },\n    \"eparsl;\": { p: [10723], c: \"\\u29E3\" },\n    \"eplus;\": { p: [10865], c: \"\\u2A71\" },\n    \"epsi;\": { p: [949], c: \"\\u03B5\" },\n    \"epsilon;\": { p: [949], c: \"\\u03B5\" },\n    \"epsiv;\": { p: [1013], c: \"\\u03F5\" },\n    \"eqcirc;\": { p: [8790], c: \"\\u2256\" },\n    \"eqcolon;\": { p: [8789], c: \"\\u2255\" },\n    \"eqsim;\": { p: [8770], c: \"\\u2242\" },\n    \"eqslantgtr;\": { p: [10902], c: \"\\u2A96\" },\n    \"eqslantless;\": { p: [10901], c: \"\\u2A95\" },\n    \"equals;\": { p: [61], c: \"\\u003D\" },\n    \"equest;\": { p: [8799], c: \"\\u225F\" },\n    \"equiv;\": { p: [8801], c: \"\\u2261\" },\n    \"equivDD;\": { p: [10872], c: \"\\u2A78\" },\n    \"eqvparsl;\": { p: [10725], c: \"\\u29E5\" },\n    \"erDot;\": { p: [8787], c: \"\\u2253\" },\n    \"erarr;\": { p: [10609], c: \"\\u2971\" },\n    \"escr;\": { p: [8495], c: \"\\u212F\" },\n    \"esdot;\": { p: [8784], c: \"\\u2250\" },\n    \"esim;\": { p: [8770], c: \"\\u2242\" },\n    \"eta;\": { p: [951], c: \"\\u03B7\" },\n    eth: { p: [240], c: \"\\u00F0\" },\n    \"eth;\": { p: [240], c: \"\\u00F0\" },\n    euml: { p: [235], c: \"\\u00EB\" },\n    \"euml;\": { p: [235], c: \"\\u00EB\" },\n    \"euro;\": { p: [8364], c: \"\\u20AC\" },\n    \"excl;\": { p: [33], c: \"\\u0021\" },\n    \"exist;\": { p: [8707], c: \"\\u2203\" },\n    \"expectation;\": { p: [8496], c: \"\\u2130\" },\n    \"exponentiale;\": { p: [8519], c: \"\\u2147\" },\n    \"fallingdotseq;\": { p: [8786], c: \"\\u2252\" },\n    \"fcy;\": { p: [1092], c: \"\\u0444\" },\n    \"female;\": { p: [9792], c: \"\\u2640\" },\n    \"ffilig;\": { p: [64259], c: \"\\uFB03\" },\n    \"fflig;\": { p: [64256], c: \"\\uFB00\" },\n    \"ffllig;\": { p: [64260], c: \"\\uFB04\" },\n    \"ffr;\": { p: [120099], c: \"\\uD835\\uDD23\" },\n    \"filig;\": { p: [64257], c: \"\\uFB01\" },\n    \"fjlig;\": { p: [102, 106], c: \"\\u0066\\u006A\" },\n    \"flat;\": { p: [9837], c: \"\\u266D\" },\n    \"fllig;\": { p: [64258], c: \"\\uFB02\" },\n    \"fltns;\": { p: [9649], c: \"\\u25B1\" },\n    \"fnof;\": { p: [402], c: \"\\u0192\" },\n    \"fopf;\": { p: [120151], c: \"\\uD835\\uDD57\" },\n    \"forall;\": { p: [8704], c: \"\\u2200\" },\n    \"fork;\": { p: [8916], c: \"\\u22D4\" },\n    \"forkv;\": { p: [10969], c: \"\\u2AD9\" },\n    \"fpartint;\": { p: [10765], c: \"\\u2A0D\" },\n    frac12: { p: [189], c: \"\\u00BD\" },\n    \"frac12;\": { p: [189], c: \"\\u00BD\" },\n    \"frac13;\": { p: [8531], c: \"\\u2153\" },\n    frac14: { p: [188], c: \"\\u00BC\" },\n    \"frac14;\": { p: [188], c: \"\\u00BC\" },\n    \"frac15;\": { p: [8533], c: \"\\u2155\" },\n    \"frac16;\": { p: [8537], c: \"\\u2159\" },\n    \"frac18;\": { p: [8539], c: \"\\u215B\" },\n    \"frac23;\": { p: [8532], c: \"\\u2154\" },\n    \"frac25;\": { p: [8534], c: \"\\u2156\" },\n    frac34: { p: [190], c: \"\\u00BE\" },\n    \"frac34;\": { p: [190], c: \"\\u00BE\" },\n    \"frac35;\": { p: [8535], c: \"\\u2157\" },\n    \"frac38;\": { p: [8540], c: \"\\u215C\" },\n    \"frac45;\": { p: [8536], c: \"\\u2158\" },\n    \"frac56;\": { p: [8538], c: \"\\u215A\" },\n    \"frac58;\": { p: [8541], c: \"\\u215D\" },\n    \"frac78;\": { p: [8542], c: \"\\u215E\" },\n    \"frasl;\": { p: [8260], c: \"\\u2044\" },\n    \"frown;\": { p: [8994], c: \"\\u2322\" },\n    \"fscr;\": { p: [119995], c: \"\\uD835\\uDCBB\" },\n    \"gE;\": { p: [8807], c: \"\\u2267\" },\n    \"gEl;\": { p: [10892], c: \"\\u2A8C\" },\n    \"gacute;\": { p: [501], c: \"\\u01F5\" },\n    \"gamma;\": { p: [947], c: \"\\u03B3\" },\n    \"gammad;\": { p: [989], c: \"\\u03DD\" },\n    \"gap;\": { p: [10886], c: \"\\u2A86\" },\n    \"gbreve;\": { p: [287], c: \"\\u011F\" },\n    \"gcirc;\": { p: [285], c: \"\\u011D\" },\n    \"gcy;\": { p: [1075], c: \"\\u0433\" },\n    \"gdot;\": { p: [289], c: \"\\u0121\" },\n    \"ge;\": { p: [8805], c: \"\\u2265\" },\n    \"gel;\": { p: [8923], c: \"\\u22DB\" },\n    \"geq;\": { p: [8805], c: \"\\u2265\" },\n    \"geqq;\": { p: [8807], c: \"\\u2267\" },\n    \"geqslant;\": { p: [10878], c: \"\\u2A7E\" },\n    \"ges;\": { p: [10878], c: \"\\u2A7E\" },\n    \"gescc;\": { p: [10921], c: \"\\u2AA9\" },\n    \"gesdot;\": { p: [10880], c: \"\\u2A80\" },\n    \"gesdoto;\": { p: [10882], c: \"\\u2A82\" },\n    \"gesdotol;\": { p: [10884], c: \"\\u2A84\" },\n    \"gesl;\": { p: [8923, 65024], c: \"\\u22DB\\uFE00\" },\n    \"gesles;\": { p: [10900], c: \"\\u2A94\" },\n    \"gfr;\": { p: [120100], c: \"\\uD835\\uDD24\" },\n    \"gg;\": { p: [8811], c: \"\\u226B\" },\n    \"ggg;\": { p: [8921], c: \"\\u22D9\" },\n    \"gimel;\": { p: [8503], c: \"\\u2137\" },\n    \"gjcy;\": { p: [1107], c: \"\\u0453\" },\n    \"gl;\": { p: [8823], c: \"\\u2277\" },\n    \"glE;\": { p: [10898], c: \"\\u2A92\" },\n    \"gla;\": { p: [10917], c: \"\\u2AA5\" },\n    \"glj;\": { p: [10916], c: \"\\u2AA4\" },\n    \"gnE;\": { p: [8809], c: \"\\u2269\" },\n    \"gnap;\": { p: [10890], c: \"\\u2A8A\" },\n    \"gnapprox;\": { p: [10890], c: \"\\u2A8A\" },\n    \"gne;\": { p: [10888], c: \"\\u2A88\" },\n    \"gneq;\": { p: [10888], c: \"\\u2A88\" },\n    \"gneqq;\": { p: [8809], c: \"\\u2269\" },\n    \"gnsim;\": { p: [8935], c: \"\\u22E7\" },\n    \"gopf;\": { p: [120152], c: \"\\uD835\\uDD58\" },\n    \"grave;\": { p: [96], c: \"\\u0060\" },\n    \"gscr;\": { p: [8458], c: \"\\u210A\" },\n    \"gsim;\": { p: [8819], c: \"\\u2273\" },\n    \"gsime;\": { p: [10894], c: \"\\u2A8E\" },\n    \"gsiml;\": { p: [10896], c: \"\\u2A90\" },\n    gt: { p: [62], c: \"\\u003E\" },\n    \"gt;\": { p: [62], c: \"\\u003E\" },\n    \"gtcc;\": { p: [10919], c: \"\\u2AA7\" },\n    \"gtcir;\": { p: [10874], c: \"\\u2A7A\" },\n    \"gtdot;\": { p: [8919], c: \"\\u22D7\" },\n    \"gtlPar;\": { p: [10645], c: \"\\u2995\" },\n    \"gtquest;\": { p: [10876], c: \"\\u2A7C\" },\n    \"gtrapprox;\": { p: [10886], c: \"\\u2A86\" },\n    \"gtrarr;\": { p: [10616], c: \"\\u2978\" },\n    \"gtrdot;\": { p: [8919], c: \"\\u22D7\" },\n    \"gtreqless;\": { p: [8923], c: \"\\u22DB\" },\n    \"gtreqqless;\": { p: [10892], c: \"\\u2A8C\" },\n    \"gtrless;\": { p: [8823], c: \"\\u2277\" },\n    \"gtrsim;\": { p: [8819], c: \"\\u2273\" },\n    \"gvertneqq;\": {\n        p: [8809, 65024],\n        c: \"\\u2269\\uFE00\",\n    },\n    \"gvnE;\": { p: [8809, 65024], c: \"\\u2269\\uFE00\" },\n    \"hArr;\": { p: [8660], c: \"\\u21D4\" },\n    \"hairsp;\": { p: [8202], c: \"\\u200A\" },\n    \"half;\": { p: [189], c: \"\\u00BD\" },\n    \"hamilt;\": { p: [8459], c: \"\\u210B\" },\n    \"hardcy;\": { p: [1098], c: \"\\u044A\" },\n    \"harr;\": { p: [8596], c: \"\\u2194\" },\n    \"harrcir;\": { p: [10568], c: \"\\u2948\" },\n    \"harrw;\": { p: [8621], c: \"\\u21AD\" },\n    \"hbar;\": { p: [8463], c: \"\\u210F\" },\n    \"hcirc;\": { p: [293], c: \"\\u0125\" },\n    \"hearts;\": { p: [9829], c: \"\\u2665\" },\n    \"heartsuit;\": { p: [9829], c: \"\\u2665\" },\n    \"hellip;\": { p: [8230], c: \"\\u2026\" },\n    \"hercon;\": { p: [8889], c: \"\\u22B9\" },\n    \"hfr;\": { p: [120101], c: \"\\uD835\\uDD25\" },\n    \"hksearow;\": { p: [10533], c: \"\\u2925\" },\n    \"hkswarow;\": { p: [10534], c: \"\\u2926\" },\n    \"hoarr;\": { p: [8703], c: \"\\u21FF\" },\n    \"homtht;\": { p: [8763], c: \"\\u223B\" },\n    \"hookleftarrow;\": { p: [8617], c: \"\\u21A9\" },\n    \"hookrightarrow;\": { p: [8618], c: \"\\u21AA\" },\n    \"hopf;\": { p: [120153], c: \"\\uD835\\uDD59\" },\n    \"horbar;\": { p: [8213], c: \"\\u2015\" },\n    \"hscr;\": { p: [119997], c: \"\\uD835\\uDCBD\" },\n    \"hslash;\": { p: [8463], c: \"\\u210F\" },\n    \"hstrok;\": { p: [295], c: \"\\u0127\" },\n    \"hybull;\": { p: [8259], c: \"\\u2043\" },\n    \"hyphen;\": { p: [8208], c: \"\\u2010\" },\n    iacute: { p: [237], c: \"\\u00ED\" },\n    \"iacute;\": { p: [237], c: \"\\u00ED\" },\n    \"ic;\": { p: [8291], c: \"\\u2063\" },\n    icirc: { p: [238], c: \"\\u00EE\" },\n    \"icirc;\": { p: [238], c: \"\\u00EE\" },\n    \"icy;\": { p: [1080], c: \"\\u0438\" },\n    \"iecy;\": { p: [1077], c: \"\\u0435\" },\n    iexcl: { p: [161], c: \"\\u00A1\" },\n    \"iexcl;\": { p: [161], c: \"\\u00A1\" },\n    \"iff;\": { p: [8660], c: \"\\u21D4\" },\n    \"ifr;\": { p: [120102], c: \"\\uD835\\uDD26\" },\n    igrave: { p: [236], c: \"\\u00EC\" },\n    \"igrave;\": { p: [236], c: \"\\u00EC\" },\n    \"ii;\": { p: [8520], c: \"\\u2148\" },\n    \"iiiint;\": { p: [10764], c: \"\\u2A0C\" },\n    \"iiint;\": { p: [8749], c: \"\\u222D\" },\n    \"iinfin;\": { p: [10716], c: \"\\u29DC\" },\n    \"iiota;\": { p: [8489], c: \"\\u2129\" },\n    \"ijlig;\": { p: [307], c: \"\\u0133\" },\n    \"imacr;\": { p: [299], c: \"\\u012B\" },\n    \"image;\": { p: [8465], c: \"\\u2111\" },\n    \"imagline;\": { p: [8464], c: \"\\u2110\" },\n    \"imagpart;\": { p: [8465], c: \"\\u2111\" },\n    \"imath;\": { p: [305], c: \"\\u0131\" },\n    \"imof;\": { p: [8887], c: \"\\u22B7\" },\n    \"imped;\": { p: [437], c: \"\\u01B5\" },\n    \"in;\": { p: [8712], c: \"\\u2208\" },\n    \"incare;\": { p: [8453], c: \"\\u2105\" },\n    \"infin;\": { p: [8734], c: \"\\u221E\" },\n    \"infintie;\": { p: [10717], c: \"\\u29DD\" },\n    \"inodot;\": { p: [305], c: \"\\u0131\" },\n    \"int;\": { p: [8747], c: \"\\u222B\" },\n    \"intcal;\": { p: [8890], c: \"\\u22BA\" },\n    \"integers;\": { p: [8484], c: \"\\u2124\" },\n    \"intercal;\": { p: [8890], c: \"\\u22BA\" },\n    \"intlarhk;\": { p: [10775], c: \"\\u2A17\" },\n    \"intprod;\": { p: [10812], c: \"\\u2A3C\" },\n    \"iocy;\": { p: [1105], c: \"\\u0451\" },\n    \"iogon;\": { p: [303], c: \"\\u012F\" },\n    \"iopf;\": { p: [120154], c: \"\\uD835\\uDD5A\" },\n    \"iota;\": { p: [953], c: \"\\u03B9\" },\n    \"iprod;\": { p: [10812], c: \"\\u2A3C\" },\n    iquest: { p: [191], c: \"\\u00BF\" },\n    \"iquest;\": { p: [191], c: \"\\u00BF\" },\n    \"iscr;\": { p: [119998], c: \"\\uD835\\uDCBE\" },\n    \"isin;\": { p: [8712], c: \"\\u2208\" },\n    \"isinE;\": { p: [8953], c: \"\\u22F9\" },\n    \"isindot;\": { p: [8949], c: \"\\u22F5\" },\n    \"isins;\": { p: [8948], c: \"\\u22F4\" },\n    \"isinsv;\": { p: [8947], c: \"\\u22F3\" },\n    \"isinv;\": { p: [8712], c: \"\\u2208\" },\n    \"it;\": { p: [8290], c: \"\\u2062\" },\n    \"itilde;\": { p: [297], c: \"\\u0129\" },\n    \"iukcy;\": { p: [1110], c: \"\\u0456\" },\n    iuml: { p: [239], c: \"\\u00EF\" },\n    \"iuml;\": { p: [239], c: \"\\u00EF\" },\n    \"jcirc;\": { p: [309], c: \"\\u0135\" },\n    \"jcy;\": { p: [1081], c: \"\\u0439\" },\n    \"jfr;\": { p: [120103], c: \"\\uD835\\uDD27\" },\n    \"jmath;\": { p: [567], c: \"\\u0237\" },\n    \"jopf;\": { p: [120155], c: \"\\uD835\\uDD5B\" },\n    \"jscr;\": { p: [119999], c: \"\\uD835\\uDCBF\" },\n    \"jsercy;\": { p: [1112], c: \"\\u0458\" },\n    \"jukcy;\": { p: [1108], c: \"\\u0454\" },\n    \"kappa;\": { p: [954], c: \"\\u03BA\" },\n    \"kappav;\": { p: [1008], c: \"\\u03F0\" },\n    \"kcedil;\": { p: [311], c: \"\\u0137\" },\n    \"kcy;\": { p: [1082], c: \"\\u043A\" },\n    \"kfr;\": { p: [120104], c: \"\\uD835\\uDD28\" },\n    \"kgreen;\": { p: [312], c: \"\\u0138\" },\n    \"khcy;\": { p: [1093], c: \"\\u0445\" },\n    \"kjcy;\": { p: [1116], c: \"\\u045C\" },\n    \"kopf;\": { p: [120156], c: \"\\uD835\\uDD5C\" },\n    \"kscr;\": { p: [120000], c: \"\\uD835\\uDCC0\" },\n    \"lAarr;\": { p: [8666], c: \"\\u21DA\" },\n    \"lArr;\": { p: [8656], c: \"\\u21D0\" },\n    \"lAtail;\": { p: [10523], c: \"\\u291B\" },\n    \"lBarr;\": { p: [10510], c: \"\\u290E\" },\n    \"lE;\": { p: [8806], c: \"\\u2266\" },\n    \"lEg;\": { p: [10891], c: \"\\u2A8B\" },\n    \"lHar;\": { p: [10594], c: \"\\u2962\" },\n    \"lacute;\": { p: [314], c: \"\\u013A\" },\n    \"laemptyv;\": { p: [10676], c: \"\\u29B4\" },\n    \"lagran;\": { p: [8466], c: \"\\u2112\" },\n    \"lambda;\": { p: [955], c: \"\\u03BB\" },\n    \"lang;\": { p: [10216], c: \"\\u27E8\" },\n    \"langd;\": { p: [10641], c: \"\\u2991\" },\n    \"langle;\": { p: [10216], c: \"\\u27E8\" },\n    \"lap;\": { p: [10885], c: \"\\u2A85\" },\n    laquo: { p: [171], c: \"\\u00AB\" },\n    \"laquo;\": { p: [171], c: \"\\u00AB\" },\n    \"larr;\": { p: [8592], c: \"\\u2190\" },\n    \"larrb;\": { p: [8676], c: \"\\u21E4\" },\n    \"larrbfs;\": { p: [10527], c: \"\\u291F\" },\n    \"larrfs;\": { p: [10525], c: \"\\u291D\" },\n    \"larrhk;\": { p: [8617], c: \"\\u21A9\" },\n    \"larrlp;\": { p: [8619], c: \"\\u21AB\" },\n    \"larrpl;\": { p: [10553], c: \"\\u2939\" },\n    \"larrsim;\": { p: [10611], c: \"\\u2973\" },\n    \"larrtl;\": { p: [8610], c: \"\\u21A2\" },\n    \"lat;\": { p: [10923], c: \"\\u2AAB\" },\n    \"latail;\": { p: [10521], c: \"\\u2919\" },\n    \"late;\": { p: [10925], c: \"\\u2AAD\" },\n    \"lates;\": { p: [10925, 65024], c: \"\\u2AAD\\uFE00\" },\n    \"lbarr;\": { p: [10508], c: \"\\u290C\" },\n    \"lbbrk;\": { p: [10098], c: \"\\u2772\" },\n    \"lbrace;\": { p: [123], c: \"\\u007B\" },\n    \"lbrack;\": { p: [91], c: \"\\u005B\" },\n    \"lbrke;\": { p: [10635], c: \"\\u298B\" },\n    \"lbrksld;\": { p: [10639], c: \"\\u298F\" },\n    \"lbrkslu;\": { p: [10637], c: \"\\u298D\" },\n    \"lcaron;\": { p: [318], c: \"\\u013E\" },\n    \"lcedil;\": { p: [316], c: \"\\u013C\" },\n    \"lceil;\": { p: [8968], c: \"\\u2308\" },\n    \"lcub;\": { p: [123], c: \"\\u007B\" },\n    \"lcy;\": { p: [1083], c: \"\\u043B\" },\n    \"ldca;\": { p: [10550], c: \"\\u2936\" },\n    \"ldquo;\": { p: [8220], c: \"\\u201C\" },\n    \"ldquor;\": { p: [8222], c: \"\\u201E\" },\n    \"ldrdhar;\": { p: [10599], c: \"\\u2967\" },\n    \"ldrushar;\": { p: [10571], c: \"\\u294B\" },\n    \"ldsh;\": { p: [8626], c: \"\\u21B2\" },\n    \"le;\": { p: [8804], c: \"\\u2264\" },\n    \"leftarrow;\": { p: [8592], c: \"\\u2190\" },\n    \"leftarrowtail;\": { p: [8610], c: \"\\u21A2\" },\n    \"leftharpoondown;\": { p: [8637], c: \"\\u21BD\" },\n    \"leftharpoonup;\": { p: [8636], c: \"\\u21BC\" },\n    \"leftleftarrows;\": { p: [8647], c: \"\\u21C7\" },\n    \"leftrightarrow;\": { p: [8596], c: \"\\u2194\" },\n    \"leftrightarrows;\": { p: [8646], c: \"\\u21C6\" },\n    \"leftrightharpoons;\": { p: [8651], c: \"\\u21CB\" },\n    \"leftrightsquigarrow;\": { p: [8621], c: \"\\u21AD\" },\n    \"leftthreetimes;\": { p: [8907], c: \"\\u22CB\" },\n    \"leg;\": { p: [8922], c: \"\\u22DA\" },\n    \"leq;\": { p: [8804], c: \"\\u2264\" },\n    \"leqq;\": { p: [8806], c: \"\\u2266\" },\n    \"leqslant;\": { p: [10877], c: \"\\u2A7D\" },\n    \"les;\": { p: [10877], c: \"\\u2A7D\" },\n    \"lescc;\": { p: [10920], c: \"\\u2AA8\" },\n    \"lesdot;\": { p: [10879], c: \"\\u2A7F\" },\n    \"lesdoto;\": { p: [10881], c: \"\\u2A81\" },\n    \"lesdotor;\": { p: [10883], c: \"\\u2A83\" },\n    \"lesg;\": { p: [8922, 65024], c: \"\\u22DA\\uFE00\" },\n    \"lesges;\": { p: [10899], c: \"\\u2A93\" },\n    \"lessapprox;\": { p: [10885], c: \"\\u2A85\" },\n    \"lessdot;\": { p: [8918], c: \"\\u22D6\" },\n    \"lesseqgtr;\": { p: [8922], c: \"\\u22DA\" },\n    \"lesseqqgtr;\": { p: [10891], c: \"\\u2A8B\" },\n    \"lessgtr;\": { p: [8822], c: \"\\u2276\" },\n    \"lesssim;\": { p: [8818], c: \"\\u2272\" },\n    \"lfisht;\": { p: [10620], c: \"\\u297C\" },\n    \"lfloor;\": { p: [8970], c: \"\\u230A\" },\n    \"lfr;\": { p: [120105], c: \"\\uD835\\uDD29\" },\n    \"lg;\": { p: [8822], c: \"\\u2276\" },\n    \"lgE;\": { p: [10897], c: \"\\u2A91\" },\n    \"lhard;\": { p: [8637], c: \"\\u21BD\" },\n    \"lharu;\": { p: [8636], c: \"\\u21BC\" },\n    \"lharul;\": { p: [10602], c: \"\\u296A\" },\n    \"lhblk;\": { p: [9604], c: \"\\u2584\" },\n    \"ljcy;\": { p: [1113], c: \"\\u0459\" },\n    \"ll;\": { p: [8810], c: \"\\u226A\" },\n    \"llarr;\": { p: [8647], c: \"\\u21C7\" },\n    \"llcorner;\": { p: [8990], c: \"\\u231E\" },\n    \"llhard;\": { p: [10603], c: \"\\u296B\" },\n    \"lltri;\": { p: [9722], c: \"\\u25FA\" },\n    \"lmidot;\": { p: [320], c: \"\\u0140\" },\n    \"lmoust;\": { p: [9136], c: \"\\u23B0\" },\n    \"lmoustache;\": { p: [9136], c: \"\\u23B0\" },\n    \"lnE;\": { p: [8808], c: \"\\u2268\" },\n    \"lnap;\": { p: [10889], c: \"\\u2A89\" },\n    \"lnapprox;\": { p: [10889], c: \"\\u2A89\" },\n    \"lne;\": { p: [10887], c: \"\\u2A87\" },\n    \"lneq;\": { p: [10887], c: \"\\u2A87\" },\n    \"lneqq;\": { p: [8808], c: \"\\u2268\" },\n    \"lnsim;\": { p: [8934], c: \"\\u22E6\" },\n    \"loang;\": { p: [10220], c: \"\\u27EC\" },\n    \"loarr;\": { p: [8701], c: \"\\u21FD\" },\n    \"lobrk;\": { p: [10214], c: \"\\u27E6\" },\n    \"longleftarrow;\": { p: [10229], c: \"\\u27F5\" },\n    \"longleftrightarrow;\": { p: [10231], c: \"\\u27F7\" },\n    \"longmapsto;\": { p: [10236], c: \"\\u27FC\" },\n    \"longrightarrow;\": { p: [10230], c: \"\\u27F6\" },\n    \"looparrowleft;\": { p: [8619], c: \"\\u21AB\" },\n    \"looparrowright;\": { p: [8620], c: \"\\u21AC\" },\n    \"lopar;\": { p: [10629], c: \"\\u2985\" },\n    \"lopf;\": { p: [120157], c: \"\\uD835\\uDD5D\" },\n    \"loplus;\": { p: [10797], c: \"\\u2A2D\" },\n    \"lotimes;\": { p: [10804], c: \"\\u2A34\" },\n    \"lowast;\": { p: [8727], c: \"\\u2217\" },\n    \"lowbar;\": { p: [95], c: \"\\u005F\" },\n    \"loz;\": { p: [9674], c: \"\\u25CA\" },\n    \"lozenge;\": { p: [9674], c: \"\\u25CA\" },\n    \"lozf;\": { p: [10731], c: \"\\u29EB\" },\n    \"lpar;\": { p: [40], c: \"\\u0028\" },\n    \"lparlt;\": { p: [10643], c: \"\\u2993\" },\n    \"lrarr;\": { p: [8646], c: \"\\u21C6\" },\n    \"lrcorner;\": { p: [8991], c: \"\\u231F\" },\n    \"lrhar;\": { p: [8651], c: \"\\u21CB\" },\n    \"lrhard;\": { p: [10605], c: \"\\u296D\" },\n    \"lrm;\": { p: [8206], c: \"\\u200E\" },\n    \"lrtri;\": { p: [8895], c: \"\\u22BF\" },\n    \"lsaquo;\": { p: [8249], c: \"\\u2039\" },\n    \"lscr;\": { p: [120001], c: \"\\uD835\\uDCC1\" },\n    \"lsh;\": { p: [8624], c: \"\\u21B0\" },\n    \"lsim;\": { p: [8818], c: \"\\u2272\" },\n    \"lsime;\": { p: [10893], c: \"\\u2A8D\" },\n    \"lsimg;\": { p: [10895], c: \"\\u2A8F\" },\n    \"lsqb;\": { p: [91], c: \"\\u005B\" },\n    \"lsquo;\": { p: [8216], c: \"\\u2018\" },\n    \"lsquor;\": { p: [8218], c: \"\\u201A\" },\n    \"lstrok;\": { p: [322], c: \"\\u0142\" },\n    lt: { p: [60], c: \"\\u003C\" },\n    \"lt;\": { p: [60], c: \"\\u003C\" },\n    \"ltcc;\": { p: [10918], c: \"\\u2AA6\" },\n    \"ltcir;\": { p: [10873], c: \"\\u2A79\" },\n    \"ltdot;\": { p: [8918], c: \"\\u22D6\" },\n    \"lthree;\": { p: [8907], c: \"\\u22CB\" },\n    \"ltimes;\": { p: [8905], c: \"\\u22C9\" },\n    \"ltlarr;\": { p: [10614], c: \"\\u2976\" },\n    \"ltquest;\": { p: [10875], c: \"\\u2A7B\" },\n    \"ltrPar;\": { p: [10646], c: \"\\u2996\" },\n    \"ltri;\": { p: [9667], c: \"\\u25C3\" },\n    \"ltrie;\": { p: [8884], c: \"\\u22B4\" },\n    \"ltrif;\": { p: [9666], c: \"\\u25C2\" },\n    \"lurdshar;\": { p: [10570], c: \"\\u294A\" },\n    \"luruhar;\": { p: [10598], c: \"\\u2966\" },\n    \"lvertneqq;\": {\n        p: [8808, 65024],\n        c: \"\\u2268\\uFE00\",\n    },\n    \"lvnE;\": { p: [8808, 65024], c: \"\\u2268\\uFE00\" },\n    \"mDDot;\": { p: [8762], c: \"\\u223A\" },\n    macr: { p: [175], c: \"\\u00AF\" },\n    \"macr;\": { p: [175], c: \"\\u00AF\" },\n    \"male;\": { p: [9794], c: \"\\u2642\" },\n    \"malt;\": { p: [10016], c: \"\\u2720\" },\n    \"maltese;\": { p: [10016], c: \"\\u2720\" },\n    \"map;\": { p: [8614], c: \"\\u21A6\" },\n    \"mapsto;\": { p: [8614], c: \"\\u21A6\" },\n    \"mapstodown;\": { p: [8615], c: \"\\u21A7\" },\n    \"mapstoleft;\": { p: [8612], c: \"\\u21A4\" },\n    \"mapstoup;\": { p: [8613], c: \"\\u21A5\" },\n    \"marker;\": { p: [9646], c: \"\\u25AE\" },\n    \"mcomma;\": { p: [10793], c: \"\\u2A29\" },\n    \"mcy;\": { p: [1084], c: \"\\u043C\" },\n    \"mdash;\": { p: [8212], c: \"\\u2014\" },\n    \"measuredangle;\": { p: [8737], c: \"\\u2221\" },\n    \"mfr;\": { p: [120106], c: \"\\uD835\\uDD2A\" },\n    \"mho;\": { p: [8487], c: \"\\u2127\" },\n    micro: { p: [181], c: \"\\u00B5\" },\n    \"micro;\": { p: [181], c: \"\\u00B5\" },\n    \"mid;\": { p: [8739], c: \"\\u2223\" },\n    \"midast;\": { p: [42], c: \"\\u002A\" },\n    \"midcir;\": { p: [10992], c: \"\\u2AF0\" },\n    middot: { p: [183], c: \"\\u00B7\" },\n    \"middot;\": { p: [183], c: \"\\u00B7\" },\n    \"minus;\": { p: [8722], c: \"\\u2212\" },\n    \"minusb;\": { p: [8863], c: \"\\u229F\" },\n    \"minusd;\": { p: [8760], c: \"\\u2238\" },\n    \"minusdu;\": { p: [10794], c: \"\\u2A2A\" },\n    \"mlcp;\": { p: [10971], c: \"\\u2ADB\" },\n    \"mldr;\": { p: [8230], c: \"\\u2026\" },\n    \"mnplus;\": { p: [8723], c: \"\\u2213\" },\n    \"models;\": { p: [8871], c: \"\\u22A7\" },\n    \"mopf;\": { p: [120158], c: \"\\uD835\\uDD5E\" },\n    \"mp;\": { p: [8723], c: \"\\u2213\" },\n    \"mscr;\": { p: [120002], c: \"\\uD835\\uDCC2\" },\n    \"mstpos;\": { p: [8766], c: \"\\u223E\" },\n    \"mu;\": { p: [956], c: \"\\u03BC\" },\n    \"multimap;\": { p: [8888], c: \"\\u22B8\" },\n    \"mumap;\": { p: [8888], c: \"\\u22B8\" },\n    \"nGg;\": { p: [8921, 824], c: \"\\u22D9\\u0338\" },\n    \"nGt;\": { p: [8811, 8402], c: \"\\u226B\\u20D2\" },\n    \"nGtv;\": { p: [8811, 824], c: \"\\u226B\\u0338\" },\n    \"nLeftarrow;\": { p: [8653], c: \"\\u21CD\" },\n    \"nLeftrightarrow;\": { p: [8654], c: \"\\u21CE\" },\n    \"nLl;\": { p: [8920, 824], c: \"\\u22D8\\u0338\" },\n    \"nLt;\": { p: [8810, 8402], c: \"\\u226A\\u20D2\" },\n    \"nLtv;\": { p: [8810, 824], c: \"\\u226A\\u0338\" },\n    \"nRightarrow;\": { p: [8655], c: \"\\u21CF\" },\n    \"nVDash;\": { p: [8879], c: \"\\u22AF\" },\n    \"nVdash;\": { p: [8878], c: \"\\u22AE\" },\n    \"nabla;\": { p: [8711], c: \"\\u2207\" },\n    \"nacute;\": { p: [324], c: \"\\u0144\" },\n    \"nang;\": { p: [8736, 8402], c: \"\\u2220\\u20D2\" },\n    \"nap;\": { p: [8777], c: \"\\u2249\" },\n    \"napE;\": { p: [10864, 824], c: \"\\u2A70\\u0338\" },\n    \"napid;\": { p: [8779, 824], c: \"\\u224B\\u0338\" },\n    \"napos;\": { p: [329], c: \"\\u0149\" },\n    \"napprox;\": { p: [8777], c: \"\\u2249\" },\n    \"natur;\": { p: [9838], c: \"\\u266E\" },\n    \"natural;\": { p: [9838], c: \"\\u266E\" },\n    \"naturals;\": { p: [8469], c: \"\\u2115\" },\n    nbsp: { p: [160], c: \"\\u00A0\" },\n    \"nbsp;\": { p: [160], c: \"\\u00A0\" },\n    \"nbump;\": { p: [8782, 824], c: \"\\u224E\\u0338\" },\n    \"nbumpe;\": { p: [8783, 824], c: \"\\u224F\\u0338\" },\n    \"ncap;\": { p: [10819], c: \"\\u2A43\" },\n    \"ncaron;\": { p: [328], c: \"\\u0148\" },\n    \"ncedil;\": { p: [326], c: \"\\u0146\" },\n    \"ncong;\": { p: [8775], c: \"\\u2247\" },\n    \"ncongdot;\": { p: [10861, 824], c: \"\\u2A6D\\u0338\" },\n    \"ncup;\": { p: [10818], c: \"\\u2A42\" },\n    \"ncy;\": { p: [1085], c: \"\\u043D\" },\n    \"ndash;\": { p: [8211], c: \"\\u2013\" },\n    \"ne;\": { p: [8800], c: \"\\u2260\" },\n    \"neArr;\": { p: [8663], c: \"\\u21D7\" },\n    \"nearhk;\": { p: [10532], c: \"\\u2924\" },\n    \"nearr;\": { p: [8599], c: \"\\u2197\" },\n    \"nearrow;\": { p: [8599], c: \"\\u2197\" },\n    \"nedot;\": { p: [8784, 824], c: \"\\u2250\\u0338\" },\n    \"nequiv;\": { p: [8802], c: \"\\u2262\" },\n    \"nesear;\": { p: [10536], c: \"\\u2928\" },\n    \"nesim;\": { p: [8770, 824], c: \"\\u2242\\u0338\" },\n    \"nexist;\": { p: [8708], c: \"\\u2204\" },\n    \"nexists;\": { p: [8708], c: \"\\u2204\" },\n    \"nfr;\": { p: [120107], c: \"\\uD835\\uDD2B\" },\n    \"ngE;\": { p: [8807, 824], c: \"\\u2267\\u0338\" },\n    \"nge;\": { p: [8817], c: \"\\u2271\" },\n    \"ngeq;\": { p: [8817], c: \"\\u2271\" },\n    \"ngeqq;\": { p: [8807, 824], c: \"\\u2267\\u0338\" },\n    \"ngeqslant;\": { p: [10878, 824], c: \"\\u2A7E\\u0338\" },\n    \"nges;\": { p: [10878, 824], c: \"\\u2A7E\\u0338\" },\n    \"ngsim;\": { p: [8821], c: \"\\u2275\" },\n    \"ngt;\": { p: [8815], c: \"\\u226F\" },\n    \"ngtr;\": { p: [8815], c: \"\\u226F\" },\n    \"nhArr;\": { p: [8654], c: \"\\u21CE\" },\n    \"nharr;\": { p: [8622], c: \"\\u21AE\" },\n    \"nhpar;\": { p: [10994], c: \"\\u2AF2\" },\n    \"ni;\": { p: [8715], c: \"\\u220B\" },\n    \"nis;\": { p: [8956], c: \"\\u22FC\" },\n    \"nisd;\": { p: [8954], c: \"\\u22FA\" },\n    \"niv;\": { p: [8715], c: \"\\u220B\" },\n    \"njcy;\": { p: [1114], c: \"\\u045A\" },\n    \"nlArr;\": { p: [8653], c: \"\\u21CD\" },\n    \"nlE;\": { p: [8806, 824], c: \"\\u2266\\u0338\" },\n    \"nlarr;\": { p: [8602], c: \"\\u219A\" },\n    \"nldr;\": { p: [8229], c: \"\\u2025\" },\n    \"nle;\": { p: [8816], c: \"\\u2270\" },\n    \"nleftarrow;\": { p: [8602], c: \"\\u219A\" },\n    \"nleftrightarrow;\": { p: [8622], c: \"\\u21AE\" },\n    \"nleq;\": { p: [8816], c: \"\\u2270\" },\n    \"nleqq;\": { p: [8806, 824], c: \"\\u2266\\u0338\" },\n    \"nleqslant;\": { p: [10877, 824], c: \"\\u2A7D\\u0338\" },\n    \"nles;\": { p: [10877, 824], c: \"\\u2A7D\\u0338\" },\n    \"nless;\": { p: [8814], c: \"\\u226E\" },\n    \"nlsim;\": { p: [8820], c: \"\\u2274\" },\n    \"nlt;\": { p: [8814], c: \"\\u226E\" },\n    \"nltri;\": { p: [8938], c: \"\\u22EA\" },\n    \"nltrie;\": { p: [8940], c: \"\\u22EC\" },\n    \"nmid;\": { p: [8740], c: \"\\u2224\" },\n    \"nopf;\": { p: [120159], c: \"\\uD835\\uDD5F\" },\n    not: { p: [172], c: \"\\u00AC\" },\n    \"not;\": { p: [172], c: \"\\u00AC\" },\n    \"notin;\": { p: [8713], c: \"\\u2209\" },\n    \"notinE;\": { p: [8953, 824], c: \"\\u22F9\\u0338\" },\n    \"notindot;\": { p: [8949, 824], c: \"\\u22F5\\u0338\" },\n    \"notinva;\": { p: [8713], c: \"\\u2209\" },\n    \"notinvb;\": { p: [8951], c: \"\\u22F7\" },\n    \"notinvc;\": { p: [8950], c: \"\\u22F6\" },\n    \"notni;\": { p: [8716], c: \"\\u220C\" },\n    \"notniva;\": { p: [8716], c: \"\\u220C\" },\n    \"notnivb;\": { p: [8958], c: \"\\u22FE\" },\n    \"notnivc;\": { p: [8957], c: \"\\u22FD\" },\n    \"npar;\": { p: [8742], c: \"\\u2226\" },\n    \"nparallel;\": { p: [8742], c: \"\\u2226\" },\n    \"nparsl;\": { p: [11005, 8421], c: \"\\u2AFD\\u20E5\" },\n    \"npart;\": { p: [8706, 824], c: \"\\u2202\\u0338\" },\n    \"npolint;\": { p: [10772], c: \"\\u2A14\" },\n    \"npr;\": { p: [8832], c: \"\\u2280\" },\n    \"nprcue;\": { p: [8928], c: \"\\u22E0\" },\n    \"npre;\": { p: [10927, 824], c: \"\\u2AAF\\u0338\" },\n    \"nprec;\": { p: [8832], c: \"\\u2280\" },\n    \"npreceq;\": { p: [10927, 824], c: \"\\u2AAF\\u0338\" },\n    \"nrArr;\": { p: [8655], c: \"\\u21CF\" },\n    \"nrarr;\": { p: [8603], c: \"\\u219B\" },\n    \"nrarrc;\": { p: [10547, 824], c: \"\\u2933\\u0338\" },\n    \"nrarrw;\": { p: [8605, 824], c: \"\\u219D\\u0338\" },\n    \"nrightarrow;\": { p: [8603], c: \"\\u219B\" },\n    \"nrtri;\": { p: [8939], c: \"\\u22EB\" },\n    \"nrtrie;\": { p: [8941], c: \"\\u22ED\" },\n    \"nsc;\": { p: [8833], c: \"\\u2281\" },\n    \"nsccue;\": { p: [8929], c: \"\\u22E1\" },\n    \"nsce;\": { p: [10928, 824], c: \"\\u2AB0\\u0338\" },\n    \"nscr;\": { p: [120003], c: \"\\uD835\\uDCC3\" },\n    \"nshortmid;\": { p: [8740], c: \"\\u2224\" },\n    \"nshortparallel;\": { p: [8742], c: \"\\u2226\" },\n    \"nsim;\": { p: [8769], c: \"\\u2241\" },\n    \"nsime;\": { p: [8772], c: \"\\u2244\" },\n    \"nsimeq;\": { p: [8772], c: \"\\u2244\" },\n    \"nsmid;\": { p: [8740], c: \"\\u2224\" },\n    \"nspar;\": { p: [8742], c: \"\\u2226\" },\n    \"nsqsube;\": { p: [8930], c: \"\\u22E2\" },\n    \"nsqsupe;\": { p: [8931], c: \"\\u22E3\" },\n    \"nsub;\": { p: [8836], c: \"\\u2284\" },\n    \"nsubE;\": { p: [10949, 824], c: \"\\u2AC5\\u0338\" },\n    \"nsube;\": { p: [8840], c: \"\\u2288\" },\n    \"nsubset;\": { p: [8834, 8402], c: \"\\u2282\\u20D2\" },\n    \"nsubseteq;\": { p: [8840], c: \"\\u2288\" },\n    \"nsubseteqq;\": {\n        p: [10949, 824],\n        c: \"\\u2AC5\\u0338\",\n    },\n    \"nsucc;\": { p: [8833], c: \"\\u2281\" },\n    \"nsucceq;\": { p: [10928, 824], c: \"\\u2AB0\\u0338\" },\n    \"nsup;\": { p: [8837], c: \"\\u2285\" },\n    \"nsupE;\": { p: [10950, 824], c: \"\\u2AC6\\u0338\" },\n    \"nsupe;\": { p: [8841], c: \"\\u2289\" },\n    \"nsupset;\": { p: [8835, 8402], c: \"\\u2283\\u20D2\" },\n    \"nsupseteq;\": { p: [8841], c: \"\\u2289\" },\n    \"nsupseteqq;\": {\n        p: [10950, 824],\n        c: \"\\u2AC6\\u0338\",\n    },\n    \"ntgl;\": { p: [8825], c: \"\\u2279\" },\n    ntilde: { p: [241], c: \"\\u00F1\" },\n    \"ntilde;\": { p: [241], c: \"\\u00F1\" },\n    \"ntlg;\": { p: [8824], c: \"\\u2278\" },\n    \"ntriangleleft;\": { p: [8938], c: \"\\u22EA\" },\n    \"ntrianglelefteq;\": { p: [8940], c: \"\\u22EC\" },\n    \"ntriangleright;\": { p: [8939], c: \"\\u22EB\" },\n    \"ntrianglerighteq;\": { p: [8941], c: \"\\u22ED\" },\n    \"nu;\": { p: [957], c: \"\\u03BD\" },\n    \"num;\": { p: [35], c: \"\\u0023\" },\n    \"numero;\": { p: [8470], c: \"\\u2116\" },\n    \"numsp;\": { p: [8199], c: \"\\u2007\" },\n    \"nvDash;\": { p: [8877], c: \"\\u22AD\" },\n    \"nvHarr;\": { p: [10500], c: \"\\u2904\" },\n    \"nvap;\": { p: [8781, 8402], c: \"\\u224D\\u20D2\" },\n    \"nvdash;\": { p: [8876], c: \"\\u22AC\" },\n    \"nvge;\": { p: [8805, 8402], c: \"\\u2265\\u20D2\" },\n    \"nvgt;\": { p: [62, 8402], c: \"\\u003E\\u20D2\" },\n    \"nvinfin;\": { p: [10718], c: \"\\u29DE\" },\n    \"nvlArr;\": { p: [10498], c: \"\\u2902\" },\n    \"nvle;\": { p: [8804, 8402], c: \"\\u2264\\u20D2\" },\n    \"nvlt;\": { p: [60, 8402], c: \"\\u003C\\u20D2\" },\n    \"nvltrie;\": { p: [8884, 8402], c: \"\\u22B4\\u20D2\" },\n    \"nvrArr;\": { p: [10499], c: \"\\u2903\" },\n    \"nvrtrie;\": { p: [8885, 8402], c: \"\\u22B5\\u20D2\" },\n    \"nvsim;\": { p: [8764, 8402], c: \"\\u223C\\u20D2\" },\n    \"nwArr;\": { p: [8662], c: \"\\u21D6\" },\n    \"nwarhk;\": { p: [10531], c: \"\\u2923\" },\n    \"nwarr;\": { p: [8598], c: \"\\u2196\" },\n    \"nwarrow;\": { p: [8598], c: \"\\u2196\" },\n    \"nwnear;\": { p: [10535], c: \"\\u2927\" },\n    \"oS;\": { p: [9416], c: \"\\u24C8\" },\n    oacute: { p: [243], c: \"\\u00F3\" },\n    \"oacute;\": { p: [243], c: \"\\u00F3\" },\n    \"oast;\": { p: [8859], c: \"\\u229B\" },\n    \"ocir;\": { p: [8858], c: \"\\u229A\" },\n    ocirc: { p: [244], c: \"\\u00F4\" },\n    \"ocirc;\": { p: [244], c: \"\\u00F4\" },\n    \"ocy;\": { p: [1086], c: \"\\u043E\" },\n    \"odash;\": { p: [8861], c: \"\\u229D\" },\n    \"odblac;\": { p: [337], c: \"\\u0151\" },\n    \"odiv;\": { p: [10808], c: \"\\u2A38\" },\n    \"odot;\": { p: [8857], c: \"\\u2299\" },\n    \"odsold;\": { p: [10684], c: \"\\u29BC\" },\n    \"oelig;\": { p: [339], c: \"\\u0153\" },\n    \"ofcir;\": { p: [10687], c: \"\\u29BF\" },\n    \"ofr;\": { p: [120108], c: \"\\uD835\\uDD2C\" },\n    \"ogon;\": { p: [731], c: \"\\u02DB\" },\n    ograve: { p: [242], c: \"\\u00F2\" },\n    \"ograve;\": { p: [242], c: \"\\u00F2\" },\n    \"ogt;\": { p: [10689], c: \"\\u29C1\" },\n    \"ohbar;\": { p: [10677], c: \"\\u29B5\" },\n    \"ohm;\": { p: [937], c: \"\\u03A9\" },\n    \"oint;\": { p: [8750], c: \"\\u222E\" },\n    \"olarr;\": { p: [8634], c: \"\\u21BA\" },\n    \"olcir;\": { p: [10686], c: \"\\u29BE\" },\n    \"olcross;\": { p: [10683], c: \"\\u29BB\" },\n    \"oline;\": { p: [8254], c: \"\\u203E\" },\n    \"olt;\": { p: [10688], c: \"\\u29C0\" },\n    \"omacr;\": { p: [333], c: \"\\u014D\" },\n    \"omega;\": { p: [969], c: \"\\u03C9\" },\n    \"omicron;\": { p: [959], c: \"\\u03BF\" },\n    \"omid;\": { p: [10678], c: \"\\u29B6\" },\n    \"ominus;\": { p: [8854], c: \"\\u2296\" },\n    \"oopf;\": { p: [120160], c: \"\\uD835\\uDD60\" },\n    \"opar;\": { p: [10679], c: \"\\u29B7\" },\n    \"operp;\": { p: [10681], c: \"\\u29B9\" },\n    \"oplus;\": { p: [8853], c: \"\\u2295\" },\n    \"or;\": { p: [8744], c: \"\\u2228\" },\n    \"orarr;\": { p: [8635], c: \"\\u21BB\" },\n    \"ord;\": { p: [10845], c: \"\\u2A5D\" },\n    \"order;\": { p: [8500], c: \"\\u2134\" },\n    \"orderof;\": { p: [8500], c: \"\\u2134\" },\n    ordf: { p: [170], c: \"\\u00AA\" },\n    \"ordf;\": { p: [170], c: \"\\u00AA\" },\n    ordm: { p: [186], c: \"\\u00BA\" },\n    \"ordm;\": { p: [186], c: \"\\u00BA\" },\n    \"origof;\": { p: [8886], c: \"\\u22B6\" },\n    \"oror;\": { p: [10838], c: \"\\u2A56\" },\n    \"orslope;\": { p: [10839], c: \"\\u2A57\" },\n    \"orv;\": { p: [10843], c: \"\\u2A5B\" },\n    \"oscr;\": { p: [8500], c: \"\\u2134\" },\n    oslash: { p: [248], c: \"\\u00F8\" },\n    \"oslash;\": { p: [248], c: \"\\u00F8\" },\n    \"osol;\": { p: [8856], c: \"\\u2298\" },\n    otilde: { p: [245], c: \"\\u00F5\" },\n    \"otilde;\": { p: [245], c: \"\\u00F5\" },\n    \"otimes;\": { p: [8855], c: \"\\u2297\" },\n    \"otimesas;\": { p: [10806], c: \"\\u2A36\" },\n    ouml: { p: [246], c: \"\\u00F6\" },\n    \"ouml;\": { p: [246], c: \"\\u00F6\" },\n    \"ovbar;\": { p: [9021], c: \"\\u233D\" },\n    \"par;\": { p: [8741], c: \"\\u2225\" },\n    para: { p: [182], c: \"\\u00B6\" },\n    \"para;\": { p: [182], c: \"\\u00B6\" },\n    \"parallel;\": { p: [8741], c: \"\\u2225\" },\n    \"parsim;\": { p: [10995], c: \"\\u2AF3\" },\n    \"parsl;\": { p: [11005], c: \"\\u2AFD\" },\n    \"part;\": { p: [8706], c: \"\\u2202\" },\n    \"pcy;\": { p: [1087], c: \"\\u043F\" },\n    \"percnt;\": { p: [37], c: \"\\u0025\" },\n    \"period;\": { p: [46], c: \"\\u002E\" },\n    \"permil;\": { p: [8240], c: \"\\u2030\" },\n    \"perp;\": { p: [8869], c: \"\\u22A5\" },\n    \"pertenk;\": { p: [8241], c: \"\\u2031\" },\n    \"pfr;\": { p: [120109], c: \"\\uD835\\uDD2D\" },\n    \"phi;\": { p: [966], c: \"\\u03C6\" },\n    \"phiv;\": { p: [981], c: \"\\u03D5\" },\n    \"phmmat;\": { p: [8499], c: \"\\u2133\" },\n    \"phone;\": { p: [9742], c: \"\\u260E\" },\n    \"pi;\": { p: [960], c: \"\\u03C0\" },\n    \"pitchfork;\": { p: [8916], c: \"\\u22D4\" },\n    \"piv;\": { p: [982], c: \"\\u03D6\" },\n    \"planck;\": { p: [8463], c: \"\\u210F\" },\n    \"planckh;\": { p: [8462], c: \"\\u210E\" },\n    \"plankv;\": { p: [8463], c: \"\\u210F\" },\n    \"plus;\": { p: [43], c: \"\\u002B\" },\n    \"plusacir;\": { p: [10787], c: \"\\u2A23\" },\n    \"plusb;\": { p: [8862], c: \"\\u229E\" },\n    \"pluscir;\": { p: [10786], c: \"\\u2A22\" },\n    \"plusdo;\": { p: [8724], c: \"\\u2214\" },\n    \"plusdu;\": { p: [10789], c: \"\\u2A25\" },\n    \"pluse;\": { p: [10866], c: \"\\u2A72\" },\n    plusmn: { p: [177], c: \"\\u00B1\" },\n    \"plusmn;\": { p: [177], c: \"\\u00B1\" },\n    \"plussim;\": { p: [10790], c: \"\\u2A26\" },\n    \"plustwo;\": { p: [10791], c: \"\\u2A27\" },\n    \"pm;\": { p: [177], c: \"\\u00B1\" },\n    \"pointint;\": { p: [10773], c: \"\\u2A15\" },\n    \"popf;\": { p: [120161], c: \"\\uD835\\uDD61\" },\n    pound: { p: [163], c: \"\\u00A3\" },\n    \"pound;\": { p: [163], c: \"\\u00A3\" },\n    \"pr;\": { p: [8826], c: \"\\u227A\" },\n    \"prE;\": { p: [10931], c: \"\\u2AB3\" },\n    \"prap;\": { p: [10935], c: \"\\u2AB7\" },\n    \"prcue;\": { p: [8828], c: \"\\u227C\" },\n    \"pre;\": { p: [10927], c: \"\\u2AAF\" },\n    \"prec;\": { p: [8826], c: \"\\u227A\" },\n    \"precapprox;\": { p: [10935], c: \"\\u2AB7\" },\n    \"preccurlyeq;\": { p: [8828], c: \"\\u227C\" },\n    \"preceq;\": { p: [10927], c: \"\\u2AAF\" },\n    \"precnapprox;\": { p: [10937], c: \"\\u2AB9\" },\n    \"precneqq;\": { p: [10933], c: \"\\u2AB5\" },\n    \"precnsim;\": { p: [8936], c: \"\\u22E8\" },\n    \"precsim;\": { p: [8830], c: \"\\u227E\" },\n    \"prime;\": { p: [8242], c: \"\\u2032\" },\n    \"primes;\": { p: [8473], c: \"\\u2119\" },\n    \"prnE;\": { p: [10933], c: \"\\u2AB5\" },\n    \"prnap;\": { p: [10937], c: \"\\u2AB9\" },\n    \"prnsim;\": { p: [8936], c: \"\\u22E8\" },\n    \"prod;\": { p: [8719], c: \"\\u220F\" },\n    \"profalar;\": { p: [9006], c: \"\\u232E\" },\n    \"profline;\": { p: [8978], c: \"\\u2312\" },\n    \"profsurf;\": { p: [8979], c: \"\\u2313\" },\n    \"prop;\": { p: [8733], c: \"\\u221D\" },\n    \"propto;\": { p: [8733], c: \"\\u221D\" },\n    \"prsim;\": { p: [8830], c: \"\\u227E\" },\n    \"prurel;\": { p: [8880], c: \"\\u22B0\" },\n    \"pscr;\": { p: [120005], c: \"\\uD835\\uDCC5\" },\n    \"psi;\": { p: [968], c: \"\\u03C8\" },\n    \"puncsp;\": { p: [8200], c: \"\\u2008\" },\n    \"qfr;\": { p: [120110], c: \"\\uD835\\uDD2E\" },\n    \"qint;\": { p: [10764], c: \"\\u2A0C\" },\n    \"qopf;\": { p: [120162], c: \"\\uD835\\uDD62\" },\n    \"qprime;\": { p: [8279], c: \"\\u2057\" },\n    \"qscr;\": { p: [120006], c: \"\\uD835\\uDCC6\" },\n    \"quaternions;\": { p: [8461], c: \"\\u210D\" },\n    \"quatint;\": { p: [10774], c: \"\\u2A16\" },\n    \"quest;\": { p: [63], c: \"\\u003F\" },\n    \"questeq;\": { p: [8799], c: \"\\u225F\" },\n    quot: { p: [34], c: \"\\u0022\" },\n    \"quot;\": { p: [34], c: \"\\u0022\" },\n    \"rAarr;\": { p: [8667], c: \"\\u21DB\" },\n    \"rArr;\": { p: [8658], c: \"\\u21D2\" },\n    \"rAtail;\": { p: [10524], c: \"\\u291C\" },\n    \"rBarr;\": { p: [10511], c: \"\\u290F\" },\n    \"rHar;\": { p: [10596], c: \"\\u2964\" },\n    \"race;\": { p: [8765, 817], c: \"\\u223D\\u0331\" },\n    \"racute;\": { p: [341], c: \"\\u0155\" },\n    \"radic;\": { p: [8730], c: \"\\u221A\" },\n    \"raemptyv;\": { p: [10675], c: \"\\u29B3\" },\n    \"rang;\": { p: [10217], c: \"\\u27E9\" },\n    \"rangd;\": { p: [10642], c: \"\\u2992\" },\n    \"range;\": { p: [10661], c: \"\\u29A5\" },\n    \"rangle;\": { p: [10217], c: \"\\u27E9\" },\n    raquo: { p: [187], c: \"\\u00BB\" },\n    \"raquo;\": { p: [187], c: \"\\u00BB\" },\n    \"rarr;\": { p: [8594], c: \"\\u2192\" },\n    \"rarrap;\": { p: [10613], c: \"\\u2975\" },\n    \"rarrb;\": { p: [8677], c: \"\\u21E5\" },\n    \"rarrbfs;\": { p: [10528], c: \"\\u2920\" },\n    \"rarrc;\": { p: [10547], c: \"\\u2933\" },\n    \"rarrfs;\": { p: [10526], c: \"\\u291E\" },\n    \"rarrhk;\": { p: [8618], c: \"\\u21AA\" },\n    \"rarrlp;\": { p: [8620], c: \"\\u21AC\" },\n    \"rarrpl;\": { p: [10565], c: \"\\u2945\" },\n    \"rarrsim;\": { p: [10612], c: \"\\u2974\" },\n    \"rarrtl;\": { p: [8611], c: \"\\u21A3\" },\n    \"rarrw;\": { p: [8605], c: \"\\u219D\" },\n    \"ratail;\": { p: [10522], c: \"\\u291A\" },\n    \"ratio;\": { p: [8758], c: \"\\u2236\" },\n    \"rationals;\": { p: [8474], c: \"\\u211A\" },\n    \"rbarr;\": { p: [10509], c: \"\\u290D\" },\n    \"rbbrk;\": { p: [10099], c: \"\\u2773\" },\n    \"rbrace;\": { p: [125], c: \"\\u007D\" },\n    \"rbrack;\": { p: [93], c: \"\\u005D\" },\n    \"rbrke;\": { p: [10636], c: \"\\u298C\" },\n    \"rbrksld;\": { p: [10638], c: \"\\u298E\" },\n    \"rbrkslu;\": { p: [10640], c: \"\\u2990\" },\n    \"rcaron;\": { p: [345], c: \"\\u0159\" },\n    \"rcedil;\": { p: [343], c: \"\\u0157\" },\n    \"rceil;\": { p: [8969], c: \"\\u2309\" },\n    \"rcub;\": { p: [125], c: \"\\u007D\" },\n    \"rcy;\": { p: [1088], c: \"\\u0440\" },\n    \"rdca;\": { p: [10551], c: \"\\u2937\" },\n    \"rdldhar;\": { p: [10601], c: \"\\u2969\" },\n    \"rdquo;\": { p: [8221], c: \"\\u201D\" },\n    \"rdquor;\": { p: [8221], c: \"\\u201D\" },\n    \"rdsh;\": { p: [8627], c: \"\\u21B3\" },\n    \"real;\": { p: [8476], c: \"\\u211C\" },\n    \"realine;\": { p: [8475], c: \"\\u211B\" },\n    \"realpart;\": { p: [8476], c: \"\\u211C\" },\n    \"reals;\": { p: [8477], c: \"\\u211D\" },\n    \"rect;\": { p: [9645], c: \"\\u25AD\" },\n    reg: { p: [174], c: \"\\u00AE\" },\n    \"reg;\": { p: [174], c: \"\\u00AE\" },\n    \"rfisht;\": { p: [10621], c: \"\\u297D\" },\n    \"rfloor;\": { p: [8971], c: \"\\u230B\" },\n    \"rfr;\": { p: [120111], c: \"\\uD835\\uDD2F\" },\n    \"rhard;\": { p: [8641], c: \"\\u21C1\" },\n    \"rharu;\": { p: [8640], c: \"\\u21C0\" },\n    \"rharul;\": { p: [10604], c: \"\\u296C\" },\n    \"rho;\": { p: [961], c: \"\\u03C1\" },\n    \"rhov;\": { p: [1009], c: \"\\u03F1\" },\n    \"rightarrow;\": { p: [8594], c: \"\\u2192\" },\n    \"rightarrowtail;\": { p: [8611], c: \"\\u21A3\" },\n    \"rightharpoondown;\": { p: [8641], c: \"\\u21C1\" },\n    \"rightharpoonup;\": { p: [8640], c: \"\\u21C0\" },\n    \"rightleftarrows;\": { p: [8644], c: \"\\u21C4\" },\n    \"rightleftharpoons;\": { p: [8652], c: \"\\u21CC\" },\n    \"rightrightarrows;\": { p: [8649], c: \"\\u21C9\" },\n    \"rightsquigarrow;\": { p: [8605], c: \"\\u219D\" },\n    \"rightthreetimes;\": { p: [8908], c: \"\\u22CC\" },\n    \"ring;\": { p: [730], c: \"\\u02DA\" },\n    \"risingdotseq;\": { p: [8787], c: \"\\u2253\" },\n    \"rlarr;\": { p: [8644], c: \"\\u21C4\" },\n    \"rlhar;\": { p: [8652], c: \"\\u21CC\" },\n    \"rlm;\": { p: [8207], c: \"\\u200F\" },\n    \"rmoust;\": { p: [9137], c: \"\\u23B1\" },\n    \"rmoustache;\": { p: [9137], c: \"\\u23B1\" },\n    \"rnmid;\": { p: [10990], c: \"\\u2AEE\" },\n    \"roang;\": { p: [10221], c: \"\\u27ED\" },\n    \"roarr;\": { p: [8702], c: \"\\u21FE\" },\n    \"robrk;\": { p: [10215], c: \"\\u27E7\" },\n    \"ropar;\": { p: [10630], c: \"\\u2986\" },\n    \"ropf;\": { p: [120163], c: \"\\uD835\\uDD63\" },\n    \"roplus;\": { p: [10798], c: \"\\u2A2E\" },\n    \"rotimes;\": { p: [10805], c: \"\\u2A35\" },\n    \"rpar;\": { p: [41], c: \"\\u0029\" },\n    \"rpargt;\": { p: [10644], c: \"\\u2994\" },\n    \"rppolint;\": { p: [10770], c: \"\\u2A12\" },\n    \"rrarr;\": { p: [8649], c: \"\\u21C9\" },\n    \"rsaquo;\": { p: [8250], c: \"\\u203A\" },\n    \"rscr;\": { p: [120007], c: \"\\uD835\\uDCC7\" },\n    \"rsh;\": { p: [8625], c: \"\\u21B1\" },\n    \"rsqb;\": { p: [93], c: \"\\u005D\" },\n    \"rsquo;\": { p: [8217], c: \"\\u2019\" },\n    \"rsquor;\": { p: [8217], c: \"\\u2019\" },\n    \"rthree;\": { p: [8908], c: \"\\u22CC\" },\n    \"rtimes;\": { p: [8906], c: \"\\u22CA\" },\n    \"rtri;\": { p: [9657], c: \"\\u25B9\" },\n    \"rtrie;\": { p: [8885], c: \"\\u22B5\" },\n    \"rtrif;\": { p: [9656], c: \"\\u25B8\" },\n    \"rtriltri;\": { p: [10702], c: \"\\u29CE\" },\n    \"ruluhar;\": { p: [10600], c: \"\\u2968\" },\n    \"rx;\": { p: [8478], c: \"\\u211E\" },\n    \"sacute;\": { p: [347], c: \"\\u015B\" },\n    \"sbquo;\": { p: [8218], c: \"\\u201A\" },\n    \"sc;\": { p: [8827], c: \"\\u227B\" },\n    \"scE;\": { p: [10932], c: \"\\u2AB4\" },\n    \"scap;\": { p: [10936], c: \"\\u2AB8\" },\n    \"scaron;\": { p: [353], c: \"\\u0161\" },\n    \"sccue;\": { p: [8829], c: \"\\u227D\" },\n    \"sce;\": { p: [10928], c: \"\\u2AB0\" },\n    \"scedil;\": { p: [351], c: \"\\u015F\" },\n    \"scirc;\": { p: [349], c: \"\\u015D\" },\n    \"scnE;\": { p: [10934], c: \"\\u2AB6\" },\n    \"scnap;\": { p: [10938], c: \"\\u2ABA\" },\n    \"scnsim;\": { p: [8937], c: \"\\u22E9\" },\n    \"scpolint;\": { p: [10771], c: \"\\u2A13\" },\n    \"scsim;\": { p: [8831], c: \"\\u227F\" },\n    \"scy;\": { p: [1089], c: \"\\u0441\" },\n    \"sdot;\": { p: [8901], c: \"\\u22C5\" },\n    \"sdotb;\": { p: [8865], c: \"\\u22A1\" },\n    \"sdote;\": { p: [10854], c: \"\\u2A66\" },\n    \"seArr;\": { p: [8664], c: \"\\u21D8\" },\n    \"searhk;\": { p: [10533], c: \"\\u2925\" },\n    \"searr;\": { p: [8600], c: \"\\u2198\" },\n    \"searrow;\": { p: [8600], c: \"\\u2198\" },\n    sect: { p: [167], c: \"\\u00A7\" },\n    \"sect;\": { p: [167], c: \"\\u00A7\" },\n    \"semi;\": { p: [59], c: \"\\u003B\" },\n    \"seswar;\": { p: [10537], c: \"\\u2929\" },\n    \"setminus;\": { p: [8726], c: \"\\u2216\" },\n    \"setmn;\": { p: [8726], c: \"\\u2216\" },\n    \"sext;\": { p: [10038], c: \"\\u2736\" },\n    \"sfr;\": { p: [120112], c: \"\\uD835\\uDD30\" },\n    \"sfrown;\": { p: [8994], c: \"\\u2322\" },\n    \"sharp;\": { p: [9839], c: \"\\u266F\" },\n    \"shchcy;\": { p: [1097], c: \"\\u0449\" },\n    \"shcy;\": { p: [1096], c: \"\\u0448\" },\n    \"shortmid;\": { p: [8739], c: \"\\u2223\" },\n    \"shortparallel;\": { p: [8741], c: \"\\u2225\" },\n    shy: { p: [173], c: \"\\u00AD\" },\n    \"shy;\": { p: [173], c: \"\\u00AD\" },\n    \"sigma;\": { p: [963], c: \"\\u03C3\" },\n    \"sigmaf;\": { p: [962], c: \"\\u03C2\" },\n    \"sigmav;\": { p: [962], c: \"\\u03C2\" },\n    \"sim;\": { p: [8764], c: \"\\u223C\" },\n    \"simdot;\": { p: [10858], c: \"\\u2A6A\" },\n    \"sime;\": { p: [8771], c: \"\\u2243\" },\n    \"simeq;\": { p: [8771], c: \"\\u2243\" },\n    \"simg;\": { p: [10910], c: \"\\u2A9E\" },\n    \"simgE;\": { p: [10912], c: \"\\u2AA0\" },\n    \"siml;\": { p: [10909], c: \"\\u2A9D\" },\n    \"simlE;\": { p: [10911], c: \"\\u2A9F\" },\n    \"simne;\": { p: [8774], c: \"\\u2246\" },\n    \"simplus;\": { p: [10788], c: \"\\u2A24\" },\n    \"simrarr;\": { p: [10610], c: \"\\u2972\" },\n    \"slarr;\": { p: [8592], c: \"\\u2190\" },\n    \"smallsetminus;\": { p: [8726], c: \"\\u2216\" },\n    \"smashp;\": { p: [10803], c: \"\\u2A33\" },\n    \"smeparsl;\": { p: [10724], c: \"\\u29E4\" },\n    \"smid;\": { p: [8739], c: \"\\u2223\" },\n    \"smile;\": { p: [8995], c: \"\\u2323\" },\n    \"smt;\": { p: [10922], c: \"\\u2AAA\" },\n    \"smte;\": { p: [10924], c: \"\\u2AAC\" },\n    \"smtes;\": { p: [10924, 65024], c: \"\\u2AAC\\uFE00\" },\n    \"softcy;\": { p: [1100], c: \"\\u044C\" },\n    \"sol;\": { p: [47], c: \"\\u002F\" },\n    \"solb;\": { p: [10692], c: \"\\u29C4\" },\n    \"solbar;\": { p: [9023], c: \"\\u233F\" },\n    \"sopf;\": { p: [120164], c: \"\\uD835\\uDD64\" },\n    \"spades;\": { p: [9824], c: \"\\u2660\" },\n    \"spadesuit;\": { p: [9824], c: \"\\u2660\" },\n    \"spar;\": { p: [8741], c: \"\\u2225\" },\n    \"sqcap;\": { p: [8851], c: \"\\u2293\" },\n    \"sqcaps;\": { p: [8851, 65024], c: \"\\u2293\\uFE00\" },\n    \"sqcup;\": { p: [8852], c: \"\\u2294\" },\n    \"sqcups;\": { p: [8852, 65024], c: \"\\u2294\\uFE00\" },\n    \"sqsub;\": { p: [8847], c: \"\\u228F\" },\n    \"sqsube;\": { p: [8849], c: \"\\u2291\" },\n    \"sqsubset;\": { p: [8847], c: \"\\u228F\" },\n    \"sqsubseteq;\": { p: [8849], c: \"\\u2291\" },\n    \"sqsup;\": { p: [8848], c: \"\\u2290\" },\n    \"sqsupe;\": { p: [8850], c: \"\\u2292\" },\n    \"sqsupset;\": { p: [8848], c: \"\\u2290\" },\n    \"sqsupseteq;\": { p: [8850], c: \"\\u2292\" },\n    \"squ;\": { p: [9633], c: \"\\u25A1\" },\n    \"square;\": { p: [9633], c: \"\\u25A1\" },\n    \"squarf;\": { p: [9642], c: \"\\u25AA\" },\n    \"squf;\": { p: [9642], c: \"\\u25AA\" },\n    \"srarr;\": { p: [8594], c: \"\\u2192\" },\n    \"sscr;\": { p: [120008], c: \"\\uD835\\uDCC8\" },\n    \"ssetmn;\": { p: [8726], c: \"\\u2216\" },\n    \"ssmile;\": { p: [8995], c: \"\\u2323\" },\n    \"sstarf;\": { p: [8902], c: \"\\u22C6\" },\n    \"star;\": { p: [9734], c: \"\\u2606\" },\n    \"starf;\": { p: [9733], c: \"\\u2605\" },\n    \"straightepsilon;\": { p: [1013], c: \"\\u03F5\" },\n    \"straightphi;\": { p: [981], c: \"\\u03D5\" },\n    \"strns;\": { p: [175], c: \"\\u00AF\" },\n    \"sub;\": { p: [8834], c: \"\\u2282\" },\n    \"subE;\": { p: [10949], c: \"\\u2AC5\" },\n    \"subdot;\": { p: [10941], c: \"\\u2ABD\" },\n    \"sube;\": { p: [8838], c: \"\\u2286\" },\n    \"subedot;\": { p: [10947], c: \"\\u2AC3\" },\n    \"submult;\": { p: [10945], c: \"\\u2AC1\" },\n    \"subnE;\": { p: [10955], c: \"\\u2ACB\" },\n    \"subne;\": { p: [8842], c: \"\\u228A\" },\n    \"subplus;\": { p: [10943], c: \"\\u2ABF\" },\n    \"subrarr;\": { p: [10617], c: \"\\u2979\" },\n    \"subset;\": { p: [8834], c: \"\\u2282\" },\n    \"subseteq;\": { p: [8838], c: \"\\u2286\" },\n    \"subseteqq;\": { p: [10949], c: \"\\u2AC5\" },\n    \"subsetneq;\": { p: [8842], c: \"\\u228A\" },\n    \"subsetneqq;\": { p: [10955], c: \"\\u2ACB\" },\n    \"subsim;\": { p: [10951], c: \"\\u2AC7\" },\n    \"subsub;\": { p: [10965], c: \"\\u2AD5\" },\n    \"subsup;\": { p: [10963], c: \"\\u2AD3\" },\n    \"succ;\": { p: [8827], c: \"\\u227B\" },\n    \"succapprox;\": { p: [10936], c: \"\\u2AB8\" },\n    \"succcurlyeq;\": { p: [8829], c: \"\\u227D\" },\n    \"succeq;\": { p: [10928], c: \"\\u2AB0\" },\n    \"succnapprox;\": { p: [10938], c: \"\\u2ABA\" },\n    \"succneqq;\": { p: [10934], c: \"\\u2AB6\" },\n    \"succnsim;\": { p: [8937], c: \"\\u22E9\" },\n    \"succsim;\": { p: [8831], c: \"\\u227F\" },\n    \"sum;\": { p: [8721], c: \"\\u2211\" },\n    \"sung;\": { p: [9834], c: \"\\u266A\" },\n    sup1: { p: [185], c: \"\\u00B9\" },\n    \"sup1;\": { p: [185], c: \"\\u00B9\" },\n    sup2: { p: [178], c: \"\\u00B2\" },\n    \"sup2;\": { p: [178], c: \"\\u00B2\" },\n    sup3: { p: [179], c: \"\\u00B3\" },\n    \"sup3;\": { p: [179], c: \"\\u00B3\" },\n    \"sup;\": { p: [8835], c: \"\\u2283\" },\n    \"supE;\": { p: [10950], c: \"\\u2AC6\" },\n    \"supdot;\": { p: [10942], c: \"\\u2ABE\" },\n    \"supdsub;\": { p: [10968], c: \"\\u2AD8\" },\n    \"supe;\": { p: [8839], c: \"\\u2287\" },\n    \"supedot;\": { p: [10948], c: \"\\u2AC4\" },\n    \"suphsol;\": { p: [10185], c: \"\\u27C9\" },\n    \"suphsub;\": { p: [10967], c: \"\\u2AD7\" },\n    \"suplarr;\": { p: [10619], c: \"\\u297B\" },\n    \"supmult;\": { p: [10946], c: \"\\u2AC2\" },\n    \"supnE;\": { p: [10956], c: \"\\u2ACC\" },\n    \"supne;\": { p: [8843], c: \"\\u228B\" },\n    \"supplus;\": { p: [10944], c: \"\\u2AC0\" },\n    \"supset;\": { p: [8835], c: \"\\u2283\" },\n    \"supseteq;\": { p: [8839], c: \"\\u2287\" },\n    \"supseteqq;\": { p: [10950], c: \"\\u2AC6\" },\n    \"supsetneq;\": { p: [8843], c: \"\\u228B\" },\n    \"supsetneqq;\": { p: [10956], c: \"\\u2ACC\" },\n    \"supsim;\": { p: [10952], c: \"\\u2AC8\" },\n    \"supsub;\": { p: [10964], c: \"\\u2AD4\" },\n    \"supsup;\": { p: [10966], c: \"\\u2AD6\" },\n    \"swArr;\": { p: [8665], c: \"\\u21D9\" },\n    \"swarhk;\": { p: [10534], c: \"\\u2926\" },\n    \"swarr;\": { p: [8601], c: \"\\u2199\" },\n    \"swarrow;\": { p: [8601], c: \"\\u2199\" },\n    \"swnwar;\": { p: [10538], c: \"\\u292A\" },\n    szlig: { p: [223], c: \"\\u00DF\" },\n    \"szlig;\": { p: [223], c: \"\\u00DF\" },\n    \"target;\": { p: [8982], c: \"\\u2316\" },\n    \"tau;\": { p: [964], c: \"\\u03C4\" },\n    \"tbrk;\": { p: [9140], c: \"\\u23B4\" },\n    \"tcaron;\": { p: [357], c: \"\\u0165\" },\n    \"tcedil;\": { p: [355], c: \"\\u0163\" },\n    \"tcy;\": { p: [1090], c: \"\\u0442\" },\n    \"tdot;\": { p: [8411], c: \"\\u20DB\" },\n    \"telrec;\": { p: [8981], c: \"\\u2315\" },\n    \"tfr;\": { p: [120113], c: \"\\uD835\\uDD31\" },\n    \"there4;\": { p: [8756], c: \"\\u2234\" },\n    \"therefore;\": { p: [8756], c: \"\\u2234\" },\n    \"theta;\": { p: [952], c: \"\\u03B8\" },\n    \"thetasym;\": { p: [977], c: \"\\u03D1\" },\n    \"thetav;\": { p: [977], c: \"\\u03D1\" },\n    \"thickapprox;\": { p: [8776], c: \"\\u2248\" },\n    \"thicksim;\": { p: [8764], c: \"\\u223C\" },\n    \"thinsp;\": { p: [8201], c: \"\\u2009\" },\n    \"thkap;\": { p: [8776], c: \"\\u2248\" },\n    \"thksim;\": { p: [8764], c: \"\\u223C\" },\n    thorn: { p: [254], c: \"\\u00FE\" },\n    \"thorn;\": { p: [254], c: \"\\u00FE\" },\n    \"tilde;\": { p: [732], c: \"\\u02DC\" },\n    times: { p: [215], c: \"\\u00D7\" },\n    \"times;\": { p: [215], c: \"\\u00D7\" },\n    \"timesb;\": { p: [8864], c: \"\\u22A0\" },\n    \"timesbar;\": { p: [10801], c: \"\\u2A31\" },\n    \"timesd;\": { p: [10800], c: \"\\u2A30\" },\n    \"tint;\": { p: [8749], c: \"\\u222D\" },\n    \"toea;\": { p: [10536], c: \"\\u2928\" },\n    \"top;\": { p: [8868], c: \"\\u22A4\" },\n    \"topbot;\": { p: [9014], c: \"\\u2336\" },\n    \"topcir;\": { p: [10993], c: \"\\u2AF1\" },\n    \"topf;\": { p: [120165], c: \"\\uD835\\uDD65\" },\n    \"topfork;\": { p: [10970], c: \"\\u2ADA\" },\n    \"tosa;\": { p: [10537], c: \"\\u2929\" },\n    \"tprime;\": { p: [8244], c: \"\\u2034\" },\n    \"trade;\": { p: [8482], c: \"\\u2122\" },\n    \"triangle;\": { p: [9653], c: \"\\u25B5\" },\n    \"triangledown;\": { p: [9663], c: \"\\u25BF\" },\n    \"triangleleft;\": { p: [9667], c: \"\\u25C3\" },\n    \"trianglelefteq;\": { p: [8884], c: \"\\u22B4\" },\n    \"triangleq;\": { p: [8796], c: \"\\u225C\" },\n    \"triangleright;\": { p: [9657], c: \"\\u25B9\" },\n    \"trianglerighteq;\": { p: [8885], c: \"\\u22B5\" },\n    \"tridot;\": { p: [9708], c: \"\\u25EC\" },\n    \"trie;\": { p: [8796], c: \"\\u225C\" },\n    \"triminus;\": { p: [10810], c: \"\\u2A3A\" },\n    \"triplus;\": { p: [10809], c: \"\\u2A39\" },\n    \"trisb;\": { p: [10701], c: \"\\u29CD\" },\n    \"tritime;\": { p: [10811], c: \"\\u2A3B\" },\n    \"trpezium;\": { p: [9186], c: \"\\u23E2\" },\n    \"tscr;\": { p: [120009], c: \"\\uD835\\uDCC9\" },\n    \"tscy;\": { p: [1094], c: \"\\u0446\" },\n    \"tshcy;\": { p: [1115], c: \"\\u045B\" },\n    \"tstrok;\": { p: [359], c: \"\\u0167\" },\n    \"twixt;\": { p: [8812], c: \"\\u226C\" },\n    \"twoheadleftarrow;\": { p: [8606], c: \"\\u219E\" },\n    \"twoheadrightarrow;\": { p: [8608], c: \"\\u21A0\" },\n    \"uArr;\": { p: [8657], c: \"\\u21D1\" },\n    \"uHar;\": { p: [10595], c: \"\\u2963\" },\n    uacute: { p: [250], c: \"\\u00FA\" },\n    \"uacute;\": { p: [250], c: \"\\u00FA\" },\n    \"uarr;\": { p: [8593], c: \"\\u2191\" },\n    \"ubrcy;\": { p: [1118], c: \"\\u045E\" },\n    \"ubreve;\": { p: [365], c: \"\\u016D\" },\n    ucirc: { p: [251], c: \"\\u00FB\" },\n    \"ucirc;\": { p: [251], c: \"\\u00FB\" },\n    \"ucy;\": { p: [1091], c: \"\\u0443\" },\n    \"udarr;\": { p: [8645], c: \"\\u21C5\" },\n    \"udblac;\": { p: [369], c: \"\\u0171\" },\n    \"udhar;\": { p: [10606], c: \"\\u296E\" },\n    \"ufisht;\": { p: [10622], c: \"\\u297E\" },\n    \"ufr;\": { p: [120114], c: \"\\uD835\\uDD32\" },\n    ugrave: { p: [249], c: \"\\u00F9\" },\n    \"ugrave;\": { p: [249], c: \"\\u00F9\" },\n    \"uharl;\": { p: [8639], c: \"\\u21BF\" },\n    \"uharr;\": { p: [8638], c: \"\\u21BE\" },\n    \"uhblk;\": { p: [9600], c: \"\\u2580\" },\n    \"ulcorn;\": { p: [8988], c: \"\\u231C\" },\n    \"ulcorner;\": { p: [8988], c: \"\\u231C\" },\n    \"ulcrop;\": { p: [8975], c: \"\\u230F\" },\n    \"ultri;\": { p: [9720], c: \"\\u25F8\" },\n    \"umacr;\": { p: [363], c: \"\\u016B\" },\n    uml: { p: [168], c: \"\\u00A8\" },\n    \"uml;\": { p: [168], c: \"\\u00A8\" },\n    \"uogon;\": { p: [371], c: \"\\u0173\" },\n    \"uopf;\": { p: [120166], c: \"\\uD835\\uDD66\" },\n    \"uparrow;\": { p: [8593], c: \"\\u2191\" },\n    \"updownarrow;\": { p: [8597], c: \"\\u2195\" },\n    \"upharpoonleft;\": { p: [8639], c: \"\\u21BF\" },\n    \"upharpoonright;\": { p: [8638], c: \"\\u21BE\" },\n    \"uplus;\": { p: [8846], c: \"\\u228E\" },\n    \"upsi;\": { p: [965], c: \"\\u03C5\" },\n    \"upsih;\": { p: [978], c: \"\\u03D2\" },\n    \"upsilon;\": { p: [965], c: \"\\u03C5\" },\n    \"upuparrows;\": { p: [8648], c: \"\\u21C8\" },\n    \"urcorn;\": { p: [8989], c: \"\\u231D\" },\n    \"urcorner;\": { p: [8989], c: \"\\u231D\" },\n    \"urcrop;\": { p: [8974], c: \"\\u230E\" },\n    \"uring;\": { p: [367], c: \"\\u016F\" },\n    \"urtri;\": { p: [9721], c: \"\\u25F9\" },\n    \"uscr;\": { p: [120010], c: \"\\uD835\\uDCCA\" },\n    \"utdot;\": { p: [8944], c: \"\\u22F0\" },\n    \"utilde;\": { p: [361], c: \"\\u0169\" },\n    \"utri;\": { p: [9653], c: \"\\u25B5\" },\n    \"utrif;\": { p: [9652], c: \"\\u25B4\" },\n    \"uuarr;\": { p: [8648], c: \"\\u21C8\" },\n    uuml: { p: [252], c: \"\\u00FC\" },\n    \"uuml;\": { p: [252], c: \"\\u00FC\" },\n    \"uwangle;\": { p: [10663], c: \"\\u29A7\" },\n    \"vArr;\": { p: [8661], c: \"\\u21D5\" },\n    \"vBar;\": { p: [10984], c: \"\\u2AE8\" },\n    \"vBarv;\": { p: [10985], c: \"\\u2AE9\" },\n    \"vDash;\": { p: [8872], c: \"\\u22A8\" },\n    \"vangrt;\": { p: [10652], c: \"\\u299C\" },\n    \"varepsilon;\": { p: [1013], c: \"\\u03F5\" },\n    \"varkappa;\": { p: [1008], c: \"\\u03F0\" },\n    \"varnothing;\": { p: [8709], c: \"\\u2205\" },\n    \"varphi;\": { p: [981], c: \"\\u03D5\" },\n    \"varpi;\": { p: [982], c: \"\\u03D6\" },\n    \"varpropto;\": { p: [8733], c: \"\\u221D\" },\n    \"varr;\": { p: [8597], c: \"\\u2195\" },\n    \"varrho;\": { p: [1009], c: \"\\u03F1\" },\n    \"varsigma;\": { p: [962], c: \"\\u03C2\" },\n    \"varsubsetneq;\": {\n        p: [8842, 65024],\n        c: \"\\u228A\\uFE00\",\n    },\n    \"varsubsetneqq;\": {\n        p: [10955, 65024],\n        c: \"\\u2ACB\\uFE00\",\n    },\n    \"varsupsetneq;\": {\n        p: [8843, 65024],\n        c: \"\\u228B\\uFE00\",\n    },\n    \"varsupsetneqq;\": {\n        p: [10956, 65024],\n        c: \"\\u2ACC\\uFE00\",\n    },\n    \"vartheta;\": { p: [977], c: \"\\u03D1\" },\n    \"vartriangleleft;\": { p: [8882], c: \"\\u22B2\" },\n    \"vartriangleright;\": { p: [8883], c: \"\\u22B3\" },\n    \"vcy;\": { p: [1074], c: \"\\u0432\" },\n    \"vdash;\": { p: [8866], c: \"\\u22A2\" },\n    \"vee;\": { p: [8744], c: \"\\u2228\" },\n    \"veebar;\": { p: [8891], c: \"\\u22BB\" },\n    \"veeeq;\": { p: [8794], c: \"\\u225A\" },\n    \"vellip;\": { p: [8942], c: \"\\u22EE\" },\n    \"verbar;\": { p: [124], c: \"\\u007C\" },\n    \"vert;\": { p: [124], c: \"\\u007C\" },\n    \"vfr;\": { p: [120115], c: \"\\uD835\\uDD33\" },\n    \"vltri;\": { p: [8882], c: \"\\u22B2\" },\n    \"vnsub;\": { p: [8834, 8402], c: \"\\u2282\\u20D2\" },\n    \"vnsup;\": { p: [8835, 8402], c: \"\\u2283\\u20D2\" },\n    \"vopf;\": { p: [120167], c: \"\\uD835\\uDD67\" },\n    \"vprop;\": { p: [8733], c: \"\\u221D\" },\n    \"vrtri;\": { p: [8883], c: \"\\u22B3\" },\n    \"vscr;\": { p: [120011], c: \"\\uD835\\uDCCB\" },\n    \"vsubnE;\": { p: [10955, 65024], c: \"\\u2ACB\\uFE00\" },\n    \"vsubne;\": { p: [8842, 65024], c: \"\\u228A\\uFE00\" },\n    \"vsupnE;\": { p: [10956, 65024], c: \"\\u2ACC\\uFE00\" },\n    \"vsupne;\": { p: [8843, 65024], c: \"\\u228B\\uFE00\" },\n    \"vzigzag;\": { p: [10650], c: \"\\u299A\" },\n    \"wcirc;\": { p: [373], c: \"\\u0175\" },\n    \"wedbar;\": { p: [10847], c: \"\\u2A5F\" },\n    \"wedge;\": { p: [8743], c: \"\\u2227\" },\n    \"wedgeq;\": { p: [8793], c: \"\\u2259\" },\n    \"weierp;\": { p: [8472], c: \"\\u2118\" },\n    \"wfr;\": { p: [120116], c: \"\\uD835\\uDD34\" },\n    \"wopf;\": { p: [120168], c: \"\\uD835\\uDD68\" },\n    \"wp;\": { p: [8472], c: \"\\u2118\" },\n    \"wr;\": { p: [8768], c: \"\\u2240\" },\n    \"wreath;\": { p: [8768], c: \"\\u2240\" },\n    \"wscr;\": { p: [120012], c: \"\\uD835\\uDCCC\" },\n    \"xcap;\": { p: [8898], c: \"\\u22C2\" },\n    \"xcirc;\": { p: [9711], c: \"\\u25EF\" },\n    \"xcup;\": { p: [8899], c: \"\\u22C3\" },\n    \"xdtri;\": { p: [9661], c: \"\\u25BD\" },\n    \"xfr;\": { p: [120117], c: \"\\uD835\\uDD35\" },\n    \"xhArr;\": { p: [10234], c: \"\\u27FA\" },\n    \"xharr;\": { p: [10231], c: \"\\u27F7\" },\n    \"xi;\": { p: [958], c: \"\\u03BE\" },\n    \"xlArr;\": { p: [10232], c: \"\\u27F8\" },\n    \"xlarr;\": { p: [10229], c: \"\\u27F5\" },\n    \"xmap;\": { p: [10236], c: \"\\u27FC\" },\n    \"xnis;\": { p: [8955], c: \"\\u22FB\" },\n    \"xodot;\": { p: [10752], c: \"\\u2A00\" },\n    \"xopf;\": { p: [120169], c: \"\\uD835\\uDD69\" },\n    \"xoplus;\": { p: [10753], c: \"\\u2A01\" },\n    \"xotime;\": { p: [10754], c: \"\\u2A02\" },\n    \"xrArr;\": { p: [10233], c: \"\\u27F9\" },\n    \"xrarr;\": { p: [10230], c: \"\\u27F6\" },\n    \"xscr;\": { p: [120013], c: \"\\uD835\\uDCCD\" },\n    \"xsqcup;\": { p: [10758], c: \"\\u2A06\" },\n    \"xuplus;\": { p: [10756], c: \"\\u2A04\" },\n    \"xutri;\": { p: [9651], c: \"\\u25B3\" },\n    \"xvee;\": { p: [8897], c: \"\\u22C1\" },\n    \"xwedge;\": { p: [8896], c: \"\\u22C0\" },\n    yacute: { p: [253], c: \"\\u00FD\" },\n    \"yacute;\": { p: [253], c: \"\\u00FD\" },\n    \"yacy;\": { p: [1103], c: \"\\u044F\" },\n    \"ycirc;\": { p: [375], c: \"\\u0177\" },\n    \"ycy;\": { p: [1099], c: \"\\u044B\" },\n    yen: { p: [165], c: \"\\u00A5\" },\n    \"yen;\": { p: [165], c: \"\\u00A5\" },\n    \"yfr;\": { p: [120118], c: \"\\uD835\\uDD36\" },\n    \"yicy;\": { p: [1111], c: \"\\u0457\" },\n    \"yopf;\": { p: [120170], c: \"\\uD835\\uDD6A\" },\n    \"yscr;\": { p: [120014], c: \"\\uD835\\uDCCE\" },\n    \"yucy;\": { p: [1102], c: \"\\u044E\" },\n    yuml: { p: [255], c: \"\\u00FF\" },\n    \"yuml;\": { p: [255], c: \"\\u00FF\" },\n    \"zacute;\": { p: [378], c: \"\\u017A\" },\n    \"zcaron;\": { p: [382], c: \"\\u017E\" },\n    \"zcy;\": { p: [1079], c: \"\\u0437\" },\n    \"zdot;\": { p: [380], c: \"\\u017C\" },\n    \"zeetrf;\": { p: [8488], c: \"\\u2128\" },\n    \"zeta;\": { p: [950], c: \"\\u03B6\" },\n    \"zfr;\": { p: [120119], c: \"\\uD835\\uDD37\" },\n    \"zhcy;\": { p: [1078], c: \"\\u0436\" },\n    \"zigrarr;\": { p: [8669], c: \"\\u21DD\" },\n    \"zopf;\": { p: [120171], c: \"\\uD835\\uDD6B\" },\n    \"zscr;\": { p: [120015], c: \"\\uD835\\uDCCF\" },\n    \"zwj;\": { p: [8205], c: \"\\u200D\" },\n    \"zwnj;\": { p: [8204], c: \"\\u200C\" },\n};\n"
  },
  {
    "path": "src/lib/utils/html.ts",
    "content": "import { assertNever } from \"#utils\";\nimport { htmlEntities } from \"./html-entities.js\";\n\n/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\n\ninterface EntityData {\n    /** code points associated with this escape */\n    p: number[];\n    /** String representing this escape when rendered */\n    c: string;\n}\n\n// https://en.wikipedia.org/wiki/Trie\ninterface Trie {\n    data?: EntityData;\n    children?: Record<number, Trie | undefined>;\n}\nconst htmlEntitiesTrie: Trie = {};\nfor (const [name, data] of Object.entries(htmlEntities)) {\n    let current = htmlEntitiesTrie;\n    for (let i = 0; i < name.length; ++i) {\n        current.children ||= {};\n        current = current.children[name.charCodeAt(i)] ||= {};\n    }\n    current.data = data;\n}\n\n/**\n * Replaces non-[URL code points](https://url.spec.whatwg.org/#url-code-points)\n * with an underscore. Also disallows some additional special characters which either\n * result in confusing file names or invalid file names on some platform.\n *\n * Ref: #2714\n */\nexport function createNormalizedUrl(url: string) {\n    // We are intentionally operating on code points here.\n    // eslint-disable-next-line @typescript-eslint/no-misused-spread\n    const codePoints: number[] = [...url].map((c) => c.codePointAt(0)!);\n\n    for (let i = 0; i < codePoints.length; ++i) {\n        if (isalnum(codePoints[i])) continue;\n\n        switch (codePoints[i]) {\n            // case Chars.BANG: // commonly used for shell history access\n            // case Chars.DOLLAR: // variable reference in shells\n            // case Chars.AMPERSAND: // confusing in urls with params\n            // case Chars.APOSTROPHE: // sometimes permitted for quoting\n            case Chars.LEFT_PAREN:\n            case Chars.RIGHT_PAREN:\n            // case Chars.ASTERISK: // not allowed in file names on windows\n            case Chars.PLUS:\n            case Chars.COMMA:\n            case Chars.DASH:\n            case Chars.DOT:\n            // case Chars.SOLIDUS: // not allowed in file names\n            // case Chars.COLON: // not allowed in file names on windows\n            // case Chars.SEMICOLON: // appears suspiciously close to colon\n            // case Chars.EQUALS: // confusing in urls with params\n            // case Chars.QUESTION_MARK: // not allowed in file names on windows\n            // case Chars.AT: // avoid confusing some (bad) software that thinks this is an email\n            case Chars.UNDERSCORE:\n                // case Chars.TILDE: // reference to $HOME on Linux\n                continue;\n        }\n\n        if (0xa0 <= codePoints[i] && codePoints[i] <= 0x10fffd) {\n            if (!isSurrogate(codePoints[i])) {\n                continue;\n            }\n        }\n\n        codePoints[i] = Chars.UNDERSCORE;\n    }\n\n    return String.fromCodePoint(...codePoints);\n}\n\nconst enum Chars {\n    EOF = -1,\n    NULL = 0,\n    TAB = 0x9,\n    LF = 0xa,\n    FF = 0xc,\n    SPACE = 0x20,\n    NUMBER_SIGN = 0x23,\n    BANG = 0x21,\n    QUOTATION_MARK = 0x22,\n    DOLLAR = 0x24,\n    AMPERSAND = 0x26,\n    APOSTROPHE = 0x27,\n    LEFT_PAREN = 0x28,\n    RIGHT_PAREN = 0x29,\n    ASTERISK = 0x2a,\n    PLUS = 0x2b,\n    COMMA = 0x2c,\n    DASH = 0x2d,\n    DOT = 0x2e,\n    SOLIDUS = 0x2f,\n    ZERO = 0x30,\n    NINE = 0x39,\n    COLON = 0x3a,\n    SEMICOLON = 0x3b,\n    LESS_THAN = 0x3c,\n    EQUALS = 0x3d,\n    GREATER_THAN = 0x3e,\n    QUESTION_MARK = 0x3f,\n    AT = 0x40,\n    UPPERCASE_A = 0x41,\n    UPPERCASE_F = 0x46,\n    UPPERCASE_X = 0x58,\n    UPPERCASE_Z = 0x5a,\n    UNDERSCORE = 0x5f,\n    GRAVE_ACCENT = 0x60,\n    LOWERCASE_A = 0x61,\n    LOWERCASE_F = 0x66,\n    LOWERCASE_X = 0x78,\n    LOWERCASE_Z = 0x7a,\n    TILDE = 0x7e,\n}\n\nfunction isalpha(ch: number) {\n    return Chars.LOWERCASE_A <= (ch | 0x20) && (ch | 0x20) <= Chars.LOWERCASE_Z;\n}\n\nfunction isdigit(ch: number) {\n    return Chars.ZERO <= ch && ch <= Chars.NINE;\n}\n\nfunction isalnum(ch: number) {\n    return isalpha(ch) || isdigit(ch);\n}\n\nfunction isxdigit(ch: number) {\n    return (\n        isdigit(ch) ||\n        (Chars.LOWERCASE_A <= (ch | 0x20) && (ch | 0x20) <= Chars.LOWERCASE_F)\n    );\n}\n\nexport const enum ParserState {\n    BeforeAttributeName,\n    AfterAttributeName,\n    BeforeAttributeValue,\n    END,\n}\n\n/**\n * Parser for HTML attributes, each call to {@link step} will\n * pause the parser at key points used to extract relative links from markdown\n *\n * The parser will pause at the points marked with `^`:\n *\n * ```text\n * attr=\"value\" attr='value' attr=value attr attr2 />\n *     ^       ^    ^       ^    ^     ^    ^     ^^\n *     BeforeValue  |       |    |     |    |     ||\n *             BeforeName   |    |     |    |     ||\n *                  BeforeValue  |     |    |     ||\n *                          BeforeName |    |     ||\n *                               BeforeValue|     ||\n *                                     BeforeName ||\n *                                          AfterName\n *                                                AfterName\n *                                                 END\n * ```\n */\nexport class HtmlAttributeParser {\n    state = ParserState.BeforeAttributeName;\n    currentAttributeName: string = \"\";\n    currentAttributeValueStart = -1;\n    currentAttributeValueEnd = -1;\n    currentAttributeValue: string = \"\";\n    private temporaryBuffer: number[] = [];\n    private characterReferenceCode = 0;\n\n    constructor(\n        readonly text: string,\n        public pos: number = 0,\n    ) {}\n\n    step() {\n        switch (this.state) {\n            case ParserState.BeforeAttributeName:\n                this.beforeAttributeName();\n                return;\n            case ParserState.AfterAttributeName:\n                this.afterAttributeName();\n                return;\n            case ParserState.BeforeAttributeValue:\n                this.beforeAttributeValue();\n                return;\n\n            case ParserState.END:\n                return; // Do nothing\n        }\n\n        /* c8 ignore next */\n        assertNever(this.state);\n    }\n\n    private peek() {\n        const ch = this.text.charCodeAt(this.pos);\n        return isNaN(ch) ? Chars.EOF : ch;\n    }\n    private consume() {\n        const ch = this.peek();\n        ++this.pos;\n        return ch;\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state\n    beforeAttributeName() {\n        this.currentAttributeName = \"\";\n        this.currentAttributeValue = \"\";\n\n        loop: for (;;) {\n            switch (this.consume()) {\n                case Chars.TAB:\n                case Chars.LF:\n                case Chars.FF:\n                case Chars.SPACE:\n                    break;\n                case Chars.SOLIDUS:\n                case Chars.GREATER_THAN:\n                case Chars.EOF:\n                    --this.pos;\n                    this.afterAttributeName();\n                    break loop;\n                case Chars.EQUALS:\n                // Unexpected equals sign before attribute name parse error.\n                // fall through\n                default:\n                    --this.pos;\n                    this.attributeName();\n                    break loop;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#attribute-name-state\n    attributeName() {\n        const startPos = this.pos;\n        loop: for (;;) {\n            const ch = this.consume();\n            switch (ch) {\n                case Chars.TAB:\n                case Chars.LF:\n                case Chars.FF:\n                case Chars.SPACE:\n                case Chars.SOLIDUS:\n                case Chars.GREATER_THAN:\n                case Chars.EOF:\n                    --this.pos;\n                    this.state = ParserState.AfterAttributeName;\n                    break loop;\n                case Chars.EQUALS:\n                    this.state = ParserState.BeforeAttributeValue;\n                    break loop;\n                case Chars.QUOTATION_MARK:\n                case Chars.APOSTROPHE:\n                case Chars.LESS_THAN:\n                // This is an unexpected-character-in-attribute-name parse error. Treat it as per the \"anything else\" entry below.\n                // fall through\n                default:\n                    // Do nothing, we collect the attribute name after the loop\n                    break;\n            }\n        }\n\n        if (this.state === ParserState.BeforeAttributeValue) {\n            this.currentAttributeName = this.text\n                .substring(startPos, this.pos - 1)\n                .toLowerCase();\n        } else {\n            this.currentAttributeName = this.text\n                .substring(startPos, this.pos)\n                .toLowerCase();\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#after-attribute-name-state\n    afterAttributeName() {\n        loop: for (;;) {\n            switch (this.consume()) {\n                case Chars.TAB:\n                case Chars.LF:\n                case Chars.FF:\n                case Chars.SPACE:\n                    break; // Ignore the character\n                case Chars.SOLIDUS:\n                    this.state = ParserState.END; // self-closing start tag state\n                    break loop;\n                case Chars.EQUALS:\n                    this.state = ParserState.BeforeAttributeValue;\n                    break loop;\n                case Chars.GREATER_THAN:\n                    this.state = ParserState.END; // data state\n                    break loop;\n                case Chars.EOF:\n                    this.state = ParserState.END; // eof-in-tag parse error\n                    break loop;\n                default:\n                    --this.pos;\n                    this.attributeName();\n                    break loop;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-value-state\n    beforeAttributeValue() {\n        loop: for (;;) {\n            switch (this.consume()) {\n                case Chars.TAB:\n                case Chars.LF:\n                case Chars.FF:\n                case Chars.SPACE:\n                    break; // Ignore the character\n                case Chars.QUOTATION_MARK:\n                    this.attributeValueDoubleQuoted();\n                    break loop;\n                case Chars.APOSTROPHE:\n                    this.attributeValueSingleQuoted();\n                    break loop;\n                case Chars.GREATER_THAN:\n                    this.state = ParserState.END; // missing-attribute-value parse error\n                    break loop;\n                default:\n                    --this.pos;\n                    this.attributeValueUnquoted();\n                    break loop;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(double-quoted)-state\n    attributeValueDoubleQuoted() {\n        this.currentAttributeValueStart = this.pos;\n        loop: for (;;) {\n            switch (this.consume()) {\n                case Chars.QUOTATION_MARK:\n                    this.currentAttributeValueEnd = this.pos - 1;\n                    this.afterAttributeValueQuoted();\n                    break loop;\n                case Chars.AMPERSAND:\n                    this.characterReference();\n                    break;\n                case Chars.NULL:\n                    this.currentAttributeValue += String.fromCharCode(0xfffd);\n                    break;\n                case Chars.EOF:\n                    this.currentAttributeValueEnd = this.pos;\n                    this.state = ParserState.END; // eof-in-tag parse error\n                    break loop;\n                default:\n                    this.currentAttributeValue += this.text[this.pos - 1];\n                    break;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(single-quoted)-state\n    attributeValueSingleQuoted() {\n        this.currentAttributeValueStart = this.pos;\n        loop: for (;;) {\n            switch (this.consume()) {\n                case Chars.APOSTROPHE:\n                    this.currentAttributeValueEnd = this.pos - 1;\n                    this.afterAttributeValueQuoted();\n                    break loop;\n                case Chars.AMPERSAND:\n                    this.characterReference();\n                    break;\n                case Chars.NULL:\n                    this.currentAttributeValue += String.fromCharCode(0xfffd);\n                    break;\n                case Chars.EOF:\n                    this.currentAttributeValueEnd = this.pos;\n                    this.state = ParserState.END; // eof-in-tag parse error\n                    break loop;\n                default:\n                    this.currentAttributeValue += this.text[this.pos - 1];\n                    break;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(unquoted)-state\n    attributeValueUnquoted() {\n        this.currentAttributeValueStart = this.pos;\n        loop: for (;;) {\n            switch (this.consume()) {\n                case Chars.TAB:\n                case Chars.LF:\n                case Chars.FF:\n                case Chars.SPACE:\n                    this.currentAttributeValueEnd = this.pos - 1;\n                    this.state = ParserState.BeforeAttributeName;\n                    break loop;\n                case Chars.AMPERSAND:\n                    this.characterReference();\n                    break;\n                case Chars.GREATER_THAN:\n                    this.currentAttributeValueEnd = this.pos;\n                    this.state = ParserState.END;\n                    break loop;\n                case Chars.NULL:\n                    this.currentAttributeValue += String.fromCharCode(0xfffd);\n                    break;\n                case Chars.EOF:\n                    this.currentAttributeValueEnd = this.pos;\n                    this.state = ParserState.END; // eof-in-tag parse error\n                    break loop;\n                case Chars.QUOTATION_MARK:\n                case Chars.APOSTROPHE:\n                case Chars.LESS_THAN:\n                case Chars.EQUALS:\n                case Chars.GRAVE_ACCENT:\n                // This is an unexpected-character-in-unquoted-attribute-value parse error. Treat it as per the \"anything else\" entry below.\n                // fall through\n                default:\n                    this.currentAttributeValue += this.text[this.pos - 1];\n                    break;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#after-attribute-value-(quoted)-state\n    afterAttributeValueQuoted() {\n        switch (this.consume()) {\n            case Chars.TAB:\n            case Chars.LF:\n            case Chars.FF:\n            case Chars.SPACE:\n                this.state = ParserState.BeforeAttributeName;\n                break;\n            case Chars.SOLIDUS:\n            case Chars.GREATER_THAN:\n            case Chars.EOF:\n                this.state = ParserState.END;\n                break;\n            default:\n                // This is a missing-whitespace-between-attributes parse error. Reconsume in the before attribute name state.\n                --this.pos;\n                this.state = ParserState.BeforeAttributeName;\n                break;\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#character-reference-state\n    characterReference() {\n        this.temporaryBuffer = [Chars.AMPERSAND];\n        const next = this.consume();\n        if (isalnum(next)) {\n            --this.pos;\n            this.namedCharacterReference();\n        } else if (next == Chars.NUMBER_SIGN) {\n            this.temporaryBuffer.push(next);\n            this.numericCharacterReference();\n        } else {\n            --this.pos;\n            this.flushTemporaryBuffer();\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n    // Intentionally only handling part of an attribute\n    namedCharacterReference() {\n        // Consume the maximum number of characters possible, where the consumed\n        // characters are one of the identifiers in the first column of the named\n        // character references table. Append each character to the temporary buffer\n        // when it's consumed.\n        let currentTrie = htmlEntitiesTrie;\n        for (;;) {\n            const ch = this.consume();\n            this.temporaryBuffer.push(ch);\n\n            if (currentTrie.children && ch in currentTrie.children) {\n                currentTrie = currentTrie.children[ch]!;\n            } else {\n                --this.pos;\n                this.temporaryBuffer.pop();\n                const lastChar = this.temporaryBuffer[this.temporaryBuffer.length - 1];\n\n                // If there is a match\n                if (currentTrie.data) {\n                    // If the character reference was consumed as part of an attribute,\n                    // and the last character matched is not a U+003B SEMICOLON character (;),\n                    // and the next input character is either a U+003D EQUALS SIGN character (=)\n                    // or an ASCII alphanumeric, then, for historical reasons, flush code points\n                    // consumed as a character reference and switch to the return state.\n                    if (\n                        lastChar != Chars.SEMICOLON &&\n                        (this.peek() == Chars.EQUALS || isalpha(this.peek()))\n                    ) {\n                        this.flushTemporaryBuffer();\n                        return;\n                    } else {\n                        // missing-semicolon-after-character-reference parse error\n                        this.temporaryBuffer = currentTrie.data.p;\n                        this.flushTemporaryBuffer();\n                        return;\n                    }\n                } else {\n                    this.flushTemporaryBuffer();\n                    this.ambiguousAmpersand();\n                    return;\n                }\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#ambiguous-ampersand-state\n    ambiguousAmpersand() {\n        const ch = this.consume();\n        if (isalnum(ch)) {\n            this.currentAttributeValue += String.fromCharCode(ch);\n        } else {\n            --this.pos;\n            return;\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-state\n    numericCharacterReference() {\n        this.characterReferenceCode = 0;\n        const ch = this.consume();\n        switch (ch) {\n            case Chars.LOWERCASE_X:\n            case Chars.UPPERCASE_X:\n                this.temporaryBuffer.push(ch);\n                this.hexadecimalCharacterReferenceStart();\n                break;\n            default:\n                --this.pos;\n                this.decimalCharacterReferenceStart();\n                break;\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#hexadecimal-character-reference-start-state\n    hexadecimalCharacterReferenceStart() {\n        const ch = this.consume();\n\n        if (isxdigit(ch)) {\n            --this.pos;\n            this.hexadecimalCharacterReference();\n        } else {\n            --this.pos;\n            this.flushTemporaryBuffer();\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#decimal-character-reference-start-state\n    decimalCharacterReferenceStart() {\n        const ch = this.consume();\n        if (isdigit(ch)) {\n            --this.pos;\n            this.decimalCharacterReference();\n        } else {\n            --this.pos;\n            this.flushTemporaryBuffer();\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#hexadecimal-character-reference-state\n    hexadecimalCharacterReference() {\n        for (;;) {\n            const ch = this.consume();\n            if (isdigit(ch)) {\n                this.characterReferenceCode *= 16;\n                this.characterReferenceCode += ch - 0x30;\n            } else if (Chars.UPPERCASE_A <= ch && ch <= Chars.UPPERCASE_F) {\n                this.characterReferenceCode *= 16;\n                this.characterReferenceCode += ch - 0x37;\n            } else if (Chars.LOWERCASE_A <= ch && ch <= Chars.LOWERCASE_F) {\n                this.characterReferenceCode *= 16;\n                this.characterReferenceCode += ch - 0x57;\n            } else if (ch === Chars.SEMICOLON) {\n                this.numericCharacterReferenceEndState();\n                return;\n            } else {\n                --this.pos;\n                this.numericCharacterReferenceEndState();\n                return;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#decimal-character-reference-state\n    decimalCharacterReference() {\n        for (;;) {\n            const ch = this.consume();\n            if (isdigit(ch)) {\n                this.characterReferenceCode *= 10;\n                this.characterReferenceCode += ch - 0x30;\n            } else if (ch === Chars.SEMICOLON) {\n                this.numericCharacterReferenceEndState();\n                return;\n            } else {\n                --this.pos;\n                this.numericCharacterReferenceEndState();\n                return;\n            }\n        }\n    }\n\n    // https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state\n    numericCharacterReferenceEndState() {\n        if (this.characterReferenceCode == 0) {\n            // null-character-reference parse error\n            this.characterReferenceCode = 0xfffd;\n        }\n\n        if (this.characterReferenceCode > 0x10ffff) {\n            // character-reference-outside-unicode-range parse error\n            this.characterReferenceCode = 0xfffd;\n        }\n\n        if (isSurrogate(this.characterReferenceCode)) {\n            // surrogate-character-reference parse error\n            this.characterReferenceCode = 0xfffd;\n        }\n\n        // If the number is a noncharacter, then this is a noncharacter-character-reference parse error.\n        // ... and do nothing, so don't bother checking.\n\n        // Handle replacements\n        this.characterReferenceCode = characterReferenceCodePointReplacements.get(\n            this.characterReferenceCode,\n        ) ?? this.characterReferenceCode;\n\n        this.temporaryBuffer = [this.characterReferenceCode];\n        this.flushTemporaryBuffer();\n    }\n\n    private flushTemporaryBuffer() {\n        this.currentAttributeValue += String.fromCodePoint(\n            ...this.temporaryBuffer,\n        );\n        this.temporaryBuffer = [];\n    }\n}\n\n// https://infra.spec.whatwg.org/#leading-surrogate\nfunction isLeadingSurrogate(ch: number) {\n    return 0xd800 <= ch && ch <= 0xdbff;\n}\n\n// https://infra.spec.whatwg.org/#trailing-surrogate\nfunction isTrailingSurrogate(ch: number) {\n    return 0xdc00 <= ch && ch <= 0xdfff;\n}\n\n// https://infra.spec.whatwg.org/#surrogate\nfunction isSurrogate(ch: number) {\n    return isLeadingSurrogate(ch) || isTrailingSurrogate(ch);\n}\n\nconst characterReferenceCodePointReplacements = new Map([\n    [0x80, 0x20ac], // EURO SIGN (€)\n    [0x82, 0x201a], // SINGLE LOW-9 QUOTATION MARK (‚)\n    [0x83, 0x0192], // LATIN SMALL LETTER F WITH HOOK (ƒ)\n    [0x84, 0x201e], // DOUBLE LOW-9 QUOTATION MARK („)\n    [0x85, 0x2026], // HORIZONTAL ELLIPSIS (…)\n    [0x86, 0x2020], // DAGGER (†)\n    [0x87, 0x2021], // DOUBLE DAGGER (‡)\n    [0x88, 0x02c6], // MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ)\n    [0x89, 0x2030], // PER MILLE SIGN (‰)\n    [0x8a, 0x0160], // LATIN CAPITAL LETTER S WITH CARON (Š)\n    [0x8b, 0x2039], // SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹)\n    [0x8c, 0x0152], // LATIN CAPITAL LIGATURE OE (Œ)\n    [0x8e, 0x017d], // LATIN CAPITAL LETTER Z WITH CARON (Ž)\n    [0x91, 0x2018], // LEFT SINGLE QUOTATION MARK (‘)\n    [0x92, 0x2019], // RIGHT SINGLE QUOTATION MARK (’)\n    [0x93, 0x201c], // LEFT DOUBLE QUOTATION MARK (“)\n    [0x94, 0x201d], // RIGHT DOUBLE QUOTATION MARK (”)\n    [0x95, 0x2022], // BULLET (•)\n    [0x96, 0x2013], // EN DASH (–)\n    [0x97, 0x2014], // EM DASH (—)\n    [0x98, 0x02dc], // SMALL TILDE (˜)\n    [0x99, 0x2122], // TRADE MARK SIGN (™)\n    [0x9a, 0x0161], // LATIN SMALL LETTER S WITH CARON (š)\n    [0x9b, 0x203a], // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›)\n    [0x9c, 0x0153], // LATIN SMALL LIGATURE OE (œ)\n    [0x9e, 0x017e], // LATIN SMALL LETTER Z WITH CARON (ž)\n    [0x9f, 0x0178], // LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ)\n]);\n"
  },
  {
    "path": "src/lib/utils/index.ts",
    "content": "export { AbstractComponent } from \"./component.js\";\nexport * from \"./fs.js\";\nexport { getLoadedPaths, hasBeenLoadedMultipleTimes, TYPEDOC_ROOT } from \"./general.js\";\nexport { FancyConsoleLogger } from \"./loggers.js\";\nexport {\n    ArgumentsReader,\n    CommentStyle,\n    Option,\n    OptionDefaults,\n    Options,\n    PackageJsonReader,\n    ParameterHint,\n    ParameterType,\n    TSConfigReader,\n    TypeDocReader,\n} from \"./options/index.js\";\nexport type {\n    ArrayDeclarationOption,\n    BooleanDeclarationOption,\n    DeclarationOption,\n    DeclarationOptionBase,\n    DeclarationOptionToOptionType,\n    FlagsDeclarationOption,\n    JsDocCompatibility,\n    KeyToDeclaration,\n    ManuallyValidatedOption,\n    MapDeclarationOption,\n    MixedDeclarationOption,\n    NumberDeclarationOption,\n    ObjectDeclarationOption,\n    OptionsReader,\n    OutputSpecification,\n    ParameterTypeToOptionTypeMap,\n    StringDeclarationOption,\n    TypeDocOptionMap,\n    TypeDocOptions,\n    TypeDocOptionValues,\n    ValidationOptions,\n} from \"./options/index.js\";\nexport * from \"./paths.js\";\nexport { loadPlugins } from \"./plugins.js\";\nexport { getSortFunction } from \"./sort.js\";\nexport type { SortStrategy } from \"./sort.js\";\n\nexport * from \"./entry-point.js\";\n\nexport * from \"./declaration-maps.js\";\nexport * from \"./highlighter.js\";\nexport * from \"./html.js\";\nexport * from \"./tsconfig.js\";\nexport * from \"./tsutils.js\";\nexport * from \"./ValidatingFileRegistry.js\";\n"
  },
  {
    "path": "src/lib/utils/loggers.ts",
    "content": "import ts from \"typescript\";\nimport { resolve } from \"path\";\nimport { nicePath } from \"./paths.js\";\nimport { ConsoleLogger, type Logger, LogLevel, type MinimalNode, type MinimalSourceFile } from \"#utils\";\n\nconst Colors = {\n    red: \"\\u001b[91m\",\n    yellow: \"\\u001b[93m\",\n    cyan: \"\\u001b[96m\",\n    gray: \"\\u001b[90m\",\n    black: \"\\u001b[47m\\u001b[30m\",\n    reset: \"\\u001b[0m\",\n};\n\nfunction color(text: string, color: keyof typeof Colors) {\n    if (\"NO_COLOR\" in process.env) return text;\n\n    return `${Colors[color]}${text}${Colors.reset}`;\n}\n\nconst messagePrefixes = {\n    [LogLevel.Error]: color(\"[error]\", \"red\"),\n    [LogLevel.Warn]: color(\"[warning]\", \"yellow\"),\n    [LogLevel.Info]: color(\"[info]\", \"cyan\"),\n    [LogLevel.Verbose]: color(\"[debug]\", \"gray\"),\n};\n\nexport function diagnostics(logger: Logger, diagnostics: readonly ts.Diagnostic[]) {\n    for (const d of diagnostics) {\n        diagnostic(logger, d);\n    }\n}\n\nexport function diagnostic(logger: Logger, diagnostic: ts.Diagnostic) {\n    const output = ts.formatDiagnosticsWithColorAndContext([diagnostic], {\n        getCanonicalFileName: resolve,\n        getCurrentDirectory: () => process.cwd(),\n        getNewLine: () => ts.sys.newLine,\n    });\n\n    switch (diagnostic.category) {\n        case ts.DiagnosticCategory.Error:\n            logger.log(output, LogLevel.Error);\n            break;\n        case ts.DiagnosticCategory.Warning:\n            logger.log(output, LogLevel.Warn);\n            break;\n        case ts.DiagnosticCategory.Message:\n            logger.log(output, LogLevel.Info);\n            break;\n    }\n}\n\n/**\n * A logger that outputs all messages to the console.\n */\nexport class FancyConsoleLogger extends ConsoleLogger {\n    protected override addContext(\n        message: string,\n        level: Exclude<LogLevel, LogLevel.None>,\n        ...args: [MinimalNode?] | [number, MinimalSourceFile]\n    ): string {\n        if (typeof args[0] === \"undefined\") {\n            return `${messagePrefixes[level]} ${message}`;\n        }\n\n        if (typeof args[0] !== \"number\") {\n            const node = args[0] as ts.Node;\n\n            return this.addContext(\n                message,\n                level,\n                node.getStart(node.getSourceFile(), false),\n                args[0].getSourceFile(),\n            );\n        }\n\n        const [pos, file] = args as [number, MinimalSourceFile];\n\n        const path = nicePath(file.fileName);\n        const { line, character } = file.getLineAndCharacterOfPosition(pos);\n\n        const location = `${color(path, \"cyan\")}:${\n            color(\n                `${line + 1}`,\n                \"yellow\",\n            )\n        }:${color(`${character}`, \"yellow\")}`;\n\n        const start = file.text.lastIndexOf(\"\\n\", pos) + 1;\n        let end = file.text.indexOf(\"\\n\", start);\n        if (end === -1) end = file.text.length;\n\n        const prefix = `${location} - ${messagePrefixes[level]}`;\n        const context = `${\n            color(\n                `${line + 1}`,\n                \"black\",\n            )\n        }    ${file.text.substring(start, end)}`;\n\n        return `${prefix} ${message}\\n\\n${context}\\n`;\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/options/declaration.ts",
    "content": "import type { BundledTheme as ShikiTheme } from \"@gerrit0/mini-shiki\";\nimport type { SortStrategy } from \"../sort.js\";\nimport { isAbsolute, join, resolve } from \"path\";\nimport type { EntryPointStrategy } from \"../entry-point.js\";\nimport type { ReflectionKind } from \"../../models/kind.js\";\nimport {\n    type GlobString,\n    i18n,\n    type LogLevel,\n    type NeverIfInternal,\n    type NormalizedPath,\n    type NormalizedPathOrModule,\n    type NormalizedPathOrModuleOrFunction,\n    type TagString,\n    type TranslatedString,\n} from \"#utils\";\nimport type { TranslationProxy } from \"../../internationalization/internationalization.js\";\nimport { createGlobString, normalizePath } from \"../paths.js\";\nimport type { Application } from \"../../application.js\";\n\n/** @enum */\nexport const EmitStrategy = {\n    both: \"both\", // Emit both documentation and JS\n    docs: \"docs\", // Emit documentation, but not JS (default)\n    none: \"none\", // Emit nothing, just convert and run validation\n} as const;\n/** @hidden */\nexport type EmitStrategy = (typeof EmitStrategy)[keyof typeof EmitStrategy];\n\n/**\n * Determines how TypeDoc searches for comments.\n * @enum\n */\nexport const CommentStyle = {\n    JSDoc: \"jsdoc\",\n    Block: \"block\",\n    Line: \"line\",\n    All: \"all\",\n} as const;\nexport type CommentStyle = (typeof CommentStyle)[keyof typeof CommentStyle];\n\nexport type OutputSpecification = {\n    name: string;\n    path: string;\n    options?: TypeDocOptions;\n};\n\n/**\n * List of option names which, with `entryPointStrategy` set to `packages`\n * should only be set at the root level.\n */\nexport const rootPackageOptions = [\n    // Configuration Options\n    \"plugin\",\n    // Input Options\n    \"packageOptions\",\n    // Output Options\n    \"outputs\",\n    \"out\",\n    \"html\",\n    \"json\",\n    \"pretty\",\n    \"theme\",\n    \"router\",\n    \"lightHighlightTheme\",\n    \"darkHighlightTheme\",\n    \"highlightLanguages\",\n    \"ignoredHighlightLanguages\",\n    \"typePrintWidth\",\n    \"customCss\",\n    \"customJs\",\n    \"customFooterHtml\",\n    \"customFooterHtmlDisableWrapper\",\n    \"markdownItOptions\",\n    \"markdownItLoader\",\n    \"cname\",\n    \"favicon\",\n    \"sourceLinkExternal\",\n    \"markdownLinkExternal\",\n    \"lang\",\n    \"locales\",\n    \"githubPages\",\n    \"cacheBust\",\n    \"hideGenerator\",\n    \"searchInComments\",\n    \"searchInDocuments\",\n    \"cleanOutputDir\",\n    \"titleLink\",\n    \"navigationLinks\",\n    \"sidebarLinks\",\n    \"navigation\",\n    \"headings\",\n    \"sluggerConfiguration\",\n    \"navigationLeaves\",\n    \"visibilityFilters\",\n    \"searchCategoryBoosts\",\n    \"searchGroupBoosts\",\n    \"hostedBaseUrl\",\n    \"useHostedBaseUrlForAbsoluteLinks\",\n    \"useFirstParagraphOfCommentAsSummary\",\n    \"includeHierarchySummary\",\n    // Comment Options\n    \"notRenderedTags\",\n    // Organization Options\n    // Validation Options\n    \"treatWarningsAsErrors\",\n    \"treatValidationWarningsAsErrors\",\n    // Other Options\n    \"watch\",\n    \"preserveWatchOutput\",\n    \"help\",\n    \"version\",\n    \"showConfig\",\n    \"logLevel\",\n] as const satisfies ReadonlyArray<keyof TypeDocOptionMap>;\n\n/**\n * An interface describing all TypeDoc specific options. Generated from a\n * map which contains more information about each option for better types when\n * defining said options.\n * @interface\n */\nexport type TypeDocOptions = {\n    [K in keyof TypeDocOptionMap]?: unknown extends TypeDocOptionMap[K] ? unknown :\n        TypeDocOptionMap[K] extends ManuallyValidatedOption<\n            infer ManuallyValidated\n        > ? ManuallyValidated :\n        TypeDocOptionMap[K] extends NormalizedPathOrModuleOrFunction[] ?\n            Array<string | ((app: Application) => Promise<void> | void)> :\n        TypeDocOptionMap[K] extends NormalizedPath[] | NormalizedPathOrModule[] | GlobString[] ? string[] :\n        TypeDocOptionMap[K] extends NormalizedPath ? string :\n        TypeDocOptionMap[K] extends\n            | string\n            | string[]\n            | number\n            | boolean ? TypeDocOptionMap[K] :\n        TypeDocOptionMap[K] extends Record<string, boolean> ? Partial<TypeDocOptionMap[K]> | boolean :\n        | keyof TypeDocOptionMap[K]\n        | TypeDocOptionMap[K][keyof TypeDocOptionMap[K]];\n};\n\n/**\n * Describes all TypeDoc specific options as returned by {@link Options.getValue}, this is\n * slightly more restrictive than the {@link TypeDocOptions} since it does not allow both\n * keys and values for mapped option types, and does not allow partials of flag values.\n * It also does not mark keys as optional.\n * @interface\n */\nexport type TypeDocOptionValues = {\n    [K in keyof TypeDocOptionMap]: unknown extends TypeDocOptionMap[K] ? unknown :\n        TypeDocOptionMap[K] extends ManuallyValidatedOption<\n            infer ManuallyValidated\n        > ? ManuallyValidated :\n        TypeDocOptionMap[K] extends\n            | string\n            | string[]\n            | GlobString[]\n            | NormalizedPathOrModule[]\n            | NormalizedPathOrModuleOrFunction[]\n            | number\n            | boolean\n            | Record<string, boolean> ? TypeDocOptionMap[K] :\n        TypeDocOptionMap[K][keyof TypeDocOptionMap[K]];\n};\n\n/**\n * Describes TypeDoc options suitable for setting within the `packageOptions` setting.\n *\n * This is a subset of all options specified in {@link TypeDocOptions}.\n */\nexport interface TypeDocPackageOptions extends Omit<TypeDocOptions, typeof rootPackageOptions[number]> {}\n\n/**\n * Describes all TypeDoc options. Used internally to provide better types when fetching options.\n * External consumers should likely use {@link TypeDocOptions} instead.\n *\n * If writing a plugin, you may find it useful to use declaration merging to add your options to this interface\n * so that you have autocomplete when using `app.options.getValue`.\n *\n * ```ts\n * declare module \"typedoc\" {\n *   export interface TypeDocOptionMap {\n *     pluginOption: string[];\n *   }\n * }\n * ```\n */\nexport interface TypeDocOptionMap {\n    // Configuration\n    options: NormalizedPath;\n    tsconfig: NormalizedPath;\n    compilerOptions: unknown;\n    plugin: NormalizedPathOrModuleOrFunction[];\n    lang: string;\n    locales: ManuallyValidatedOption<Record<string, Record<string, string>>>;\n    packageOptions: ManuallyValidatedOption<\n        TypeDocPackageOptions\n    >;\n\n    // Input\n    entryPoints: GlobString[];\n    entryPointStrategy: typeof EntryPointStrategy;\n    alwaysCreateEntryPointModule: boolean;\n    projectDocuments: GlobString[];\n    exclude: GlobString[];\n    externalPattern: GlobString[];\n    excludeExternals: boolean;\n    excludeNotDocumented: boolean;\n    excludeNotDocumentedKinds: ReflectionKind.KindString[];\n    excludeInternal: boolean;\n    excludePrivateClassFields: boolean;\n    excludePrivate: boolean;\n    excludeProtected: boolean;\n    excludeReferences: boolean;\n    excludeCategories: string[];\n    maxTypeConversionDepth: number;\n    name: string;\n    includeVersion: boolean;\n    disableSources: boolean;\n    sourceLinkTemplate: string;\n    sourceLinkExternal: boolean;\n    markdownLinkExternal: boolean;\n    disableGit: boolean;\n    gitRevision: string;\n    gitRemote: string;\n    readme: string;\n    basePath: NormalizedPath;\n\n    // Output\n    outputs: ManuallyValidatedOption<Array<OutputSpecification>>;\n    out: NormalizedPath; // default output directory\n    html: NormalizedPath; // shortcut for defining html output\n    json: NormalizedPath; // shortcut for defining json output\n    pretty: boolean;\n    emit: typeof EmitStrategy;\n    theme: string;\n    router: string;\n    lightHighlightTheme: ShikiTheme;\n    darkHighlightTheme: ShikiTheme;\n    highlightLanguages: string[];\n    ignoredHighlightLanguages: string[];\n    typePrintWidth: number;\n    customCss: NormalizedPath;\n    customJs: NormalizedPath;\n    markdownItOptions: ManuallyValidatedOption<Record<string, unknown>>;\n    /**\n     * Will be called when TypeDoc is setting up the markdown parser to use to render markdown.\n     * Can be used to add markdown-it plugins to the parser with code like this:\n     *\n     * ```ts\n     * // typedoc.config.mjs\n     * import iterator from \"markdown-it-for-inline\";\n     * export default {\n     *     /** @param {MarkdownIt} parser *\\/\n     *     markdownItLoader(parser) {\n     *         parser.use(iterator, \"foo_replace\", \"text\", function(tokens, idx) {\n     *             tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n     *         });\n     *     }\n     * }\n     * ```\n     *\n     * Note: Unfortunately, markdown-it doesn't ship its own types, so `parser` isn't\n     * strictly typed here.\n     */\n    markdownItLoader: ManuallyValidatedOption<(parser: any) => void>;\n    displayBasePath: NormalizedPath;\n    cname: string;\n    favicon: NormalizedPath;\n    githubPages: boolean;\n    hostedBaseUrl: string;\n    useHostedBaseUrlForAbsoluteLinks: boolean;\n    cacheBust: boolean;\n    hideGenerator: boolean;\n    customFooterHtml: string;\n    customFooterHtmlDisableWrapper: boolean;\n    searchInComments: boolean;\n    searchInDocuments: boolean;\n    cleanOutputDir: boolean;\n    titleLink: string;\n    navigationLinks: ManuallyValidatedOption<Record<string, string>>;\n    sidebarLinks: ManuallyValidatedOption<Record<string, string>>;\n    navigationLeaves: string[];\n    navigation: {\n        includeCategories: boolean;\n        includeGroups: boolean;\n        includeFolders: boolean;\n        compactFolders: boolean;\n        excludeReferences: boolean;\n    };\n    headings: {\n        readme: boolean;\n        document: boolean;\n    };\n    sluggerConfiguration: {\n        lowercase: boolean;\n    };\n    includeHierarchySummary: boolean;\n    visibilityFilters: ManuallyValidatedOption<{\n        protected?: boolean;\n        private?: boolean;\n        inherited?: boolean;\n        external?: boolean;\n        [tag: TagString]: boolean;\n    }>;\n    searchCategoryBoosts: ManuallyValidatedOption<Record<string, number>>;\n    searchGroupBoosts: ManuallyValidatedOption<Record<string, number>>;\n    useFirstParagraphOfCommentAsSummary: boolean;\n\n    // Comment\n    commentStyle: typeof CommentStyle;\n    useTsLinkResolution: boolean;\n    preserveLinkText: boolean;\n    jsDocCompatibility: JsDocCompatibility;\n    suppressCommentWarningsInDeclarationFiles: boolean;\n    blockTags: TagString[];\n    inlineTags: TagString[];\n    modifierTags: TagString[];\n    excludeTags: TagString[];\n    notRenderedTags: TagString[];\n    externalSymbolLinkMappings: ManuallyValidatedOption<\n        Record<string, Record<string, string>>\n    >;\n    cascadedModifierTags: TagString[];\n    preservedTypeAnnotationTags: TagString[];\n\n    // Organization\n    categorizeByGroup: boolean;\n    groupReferencesByType: boolean;\n    defaultCategory: string;\n    categoryOrder: string[];\n    groupOrder: string[];\n    sort: SortStrategy[];\n    sortEntryPoints: boolean;\n    kindSortOrder: ReflectionKind.KindString[];\n\n    // Validation\n    treatWarningsAsErrors: boolean;\n    treatValidationWarningsAsErrors: boolean;\n    intentionallyNotExported: string[];\n    validation: ValidationOptions;\n    requiredToBeDocumented: ReflectionKind.KindString[];\n    packagesRequiringDocumentation: string[];\n    intentionallyNotDocumented: string[];\n\n    // Other\n    watch: boolean;\n    preserveWatchOutput: boolean;\n    help: boolean;\n    version: boolean;\n    showConfig: boolean;\n    logLevel: typeof LogLevel;\n    skipErrorChecking: boolean;\n}\n\n/**\n * Wrapper type for values in TypeDocOptionMap which are represented with an unknown option type, but\n * have a validation function that checks that they are the given type.\n */\nexport type ManuallyValidatedOption<T> = { __validated: T };\n\nexport type ValidationOptions = {\n    /**\n     * If set, TypeDoc will produce warnings when a symbol is referenced by the documentation,\n     * but is not included in the documentation.\n     */\n    notExported: boolean;\n    /**\n     * If set, TypeDoc will produce warnings about \\{\\@link\\} tags which will produce broken links.\n     */\n    invalidLink: boolean;\n    /**\n     * If set, TypeDoc will produce warnings about relative paths within the documentation which could not be resolved.\n     */\n    invalidPath: boolean;\n    /**\n     * If set, TypeDoc will produce warnings about \\{\\@link\\} tags which do not link directly to their target.\n     */\n    rewrittenLink: boolean;\n    /**\n     * If set, TypeDoc will produce warnings about declarations that do not have doc comments\n     */\n    notDocumented: boolean;\n    /**\n     * If set, TypeDoc will produce warnings about `@mergeModuleWith` tags which were not resolved.\n     */\n    unusedMergeModuleWith: boolean;\n};\n\nexport type JsDocCompatibility = {\n    /**\n     * If set, TypeDoc will treat `@example` blocks as code unless they contain a code block.\n     * On by default, this is how VSCode renders blocks.\n     */\n    exampleTag: boolean;\n    /**\n     * If set, TypeDoc will treat `@default` blocks as code unless they contain a code block.\n     * On by default, this is how VSCode renders blocks.\n     */\n    defaultTag: boolean;\n    /**\n     * If set, TypeDoc will warn if a `@inheritDoc` tag is spelled without TSDoc capitalization\n     * (i.e. `@inheritdoc`). On by default.\n     */\n    inheritDocTag: boolean;\n    /**\n     * If set, TypeDoc will not emit warnings about unescaped `{` and `}` characters encountered\n     * when parsing a comment. On by default.\n     */\n    ignoreUnescapedBraces: boolean;\n};\n\n/**\n * Converts a given TypeDoc option key to the type of the declaration expected.\n */\nexport type KeyToDeclaration<K extends keyof TypeDocOptionMap> = TypeDocOptionMap[K] extends boolean ?\n    BooleanDeclarationOption :\n    TypeDocOptionMap[K] extends string | NormalizedPath ? StringDeclarationOption :\n    TypeDocOptionMap[K] extends number ? NumberDeclarationOption :\n    TypeDocOptionMap[K] extends GlobString[] ? GlobArrayDeclarationOption :\n    TypeDocOptionMap[K] extends\n        string[] | NormalizedPath[] | NormalizedPathOrModule[] | NormalizedPathOrModuleOrFunction[] ?\n        ArrayDeclarationOption :\n    unknown extends TypeDocOptionMap[K] ? MixedDeclarationOption | ObjectDeclarationOption :\n    TypeDocOptionMap[K] extends ManuallyValidatedOption<unknown> ?\n            | (MixedDeclarationOption & {\n                validate(\n                    value: unknown,\n                    i18n: TranslationProxy,\n                ): void;\n            })\n            | (ObjectDeclarationOption & {\n                validate(\n                    value: unknown,\n                    i18n: TranslationProxy,\n                ): void;\n            }) :\n    TypeDocOptionMap[K] extends Record<string, boolean> ? FlagsDeclarationOption<TypeDocOptionMap[K]> :\n    TypeDocOptionMap[K] extends Record<\n        string | number,\n        infer U\n    > ? MapDeclarationOption<U> :\n    never;\n\nexport enum ParameterHint {\n    File,\n    Directory,\n}\n\nexport enum ParameterType {\n    String,\n    /**\n     * Resolved according to the config directory.\n     */\n    Path,\n    /**\n     * Resolved according to the config directory unless it starts with https?://\n     */\n    UrlOrPath,\n    Number,\n    Boolean,\n    Map,\n    Mixed,\n    Array,\n    /**\n     * Resolved according to the config directory.\n     */\n    PathArray,\n    /**\n     * Resolved according to the config directory if it starts with `.`\n     * @deprecated since 0.28.8, will be removed in 0.29\n     */\n    ModuleArray,\n    /**\n     * Resolved according to the config directory if it starts with `.`\n     * @internal - only intended for use with the plugin option\n     */\n    PluginArray,\n    /**\n     * Relative to the config directory.\n     */\n    GlobArray,\n    /**\n     * An object which partially merges user-set values into the defaults.\n     */\n    Object,\n    /**\n     * An object with true/false flags\n     */\n    Flags,\n}\n\nexport interface DeclarationOptionBase {\n    /**\n     * The option name.\n     */\n    name: string;\n\n    /**\n     * The help text to be displayed to the user when --help is passed.\n     *\n     * This may be a string, which will be presented directly, or a function,\n     * which will be called so that option help can be translated into the user specified locale.\n     */\n    help: NeverIfInternal<string> | (() => string);\n\n    /**\n     * The parameter type, used to convert user configuration values into the expected type.\n     * If not set, the type will be a string.\n     */\n    type?: ParameterType;\n\n    /**\n     * If set, this option will be omitted from `--help`, and attempting to specify it on the command\n     * line will produce an error.\n     */\n    configFileOnly?: boolean;\n}\n\nexport interface StringDeclarationOption extends DeclarationOptionBase {\n    /**\n     * Specifies the resolution strategy. If `Path` is provided, values will be resolved according to their\n     * location in a file. If `String` or no value is provided, values will not be resolved.\n     */\n    type?: ParameterType.String | ParameterType.Path | ParameterType.UrlOrPath;\n\n    /**\n     * If not specified defaults to the empty string for all types.\n     */\n    defaultValue?: string;\n\n    /**\n     * An optional hint for the type of input expected, will be displayed in the help output.\n     */\n    hint?: ParameterHint;\n\n    /**\n     * If specified, when this output is specified TypeDoc will automatically add\n     * an output to the `outputs` option whose name is the value of this property with\n     * the path set to the value of this option. Should only be used with `type`\n     * set to {@link ParameterType.Path}.\n     *\n     * If any output shortcuts are set, the `outputs` option will be ignored.\n     */\n    outputShortcut?: string;\n\n    /**\n     * An optional validation function that validates a potential value of this option.\n     * The function must throw an Error if the validation fails and should do nothing otherwise.\n     */\n    validate?: (value: string) => void;\n}\n\nexport interface NumberDeclarationOption extends DeclarationOptionBase {\n    type: ParameterType.Number;\n\n    /**\n     * Lowest possible value.\n     */\n    minValue?: number;\n\n    /**\n     * Highest possible value.\n     */\n    maxValue?: number;\n\n    /**\n     * If not specified defaults to 0.\n     */\n    defaultValue?: number;\n\n    /**\n     * An optional validation function that validates a potential value of this option.\n     * The function must throw an Error if the validation fails and should do nothing otherwise.\n     */\n    validate?: (value: number) => void;\n}\n\nexport interface BooleanDeclarationOption extends DeclarationOptionBase {\n    type: ParameterType.Boolean;\n\n    /**\n     * If not specified defaults to false.\n     */\n    defaultValue?: boolean;\n}\n\nexport interface ArrayDeclarationOption extends DeclarationOptionBase {\n    type:\n        | ParameterType.Array\n        | ParameterType.PathArray\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        | ParameterType.ModuleArray\n        | ParameterType.PluginArray;\n\n    /**\n     * If not specified defaults to an empty array.\n     */\n    defaultValue?: readonly string[];\n\n    /**\n     * An optional validation function that validates a potential value of this option.\n     * The function must throw an Error if the validation fails and should do nothing otherwise.\n     */\n    validate?: (value: string[]) => void;\n}\n\nexport interface GlobArrayDeclarationOption extends DeclarationOptionBase {\n    type: ParameterType.GlobArray;\n\n    /**\n     * If not specified defaults to an empty array.\n     * If specified, globs are relative to cwd when TypeDoc is run.\n     */\n    defaultValue?: readonly string[];\n\n    /**\n     * An optional validation function that validates a potential value of this option.\n     * The function must throw an Error if the validation fails and should do nothing otherwise.\n     */\n    validate?: (value: GlobString[]) => void;\n}\n\nexport interface MixedDeclarationOption extends DeclarationOptionBase {\n    type: ParameterType.Mixed;\n\n    /**\n     * If not specified defaults to undefined.\n     */\n    defaultValue?: unknown;\n\n    /**\n     * An optional validation function that validates a potential value of this option.\n     * The function must throw an Error if the validation fails and should do nothing otherwise.\n     */\n    validate?: (value: unknown) => void;\n}\n\nexport interface ObjectDeclarationOption extends DeclarationOptionBase {\n    type: ParameterType.Object;\n\n    /**\n     * If not specified defaults to undefined.\n     */\n    defaultValue?: unknown;\n\n    /**\n     * An optional validation function that validates a potential value of this option.\n     * The function must throw an Error if the validation fails and should do nothing otherwise.\n     */\n    validate?: (value: unknown) => void;\n}\nexport interface MapDeclarationOption<T> extends DeclarationOptionBase {\n    type: ParameterType.Map;\n\n    /**\n     * Maps a given value to the option type. The map type may be a TypeScript enum.\n     * In that case, when generating an error message for a mismatched key, the numeric\n     * keys will not be listed.\n     */\n    map: Map<string, T> | Record<string | number, T>;\n\n    /**\n     * Unlike the rest of the option types, there is no sensible generic default for mapped option types.\n     * The default value for a mapped type must be specified.\n     */\n    defaultValue: T;\n}\n\nexport interface FlagsDeclarationOption<T extends Record<string, boolean>> extends DeclarationOptionBase {\n    type: ParameterType.Flags;\n\n    /**\n     * All of the possible flags, with their default values set.\n     */\n    defaults: T;\n}\n\nexport type DeclarationOption =\n    | StringDeclarationOption\n    | NumberDeclarationOption\n    | BooleanDeclarationOption\n    | MixedDeclarationOption\n    | ObjectDeclarationOption\n    | MapDeclarationOption<unknown>\n    | ArrayDeclarationOption\n    | GlobArrayDeclarationOption\n    | FlagsDeclarationOption<Record<string, boolean>>;\n\nexport interface ParameterTypeToOptionTypeMap {\n    [ParameterType.String]: string;\n    [ParameterType.Path]: NormalizedPath;\n    [ParameterType.UrlOrPath]: NormalizedPath | string;\n    [ParameterType.Number]: number;\n    [ParameterType.Boolean]: boolean;\n    [ParameterType.Mixed]: unknown;\n    [ParameterType.Object]: unknown;\n    [ParameterType.Array]: string[];\n    [ParameterType.PathArray]: NormalizedPath[];\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    [ParameterType.ModuleArray]: NormalizedPathOrModule[];\n    [ParameterType.PluginArray]: Array<NormalizedPathOrModule | ((app: Application) => void | Promise<void>)>;\n    [ParameterType.GlobArray]: GlobString[];\n    [ParameterType.Flags]: Record<string, boolean>;\n\n    // Special.. avoid this if possible.\n    [ParameterType.Map]: unknown;\n}\n\nexport type DeclarationOptionToOptionType<T extends DeclarationOption> = T extends MapDeclarationOption<infer U> ? U :\n    T extends FlagsDeclarationOption<infer U> ? U :\n    ParameterTypeToOptionTypeMap[Exclude<T[\"type\"], undefined>];\n\nfunction toStringArray(value: unknown, option: DeclarationOption): string[] {\n    if (Array.isArray(value) && value.every(v => typeof v === \"string\")) {\n        return value;\n    } else if (typeof value === \"string\") {\n        return [value];\n    }\n\n    throw new Error(i18n.option_0_must_be_an_array_of_string(option.name));\n}\n\nfunction toStringOrFunctionArray(\n    value: unknown,\n    option: DeclarationOption,\n): Array<string | ((app: Application) => void | Promise<void>)> {\n    if (Array.isArray(value) && value.every(v => typeof v === \"string\" || typeof v === \"function\")) {\n        return value;\n    } else if (typeof value === \"string\") {\n        return [value];\n    }\n\n    throw new Error(i18n.option_0_must_be_an_array_of_string_or_functions(option.name));\n}\n\nconst converters: {\n    [K in ParameterType]: (\n        value: unknown,\n        option: DeclarationOption & { type: K },\n        configPath: NormalizedPath,\n        oldValue: unknown,\n    ) => ParameterTypeToOptionTypeMap[K];\n} = {\n    [ParameterType.String](value, option) {\n        // eslint-disable-next-line @typescript-eslint/no-base-to-string\n        const stringValue = value == null ? \"\" : String(value);\n        option.validate?.(stringValue);\n        return stringValue;\n    },\n    [ParameterType.Path](value, option, configPath) {\n        const stringValue =\n            // eslint-disable-next-line @typescript-eslint/no-base-to-string\n            value == null ? \"\" : resolve(configPath, String(value));\n        option.validate?.(stringValue);\n        return normalizePath(stringValue);\n    },\n    [ParameterType.UrlOrPath](value, option, configPath) {\n        // eslint-disable-next-line @typescript-eslint/no-base-to-string\n        const stringValue = value == null ? \"\" : String(value);\n\n        if (/^https?:\\/\\//i.test(stringValue)) {\n            option.validate?.(stringValue);\n            return stringValue;\n        }\n\n        const resolved = normalizePath(resolve(configPath, stringValue));\n        option.validate?.(resolved);\n        return resolved;\n    },\n    [ParameterType.Number](value, option) {\n        const numValue = parseInt(String(value), 10) || 0;\n        if (!valueIsWithinBounds(numValue, option.minValue, option.maxValue)) {\n            throw new Error(\n                getBoundsError(\n                    option.name,\n                    option.minValue,\n                    option.maxValue,\n                ),\n            );\n        }\n        option.validate?.(numValue);\n        return numValue;\n    },\n    [ParameterType.Boolean](value) {\n        return !!value;\n    },\n    [ParameterType.Array](value, option) {\n        const strArrValue = toStringArray(value, option);\n        option.validate?.(strArrValue);\n        return strArrValue;\n    },\n    [ParameterType.PathArray](value, option, configPath) {\n        const strArrValue = toStringArray(value, option);\n        const normalized = strArrValue.map((path) => normalizePath(resolve(configPath, path)));\n        option.validate?.(normalized);\n        return normalized;\n    },\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    [ParameterType.ModuleArray](value, option, configPath) {\n        const strArrValue = toStringArray(value, option);\n        const resolved = resolveModulePaths(strArrValue, configPath);\n        option.validate?.(resolved);\n        return resolved;\n    },\n    [ParameterType.PluginArray](value, option, configPath) {\n        const arrayValue = toStringOrFunctionArray(value, option);\n        const resolved = arrayValue.map(plugin =>\n            typeof plugin === \"function\" ? plugin : resolveModulePath(plugin, configPath)\n        );\n        return resolved;\n    },\n    [ParameterType.GlobArray](value, option, configPath) {\n        const toGlobString = (v: unknown) => {\n            const s = String(v);\n\n            // If the string tries to escape a character which isn't a special\n            // glob character, the user probably provided a Windows style path\n            // by accident due to shell completion, tell them to either remove\n            // the useless escape or switch to Unix path separators.\n            if (/\\\\[^?*()[\\]\\\\{}]/.test(s)) {\n                throw new Error(i18n.glob_0_should_use_posix_slash(s));\n            }\n\n            return createGlobString(configPath, s);\n        };\n        const strArrValue = toStringArray(value, option);\n        const globs = strArrValue.map(toGlobString);\n        option.validate?.(globs);\n        return globs;\n    },\n    [ParameterType.Map](value, option) {\n        const key = String(value);\n        if (option.map instanceof Map) {\n            if (option.map.has(key)) {\n                return option.map.get(key);\n            } else if ([...option.map.values()].includes(value)) {\n                return value;\n            }\n        } else if (key in option.map) {\n            if (isTsNumericEnum(option.map) && typeof value === \"number\") {\n                return value;\n            }\n            return option.map[key];\n        } else if (Object.values(option.map).includes(value)) {\n            return value;\n        }\n        throw new Error(getMapError(option.map, option.name));\n    },\n    [ParameterType.Mixed](value, option) {\n        option.validate?.(value);\n        return value;\n    },\n    [ParameterType.Object](value, option, _configPath, oldValue) {\n        option.validate?.(value);\n        if (typeof oldValue !== \"undefined\") {\n            value = { ...(oldValue as object), ...(value as object) };\n        }\n        return value;\n    },\n    [ParameterType.Flags](value, option) {\n        if (typeof value === \"boolean\") {\n            value = Object.fromEntries(\n                Object.keys(option.defaults).map((key) => [key, value]),\n            );\n        }\n\n        if (typeof value !== \"object\" || value == null) {\n            throw new Error(\n                i18n.expected_object_with_flag_values_for_0(option.name),\n            );\n        }\n        const obj = { ...value } as Record<string, unknown>;\n\n        for (const key of Object.keys(obj)) {\n            if (!Object.prototype.hasOwnProperty.call(option.defaults, key)) {\n                throw new Error(\n                    i18n.flag_0_is_not_valid_for_1_expected_2(\n                        key,\n                        option.name,\n                        Object.keys(option.defaults).join(\", \"),\n                    ),\n                );\n            }\n\n            if (typeof obj[key] !== \"boolean\") {\n                // Explicit null/undefined, switch to default.\n                if (obj[key] == null) {\n                    obj[key] = option.defaults[key];\n                } else {\n                    throw new Error(\n                        i18n.flag_values_for_0_must_be_booleans(option.name),\n                    );\n                }\n            }\n        }\n        return obj as Record<string, boolean>;\n    },\n};\n\n/**\n * The default conversion function used by the Options container. Readers may\n * re-use this conversion function or implement their own. The arguments reader\n * implements its own since 'false' should not be converted to true for a boolean option.\n * @param value The value to convert.\n * @param option The option for which the value should be converted.\n * @returns The result of the conversion. Might be the value or an error.\n */\nexport function convert(\n    value: unknown,\n    option: DeclarationOption,\n    configPath: string,\n    oldValue?: unknown,\n): unknown {\n    const _converters = converters as Record<\n        ParameterType,\n        (\n            v: unknown,\n            o: DeclarationOption,\n            c: string,\n            ov: unknown,\n        ) => unknown\n    >;\n    return _converters[option.type ?? ParameterType.String](\n        value,\n        option,\n        configPath,\n        oldValue,\n    );\n}\n\nconst defaultGetters: {\n    [K in ParameterType]: (\n        option: DeclarationOption & { type: K },\n    ) => ParameterTypeToOptionTypeMap[K];\n} = {\n    [ParameterType.String](option) {\n        return option.defaultValue ?? \"\";\n    },\n    [ParameterType.Path](option) {\n        const defaultStr = option.defaultValue ?? \"\";\n        if (defaultStr == \"\") {\n            return \"\";\n        }\n        return normalizePath(\n            isAbsolute(defaultStr)\n                ? defaultStr\n                : join(process.cwd(), defaultStr),\n        );\n    },\n    [ParameterType.UrlOrPath](option) {\n        const defaultStr = option.defaultValue ?? \"\";\n        if (defaultStr == \"\") {\n            return \"\";\n        }\n        if (/^https?:\\/\\//i.test(defaultStr)) {\n            return defaultStr;\n        }\n        return isAbsolute(defaultStr)\n            ? defaultStr\n            : join(process.cwd(), defaultStr);\n    },\n    [ParameterType.Number](option) {\n        return option.defaultValue ?? 0;\n    },\n    [ParameterType.Boolean](option) {\n        return option.defaultValue ?? false;\n    },\n    [ParameterType.Map](option) {\n        return option.defaultValue;\n    },\n    [ParameterType.Mixed](option) {\n        return option.defaultValue;\n    },\n    [ParameterType.Object](option) {\n        return option.defaultValue;\n    },\n    [ParameterType.Array](option) {\n        return option.defaultValue?.slice() ?? [];\n    },\n    [ParameterType.PathArray](option) {\n        return (\n            option.defaultValue?.map((value) => normalizePath(resolve(process.cwd(), value))) ?? []\n        );\n    },\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    [ParameterType.ModuleArray](option) {\n        if (option.defaultValue) {\n            return resolveModulePaths(option.defaultValue, process.cwd());\n        }\n        return [];\n    },\n    [ParameterType.PluginArray](option) {\n        if (option.defaultValue) {\n            return resolveModulePaths(option.defaultValue, process.cwd());\n        }\n        return [];\n    },\n    [ParameterType.GlobArray](option) {\n        return (option.defaultValue ?? []).map(g => createGlobString(normalizePath(process.cwd()), g));\n    },\n    [ParameterType.Flags](option) {\n        return { ...option.defaults };\n    },\n};\n\nexport function getDefaultValue(option: DeclarationOption) {\n    const getters = defaultGetters as Record<\n        ParameterType,\n        (o: DeclarationOption) => unknown\n    >;\n    return getters[option.type ?? ParameterType.String](option);\n}\n\nfunction resolveModulePaths(modules: readonly string[], configPath: string): NormalizedPathOrModule[] {\n    return modules.map(path => resolveModulePath(path, configPath));\n}\n\nfunction resolveModulePath(path: string, configPath: string): NormalizedPathOrModule {\n    if (path.startsWith(\".\")) {\n        return normalizePath(resolve(configPath, path));\n    }\n    return normalizePath(path);\n}\n\nfunction isTsNumericEnum(map: Record<string, any>) {\n    return Object.values(map).every((key) => map[map[key]] === key);\n}\n\n/**\n * Returns an error message for a map option, indicating that a given value was not one of the values within the map.\n * @param map The values for the option.\n * @param name The name of the option.\n * @returns The error message.\n */\nfunction getMapError(\n    map: MapDeclarationOption<unknown>[\"map\"],\n    name: string,\n): TranslatedString {\n    let keys = map instanceof Map ? [...map.keys()] : Object.keys(map);\n\n    // If the map is a TS numeric enum we need to filter out the numeric keys.\n    // TS numeric enums have the property that every key maps to a value, which maps back to that key.\n    if (!(map instanceof Map) && isTsNumericEnum(map)) {\n        // This works because TS enum keys may not be numeric.\n        keys = keys.filter((key) => Number.isNaN(parseInt(key, 10)));\n    }\n\n    return i18n.option_0_must_be_one_of_1(name, keys.join(\", \"));\n}\n\n/**\n * Returns an error message for a value that is out of bounds of the given min and/or max values.\n * @param name The name of the thing the value represents.\n * @param minValue The lower bound of the range of allowed values.\n * @param maxValue The upper bound of the range of allowed values.\n * @returns The error message.\n */\nfunction getBoundsError(\n    name: string,\n    minValue?: number,\n    maxValue?: number,\n): TranslatedString {\n    if (isFiniteNumber(minValue) && isFiniteNumber(maxValue)) {\n        return i18n.option_0_must_be_between_1_and_2(\n            name,\n            String(minValue),\n            String(maxValue),\n        );\n    } else if (isFiniteNumber(minValue)) {\n        return i18n.option_0_must_be_equal_to_or_greater_than_1(\n            name,\n            String(minValue),\n        );\n    } else {\n        return i18n.option_0_must_be_less_than_or_equal_to_1(\n            name,\n            String(maxValue),\n        );\n    }\n}\n\n/**\n * Checks if the given value is a finite number.\n * @param value The value being checked.\n * @returns True, if the value is a finite number, otherwise false.\n */\nfunction isFiniteNumber(value: unknown): value is number {\n    return Number.isFinite(value);\n}\n\n/**\n * Checks if a value is between the bounds of the given min and/or max values.\n * @param value The value being checked.\n * @param minValue The lower bound of the range of allowed values.\n * @param maxValue The upper bound of the range of allowed values.\n * @returns True, if the value is within the given bounds, otherwise false.\n */\nfunction valueIsWithinBounds(\n    value: number,\n    minValue?: number,\n    maxValue?: number,\n): boolean {\n    if (isFiniteNumber(minValue) && isFiniteNumber(maxValue)) {\n        return minValue <= value && value <= maxValue;\n    } else if (isFiniteNumber(minValue)) {\n        return minValue <= value;\n    } else if (isFiniteNumber(maxValue)) {\n        return value <= maxValue;\n    } else {\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/options/defaults.ts",
    "content": "/**\n * Defaults values for TypeDoc options\n * @module\n */\nimport type { BundledLanguage } from \"@gerrit0/mini-shiki\";\nimport * as TagDefaults from \"./tsdoc-defaults.js\";\nimport type { EnumKeys, TagString } from \"#utils\";\nimport type { ReflectionKind } from \"../../models/index.js\";\n\nexport const excludeNotDocumentedKinds: readonly EnumKeys<\n    typeof ReflectionKind\n>[] = [\n    \"Module\",\n    \"Namespace\",\n    \"Enum\",\n    // Not including enum member here by default\n    \"Variable\",\n    \"Function\",\n    \"Class\",\n    \"Interface\",\n    \"Constructor\",\n    \"Property\",\n    \"Method\",\n    \"CallSignature\",\n    \"IndexSignature\",\n    \"ConstructorSignature\",\n    \"Accessor\",\n    \"GetSignature\",\n    \"SetSignature\",\n    \"TypeAlias\",\n    \"Reference\",\n];\n\nexport const excludeTags: readonly TagString[] = [\n    \"@override\",\n    \"@virtual\",\n    \"@privateRemarks\",\n    \"@satisfies\",\n    \"@overload\",\n    \"@inline\",\n    \"@inlineType\",\n];\n\nexport const blockTags: readonly TagString[] = TagDefaults.blockTags;\nexport const inlineTags: readonly TagString[] = TagDefaults.inlineTags;\nexport const modifierTags: readonly TagString[] = TagDefaults.modifierTags;\n\nexport const cascadedModifierTags: readonly TagString[] = [\n    \"@alpha\",\n    \"@beta\",\n    \"@experimental\",\n];\n\nexport const preservedTypeAnnotationTags: readonly TagString[] = [];\n\nexport const notRenderedTags: readonly TagString[] = [\n    \"@showCategories\",\n    \"@showGroups\",\n    \"@hideCategories\",\n    \"@hideGroups\",\n    \"@disableGroups\",\n    \"@expand\",\n    \"@preventExpand\",\n    \"@expandType\",\n    \"@summary\",\n    \"@group\",\n    \"@groupDescription\",\n    \"@category\",\n    \"@categoryDescription\",\n];\n\nexport const highlightLanguages: readonly BundledLanguage[] = [\n    \"bash\",\n    \"console\",\n    \"css\",\n    \"html\",\n    \"javascript\",\n    \"json\",\n    \"jsonc\",\n    \"json5\",\n    \"yaml\",\n    \"tsx\",\n    \"typescript\",\n];\n\nexport const ignoredHighlightLanguages: readonly string[] = [];\n\nexport const sort: readonly string[] = [\n    \"kind\",\n    \"instance-first\",\n    \"alphabetical-ignoring-documents\",\n];\n\nexport const kindSortOrder: readonly EnumKeys<typeof ReflectionKind>[] = [\n    \"Document\",\n    \"Project\",\n    \"Module\",\n    \"Namespace\",\n    \"Enum\",\n    \"EnumMember\",\n    \"Class\",\n    \"Interface\",\n    \"TypeAlias\",\n\n    \"Constructor\",\n    \"Property\",\n    \"Variable\",\n    \"Function\",\n    \"Accessor\",\n    \"Method\",\n\n    \"Reference\",\n];\n\nexport const requiredToBeDocumented: readonly EnumKeys<\n    typeof ReflectionKind\n>[] = [\n    \"Enum\",\n    \"EnumMember\",\n    \"Variable\",\n    \"Function\",\n    \"Class\",\n    \"Interface\",\n    \"Property\",\n    \"Method\",\n    \"Accessor\",\n    \"TypeAlias\",\n];\n"
  },
  {
    "path": "src/lib/utils/options/help.ts",
    "content": "import type { Options } from \"./options.js\";\nimport { type DeclarationOption, ParameterHint, ParameterType, type StringDeclarationOption } from \"./declaration.js\";\nimport { getSupportedLanguages, getSupportedThemes } from \"../highlighter.js\";\n\nexport interface ParameterHelp {\n    names: string[];\n    helps: string[];\n    margin: number;\n}\n\nfunction hasHint(\n    parameter: DeclarationOption,\n): parameter is StringDeclarationOption & { hint: ParameterHint } {\n    return (\n        (parameter.type ?? ParameterType.String) === ParameterType.String &&\n        \"hint\" in parameter\n    );\n}\n\n/**\n * Prepare parameter information for the {@link toString} method.\n *\n * @param scope  The scope of the parameters whose help should be returned.\n * @returns The columns and lines for the help of the requested parameters.\n */\nfunction getParameterHelp(\n    options: Options,\n): ParameterHelp {\n    const parameters = options.getDeclarations();\n    parameters.sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" }));\n\n    const names: string[] = [];\n    const helps: string[] = [];\n    let margin = 0;\n\n    for (const parameter of parameters) {\n        if (!parameter.help || parameter.configFileOnly) {\n            continue;\n        }\n\n        let name = \" --\" + parameter.name;\n        if (hasHint(parameter)) {\n            name += \" \" + ParameterHint[parameter.hint].toUpperCase();\n        }\n\n        names.push(name);\n        helps.push(\n            typeof parameter.help === \"string\"\n                ? parameter.help\n                : parameter.help(),\n        );\n        margin = Math.max(name.length, margin);\n    }\n\n    return { names, helps, margin };\n}\n\nfunction toEvenColumns(values: string[], maxLineWidth: number) {\n    const columnWidth = values.reduce((acc, val) => Math.max(acc, val.length), 0) + 2;\n\n    const numColumns = Math.max(1, Math.floor(maxLineWidth / columnWidth));\n    let line = \"\";\n    const out: string[] = [];\n\n    for (let i = 0; i < values.length; ++i) {\n        if (i !== 0 && i % numColumns === 0) {\n            out.push(line);\n            line = \"\";\n        }\n        line += values[i].padEnd(columnWidth);\n    }\n    if (line != \"\") {\n        out.push(line);\n    }\n\n    return out;\n}\n\nexport function getOptionsHelp(\n    options: Options,\n): string {\n    const output = [\"typedoc path/to/entry.ts\", \"\", \"Options:\"];\n\n    const columns = getParameterHelp(options);\n    for (let i = 0; i < columns.names.length; i++) {\n        const usage = columns.names[i];\n        const description = columns.helps[i];\n        output.push(usage.padEnd(columns.margin + 2) + description);\n    }\n\n    output.push(\n        \"\",\n        \"Supported highlighting languages:\",\n        ...toEvenColumns(getSupportedLanguages(), 80),\n    );\n\n    output.push(\n        \"\",\n        \"Supported highlighting themes:\",\n        ...toEvenColumns(getSupportedThemes(), 80),\n    );\n\n    return output.join(\"\\n\");\n}\n"
  },
  {
    "path": "src/lib/utils/options/index.ts",
    "content": "export { CommentStyle, EmitStrategy, ParameterHint, ParameterType } from \"./declaration.js\";\nexport { Option, Options } from \"./options.js\";\nexport type { OptionsReader } from \"./options.js\";\nexport { ArgumentsReader, PackageJsonReader, TSConfigReader, TypeDocReader } from \"./readers/index.js\";\n\nexport type {\n    ArrayDeclarationOption,\n    BooleanDeclarationOption,\n    DeclarationOption,\n    DeclarationOptionBase,\n    DeclarationOptionToOptionType,\n    FlagsDeclarationOption,\n    GlobArrayDeclarationOption,\n    JsDocCompatibility,\n    KeyToDeclaration,\n    ManuallyValidatedOption,\n    MapDeclarationOption,\n    MixedDeclarationOption,\n    NumberDeclarationOption,\n    ObjectDeclarationOption,\n    OutputSpecification,\n    ParameterTypeToOptionTypeMap,\n    StringDeclarationOption,\n    TypeDocOptionMap,\n    TypeDocOptions,\n    TypeDocOptionValues,\n    TypeDocPackageOptions,\n    ValidationOptions,\n} from \"./declaration.js\";\n\nexport * as OptionDefaults from \"./defaults.js\";\n"
  },
  {
    "path": "src/lib/utils/options/options.ts",
    "content": "import ts from \"typescript\";\nimport { resolve } from \"path\";\nimport { ParameterType } from \"./declaration.js\";\nimport type { OutputSpecification } from \"../index.js\";\nimport { normalizePath } from \"../paths.js\";\nimport type { Application } from \"../../../index.js\";\nimport {\n    convert,\n    type DeclarationOption,\n    getDefaultValue,\n    type KeyToDeclaration,\n    type TypeDocOptionMap,\n    type TypeDocOptions,\n    type TypeDocOptionValues,\n} from \"./declaration.js\";\nimport { addTypeDocOptions } from \"./sources/index.js\";\nimport { getOptionsHelp } from \"./help.js\";\nimport { getSimilarValues, i18n, insertOrderSorted, type Logger, type NeverIfInternal, unique } from \"#utils\";\n\n/**\n * Describes an option reader that discovers user configuration and converts it to the\n * TypeDoc format.\n */\nexport interface OptionsReader {\n    /**\n     * Readers will be processed according to their orders.\n     * A higher order indicates that the reader should be called *later*.\n     *\n     * Note that to preserve expected behavior, the argv reader must have both the lowest\n     * order so that it may set the location of config files used by other readers and\n     * the highest order so that it can override settings from lower order readers.\n     */\n    readonly order: number;\n\n    /**\n     * The name of this reader so that it may be removed by plugins without the plugin\n     * accessing the instance performing the read. Multiple readers may have the same\n     * name.\n     */\n    readonly name: string;\n\n    /**\n     * Flag to indicate that this reader should be included in sub-options objects created\n     * to read options for packages mode.\n     */\n    readonly supportsPackages: boolean;\n\n    /**\n     * Read options from the reader's source and place them in the options parameter.\n     * Options without a declared name may be treated as if they were declared with type\n     * {@link ParameterType.Mixed}. Options which have been declared must be converted to the\n     * correct type. As an alternative to doing this conversion in the reader,\n     * the reader may use {@link Options.setValue}, which will correctly convert values.\n     * @param container the options container that provides declarations\n     * @param logger logger to be used to report errors\n     * @param cwd the directory which should be treated as the current working directory for option file discovery\n     * @param usedFile a callback to track files that were read or whose existence was checked, for purposes of restarting a build when watching files\n     */\n    read(\n        container: Options,\n        logger: Logger,\n        cwd: string,\n        usedFile: (file: string) => void,\n    ): void | Promise<void>;\n}\n\nconst optionSnapshots = new WeakMap<\n    { __optionSnapshot: never },\n    {\n        values: Record<string, unknown>;\n        set: Set<string>;\n    }\n>();\n\n/**\n * Maintains a collection of option declarations split into TypeDoc options\n * and TypeScript options. Ensures options are of the correct type for calling\n * code.\n *\n * ### Option Discovery\n *\n * Since plugins commonly add custom options, and TypeDoc does not permit options which have\n * not been declared to be set, options must be read twice. The first time options are read,\n * a noop logger is passed so that any errors are ignored. Then, after loading plugins, options\n * are read again, this time with the logger specified by the application.\n *\n * Options are read in a specific order.\n * 1. argv (0) - Must be read first since it should change the files read when\n *    passing --options or --tsconfig.\n * 2. typedoc-json (100) - Read next so that it can specify the tsconfig.json file to read.\n * 3. tsconfig-json (200) - Last config file reader, cannot specify the typedoc.json file to read.\n * 4. argv (300) - Read argv again since any options set there should override those set in config\n *    files.\n *\n * @group None\n * @summary Contains all of TypeDoc's option declarations & values\n */\nexport class Options {\n    private _readers: OptionsReader[] = [];\n    private _declarations = new Map<string, Readonly<DeclarationOption>>();\n    private _values: Record<string, unknown> = {};\n    private _setOptions = new Set<string>();\n    private _compilerOptions: ts.CompilerOptions = {};\n    private _fileNames: readonly string[] = [];\n    private _projectReferences: readonly ts.ProjectReference[] = [];\n\n    /**\n     * In packages mode, the directory of the package being converted.\n     */\n    packageDir?: string;\n\n    constructor() {\n        addTypeDocOptions(this);\n    }\n\n    /**\n     * Clones the options, intended for use in packages mode.\n     */\n    copyForPackage(packageDir: string): Options {\n        const options = new Options();\n        options.packageDir = packageDir;\n\n        options._readers = this._readers.filter(\n            (reader) => reader.supportsPackages,\n        );\n        options._declarations = new Map(this._declarations);\n        options.reset();\n\n        for (\n            const [key, val] of Object.entries(\n                this.getValue(\"packageOptions\"),\n            )\n        ) {\n            options.setValue(key as any, val, packageDir);\n        }\n\n        return options;\n    }\n\n    /**\n     * Take a snapshot of option values now, used in tests only.\n     * @internal\n     */\n    snapshot() {\n        const key = {} as { __optionSnapshot: never };\n\n        optionSnapshots.set(key, {\n            values: { ...this._values },\n            set: new Set(this._setOptions),\n        });\n\n        return key;\n    }\n\n    /**\n     * Take a snapshot of option values now, used in tests only.\n     * @internal\n     */\n    restore(snapshot: { __optionSnapshot: never }) {\n        const data = optionSnapshots.get(snapshot)!;\n        this._values = { ...data.values };\n        this._setOptions = new Set(data.set);\n    }\n\n    /**\n     * Resets the option bag to all default values.\n     * If a name is provided, will only reset that name.\n     */\n    reset(name?: keyof TypeDocOptions): void;\n    reset(name?: NeverIfInternal<string>): void;\n    reset(name?: string): void {\n        if (name != null) {\n            const declaration = this.getDeclaration(name);\n            if (!declaration) {\n                throw new Error(\n                    `Cannot reset an option (${name}) which has not been declared.`,\n                );\n            }\n\n            this._values[declaration.name] = getDefaultValue(declaration);\n            this._setOptions.delete(declaration.name);\n        } else {\n            for (const declaration of this.getDeclarations()) {\n                this._values[declaration.name] = getDefaultValue(declaration);\n            }\n            this._setOptions.clear();\n            this._compilerOptions = {};\n            this._fileNames = [];\n        }\n    }\n\n    /**\n     * Adds an option reader that will be used to read configuration values\n     * from the command line, configuration files, or other locations.\n     * @param reader\n     */\n    addReader(reader: OptionsReader): void {\n        insertOrderSorted(this._readers, reader);\n    }\n\n    async read(\n        logger: Logger,\n        cwd = process.cwd(),\n        usedFile: (path: string) => void = () => {},\n    ) {\n        for (const reader of this._readers) {\n            await reader.read(this, logger, cwd, usedFile);\n        }\n    }\n\n    /**\n     * Adds an option declaration to the container with extra type checking to ensure that\n     * the runtime type is consistent with the declared type.\n     * @param declaration The option declaration that should be added.\n     */\n    addDeclaration<K extends keyof TypeDocOptions>(\n        declaration: { name: K } & KeyToDeclaration<K>,\n    ): void;\n\n    /**\n     * Adds an option declaration to the container.\n     * @param declaration The option declaration that should be added.\n     */\n    addDeclaration(\n        declaration: NeverIfInternal<Readonly<DeclarationOption>>,\n    ): void;\n    addDeclaration(declaration: Readonly<DeclarationOption>): void {\n        const decl = this.getDeclaration(declaration.name);\n        if (decl) {\n            throw new Error(\n                `The option ${declaration.name} has already been registered`,\n            );\n        } else {\n            this._declarations.set(declaration.name, declaration);\n        }\n\n        this._values[declaration.name] = getDefaultValue(declaration);\n    }\n\n    /**\n     * Gets a declaration by one of its names.\n     * @param name\n     */\n    getDeclaration(name: string): Readonly<DeclarationOption> | undefined {\n        return this._declarations.get(name);\n    }\n\n    /**\n     * Gets all declared options.\n     */\n    getDeclarations(): Readonly<DeclarationOption>[] {\n        return unique(this._declarations.values());\n    }\n\n    /**\n     * Checks if the given option's value is deeply strict equal to the default.\n     * @param name\n     */\n    isSet(name: keyof TypeDocOptions): boolean;\n    isSet(name: NeverIfInternal<string>): boolean;\n    isSet(name: string): boolean {\n        if (!this._declarations.has(name)) {\n            throw new Error(\n                `Tried to check if an undefined option (${name}) was set`,\n            );\n        }\n        return this._setOptions.has(name);\n    }\n\n    /**\n     * Gets all of the TypeDoc option values defined in this option container.\n     */\n    getRawValues(): Readonly<Partial<TypeDocOptionValues>> {\n        return this._values;\n    }\n\n    /**\n     * Gets a value for the given option key, throwing if the option has not been declared.\n     * @param name\n     */\n    getValue<K extends keyof TypeDocOptions>(name: K): TypeDocOptionValues[K];\n    getValue(name: NeverIfInternal<string>): unknown;\n    getValue(name: string): unknown {\n        const declaration = this.getDeclaration(name);\n        if (!declaration) {\n            const nearNames = this.getSimilarOptions(name);\n            throw new Error(\n                i18n.unknown_option_0_you_may_have_meant_1(\n                    name,\n                    nearNames.join(\"\\n\\t\"),\n                ),\n            );\n        }\n\n        return this._values[declaration.name];\n    }\n\n    /**\n     * Sets the given declared option. Throws if setting the option fails.\n     * @param name\n     * @param value\n     * @param configPath the directory to resolve Path type values against\n     */\n    setValue<K extends keyof TypeDocOptions>(\n        name: K,\n        value: Exclude<TypeDocOptions[K], undefined>,\n        configPath?: string,\n    ): void;\n    setValue(\n        name: NeverIfInternal<string>,\n        value: NeverIfInternal<unknown>,\n        configPath?: NeverIfInternal<string>,\n    ): void;\n    setValue(name: string, value: unknown, configPath?: string): void {\n        const declaration = this.getDeclaration(name);\n        if (!declaration) {\n            const nearNames = this.getSimilarOptions(name);\n            throw new Error(\n                i18n.unknown_option_0_you_may_have_meant_1(\n                    name,\n                    nearNames.join(\"\\n\\t\"),\n                ),\n            );\n        }\n\n        let oldValue = this._values[declaration.name];\n        if (typeof oldValue === \"undefined\") {\n            oldValue = getDefaultValue(declaration);\n        }\n\n        const converted = convert(\n            value,\n            declaration,\n            configPath ?? process.cwd(),\n            oldValue,\n        );\n\n        if (declaration.type === ParameterType.Flags) {\n            this._values[declaration.name] = Object.assign(\n                {},\n                this._values[declaration.name],\n                converted,\n            );\n        } else if (declaration.name === \"outputs\") {\n            // This is very unfortunate... there's probably some smarter way to define options\n            // so that this can be done intelligently via the convert function.\n            this._values[declaration.name] = (\n                converted as OutputSpecification[]\n            ).map((c) => {\n                return {\n                    ...c,\n                    path: normalizePath(resolve(configPath ?? process.cwd(), c.path)),\n                };\n            });\n        } else {\n            this._values[declaration.name] = converted;\n        }\n        this._setOptions.add(name);\n    }\n\n    /**\n     * Gets the set compiler options.\n     */\n    getCompilerOptions(logger: Logger): ts.CompilerOptions {\n        return this.fixCompilerOptions(this._compilerOptions, logger);\n    }\n\n    /** @internal */\n    fixCompilerOptions(\n        options: Readonly<ts.CompilerOptions>,\n        logger: Logger,\n    ): ts.CompilerOptions {\n        const overrides = this.getValue(\"compilerOptions\");\n        const result = { ...options };\n\n        if (overrides) {\n            const tsOptions = ts.convertCompilerOptionsFromJson(overrides, \".\", \"typedoc-overrides.json\");\n\n            if (tsOptions.errors.length) {\n                for (const error of tsOptions.errors) {\n                    logger.error(\n                        i18n.failed_to_apply_compilerOptions_overrides_0(\n                            ts.flattenDiagnosticMessageText(error.messageText, \"\\n\"),\n                        ),\n                    );\n                }\n            } else {\n                for (const key in overrides) {\n                    result[key] = tsOptions.options[key];\n                }\n            }\n        }\n\n        if (this.getValue(\"emit\") !== \"both\") {\n            result.noEmit = true;\n            delete result.emitDeclarationOnly;\n        }\n\n        return result;\n    }\n\n    /**\n     * Gets the file names discovered through reading a tsconfig file.\n     */\n    getFileNames(): readonly string[] {\n        return this._fileNames;\n    }\n\n    /**\n     * Gets the project references - used in solution style tsconfig setups.\n     */\n    getProjectReferences(): readonly ts.ProjectReference[] {\n        return this._projectReferences;\n    }\n\n    /**\n     * Sets the compiler options that will be used to get a TS program.\n     */\n    setCompilerOptions(\n        fileNames: readonly string[],\n        options: ts.CompilerOptions,\n        projectReferences: readonly ts.ProjectReference[] | undefined,\n    ) {\n        // We do this here instead of in the tsconfig reader so that API consumers which\n        // supply a program to `Converter.convert` instead of letting TypeDoc create one\n        // can just set the compiler options, and not need to know about this mapping.\n        // It feels a bit like a hack... but it's better to have it here than to put it\n        // in Application or Converter.\n        if (options.stripInternal && !this.isSet(\"excludeInternal\")) {\n            this.setValue(\"excludeInternal\", true);\n        }\n        this._fileNames = fileNames;\n        this._compilerOptions = { ...options };\n        this._projectReferences = projectReferences ?? [];\n    }\n\n    /**\n     * Discover similar option names to the given name, for use in error reporting.\n     */\n    getSimilarOptions(missingName: string): string[] {\n        return getSimilarValues(this._declarations.keys(), missingName);\n    }\n\n    /**\n     * Get the help message to be displayed to the user if `--help` is passed.\n     */\n    getHelp() {\n        return getOptionsHelp(this);\n    }\n}\n\n/**\n * Binds an option to an accessor. Does not register the option.\n *\n * Note: This is a standard ES decorator. It will not work with pre-TS 5.0 experimental decorators enabled.\n */\nexport function Option<K extends keyof TypeDocOptionMap>(name: K) {\n    return (\n        _: unknown,\n        _context: ClassAccessorDecoratorContext<\n            { application: Application } | { options: Options },\n            TypeDocOptionValues[K]\n        >,\n    ) => {\n        return {\n            get(this: { application: Application } | { options: Options }) {\n                const options = \"options\" in this ? this.options : this.application.options;\n                return options.getValue(name);\n            },\n            set(_value: never) {\n                throw new Error(\n                    `Options may not be set via the Option decorator when setting ${name}`,\n                );\n            },\n        };\n    };\n}\n"
  },
  {
    "path": "src/lib/utils/options/readers/arguments.ts",
    "content": "import { ok } from \"assert\";\nimport type { Options, OptionsReader } from \"../index.js\";\nimport { ParameterType } from \"../declaration.js\";\nimport { i18n, type Logger, type TranslatedString } from \"#utils\";\n\nconst ARRAY_OPTION_TYPES = new Set<ParameterType | undefined>([\n    ParameterType.Array,\n    ParameterType.PathArray,\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    ParameterType.ModuleArray,\n    ParameterType.PluginArray,\n    ParameterType.GlobArray,\n]);\n\n/**\n * Obtains option values from command-line arguments\n */\nexport class ArgumentsReader implements OptionsReader {\n    readonly name = \"arguments\";\n    readonly order: number;\n    readonly supportsPackages = false;\n    private args: string[];\n    private skipErrorReporting = false;\n\n    constructor(priority: number, args = process.argv.slice(2)) {\n        this.order = priority;\n        this.args = args;\n    }\n\n    ignoreErrors() {\n        this.skipErrorReporting = true;\n        return this;\n    }\n\n    read(container: Options, logger: Logger): void {\n        // Make container's type more lax, we do the appropriate checks manually.\n        const options = container as Options & {\n            setValue(name: string, value: unknown): void;\n            getValue(name: string): unknown;\n        };\n        const seen = new Set<string>();\n        let index = 0;\n\n        const trySet = (name: string, value: unknown) => {\n            try {\n                options.setValue(name, value);\n            } catch (err) {\n                ok(err instanceof Error);\n                if (!this.skipErrorReporting) {\n                    logger.error(err.message as TranslatedString);\n                }\n            }\n        };\n\n        while (index < this.args.length) {\n            const name = this.args[index];\n            const decl = name.startsWith(\"-\")\n                ? (index++, options.getDeclaration(name.replace(/^--?/, \"\")))\n                : options.getDeclaration(\"entryPoints\");\n\n            if (decl) {\n                if (decl.configFileOnly) {\n                    if (!this.skipErrorReporting) {\n                        logger.error(\n                            i18n.option_0_can_only_be_specified_by_config_file(\n                                decl.name,\n                            ),\n                        );\n                    }\n                    continue;\n                }\n\n                if (seen.has(decl.name) && ARRAY_OPTION_TYPES.has(decl.type)) {\n                    trySet(\n                        decl.name,\n                        (options.getValue(decl.name) as string[]).concat(\n                            this.args[index],\n                        ),\n                    );\n                } else if (\n                    decl.type === ParameterType.Boolean ||\n                    decl.type === ParameterType.Flags\n                ) {\n                    const value = String(this.args.at(index)).toLowerCase();\n\n                    if (value === \"true\" || value === \"false\") {\n                        trySet(decl.name, value === \"true\");\n                    } else {\n                        trySet(decl.name, true);\n                        // Bool option didn't consume the next argument as expected.\n                        index--;\n                    }\n                } else {\n                    if (index === this.args.length) {\n                        // Only boolean values have optional values.\n                        if (!this.skipErrorReporting) {\n                            logger.warn(\n                                i18n.option_0_expected_a_value_but_none_provided(\n                                    decl.name,\n                                ),\n                            );\n                        }\n                    }\n                    trySet(decl.name, this.args[index]);\n                }\n                seen.add(decl.name);\n                index++;\n                continue;\n            }\n\n            if (name.includes(\".\")) {\n                const actualName = name.split(\".\")[0].replace(/^--?/, \"\");\n                const decl = options.getDeclaration(actualName);\n\n                if (decl && decl.type === ParameterType.Flags) {\n                    const flagName = name.split(\".\", 2)[1];\n                    const value = String(this.args.at(index)).toLowerCase();\n\n                    if (value === \"true\" || value === \"false\") {\n                        trySet(decl.name, { [flagName]: value === \"true\" });\n                    } else {\n                        trySet(decl.name, { [flagName]: true });\n                        // Bool option didn't consume the next argument as expected.\n                        index--;\n                    }\n\n                    index++;\n                    continue;\n                }\n            }\n\n            if (!this.skipErrorReporting) {\n                logger.error(\n                    i18n.unknown_option_0_may_have_meant_1(\n                        name,\n                        options.getSimilarOptions(name).join(\"\\n\\t\"),\n                    ),\n                );\n            }\n            index++;\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/options/readers/index.ts",
    "content": "export { ArgumentsReader } from \"./arguments.js\";\nexport { PackageJsonReader } from \"./package-json.js\";\nexport { TSConfigReader } from \"./tsconfig.js\";\nexport { TypeDocReader } from \"./typedoc.js\";\n"
  },
  {
    "path": "src/lib/utils/options/readers/package-json.ts",
    "content": "import type { OptionsReader } from \"../index.js\";\nimport type { Options } from \"../options.js\";\nimport { ok } from \"assert\";\nimport { nicePath } from \"../../paths.js\";\nimport { discoverPackageJson } from \"../../fs.js\";\nimport { dirname } from \"path\";\nimport { i18n, type Logger, type TranslatedString } from \"#utils\";\n\nexport class PackageJsonReader implements OptionsReader {\n    // Should run after the TypeDoc config reader but before the TS config\n    // reader, so that it can still specify a path to a `tsconfig.json` file.\n    order = 150;\n\n    supportsPackages = true;\n\n    name = \"package-json\";\n\n    read(\n        container: Options,\n        logger: Logger,\n        cwd: string,\n        usedFile: (path: string) => void,\n    ): void {\n        const result = discoverPackageJson(cwd, usedFile);\n\n        if (!result) {\n            return;\n        }\n\n        const { file, content } = result;\n\n        if (\"typedoc\" in content) {\n            logger.warn(i18n.typedoc_key_in_0_ignored(nicePath(file)));\n        }\n\n        const optsKey = \"typedocOptions\";\n        if (!(optsKey in content)) {\n            return;\n        }\n\n        const opts = content[optsKey];\n        if (opts === null || typeof opts !== \"object\") {\n            logger.error(\n                i18n.typedoc_options_must_be_object_in_0(nicePath(file)),\n            );\n            return;\n        }\n\n        for (const [opt, val] of Object.entries(opts)) {\n            try {\n                container.setValue(opt as never, val as never, dirname(file));\n            } catch (err) {\n                ok(err instanceof Error);\n                logger.error(err.message as TranslatedString);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/utils/options/readers/tsconfig.ts",
    "content": "import { dirname, join, resolve } from \"path\";\n\nimport ts from \"typescript\";\n\nimport type { Options, OptionsReader } from \"../options.js\";\nimport { isFile } from \"../../fs.js\";\nimport { ok } from \"assert\";\nimport { i18n, type Logger, type TagString, type TranslatedString, unique, Validation } from \"#utils\";\nimport { nicePath, normalizePath } from \"../../paths.js\";\nimport { createRequire } from \"module\";\nimport { tsdocBlockTags, tsdocInlineTags, tsdocModifierTags } from \"../tsdoc-defaults.js\";\nimport { findTsConfigFile, getTypeDocOptionsFromTsConfig, readTsConfig } from \"../../tsconfig.js\";\nimport { diagnostics } from \"../../loggers.js\";\n\nfunction isSupportForTags(obj: unknown): obj is Record<TagString, boolean | undefined> {\n    return (\n        Validation.validate({}, obj) &&\n        Object.entries(obj).every(([key, val]) => {\n            return (\n                /^@[a-zA-Z][a-zA-Z0-9]*$/.test(key) && typeof val === \"boolean\"\n            );\n        })\n    );\n}\n\nconst tsDocSchema = {\n    $schema: Validation.optional(String),\n    extends: Validation.optional([Array, String]),\n    noStandardTags: Validation.optional(Boolean),\n    tagDefinitions: Validation.optional([\n        Array,\n        {\n            tagName: Validation.isTagString,\n            syntaxKind: [\"inline\", \"block\", \"modifier\"] as const,\n            allowMultiple: Validation.optional(Boolean),\n            [Validation.additionalProperties]: false,\n        },\n    ]),\n    supportForTags: Validation.optional(isSupportForTags),\n\n    // The official parser has code to support for these two, but\n    // the schema doesn't allow them... just silently ignore them for now.\n    supportedHtmlElements: Validation.optional({}),\n    reportUnsupportedHtmlElements: Validation.optional(Boolean),\n\n    [Validation.additionalProperties]: false,\n} as const;\ntype TsDocSchema = Validation.Infer<typeof tsDocSchema>;\n\nexport class TSConfigReader implements OptionsReader {\n    /**\n     * Note: Runs after the {@link TypeDocReader}.\n     */\n    order = 200;\n\n    name = \"tsconfig-json\";\n\n    supportsPackages = true;\n\n    private seenTsdocPaths = new Set<string>();\n\n    read(\n        container: Options,\n        logger: Logger,\n        cwd: string,\n        usedFile?: (path: string) => void,\n    ): void {\n        const file = container.getValue(\"tsconfig\") || cwd;\n\n        let fileToRead = findTsConfigFile(file, usedFile);\n\n        if (!fileToRead) {\n            // If the user didn't give us this option, we shouldn't complain about not being able to find it.\n            if (container.isSet(\"tsconfig\")) {\n                logger.error(\n                    i18n.tsconfig_file_0_does_not_exist(nicePath(file)),\n                );\n            }\n            return;\n        }\n\n        fileToRead = normalizePath(resolve(fileToRead));\n        logger.verbose(`Reading tsconfig at ${nicePath(fileToRead)}`);\n        this.addTagsFromTsdocJson(container, logger, resolve(fileToRead));\n\n        const parsed = readTsConfig(fileToRead, logger);\n        if (!parsed) {\n            return;\n        }\n\n        diagnostics(logger, parsed.errors);\n        if (parsed.errors.length) {\n            return;\n        }\n\n        const typedocOptions = getTypeDocOptionsFromTsConfig(fileToRead);\n        if (typedocOptions.options) {\n            logger.error(i18n.tsconfig_file_specifies_options_file());\n            delete typedocOptions.options;\n        }\n        if (typedocOptions.tsconfig) {\n            logger.error(i18n.tsconfig_file_specifies_tsconfig_file());\n            delete typedocOptions.tsconfig;\n        }\n\n        container.setCompilerOptions(\n            parsed.fileNames,\n            parsed.options,\n            parsed.projectReferences,\n        );\n        for (const [key, val] of Object.entries(typedocOptions || {})) {\n            try {\n                // We catch the error, so can ignore the strict type checks\n                container.setValue(\n                    key as never,\n                    val as never,\n                    join(fileToRead, \"..\"),\n                );\n            } catch (error) {\n                ok(error instanceof Error);\n                logger.error(error.message as TranslatedString);\n            }\n        }\n    }\n\n    private addTagsFromTsdocJson(\n        container: Options,\n        logger: Logger,\n        tsconfig: string,\n    ) {\n        this.seenTsdocPaths.clear();\n        const tsdoc = join(dirname(tsconfig), \"tsdoc.json\");\n        if (!isFile(tsdoc)) {\n            return;\n        }\n\n        const overwritten = (\n            [\"blockTags\", \"inlineTags\", \"modifierTags\"] as const\n        ).filter((opt) => container.isSet(opt));\n        if (overwritten.length) {\n            logger.warn(\n                i18n.tags_0_defined_in_typedoc_json_overwritten_by_tsdoc_json(\n                    overwritten.join(\", \"),\n                ),\n            );\n        }\n\n        const config = this.readTsDoc(logger, tsdoc);\n        if (!config) return;\n\n        const supported = (tag: { tagName: TagString }) => {\n            return config.supportForTags\n                ? !!config.supportForTags[tag.tagName]\n                : true;\n        };\n\n        const blockTags: TagString[] = [];\n        const inlineTags: TagString[] = [];\n        const modifierTags: TagString[] = [];\n\n        if (!config.noStandardTags) {\n            blockTags.push(...tsdocBlockTags);\n            inlineTags.push(...tsdocInlineTags);\n            modifierTags.push(...tsdocModifierTags);\n        }\n\n        for (\n            const { tagName, syntaxKind } of config.tagDefinitions?.filter(\n                supported,\n            ) || []\n        ) {\n            const arr = {\n                block: blockTags,\n                inline: inlineTags,\n                modifier: modifierTags,\n            }[syntaxKind];\n            arr.push(tagName);\n        }\n\n        container.setValue(\"blockTags\", unique(blockTags));\n        container.setValue(\"inlineTags\", unique(inlineTags));\n        container.setValue(\"modifierTags\", unique(modifierTags));\n    }\n\n    private readTsDoc(logger: Logger, path: string): TsDocSchema | undefined {\n        if (this.seenTsdocPaths.has(path)) {\n            logger.error(\n                i18n.circular_reference_extends_0(nicePath(path)),\n            );\n            return;\n        }\n        this.seenTsdocPaths.add(path);\n\n        const { config, error } = ts.readConfigFile(\n            normalizePath(path),\n            ts.sys.readFile,\n        );\n\n        if (error) {\n            logger.error(i18n.failed_read_tsdoc_json_0(nicePath(path)));\n            return;\n        }\n\n        if (!Validation.validate(tsDocSchema, config)) {\n            logger.error(i18n.invalid_tsdoc_json_0(nicePath(path)));\n            return;\n        }\n\n        const workingConfig: TsDocSchema = {};\n\n        if (config.extends) {\n            const resolver = createRequire(path);\n            for (const extendedPath of config.extends) {\n                let resolvedPath: string;\n                try {\n                    resolvedPath = resolver.resolve(extendedPath);\n                } catch {\n                    logger.error(\n                        i18n.failed_resolve_0_to_file_in_1(\n                            extendedPath,\n                            nicePath(path),\n                        ),\n                    );\n                    return;\n                }\n                const parentConfig = this.readTsDoc(logger, resolvedPath);\n\n                if (!parentConfig) return;\n                mergeConfigs(parentConfig, workingConfig);\n            }\n        }\n\n        mergeConfigs(config, workingConfig);\n        return workingConfig;\n    }\n}\n\nfunction mergeConfigs(from: TsDocSchema, into: TsDocSchema) {\n    if (from.supportForTags) {\n        into.supportForTags ||= {};\n        Object.assign(into.supportForTags, from.supportForTags);\n    }\n    if (from.tagDefinitions) {\n        into.tagDefinitions ||= [];\n        into.tagDefinitions.push(...from.tagDefinitions);\n    }\n\n    into.noStandardTags = from.noStandardTags ?? into.noStandardTags;\n}\n"
  },
  {
    "path": "src/lib/utils/options/readers/typedoc.ts",
    "content": "import { dirname, join, resolve } from \"path\";\nimport * as FS from \"fs\";\nimport ts from \"typescript\";\n\nimport type { OptionsReader } from \"../options.js\";\nimport type { Options } from \"../options.js\";\nimport { ok } from \"assert\";\nimport { nicePath, normalizePath } from \"../../paths.js\";\nimport { isFile } from \"../../fs.js\";\nimport { createRequire } from \"module\";\nimport { pathToFileURL } from \"url\";\nimport { i18n, type Logger, type TranslatedString } from \"#utils\";\n\n/**\n * Obtains option values from typedoc.json\n */\nexport class TypeDocReader implements OptionsReader {\n    /**\n     * Should run before the tsconfig reader so that it can specify a tsconfig file to read.\n     */\n    order = 100;\n\n    name = \"typedoc-json\";\n\n    supportsPackages = true;\n\n    /**\n     * Read user configuration from a typedoc.json or typedoc.js configuration file.\n     */\n    async read(\n        container: Options,\n        logger: Logger,\n        cwd: string,\n        usedFile: (path: string) => void,\n    ): Promise<void> {\n        const path = container.getValue(\"options\") || cwd;\n        const file = this.findTypedocFile(path, usedFile);\n\n        if (!file) {\n            if (container.isSet(\"options\")) {\n                logger.error(\n                    i18n.options_file_0_does_not_exist(nicePath(path)),\n                );\n            }\n            return;\n        }\n\n        const seen = new Set<string>();\n        await this.readFile(file, container, logger, seen);\n    }\n\n    /**\n     * Read the given options file + any extended files.\n     * @param file\n     * @param container\n     * @param logger\n     */\n    private async readFile(\n        file: string,\n        container: Options & { setValue(key: string, value: unknown): void },\n        logger: Logger,\n        seen: Set<string>,\n    ) {\n        if (seen.has(file)) {\n            logger.error(\n                i18n.circular_reference_extends_0(nicePath(file)),\n            );\n            return;\n        }\n        seen.add(file);\n\n        let fileContent: any;\n        if (file.endsWith(\".json\") || file.endsWith(\".jsonc\")) {\n            const readResult = ts.readConfigFile(normalizePath(file), (path) => FS.readFileSync(path, \"utf-8\"));\n\n            if (readResult.error) {\n                logger.error(\n                    i18n.failed_read_options_file_0(nicePath(file)),\n                );\n                return;\n            } else {\n                fileContent = readResult.config;\n            }\n        } else {\n            try {\n                // On Windows, we need to ensure this path is a file path.\n                // Or we'll get ERR_UNSUPPORTED_ESM_URL_SCHEME\n                const esmPath = pathToFileURL(file).toString();\n                fileContent = await (await import(esmPath)).default;\n            } catch (error) {\n                logger.error(\n                    i18n.failed_read_options_file_0(nicePath(file)),\n                );\n                logger.error(\n                    String(\n                        error instanceof Error ? error.message : error,\n                    ) as TranslatedString,\n                );\n                return;\n            }\n        }\n\n        if (typeof fileContent !== \"object\" || !fileContent) {\n            logger.error(\n                i18n.failed_read_options_file_0(nicePath(file)),\n            );\n            return;\n        }\n\n        // clone option object to avoid of property changes in re-calling this file\n        const data = { ...fileContent };\n        delete data[\"$schema\"]; // Useful for better autocompletion, should not be read as a key.\n\n        if (\"extends\" in data) {\n            const resolver = createRequire(file);\n            const extended: string[] = getStringArray(data[\"extends\"]);\n            for (const extendedFile of extended) {\n                let resolvedParent: string;\n                try {\n                    resolvedParent = resolver.resolve(extendedFile);\n                } catch {\n                    logger.error(\n                        i18n.failed_resolve_0_to_file_in_1(\n                            extendedFile,\n                            nicePath(file),\n                        ),\n                    );\n                    continue;\n                }\n                await this.readFile(resolvedParent, container, logger, seen);\n            }\n            delete data[\"extends\"];\n        }\n\n        for (const [key, val] of Object.entries(data)) {\n            try {\n                container.setValue(\n                    key as never,\n                    val as never,\n                    resolve(dirname(file)),\n                );\n            } catch (error) {\n                ok(error instanceof Error);\n                logger.error(error.message as TranslatedString);\n            }\n        }\n    }\n\n    /**\n     * Search for the configuration file given path\n     *\n     * @param  path Path to the typedoc.(js|json) file. If path is a directory\n     *   typedoc file will be attempted to be found at the root of this path\n     * @returns the typedoc.(js|json) file path or undefined\n     */\n    private findTypedocFile(\n        path: string,\n        usedFile?: (path: string) => void,\n    ): string | undefined {\n        path = resolve(path);\n\n        return [\n            path,\n            join(path, \"typedoc.json\"),\n            join(path, \"typedoc.jsonc\"),\n            join(path, \"typedoc.config.js\"),\n            join(path, \"typedoc.config.cjs\"),\n            join(path, \"typedoc.config.mjs\"),\n            join(path, \"typedoc.js\"),\n            join(path, \"typedoc.cjs\"),\n            join(path, \"typedoc.mjs\"),\n            join(path, \".config/typedoc.json\"),\n            join(path, \".config/typedoc.jsonc\"),\n            join(path, \".config/typedoc.config.js\"),\n            join(path, \".config/typedoc.config.cjs\"),\n            join(path, \".config/typedoc.config.mjs\"),\n            join(path, \".config/typedoc.js\"),\n            join(path, \".config/typedoc.cjs\"),\n            join(path, \".config/typedoc.mjs\"),\n        ].find((file) => (usedFile?.(file), isFile(file)));\n    }\n}\n\nfunction getStringArray(arg: unknown): string[] {\n    return Array.isArray(arg) ? arg.map(String) : [String(arg)];\n}\n"
  },
  {
    "path": "src/lib/utils/options/sources/index.ts",
    "content": "export { addTypeDocOptions } from \"./typedoc.js\";\n"
  },
  {
    "path": "src/lib/utils/options/sources/typedoc.ts",
    "content": "import { CommentStyle, EmitStrategy, ParameterHint, ParameterType, type TypeDocOptionMap } from \"../declaration.js\";\nimport * as OptionDefaults from \"../defaults.js\";\nimport { SORT_STRATEGIES } from \"../../sort.js\";\nimport { EntryPointStrategy } from \"../../entry-point.js\";\nimport { ReflectionKind } from \"../../../models/kind.js\";\nimport { blockTags, inlineTags, modifierTags } from \"../tsdoc-defaults.js\";\nimport { getEnumKeys, i18n, LogLevel, setDifference, Validation } from \"#utils\";\nimport type { BundledTheme } from \"@gerrit0/mini-shiki\";\nimport { getSupportedLanguages, getSupportedThemes } from \"../../highlighter.js\";\nimport type { Options } from \"../options.js\";\nimport { extname } from \"path\";\n\nfunction makeTagArrayValidator(name: keyof TypeDocOptionMap) {\n    return (value: string[]) => {\n        if (!Validation.validate([Array, Validation.isTagString], value)) {\n            throw new Error(i18n.option_0_values_must_be_array_of_tags(name));\n        }\n    };\n}\n\n// For convenience, added in the same order as they are documented on the website.\nexport function addTypeDocOptions(options: Pick<Options, \"addDeclaration\">) {\n    // MARK: Configuration Options\n\n    options.addDeclaration({\n        type: ParameterType.Path,\n        name: \"options\",\n        help: () => i18n.help_options(),\n        hint: ParameterHint.File,\n        defaultValue: \"\",\n    });\n    options.addDeclaration({\n        type: ParameterType.Path,\n        name: \"tsconfig\",\n        help: () => i18n.help_tsconfig(),\n        hint: ParameterHint.File,\n        defaultValue: \"\",\n    });\n    options.addDeclaration({\n        name: \"compilerOptions\",\n        help: () => i18n.help_compilerOptions(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        validate(value) {\n            if (!Validation.validate({}, value)) {\n                throw new Error(\n                    i18n.option_0_must_be_an_object(\"compilerOptions\"),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"lang\",\n        help: () => i18n.help_lang(),\n        type: ParameterType.String,\n        defaultValue: \"en\",\n    });\n    options.addDeclaration({\n        name: \"locales\",\n        help: () => i18n.help_locales(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: {},\n        validate(value) {\n            if (typeof value !== \"object\" || !value) {\n                throw new Error(i18n.locales_must_be_an_object());\n            }\n\n            for (const val of Object.values(value)) {\n                if (typeof val !== \"object\" || !val) {\n                    throw new Error(i18n.locales_must_be_an_object());\n                }\n\n                for (const val2 of Object.values(val)) {\n                    if (typeof val2 !== \"string\") {\n                        throw new Error(i18n.locales_must_be_an_object());\n                    }\n                }\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"packageOptions\",\n        help: () => i18n.help_packageOptions(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: {},\n        validate(value) {\n            if (!Validation.validate({}, value)) {\n                throw new Error(\n                    i18n.option_0_must_be_an_object(\"packageOptions\"),\n                );\n            }\n        },\n    });\n\n    // MARK: Input Options\n\n    options.addDeclaration({\n        name: \"entryPoints\",\n        help: () => i18n.help_entryPoints(),\n        type: ParameterType.GlobArray,\n    });\n    options.addDeclaration({\n        name: \"entryPointStrategy\",\n        help: () => i18n.help_entryPointStrategy(),\n        type: ParameterType.Map,\n        map: EntryPointStrategy,\n        defaultValue: EntryPointStrategy.Resolve,\n    });\n    options.addDeclaration({\n        name: \"alwaysCreateEntryPointModule\",\n        help: () => i18n.help_alwaysCreateEntryPointModule(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"projectDocuments\",\n        help: () => i18n.help_projectDocuments(),\n        type: ParameterType.GlobArray,\n    });\n\n    options.addDeclaration({\n        name: \"exclude\",\n        help: () => i18n.help_exclude(),\n        type: ParameterType.GlobArray,\n    });\n    options.addDeclaration({\n        name: \"externalPattern\",\n        help: () => i18n.help_externalPattern(),\n        type: ParameterType.GlobArray,\n        defaultValue: [\"**/node_modules/**\"],\n    });\n    options.addDeclaration({\n        name: \"excludeExternals\",\n        help: () => i18n.help_excludeExternals(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"excludeNotDocumented\",\n        help: () => i18n.help_excludeNotDocumented(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"excludeNotDocumentedKinds\",\n        help: () => i18n.help_excludeNotDocumentedKinds(),\n        type: ParameterType.Array,\n        validate(value) {\n            const invalid = new Set(value);\n            const valid = new Set(getEnumKeys(ReflectionKind));\n            for (\n                const notPermitted of [\n                    ReflectionKind.Project,\n                    ReflectionKind.TypeLiteral,\n                    ReflectionKind.TypeParameter,\n                    ReflectionKind.Parameter,\n                ]\n            ) {\n                valid.delete(ReflectionKind[notPermitted]);\n            }\n            for (const v of valid) {\n                invalid.delete(v);\n            }\n\n            if (invalid.size !== 0) {\n                throw new Error(\n                    i18n.exclude_not_documented_specified_0_valid_values_are_1(\n                        Array.from(invalid).join(\", \"),\n                        Array.from(valid).join(\", \"),\n                    ),\n                );\n            }\n        },\n        defaultValue: OptionDefaults.excludeNotDocumentedKinds,\n    });\n    options.addDeclaration({\n        name: \"excludeInternal\",\n        help: () => i18n.help_excludeInternal(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"excludeCategories\",\n        help: () => i18n.help_excludeCategories(),\n        type: ParameterType.Array,\n        defaultValue: [],\n    });\n    options.addDeclaration({\n        name: \"excludePrivate\",\n        help: () => i18n.help_excludePrivate(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"excludePrivateClassFields\",\n        help: () => i18n.help_excludePrivateClassFields(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"excludeProtected\",\n        help: () => i18n.help_excludeProtected(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"excludeReferences\",\n        help: () => i18n.help_excludeReferences(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"externalSymbolLinkMappings\",\n        help: () => i18n.help_externalSymbolLinkMappings(),\n        type: ParameterType.Mixed,\n        defaultValue: {},\n        validate(value) {\n            if (!Validation.validate({}, value)) {\n                throw new Error(\n                    i18n.external_symbol_link_mappings_must_be_object(),\n                );\n            }\n\n            for (const mappings of Object.values(value)) {\n                if (!Validation.validate({}, mappings)) {\n                    throw new Error(\n                        i18n.external_symbol_link_mappings_must_be_object(),\n                    );\n                }\n\n                for (const link of Object.values(mappings)) {\n                    if (typeof link !== \"string\") {\n                        throw new Error(\n                            i18n.external_symbol_link_mappings_must_be_object(),\n                        );\n                    }\n                }\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"readme\",\n        help: () => i18n.help_readme(),\n        type: ParameterType.Path,\n    });\n    options.addDeclaration({\n        name: \"basePath\",\n        help: () => i18n.help_basePath(),\n        type: ParameterType.Path,\n    });\n\n    // MARK: Output Options\n\n    options.addDeclaration({\n        name: \"outputs\",\n        help: () => i18n.help_out(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: undefined,\n        validate(value) {\n            if (\n                !Validation.validate(\n                    [\n                        Array,\n                        {\n                            name: String,\n                            path: String,\n                            options: Validation.optional({\n                                [Validation.additionalProperties]: true,\n                            }),\n                        },\n                    ],\n                    value,\n                )\n            ) {\n                throw new Error(i18n.option_outputs_must_be_array());\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"out\",\n        help: () => i18n.help_out(),\n        type: ParameterType.Path,\n        hint: ParameterHint.Directory,\n        defaultValue: \"./docs\",\n    });\n    options.addDeclaration({\n        name: \"html\",\n        outputShortcut: \"html\",\n        help: () => i18n.help_html(),\n        type: ParameterType.Path,\n        hint: ParameterHint.Directory,\n    });\n    options.addDeclaration({\n        name: \"json\",\n        outputShortcut: \"json\",\n        help: () => i18n.help_json(),\n        type: ParameterType.Path,\n        hint: ParameterHint.File,\n    });\n    options.addDeclaration({\n        name: \"pretty\",\n        help: () => i18n.help_pretty(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"emit\",\n        help: () => i18n.help_emit(),\n        type: ParameterType.Map,\n        map: EmitStrategy,\n        defaultValue: \"docs\",\n    });\n    options.addDeclaration({\n        name: \"theme\",\n        help: () => i18n.help_theme(),\n        type: ParameterType.String,\n        defaultValue: \"default\",\n    });\n    options.addDeclaration({\n        name: \"router\",\n        help: () => i18n.help_router(),\n        type: ParameterType.String,\n        defaultValue: \"kind\",\n    });\n\n    const defaultLightTheme: BundledTheme = \"light-plus\";\n    const defaultDarkTheme: BundledTheme = \"dark-plus\";\n\n    options.addDeclaration({\n        name: \"lightHighlightTheme\",\n        help: () => i18n.help_lightHighlightTheme(),\n        type: ParameterType.String,\n        defaultValue: defaultLightTheme,\n        validate(value) {\n            if (!getSupportedThemes().includes(value)) {\n                throw new Error(\n                    i18n.highlight_theme_0_must_be_one_of_1(\n                        \"lightHighlightTheme\",\n                        getSupportedThemes().join(\", \"),\n                    ),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"darkHighlightTheme\",\n        help: () => i18n.help_darkHighlightTheme(),\n        type: ParameterType.String,\n        defaultValue: defaultDarkTheme,\n        validate(value) {\n            if (!getSupportedThemes().includes(value)) {\n                throw new Error(\n                    i18n.highlight_theme_0_must_be_one_of_1(\n                        \"darkHighlightTheme\",\n                        getSupportedThemes().join(\", \"),\n                    ),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"highlightLanguages\",\n        help: () => i18n.help_highlightLanguages(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.highlightLanguages,\n        validate(value) {\n            const invalid = setDifference(value, getSupportedLanguages());\n            if (invalid.size) {\n                throw new Error(\n                    i18n.highlightLanguages_contains_invalid_languages_0(\n                        Array.from(invalid).join(\", \"),\n                    ),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"ignoredHighlightLanguages\",\n        help: () => i18n.help_ignoredHighlightLanguages(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.ignoredHighlightLanguages,\n    });\n    options.addDeclaration({\n        name: \"typePrintWidth\",\n        help: () => i18n.help_typePrintWidth(),\n        type: ParameterType.Number,\n        defaultValue: 80,\n    });\n\n    options.addDeclaration({\n        name: \"customCss\",\n        help: () => i18n.help_customCss(),\n        type: ParameterType.Path,\n    });\n    options.addDeclaration({\n        name: \"customJs\",\n        help: () => i18n.help_customJs(),\n        type: ParameterType.Path,\n    });\n    options.addDeclaration({\n        name: \"markdownItOptions\",\n        help: () => i18n.help_markdownItOptions(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: {\n            html: true,\n            linkify: true,\n        },\n        validate(value) {\n            if (!Validation.validate({}, value)) {\n                throw new Error(\n                    i18n.option_0_must_be_an_object(\"markdownItOptions\"),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"markdownItLoader\",\n        help: () => i18n.help_markdownItLoader(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: () => {},\n        validate(value) {\n            if (typeof value !== \"function\") {\n                throw new Error(\n                    i18n.option_0_must_be_a_function(\"markdownItLoader\"),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"maxTypeConversionDepth\",\n        help: () => i18n.help_maxTypeConversionDepth(),\n        defaultValue: 10,\n        type: ParameterType.Number,\n    });\n    options.addDeclaration({\n        name: \"name\",\n        help: () => i18n.help_name(),\n    });\n    options.addDeclaration({\n        name: \"includeVersion\",\n        help: () => i18n.help_includeVersion(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"disableSources\",\n        help: () => i18n.help_disableSources(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"sourceLinkTemplate\",\n        help: () => i18n.help_sourceLinkTemplate(),\n    });\n    options.addDeclaration({\n        name: \"gitRevision\",\n        help: () => i18n.help_gitRevision(),\n    });\n    options.addDeclaration({\n        name: \"gitRemote\",\n        help: () => i18n.help_gitRemote(),\n        defaultValue: \"origin\",\n    });\n    options.addDeclaration({\n        name: \"disableGit\",\n        help: () => i18n.help_disableGit(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"displayBasePath\",\n        help: () => i18n.help_displayBasePath(),\n        type: ParameterType.Path,\n    });\n    options.addDeclaration({\n        name: \"cname\",\n        help: () => i18n.help_cname(),\n    });\n    options.addDeclaration({\n        name: \"favicon\",\n        help: () => i18n.help_favicon(),\n        validate(value) {\n            const allowedExtension = [\".ico\", \".png\", \".svg\"];\n            if (\n                !/^https?:\\/\\//i.test(value) &&\n                !allowedExtension.includes(extname(value))\n            ) {\n                throw new Error(\n                    i18n.favicon_must_have_one_of_the_following_extensions_0(\n                        allowedExtension.join(\", \"),\n                    ),\n                );\n            }\n        },\n        type: ParameterType.UrlOrPath,\n    });\n    options.addDeclaration({\n        name: \"sourceLinkExternal\",\n        help: () => i18n.help_sourceLinkExternal(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"markdownLinkExternal\",\n        help: () => i18n.help_markdownLinkExternal(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"githubPages\",\n        help: () => i18n.help_githubPages(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"hostedBaseUrl\",\n        help: () => i18n.help_hostedBaseUrl(),\n        validate(value) {\n            if (!/^https?:\\/\\//i.test(value)) {\n                throw new Error(i18n.hostedBaseUrl_must_start_with_http());\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"useHostedBaseUrlForAbsoluteLinks\",\n        help: () => i18n.help_useHostedBaseUrlForAbsoluteLinks(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"hideGenerator\",\n        help: () => i18n.help_hideGenerator(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"customFooterHtml\",\n        help: () => i18n.help_customFooterHtml(),\n        type: ParameterType.String,\n    });\n    options.addDeclaration({\n        name: \"customFooterHtmlDisableWrapper\",\n        help: () => i18n.help_customFooterHtmlDisableWrapper(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"cacheBust\",\n        help: () => i18n.help_cacheBust(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"searchInComments\",\n        help: () => i18n.help_searchInComments(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"searchInDocuments\",\n        help: () => i18n.help_searchInDocuments(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"cleanOutputDir\",\n        help: () => i18n.help_cleanOutputDir(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"titleLink\",\n        help: () => i18n.help_titleLink(),\n        type: ParameterType.String,\n    });\n    options.addDeclaration({\n        name: \"navigationLinks\",\n        help: () => i18n.help_navigationLinks(),\n        type: ParameterType.Mixed,\n        defaultValue: {},\n        validate(value) {\n            if (!isObject(value)) {\n                throw new Error(\n                    i18n.option_0_must_be_object_with_urls(\"navigationLinks\"),\n                );\n            }\n\n            if (Object.values(value).some((x) => typeof x !== \"string\")) {\n                throw new Error(\n                    i18n.option_0_must_be_object_with_urls(\"navigationLinks\"),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"sidebarLinks\",\n        help: () => i18n.help_sidebarLinks(),\n        type: ParameterType.Mixed,\n        defaultValue: {},\n        validate(value) {\n            if (!isObject(value)) {\n                throw new Error(\n                    i18n.option_0_must_be_object_with_urls(\"sidebarLinks\"),\n                );\n            }\n\n            if (Object.values(value).some((x) => typeof x !== \"string\")) {\n                throw new Error(\n                    i18n.option_0_must_be_object_with_urls(\"sidebarLinks\"),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"navigationLeaves\",\n        help: () => i18n.help_navigationLeaves(),\n        type: ParameterType.Array,\n    });\n    options.addDeclaration({\n        name: \"navigation\",\n        help: () => i18n.help_navigation(),\n        type: ParameterType.Flags,\n        defaults: {\n            includeCategories: false,\n            includeGroups: false,\n            includeFolders: true,\n            compactFolders: true,\n            excludeReferences: false,\n        },\n    });\n    options.addDeclaration({\n        name: \"headings\",\n        help: () => i18n.help_headings(),\n        type: ParameterType.Flags,\n        defaults: {\n            readme: true,\n            document: false,\n        },\n    });\n    options.addDeclaration({\n        name: \"sluggerConfiguration\",\n        help: () => i18n.help_sluggerConfiguration(),\n        type: ParameterType.Flags,\n        defaults: {\n            lowercase: true,\n        },\n    });\n\n    options.addDeclaration({\n        name: \"includeHierarchySummary\",\n        help: () => i18n.help_includeHierarchySummary(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n\n    options.addDeclaration({\n        name: \"visibilityFilters\",\n        help: () => i18n.help_visibilityFilters(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: {\n            protected: false,\n            private: false,\n            inherited: true,\n            external: false,\n        },\n        validate(value) {\n            const knownKeys = [\"protected\", \"private\", \"inherited\", \"external\"];\n            if (typeof value !== \"object\" || !value) {\n                throw new Error(\n                    i18n.option_0_must_be_an_object(\"visibilityFilters\"),\n                );\n            }\n\n            for (const [key, val] of Object.entries(value)) {\n                if (!key.startsWith(\"@\") && !knownKeys.includes(key)) {\n                    throw new Error(\n                        i18n.visibility_filters_only_include_0(\n                            knownKeys.join(\", \"),\n                        ),\n                    );\n                }\n\n                if (typeof val !== \"boolean\") {\n                    throw new Error(i18n.visibility_filters_must_be_booleans());\n                }\n            }\n        },\n    });\n\n    options.addDeclaration({\n        name: \"searchCategoryBoosts\",\n        help: () => i18n.help_searchCategoryBoosts(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: {},\n        validate(value) {\n            if (!isObject(value)) {\n                throw new Error(\n                    i18n.option_0_must_be_an_object(\"searchCategoryBoosts\"),\n                );\n            }\n\n            if (Object.values(value).some((x) => typeof x !== \"number\")) {\n                throw new Error(\n                    i18n.option_0_values_must_be_numbers(\n                        \"searchCategoryBoosts\",\n                    ),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"searchGroupBoosts\",\n        help: () => i18n.help_searchGroupBoosts(),\n        type: ParameterType.Mixed,\n        configFileOnly: true,\n        defaultValue: {},\n        validate(value) {\n            if (!isObject(value)) {\n                throw new Error(\n                    i18n.option_0_must_be_an_object(\"searchGroupBoosts\"),\n                );\n            }\n\n            if (Object.values(value).some((x) => typeof x !== \"number\")) {\n                throw new Error(\n                    i18n.option_0_values_must_be_numbers(\"searchGroupBoosts\"),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"useFirstParagraphOfCommentAsSummary\",\n        help: () => i18n.help_useFirstParagraphOfCommentAsSummary(),\n        type: ParameterType.Boolean,\n    });\n\n    // MARK: Comment Options\n\n    options.addDeclaration({\n        name: \"jsDocCompatibility\",\n        help: () => i18n.help_jsDocCompatibility(),\n        type: ParameterType.Flags,\n        defaults: {\n            defaultTag: true,\n            exampleTag: true,\n            inheritDocTag: true,\n            ignoreUnescapedBraces: true,\n        },\n    });\n\n    options.addDeclaration({\n        name: \"suppressCommentWarningsInDeclarationFiles\",\n        help: () => i18n.help_suppressCommentWarningsInDeclarationFiles(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n\n    options.addDeclaration({\n        name: \"commentStyle\",\n        help: () => i18n.help_commentStyle(),\n        type: ParameterType.Map,\n        map: CommentStyle,\n        defaultValue: CommentStyle.JSDoc,\n    });\n\n    options.addDeclaration({\n        name: \"useTsLinkResolution\",\n        help: () => i18n.help_useTsLinkResolution(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"preserveLinkText\",\n        help: () => i18n.help_preserveLinkText(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n\n    options.addDeclaration({\n        name: \"blockTags\",\n        help: () => i18n.help_blockTags(),\n        type: ParameterType.Array,\n        defaultValue: blockTags,\n        validate: makeTagArrayValidator(\"blockTags\"),\n    });\n    options.addDeclaration({\n        name: \"inlineTags\",\n        help: () => i18n.help_inlineTags(),\n        type: ParameterType.Array,\n        defaultValue: inlineTags,\n        validate: makeTagArrayValidator(\"inlineTags\"),\n    });\n    options.addDeclaration({\n        name: \"modifierTags\",\n        help: () => i18n.help_modifierTags(),\n        type: ParameterType.Array,\n        defaultValue: modifierTags,\n        validate: makeTagArrayValidator(\"modifierTags\"),\n    });\n    options.addDeclaration({\n        name: \"excludeTags\",\n        help: () => i18n.help_excludeTags(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.excludeTags,\n        validate: makeTagArrayValidator(\"excludeTags\"),\n    });\n    options.addDeclaration({\n        name: \"notRenderedTags\",\n        help: () => i18n.help_notRenderedTags(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.notRenderedTags,\n        validate: makeTagArrayValidator(\"notRenderedTags\"),\n    });\n    options.addDeclaration({\n        name: \"cascadedModifierTags\",\n        help: () => i18n.help_cascadedModifierTags(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.cascadedModifierTags,\n        validate: makeTagArrayValidator(\"cascadedModifierTags\"),\n    });\n    options.addDeclaration({\n        name: \"preservedTypeAnnotationTags\",\n        help: () => i18n.help_preservedTypeAnnotationTags(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.preservedTypeAnnotationTags,\n        validate: makeTagArrayValidator(\"preservedTypeAnnotationTags\"),\n    });\n\n    // MARK: Organization Options\n\n    options.addDeclaration({\n        name: \"categorizeByGroup\",\n        help: () => i18n.help_categorizeByGroup(),\n        type: ParameterType.Boolean,\n        defaultValue: false,\n    });\n    options.addDeclaration({\n        name: \"groupReferencesByType\",\n        help: () => i18n.help_groupReferencesByType(),\n        type: ParameterType.Boolean,\n        defaultValue: false,\n    });\n    options.addDeclaration({\n        name: \"defaultCategory\",\n        help: () => i18n.help_defaultCategory(),\n        defaultValue: \"Other\",\n    });\n    options.addDeclaration({\n        name: \"categoryOrder\",\n        help: () => i18n.help_categoryOrder(),\n        type: ParameterType.Array,\n    });\n    options.addDeclaration({\n        name: \"groupOrder\",\n        help: () => i18n.help_groupOrder(),\n        type: ParameterType.Array,\n        // default order specified in GroupPlugin to correctly handle localization.\n    });\n    options.addDeclaration({\n        name: \"sort\",\n        help: () => i18n.help_sort(),\n        type: ParameterType.Array,\n        defaultValue: OptionDefaults.sort,\n        validate(value) {\n            const invalid = setDifference(value, SORT_STRATEGIES);\n\n            if (invalid.size !== 0) {\n                throw new Error(\n                    i18n.option_0_specified_1_but_only_2_is_valid(\n                        \"sort\",\n                        Array.from(invalid).join(\", \"),\n                        SORT_STRATEGIES.join(\", \"),\n                    ),\n                );\n            }\n        },\n    });\n    options.addDeclaration({\n        name: \"sortEntryPoints\",\n        help: () => i18n.help_sortEntryPoints(),\n        type: ParameterType.Boolean,\n        defaultValue: true,\n    });\n    options.addDeclaration({\n        name: \"kindSortOrder\",\n        help: () => i18n.help_kindSortOrder(),\n        type: ParameterType.Array,\n        defaultValue: [],\n        validate(value) {\n            const invalid = setDifference(value, getEnumKeys(ReflectionKind));\n\n            if (invalid.size !== 0) {\n                throw new Error(\n                    i18n.option_0_specified_1_but_only_2_is_valid(\n                        `kindSortOrder`,\n                        Array.from(invalid).join(\", \"),\n                        getEnumKeys(ReflectionKind).join(\", \"),\n                    ),\n                );\n            }\n        },\n    });\n\n    // MARK: General Options\n\n    options.addDeclaration({\n        name: \"watch\",\n        help: () => i18n.help_watch(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"preserveWatchOutput\",\n        help: () => i18n.help_preserveWatchOutput(),\n        type: ParameterType.Boolean,\n    });\n\n    options.addDeclaration({\n        name: \"skipErrorChecking\",\n        help: () => i18n.help_skipErrorChecking(),\n        type: ParameterType.Boolean,\n        defaultValue: false,\n    });\n    options.addDeclaration({\n        name: \"help\",\n        help: () => i18n.help_help(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"version\",\n        help: () => i18n.help_version(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"showConfig\",\n        help: () => i18n.help_showConfig(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"plugin\",\n        help: () => i18n.help_plugin(),\n        type: ParameterType.PluginArray,\n    });\n    options.addDeclaration({\n        name: \"logLevel\",\n        help: () => i18n.help_logLevel(),\n        type: ParameterType.Map,\n        map: LogLevel,\n        defaultValue: LogLevel.Info,\n    });\n\n    options.addDeclaration({\n        name: \"treatWarningsAsErrors\",\n        help: () => i18n.help_treatWarningsAsErrors(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"treatValidationWarningsAsErrors\",\n        help: () => i18n.help_treatValidationWarningsAsErrors(),\n        type: ParameterType.Boolean,\n    });\n    options.addDeclaration({\n        name: \"intentionallyNotExported\",\n        help: () => i18n.help_intentionallyNotExported(),\n        type: ParameterType.Array,\n    });\n    options.addDeclaration({\n        name: \"requiredToBeDocumented\",\n        help: () => i18n.help_requiredToBeDocumented(),\n        type: ParameterType.Array,\n        validate(values) {\n            // this is good enough because the values of the ReflectionKind enum are all numbers\n            const validValues = getEnumKeys(ReflectionKind);\n\n            for (const kind of values) {\n                if (!validValues.includes(kind)) {\n                    throw new Error(\n                        i18n.option_0_specified_1_but_only_2_is_valid(\n                            \"requiredToBeDocumented\",\n                            kind,\n                            validValues.join(\", \"),\n                        ),\n                    );\n                }\n            }\n        },\n        defaultValue: OptionDefaults.requiredToBeDocumented,\n    });\n    options.addDeclaration({\n        name: \"packagesRequiringDocumentation\",\n        help: () => i18n.help_packagesRequiringDocumentation(),\n        type: ParameterType.Array,\n    });\n    options.addDeclaration({\n        name: \"intentionallyNotDocumented\",\n        help: () => i18n.help_intentionallyNotDocumented(),\n        type: ParameterType.Array,\n        defaultValue: [],\n    });\n\n    options.addDeclaration({\n        name: \"validation\",\n        help: () => i18n.help_validation(),\n        type: ParameterType.Flags,\n        defaults: {\n            notExported: true,\n            invalidLink: true,\n            invalidPath: true,\n            rewrittenLink: true,\n            notDocumented: false,\n            unusedMergeModuleWith: true,\n        },\n    });\n}\n\nfunction isObject(x: unknown): x is Record<string, unknown> {\n    return !!x && typeof x === \"object\" && !Array.isArray(x);\n}\n"
  },
  {
    "path": "src/lib/utils/options/tsdoc-defaults.ts",
    "content": "// If updating these lists, also update tsdoc.json\n\nexport const tsdocBlockTags = [\n    \"@defaultValue\",\n    \"@deprecated\",\n    \"@example\",\n    \"@jsx\",\n    \"@param\",\n    \"@privateRemarks\",\n    \"@remarks\",\n    \"@returns\",\n    \"@see\",\n    \"@throws\",\n    \"@typeParam\",\n] as const;\n\nexport const blockTags = [\n    ...tsdocBlockTags,\n    \"@author\",\n    \"@callback\",\n    \"@category\",\n    \"@categoryDescription\",\n    \"@default\",\n    \"@document\",\n    \"@extends\",\n    \"@augments\", // Alias for @extends\n    \"@yields\",\n    \"@group\",\n    \"@groupDescription\",\n    \"@import\",\n    \"@inheritDoc\",\n    \"@license\",\n    \"@module\",\n    \"@mergeModuleWith\",\n    \"@prop\",\n    \"@property\",\n    \"@return\",\n    \"@satisfies\",\n    \"@since\",\n    \"@sortStrategy\",\n    \"@template\", // Alias for @typeParam\n    \"@this\",\n    \"@type\",\n    \"@typedef\",\n    \"@summary\",\n    \"@preventInline\",\n    \"@inlineType\",\n    \"@preventExpand\",\n    \"@expandType\",\n] as const;\n\nexport const tsdocInlineTags = [\"@link\", \"@inheritDoc\", \"@label\"] as const;\nexport const inlineTags = [\n    ...tsdocInlineTags,\n    \"@linkcode\",\n    \"@linkplain\",\n    \"@include\",\n    \"@includeCode\",\n] as const;\n\nexport const tsdocModifierTags = [\n    \"@alpha\",\n    \"@beta\",\n    \"@eventProperty\",\n    \"@experimental\",\n    \"@internal\",\n    \"@override\",\n    \"@packageDocumentation\",\n    \"@public\",\n    \"@readonly\",\n    \"@sealed\",\n    \"@virtual\",\n] as const;\n\nexport const modifierTags = [\n    ...tsdocModifierTags,\n    \"@abstract\",\n    \"@class\",\n    \"@disableGroups\",\n    \"@enum\",\n    \"@event\",\n    \"@expand\",\n    \"@hidden\",\n    \"@hideCategories\",\n    \"@hideconstructor\",\n    \"@hideGroups\",\n    \"@ignore\",\n    \"@inline\",\n    \"@interface\",\n    \"@namespace\",\n    \"@function\",\n    \"@overload\",\n    \"@private\",\n    \"@protected\",\n    \"@showCategories\",\n    \"@showGroups\",\n    \"@useDeclaredType\",\n    \"@primaryExport\",\n] as const;\n"
  },
  {
    "path": "src/lib/utils/package-manifest.ts",
    "content": "// Utilities to support the inspection of node package \"manifests\"\n\nimport { dirname } from \"path\";\n\nimport { glob, readFile } from \"./fs.js\";\nimport { createGlobString, type MinimatchSet, nicePath, normalizePath } from \"./paths.js\";\nimport { type GlobString, i18n, type Logger, type NormalizedPath } from \"#utils\";\n\n/**\n * Helper for the TS type system to understand hasOwnProperty\n * and narrow a type appropriately.\n * @param obj the receiver of the hasOwnProperty method call\n * @param prop the property to test for\n */\nfunction hasOwnProperty<K extends PropertyKey>(\n    obj: object,\n    prop: K,\n): obj is Record<K, unknown> {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/**\n * Loads a package.json and validates that it is a JSON Object\n */\nexport function loadPackageManifest(\n    logger: Logger,\n    packageJsonPath: string,\n): Record<string, unknown> | undefined {\n    const packageJson: unknown = JSON.parse(readFile(packageJsonPath));\n    if (typeof packageJson !== \"object\" || !packageJson) {\n        logger.error(\n            i18n.file_0_not_an_object(nicePath(packageJsonPath)),\n        );\n        return undefined;\n    }\n    return packageJson as Record<string, unknown>;\n}\n\n/**\n * Load the paths to packages specified in a Yarn workspace package JSON\n * Returns undefined if packageJSON does not define a Yarn workspace\n * @param packageJSON the package json object\n */\nfunction getPackagePaths(\n    packageJSON: Record<string, unknown>,\n): string[] | undefined {\n    if (\n        Array.isArray(packageJSON[\"workspaces\"]) &&\n        packageJSON[\"workspaces\"].every((i) => typeof i === \"string\")\n    ) {\n        return packageJSON[\"workspaces\"];\n    }\n    if (\n        typeof packageJSON[\"workspaces\"] === \"object\" &&\n        packageJSON[\"workspaces\"] != null\n    ) {\n        const workspaces = packageJSON[\"workspaces\"];\n        if (\n            hasOwnProperty(workspaces, \"packages\") &&\n            Array.isArray(workspaces[\"packages\"]) &&\n            workspaces[\"packages\"].every((i) => typeof i === \"string\")\n        ) {\n            return workspaces[\"packages\"];\n        }\n    }\n    return undefined;\n}\n\n/**\n * Given a list of (potentially wildcard containing) package paths,\n * return all the actual package folders found.\n */\nexport function expandPackages(\n    logger: Logger,\n    packageJsonDir: NormalizedPath,\n    workspaces: GlobString[],\n    exclude: MinimatchSet,\n): string[] {\n    // Technically npm and Yarn workspaces don't support recursive nesting,\n    // however we support the passing of paths to either packages or\n    // to the root of a workspace tree in our params and so we could here\n    // be dealing with either a root or a leaf. So let's do this recursively,\n    // as it actually is simpler from an implementation perspective anyway.\n    return workspaces.flatMap((workspace) => {\n        const expandedPackageJsonPaths = glob(\n            createGlobString(packageJsonDir, `${workspace}/package.json`),\n            packageJsonDir,\n        );\n\n        if (expandedPackageJsonPaths.length === 0) {\n            logger.warn(\n                i18n.entry_point_0_did_not_match_any_packages(\n                    nicePath(workspace),\n                ),\n            );\n        } else if (expandedPackageJsonPaths.length !== 1) {\n            logger.verbose(\n                `Expanded ${nicePath(workspace)} to:\\n\\t${\n                    expandedPackageJsonPaths\n                        .map(nicePath)\n                        .join(\"\\n\\t\")\n                }`,\n            );\n        }\n\n        return expandedPackageJsonPaths.flatMap((packageJsonPath) => {\n            if (exclude.matchesAny(dirname(packageJsonPath))) {\n                return [];\n            }\n\n            const packageJson = loadPackageManifest(logger, packageJsonPath);\n            if (packageJson === undefined) {\n                return [];\n            }\n            const packagePaths = getPackagePaths(packageJson);\n            if (packagePaths === undefined) {\n                // Assume this is a single package repo\n                return [dirname(packageJsonPath)];\n            }\n            // This is a workspace root package, recurse\n            return expandPackages(\n                logger,\n                normalizePath(dirname(packageJsonPath)),\n                packagePaths.map(p => createGlobString(normalizePath(dirname(packageJsonPath)), p)),\n                exclude,\n            );\n        });\n    });\n}\n"
  },
  {
    "path": "src/lib/utils/paths.ts",
    "content": "import { countMatches, filterMap, type GlobString, type NormalizedPath } from \"#utils\";\nimport { Minimatch } from \"minimatch\";\nimport { dirname, isAbsolute, relative, resolve } from \"path\";\n\nexport class MinimatchSet {\n    readonly patterns: Minimatch[];\n\n    constructor(patterns: GlobString[]) {\n        this.patterns = patterns.map(p => new Minimatch(p, { dot: true }));\n    }\n\n    matchesAny(path: string) {\n        return this.patterns.some(p => {\n            return p.match(path);\n        });\n    }\n}\n\nfunction escapeGlob(glob: string) {\n    return glob.replace(/[?*()[\\]\\\\{}]/g, \"\\\\$&\");\n}\n\nfunction isGlobalGlob(glob: string) {\n    const start = glob.match(/^[!#]+/)?.[0].length ?? 0;\n    return glob.startsWith(\"**\", start);\n}\n\nexport function splitGlobToPathAndSpecial(glob: string): { modifiers: string; path: string; glob: string } {\n    const modifiers = glob.match(/^[!#]+/)?.[0] ?? \"\";\n    const noModifierGlob = glob.substring(modifiers.length);\n\n    if (isGlobalGlob(glob)) {\n        return { modifiers, path: \"\", glob: noModifierGlob };\n    }\n\n    const mini = new Minimatch(noModifierGlob, { dot: true });\n\n    const basePaths = mini.set.map(set => {\n        const stop = set.findIndex((part) => typeof part !== \"string\");\n        if (stop === -1) {\n            return set.join(\"/\");\n        } else {\n            return set.slice(0, stop).join(\"/\");\n        }\n    });\n\n    const base = getCommonPath(basePaths);\n\n    if (base) {\n        const skipIndex = countMatches(base, \"/\") + 1;\n        const globPart = mini.globParts.map(s => s.slice(skipIndex));\n        // This isn't ideal, it will end up re-writing the glob if braces are used,\n        // but I don't want to write a glob minimizer at this point, and this should\n        // handle all the edge cases as we're just using Minimatch's glob parsing\n        const resultingGlob = globPart.length === 1\n            ? globPart[0].join(\"/\")\n            : `{${globPart.map(s => s.join(\"/\")).join(\",\")}}`;\n        return { modifiers, path: base, glob: resultingGlob };\n    }\n\n    return { modifiers, path: \"\", glob: noModifierGlob };\n}\n\nexport function createGlobString(relativeTo: NormalizedPath, glob: string): GlobString {\n    if (isAbsolute(glob) || isGlobalGlob(glob)) return glob as GlobString;\n\n    const split = splitGlobToPathAndSpecial(glob);\n    const leadingPath = normalizePath(resolve(relativeTo, split.path));\n\n    if (!split.glob) {\n        return split.modifiers + escapeGlob(leadingPath) as GlobString;\n    }\n\n    return `${split.modifiers}${escapeGlob(leadingPath)}/${split.glob}` as GlobString;\n}\n\n/**\n * Get the longest directory path common to all files.\n */\nexport function getCommonPath(files: readonly string[]): NormalizedPath {\n    if (!files.length) {\n        return \"\";\n    }\n\n    const roots = files.map((f) => f.split(\"/\"));\n    if (roots.length === 1) {\n        return roots[0].join(\"/\") as NormalizedPath;\n    }\n\n    let i = 0;\n\n    while (\n        i < roots[0].length &&\n        new Set(roots.map((part) => part[i])).size === 1\n    ) {\n        i++;\n    }\n\n    return roots[0].slice(0, i).join(\"/\") as NormalizedPath;\n}\n\nexport function getCommonDirectory(files: readonly string[]): NormalizedPath {\n    if (files.length === 1) {\n        return normalizePath(dirname(files[0]));\n    }\n    return getCommonPath(files);\n}\n\nexport function deriveRootDir(globPaths: GlobString[]): NormalizedPath {\n    const globs = new MinimatchSet(globPaths).patterns;\n    const rootPaths = globs.flatMap((glob, i) =>\n        filterMap(glob.set, (set) => {\n            const stop = set.findIndex((part) => typeof part !== \"string\");\n            if (stop === -1) {\n                return globPaths[i];\n            } else {\n                const kept = set.slice(0, stop).join(\"/\");\n                return globPaths[i].substring(\n                    0,\n                    globPaths[i].indexOf(kept) + kept.length,\n                );\n            }\n        })\n    );\n    return getCommonDirectory(rootPaths);\n}\n\nexport function nicePath(absPath: string) {\n    if (!isAbsolute(absPath)) return absPath;\n\n    const relativePath = relative(process.cwd(), absPath);\n    if (relativePath.startsWith(\"..\")) {\n        return normalizePath(absPath);\n    }\n    return `./${normalizePath(relativePath)}`;\n}\n\n/**\n * Normalize the given path.\n *\n * @param path  The path that should be normalized.\n * @returns The normalized path.\n */\nexport function normalizePath(path: string): NormalizedPath {\n    if (process.platform === \"win32\") {\n        // Ensure forward slashes\n        path = path.replace(/\\\\/g, \"/\");\n\n        // Msys2 git on windows will give paths which use unix-style\n        // absolute paths, like /c/users/you. Since the rest of TypeDoc\n        // expects drive letters, convert it to that here.\n        path = path.replace(/^\\/([a-zA-Z])\\//, (_m, m1: string) => `${m1}:/`);\n\n        // Make Windows drive letters upper case\n        path = path.replace(\n            /^([^:]+):\\//,\n            (_m, m1: string) => m1.toUpperCase() + \":/\",\n        );\n    }\n\n    return path as NormalizedPath;\n}\n"
  },
  {
    "path": "src/lib/utils/perf.ts",
    "content": "/* eslint-disable no-console */\n\nconst benchmarks: { name: string; calls: number; time: number }[] = [];\n\nexport function bench<T extends (..._: any) => any>(\n    fn: T,\n    name: string = fn.name,\n): T {\n    const matching = benchmarks.find((b) => b.name === name);\n    const timer = matching || {\n        name,\n        calls: 0,\n        time: 0,\n    };\n    if (!matching) benchmarks.push(timer);\n\n    return function bench(this: any, ...args: any) {\n        timer.calls++;\n        const start = performance.now();\n        const end = () => (timer.time += performance.now() - start);\n        let result: any;\n        try {\n            result = fn.apply(this, args);\n        } catch (error) {\n            end();\n            throw error;\n        }\n\n        if (result instanceof Promise) {\n            result.then(\n                (res) => {\n                    end();\n                    return res;\n                },\n                (reason: unknown) => {\n                    end();\n                    throw reason;\n                },\n            );\n        } else {\n            end();\n        }\n\n        return result;\n    } as any;\n}\n\nfunction BenchField<T extends (..._: any) => any>(\n    _value: undefined,\n    context: ClassFieldDecoratorContext<unknown, T>,\n): (value: T) => T {\n    let runner: T | undefined;\n\n    return function (this: any, value: T) {\n        if (!runner) {\n            const className = context.static\n                ? this.name\n                : Object.getPrototypeOf(this).constructor.name;\n            runner = bench(value, `${className}.${String(context.name)}`);\n        }\n\n        return function (this: any, ...args: any) {\n            return runner!.apply(this, args);\n        } as T;\n    };\n}\n\nfunction BenchMethod<T extends (..._: any) => any>(\n    value: T,\n    context: ClassMethodDecoratorContext,\n): T {\n    let runner: T | undefined;\n\n    return function (this: any, ...args: any) {\n        if (!runner) {\n            const className = context.static\n                ? this.name\n                : Object.getPrototypeOf(this).constructor.name;\n            runner = bench(value, `${className}.${String(context.name)}`);\n        }\n        return runner.apply(this, args);\n    } as any;\n}\n\nexport const Bench: typeof BenchField & typeof BenchMethod = (\n    value: any,\n    context,\n) => {\n    if (context.kind === \"field\") {\n        return BenchField(value, context);\n    }\n    return BenchMethod(value, context);\n};\n\nexport function measure<T>(cb: () => T): T {\n    return bench(cb, \"measure()\")();\n}\n\nprocess.on(\"exit\", () => {\n    if (!benchmarks.length) return;\n\n    const table = benchmarks.map((b) => {\n        return {\n            Benchmarked: b.name,\n            Calls: b.calls,\n            \"Time (ms)\": Math.round(b.time * 100) / 100,\n            \"Average (ms)\": Math.round((b.time / b.calls) * 100) / 100,\n        };\n    });\n\n    console.table(table);\n});\n"
  },
  {
    "path": "src/lib/utils/plugins.ts",
    "content": "import { isAbsolute } from \"path\";\nimport { pathToFileURL } from \"url\";\n\nimport type { Application } from \"../application.js\";\nimport { nicePath } from \"./paths.js\";\nimport { i18n, type NormalizedPathOrModuleOrFunction, type TranslatedString } from \"#utils\";\n\nexport async function loadPlugins(\n    app: Application,\n    plugins: readonly NormalizedPathOrModuleOrFunction[],\n) {\n    for (const plugin of plugins) {\n        const pluginDisplay = getPluginDisplayName(plugin);\n\n        try {\n            let initFunction: any;\n\n            if (typeof plugin === \"function\") {\n                initFunction = plugin;\n            } else {\n                let instance: any;\n\n                // Try importing first to avoid warnings about requiring ESM being experimental.\n                // If that fails due to importing a directory, fall back to require.\n                try {\n                    // On Windows, we need to ensure this path is a file path.\n                    // Or we'll get ERR_UNSUPPORTED_ESM_URL_SCHEME\n                    const esmPath = isAbsolute(plugin)\n                        ? pathToFileURL(plugin).toString()\n                        : plugin;\n                    instance = await import(esmPath);\n                } catch (error: any) {\n                    if (error.code === \"ERR_UNSUPPORTED_DIR_IMPORT\") {\n                        // eslint-disable-next-line @typescript-eslint/no-require-imports\n                        instance = require(plugin);\n                    } else {\n                        throw error;\n                    }\n                }\n                initFunction = instance.load;\n            }\n\n            if (typeof initFunction === \"function\") {\n                await initFunction(app);\n                app.logger.info(i18n.loaded_plugin_0(pluginDisplay));\n            } else {\n                app.logger.error(\n                    i18n.invalid_plugin_0_missing_load_function(\n                        pluginDisplay,\n                    ),\n                );\n            }\n        } catch (error) {\n            app.logger.error(\n                i18n.plugin_0_could_not_be_loaded(pluginDisplay),\n            );\n            if (error instanceof Error && error.stack) {\n                app.logger.error(error.stack as TranslatedString);\n            }\n        }\n    }\n}\n\nfunction getPluginDisplayName(plugin: NormalizedPathOrModuleOrFunction) {\n    if (typeof plugin === \"function\") {\n        return plugin.name || \"function\";\n    }\n\n    const path = nicePath(plugin);\n    if (path.startsWith(\"./node_modules/\")) {\n        return path.substring(\"./node_modules/\".length);\n    }\n    return plugin;\n}\n"
  },
  {
    "path": "src/lib/utils/reflections.ts",
    "content": "import {\n    ContainerReflection,\n    DeclarationReflection,\n    makeRecursiveVisitor,\n    ParameterReflection,\n    type ProjectReflection,\n    type ReferenceType,\n    Reflection,\n    SignatureReflection,\n    TypeParameterReflection,\n} from \"../models/index.js\";\n\nexport function discoverAllReferenceTypes(\n    project: ProjectReflection,\n    forExportValidation: boolean,\n): { type: ReferenceType; owner: Reflection }[] {\n    let current: Reflection | undefined = project;\n    const queue: Reflection[] = [];\n    const result: { type: ReferenceType; owner: Reflection }[] = [];\n\n    const visitor = makeRecursiveVisitor({\n        reference(type) {\n            result.push({ type, owner: current! });\n        },\n        reflection(type) {\n            queue.push(type.declaration);\n        },\n    });\n\n    const add = (item: Reflection | Reflection[] | undefined) => {\n        if (!item) return;\n\n        if (item instanceof Reflection) {\n            queue.push(item);\n        } else {\n            queue.push(...item);\n        }\n    };\n\n    do {\n        if (current instanceof ContainerReflection) {\n            add(current.children);\n        }\n\n        if (current instanceof DeclarationReflection) {\n            current.type?.visit(visitor);\n            add(current.typeParameters);\n            add(current.signatures);\n            add(current.indexSignatures);\n            add(current.getSignature);\n            add(current.setSignature);\n            current.overwrites?.visit(visitor);\n            current.implementedTypes?.forEach((type) => type.visit(visitor));\n            if (!forExportValidation) {\n                current.inheritedFrom?.visit(visitor);\n                current.implementationOf?.visit(visitor);\n                current.extendedTypes?.forEach((t) => t.visit(visitor));\n                current.extendedBy?.forEach((t) => t.visit(visitor));\n                current.implementedBy?.forEach((t) => t.visit(visitor));\n            }\n        }\n\n        if (current instanceof SignatureReflection) {\n            add(current.parameters);\n            add(current.typeParameters);\n            current.type?.visit(visitor);\n            current.overwrites?.visit(visitor);\n            if (!forExportValidation) {\n                current.inheritedFrom?.visit(visitor);\n                current.implementationOf?.visit(visitor);\n            }\n        }\n\n        if (current instanceof ParameterReflection) {\n            current.type?.visit(visitor);\n        }\n\n        if (current instanceof TypeParameterReflection) {\n            current.type?.visit(visitor);\n            current.default?.visit(visitor);\n        }\n    } while ((current = queue.shift()));\n\n    return result;\n}\n"
  },
  {
    "path": "src/lib/utils/sort.ts",
    "content": "/**\n * Module which handles sorting reflections according to a user specified strategy.\n * @module\n */\n\nimport { ReflectionKind } from \"../models/kind.js\";\nimport type { DeclarationReflection } from \"../models/DeclarationReflection.js\";\nimport type { Options } from \"./options/index.js\";\nimport type { DocumentReflection } from \"../models/index.js\";\nimport * as OptionDefaults from \"./options/defaults.js\";\n\nexport const SORT_STRATEGIES = [\n    \"source-order\",\n    \"alphabetical\",\n    \"alphabetical-ignoring-documents\",\n    \"enum-value-ascending\",\n    \"enum-value-descending\",\n    \"enum-member-source-order\",\n    \"static-first\",\n    \"instance-first\",\n    \"visibility\",\n    \"required-first\",\n    \"kind\",\n    \"external-last\",\n    \"documents-first\",\n    \"documents-last\",\n] as const;\n\nexport type SortStrategy = (typeof SORT_STRATEGIES)[number];\n\n// Return true if a < b\nconst sorts: Record<\n    SortStrategy,\n    (\n        a: DeclarationReflection | DocumentReflection,\n        b: DeclarationReflection | DocumentReflection,\n        data: { kindSortOrder: ReflectionKind[] },\n    ) => boolean\n> = {\n    \"source-order\"(a, b) {\n        // This is going to be somewhat ambiguous. No way around that. Treat the first\n        // declaration of a symbol as its ordering declaration.\n        const aSymbol = a.project.getSymbolIdFromReflection(a);\n        const bSymbol = b.project.getSymbolIdFromReflection(b);\n\n        if (aSymbol && bSymbol) {\n            if (aSymbol.packageName < bSymbol.packageName) {\n                return true;\n            }\n            if (\n                aSymbol.packageName === bSymbol.packageName &&\n                aSymbol.packagePath < bSymbol.packagePath\n            ) {\n                return true;\n            }\n            if (\n                aSymbol.packageName === bSymbol.packageName &&\n                aSymbol.packagePath === bSymbol.packagePath &&\n                aSymbol.pos < bSymbol.pos\n            ) {\n                return true;\n            }\n\n            return false;\n        }\n\n        // Someone is doing something weird. Fail to re-order. This could happen if someone\n        // tries to sort with a reflection that has been removed from the project.\n        return false;\n    },\n    alphabetical(a, b) {\n        return a.name.localeCompare(b.name) < 0;\n    },\n    \"alphabetical-ignoring-documents\"(a, b) {\n        if (\n            a.kindOf(ReflectionKind.Document) ||\n            b.kindOf(ReflectionKind.Document)\n        ) {\n            return false;\n        }\n        return a.name.localeCompare(b.name) < 0;\n    },\n    \"enum-value-ascending\"(a, b) {\n        if (\n            a.kind == ReflectionKind.EnumMember &&\n            b.kind == ReflectionKind.EnumMember\n        ) {\n            const aRefl = a as DeclarationReflection;\n            const bRefl = b as DeclarationReflection;\n\n            const aValue = aRefl.type?.type === \"literal\" ? aRefl.type.value : -Infinity;\n            const bValue = bRefl.type?.type === \"literal\" ? bRefl.type.value : -Infinity;\n\n            return aValue! < bValue!;\n        }\n        return false;\n    },\n    \"enum-value-descending\"(a, b) {\n        if (\n            a.kind == ReflectionKind.EnumMember &&\n            b.kind == ReflectionKind.EnumMember\n        ) {\n            const aRefl = a as DeclarationReflection;\n            const bRefl = b as DeclarationReflection;\n\n            const aValue = aRefl.type?.type === \"literal\" ? aRefl.type.value : -Infinity;\n            const bValue = bRefl.type?.type === \"literal\" ? bRefl.type.value : -Infinity;\n\n            return bValue! < aValue!;\n        }\n        return false;\n    },\n    \"enum-member-source-order\"(a, b, data) {\n        if (\n            a.kind === ReflectionKind.EnumMember &&\n            b.kind === ReflectionKind.EnumMember\n        ) {\n            return sorts[\"source-order\"](a, b, data);\n        }\n        return false;\n    },\n    \"static-first\"(a, b) {\n        return a.flags.isStatic && !b.flags.isStatic;\n    },\n    \"instance-first\"(a, b) {\n        return !a.flags.isStatic && b.flags.isStatic;\n    },\n    visibility(a, b) {\n        // Note: flags.isPublic may not be set on public members. It will only be set\n        // if the user explicitly marks members as public. Therefore, we can't use it\n        // here to get a reliable sort order.\n        if (a.flags.isPrivate) {\n            return false; // Not sorted before anything\n        }\n        if (a.flags.isProtected) {\n            return b.flags.isPrivate; // Sorted before privates\n        }\n        if (b.flags.isPrivate || b.flags.isProtected) {\n            return true; // We are public, sort before b if b is less visible\n        }\n        return false;\n    },\n    \"required-first\"(a, b) {\n        return !a.flags.isOptional && b.flags.isOptional;\n    },\n    kind(a, b, { kindSortOrder }) {\n        return kindSortOrder.indexOf(a.kind) < kindSortOrder.indexOf(b.kind);\n    },\n    \"external-last\"(a, b) {\n        return !a.flags.isExternal && b.flags.isExternal;\n    },\n    \"documents-first\"(a, b) {\n        return (\n            a.kindOf(ReflectionKind.Document) &&\n            !b.kindOf(ReflectionKind.Document)\n        );\n    },\n    \"documents-last\"(a, b) {\n        return (\n            !a.kindOf(ReflectionKind.Document) &&\n            b.kindOf(ReflectionKind.Document)\n        );\n    },\n};\n\nexport function isValidSortStrategy(strategy: string): strategy is SortStrategy {\n    return SORT_STRATEGIES.includes(strategy as never);\n}\n\nexport function getSortFunction(opts: Options, strategies: readonly SortStrategy[] = opts.getValue(\"sort\")) {\n    const kindSortOrder = opts\n        .getValue(\"kindSortOrder\")\n        .map((k) => ReflectionKind[k]);\n\n    for (const kind of OptionDefaults.kindSortOrder) {\n        if (!kindSortOrder.includes(ReflectionKind[kind])) {\n            kindSortOrder.push(ReflectionKind[kind]);\n        }\n    }\n\n    const data = { kindSortOrder };\n\n    return function sortReflections(\n        reflections: (DeclarationReflection | DocumentReflection)[],\n    ) {\n        reflections.sort((a, b) => {\n            for (const s of strategies) {\n                if (sorts[s](a, b, data)) {\n                    return -1;\n                }\n                if (sorts[s](b, a, data)) {\n                    return 1;\n                }\n            }\n            return 0;\n        });\n    };\n}\n"
  },
  {
    "path": "src/lib/utils/tsconfig.ts",
    "content": "import ts from \"typescript\";\nimport { isDir, isFile, readFile } from \"./fs.js\";\nimport { createRequire } from \"module\";\nimport type { Logger } from \"#utils\";\nimport { diagnostic, diagnostics } from \"./loggers.js\";\n\nexport function findTsConfigFile(\n    path: string,\n    usedFile?: (path: string) => void,\n): string | undefined {\n    let fileToRead: string | undefined = path;\n    if (isDir(fileToRead)) {\n        fileToRead = ts.findConfigFile(\n            path,\n            (file) => (usedFile?.(file), isFile(file)),\n        );\n    }\n\n    if (!fileToRead || !isFile(fileToRead)) {\n        return;\n    }\n\n    return fileToRead;\n}\n\n// We don't need recursive read checks because that would cause a diagnostic\n// when reading the tsconfig for compiler options, which happens first, and we bail before\n// doing this in that case.\nexport function getTypeDocOptionsFromTsConfig(file: string): any {\n    const readResult = ts.readConfigFile(file, readFile);\n\n    const result = {};\n\n    if (readResult.error) {\n        return result;\n    }\n\n    if (\"extends\" in readResult.config) {\n        const resolver = createRequire(file);\n        const extended = Array.isArray(readResult.config.extends)\n            ? readResult.config.extends.map(String)\n            : [String(readResult.config.extends)];\n\n        for (const extendedFile of extended) {\n            let resolvedParent: string;\n            try {\n                resolvedParent = resolver.resolve(extendedFile);\n            } catch {\n                continue;\n            }\n            Object.assign(\n                result,\n                getTypeDocOptionsFromTsConfig(resolvedParent),\n            );\n        }\n    }\n\n    if (\"typedocOptions\" in readResult.config) {\n        Object.assign(result, readResult.config.typedocOptions);\n    }\n\n    return result;\n}\n\nconst tsConfigCache: Record<string, ts.ParsedCommandLine | undefined> = {};\n\nexport function readTsConfig(\n    path: string,\n    logger: Logger,\n): ts.ParsedCommandLine | undefined {\n    if (tsConfigCache[path]) {\n        return tsConfigCache[path];\n    }\n\n    const parsed = ts.getParsedCommandLineOfConfigFile(\n        path,\n        {},\n        {\n            ...ts.sys,\n            onUnRecoverableConfigFileDiagnostic: diagnostic.bind(null, logger),\n        },\n    );\n\n    if (!parsed) {\n        return;\n    }\n\n    diagnostics(logger, parsed.errors);\n\n    tsConfigCache[path] = parsed;\n    return parsed;\n}\n"
  },
  {
    "path": "src/lib/utils/tsutils.ts",
    "content": "import ts from \"typescript\";\n\nexport function getQualifiedName(symbol: ts.Symbol, defaultName: string) {\n    // Two implementation options for this one:\n    // 1. Use the internal symbol.parent, to walk up until we hit a source file symbol (if in a module)\n    //    or undefined (if in a global file)\n    // 2. Use checker.getFullyQualifiedName and parse out the name from the returned string.\n    // The symbol.parent method is easier to check for now.\n    let sym: ts.Symbol | undefined = symbol;\n    const parts: string[] = [];\n    while (sym && !sym.declarations?.some(ts.isSourceFile)) {\n        parts.unshift(getHumanName(sym.name));\n        sym = sym.parent;\n    }\n\n    return parts.join(\".\") || defaultName;\n}\n\nexport function getHumanName(name: string) {\n    // Unique symbols get a name that will change between runs of the compiler.\n    const match = /^__@(.*)@\\d+$/.exec(name);\n    if (match) {\n        return `[${match[1]}]`;\n    }\n\n    return name;\n}\n"
  },
  {
    "path": "src/lib/utils-common/array.ts",
    "content": "export const emptyArray: readonly [] = [];\n\n/**\n * Inserts an item into an array sorted by priority. If two items have the same priority,\n * the item will be inserted later will be placed later in the array.\n * Higher priority is placed earlier in the array.\n * @param arr modified by inserting item.\n * @param item\n */\nexport function insertPrioritySorted<T extends { priority: number }>(\n    arr: T[],\n    item: T,\n): T[] {\n    const index = binaryFindPartition(arr, (v) => v.priority < item.priority);\n    arr.splice(index === -1 ? arr.length : index, 0, item);\n    return arr;\n}\n\n/**\n * Inserts an item into an array sorted by order. If two items have the same order,\n * the item inserted later will be placed later in the array.\n * The array will be sorted with lower order being placed sooner.\n * @param arr modified by inserting item.\n * @param item\n */\nexport function insertOrderSorted<T extends { order: number }>(\n    arr: T[],\n    item: T,\n): T[] {\n    const index = binaryFindPartition(arr, (v) => v.order > item.order);\n    arr.splice(index === -1 ? arr.length : index, 0, item);\n    return arr;\n}\n\n/**\n * Performs a binary search of a given array, returning the index of the first item\n * for which `partition` returns true. Returns the -1 if there are no items in `arr`\n * such that `partition(item)` is true.\n * @param arr\n * @param partition should return true while less than the partition point.\n */\nexport function binaryFindPartition<T>(\n    arr: readonly T[],\n    partition: (item: T) => boolean,\n): number {\n    if (arr.length === 0) {\n        return -1;\n    }\n\n    let low = 0,\n        high = arr.length - 1;\n\n    while (high > low) {\n        const mid = low + Math.floor((high - low) / 2);\n        if (partition(arr[mid])) {\n            high = mid;\n        } else {\n            low = mid + 1;\n        }\n    }\n\n    return partition(arr[low]) ? low : -1;\n}\n\n/**\n * Removes an item from the array if the array exists and the item is included\n * within it.\n * @param arr\n * @param item\n */\nexport function removeIfPresent<T>(arr: T[] | undefined, item: T) {\n    if (!arr) {\n        return;\n    }\n    const index = arr.indexOf(item);\n    if (index !== -1) {\n        arr.splice(index, 1);\n    }\n}\n\n/**\n * Remove items in an array which match a predicate.\n * @param arr\n * @param predicate\n */\nexport function removeIf<T>(arr: T[], predicate: (item: T) => boolean) {\n    for (let i = 0; i < arr.length; i++) {\n        if (predicate(arr[i])) {\n            arr.splice(i, 1);\n            i--;\n        }\n    }\n}\n\n/**\n * Filters out duplicate values from the given iterable.\n * @param arr\n */\nexport function unique<T>(arr: Iterable<T> | undefined): T[] {\n    return Array.from(new Set(arr));\n}\n\nexport function partition<T>(\n    iter: Iterable<T>,\n    predicate: (item: T) => boolean,\n): [T[], T[]] {\n    const left: T[] = [];\n    const right: T[] = [];\n\n    for (const item of iter) {\n        if (predicate(item)) {\n            left.push(item);\n        } else {\n            right.push(item);\n        }\n    }\n\n    return [left, right];\n}\n\nexport function* zip<T extends Iterable<any>[]>(\n    ...args: T\n): Iterable<{ [K in keyof T]: T[K] extends Iterable<infer U> ? U : T[K] }> {\n    const iterators = args.map((x) => x[Symbol.iterator]());\n\n    for (;;) {\n        const next = iterators.map((i) => i.next());\n        if (next.some((v) => v.done)) {\n            break;\n        }\n        yield next.map((v) => v.value) as any;\n    }\n}\n\nexport function filterMap<T, U>(\n    iter: Iterable<T> | undefined,\n    fn: (item: T) => U | undefined,\n): U[] {\n    const result: U[] = [];\n\n    for (const item of iter || []) {\n        const newItem = fn(item);\n        if (newItem !== void 0) {\n            result.push(newItem);\n        }\n    }\n\n    return result;\n}\n\nexport function firstDefined<T, U>(\n    array: readonly T[],\n    callback: (element: T, index: number) => U | undefined,\n): U | undefined {\n    for (let i = 0; i < array.length; i++) {\n        const result = callback(array[i], i);\n        if (result !== undefined) {\n            return result;\n        }\n    }\n    return undefined;\n}\n\nexport function filter<T>(\n    array: readonly T[] | undefined,\n    predicate: (value: T, index: number, array: readonly T[]) => boolean,\n): readonly T[] {\n    return array ? array.filter(predicate) : emptyArray;\n}\n\nexport function aggregate<T>(arr: T[], fn: (item: T) => number) {\n    return arr.reduce((sum, it) => sum + fn(it), 0);\n}\n\nexport function joinArray<T>(\n    arr: readonly T[] | undefined,\n    joiner: string,\n    mapper: (item: T) => string,\n): string {\n    if (arr?.length) {\n        return arr.map(mapper).join(joiner);\n    }\n    return \"\";\n}\n\nexport function maxElementByScore<T>(\n    arr: readonly T[],\n    score: (a: T) => number,\n): T | undefined {\n    if (arr.length === 0) {\n        return undefined;\n    }\n\n    let largest = arr[0];\n    let largestScore = score(arr[0]);\n\n    for (let i = 1; i < arr.length; ++i) {\n        const itemScore = score(arr[i]);\n        if (itemScore > largestScore) {\n            largest = arr[i];\n            largestScore = itemScore;\n        }\n    }\n\n    return largest;\n}\n"
  },
  {
    "path": "src/lib/utils-common/declarationReference.ts",
    "content": "/**\n * Parser for declaration references, see the [TSDoc grammar](https://github.com/microsoft/tsdoc/blob/main/tsdoc/src/beta/DeclarationReference.grammarkdown)\n * for reference. TypeDoc **does not** support the full grammar today. This is intentional, since the TSDoc\n * specified grammar allows the user to construct nonsensical declaration references such as `abc![def!ghi]`\n *\n * @module\n */\n\nimport type { Chars } from \"./string.js\";\n\nexport const MeaningKeywords = [\n    \"class\", // SymbolFlags.Class\n    \"interface\", // SymbolFlags.Interface\n    \"type\", // SymbolFlags.TypeAlias\n    \"enum\", // SymbolFlags.Enum\n    \"namespace\", // SymbolFlags.Module\n    \"function\", // SymbolFlags.Function\n    \"var\", // SymbolFlags.Variable\n    \"constructor\", // SymbolFlags.Constructor\n    \"member\", // SymbolFlags.ClassMember | SymbolFlags.EnumMember\n    \"event\", //\n    \"call\", // SymbolFlags.Signature (for __call)\n    \"new\", // SymbolFlags.Signature (for __new)\n    \"index\", // SymbolFlags.Signature (for __index)\n    \"complex\", // Any complex type\n\n    // TypeDoc specific\n    \"getter\",\n    \"setter\",\n] as const;\nexport type MeaningKeyword = (typeof MeaningKeywords)[number];\n\nexport interface DeclarationReference {\n    resolutionStart: \"global\" | \"local\";\n    moduleSource?: string;\n    symbolReference?: SymbolReference;\n}\n\nexport interface Meaning {\n    keyword?: MeaningKeyword;\n    label?: string;\n    index?: number;\n}\n\nexport function meaningToString(meaning: Meaning): string {\n    let result = \"\";\n    if (meaning.keyword) {\n        result += meaning.keyword;\n    } else if (meaning.label) {\n        result += meaning.label;\n    }\n    if (typeof meaning.index === \"number\") {\n        result += `(${meaning.index})`;\n    }\n    return result;\n}\n\nexport interface SymbolReference {\n    path?: ComponentPath[];\n    meaning?: Meaning;\n}\n\nexport interface ComponentPath {\n    /**\n     * How to resolve the `path`\n     * - `.` - Navigate via `exports` of symbol\n     * - `#` - Navigate via `members` of symbol\n     * - `~` - Navigate via `locals` of symbol (note: TypeDoc does not support\n     *   locals, see the declaration reference docs)\n     */\n    navigation: \".\" | \"#\" | \"~\";\n    path: string;\n}\n\n// <TAB> <VT> <FF> <SP> <NBSP> <ZWNBSP> <USP>\nconst WhiteSpace = /[\\t\\u2B7F\\u240C \\u00A0\\uFEFF\\p{White_Space}]/u;\nconst LineTerminator = \"\\r\\n\\u2028\\u2029\";\nconst Punctuators = \"{}()[]!.#~:,\";\nconst FutureReservedPunctuator = \"{}@\";\nconst NavigationPunctuator = \".#~\";\nconst DecimalDigit = \"0123456789\";\nconst HexDigit = DecimalDigit + \"abcdefABCDEF\";\nconst SingleEscapeCharacter = `'\"\\\\bfnrtv`;\nconst EscapeCharacter = SingleEscapeCharacter + DecimalDigit + \"xu\";\nconst UserLabelStart = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ_\";\nconst UserLabelCharacter = UserLabelStart + DecimalDigit;\n\nconst SingleEscapeChars: Record<Chars<typeof SingleEscapeCharacter>, string> = {\n    \"'\": \"'\",\n    '\"': '\"',\n    \"\\\\\": \"\\\\\",\n    b: \"\\b\",\n    f: \"\\f\",\n    n: \"\\n\",\n    r: \"\\r\",\n    t: \"\\t\",\n    v: \"\\v\",\n};\n\n// EscapeSequence::\n//     SingleEscapeCharacter\n//     NonEscapeCharacter\n//     `0` [lookahead != DecimalDigit]\n//     HexEscapeSequence\n//     UnicodeEscapeSequence\nfunction parseEscapeSequence(\n    source: string,\n    pos: number,\n    end: number,\n): [string, number] | undefined {\n    // SingleEscapeCharacter\n    if (SingleEscapeCharacter.includes(source[pos])) {\n        return [SingleEscapeChars[source[pos] as \"b\"], pos + 1];\n    }\n\n    // NonEscapeCharacter:: SourceCharacter but not one of EscapeCharacter or LineTerminator\n    if (!(EscapeCharacter + LineTerminator).includes(source[pos])) {\n        return [source[pos], pos + 1];\n    }\n\n    // `0` [lookahead != DecimalDigit]\n    if (\n        source[pos] === \"0\" &&\n        pos + 1 < end &&\n        !DecimalDigit.includes(source[pos + 1])\n    ) {\n        return [\"\\x00\", pos + 1];\n    }\n\n    // HexEscapeSequence:: x HexDigit HexDigit\n    if (\n        source[pos] === \"x\" &&\n        pos + 2 < end &&\n        HexDigit.includes(source[pos + 1]) &&\n        HexDigit.includes(source[pos + 2])\n    ) {\n        return [\n            String.fromCharCode(\n                parseInt(source.substring(pos + 1, pos + 3), 16),\n            ),\n            pos + 3,\n        ];\n    }\n\n    return parseUnicodeEscapeSequence(source, pos, end);\n}\n\n// UnicodeEscapeSequence::\n//     `u` HexDigit HexDigit HexDigit HexDigit\n//     `u` `{` CodePoint `}`\n// CodePoint:: > |HexDigits| but only if MV of |HexDigits| ≤ 0x10FFFF\nfunction parseUnicodeEscapeSequence(\n    source: string,\n    pos: number,\n    end: number,\n): [string, number] | undefined {\n    if (source[pos] !== \"u\" || pos + 1 >= end) {\n        return;\n    }\n\n    if (HexDigit.includes(source[pos + 1])) {\n        if (\n            pos + 4 >= end ||\n            !HexDigit.includes(source[pos + 2]) ||\n            !HexDigit.includes(source[pos + 3]) ||\n            !HexDigit.includes(source[pos + 4])\n        ) {\n            return;\n        }\n\n        return [\n            String.fromCharCode(\n                parseInt(source.substring(pos + 1, pos + 5), 16),\n            ),\n            pos + 5,\n        ];\n    }\n\n    if (\n        source[pos + 1] === \"{\" &&\n        pos + 2 < end &&\n        HexDigit.includes(source[pos + 2])\n    ) {\n        let lookahead = pos + 3;\n\n        while (lookahead < end && HexDigit.includes(source[lookahead])) {\n            lookahead++;\n        }\n\n        if (lookahead >= end || source[lookahead] !== \"}\") return;\n\n        const codePoint = parseInt(source.substring(pos + 2, lookahead), 16);\n        if (codePoint <= 0x10ffff) {\n            return [String.fromCodePoint(codePoint), lookahead + 1];\n        }\n    }\n}\n\n// String:: `\"` StringCharacters? `\"`\n// StringCharacters:: StringCharacter StringCharacters?\n// StringCharacter::\n//   SourceCharacter but not one of `\"` or `\\` or LineTerminator\n//   `\\` EscapeSequence\nexport function parseString(\n    source: string,\n    pos: number,\n    end: number,\n): [string, number] | undefined {\n    let result = \"\";\n\n    if (source[pos++] !== '\"') return;\n\n    while (pos < end) {\n        if (source[pos] === '\"') {\n            return [result, pos + 1];\n        }\n\n        if (LineTerminator.includes(source[pos])) return;\n\n        if (source[pos] === \"\\\\\") {\n            const esc = parseEscapeSequence(source, pos + 1, end);\n            if (!esc) return;\n\n            result += esc[0];\n            pos = esc[1];\n            continue;\n        }\n\n        result += source[pos++];\n    }\n}\n\n// ModuleSource:: String | ModuleSourceCharacters\nexport function parseModuleSource(\n    source: string,\n    pos: number,\n    end: number,\n): [string, number] | undefined {\n    if (pos >= end) return;\n\n    if (source[pos] === '\"') {\n        return parseString(source, pos, end);\n    }\n\n    let lookahead = pos;\n    while (\n        lookahead < end &&\n        !('\"!' + LineTerminator).includes(source[lookahead])\n    ) {\n        lookahead++;\n    }\n\n    if (lookahead === pos) return;\n\n    return [source.substring(pos, lookahead), lookahead];\n}\n\n// SymbolReference:\n//     ComponentPath Meaning?\n//     Meaning\nexport function parseSymbolReference(\n    source: string,\n    pos: number,\n    end: number,\n): [SymbolReference, number] | undefined {\n    const path = parseComponentPath(source, pos, end);\n    pos = path?.[1] ?? pos;\n\n    const meaning = parseMeaning(source, pos, end);\n    pos = meaning?.[1] ?? pos;\n\n    if (path || meaning) {\n        return [{ path: path?.[0], meaning: meaning?.[0] }, pos];\n    }\n}\n\n// Component::\n//     String\n//     ComponentCharacters\n//     `[` DeclarationReference `]` <--- THIS ONE IS NOT IMPLEMENTED.\nexport function parseComponent(\n    source: string,\n    pos: number,\n    end: number,\n): [string, number] | undefined {\n    if (pos < end && source[pos] === '\"') {\n        return parseString(source, pos, end);\n    }\n\n    let lookahead = pos;\n    while (\n        lookahead < end &&\n        !(\n            '\"' +\n            Punctuators +\n            FutureReservedPunctuator +\n            LineTerminator\n        ).includes(source[lookahead]) &&\n        !WhiteSpace.test(source[lookahead])\n    ) {\n        lookahead++;\n    }\n\n    if (lookahead === pos) return;\n\n    return [source.substring(pos, lookahead), lookahead];\n}\n\n// ComponentPath:\n//     Component\n//     ComponentPath `.` Component                      // Navigate via 'exports' of |ComponentPath|\n//     ComponentPath `#` Component                      // Navigate via 'members' of |ComponentPath|\n//     ComponentPath `~` Component                      // Navigate via 'locals' of |ComponentPath|\nexport function parseComponentPath(source: string, pos: number, end: number) {\n    const components: ComponentPath[] = [];\n    let component = parseComponent(source, pos, end);\n\n    if (!component) return;\n    pos = component[1];\n    components.push({ navigation: \".\", path: component[0] });\n\n    while (pos < end && NavigationPunctuator.includes(source[pos])) {\n        const navigation = source[pos] as \".\" | \"#\" | \"~\";\n        pos++;\n        component = parseComponent(source, pos, end);\n        if (!component) {\n            return;\n        }\n\n        pos = component[1];\n        components.push({ navigation, path: component[0] });\n    }\n\n    return [components, pos] as const;\n}\n\n// The TSDoc specification permits the first four branches of Meaning. TypeDoc adds the UserLabel\n// branch so that the @label tag can be used with this form of declaration references.\n// Meaning:\n//     `:` MeaningKeyword                            // Indicates the meaning of a symbol (i.e. ':class')\n//     `:` MeaningKeyword `(` DecimalDigits `)`      // Indicates an overloaded meaning (i.e. ':function(1)')\n//     `:` `(` DecimalDigits `)`                     // Shorthand for an overloaded meaning (i.e. `:(1)`)\n//     `:` DecimalDigits                             // Shorthand for an overloaded meaning (i.e. ':1')\n//     `:` UserLabel                                 // Indicates a user defined label via {@label CUSTOM_LABEL}\n//\n// UserLabel:\n//     UserLabelStart UserLabelCharacter*\nexport function parseMeaning(\n    source: string,\n    pos: number,\n    end: number,\n): [Meaning, number] | undefined {\n    if (source[pos++] !== \":\") return;\n\n    const keyword = MeaningKeywords.find(\n        (kw) => pos + kw.length <= end && source.startsWith(kw, pos),\n    );\n\n    if (keyword) {\n        pos += keyword.length;\n    }\n\n    if (!keyword && UserLabelStart.includes(source[pos])) {\n        let lookahead = pos + 1;\n\n        while (\n            lookahead < end &&\n            UserLabelCharacter.includes(source[lookahead])\n        ) {\n            lookahead++;\n        }\n\n        return [{ label: source.substring(pos, lookahead) }, lookahead];\n    }\n\n    if (\n        pos + 1 < end &&\n        source[pos] === \"(\" &&\n        DecimalDigit.includes(source[pos + 1])\n    ) {\n        let lookahead = pos + 1;\n\n        while (lookahead < end && DecimalDigit.includes(source[lookahead])) {\n            lookahead++;\n        }\n\n        if (lookahead < end && source[lookahead] === \")\") {\n            return [\n                {\n                    keyword,\n                    index: parseInt(source.substring(pos + 1, lookahead)),\n                },\n                lookahead + 1,\n            ];\n        }\n    }\n\n    if (!keyword && pos < end && DecimalDigit.includes(source[pos])) {\n        let lookahead = pos;\n\n        while (lookahead < end && DecimalDigit.includes(source[lookahead])) {\n            lookahead++;\n        }\n\n        return [\n            {\n                index: parseInt(source.substring(pos, lookahead)),\n            },\n            lookahead,\n        ];\n    }\n\n    if (keyword) {\n        return [{ keyword }, pos];\n    }\n}\n\n// // NOTE: The following grammar is incorrect as |SymbolReference| and |ModuleSource| have an\n// //       ambiguous parse. The correct solution is to use a cover grammar to parse\n// //       |SymbolReference| until we hit a `!` and then reinterpret the grammar.\n// DeclarationReference:\n//   [empty]\n//   SymbolReference                               // Shorthand reference to symbol\n//   ModuleSource `!`                              // Reference to a module\n//   ModuleSource `!` SymbolReference              // Reference to an export of a module\n//   ModuleSource `!` `~` SymbolReference          // Reference to a local of a module\n//   `!` SymbolReference                           // Reference to global symbol\nexport function parseDeclarationReference(\n    source: string,\n    pos: number,\n    end: number,\n): [DeclarationReference, number] | undefined {\n    let moduleSource: string | undefined;\n    let symbolReference: SymbolReference | undefined;\n    let resolutionStart: \"global\" | \"local\" = \"local\";\n    let topLevelLocalReference = false;\n\n    const moduleSourceOrSymbolRef = parseModuleSource(source, pos, end);\n    if (moduleSourceOrSymbolRef) {\n        if (\n            moduleSourceOrSymbolRef[1] < end &&\n            source[moduleSourceOrSymbolRef[1]] === \"!\"\n        ) {\n            // We had a module source!\n            pos = moduleSourceOrSymbolRef[1] + 1;\n            resolutionStart = \"global\";\n            moduleSource = moduleSourceOrSymbolRef[0];\n\n            // We might be referencing a local of a module\n            if (source[pos] === \"~\") {\n                topLevelLocalReference = true;\n                pos++;\n            }\n        }\n    } else if (source[pos] === \"!\") {\n        pos++;\n        resolutionStart = \"global\";\n    }\n\n    const ref = parseSymbolReference(source, pos, end);\n    if (ref) {\n        symbolReference = ref[0];\n        if (topLevelLocalReference && symbolReference.path?.length) {\n            symbolReference.path[0].navigation = \"~\";\n        }\n        pos = ref[1];\n    }\n\n    if (!moduleSource && !symbolReference) return;\n\n    return [\n        {\n            moduleSource,\n            resolutionStart,\n            symbolReference,\n        },\n        pos,\n    ];\n}\n"
  },
  {
    "path": "src/lib/utils-common/enum.ts",
    "content": "export function getEnumFlags<T extends number>(flags: T): T[] {\n    const result: T[] = [];\n    for (let i = 1; i <= flags; i <<= 1) {\n        if (flags & i) {\n            result.push(i as T);\n        }\n    }\n\n    return result;\n}\n\n// T & {} reduces inference priority\nexport function removeFlag<T extends number>(flag: T, remove: T & {}): T {\n    return (flag & ~remove) as T;\n}\n\nexport function hasAllFlags(flags: number, check: number): boolean {\n    return (flags & check) === check;\n}\n\nexport function hasAnyFlag(flags: number, check: number): boolean {\n    return (flags & check) !== 0;\n}\n\nexport function debugFlags(Enum: object, flags: number): string[] {\n    return getEnumKeys(Enum).filter(\n        (key) => ((Enum as any)[key] & flags) === (Enum as any)[key],\n    );\n}\n\n// Note: String enums are not handled.\nexport function getEnumKeys(Enum: object): string[] {\n    const E = Enum as any;\n    return Object.keys(E).filter((k) => E[E[k]] === k);\n}\n\nexport type EnumKeys<E extends object> =\n    & {\n        [K in keyof E]: number extends E[K] ? K : never;\n    }[keyof E]\n    & {};\n"
  },
  {
    "path": "src/lib/utils-common/events.ts",
    "content": "import { insertPrioritySorted } from \"./array.js\";\n\n/**\n * Intentionally very simple event emitter.\n *\n * @privateRemarks\n * This is essentially a stripped down copy of EventHooks in hooks.ts.\n */\nexport class EventDispatcher<T extends Record<keyof T, unknown[]>> {\n    // Function is *usually* not a good type to use, but here it lets us specify stricter\n    // contracts in the methods while not casting everywhere this is used.\n    private _listeners = new Map<\n        keyof T,\n        {\n            listener: (..._: any) => any;\n            priority: number;\n        }[]\n    >();\n\n    /**\n     * Starts listening to an event.\n     * @param event the event to listen to.\n     * @param listener function to be called when an this event is emitted.\n     * @param priority optional priority to insert this hook with.\n     *  Higher priority is placed earlier in the listener array.\n     */\n    on<K extends keyof T>(\n        event: K,\n        listener: (this: undefined, ...args: T[K]) => void,\n        priority = 0,\n    ): void {\n        const list = (this._listeners.get(event) || []).slice();\n        insertPrioritySorted(list, { listener, priority });\n        this._listeners.set(event, list);\n    }\n\n    /**\n     * Stops listening to an event.\n     * @param event the event to stop listening to.\n     * @param listener the function to remove from the listener array.\n     */\n    off<K extends keyof T>(\n        event: K,\n        listener: (this: undefined, ...args: T[K]) => void,\n    ): void {\n        const listeners = this._listeners.get(event);\n        if (listeners) {\n            const index = listeners.findIndex((lo) => lo.listener === listener);\n            if (index > -1) {\n                listeners.splice(index, 1);\n            }\n        }\n    }\n\n    /**\n     * Emits an event to all currently subscribed listeners.\n     * @param event the event to emit.\n     * @param args any arguments required for the event.\n     */\n    trigger<K extends keyof T>(event: K, ...args: T[K]): void {\n        const listeners = this._listeners.get(event)?.slice() || [];\n        for (const { listener } of listeners) {\n            listener(...args);\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/general.ts",
    "content": "/**\n * This type provides a flag that can be used to turn off more lax overloads intended for\n * plugin use only to catch type errors in the TypeDoc codebase. The prepublishOnly npm\n * script will be used to switch this flag to false when publishing, then immediately back\n * to true after a successful publish.\n */\ntype InternalOnly = true;\n\n/**\n * Helper type to convert `T` to `F` if compiling TypeDoc with stricter types.\n *\n * Can be used in overloads to map a parameter type to `never`. For example, the\n * following function will work with any string argument, but to improve the type safety\n * of internal code, we only ever want to pass 'a' or 'b' to it. Plugins on the other\n * hand need to be able to pass any string to it. Overloads similar to this are used\n * in the {@link Options} class.\n *\n * This is also used to prevent TypeDoc code from using deprecated methods which will\n * be removed in a future release.\n *\n * ```ts\n * function over(flag: 'a' | 'b'): string\n * // deprecated\n * function over(flag: IfInternal<never, string>): string\n * function over(flag: string): string { return flag }\n * ```\n */\nexport type IfInternal<T, F> = InternalOnly extends true ? T : F;\n\n/**\n * Helper type to convert `T` to `never` if compiling TypeDoc with stricter types.\n *\n * See {@link IfInternal} for the rationale.\n */\nexport type NeverIfInternal<T> = IfInternal<never, T>;\n\n/**\n * Utility to help type checking ensure that there is no uncovered case.\n */\nexport function assertNever(x: never): never {\n    throw new Error(\n        `Expected handling to cover all possible cases, but it didn't cover: ${JSON.stringify(x)}`,\n    );\n}\n\nexport function assert(x: unknown, message = \"Assertion failed\"): asserts x {\n    if (!x) {\n        // eslint-disable-next-line no-debugger\n        debugger;\n        throw new Error(message);\n    }\n}\n\nexport function NonEnumerable(\n    _cls: unknown,\n    context: ClassFieldDecoratorContext,\n) {\n    context.addInitializer(function () {\n        Object.defineProperty(this, context.name, {\n            enumerable: false,\n            configurable: true,\n            writable: true,\n        });\n    });\n}\n"
  },
  {
    "path": "src/lib/utils-common/hooks.ts",
    "content": "import { insertOrderSorted } from \"./array.js\";\n\nconst momentos = new WeakMap<\n    EventHooksMomento<never, unknown>,\n    Map<any, { listener: (..._: any) => any; once?: boolean; order: number }[]>\n>();\n\ntype EventHooksMomento<T extends Record<keyof T, unknown[]>, _R> = {\n    __eventHooksMomentoBrand: never;\n};\n\n/**\n * Event emitter which allows listeners to return a value.\n *\n * This is beneficial for the themes since it allows plugins to modify the HTML output\n * without doing unsafe text replacement.\n *\n * Very simple event emitter class which collects the return values of its listeners.\n *\n * @example\n * ```ts\n * const x = new EventHooks<{ a: [string] }, string>()\n * x.on('a', a => a.repeat(123)) // ok, returns a string\n * x.on('b', console.log) // error, 'b' is not assignable to 'a'\n * x.on('a' a => 1) // error, returns a number but expected a string\n * ```\n */\nexport class EventHooks<T extends Record<keyof T, unknown[]>, R> {\n    // Function is *usually* not a good type to use, but here it lets us specify stricter\n    // contracts in the methods while not casting everywhere this is used.\n    private _listeners = new Map<\n        keyof T,\n        { listener: (..._: any) => any; once?: boolean; order: number }[]\n    >();\n\n    /**\n     * Starts listening to an event.\n     * @param event the event to listen to.\n     * @param listener function to be called when an this event is emitted.\n     * @param order optional order to insert this hook with.\n     */\n    on<K extends keyof T>(\n        event: K,\n        listener: (...args: T[K]) => R,\n        order = 0,\n    ): void {\n        const list = (this._listeners.get(event) || []).slice();\n        insertOrderSorted(list, { listener, order });\n        this._listeners.set(event, list);\n    }\n\n    /**\n     * Listens to a single occurrence of an event.\n     * @param event the event to listen to.\n     * @param listener function to be called when an this event is emitted.\n     * @param order optional order to insert this hook with.\n     */\n    once<K extends keyof T>(\n        event: K,\n        listener: (...args: T[K]) => R,\n        order = 0,\n    ): void {\n        const list = (this._listeners.get(event) || []).slice();\n        insertOrderSorted(list, { listener, once: true, order });\n        this._listeners.set(event, list);\n    }\n\n    /**\n     * Stops listening to an event.\n     * @param event the event to stop listening to.\n     * @param listener the function to remove from the listener array.\n     */\n    off<K extends keyof T>(event: K, listener: (...args: T[K]) => R): void {\n        const listeners = this._listeners.get(event);\n        if (listeners) {\n            const index = listeners.findIndex((lo) => lo.listener === listener);\n            if (index > -1) {\n                listeners.splice(index, 1);\n            }\n        }\n    }\n\n    /**\n     * Emits an event to all currently subscribed listeners.\n     * @param event the event to emit.\n     * @param args any arguments required for the event.\n     */\n    emit<K extends keyof T>(event: K, ...args: T[K]): R[] {\n        const listeners = this._listeners.get(event)?.slice() || [];\n        this._listeners.set(\n            event,\n            listeners.filter(({ once }) => !once),\n        );\n        return listeners.map(({ listener }) => listener(...args));\n    }\n\n    saveMomento(): EventHooksMomento<T, R> {\n        const momento = {} as EventHooksMomento<T, R>;\n        const save = new Map<\n            keyof T,\n            { listener: (..._: any) => any; once?: boolean; order: number }[]\n        >();\n\n        for (const [key, val] of this._listeners) {\n            save.set(key, [...val]);\n        }\n\n        momentos.set(momento, save);\n        return momento;\n    }\n\n    restoreMomento(momento: EventHooksMomento<T, R>): void {\n        const saved = momentos.get(momento);\n        if (saved) {\n            this._listeners.clear();\n            for (const [key, val] of saved) {\n                this._listeners.set(key, [...val]);\n            }\n        } else {\n            throw new Error(\"Momento not found.\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/i18n.ts",
    "content": "// Type only import to non-bundled file\n// eslint-disable-next-line no-restricted-imports\nimport type { TranslationProxy } from \"../internationalization/internationalization.js\";\nimport type { TagString } from \"./validation.js\";\n\nlet translations: Record<PropertyKey, string> = {};\n\ndeclare const TranslatedString: unique symbol;\nexport type TranslatedString = string & { [TranslatedString]: true };\n\n/**\n * Set the available translations to be used by TypeDoc.\n */\nexport function setTranslations(t: Record<string, string>) {\n    translations = { ...t };\n}\n\n/**\n * Add the specified translations to the current translations object\n * Any keys already specified will overwrite current keys\n */\nexport function addTranslations(t: Record<string, string>) {\n    Object.assign(translations, t);\n}\n\nexport const i18n = new Proxy({}, {\n    get(_, key) {\n        return (...args: string[]) => {\n            const template = String(translations[key] || key);\n            return template.replace(/\\{(\\d+)\\}/g, (_, index) => {\n                return args[+index] ?? \"(no placeholder)\";\n            });\n        };\n    },\n    has(_, key) {\n        return Object.prototype.hasOwnProperty.call(translations, key);\n    },\n}) as TranslationProxy;\n\nexport function translateTagName(tag: TagString): TranslatedString {\n    const tagName = tag.substring(1);\n    if (Object.prototype.hasOwnProperty.call(translations, `tag_${tagName}`)) {\n        return translations[`tag_${tagName}`] as TranslatedString;\n    }\n    // In English, the tag names are the translated names, once turned\n    // into title case.\n    return (tagName.substring(0, 1).toUpperCase() +\n        tagName\n            .substring(1)\n            .replace(\n                /[a-z][A-Z]/g,\n                (x) => `${x[0]} ${x[1]}`,\n            )) as TranslatedString;\n}\n"
  },
  {
    "path": "src/lib/utils-common/index.ts",
    "content": "// utils-common includes utilities which don't depend on anything, and thus can be used\n// within the browser-utils export which is suitable for bundling.\n\nexport * from \"./array.js\";\nexport * from \"./declarationReference.js\";\nexport * from \"./enum.js\";\nexport * from \"./events.js\";\nexport * from \"./general.js\";\nexport * from \"./hooks.js\";\nexport * from \"./i18n.js\";\nexport * as JSX from \"./jsx.js\";\nexport * from \"./logger.js\";\nexport * from \"./map.js\";\nexport * from \"./minimalSourceFile.js\";\nexport * from \"./path.js\";\nexport * from \"./set.js\";\nexport * from \"./string.js\";\nexport * as Validation from \"./validation.js\";\nexport type { TagString } from \"./validation.js\";\n"
  },
  {
    "path": "src/lib/utils-common/jsx.elements.ts",
    "content": "export interface IntrinsicElements {\n    // HTML Elements\n    a: JsxAElementProps;\n    abbr: JsxHtmlGlobalProps;\n    address: JsxHtmlGlobalProps;\n    area: JsxAreaElementProps;\n    article: JsxHtmlGlobalProps;\n    aside: JsxHtmlGlobalProps;\n    audio: JsxAudioElementProps;\n    b: JsxHtmlGlobalProps;\n    base: JsxBaseElementProps;\n    bdi: JsxHtmlGlobalProps;\n    bdo: JsxHtmlGlobalProps;\n    blockquote: JsxBlockquoteElementProps;\n    body: JsxHtmlGlobalProps;\n    br: JsxBrElementProps;\n    button: JsxButtonElementProps;\n    canvas: JsxCanvasElementProps;\n    caption: JsxHtmlGlobalProps;\n    cite: JsxHtmlGlobalProps;\n    code: JsxHtmlGlobalProps;\n    col: JsxColElementProps;\n    colgroup: JsxColgroupElementProps;\n    data: JsxDataElementProps;\n    datalist: JsxHtmlGlobalProps;\n    dd: JsxHtmlGlobalProps;\n    del: JsxDelElementProps;\n    details: JsxDetailsElementProps;\n    dfn: JsxHtmlGlobalProps;\n    dialog: JsxDialogElementProps;\n    div: JsxHtmlGlobalProps;\n    dl: JsxHtmlGlobalProps;\n    dt: JsxHtmlGlobalProps;\n    em: JsxHtmlGlobalProps;\n    embed: JsxEmbedElementProps;\n    fieldset: JsxFieldsetElementProps;\n    figcaption: JsxHtmlGlobalProps;\n    figure: JsxHtmlGlobalProps;\n    footer: JsxHtmlGlobalProps;\n    form: JsxFormElementProps;\n    h1: JsxFormElementProps;\n    h2: JsxFormElementProps;\n    h3: JsxFormElementProps;\n    h4: JsxFormElementProps;\n    h5: JsxFormElementProps;\n    h6: JsxFormElementProps;\n    head: JsxHtmlGlobalProps;\n    header: JsxHtmlGlobalProps;\n    hgroup: JsxHtmlGlobalProps;\n    hr: JsxHtmlGlobalProps;\n    html: JsxHtmlElementProps;\n    i: JsxHtmlGlobalProps;\n    iframe: JsxIframeElementProps;\n    img: JsxImgElementProps;\n    input: JsxInputElementProps;\n    ins: JsxInsElementProps;\n    kbd: JsxHtmlGlobalProps;\n    label: JsxLabelElementProps;\n    legend: JsxHtmlGlobalProps;\n    li: JsxLiElementProps;\n    link: JsxLinkElementProps;\n    main: JsxHtmlGlobalProps;\n    map: JsxMapElementProps;\n    mark: JsxHtmlGlobalProps;\n    meta: JsxMetaElementProps;\n    meter: JsxMeterElementProps;\n    nav: JsxHtmlGlobalProps;\n    noscript: JsxHtmlGlobalProps;\n    object: JsxObjectElementProps;\n    ol: JsxOlElementProps;\n    optgroup: JsxOptgroupElementProps;\n    option: JsxOptionElementProps;\n    output: JsxOutputElementProps;\n    p: JsxHtmlGlobalProps;\n    param: JsxParamElementProps;\n    picture: JsxHtmlGlobalProps;\n    portal: JsxPortalElementProps;\n    pre: JsxHtmlGlobalProps;\n    progress: JsxProgressElementProps;\n    q: JsxQElementProps;\n    rp: JsxHtmlGlobalProps;\n    rt: JsxHtmlGlobalProps;\n    ruby: JsxHtmlGlobalProps;\n    s: JsxHtmlGlobalProps;\n    samp: JsxHtmlGlobalProps;\n    script: JsxScriptElementProps;\n    section: JsxHtmlGlobalProps;\n    select: JsxSelectElementProps;\n    slot: JsxSlotElementProps;\n    small: JsxHtmlGlobalProps;\n    source: JsxSourceElementProps;\n    span: JsxHtmlGlobalProps;\n    strong: JsxHtmlGlobalProps;\n    style: JsxStyleElementProps;\n    sub: JsxHtmlGlobalProps;\n    summary: JsxHtmlGlobalProps;\n    sup: JsxHtmlGlobalProps;\n    table: JsxHtmlGlobalProps;\n    tbody: JsxHtmlGlobalProps;\n    td: JsxTdElementProps;\n    template: JsxHtmlGlobalProps;\n    textarea: JsxTextareaElementProps;\n    tfoot: JsxHtmlGlobalProps;\n    th: JsxThElementProps;\n    thead: JsxHtmlGlobalProps;\n    time: JsxTimeElementProps;\n    title: JsxHtmlGlobalProps;\n    tr: JsxHtmlGlobalProps;\n    track: JsxTrackElementProps;\n    u: JsxHtmlGlobalProps;\n    ul: JsxHtmlGlobalProps;\n    var: JsxHtmlGlobalProps;\n    video: JsxVideoElementProps;\n    wbr: JsxHtmlGlobalProps;\n\n    // SVG Elements\n    svg: JsxSvgElementProps;\n    g: JsxGElementProps;\n    path: JsxPathElementProps;\n    rect: JsxRectElementProps;\n    circle: JsxCircleElementProps;\n    ellipse: JsxEllipseElementProps;\n    polygon: JsxPolygonElementProps;\n    polyline: JsxPolylineElementProps;\n    line: JsxLineElementProps;\n    use: JsxUseElementProps;\n    text: JsxTextElementProps;\n    image: JsxImageElementProps;\n}\n\nexport function JsxFragment(): never {\n    throw new Error(\"Should never be called\");\n}\n\nexport type JsxComponent<P> = (props: P) => JsxElement | null | undefined;\n\nexport interface JsxElement {\n    tag: typeof JsxFragment | string | JsxComponent<any>;\n    props: object | null;\n    children: JsxChildren[];\n}\n\nexport type JsxChildren =\n    | JsxElement\n    | string\n    | number\n    | boolean\n    | bigint\n    | null\n    | undefined\n    | JsxChildren[];\n\n/**\n * The common properties that may appear on any HTML element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#list_of_global_attributes\n */\nexport interface JsxHtmlGlobalProps {\n    accessKey?: string;\n    autocapitalize?: string;\n    children?: JsxChildren;\n    class?: string;\n    contentEditable?: string;\n    [data: `data-${string}`]: string;\n    dir?: string;\n    draggable?: boolean;\n    enterKeyHint?: string;\n    hidden?: boolean;\n    id?: string;\n    inputMode?: string;\n    is?: string;\n\n    // WHATWG HTML Microdata\n    itemId?: string;\n    itemProp?: string;\n    itemRef?: string;\n    itemScope?: string;\n    itemType?: string;\n\n    lang?: string;\n    nonce?: string;\n    part?: string;\n\n    role?: string;\n    slot?: string;\n    spellcheck?: boolean;\n    style?: string;\n    tabIndex?: number;\n    title?: string;\n    translate?: boolean;\n\n    // popover attributes\n    /**\n     * Default: 'auto'. true and 'auto' are equivalent\n     *\n     * See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) for more details\n     */\n    popover?: boolean | \"auto\" | \"manual\";\n    /**\n     * It must be the popover element id, see [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)\n     */\n    popovertarget?: string;\n    popovertargetaction?: \"hide\" | \"show\" | \"toggle\";\n}\n\n/**\n * Properties permitted on the `<a>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a\n */\nexport interface JsxAElementProps extends JsxHtmlGlobalProps {\n    download?: string;\n    href?: string;\n    hreflang?: string;\n    ping?: string;\n    referrerPolicy?: string;\n    rel?: string;\n    target?: string;\n    type?: string;\n}\n\n/**\n * Properties permitted on the `<area>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area\n */\nexport interface JsxAreaElementProps extends JsxHtmlGlobalProps {\n    alt?: string;\n    coords?: string;\n    download?: string;\n    href?: string;\n    hreflang?: string;\n    ping?: string;\n    referrerPolicy?: string;\n    rel?: string;\n    shape?: \"rect\" | \"circle\" | \"poly\" | \"default\";\n    target?: \"_self\" | \"_blank\" | \"_parent\" | \"_top\";\n}\n\n/**\n * Properties permitted on the `<audio>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio\n */\nexport interface JsxAudioElementProps extends JsxHtmlGlobalProps {\n    autoplay?: boolean;\n    controls?: boolean;\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    loop?: boolean;\n    muted?: boolean;\n    preload?: \"none\" | \"metadata\" | \"auto\" | \"\";\n    src?: string;\n}\n\n/**\n * Properties permitted on the `<base>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base\n */\nexport interface JsxBaseElementProps extends JsxHtmlGlobalProps {\n    href?: string;\n    target?: string;\n}\n\n/**\n * Properties permitted on the `<blockquote>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote\n */\nexport interface JsxBlockquoteElementProps extends JsxHtmlGlobalProps {\n    cite?: string;\n}\n\n/**\n * Properties permitted on the `<br>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br\n */\nexport interface JsxBrElementProps extends JsxHtmlGlobalProps {\n    clear?: string;\n}\n\n/**\n * Properties permitted on the `<button>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button\n */\nexport interface JsxButtonElementProps extends JsxHtmlGlobalProps {\n    autofocus?: boolean;\n    disabled?: boolean;\n    form?: string;\n    formAction?: string;\n    formEnctype?:\n        | \"application/x-www-form-urlencoded\"\n        | \"multipart/form-data\"\n        | \"text/plain\";\n    formMethod?: \"get\" | \"post\";\n    formNoValidate?: boolean;\n    formTarget?: \"_self\" | \"_blank\" | \"_parent\" | \"_top\";\n    name?: string;\n    type?: \"submit\" | \"reset\" | \"button\";\n    value?: string;\n}\n\n/**\n * Properties permitted on the `<canvas>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas\n */\nexport interface JsxCanvasElementProps extends JsxHtmlGlobalProps {\n    height?: number;\n    width?: number;\n}\n\n/**\n * Properties permitted on the `<col>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col\n */\nexport interface JsxColElementProps extends JsxHtmlGlobalProps {\n    span?: number;\n}\n\n/**\n * Properties permitted on the `<colgroup>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup\n */\nexport interface JsxColgroupElementProps extends JsxHtmlGlobalProps {\n    span?: number;\n}\n\n/**\n * Properties permitted on the `<data>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data\n */\nexport interface JsxDataElementProps extends JsxHtmlGlobalProps {\n    value?: string;\n}\n\n/**\n * Properties permitted on the `<del>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del\n */\nexport interface JsxDelElementProps extends JsxHtmlGlobalProps {\n    cite?: string;\n    dateTime?: string;\n}\n\n/**\n * Properties permitted on the `<details>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details\n */\nexport interface JsxDetailsElementProps extends JsxHtmlGlobalProps {\n    open?: boolean;\n}\n\n/**\n * Properties permitted on the `<dialog>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog\n */\nexport interface JsxDialogElementProps extends JsxHtmlGlobalProps {\n    open?: boolean;\n}\n\n/**\n * Properties permitted on the `<embed>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed\n */\nexport interface JsxEmbedElementProps extends JsxHtmlGlobalProps {\n    height?: number;\n    src?: string;\n    type?: string;\n    width?: number;\n}\n\n/**\n * Properties permitted on the `<fieldset>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset\n */\nexport interface JsxFieldsetElementProps extends JsxHtmlGlobalProps {\n    disabled?: boolean;\n    form?: string;\n    name?: string;\n}\n\n/**\n * Properties permitted on the `<form>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form\n */\nexport interface JsxFormElementProps extends JsxHtmlGlobalProps {\n    \"accept-charset\"?: string;\n    action?: string;\n    enctype?:\n        | \"application/x-www-form-urlencoded\"\n        | \"multipart/form-data\"\n        | \"text/plain\";\n    autocomplete?: string;\n    method?: \"get\" | \"post\" | \"dialog\";\n    name?: string;\n    noValidate?: boolean;\n    rel?: string;\n    target?: \"_self\" | \"_blank\" | \"_parent\" | \"_top\";\n}\n\n/**\n * Properties permitted on the `<html>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html\n */\nexport interface JsxHtmlElementProps extends JsxHtmlGlobalProps {\n    xmlns?: string;\n}\n\n/**\n * Properties permitted on the `<iframe>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe\n */\nexport interface JsxIframeElementProps extends JsxHtmlGlobalProps {\n    allow?: string;\n    height?: number;\n    name?: string;\n    referrerPolicy?:\n        | \"no-referrer\"\n        | \"no-referrer-when-downgrade\"\n        | \"origin\"\n        | \"origin-when-cross-origin\"\n        | \"same-origin\"\n        | \"strict-origin\"\n        | \"strict-origin-when-cross-origin\"\n        | \"unsafe-url\";\n    sandbox?: string;\n    src?: string;\n    srcdoc?: string;\n    width?: number;\n}\n\n/**\n * Properties permitted on the `<img>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img\n */\nexport interface JsxImgElementProps extends JsxHtmlGlobalProps {\n    alt?: string;\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    decoding?: \"async\" | \"sync\" | \"auto\";\n    height?: number;\n    isMap?: boolean;\n    referrerPolicy?:\n        | \"no-referrer\"\n        | \"no-referrer-when-downgrade\"\n        | \"origin\"\n        | \"origin-when-cross-origin\"\n        | \"same-origin\"\n        | \"strict-origin\"\n        | \"strict-origin-when-cross-origin\"\n        | \"unsafe-url\";\n    sizes?: string;\n    src: string;\n    srcset?: string;\n    width?: number;\n}\n\n/**\n * Properties permitted on the `<input>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input\n */\nexport interface JsxInputElementProps extends JsxHtmlGlobalProps {\n    accept?: string;\n    alt?: string;\n    autocomplete?: string;\n    autofocus?: boolean;\n    capture?: string;\n    checked?: boolean;\n    dirName?: string;\n    disabled?: boolean;\n    form?: string;\n    formAction?: string;\n    formEnctype?: string;\n    formMethod?: string;\n    formNoValidate?: boolean;\n    formTarget?: string;\n    height?: number;\n    list?: string;\n    max?: number;\n    maxLength?: number;\n    min?: string;\n    minLength?: number;\n    multiple?: boolean;\n    name?: string;\n    pattern?: string;\n    placeholder?: string;\n    readOnly?: boolean;\n    required?: boolean;\n    size?: number;\n    src?: string;\n    step?: number;\n    type?:\n        | \"button\"\n        | \"checkbox\"\n        | \"color\"\n        | \"date\"\n        | \"datetime-local\"\n        | \"email\"\n        | \"file\"\n        | \"hidden\"\n        | \"image\"\n        | \"month\"\n        | \"number\"\n        | \"password\"\n        | \"radio\"\n        | \"range\"\n        | \"reset\"\n        | \"search\"\n        | \"submit\"\n        | \"tel\"\n        | \"text\"\n        | \"time\"\n        | \"url\"\n        | \"week\";\n    value?: string;\n    width?: number;\n}\n\n/**\n * Properties permitted on the `<ins>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins\n */\nexport interface JsxInsElementProps extends JsxHtmlGlobalProps {\n    cite?: string;\n    dateTime?: string;\n}\n\n/**\n * Properties permitted on the `<label>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label\n */\nexport interface JsxLabelElementProps extends JsxHtmlGlobalProps {\n    for?: string;\n}\n\n/**\n * Properties permitted on the `<li>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li\n */\nexport interface JsxLiElementProps extends JsxHtmlGlobalProps {\n    value?: number;\n}\n\n/**\n * Properties permitted on the `<link>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link\n */\nexport interface JsxLinkElementProps extends JsxHtmlGlobalProps {\n    as?:\n        | \"audio\"\n        | \"document\"\n        | \"embed\"\n        | \"fetch\"\n        | \"font\"\n        | \"image\"\n        | \"object\"\n        | \"script\"\n        | \"style\"\n        | \"track\"\n        | \"video\"\n        | \"worker\";\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    disabled?: boolean;\n    href?: string;\n    hreflang?: string;\n    imageSizes?: string;\n    imageSrcset?: string;\n    media?: string;\n    rel?: string;\n    sizes?: string;\n    type?: string;\n}\n\n/**\n * Properties permitted on the `<map>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map\n */\nexport interface JsxMapElementProps extends JsxHtmlGlobalProps {\n    name?: string;\n}\n\n/**\n * Properties permitted on the `<meta>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta\n */\nexport interface JsxMetaElementProps extends JsxHtmlGlobalProps {\n    \"http-equiv\"?:\n        | \"content-security-policy\"\n        | \"content-type\"\n        | \"default-style\"\n        | \"x-ua-compatible\"\n        | \"refresh\";\n    charset?: \"utf-8\";\n    content?: string;\n    name?: string;\n}\n\n/**\n * Properties permitted on the `<meter>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter\n */\nexport interface JsxMeterElementProps extends JsxHtmlGlobalProps {\n    form?: string;\n    high?: number;\n    low?: number;\n    max?: number;\n    min?: number;\n    optimum?: number;\n    value?: number;\n}\n\n/**\n * Properties permitted on the `<object>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object\n */\nexport interface JsxObjectElementProps extends JsxHtmlGlobalProps {\n    data?: string;\n    form?: string;\n    height?: number;\n    name?: string;\n    type?: string;\n    useMap?: string;\n    width?: number;\n}\n\n/**\n * Properties permitted on the `<ol>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol\n */\nexport interface JsxOlElementProps extends JsxHtmlGlobalProps {\n    reversed?: boolean;\n    start?: number;\n    type?: \"a\" | \"A\" | \"i\" | \"I\" | \"1\";\n}\n\n/**\n * Properties permitted on the `<optgroup>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup\n */\nexport interface JsxOptgroupElementProps extends JsxHtmlGlobalProps {\n    disabled?: boolean;\n    label: string;\n}\n\n/**\n * Properties permitted on the `<option>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option\n */\nexport interface JsxOptionElementProps extends JsxHtmlGlobalProps {\n    disabled?: boolean;\n    label?: string;\n    selected?: boolean;\n    value?: string;\n}\n\n/**\n * Properties permitted on the `<output>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output\n */\nexport interface JsxOutputElementProps extends JsxHtmlGlobalProps {\n    for?: string;\n    form?: string;\n    name?: string;\n}\n\n/**\n * Properties permitted on the `<param>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param\n */\nexport interface JsxParamElementProps extends JsxHtmlGlobalProps {\n    name?: string;\n    value?: string;\n}\n\n/**\n * Properties permitted on the `<portal>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/portal\n */\nexport interface JsxPortalElementProps extends JsxHtmlGlobalProps {\n    referrerPolicy?:\n        | \"no-referrer\"\n        | \"no-referrer-when-downgrade\"\n        | \"origin\"\n        | \"origin-when-cross-origin\"\n        | \"same-origin\"\n        | \"strict-origin\"\n        | \"strict-origin-when-cross-origin\"\n        | \"unsafe-url\";\n    src: string;\n}\n\n/**\n * Properties permitted on the `<progress>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress\n */\nexport interface JsxProgressElementProps extends JsxHtmlGlobalProps {\n    max?: number;\n    value?: number;\n}\n\n/**\n * Properties permitted on the `<q>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q\n */\nexport interface JsxQElementProps extends JsxHtmlGlobalProps {\n    cite?: string;\n}\n\n/**\n * Properties permitted on the `<script>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\n */\nexport interface JsxScriptElementProps extends JsxHtmlGlobalProps {\n    async?: boolean;\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    defer?: boolean;\n    integrity?: string;\n    noModule?: boolean;\n    referrerPolicy?:\n        | \"no-referrer\"\n        | \"no-referrer-when-downgrade\"\n        | \"origin\"\n        | \"origin-when-cross-origin\"\n        | \"same-origin\"\n        | \"strict-origin\"\n        | \"strict-origin-when-cross-origin\"\n        | \"unsafe-url\";\n    src?: string;\n    type?: \"module\" | (string & {});\n}\n\n/**\n * Properties permitted on the `<select>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select\n */\nexport interface JsxSelectElementProps extends JsxHtmlGlobalProps {\n    autocomplete?: string;\n    autofocus?: boolean;\n    disabled?: boolean;\n    form?: string;\n    multiple?: boolean;\n    name?: string;\n    required?: boolean;\n    size?: number;\n}\n\n/**\n * Properties permitted on the `<slot>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot\n */\nexport interface JsxSlotElementProps extends JsxHtmlGlobalProps {\n    name?: string;\n}\n\n/**\n * Properties permitted on the `<source>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\n */\nexport interface JsxSourceElementProps extends JsxHtmlGlobalProps {\n    media?: string;\n    sizes?: string;\n    src?: string;\n    srcset?: string;\n    type?: string;\n}\n\n/**\n * Properties permitted on the `<style>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style\n */\nexport interface JsxStyleElementProps extends JsxHtmlGlobalProps {\n    media?: string;\n    type?: string;\n    nonce?: string;\n}\n\n/**\n * Properties permitted on the `<td>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td\n */\nexport interface JsxTdElementProps extends JsxHtmlGlobalProps {\n    colSpan?: number;\n    headers?: string;\n    rowSpan?: number;\n}\n\n/**\n * Properties permitted on the `<textarea>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea\n */\nexport interface JsxTextareaElementProps extends JsxHtmlGlobalProps {\n    autocomplete?: string;\n    autofocus?: boolean;\n    cols?: number;\n    disabled?: boolean;\n    maxLength?: number;\n    minLength?: number;\n    name?: string;\n    placeholder?: string;\n    readOnly?: boolean;\n    required?: boolean;\n    rows?: number;\n    wrap?: \"hard\" | \"soft\";\n}\n\n/**\n * Properties permitted on the `<th>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th\n */\nexport interface JsxThElementProps extends JsxHtmlGlobalProps {\n    abbr?: string;\n    colSpan?: number;\n    headers?: string;\n    rowSpan?: number;\n    scope?: \"row\" | \"col\" | \"rowgroup\" | \"colgroup\";\n}\n\n/**\n * Properties permitted on the `<time>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time\n */\nexport interface JsxTimeElementProps extends JsxHtmlGlobalProps {\n    dateTime?: string;\n}\n\n/**\n * Properties permitted on the `<track>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track\n */\nexport interface JsxTrackElementProps extends JsxHtmlGlobalProps {\n    default?: boolean;\n    kind?: \"subtitles\" | \"captions\" | \"descriptions\" | \"chapters\" | \"metadata\";\n    label?: string;\n    src?: string;\n    srclang?: string;\n}\n\n/**\n * Properties permitted on the `<video>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video\n */\nexport interface JsxVideoElementProps extends JsxHtmlGlobalProps {\n    autoplay?: boolean;\n    controls?: boolean;\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    height?: number;\n    loop?: boolean;\n    muted?: boolean;\n    playsInline?: boolean;\n    poster?: string;\n    preload?: string;\n    src?: string;\n    width?: number;\n}\n\n// ============================================================================\n// SVG Elements\n// ============================================================================\n// This is extremely incomplete, only including support for <svg> and <path>.\n// If you need more, please feel free to submit an issue or a pull request!\n\nexport interface JsxSvgCoreProps {\n    id?: string;\n    lang?: string;\n    tabindex?: string;\n    \"xml:base\"?: string;\n    xmlns?: string;\n}\n\nexport interface JsxSvgStyleProps {\n    class?: string;\n    style?: string;\n}\n\nexport interface JsxSvgConditionalProcessingProps {\n    systemLanguage?: string;\n}\n\nexport interface JsxSvgPresentationProps {\n    \"alignment-baseline\"?:\n        | \"baseline\"\n        | \"text-bottom\"\n        | \"text-before-edge\"\n        | \"middle\"\n        | \"central\"\n        | \"text-after-edge\"\n        | \"ideographic\"\n        | \"alphabetic\"\n        | \"hanging\"\n        | \"mathematical\"\n        | \"top\"\n        | \"center\"\n        | \"bottom\";\n    \"baseline-shift\"?: number | \"sub\" | \"super\";\n    \"clip-path\"?: string;\n    \"clip-rule\"?: \"nonzero\" | \"evenodd\" | \"inherit\";\n    color?: string;\n    \"color-interpolation\"?: \"auto\" | \"sRGB\" | \"linearRGB\";\n    \"color-interpolation-filters\"?: \"auto\" | \"sRGB\" | \"linearRGB\";\n    cursor?: string;\n    direction?: \"ltr\" | \"rtl\";\n    display?: string;\n    \"dominant-baseline\"?:\n        | \"auto\"\n        | \"text-bottom\"\n        | \"alphabetic\"\n        | \"ideographic\"\n        | \"middle\"\n        | \"central\"\n        | \"mathematical\"\n        | \"hanging\"\n        | \"text-top\";\n    dy?: string;\n    fill?: string;\n    \"fill-opacity\"?: number;\n    \"fill-rule\"?: \"nonzero\" | \"evenodd\";\n    filter?: string;\n    \"flood-color\"?: string;\n    \"flood-opacity\"?: number;\n    \"font-family\"?: string;\n    \"font-size\"?: string;\n    \"font-size-adjust\"?: \"none\" | number;\n    \"font-stretch\"?: string;\n    \"font-style\"?: \"normal\" | \"italic\" | \"oblique\" | string;\n    \"font-variant\"?: string;\n    \"font-weight\"?: \"normal\" | \"bold\" | \"bolder\" | \"lighter\" | number | string;\n    \"image-rendering\"?: \"auto\" | \"optimizeSpeed\" | \"optimizeQuality\";\n    \"letter-spacing\"?: string;\n    \"lighting-color\"?: string;\n    \"marker-end\"?: string;\n    \"marker-mid\"?: string;\n    \"marker-start\"?: string;\n    mask?: string;\n    opacity?: number;\n    overflow?: \"visible\" | \"hidden\" | \"scroll\" | \"auto\";\n    \"pointer-events\"?:\n        | \"bounding-box\"\n        | \"visiblePainted\"\n        | \"visibleFill\"\n        | \"visibleStroke\"\n        | \"visible\"\n        | \"painted\"\n        | \"fill\"\n        | \"stroke\"\n        | \"all\"\n        | \"none\";\n    \"shape-rendering\"?:\n        | \"auto\"\n        | \"optimizeSpeed\"\n        | \"crispEdges\"\n        | \"geometricPrecision\";\n    \"stop-color\"?: string;\n    \"stop-opacity\"?: string;\n    stroke?: string;\n    \"stroke-dasharray\"?: string;\n    \"stroke-dashoffset\"?: string;\n    \"stroke-linecap\"?: \"butt\" | \"round\" | \"square\";\n    \"stroke-linejoin\"?: \"arcs\" | \"bevel |miter\" | \"miter-clip\" | \"round\";\n    \"stroke-miterlimit\"?: number;\n    \"stroke-opacity\"?: string | number;\n    \"stroke-width\"?: string | number;\n    \"text-anchor\"?: \"start\" | \"middle\" | \"end\";\n    \"text-decoration\"?: string;\n    \"text-rendering\"?:\n        | \"auto\"\n        | \"optimizeSpeed\"\n        | \"optimizeLegibility\"\n        | \"geometricPrecision\";\n    transform?: string;\n    \"transform-origin\"?: string;\n    \"unicode-bidi\"?:\n        | \"normal\"\n        | \"embed\"\n        | \"isolate\"\n        | \"bidi-override\"\n        | \"isolate-override\"\n        | \"plaintext\";\n    \"vector-effect\"?:\n        | \"none\"\n        | \"non-scaling-stroke\"\n        | \"non-scaling-size\"\n        | \"non-rotation\"\n        | \"fixed-position\";\n    visibility?: \"visible\" | \"hidden\" | \"collapse\";\n    \"word-spacing\"?: string;\n    \"writing-mode\"?: \"horizontal-tb\" | \"vertical-rl\" | \"vertical-lr\";\n}\n\n/**\n * Properties permitted on the `<svg>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg\n */\nexport interface JsxSvgElementProps extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgPresentationProps {\n    height?: string | number;\n    preserveAspectRatio?: `${\n        | \"none\"\n        | \"xMinYMin\"\n        | \"xMaxYMin\"\n        | \"xMinYMid\"\n        | \"xMaxYMid\"\n        | \"xMinYMax\"\n        | \"xMidYMax\"\n        | \"xMaxYMax\"}${\"\" | \" meet\" | \" slice\"}`;\n    viewBox?: string;\n    width?: string | number;\n    x?: string | number;\n    y?: string | number;\n}\n\n/**\n * Properties permitted on the `<g>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/g\n */\nexport interface JsxGElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{}\n\n/**\n * Properties permitted on the `<path>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path\n */\nexport interface JsxPathElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    d: string;\n    pathLength?: number;\n}\n\n/**\n * Properties permitted on the `<rect>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect\n */\nexport interface JsxRectElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    height?: string | number;\n    pathLength?: number;\n    rx?: string | number;\n    ry?: string | number;\n    width?: string | number;\n    x?: string | number;\n    y?: string | number;\n}\n\n/**\n * Properties permitted on the `<circle>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle\n */\nexport interface JsxCircleElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    cx?: string | number;\n    cy?: string | number;\n    r?: string | number;\n    pathLength?: number;\n}\n\n/**\n * Properties permitted on the `<ellipse>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse\n */\nexport interface JsxEllipseElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    cx?: string | number;\n    cy?: string | number;\n    rx?: string | number;\n    ry?: string | number;\n    pathLength?: number;\n}\n\n/**\n * Properties permitted on the `<polygon>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon\n */\nexport interface JsxPolygonElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    points?: string;\n    pathLength?: number;\n}\n\n/** Properties permitted on the `<polyline>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline\n */\nexport interface JsxPolylineElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    points?: string;\n    pathLength?: number;\n}\n\n/** Properties permitted on the `<line>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line\n */\nexport interface JsxLineElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    x1?: string | number;\n    y1?: string | number;\n    x2?: string | number;\n    y2?: string | number;\n    pathLength?: number;\n}\n\n/**\n * Properties permitted on the `<use>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use\n */\nexport interface JsxUseElementProps\n    extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgConditionalProcessingProps, JsxSvgPresentationProps\n{\n    href: string;\n    x?: string | number;\n    y?: string | number;\n    width?: string | number;\n    height?: string | number;\n}\n\n/**\n * Properties permitted on the `<text>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/text\n */\nexport interface JsxTextElementProps extends JsxSvgCoreProps, JsxSvgStyleProps, JsxSvgPresentationProps {\n    x?: string | number;\n    y?: string | number;\n}\n\n/**\n * Properties permitted on the `<image>` element.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/image\n */\nexport interface JsxImageElementProps extends JsxSvgCoreProps {\n    x?: string | number;\n    y?: string | number;\n    width?: string | number;\n    height?: string | number;\n    href: string;\n    preserveAspectRatio?: string;\n    crossorigin?: \"anonymous\" | \"use-credentials\";\n    decoding?: \"async\" | \"sync\" | \"auto\";\n}\n"
  },
  {
    "path": "src/lib/utils-common/jsx.ts",
    "content": "/**\n * Custom JSX module designed specifically for TypeDoc's needs.\n * When overriding a default TypeDoc theme output, your implementation must create valid {@link Element}\n * instances, which can be most easily done by using TypeDoc's JSX implementation. To use it, set up\n * your tsconfig with the following compiler options:\n * ```json\n * {\n *     \"jsx\": \"react\",\n *     \"jsxFactory\": \"JSX.createElement\",\n *     \"jsxFragmentFactory\": \"JSX.Fragment\"\n * }\n * ```\n * @summary Custom JSX module designed specifically for TypeDoc's needs.\n * @module\n */\n\nimport type { IntrinsicElements, JsxChildren, JsxComponent, JsxElement, JsxHtmlGlobalProps } from \"./jsx.elements.js\";\nimport { JsxFragment } from \"./jsx.elements.js\";\nimport { escapeHtml } from \"./string.js\";\n\nexport type { JsxChildren as Children, JsxComponent, JsxElement as Element } from \"./jsx.elements.js\";\nexport { JsxFragment as Fragment } from \"./jsx.elements.js\";\n\n/**\n * Used to inject HTML directly into the document.\n */\nexport function Raw(_props: { html: string }) {\n    // This is handled specially by the renderElement function. Instead of being\n    // called, the tag is compared to this function and the `html` prop will be\n    // returned directly.\n    return null;\n}\n\n/**\n * TypeScript's rules for looking up the JSX.IntrinsicElements and JSX.Element\n * interfaces are incredibly strange. It will find them if they are included as\n * a namespace under the createElement function, or globally, or, apparently, if\n * a JSX namespace is declared at the same scope as the factory function.\n * Hide this in the docs, hopefully someday TypeScript improves this and allows\n * looking adjacent to the factory function and we can get rid of this phantom namespace.\n * @hidden\n */\nexport declare namespace JSX {\n    export { IntrinsicElements, JsxElement as Element, JsxHtmlGlobalProps as IntrinsicAttributes };\n}\n\nconst voidElements = new Set([\n    \"area\",\n    \"base\",\n    \"br\",\n    \"col\",\n    \"embed\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\n\nconst blockElements = new Set([\n    \"h1\",\n    \"h2\",\n    \"h3\",\n    \"h4\",\n    \"h5\",\n    \"h6\",\n    \"div\",\n    \"section\",\n    \"nav\",\n    \"details\",\n    \"p\",\n    \"ul\",\n    \"ol\",\n    \"li\",\n]);\n\n/**\n * JSX factory function to create an \"element\" that can later be rendered with {@link renderElement}\n * @param tag\n * @param props\n * @param children\n */\nexport function createElement(\n    tag: string | JsxComponent<any>,\n    props: object | null,\n    ...children: JsxChildren[]\n): JsxElement {\n    return { tag, props, children };\n}\n\nlet renderPretty = true;\nexport function setRenderSettings(options: { pretty: boolean }) {\n    renderPretty = options.pretty;\n}\n\nexport function renderElement(element: JsxElement | null | undefined): string {\n    if (!element) {\n        return \"\";\n    }\n\n    const { tag, props, children } = element;\n    let html = \"\";\n\n    if (typeof tag === \"function\") {\n        if (tag === Raw) {\n            return String((props as any).html);\n        }\n        if (tag === JsxFragment) {\n            renderChildren(children);\n            return html;\n        }\n        return renderElement(tag(Object.assign({ children }, props)));\n    }\n\n    if (blockElements.has(tag) && renderPretty && html) {\n        html += \"\\n\";\n    }\n    html += \"<\";\n    html += tag;\n\n    for (const [key, val] of Object.entries(props ?? {})) {\n        if (val == null) continue;\n\n        if (typeof val == \"boolean\") {\n            if (val) {\n                html += \" \";\n                html += key;\n            }\n        } else {\n            html += \" \";\n            html += key;\n            html += '=\"';\n            html += (\n                typeof val === \"string\" ? val : JSON.stringify(val)\n            ).replaceAll('\"', \"&quot;\");\n            html += '\"';\n        }\n    }\n\n    if (children.length) {\n        html += \">\";\n        renderChildren(children);\n        html += \"</\";\n        html += tag;\n        html += \">\";\n    } else {\n        if (voidElements.has(tag)) {\n            html += \"/>\";\n        } else {\n            html += \"></\";\n            html += tag;\n            html += \">\";\n        }\n    }\n\n    return html;\n\n    function renderChildren(children: JsxChildren[]) {\n        for (const child of children) {\n            if (typeof child === \"boolean\") continue;\n\n            if (Array.isArray(child)) {\n                renderChildren(child);\n            } else if (typeof child === \"string\" || typeof child === \"number\" || typeof child === \"bigint\") {\n                html += escapeHtml(child.toString());\n            } else {\n                html += renderElement(child);\n            }\n        }\n    }\n}\n\n/**\n * Render an element to text, stripping out any HTML tags.\n * This is roughly equivalent to getting `innerText` on a rendered element.\n * @internal\n */\nexport function renderElementToText(element: JsxElement | null | undefined) {\n    if (!element) {\n        return \"\";\n    }\n\n    const { tag, props, children } = element;\n    let html = \"\";\n\n    if (typeof tag === \"function\") {\n        if (tag === Raw) {\n            return String((props as any).html);\n        }\n        if (tag === JsxFragment) {\n            renderChildren(children);\n            return html;\n        }\n        return renderElementToText(tag(Object.assign({ children }, props)));\n    } else if (tag === \"br\") {\n        return \"\\n\";\n    }\n\n    renderChildren(children);\n    return html;\n\n    function renderChildren(children: JsxChildren[]) {\n        for (const child of children) {\n            if (typeof child === \"boolean\") continue;\n\n            if (Array.isArray(child)) {\n                renderChildren(child);\n            } else if (typeof child === \"string\" || typeof child === \"number\" || typeof child === \"bigint\") {\n                // Turn non-breaking spaces into regular spaces\n                html += child.toString().replaceAll(\"\\u00A0\", \" \");\n            } else {\n                html += renderElementToText(child);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/logger.ts",
    "content": "import type { IfInternal } from \"./general.js\";\nimport type { TranslatedString } from \"./i18n.js\";\nimport type { MinimalNode, MinimalSourceFile } from \"./minimalSourceFile.js\";\n\n/**\n * List of known log levels. Used to specify the urgency of a log message.\n */\nexport enum LogLevel {\n    Verbose,\n    Info,\n    Warn,\n    Error,\n    None,\n}\n\nconst messagePrefixes = {\n    [LogLevel.Error]: \"[error]\",\n    [LogLevel.Warn]: \"[warning]\",\n    [LogLevel.Info]: \"[info]\",\n    [LogLevel.Verbose]: \"[debug]\",\n};\n\n/**\n * A logger that will not produce any output.\n *\n * This logger also serves as the base class of other loggers as it implements\n * all the required utility functions.\n */\nexport class Logger {\n    /**\n     * How many error messages have been logged?\n     */\n    errorCount = 0;\n\n    /**\n     * How many warning messages have been logged?\n     */\n    warningCount = 0;\n\n    /**\n     * How many validation warning messages have been logged?\n     */\n    validationWarningCount = 0;\n\n    /**\n     * The minimum logging level to print.\n     */\n    level = LogLevel.Info;\n\n    /**\n     * Has an error been raised through the log method?\n     */\n    hasErrors(): boolean {\n        return this.errorCount > 0;\n    }\n\n    /**\n     * Has a warning been raised through the log method?\n     */\n    hasWarnings(): boolean {\n        return this.warningCount > 0;\n    }\n\n    /**\n     * Reset the error counter.\n     */\n    resetErrors() {\n        this.errorCount = 0;\n    }\n\n    /**\n     * Reset the warning counter.\n     */\n    resetWarnings() {\n        this.warningCount = 0;\n        this.validationWarningCount = 0;\n    }\n\n    /**\n     * Log the given verbose message.\n     *\n     * @param text  The message that should be logged.\n     */\n    verbose(text: string) {\n        this.log(this.addContext(text, LogLevel.Verbose), LogLevel.Verbose);\n    }\n\n    /** Log the given info message. */\n    info(text: IfInternal<TranslatedString, string>) {\n        this.log(this.addContext(text, LogLevel.Info), LogLevel.Info);\n    }\n\n    /**\n     * Log the given warning.\n     *\n     * @param text The warning that should be logged.\n     */\n    warn(text: IfInternal<TranslatedString, string>, node?: MinimalNode): void;\n    warn(\n        text: IfInternal<TranslatedString, string>,\n        pos: number,\n        file: MinimalSourceFile,\n    ): void;\n    warn(text: string, ...args: [MinimalNode?] | [number, MinimalSourceFile]): void {\n        const text2 = this.addContext(text, LogLevel.Warn, ...args);\n        this.log(text2, LogLevel.Warn);\n    }\n\n    /**\n     * Log the given warning and records that a validation warning has occurred.\n     *\n     * @param text The warning that should be logged.\n     */\n    validationWarning(text: IfInternal<TranslatedString, string>, node?: MinimalNode): void;\n    validationWarning(\n        text: IfInternal<TranslatedString, string>,\n        pos: number,\n        file: MinimalSourceFile,\n    ): void;\n    validationWarning(...args: [any, ...any[]]): void {\n        this.validationWarningCount += 1;\n        this.warn(...args);\n    }\n\n    /**\n     * Log the given error.\n     *\n     * @param text  The error that should be logged.\n     */\n    error(text: IfInternal<TranslatedString, string>, node?: MinimalNode): void;\n    error(\n        text: IfInternal<TranslatedString, string>,\n        pos: number,\n        file: MinimalSourceFile,\n    ): void;\n    error(text: string, ...args: [MinimalNode?] | [number, MinimalSourceFile]) {\n        const text2 = this.addContext(text, LogLevel.Error, ...args);\n        this.log(text2, LogLevel.Error);\n    }\n\n    /**\n     * Print a log message.\n     *\n     * @param _message The message itself.\n     * @param level The urgency of the log message.\n     */\n    log(_message: string, level: LogLevel) {\n        if (level === LogLevel.Error) {\n            this.errorCount += 1;\n        }\n        if (level === LogLevel.Warn) {\n            this.warningCount += 1;\n        }\n    }\n\n    protected addContext(\n        message: string,\n        _level: Exclude<LogLevel, LogLevel.None>,\n        ..._args: [MinimalNode?] | [number, MinimalSourceFile]\n    ): string {\n        return message;\n    }\n}\n\n/**\n * Logger implementation which logs to the console\n */\nexport class ConsoleLogger extends Logger {\n    override log(message: string, level: Exclude<LogLevel, LogLevel.None>) {\n        super.log(message, level);\n        if (level < this.level) {\n            return;\n        }\n\n        const method = (\n            {\n                [LogLevel.Error]: \"error\",\n                [LogLevel.Warn]: \"warn\",\n                [LogLevel.Info]: \"info\",\n                [LogLevel.Verbose]: \"log\",\n            } as const\n        )[level];\n\n        // eslint-disable-next-line no-console\n        console[method](message);\n    }\n\n    protected override addContext(\n        message: string,\n        level: Exclude<LogLevel, LogLevel.None>,\n        ..._args: [MinimalNode?] | [number, MinimalSourceFile]\n    ): string {\n        return `${messagePrefixes[level]} ${message}`;\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/map.ts",
    "content": "export class DefaultMap<K, V> extends Map<K, V> {\n    constructor(private creator: (key: K) => V) {\n        super();\n    }\n\n    override get(key: K): V {\n        const saved = super.get(key);\n        if (saved != null) {\n            return saved;\n        }\n\n        const created = this.creator(key);\n        this.set(key, created);\n        return created;\n    }\n\n    getNoInsert(key: K): V | undefined {\n        return super.get(key);\n    }\n}\n\nexport class StableKeyMap<K extends { getStableKey(): string }, V> {\n    [Symbol.toStringTag] = \"StableKeyMap\";\n    private impl = new Map<string, [K, V]>();\n\n    get size(): number {\n        return this.impl.size;\n    }\n\n    set(key: K, value: V) {\n        this.impl.set(key.getStableKey(), [key, value]);\n        return this;\n    }\n\n    get(key: K): V | undefined {\n        return this.impl.get(key.getStableKey())?.[1];\n    }\n\n    has(key: K): boolean {\n        return this.get(key) != null;\n    }\n\n    clear(): void {\n        this.impl.clear();\n    }\n\n    delete(key: K): boolean {\n        return this.impl.delete(key.getStableKey());\n    }\n\n    forEach(\n        callbackfn: (value: V, key: K, map: StableKeyMap<K, V>) => void,\n        thisArg?: any,\n    ): void {\n        for (const [k, v] of this.entries()) {\n            callbackfn.apply(thisArg, [v, k, this]);\n        }\n    }\n\n    entries(): IterableIterator<[K, V]> {\n        return this.impl.values();\n    }\n\n    *keys(): IterableIterator<K> {\n        for (const [k] of this.entries()) {\n            yield k;\n        }\n    }\n\n    *values(): IterableIterator<V> {\n        for (const [, v] of this.entries()) {\n            yield v;\n        }\n    }\n\n    [Symbol.iterator](): IterableIterator<[K, V]> {\n        return this.entries();\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/minimalSourceFile.ts",
    "content": "// Type only import is permitted\n// eslint-disable-next-line no-restricted-imports\nimport type { LineAndCharacter, SourceFileLike } from \"typescript\";\nimport { binaryFindPartition } from \"./array.js\";\nimport type { NormalizedPath } from \"./path.js\";\n\n// I don't like this, but it's necessary so that the lineStarts property isn't\n// visible in the `MinimalSourceFile` type. Even when private it causes compilation\n// errors downstream.\nconst lineStarts = new WeakMap<MinimalSourceFile, number[]>();\n\nexport interface MinimalNode {\n    // This is actually getStart(sourceFile: ts.SourceFile, includeJsDocComments: boolean): number\n    // but we define it with this signature so that `ts.Node` is assignable to it.\n    getStart(): number;\n    getSourceFile(): MinimalSourceFile;\n}\n\nexport class MinimalSourceFile implements SourceFileLike {\n    readonly text: string;\n    // This type is just string to ensure assignability from SourceFile\n    readonly fileName: string;\n\n    constructor(\n        text: string,\n        fileName: NormalizedPath,\n    ) {\n        // This is unfortunate, but the yaml library we use relies on the source\n        // text using LF line endings https://github.com/eemeli/yaml/issues/127.\n        // If we don't do this, in a simple document which includes a single key\n        // like:\n        // ---<CR><LF>\n        // title: Windows line endings<CR><LF>\n        // ---<CR><LF>\n        // we'll end up with a parsed title of \"Windows line endings\\r\"\n        this.text = text.replaceAll(\"\\r\\n\", \"\\n\");\n        lineStarts.set(this, [0]);\n\n        this.fileName = fileName;\n    }\n\n    getLineAndCharacterOfPosition(pos: number): LineAndCharacter {\n        if (pos < 0 || pos >= this.text.length) {\n            throw new Error(\"pos must be within the range of the file.\");\n        }\n\n        const starts = lineStarts.get(this)!;\n        while (pos >= starts[starts.length - 1]) {\n            const nextStart = this.text.indexOf(\n                \"\\n\",\n                starts[starts.length - 1],\n            );\n\n            if (nextStart === -1) {\n                starts.push(Infinity);\n            } else {\n                starts.push(nextStart + 1);\n            }\n        }\n\n        const line = binaryFindPartition(starts, (x) => x > pos) - 1;\n\n        return {\n            character: pos - starts[line],\n            line,\n        };\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/path.ts",
    "content": "import { assert } from \"./general.js\";\n\n// Type only import is permitted\n// eslint-disable-next-line no-restricted-imports\nimport type { Application } from \"../application.js\";\n\n/**\n * Represents a normalized path with path separators being `/`\n * On Windows, drives are represented like `C:/Users` for consistency\n * with TypeScript.\n *\n * The empty string `\"\"` is a valid normalized path.\n */\nexport type NormalizedPath = \"\" | \"/\" | string & { readonly __normPath: unique symbol };\n\n/**\n * Represents either a {@link NormalizedPath} or a Node module name\n * (e.g. `typedoc-plugin-mdn-links` or `@gerrit0/typedoc-plugin`)\n */\nexport type NormalizedPathOrModule = NormalizedPath | string & { readonly __normPathOrModule: unique symbol };\n\n/**\n * Represents either a {@link NormalizedPath} or a Node module name\n * (e.g. `typedoc-plugin-mdn-links` or `@gerrit0/typedoc-plugin`)\n */\nexport type NormalizedPathOrModuleOrFunction = NormalizedPathOrModule | ((app: Application) => Promise<void> | void);\n\n/**\n * Represents a glob path configured by a user.\n */\nexport type GlobString = string & { readonly __globString: unique symbol };\n\nexport namespace NormalizedPathUtils {\n    export function dirname(path: NormalizedPath): NormalizedPath {\n        let end = path.length - 2;\n        for (; end > 0; --end) {\n            if (path[end] === \"/\") break;\n        }\n\n        switch (end) {\n            case -2:\n            case -1:\n                return (path[0] === \"/\" ? \"/\" : \".\") as NormalizedPath;\n            case 0:\n                return path.substring(0, path.indexOf(\"/\") + 1) as NormalizedPath;\n            default:\n                return path.slice(0, end) as NormalizedPath;\n        }\n    }\n\n    export function basename(path: NormalizedPath): NormalizedPath {\n        // We start at length - 2 as /var/typedoc/ should give `typedoc`\n        let end = path.length - 2;\n        for (; end >= 0; --end) {\n            if (path[end] === \"/\") break;\n        }\n\n        switch (end) {\n            case -2:\n            case -1:\n                return path;\n            default:\n                if (path.endsWith(\"/\")) {\n                    return path.slice(end + 1, -1) as NormalizedPath;\n                }\n                return path.slice(end + 1) as NormalizedPath;\n        }\n    }\n\n    export function relative(from: NormalizedPath, to: NormalizedPath): NormalizedPath {\n        if (from == to) {\n            return \"\";\n        }\n\n        assert(\n            isAbsolute(from) && isAbsolute(to),\n            \"resolving relative paths without absolute inputs requires a filesystem\",\n        );\n\n        if (!from.endsWith(\"/\")) {\n            from += \"/\";\n        }\n        const end = to.length;\n        if (!to.endsWith(\"/\")) {\n            to += \"/\";\n        }\n\n        const minLen = Math.min(from.length, to.length);\n        let lastCommonSlash = 0;\n        let i = 0;\n        for (; i < minLen; ++i) {\n            if (from[i] === to[i]) {\n                if (from[i] === \"/\") {\n                    lastCommonSlash = i;\n                }\n            } else {\n                break;\n            }\n        }\n\n        if (lastCommonSlash === from.length - 1) {\n            return to.substring(from.length, end) as NormalizedPath;\n        }\n\n        let prefix = \"\";\n        for (let i = lastCommonSlash + 1; i < from.length; ++i) {\n            if (from[i] === \"/\" || i + 1 === from.length) {\n                prefix += prefix ? \"/..\" : \"..\";\n            }\n        }\n\n        return prefix + to.substring(lastCommonSlash, end) as NormalizedPath;\n    }\n\n    export function normalize(path: NormalizedPath): NormalizedPath {\n        const parts = path.split(\"/\");\n\n        let canRemoveDotDot = false;\n        for (let i = 0; i < parts.length;/* inside loop */\n        ) {\n            if (parts[i] == \".\" && i + 1 != parts.length) {\n                parts.splice(i, 1);\n            } else if (parts[i] == \"..\") {\n                if (canRemoveDotDot) {\n                    if (i - 1 === 0 && /\\w:/i.test(parts[0])) {\n                        parts.splice(i, 1);\n                    } else {\n                        parts.splice(i - 1, 2);\n                        i = i - 1;\n                    }\n                } else {\n                    ++i;\n                }\n            } else {\n                canRemoveDotDot = true;\n                ++i;\n            }\n        }\n\n        return parts.join(\"/\") as NormalizedPath;\n    }\n\n    export function resolve(from: NormalizedPath, to: NormalizedPath): NormalizedPath {\n        assert(isAbsolute(from), \"resolving without an absolute path requires a filesystem\");\n\n        if (isAbsolute(to)) {\n            return to;\n        }\n\n        return normalize(`${from}/${to}` as NormalizedPath);\n    }\n\n    export function isAbsolute(from: NormalizedPath): boolean {\n        return /^\\/|^\\w:\\//.test(from);\n    }\n\n    export function splitFilename(name: string): { name: string; ext: string } {\n        const lastDot = name.lastIndexOf(\".\");\n        if (lastDot < 1) {\n            return { name, ext: \"\" };\n        }\n        return { name: name.substring(0, lastDot), ext: name.substring(lastDot) };\n    }\n\n    export function isDeclarationFilePath(path: NormalizedPath) {\n        return /\\.d\\.(ts|mts|cts)$/.test(path);\n    }\n}\n"
  },
  {
    "path": "src/lib/utils-common/set.ts",
    "content": "export function setIntersection<T>(a: Iterable<T>, b: Set<T>): Set<T> {\n    const result = new Set<T>();\n    for (const elem of a) {\n        if (b.has(elem)) {\n            result.add(elem);\n        }\n    }\n    return result;\n}\n\nexport function setDifference<T>(a: Iterable<T>, b: Iterable<T>): Set<T> {\n    const result = new Set(a);\n    for (const elem of b) {\n        result.delete(elem);\n    }\n    return result;\n}\n\nexport function setUnion<T>(a: Iterable<T>, b: Iterable<T>): Set<T> {\n    const result = new Set(a);\n    for (const elem of b) {\n        result.add(elem);\n    }\n    return result;\n}\n"
  },
  {
    "path": "src/lib/utils-common/string.ts",
    "content": "import { DefaultMap } from \"./map.js\";\n\n/**\n * Resolves a string type into a union of characters, `\"ab\"` turns into `\"a\" | \"b\"`.\n */\nexport type Chars<T extends string> = T extends `${infer C}${infer R}` ? C | Chars<R> :\n    never;\n\n/** Count the number of times `search` appears in `text` */\nexport function countMatches(text: string, search: string) {\n    let count = 0;\n    let last = 0;\n    for (;;) {\n        const index = text.indexOf(search, last);\n        if (index === -1) {\n            break;\n        } else {\n            last = index + 1;\n            ++count;\n        }\n    }\n\n    return count;\n}\n\nexport function dedent(text: string) {\n    const lines = text.split(/\\r?\\n/);\n    while (lines.length && lines[0].search(/\\S/) === -1) {\n        lines.shift();\n    }\n    while (lines.length && lines[lines.length - 1].search(/\\S/) === -1) {\n        lines.pop();\n    }\n\n    const minIndent = lines.reduce(\n        (indent, line) => line.length ? Math.min(indent, line.search(/\\S/)) : indent,\n        Infinity,\n    );\n\n    return lines.map((line) => line.substring(minIndent)).join(\"\\n\");\n}\n\n// Based on https://en.wikipedia.org/wiki/Levenshtein_distance#Iterative_with_two_matrix_rows\n// Slightly modified for improved match results for options\nexport function editDistance(s: string, t: string): number {\n    if (s.length < t.length) return editDistance(t, s);\n\n    let v0 = Array.from({ length: t.length + 1 }, (_, i) => i);\n    let v1 = Array.from({ length: t.length + 1 }, () => 0);\n\n    for (let i = 0; i < s.length; i++) {\n        v1[0] = i + 1;\n\n        for (let j = 0; j < s.length; j++) {\n            const deletionCost = v0[j + 1] + 1;\n            const insertionCost = v1[j] + 1;\n            let substitutionCost: number;\n            if (s[i] === t[j]) {\n                substitutionCost = v0[j];\n            } else if (s[i]?.toUpperCase() === t[j]?.toUpperCase()) {\n                substitutionCost = v0[j] + 1;\n            } else {\n                substitutionCost = v0[j] + 3;\n            }\n\n            v1[j + 1] = Math.min(deletionCost, insertionCost, substitutionCost);\n        }\n\n        [v0, v1] = [v1, v0];\n    }\n\n    return v0[t.length];\n}\n\nexport function getSimilarValues(values: Iterable<string>, compareTo: string) {\n    const results = new DefaultMap<number, string[]>(() => []);\n    let lowest = Infinity;\n    for (const name of values) {\n        const distance = editDistance(compareTo, name);\n        lowest = Math.min(lowest, distance);\n        results.get(distance).push(name);\n    }\n\n    // Experimenting a bit, it seems an edit distance of 3 is roughly the\n    // right metric for relevant \"similar\" results without showing obviously wrong suggestions\n    return results\n        .get(lowest)\n        .concat(results.get(lowest + 1), results.get(lowest + 2));\n}\n\n// From MDN\nexport function escapeRegExp(s: string) {\n    return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n}\n\nconst htmlEscapes: Record<string, string> = {\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    '\"': \"&quot;\",\n    \"'\": \"&#39;\",\n};\nexport function escapeHtml(html: string) {\n    return html.replace(/[&<>'\"]/g, (c) => htmlEscapes[c as never]);\n}\n"
  },
  {
    "path": "src/lib/utils-common/validation.ts",
    "content": "export type Infer<T extends Schema> = T extends Optional<infer U> ? Infer<U> :\n    T extends Guard<infer U> ? U :\n    T extends typeof String ? string :\n    T extends typeof Number ? number :\n    T extends typeof Boolean ? boolean :\n    T extends readonly string[] ? T[number] :\n    T extends readonly [typeof Array, Schema] ? Array<Infer<T[1]>> :\n    & {\n        -readonly [K in OptionalKeys<T>]?: Infer<\n            Extract<T[K & keyof T], Schema>\n        >;\n    }\n    & {\n        -readonly [\n            K in Exclude<\n                keyof T,\n                OptionalKeys<T> | typeof additionalProperties\n            >\n        ]: Infer<Extract<T[K], Schema>>;\n    };\n\nexport type Optional<T extends Schema> = Record<typeof opt, T>;\nexport type Guard<T> = (x: unknown) => x is T;\n\ntype OptionalKeys<T> = keyof {\n    [K in keyof T as T[K] extends Optional<any> ? K : never]: 1;\n};\n\nconst opt = Symbol();\n\n/**\n * Symbol that may be placed on a schema object to define how additional properties are handled.\n * By default, additional properties are not checked.\n */\nexport const additionalProperties = Symbol();\n\nexport type Schema =\n    | typeof String\n    | typeof Number\n    | typeof Boolean\n    | readonly string[]\n    | readonly [typeof Array, Schema]\n    | { readonly [k: string]: Schema; [additionalProperties]?: boolean }\n    | Guard<unknown>\n    | Optional<typeof String>\n    | Optional<typeof Number>\n    | Optional<typeof Boolean>\n    | Optional<readonly string[]>\n    | Optional<readonly [typeof Array, Schema]>\n    | Optional<{\n        readonly [k: string]: Schema;\n        [additionalProperties]?: boolean;\n    }>\n    | Optional<Guard<unknown>>;\n\n/**\n * Straightforward, fairly dumb, validation helper.\n * @param schema\n * @param obj\n */\nexport function validate<T extends Schema>(\n    schema: T,\n    obj: unknown,\n): obj is Infer<T>;\nexport function validate(schema: Schema, obj: any): boolean {\n    let type: any = schema;\n    if (opt in schema) {\n        if (obj == null) {\n            return true;\n        }\n        type = (schema as Optional<Schema>)[opt];\n    }\n\n    if (type === String) {\n        return typeof obj === \"string\";\n    }\n\n    if (type === Number) {\n        return typeof obj === \"number\";\n    }\n\n    if (type === Boolean) {\n        return typeof obj === \"boolean\";\n    }\n\n    if (typeof type === \"function\") {\n        return type(obj);\n    }\n\n    if (Array.isArray(type)) {\n        if (type[0] === Array) {\n            return (\n                Array.isArray(obj) &&\n                obj.every((item) => validate(type[1], item))\n            );\n        }\n\n        return type.includes(obj);\n    }\n\n    if (\n        additionalProperties in schema &&\n        !(schema as any)[additionalProperties]\n    ) {\n        if (Object.keys(obj).some((key) => !(key in schema))) {\n            return false;\n        }\n    }\n\n    return (\n        !!obj &&\n        typeof obj === \"object\" &&\n        !Array.isArray(obj) &&\n        Object.entries<Schema>(type).every(([key, prop]) => validate(prop, obj[key]))\n    );\n}\n\nexport function optional<T extends Schema>(x: T): Optional<T> {\n    return { [opt]: x };\n}\n\nexport type TagString = `@${string}`;\n\nexport function isTagString(x: unknown): x is TagString {\n    return typeof x === \"string\" && /^@[a-z][a-z0-9-]*$/i.test(x);\n}\n"
  },
  {
    "path": "src/lib/validation/documentation.ts",
    "content": "import {\n    DeclarationReflection,\n    type ProjectReflection,\n    type Reflection,\n    ReflectionKind,\n    ReflectionType,\n} from \"../models/index.js\";\nimport { i18n, type Logger, removeFlag } from \"#utils\";\n\nexport function validateDocumentation(\n    project: ProjectReflection,\n    logger: Logger,\n    requiredToBeDocumented: readonly ReflectionKind.KindString[],\n    intentionallyNotDocumented: readonly string[],\n    packagesRequiringDocumentation: readonly string[],\n): void {\n    let kinds = requiredToBeDocumented.reduce(\n        (prev, cur) => prev | ReflectionKind[cur],\n        0,\n    );\n\n    // Functions, Constructors, and Accessors never have comments directly on them.\n    // If they are required to be documented, what's really required is that their\n    // contained signatures have a comment.\n    if (kinds & ReflectionKind.FunctionOrMethod) {\n        kinds |= ReflectionKind.CallSignature;\n        kinds = removeFlag(kinds, ReflectionKind.FunctionOrMethod);\n    }\n    if (kinds & ReflectionKind.Constructor) {\n        kinds |= ReflectionKind.ConstructorSignature;\n        kinds = removeFlag(kinds, ReflectionKind.Constructor);\n    }\n    if (kinds & ReflectionKind.Accessor) {\n        kinds |= ReflectionKind.GetSignature | ReflectionKind.SetSignature;\n        kinds = removeFlag(kinds, ReflectionKind.Accessor);\n    }\n\n    const toProcess = project.getReflectionsByKind(kinds);\n    const seen = new Set<Reflection>();\n    const intentionalUsage = new Set<number>();\n\n    outer: while (toProcess.length) {\n        const ref = toProcess.shift()!;\n        if (seen.has(ref)) continue;\n        seen.add(ref);\n\n        // If inside a parameter, we shouldn't care. Callback parameter's values don't get deeply documented.\n        let r: Reflection | undefined = ref.parent;\n        while (r) {\n            if (r.kindOf(ReflectionKind.Parameter)) {\n                continue outer;\n            }\n            r = r.parent;\n        }\n\n        // Type aliases own their comments, even if they're function-likes.\n        // So if we're a type literal owned by a type alias, don't do anything.\n        if (\n            ref.kindOf(ReflectionKind.TypeLiteral) &&\n            ref.parent?.kindOf(ReflectionKind.TypeAlias)\n        ) {\n            toProcess.push(ref.parent);\n            continue;\n        }\n        // Call signatures are considered documented if they have a comment directly, or their\n        // container has a comment and they are directly within a type literal belonging to that container.\n        if (\n            ref.kindOf(ReflectionKind.CallSignature) &&\n            ref.parent?.kindOf(ReflectionKind.TypeLiteral)\n        ) {\n            toProcess.push(ref.parent.parent!);\n            continue;\n        }\n\n        // Construct signatures are considered documented if they are directly within a documented type alias.\n        if (\n            ref.kindOf(ReflectionKind.ConstructorSignature) &&\n            ref.parent?.parent?.kindOf(ReflectionKind.TypeAlias)\n        ) {\n            toProcess.push(ref.parent.parent);\n            continue;\n        }\n\n        if (ref instanceof DeclarationReflection) {\n            const signatures = ref.type instanceof ReflectionType\n                ? ref.type.declaration.getNonIndexSignatures()\n                : ref.getNonIndexSignatures();\n\n            if (signatures.length) {\n                // We've been asked to validate this reflection, so we should validate that\n                // signatures all have comments\n                toProcess.push(...signatures);\n\n                if (ref.kindOf(ReflectionKind.SignatureContainer)) {\n                    // Comments belong to each signature, and will not be included on this object.\n                    continue;\n                }\n            }\n        }\n\n        const symbolId = project.getSymbolIdFromReflection(ref);\n\n        // #2644, signatures may be documented by their parent reflection.\n        const hasComment = ref.hasComment() ||\n            (ref.kindOf(ReflectionKind.SomeSignature) &&\n                ref.parent?.hasComment());\n\n        if (!hasComment && symbolId) {\n            if (!packagesRequiringDocumentation.includes(symbolId.packageName)) {\n                continue;\n            }\n\n            const intentionalIndex = intentionallyNotDocumented.indexOf(\n                ref.getFriendlyFullName(),\n            );\n            if (intentionalIndex !== -1) {\n                intentionalUsage.add(intentionalIndex);\n                continue;\n            }\n\n            logger.validationWarning(\n                i18n.reflection_0_kind_1_defined_in_2_does_not_have_any_documentation(\n                    ref.getFriendlyFullName(),\n                    ReflectionKind[ref.kind],\n                    `${symbolId.packageName}/${symbolId.packagePath}`,\n                ),\n            );\n        }\n    }\n\n    const unusedIntentional = intentionallyNotDocumented.filter(\n        (_, i) => !intentionalUsage.has(i),\n    );\n    if (unusedIntentional.length) {\n        logger.validationWarning(\n            i18n.invalid_intentionally_not_documented_names_0(\n                unusedIntentional.join(\"\\n\\t\"),\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/validation/exports.ts",
    "content": "import { ok } from \"assert\";\nimport type { ProjectReflection, ReferenceType } from \"../models/index.js\";\nimport { discoverAllReferenceTypes } from \"../utils/reflections.js\";\nimport { i18n, type Logger } from \"#utils\";\n\nfunction makeIntentionallyExportedHelper(\n    project: ProjectReflection,\n    intentional: readonly string[],\n    logger: Logger,\n) {\n    const used = new Set<number>();\n    const processed: [string, string][] = intentional.map((v) => {\n        const index = v.lastIndexOf(\":\");\n        if (index === -1) {\n            return [\"\", v];\n        }\n        return [v.substring(0, index), v.substring(index + 1)];\n    });\n\n    return {\n        has(type: ReferenceType, typeName: string) {\n            ok(!type.reflection);\n\n            // If it isn't declared anywhere, we can't produce a good error message about where\n            // the non-exported symbol is, so even if it isn't ignored, pretend it is. In practice,\n            // this will happen incredibly rarely, since symbols without declarations are very rare.\n            // I know of only two instances:\n            // 1. `undefined` in `globalThis`\n            // 2. Properties on non-homomorphic mapped types, e.g. the symbol for \"foo\" on `Record<\"foo\", 1>`\n            // There might be others, so still check this here rather than asserting, but print a debug log\n            // so that we can possibly improve this in the future.\n            if (!type.package) {\n                logger.verbose(\n                    `The type ${type.qualifiedName} has no declarations, implicitly allowing missing export.`,\n                );\n                return true;\n            }\n\n            // Don't produce warnings for third-party symbols.\n            if (type.package !== project.packageName) {\n                return true;\n            }\n\n            for (const [index, [file, name]] of processed.entries()) {\n                if (\n                    typeName === name &&\n                    `${type.symbolId!.packageName}/${type.symbolId!.packagePath}`.endsWith(file)\n                ) {\n                    used.add(index);\n                    return true;\n                }\n            }\n\n            return false;\n        },\n        getUnused() {\n            return intentional.filter((_, i) => !used.has(i));\n        },\n    };\n}\n\nexport function validateExports(\n    project: ProjectReflection,\n    logger: Logger,\n    intentionallyNotExported: readonly string[],\n) {\n    const intentional = makeIntentionallyExportedHelper(\n        project,\n        intentionallyNotExported,\n        logger,\n    );\n    const warned = new Set<string>();\n\n    for (const { type, owner } of discoverAllReferenceTypes(project, true)) {\n        const uniqueId = type.symbolId?.getStableKey();\n\n        if (\n            !type.reflection &&\n            !type.externalUrl &&\n            !type.isIntentionallyBroken() &&\n            !intentional.has(type, type.qualifiedName) &&\n            !warned.has(uniqueId!) &&\n            !project.symbolIdHasBeenRemoved(type.symbolId!)\n        ) {\n            warned.add(uniqueId!);\n\n            logger.validationWarning(\n                i18n.type_0_defined_in_1_is_referenced_by_2_but_not_included_in_docs(\n                    type.qualifiedName,\n                    `${type.symbolId!.packageName}/${type.symbolId!.packagePath}`,\n                    owner.getFriendlyFullName(),\n                ),\n            );\n        }\n    }\n\n    const unusedIntentional = intentional.getUnused();\n    if (unusedIntentional.length) {\n        logger.validationWarning(\n            i18n.invalid_intentionally_not_exported_symbols_0(\n                unusedIntentional.join(\"\\n\\t\"),\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/validation/links.ts",
    "content": "import { i18n, type Logger } from \"#utils\";\nimport {\n    type Comment,\n    type CommentDisplayPart,\n    type InlineTagDisplayPart,\n    type ProjectReflection,\n    type Reflection,\n    ReflectionKind,\n    ReflectionSymbolId,\n} from \"../models/index.js\";\n\nconst linkTags = [\"@link\", \"@linkcode\", \"@linkplain\"];\n\nfunction getBrokenPartLinks(parts: readonly CommentDisplayPart[]) {\n    const links: InlineTagDisplayPart[] = [];\n\n    for (const part of parts) {\n        if (\n            part.kind === \"inline-tag\" &&\n            linkTags.includes(part.tag) &&\n            (!part.target || part.target instanceof ReflectionSymbolId)\n        ) {\n            links.push(part);\n        }\n    }\n\n    return links;\n}\n\nfunction getBrokenLinks(comment: Comment | undefined) {\n    if (!comment) return [];\n\n    const links = [...getBrokenPartLinks(comment.summary)];\n    for (const tag of comment.blockTags) {\n        links.push(...getBrokenPartLinks(tag.content));\n    }\n\n    return links;\n}\n\nexport function validateLinks(\n    project: ProjectReflection,\n    logger: Logger,\n): void {\n    for (const id in project.reflections) {\n        checkReflection(project.reflections[id], logger);\n    }\n}\n\nfunction checkReflection(reflection: Reflection, logger: Logger) {\n    if (reflection.isProject() || reflection.isDeclaration()) {\n        for (const broken of getBrokenPartLinks(reflection.readme || [])) {\n            const linkText = broken.text.trim();\n            // #2360, \"@\" is a future reserved character in TSDoc component paths\n            // If a link starts with it, and doesn't include a module source indicator \"!\"\n            // then the user probably is trying to link to a package containing \"@\" with an absolute link.\n            if (linkText.startsWith(\"@\") && !linkText.includes(\"!\")) {\n                logger.validationWarning(\n                    i18n.failed_to_resolve_link_to_0_in_readme_for_1_may_have_meant_2(\n                        linkText,\n                        reflection.getFriendlyFullName(),\n                        linkText.replace(/[.#~]/, \"!\"),\n                    ),\n                );\n            } else {\n                logger.validationWarning(\n                    i18n.failed_to_resolve_link_to_0_in_readme_for_1(\n                        linkText,\n                        reflection.getFriendlyFullName(),\n                    ),\n                );\n            }\n        }\n    }\n\n    if (reflection.isDocument()) {\n        for (const broken of getBrokenPartLinks(reflection.content)) {\n            const linkText = broken.text.trim();\n            if (linkText.startsWith(\"@\") && !linkText.includes(\"!\")) {\n                logger.validationWarning(\n                    i18n.failed_to_resolve_link_to_0_in_document_1_may_have_meant_2(\n                        linkText,\n                        reflection.getFriendlyFullName(),\n                        linkText.replace(/[.#~]/, \"!\"),\n                    ),\n                );\n            } else {\n                logger.validationWarning(\n                    i18n.failed_to_resolve_link_to_0_in_document_1(\n                        linkText,\n                        reflection.getFriendlyFullName(),\n                    ),\n                );\n            }\n        }\n    }\n\n    for (const broken of getBrokenLinks(reflection.comment)) {\n        reportBrokenCommentLink(broken, reflection, logger);\n    }\n\n    if (\n        reflection.isDeclaration() &&\n        reflection.kindOf(ReflectionKind.TypeAlias) &&\n        reflection.type?.type === \"union\" &&\n        reflection.type.elementSummaries\n    ) {\n        for (\n            const broken of reflection.type.elementSummaries.flatMap(\n                getBrokenPartLinks,\n            )\n        ) {\n            reportBrokenCommentLink(broken, reflection, logger);\n        }\n    }\n}\n\nfunction reportBrokenCommentLink(broken: InlineTagDisplayPart, reflection: Reflection, logger: Logger) {\n    const linkText = broken.text.trim();\n    if (broken.target instanceof ReflectionSymbolId) {\n        logger.validationWarning(\n            i18n.comment_for_0_links_to_1_not_included_in_docs_use_external_link_2(\n                reflection.getFriendlyFullName(),\n                linkText,\n                `{ \"${broken.target.packageName}\": { \"${broken.target.qualifiedName}\": \"#\" }}`,\n            ),\n        );\n    } else if (linkText.startsWith(\"@\") && !linkText.includes(\"!\")) {\n        logger.validationWarning(\n            i18n.failed_to_resolve_link_to_0_in_comment_for_1_may_have_meant_2(\n                linkText,\n                reflection.getFriendlyFullName(),\n                linkText.replace(/[.#~]/, \"!\"),\n            ),\n        );\n    } else {\n        logger.validationWarning(\n            i18n.failed_to_resolve_link_to_0_in_comment_for_1(\n                linkText,\n                reflection.getFriendlyFullName(),\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "src/lib/validation/unusedMergeModuleWith.ts",
    "content": "import { i18n, type Logger } from \"#utils\";\nimport { type ProjectReflection, ReflectionKind } from \"../models/index.js\";\n\nexport function validateMergeModuleWith(\n    project: ProjectReflection,\n    logger: Logger,\n): void {\n    for (\n        const refl of project.getReflectionsByKind(\n            ReflectionKind.SomeModule,\n        )\n    ) {\n        if (refl.comment?.getTag(\"@mergeModuleWith\")) {\n            logger.warn(\n                i18n.reflection_0_has_unused_mergeModuleWith_tag(\n                    refl.getFriendlyFullName(),\n                ),\n            );\n        }\n    }\n\n    if (project.comment?.getTag(\"@mergeModuleWith\")) {\n        logger.warn(\n            i18n.reflection_0_has_unused_mergeModuleWith_tag(\n                \"<project>\",\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "src/test/Repository.test.ts",
    "content": "import { GitRepository, guessSourceUrlTemplate, RepositoryManager } from \"../lib/converter/utils/repository.js\";\nimport { deepStrictEqual as equal, ok } from \"assert\";\nimport { type Project, tempdirProject } from \"@typestrong/fs-fixture-builder\";\nimport { spawnSync } from \"child_process\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { join } from \"path\";\nimport { normalizePath } from \"../lib/utils/paths.js\";\n\nfunction git(cwd: string, ...args: string[]) {\n    const env = {\n        GIT_AUTHOR_NAME: \"test\",\n        GIT_AUTHOR_EMAIL: \"test@example.com\",\n        GIT_AUTHOR_DATE: \"2024-03-31T22:04:50.119Z\",\n        GIT_COMMITTER_NAME: \"test\",\n        GIT_COMMITTER_EMAIL: \"test@example.com\",\n        GIT_COMMITTER_DATE: \"2024-03-31T22:04:50.119Z\",\n    };\n    return spawnSync(\"git\", [\"-C\", cwd, ...args], {\n        encoding: \"utf-8\",\n        windowsHide: true,\n        env,\n    });\n}\n\ndescribe(\"Repository\", function () {\n    describe(\"guessSourceUrlTemplate helper\", () => {\n        it(\"handles a personal GitHub HTTPS URL\", () => {\n            const mockRemotes = [\"https://github.com/joebloggs/foobar.git\"];\n\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://github.com/joebloggs/foobar/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles a personal GitHub SSH URL\", () => {\n            const mockRemotes = [\"git@github.com:TypeStrong/typedoc.git\"];\n\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://github.com/TypeStrong/typedoc/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles an enterprise GitHub URL\", () => {\n            const mockRemotes = [\"git@github.acme.com:joebloggs/foobar.git\"];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://github.acme.com/joebloggs/foobar/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles an enterprise GitHub URL\", () => {\n            const mockRemotes = [\n                \"ssh://org@bigcompany.githubprivate.com/joebloggs/foobar.git\",\n            ];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://bigcompany.githubprivate.com/joebloggs/foobar/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles a ghe.com URL\", () => {\n            const mockRemotes = [\n                \"ssh://org@bigcompany.ghe.com/joebloggs/foobar.git\",\n            ];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://bigcompany.ghe.com/joebloggs/foobar/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles a github.us URL\", () => {\n            const mockRemotes = [\n                \"ssh://org@bigcompany.github.us/joebloggs/foobar.git\",\n            ];\n\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://bigcompany.github.us/joebloggs/foobar/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles a bitbucket URL\", () => {\n            const mockRemotes = [\n                \"https://joebloggs@bitbucket.org/joebloggs/foobar.git\",\n            ];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://bitbucket.org/joebloggs/foobar/src/{gitRevision}/{path}#lines-{line}\",\n            );\n        });\n\n        it(\"handles a bitbucket SSH URL\", () => {\n            const mockRemotes = [\"git@bitbucket.org:joebloggs/foobar.git\"];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://bitbucket.org/joebloggs/foobar/src/{gitRevision}/{path}#lines-{line}\",\n            );\n        });\n\n        it(\"handles a GitLab URL\", () => {\n            const mockRemotes = [\"https://gitlab.com/joebloggs/foobar.git\"];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://gitlab.com/joebloggs/foobar/-/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"handles a GitLab SSH URL\", () => {\n            const mockRemotes = [\"git@gitlab.com:joebloggs/foobar.git\"];\n            equal(\n                guessSourceUrlTemplate(mockRemotes),\n                \"https://gitlab.com/joebloggs/foobar/-/blob/{gitRevision}/{path}#L{line}\",\n            );\n        });\n\n        it(\"Gracefully handles unknown urls\", () => {\n            const mockRemotes = [\"git@example.com\"];\n            equal(guessSourceUrlTemplate(mockRemotes), undefined);\n        });\n    });\n\n    describe(\"getURL\", () => {\n        using project = tempdirProject();\n        afterEach(() => {\n            project.rm();\n        });\n\n        it(\"Handles replacements\", function () {\n            project.addFile(\"test.js\", \"console.log('hi!')\");\n            project.write();\n\n            git(project.cwd, \"init\", \"-b\", \"test\");\n            git(project.cwd, \"add\", \".\");\n            git(project.cwd, \"commit\", \"-m\", \"Test commit\", \"--no-gpg-sign\");\n            git(\n                project.cwd,\n                \"remote\",\n                \"add\",\n                \"origin\",\n                \"git@github.com:TypeStrong/typedoc.git\",\n            );\n\n            const repo = GitRepository.tryCreateRepository(\n                project.cwd,\n                \"{gitRevision}/{gitRevision:short}/{path}/{line}\",\n                \"\", // revision, empty to get from repo\n                \"origin\", // remote\n                new TestLogger(),\n            );\n\n            ok(repo);\n            equal(\n                repo.getURL(normalizePath(join(project.cwd, \"test.js\")), 1),\n                \"b53cc55bcdd9bc5920787a1d4a4a15fa24123b04/b53cc55b/test.js/1\",\n            );\n\n            const repo2 = GitRepository.tryCreateRepository(\n                project.cwd,\n                \"{gitRevision}/{gitRevision:short}/{path}/{line}\",\n                \"{branch}\", // revision\n                \"origin\", // remote\n                new TestLogger(),\n            );\n\n            equal(repo2?.gitRevision, \"test\");\n        });\n    });\n});\n\ndescribe(\"RepositoryManager - no git\", () => {});\n\ndescribe(\"RepositoryManager - git enabled\", () => {\n    let fix: Project;\n    const logger = new TestLogger();\n    const manager = new RepositoryManager(\n        \"\",\n        \"revision\",\n        \"remote\",\n        \"link:{path}\",\n        false, // disable git\n        logger,\n    );\n\n    before(function () {\n        function createRepo(path: string) {\n            git(path, \"init\", \"-b\", \"test\");\n            git(path, \"add\", \".\");\n            git(path, \"commit\", \"-m\", \"Test commit\", \"--no-gpg-sign\");\n        }\n\n        fix = tempdirProject();\n        fix.addFile(\"root.txt\");\n        fix.addFile(\".gitignore\", \"/ignored\");\n        fix.addSymlink(\"self\", \".\");\n        fix.addSymlink(\"sub\", \"subfolder\");\n        fix.dir(\"subfolder\", (dir) => {\n            dir.addFile(\"sub.txt\");\n        });\n        fix.dir(\"ignored\", (dir) => {\n            dir.addFile(\"ignored.txt\");\n        });\n        fix.dir(\"sub_repo\", (dir) => {\n            dir.addFile(\"repo.txt\");\n        });\n\n        try {\n            fix.write();\n        } catch (error) {\n            if (process.platform === \"win32\") {\n                // Don't have permission to create symlinks\n                return this.skip();\n            }\n            throw error;\n        }\n        createRepo(join(fix.cwd, \"sub_repo\"));\n        createRepo(fix.cwd);\n    });\n    after(() => {\n        fix.rm();\n    });\n\n    afterEach(() => {\n        logger.expectNoOtherMessages();\n        logger.reset();\n    });\n\n    it(\"Handles the simplest case\", () => {\n        const root = normalizePath(join(fix.cwd, \"root.txt\"));\n        const repo = manager.getRepository(root) as GitRepository;\n        ok(repo);\n        equal(repo.getURL(root, 1), \"link:root.txt\");\n        equal(\n            repo.files,\n            new Set(\n                [\n                    \".gitignore\",\n                    \"root.txt\",\n                    \"self\",\n                    \"sub\",\n                    \"sub_repo\",\n                    \"subfolder/sub.txt\",\n                ].map((f) => normalizePath(join(fix.cwd, f))),\n            ),\n        );\n    });\n\n    it(\"Handles a recursive self-symlink\", () => {\n        const root = join(fix.cwd, \"self/self/self/root.txt\");\n        const repo = manager.getRepository(root) as GitRepository;\n        ok(repo);\n        // Ideally, this would probably be link:root.txt, but I'll\n        // settle for not crashing right now.\n        equal(repo.getURL(root, 1), undefined);\n        equal(\n            repo.files,\n            new Set(\n                [\n                    \".gitignore\",\n                    \"root.txt\",\n                    \"self\",\n                    \"sub\",\n                    \"sub_repo\",\n                    \"subfolder/sub.txt\",\n                ].map((f) => normalizePath(join(fix.cwd, f))),\n            ),\n        );\n    });\n\n    it(\"Handles a nested repository\", () => {\n        const sub = normalizePath(join(fix.cwd, \"sub_repo/repo.txt\"));\n        const repo = manager.getRepository(sub) as GitRepository | undefined;\n        ok(repo);\n        equal(repo.path, normalizePath(join(fix.cwd, \"sub_repo\")));\n        equal(repo.getURL(sub, 1), \"link:repo.txt\");\n        equal(repo.files.size, 1);\n    });\n\n    it(\"Caches repositories\", () => {\n        // Load cache\n        for (\n            const path of [\n                \"root.txt\",\n                \"self/self/self/root.txt\",\n                \"sub_repo/repo.txt\",\n                \"ignored/ignored.txt\",\n                \"subfolder/sub.txt\",\n            ]\n        ) {\n            manager.getRepository(join(fix.cwd, path));\n        }\n\n        const root = join(fix.cwd, \"root.txt\");\n        const rootIndirect = join(fix.cwd, \"self/self/self/root.txt\");\n        const subfolder = join(fix.cwd, \"subfolder/sub.txt\");\n        const repo = manager.getRepository(root) as GitRepository;\n        const repo2 = manager.getRepository(rootIndirect) as GitRepository;\n        const repo3 = manager.getRepository(subfolder) as GitRepository;\n        ok(repo === repo2);\n        ok(repo === repo3);\n\n        const sub = join(fix.cwd, \"sub_repo/repo.txt\");\n        const subRepo = manager.getRepository(sub) as GitRepository;\n        const subRepo2 = manager.getRepository(sub) as GitRepository;\n        ok(subRepo === subRepo2);\n\n        equal(\n            manager[\"cache\"],\n            new Map([\n                [normalizePath(fix.cwd), repo],\n                [normalizePath(join(fix.cwd, \"self/self/self\")), repo],\n                [normalizePath(join(fix.cwd, \"sub_repo\")), subRepo],\n                [normalizePath(join(fix.cwd, \"ignored\")), repo],\n                [normalizePath(join(fix.cwd, \"subfolder\")), repo],\n            ]),\n        );\n    });\n\n    it(\"Handles .gitignored paths\", () => {\n        const ign = join(fix.cwd, \"ignored/ignored.txt\");\n        const repo = manager.getRepository(ign);\n        equal(repo?.path, normalizePath(fix.cwd));\n        equal(repo.getURL(ign, 1), undefined);\n    });\n});\n\ndescribe(\"RepositoryManager - edge cases\", () => {\n    let fix: Project;\n    const logger = new TestLogger();\n    const manager = new RepositoryManager(\n        \"\",\n        \"\",\n        \"remote\",\n        \"\",\n        false, // disable git\n        logger,\n    );\n\n    beforeEach(() => {\n        fix = tempdirProject();\n    });\n\n    afterEach(() => {\n        fix.rm();\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles repositories without any commit\", () => {\n        fix.write();\n        git(fix.cwd, \"init\", \"-b\", \"test\");\n        equal(manager.getRepository(fix.cwd + \"/test.txt\"), undefined);\n    });\n\n    it(\"Handles a remote which does not exist\", () => {\n        fix.addFile(\"test.txt\");\n        fix.write();\n        git(fix.cwd, \"init\", \"-b\", \"test\");\n        git(fix.cwd, \"add\", \".\");\n        git(fix.cwd, \"commit\", \"-m\", \"test\", \"--no-gpg-sign\");\n        equal(manager.getRepository(fix.cwd + \"/test.txt\"), undefined);\n        logger.expectMessage('warn: The provided git remote \"remote\" was not valid. Source links will be broken');\n    });\n\n    it(\"Handles a remote which does not match a known domain\", () => {\n        fix.addFile(\"test.txt\");\n        fix.write();\n        git(fix.cwd, \"init\", \"-b\", \"test\");\n        git(fix.cwd, \"add\", \".\");\n        git(fix.cwd, \"commit\", \"-m\", \"test\", \"--no-gpg-sign\");\n        git(fix.cwd, \"remote\", \"add\", \"remote\", \"https://example.com/fake.git\");\n        equal(manager.getRepository(fix.cwd + \"/test.txt\"), undefined);\n    });\n});\n"
  },
  {
    "path": "src/test/TestLogger.ts",
    "content": "import { Logger, LogLevel } from \"#utils\";\nimport { fail, ok } from \"assert\";\n\nconst levelMap: Record<LogLevel, string> = {\n    [LogLevel.None]: \"none: \",\n    [LogLevel.Error]: \"error: \",\n    [LogLevel.Warn]: \"warn: \",\n    [LogLevel.Info]: \"info: \",\n    [LogLevel.Verbose]: \"debug: \",\n};\n\nexport class TestLogger extends Logger {\n    messages: string[] = [];\n\n    reset() {\n        this.resetErrors();\n        this.resetWarnings();\n        this.messages = [];\n    }\n\n    expectMessage(message: string) {\n        const regex = createRegex(message);\n        const index = this.messages.findIndex((m) => regex.test(m));\n        if (index === -1) {\n            const messages = this.messages.join(\"\\n\\t\") || \"(none logged)\";\n            fail(\n                `Expected \"${message}\" to be logged. The logged messages were:\\n\\t${messages}`,\n            );\n        }\n        this.messages.splice(index, 1);\n    }\n\n    expectNoMessage(message: string) {\n        const regex = createRegex(message);\n        const index = this.messages.findIndex((m) => regex.test(m));\n        if (index !== -1) {\n            const messages = this.messages.join(\"\\n\\t\");\n            fail(\n                `Expected \"${message}\" to not be logged. The logged messages were:\\n\\t${messages}`,\n            );\n        }\n    }\n\n    expectNoOtherMessages() {\n        const messages = this.messages.filter((msg) => !msg.startsWith(\"debug\"));\n\n        ok(\n            messages.length === 0,\n            `Expected no other messages to be logged. The logged messages were:\\n\\t${\n                this.messages.join(\n                    \"\\n\\t\",\n                )\n            }`,\n        );\n    }\n\n    override log(message: string, level: LogLevel): void {\n        super.log(message, level);\n        this.messages.push(levelMap[level] + message);\n    }\n}\n\nfunction createRegex(s: string) {\n    return new RegExp(\n        [\n            \"^\",\n            s.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \"[\\\\s\\\\S]*\"),\n            \"$\",\n        ].join(\"\"),\n    );\n}\n"
  },
  {
    "path": "src/test/behavior.c2.test.ts",
    "content": "import { deepStrictEqual as equal, ok } from \"assert\";\nimport {\n    Comment,\n    CommentTag,\n    type ContainerReflection,\n    LiteralType,\n    Reflection,\n    ReflectionKind,\n    SignatureReflection,\n} from \"../lib/models/index.js\";\nimport { filterMap } from \"#utils\";\nimport { CommentStyle } from \"../lib/utils/options/declaration.js\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { getComment, getSigComment, query, querySig, reflToTree } from \"./utils.js\";\nimport { getConverter2App, getConverter2Project } from \"./programs.js\";\n\ntype NameTree = { [name: string]: NameTree | undefined };\n\nfunction buildNameTree(\n    refl: ContainerReflection,\n    tree: NameTree = {},\n): NameTree {\n    for (const child of refl.children || []) {\n        tree[child.name] ||= {};\n        buildNameTree(child, tree[child.name]);\n    }\n\n    return tree;\n}\n\nfunction getLinks(refl: Reflection) {\n    ok(refl.comment);\n    return filterMap(refl.comment.summary, (p) => {\n        if (p.kind === \"inline-tag\" && p.tag === \"@link\") {\n            if (typeof p.target === \"string\") {\n                return p.target;\n            }\n            if (p.target instanceof SignatureReflection) {\n                return [\n                    p.target.getFullName(),\n                    p.target.parent.signatures?.indexOf(p.target),\n                ];\n            }\n            if (p.target instanceof Reflection) {\n                return [p.target.kind, p.target.getFullName()];\n            }\n            return [p.target?.qualifiedName];\n        }\n    });\n}\n\nfunction getLinkTexts(refl: Reflection) {\n    ok(refl.comment);\n    return filterMap(refl.comment.summary, (p) => {\n        if (p.kind === \"inline-tag\" && p.tag === \"@link\") {\n            return p.text;\n        }\n    });\n}\n\nconst app = getConverter2App();\n\nfunction convert(...entries: [string, ...string[]]) {\n    return getConverter2Project(entries, \"behavior\");\n}\n\ndescribe(\"Behavior Tests\", () => {\n    let logger: TestLogger;\n    let optionsSnap: { __optionSnapshot: never };\n\n    beforeEach(() => {\n        app.logger = logger = new TestLogger();\n        optionsSnap = app.options.snapshot();\n    });\n\n    afterEach(() => {\n        app.options.restore(optionsSnap);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles 'as const' style enums\", () => {\n        const project = convert(\"asConstEnum\");\n        const SomeEnumLike = query(project, \"SomeEnumLike\");\n        equal(SomeEnumLike.kind, ReflectionKind.Variable, \"SomeEnumLike\");\n        const SomeEnumLikeTagged = query(project, \"SomeEnumLikeTagged\");\n        equal(\n            SomeEnumLikeTagged.kind,\n            ReflectionKind.Enum,\n            \"SomeEnumLikeTagged\",\n        );\n        const A = query(project, \"SomeEnumLikeTagged.a\");\n        equal(A.type, new LiteralType(\"a\"));\n        equal(A.defaultValue, undefined);\n\n        const ManualEnum = query(project, \"ManualEnum\");\n        equal(ManualEnum.kind, ReflectionKind.Enum, \"ManualEnum\");\n\n        const ManualWithoutHelper = query(project, \"ManualEnumHelper\");\n        equal(\n            ManualWithoutHelper.kind,\n            ReflectionKind.Enum,\n            \"ManualEnumHelper\",\n        );\n\n        const WithoutReadonly = query(project, \"WithoutReadonly\");\n        equal(WithoutReadonly.kind, ReflectionKind.Enum, \"WithoutReadonly\");\n\n        const SomeEnumLikeNumeric = query(project, \"SomeEnumLikeNumeric\");\n        equal(\n            SomeEnumLikeNumeric.kind,\n            ReflectionKind.Variable,\n            \"SomeEnumLikeNumeric\",\n        );\n        const SomeEnumLikeTaggedNumeric = query(\n            project,\n            \"SomeEnumLikeTaggedNumeric\",\n        );\n        equal(\n            SomeEnumLikeTaggedNumeric.kind,\n            ReflectionKind.Enum,\n            \"SomeEnumLikeTaggedNumeric\",\n        );\n        const B = query(project, \"SomeEnumLikeTaggedNumeric.b\");\n        equal(B.type, new LiteralType(1));\n        equal(B.defaultValue, undefined);\n\n        const ManualEnumNumeric = query(project, \"ManualEnumNumeric\");\n        equal(ManualEnumNumeric.kind, ReflectionKind.Enum, \"ManualEnumNumeric\");\n\n        const ManualWithoutHelperNumeric = query(\n            project,\n            \"ManualEnumHelperNumeric\",\n        );\n        equal(\n            ManualWithoutHelperNumeric.kind,\n            ReflectionKind.Enum,\n            \"ManualEnumHelperNumeric\",\n        );\n\n        const WithoutReadonlyNumeric = query(project, \"WithoutReadonlyNumeric\");\n        equal(\n            WithoutReadonlyNumeric.kind,\n            ReflectionKind.Enum,\n            \"WithoutReadonlyNumeric\",\n        );\n\n        const WithInvalidTypeUnionMember = query(\n            project,\n            \"WithInvalidTypeUnionMember\",\n        );\n        equal(\n            WithInvalidTypeUnionMember.kind,\n            ReflectionKind.Variable,\n            \"WithInvalidTypeUnionMember\",\n        );\n\n        const WithNumericExpression = query(project, \"WithNumericExpression\");\n        equal(\n            WithNumericExpression.kind,\n            ReflectionKind.Enum,\n            \"WithNumericExpression\",\n        );\n    });\n\n    it(\"Handles non-jsdoc block comments\", () => {\n        app.options.setValue(\"commentStyle\", CommentStyle.Block);\n        const project = convert(\"blockComment\");\n        const a = query(project, \"a\");\n        const b = query(project, \"b\");\n\n        equal(Comment.combineDisplayParts(a.comment?.summary), \"jsdoc block\");\n        equal(\n            Comment.combineDisplayParts(b.comment?.summary),\n            \"block, but not jsdoc\",\n        );\n    });\n\n    it(\"Handles const variable namespace\", () => {\n        const project = convert(\"constNamespace\");\n        const someNs = query(project, \"someNs\");\n        equal(someNs.kind, ReflectionKind.Namespace);\n        equal(Comment.combineDisplayParts(someNs.comment?.summary), \"ns doc\");\n\n        const a = query(project, \"someNs.a\");\n        equal(Comment.combineDisplayParts(a.comment?.summary), \"a doc\");\n\n        const b = query(project, \"someNs.b\");\n        equal(\n            Comment.combineDisplayParts(b.signatures?.[0].comment?.summary),\n            \"b doc\",\n        );\n    });\n\n    it(\"Should allow the user to mark a variable or function as a class with @class\", () => {\n        const project = convert(\"classTag\");\n        logger.expectMessage(\n            `warn: BadClass is being converted as a class, but does not have any construct signatures`,\n        );\n\n        const CallableClass = query(project, \"CallableClass\");\n        equal(CallableClass.signatures?.length, 2);\n        equal(\n            CallableClass.signatures.map((sig) => sig.type?.toString()),\n            [\"number\", \"string\"],\n        );\n        equal(\n            CallableClass.signatures.map((sig) => sig.flags.isStatic),\n            [true, false],\n        );\n        equal(\n            CallableClass.children?.map((child) => [\n                child.name,\n                ReflectionKind.singularString(child.kind),\n            ]),\n            [\n                [\n                    \"constructor\",\n                    ReflectionKind.singularString(ReflectionKind.Constructor),\n                ],\n                [\n                    \"inst\",\n                    ReflectionKind.singularString(ReflectionKind.Property),\n                ],\n                [\n                    \"stat\",\n                    ReflectionKind.singularString(ReflectionKind.Property),\n                ],\n                [\n                    \"method\",\n                    ReflectionKind.singularString(ReflectionKind.Method),\n                ],\n            ],\n        );\n\n        equal(query(project, \"CallableClass.stat\").flags.isStatic, true);\n\n        equal(\n            [\"VariableClass\", \"VariableClass.stat\", \"VariableClass.inst\"].map(\n                (name) => getComment(project, name),\n            ),\n            [\"Variable class\", \"Stat docs\", \"Inst docs\"],\n        );\n\n        equal(\n            project.children?.map((c) => c.name),\n            [\"BadClass\", \"CallableClass\", \"VariableClass\"],\n        );\n    });\n\n    it(\"Handles const type parameters\", () => {\n        const project = convert(\"constTypeParam\");\n        const getNamesExactly = query(project, \"getNamesExactly\");\n        const typeParams = getNamesExactly.signatures?.[0].typeParameters;\n        equal(typeParams?.length, 1);\n        equal(typeParams[0].flags.isConst, true);\n    });\n\n    it(\"Handles declare global 'modules'\", () => {\n        const project = convert(\"declareGlobal\");\n        equal(\n            project.children?.map((c) => c.name),\n            [\"DeclareGlobal\"],\n        );\n    });\n\n    it(\"Handles duplicate heritage clauses\", () => {\n        const project = convert(\"duplicateHeritageClauses\");\n        const b = query(project, \"B\");\n        equal(b.extendedTypes?.map(String), [\"A\"]);\n\n        const c = query(project, \"C\");\n        equal(c.extendedTypes?.map(String), [\"A\"]);\n        equal(c.implementedTypes?.map(String), [\"A\"]);\n\n        const d = query(project, \"D\");\n        equal(d.extendedTypes?.map(String), [\n            'Record<\"a\", 1>',\n            'Record<\"b\", 1>',\n        ]);\n    });\n\n    it(\"Handles @default tags with JSDoc compat turned on\", () => {\n        const project = convert(\"defaultTag\");\n        const foo = query(project, \"foo\");\n        const tags = foo.comment?.blockTags.map((tag) => tag.content);\n\n        equal(tags, [\n            [{ kind: \"code\", text: \"```ts\\n\\n```\" }],\n            [{ kind: \"code\", text: \"```ts\\nfn({})\\n```\" }],\n        ]);\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles @default tags with JSDoc compat turned off\", () => {\n        app.options.setValue(\"jsDocCompatibility\", false);\n        const project = convert(\"defaultTag\");\n        const foo = query(project, \"foo\");\n        const tags = foo.comment?.blockTags.map((tag) => tag.content);\n\n        equal(tags, [[], [{ kind: \"text\", text: \"fn({})\" }]]);\n\n        logger.expectMessage(\n            \"warn: Encountered an unescaped open brace without an inline tag\",\n        );\n        logger.expectMessage(\"warn: Unmatched closing brace\");\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles @defaultValue tags\", () => {\n        const project = convert(\"defaultValueTag\");\n        const foo = query(project, \"foo\");\n        const tags = foo.comment?.blockTags.map((tag) => tag.content);\n\n        equal(tags, [\n            [{ kind: \"code\", text: \"```ts\\n\\n```\" }],\n            [{ kind: \"code\", text: \"```ts\\nfn({})\\n```\" }],\n        ]);\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles @example tags with JSDoc compat turned on\", () => {\n        const project = convert(\"exampleTags\");\n        const foo = query(project, \"foo\");\n        const tags = foo.comment?.blockTags.map((tag) => tag.content);\n        const names = foo.comment?.blockTags.map((tag) => tag.name);\n\n        equal(tags, [\n            [{ kind: \"code\", text: \"```ts\\n// JSDoc style\\ncodeHere();\\n```\" }],\n            [\n                {\n                    kind: \"code\",\n                    text: \"```ts\\n// JSDoc style\\ncodeHere();\\n```\",\n                },\n            ],\n            [\n                {\n                    kind: \"code\",\n                    text: \"```ts\\nx.map(() => { return 1; })\\n```\",\n                },\n            ],\n            [{ kind: \"code\", text: \"```ts\\n// TSDoc style\\ncodeHere();\\n```\" }],\n            [{ kind: \"code\", text: \"```ts\\n// TSDoc style\\ncodeHere();\\n```\" }],\n            [{ kind: \"code\", text: \"```ts\\noops();\\n```\" }],\n        ]);\n\n        equal(names, [\n            undefined,\n            \"JSDoc specialness\",\n            \"JSDoc with braces\",\n            undefined,\n            \"TSDoc name\",\n            \"Bad {@link} name\",\n        ]);\n\n        logger.expectMessage(\n            \"warn: The first line of an example tag will be taken literally as the example name, and should only contain text\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Warns about example tags containing braces when compat options are off\", () => {\n        app.options.setValue(\"jsDocCompatibility\", false);\n        const project = convert(\"exampleTags\");\n        const foo = query(project, \"foo\");\n        const tags = foo.comment?.blockTags.map((tag) => tag.content);\n        const names = foo.comment?.blockTags.map((tag) => tag.name);\n\n        equal(tags, [\n            [{ kind: \"text\", text: \"// JSDoc style\\ncodeHere();\" }],\n            [\n                {\n                    kind: \"text\",\n                    text: \"// JSDoc style\\ncodeHere();\",\n                },\n            ],\n            [\n                {\n                    kind: \"text\",\n                    text: \"x.map(() => { return 1; })\",\n                },\n            ],\n            [{ kind: \"code\", text: \"```ts\\n// TSDoc style\\ncodeHere();\\n```\" }],\n            [{ kind: \"code\", text: \"```ts\\n// TSDoc style\\ncodeHere();\\n```\" }],\n            [{ kind: \"code\", text: \"```ts\\noops();\\n```\" }],\n        ]);\n\n        equal(names, [\n            undefined,\n            \"<caption>JSDoc specialness</caption>\",\n            \"<caption>JSDoc with braces</caption>\",\n            undefined,\n            \"TSDoc name\",\n            \"Bad {@link} name\",\n        ]);\n\n        logger.expectMessage(\n            \"warn: Encountered an unescaped open brace without an inline tag\",\n        );\n        logger.expectMessage(\"warn: Unmatched closing brace\");\n        logger.expectMessage(\n            \"warn: The first line of an example tag will be taken literally as the example name, and should only contain text\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles excludeCategories\", () => {\n        app.options.setValue(\"excludeCategories\", [\"A\", \"Default\"]);\n        app.options.setValue(\"defaultCategory\", \"Default\");\n        const project = convert(\"excludeCategories\");\n        equal(\n            project.children?.map((c) => c.name),\n            [\"c\"],\n        );\n    });\n\n    it(\"Handles excludeNotDocumentedKinds\", () => {\n        app.options.setValue(\"excludeNotDocumented\", true);\n        app.options.setValue(\"excludeNotDocumentedKinds\", [\"Property\"]);\n        const project = convert(\"excludeNotDocumentedKinds\");\n        equal(buildNameTree(project), {\n            NotDoc: {\n                prop: {},\n            },\n            identity: {},\n        });\n    });\n\n    it(\"Handles comments on export declarations\", () => {\n        const project = convert(\"exportComments\");\n        const abc = query(project, \"abc\");\n        equal(abc.kind, ReflectionKind.Variable);\n        equal(Comment.combineDisplayParts(abc.comment?.summary), \"abc\");\n\n        const abcRef = query(project, \"abcRef\");\n        equal(abcRef.kind, ReflectionKind.Reference);\n        equal(\n            Comment.combineDisplayParts(abcRef.comment?.summary),\n            \"export abc\",\n        );\n\n        const foo = query(project, \"foo\");\n        equal(Comment.combineDisplayParts(foo.comment?.summary), \"export foo\");\n    });\n\n    it(\"Handles user defined external symbol links\", () => {\n        app.options.setValue(\"externalSymbolLinkMappings\", {\n            global: {\n                Promise: \"/promise\",\n            },\n            typescript: {\n                Promise: \"/promise2\",\n            },\n            \"@types/markdown-it\": {\n                \"MarkdownIt.Token\": \"https://markdown-it.github.io/markdown-it/#Token\",\n                \"*\": \"https://markdown-it.github.io/markdown-it/\",\n            },\n        });\n        const project = convert(\"externalSymbols\");\n        const p = query(project, \"P\");\n        equal(p.comment?.summary[1], {\n            kind: \"inline-tag\",\n            tag: \"@link\",\n            target: \"/promise\",\n            text: \"!Promise\",\n        });\n\n        equal(p.type?.type, \"reference\" as const);\n        equal(p.type.externalUrl, \"/promise2\");\n\n        const m = query(project, \"T\");\n        equal(m.type?.type, \"reference\" as const);\n        equal(\n            m.type.externalUrl,\n            \"https://markdown-it.github.io/markdown-it/#Token\",\n        );\n\n        const s = query(project, \"Pr\");\n        equal(s.type?.type, \"reference\" as const);\n        equal(s.type.externalUrl, \"https://markdown-it.github.io/markdown-it/\");\n    });\n\n    it(\"Handles @group tag\", () => {\n        const project = convert(\"groupTag\");\n        const A = query(project, \"A\");\n        const B = query(project, \"B\");\n        const C = query(project, \"C\");\n        const D = query(project, \"D\");\n\n        equal(\n            project.groups?.map((g) => g.title),\n            [\"Variables\", \"A\", \"B\", \"With Spaces\"],\n        );\n\n        equal(\n            project.groups.map((g) => Comment.combineDisplayParts(g.description)),\n            [\"Variables desc\", \"A description\", \"\", \"With spaces desc\"],\n        );\n\n        equal(\n            project.groups.map((g) => g.children),\n            [[D], [A, B], [B], [C]],\n        );\n    });\n\n    it(\"Inherits @group tag if comment is not redefined\", () => {\n        const project = convert(\"groupInheritance\");\n        const cls = query(project, \"Cls\");\n        equal(\n            cls.groups?.map((g) => g.title),\n            [\"Constructors\", \"Group\"],\n        );\n        equal(\n            cls.groups.map((g) => g.children),\n            [[query(project, \"Cls.constructor\")], [query(project, \"Cls.prop\")]],\n        );\n    });\n\n    it(\"Inherits @category tag if comment is not redefined\", () => {\n        app.options.setValue(\"categorizeByGroup\", false);\n        const project = convert(\"categoryInheritance\");\n        const cls = query(project, \"Cls\");\n        equal(\n            cls.categories?.map((g) => g.title),\n            [\"Cat\", \"Other\"],\n        );\n        equal(\n            cls.categories.map((g) => Comment.combineDisplayParts(g.description)),\n            [\"Cat desc\", \"\"],\n        );\n        equal(\n            cls.categories.map((g) => g.children),\n            [[query(project, \"Cls.prop\")], [query(project, \"Cls.constructor\")]],\n        );\n    });\n\n    it(\"Handles hidden accessors\", () => {\n        const project = convert(\"hiddenAccessor\");\n        const test = query(project, \"Test\");\n        equal(\n            test.children?.map((c) => c.name),\n            [\"constructor\", \"auto\", \"x\", \"y\"],\n        );\n    });\n\n    it(\"Handles @hideconstructor\", () => {\n        const project = convert(\"hideconstructor\");\n\n        ok(!project.getChildByName(\"StaticOnly.constructor\"));\n        ok(!!project.getChildByName(\"StaticOnly.notHidden\"));\n        ok(!project.getChildByName(\"IgnoredCtor.constructor\"));\n    });\n\n    it(\"Handles simple @inheritDoc cases\", () => {\n        const project = convert(\"inheritDocBasic\");\n        const target = query(project, \"InterfaceTarget\");\n        const comment = new Comment(\n            [{ kind: \"text\", text: \"Summary\" }],\n            [new CommentTag(\"@remarks\", [{ kind: \"text\", text: \"Remarks\" }])],\n        );\n        equal(target.comment, comment);\n\n        equal(\n            Comment.combineDisplayParts(\n                target.typeParameters?.[0].comment?.summary,\n            ),\n            \"Type parameter\",\n        );\n\n        const prop = query(project, \"InterfaceTarget.property\");\n        equal(\n            Comment.combineDisplayParts(prop.comment?.summary),\n            \"Property description\",\n        );\n\n        const meth = query(project, \"InterfaceTarget.someMethod\");\n        const example = new CommentTag(\"@example\", [\n            { kind: \"code\", text: \"```ts\\nsomeMethod(123)\\n```\" },\n        ]);\n        example.name = `This should still be present`;\n\n        const methodComment = new Comment(\n            [{ kind: \"text\", text: \"Method description\" }],\n            [example],\n        );\n        equal(meth.signatures?.[0].comment, methodComment);\n    });\n\n    it(\"Handles more complicated @inheritDoc cases\", () => {\n        const project = convert(\"inheritDocJsdoc\");\n        const fooComment = query(project, \"Foo\").comment;\n        const fooMemberComment = query(project, \"Foo.member\").signatures?.[0]\n            .comment;\n        const xComment = query(project, \"Foo.member\").signatures?.[0]\n            .parameters?.[0].comment;\n\n        ok(fooComment, \"Foo\");\n        ok(fooMemberComment, \"Foo.member\");\n        ok(xComment, \"Foo.member.x\");\n\n        for (const name of [\"Bar\", \"Baz\"]) {\n            equal(query(project, name).comment, fooComment, name);\n        }\n\n        for (const name of [\"Bar.member\", \"Baz.member\"]) {\n            const refl = query(project, name);\n            equal(refl.signatures?.length, 1, name);\n\n            equal(\n                refl.signatures[0].comment,\n                fooMemberComment,\n                `${name} signature`,\n            );\n            equal(\n                refl.signatures[0].parameters?.[0].comment,\n                xComment,\n                `${name} parameter`,\n            );\n        }\n    });\n\n    it(\"Handles recursive @inheritDoc requests\", () => {\n        const project = convert(\"inheritDocRecursive\");\n        const a = query(project, \"A\");\n        equal(a.comment?.getTag(\"@inheritDoc\")?.name, \"B\");\n\n        const b = query(project, \"B\");\n        equal(b.comment?.getTag(\"@inheritDoc\")?.name, \"C\");\n\n        const c = query(project, \"C\");\n        equal(c.comment?.getTag(\"@inheritDoc\")?.name, \"A\");\n\n        logger.expectMessage(\n            \"warn: @inheritDoc specifies a circular inheritance chain: B -> C -> A -> B\",\n        );\n    });\n\n    it(\"Handles @inheritDoc on signatures\", () => {\n        const project = convert(\"inheritDocSignature\");\n        const test1 = query(project, \"SigRef.test1\");\n        equal(test1.signatures?.length, 2);\n        equal(\n            Comment.combineDisplayParts(test1.signatures[0].comment?.summary),\n            \"A\",\n        );\n        equal(\n            Comment.combineDisplayParts(test1.signatures[1].comment?.summary),\n            \"B\",\n        );\n\n        const test2 = query(project, \"SigRef.test2\");\n        equal(\n            Comment.combineDisplayParts(test2.signatures?.[0].comment?.summary),\n            \"C\",\n        );\n    });\n\n    it(\"Handles @inheritDocs which produce warnings\", () => {\n        const project = convert(\"inheritDocWarnings\");\n        const target1 = query(project, \"target1\");\n        equal(Comment.combineDisplayParts(target1.comment?.summary), \"Source\");\n        equal(\n            Comment.combineDisplayParts(\n                target1.comment?.getTag(\"@remarks\")?.content,\n            ),\n            \"Remarks\",\n        );\n        logger.expectMessage(\n            \"warn: Content in the summary section will be overwritten by the @inheritDoc tag in comment at ./src/test/converter2/behavior/inheritDocWarnings.ts:10\",\n        );\n\n        const target2 = query(project, \"target2\");\n        equal(Comment.combineDisplayParts(target2.comment?.summary), \"Source\");\n        equal(\n            Comment.combineDisplayParts(\n                target2.comment?.getTag(\"@remarks\")?.content,\n            ),\n            \"Remarks\",\n        );\n        logger.expectMessage(\n            \"warn: Content in the @remarks block will be overwritten by the @inheritDoc tag in comment at ./src/test/converter2/behavior/inheritDocWarnings.ts:16\",\n        );\n\n        const target3 = query(project, \"target3\");\n        ok(target3.comment?.getTag(\"@inheritDoc\"));\n        logger.expectMessage(\n            'warn: Failed to find \"doesNotExist\" to inherit the comment from in the comment for target3',\n        );\n\n        const target4 = query(project, \"target4\");\n        ok(target4.comment?.getTag(\"@inheritDoc\"));\n        logger.expectMessage(\n            \"warn: target4 tried to copy a comment from source2 with @inheritDoc, but the source has no associated comment\",\n        );\n\n        logger.expectMessage(\n            \"warn: Declaration reference in @inheritDoc for badParse was not fully parsed and may resolve incorrectly\",\n        );\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles line comments\", () => {\n        app.options.setValue(\"commentStyle\", CommentStyle.Line);\n        const project = convert(\"lineComment\");\n        const a = query(project, \"a\");\n        const b = query(project, \"b\");\n        const c = query(project, \"c\");\n\n        equal(Comment.combineDisplayParts(a.comment?.summary), \"docs\");\n        equal(\n            Comment.combineDisplayParts(b.comment?.summary),\n            \"docs\\nwith multiple lines\",\n        );\n        equal(Comment.combineDisplayParts(c.comment?.summary), \"\");\n    });\n\n    it(\"Handles declaration reference link resolution\", () => {\n        app.options.setValue(\"sort\", [\"source-order\"]);\n        app.options.setValue(\"useTsLinkResolution\", false);\n        const project = convert(\"linkResolution\");\n        for (\n            const [refl, target] of [\n                [\"Scoping.abc\", \"Scoping.abc\"],\n                [\"Scoping.Foo\", \"Scoping.Foo.abc\"],\n                [\"Scoping.Foo.abc\", \"Scoping.Foo.abc\"],\n                [\"Scoping.Bar\", \"Scoping.abc\"],\n                [\"Scoping.Bar.abc\", \"Scoping.abc\"],\n            ] as const\n        ) {\n            equal(\n                getLinks(query(project, refl)).map((x) => x[1]),\n                [query(project, target).getFullName()],\n            );\n        }\n\n        const links = getLinks(query(project, \"Meanings\"));\n        equal(links, [\n            [ReflectionKind.Enum, \"Meanings.A\"],\n            [ReflectionKind.Namespace, \"Meanings.A\"],\n            [ReflectionKind.Enum, \"Meanings.A\"],\n\n            [undefined],\n            [ReflectionKind.Class, \"Meanings.B\"],\n\n            [ReflectionKind.Interface, \"Meanings.C\"],\n            [ReflectionKind.TypeAlias, \"Meanings.D\"],\n            [\"Meanings.E.E\", 0],\n            [ReflectionKind.Variable, \"Meanings.F\"],\n\n            [\"Meanings.B.constructor.B\", 0],\n            [\"Meanings.B.constructor.B\", 0],\n            [\"Meanings.B.constructor.B\", 1],\n\n            [ReflectionKind.EnumMember, \"Meanings.A.A\"],\n            [undefined],\n\n            [\"Meanings.E.E\", 0],\n            [\"Meanings.E.E\", 1],\n\n            [\"Meanings.B.constructor.B\", 0],\n            [\"Meanings.B.constructor.B\", 1],\n\n            [\"Meanings.B.__index\", undefined],\n            [ReflectionKind.Interface, \"Meanings.G\"],\n\n            [\"Meanings.E.E\", 1],\n            [ReflectionKind.Class, \"Meanings.B\"],\n        ]);\n\n        equal(getLinks(query(project, \"URLS\")), [\n            \"https://example.com\",\n            \"ftp://example.com\",\n        ]);\n\n        equal(\n            getLinks(query(project, \"Globals.A\")).map((x) => x[1]),\n            [\"URLS\", \"A\", \"Globals.A\"],\n        );\n\n        equal(getLinks(query(project, \"Navigation\")), [\n            [ReflectionKind.Method, \"Navigation.Child.foo\"],\n            [ReflectionKind.Property, \"Navigation.Child.foo\"],\n            [undefined],\n        ]);\n\n        const foo = query(project, \"Navigation.Child.foo\").signatures![0];\n        equal(getLinks(foo), [[ReflectionKind.Method, \"Navigation.Child.foo\"]]);\n    });\n\n    it(\"Handles TypeScript based link resolution\", () => {\n        app.options.setValue(\"sort\", [\"source-order\"]);\n        const project = convert(\"linkResolutionTs\");\n        for (\n            const [refl, target] of [\n                [\"Scoping.abc\", \"Scoping.abc\"],\n                [\"Scoping.Foo\", \"Scoping.Foo.abc\"],\n                [\"Scoping.Foo.abc\", \"Scoping.Foo.abc\"],\n                [\"Scoping.Bar\", \"Scoping.abc\"],\n                [\"Scoping.Bar.abc\", \"Scoping.abc\"],\n            ] as const\n        ) {\n            equal(\n                getLinks(query(project, refl)).map((x) => x[1]),\n                [query(project, target).getFullName()],\n            );\n        }\n\n        const links = getLinks(query(project, \"Meanings\"));\n        equal(links, [\n            [ReflectionKind.Namespace, \"Meanings\"],\n            [ReflectionKind.Namespace, \"Meanings\"],\n            [ReflectionKind.Namespace, \"Meanings\"],\n\n            [ReflectionKind.Enum, \"Meanings.A\"],\n            [ReflectionKind.Class, \"Meanings.B\"],\n\n            [ReflectionKind.Interface, \"Meanings.C\"],\n            [ReflectionKind.TypeAlias, \"Meanings.D\"],\n            [ReflectionKind.Function, \"Meanings.E\"],\n            [ReflectionKind.Variable, \"Meanings.F\"],\n\n            [ReflectionKind.Class, \"Meanings.B\"],\n            [ReflectionKind.Class, \"Meanings.B\"],\n            [ReflectionKind.Class, \"Meanings.B\"],\n\n            [ReflectionKind.EnumMember, \"Meanings.A.A\"],\n            [ReflectionKind.Property, \"Meanings.B.prop\"],\n\n            [ReflectionKind.Function, \"Meanings.E\"],\n            [ReflectionKind.Function, \"Meanings.E\"],\n\n            [ReflectionKind.Class, \"Meanings.B\"],\n            [ReflectionKind.Class, \"Meanings.B\"],\n\n            [ReflectionKind.Class, \"Meanings.B\"],\n            [ReflectionKind.Interface, \"Meanings.G\"],\n\n            [ReflectionKind.Function, \"Meanings.E\"],\n            [ReflectionKind.Class, \"Meanings.B\"],\n        ]);\n\n        equal(getLinks(query(project, \"URLS\")), [\n            \"https://example.com\",\n            \"ftp://example.com\",\n        ]);\n\n        equal(\n            getLinks(query(project, \"Globals.A\")).map((x) => x[1]),\n            [\"URLS\", \"A\", \"Globals.A\"],\n        );\n\n        equal(getLinks(query(project, \"Navigation\")), [\n            [ReflectionKind.Namespace, \"Navigation\"],\n            [ReflectionKind.Property, \"Navigation.Child.foo\"],\n            [ReflectionKind.Class, \"Navigation.Child\"],\n        ]);\n\n        const foo = query(project, \"Navigation.Child.foo\").signatures![0];\n        equal(getLinks(foo), [[ReflectionKind.Method, \"Navigation.Child.foo\"]]);\n\n        const localSymbolRef = query(project, \"localSymbolRef\");\n\n        equal(getLinks(localSymbolRef), [\n            [ReflectionKind.Variable, \"A\"],\n            [ReflectionKind.Variable, \"A\"],\n            [ReflectionKind.Variable, \"A\"],\n        ]);\n        equal(getLinkTexts(localSymbolRef), [\"A!\", \"A2!\", \"AnotherName\"]);\n\n        equal(getLinks(query(project, \"scoped\")), [\n            [ReflectionKind.Property, \"Meanings.B.prop\"],\n        ]);\n        equal(getLinkTexts(query(project, \"scoped\")), [\"p\"]);\n    });\n\n    it(\"Handles links to deeply nested members\", () => {\n        const project = convert(\"linkResolution\");\n        // We detect a link to this deep property, but will warn about it actually linking\n        // to GH2808DeeplyNestedLink.prop when rendering.\n        equal(getLinks(query(project, \"GH2808DeeplyNestedLink\")), [\n            [\n                ReflectionKind.Property,\n                \"GH2808DeeplyNestedLink.prop.__type.nested.__type.here\",\n            ],\n        ]);\n    });\n\n    it(\"Handles links which do not resolve correctly\", () => {\n        const project = convert(\"linkResolutionErrors\");\n        app.options.setValue(\"validation\", {\n            invalidLink: true,\n            notDocumented: false,\n            notExported: false,\n        });\n\n        app.validate(project);\n        logger.expectMessage(\n            'warn: The comment for abc links to \"Map.size\" which was resolved but is not included in the documentation. To fix this warning export it or add { \"typescript\": { \"Map.size\": \"#\" }} to the externalSymbolLinkMappings option',\n        );\n        logger.expectMessage(\n            'warn: Failed to resolve link to \"DoesNotExist\" in comment for abc',\n        );\n        logger.expectMessage(\n            'warn: Failed to resolve link to \"@typedoc/foo.DoesNotExist\" in comment for abc. You may have wanted \"@typedoc/foo!DoesNotExist\"',\n        );\n    });\n\n    it(\"Handles merged declarations\", () => {\n        const project = convert(\"mergedDeclarations\");\n        const a = query(project, \"SingleCommentMultiDeclaration\");\n        equal(\n            Comment.combineDisplayParts(a.comment?.summary),\n            \"Comment on second declaration\",\n        );\n\n        const b = query(project, \"MultiCommentMultiDeclaration\");\n        equal(Comment.combineDisplayParts(b.comment?.summary), \"Comment 1\");\n\n        logger.expectMessage(\n            \"warn: MultiCommentMultiDeclaration has multiple declarations with a comment. An arbitrary comment will be used\",\n        );\n        logger.expectMessage(\n            \"info: The comments for MultiCommentMultiDeclaration are declared at*\",\n        );\n    });\n\n    it(\"Handles named tuple declarations\", () => {\n        const project = convert(\"namedTupleMembers\");\n\n        equal(\n            query(project, \"PartiallyNamedTuple\").type?.toString(),\n            \"[name: string, number]\",\n        );\n        equal(\n            query(project, \"PartiallyNamedTuple2\").type?.toString(),\n            \"[name?: string, number?]\",\n        );\n        equal(\n            query(project, \"PartiallyNamedTupleRest\").type?.toString(),\n            \"[name?: string, ...number[]]\",\n        );\n        equal(\n            query(project, \"partiallyNamedTupleRest\").type?.toString(),\n            \"[name?: string, ...number[]]\",\n        );\n    });\n\n    it(\"Handles overloads\", () => {\n        const project = convert(\"overloads\");\n        const foo = query(project, \"foo\");\n        const fooComments = foo.signatures?.map((sig) => Comment.combineDisplayParts(sig.comment?.summary));\n        equal(fooComments, [\"No arg comment\\n\", \"No arg comment\\n\"]);\n        equal(foo.comment, undefined);\n\n        equal(\n            foo.signatures?.map((s) => s.comment?.label),\n            [\"NO_ARGS\", \"WITH_X\"],\n        );\n\n        const bar = query(project, \"bar\");\n        const barComments = bar.signatures?.map((sig) => Comment.combineDisplayParts(sig.comment?.summary));\n        equal(barComments, [\"\", \"Custom comment\"]);\n        equal(\n            Comment.combineDisplayParts(bar.comment?.summary),\n            \"Implementation comment\",\n        );\n\n        logger.expectMessage(\n            'warn: The label \"bad\" for badLabel cannot be referenced with a declaration reference. Labels may only contain A-Z, 0-9, and _, and may not start with a number',\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles @overload tags\", () => {\n        const project = convert(\"overloadTags\");\n        const printValue = query(project, \"printValue\");\n        equal(printValue.signatures?.length, 2);\n\n        const [first, second] = printValue.signatures;\n\n        equal(first.parameters?.length, 1);\n        equal(\n            Comment.combineDisplayParts(first.parameters[0].comment?.summary),\n            \"first docs\",\n        );\n\n        equal(second.parameters?.length, 2);\n        equal(\n            Comment.combineDisplayParts(second.parameters[0].comment?.summary),\n            \"second docs\",\n        );\n    });\n\n    it(\"Handles @readonly tag\", () => {\n        const project = convert(\"readonlyTag\");\n        const title = query(project, \"Book.title\");\n        const author = query(project, \"Book.author\");\n\n        ok(!title.setSignature);\n        ok(author.flags.isReadonly);\n    });\n\n    it(\"Removes all children of a reflection when the reflection is removed.\", () => {\n        const project = convert(\"removeReflection\");\n        project.removeReflection(query(project, \"foo\"));\n        project.removeReflection(query(project, \"nested\"));\n        equal(\n            Object.values(project.reflections).map((r) => r.name),\n            [\"typedoc\", \"Base\", \"NotHidden\", \"NotHiddenImpl\", \"constructor\", \"NotHiddenImpl\"],\n        );\n    });\n\n    it(\"Removes heritage clause references to hidden classes.\", () => {\n        const project = convert(\"removeReflection\");\n        const Base = query(project, \"Base\");\n        equal(Base.extendedBy, undefined);\n        equal(Base.implementedBy, undefined);\n\n        const NotHidden = query(project, \"NotHidden\");\n        equal(NotHidden.extendedTypes, undefined);\n        equal(NotHidden.implementedTypes, undefined);\n\n        const NotHiddenImpl = query(project, \"NotHiddenImpl\");\n        equal(NotHiddenImpl.extendedTypes, undefined);\n        equal(NotHiddenImpl.implementedTypes, undefined);\n    });\n\n    it(\"Handles @see tags\", () => {\n        const project = convert(\"seeTags\");\n        const foo = query(project, \"foo\");\n        equal(\n            Comment.combineDisplayParts(foo.comment?.getTag(\"@see\")?.content),\n            \" - Double tag\\n - Second tag\\n\",\n        );\n\n        const bar = query(project, \"bar\");\n        equal(\n            Comment.combineDisplayParts(bar.comment?.getTag(\"@see\")?.content),\n            \"Single tag\",\n        );\n    });\n\n    it(\"Handles type aliases marked with @interface\", () => {\n        const project = convert(\"typeAliasInterface\");\n        const bar = query(project, \"Bar\");\n        equal(bar.kind, ReflectionKind.Interface);\n        equal(\n            bar.children?.map((c) => c.name),\n            [\"a\", \"b\"],\n        );\n\n        const comments = [bar, bar.children[0], bar.children[1]].map((r) =>\n            Comment.combineDisplayParts(r.comment?.summary)\n        );\n\n        equal(comments, [\"Bar docs\", \"Bar.a docs\", \"Foo.b docs\"]);\n    });\n\n    it(\"Allows specifying group sort order #2251\", () => {\n        app.options.setValue(\"groupOrder\", [\"B\", \"Variables\", \"A\"]);\n        const project = convert(\"groupTag\");\n        equal(\n            project.groups?.map((g) => g.title),\n            [\"B\", \"Variables\", \"A\", \"With Spaces\"],\n        );\n    });\n\n    it(\"Supports disabling sorting of entry points #2393\", () => {\n        app.options.setValue(\"sort\", [\"alphabetical\"]);\n        const project = convert(\"blockComment\", \"asConstEnum\");\n        equal(\n            project.children?.map((c) => c.name),\n            [\"asConstEnum\", \"blockComment\"],\n        );\n\n        app.options.setValue(\"sortEntryPoints\", false);\n        const project2 = convert(\"blockComment\", \"asConstEnum\");\n        equal(\n            project2.children?.map((c) => c.name),\n            [\"blockComment\", \"asConstEnum\"],\n        );\n    });\n\n    it(\"Respects resolution-mode when resolving types\", () => {\n        app.options.setValue(\"excludeExternals\", false);\n        const MergedType = query(convert(\"resolutionMode\"), \"MergedType\");\n        equal(\n            MergedType.children?.map((child) => child.name),\n            [\"cjs\", \"esm\"],\n        );\n    });\n\n    it(\"Special cases some `this` type occurrences\", () => {\n        const project = convert(\"thisType\");\n        equal(query(project, \"ThisClass.prop\").type?.toString(), \"ThisClass\"); // Not special cased\n        equal(\n            querySig(project, \"ThisClass.returnThisImplicit\").type?.toString(),\n            \"ThisClass\",\n        ); // Not special cased\n\n        equal(\n            querySig(project, \"ThisClass.returnThis\").type?.toString(),\n            \"this\",\n        );\n        equal(\n            querySig(\n                project,\n                \"ThisClass.paramThis\",\n            ).parameters?.[0].type?.toString(),\n            \"this\",\n        );\n    });\n\n    it(\"Handles renaming of destructured parameters via @param tag name inference\", () => {\n        const project = convert(\"destructuredParamRenames\");\n\n        const params = (name: string) => querySig(project, name).parameters?.map((p) => p.name);\n\n        equal(params(\"singleParam\"), [\"params\"]);\n\n        equal(params(\"extraParam\"), [\"params\", \"extraParameter\"]);\n\n        equal(params(\"extraParamComment\"), [\"params\"]);\n\n        equal(params(\"multiParam\"), [\"params\", \"params2\", \"__namedParameters\"]);\n\n        logger.expectMessage(\n            'warn: The signature extraParamComment has an @param with name \"fakeParameter\", which was not used',\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should not warn about recursive types\", () => {\n        const project = convert(\"refusingToRecurse\");\n        const schemaTypeBased = query(project, \"schemaTypeBased\");\n        equal(\n            schemaTypeBased.type?.toString(),\n            \"{} & { x: ({ y?: string } & { z: string })[] }\",\n        );\n        equal(\n            querySig(project, \"Map.getFilter\").type?.toString(),\n            \"void | ExpressionSpecification\",\n        );\n\n        logger.expectNoMessage(\"debug: Refusing to recurse*\");\n    });\n\n    it(\"Handles NoInfer intrinsic type\", () => {\n        const project = convert(\"noInfer\");\n        const sig = querySig(project, \"createStreetLight\");\n        equal(sig.parameters?.length, 2);\n        equal(sig.parameters[0].type?.toString(), \"C[]\");\n        equal(sig.parameters[1].type?.toString(), \"NoInfer<C>\");\n    });\n\n    it(\"Handles inferred predicate functions from TS 5.5\", () => {\n        const project = convert(\"inferredPredicates\");\n        const sig = querySig(project, \"isNumber\");\n        equal(sig.type?.toString(), \"x is number\");\n        const sig2 = querySig(project, \"isNonNullish\");\n        equal(sig2.type?.toString(), \"x is NonNullable<T>\");\n    });\n\n    it(\"Cascades specified modifier tags to child reflections, #2056\", () => {\n        const project = convert(\"cascadedModifiers\");\n\n        const mods = (s: string) => query(project, s).comment?.modifierTags;\n        const sigMods = (s: string) => querySig(project, s).comment?.modifierTags;\n\n        equal(mods(\"BetaStuff\"), new Set([\"@beta\"]));\n        equal(mods(\"BetaStuff.AlsoBeta\"), new Set([\"@beta\"]));\n        equal(mods(\"BetaStuff.AlsoBeta.betaFish\"), new Set());\n        equal(mods(\"BetaStuff.AlsoBeta.alphaFish\"), new Set());\n\n        equal(sigMods(\"BetaStuff.AlsoBeta.betaFish\"), new Set([\"@beta\"]));\n        equal(sigMods(\"BetaStuff.AlsoBeta.alphaFish\"), new Set([\"@alpha\"]));\n\n        logger.expectMessage(\n            \"warn: The modifier tag @alpha is mutually exclusive with @beta in the comment for mutuallyExclusive\",\n        );\n    });\n\n    it(\"Handles the @inline tag on type nodes\", () => {\n        const project = convert(\"inlineTag\");\n\n        const foo = querySig(project, \"foo\");\n        equal(\n            foo.parameters?.map((p) => p.type?.toString()),\n            [\"{ inlined: true }\"],\n        );\n        equal(foo.type?.toString(), \"{ imag: number; real: number }\");\n\n        const genericInline = querySig(project, \"genericInline\");\n        equal(genericInline.type?.toString(), \"{ imag: T; real: T }\");\n\n        const bar = querySig(project, \"bar\");\n        equal(\n            bar.parameters?.map((p) => p.type?.toString()),\n            [\"Record<string, { inlined: true }>\"],\n        );\n    });\n\n    it(\"Handles the @inline tag on types\", () => {\n        const project = convert(\"inlineTag\");\n\n        const foo = querySig(project, \"Class.foo\");\n        equal(\n            foo.parameters?.map((p) => p.type?.toString()),\n            [\"{ inlined: true }\"],\n        );\n        equal(foo.type?.toString(), \"{ imag: number; real: number }\");\n\n        const bar = querySig(project, \"Class.bar\");\n        equal(\n            bar.parameters?.map((p) => p.type?.toString()),\n            [\"Record<string, { inlined: true }>\"],\n        );\n    });\n\n    it(\"Handles the @preventInline tag preventing @inline from taking effect\", () => {\n        const project = convert(\"inlineTag\");\n\n        const bar2 = querySig(project, \"bar2\");\n        equal(\n            bar2.parameters?.map((p) => p.type?.toString()),\n            [\"Record<string, Foo>\"],\n        );\n\n        const baz = querySig(project, \"Class.baz\");\n        equal(\n            baz.parameters?.map((p) => p.type?.toString()),\n            [\"Foo\"],\n        );\n        equal(baz.type?.toString(), \"Complex<number>\");\n    });\n\n    it(\"Handles the @inlineType tag to inline a requested type\", () => {\n        const project = convert(\"inlineTag\");\n\n        const selectiveInline = querySig(project, \"selectiveInline\");\n        equal(\n            selectiveInline.parameters?.map((p) => p.type?.toString()),\n            [\"{ inlined: false }\"],\n        );\n    });\n\n    it(\"Handles the @useDeclaredType tag on types\", () => {\n        const project = convert(\"useDeclaredTypeTag\");\n        const data = query(project, \"Data\");\n        equal(data.type?.toString(), \"{ abc: number }[]\");\n    });\n\n    it(\"Handles highlighted properties on parameter references - type alias\", () => {\n        const project = convert(\"highlightedProperties\");\n\n        // Exported case\n        const fn1 = querySig(project, \"fn1\");\n        equal(fn1.parameters?.length, 1);\n\n        const param = fn1.parameters[0];\n        equal(param.type?.type, \"reference\");\n        equal(param.type.highlightedProperties?.size, 1);\n        equal(\n            Comment.combineDisplayParts(\n                param.type.highlightedProperties.get(\"a\"),\n            ),\n            \"Highlighted prop\",\n        );\n\n        logger.expectMessage(\n            'warn: The signature fn1 has an @param with name \"options.c\", which was not used',\n        );\n\n        // Not exported case\n        const fn2 = querySig(project, \"fn2\");\n        equal(fn2.parameters?.length, 1);\n\n        const param2 = fn2.parameters[0];\n        equal(param2.type?.type, \"reference\");\n        equal(param2.type.highlightedProperties?.size, 2);\n        equal(\n            Comment.combineDisplayParts(\n                param2.type.highlightedProperties.get(\"a\"),\n            ),\n            \"Highlighted prop\",\n        );\n        equal(\n            Comment.combineDisplayParts(\n                param2.type.highlightedProperties.get(\"c\"),\n            ),\n            \"does not exist\",\n        );\n\n        // Interface case\n        const fn3 = querySig(project, \"fn3\");\n        equal(fn3.parameters?.length, 1);\n\n        const param3 = fn3.parameters[0];\n        equal(param3.type?.type, \"reference\");\n        equal(param3.type.highlightedProperties?.size, 1);\n        equal(\n            Comment.combineDisplayParts(\n                param2.type.highlightedProperties.get(\"a\"),\n            ),\n            \"Highlighted prop\",\n        );\n\n        logger.expectMessage(\n            'warn: The signature fn3 has an @param with name \"options.c\", which was not used',\n        );\n    });\n\n    it(\"@includeCode handles regions\", () => {\n        const project = convert(\"includeTag/includeTag\");\n        const code = getComment(project, \"region\");\n        equal(code, \"\\n\\n```ts\\nexport const a = 123;\\n```\");\n    });\n\n    it(\"@includeCode handles line numbers\", () => {\n        const project = convert(\"includeTag/includeTag\");\n        const code = getComment(project, \"line\");\n        equal(code, \"\\n\\n```ts\\nexport const a = 123;\\n```\");\n    });\n\n    it(\"@includeCode strips indentation of included block\", () => {\n        const project = convert(\"includeTag/includeTagDedent\");\n        const comment = getSigComment(project, \"buildString\");\n        equal(\n            comment,\n            '\\n\\n```ts\\nequal(buildString(3), \"123\");\\nequal(buildString(7), \"1234567\");\\n```',\n        );\n    });\n\n    it(\"@includeCode supports including multiple regions\", () => {\n        const project = convert(\"includeTag/includeTagMultipleRegions\");\n        const comment = getSigComment(project, \"buildString\");\n        equal(\n            comment,\n            '\\n\\n```ts\\nequal(buildString(3), \"123\");\\nequal(buildString(7), \"1234567\");\\n```',\n        );\n    });\n\n    it(\"@include handles line numbers\", () => {\n        const project = convert(\"includeTag/includeTag\");\n        const code = getComment(project, \"lineText\");\n        equal(code, \"Line 3\");\n    });\n\n    it(\"@include handles full files\", () => {\n        const project = convert(\"includeTag/includeTag\");\n        const code = getComment(project, \"fullFile\");\n        equal(code, \"Unknown extension doesn't support regions\");\n    });\n\n    it(\"@include works within documents\", () => {\n        const project = convert(\"includeTag/includeTag\");\n        const doc = project.getChildByName([\"includeInDoc\"]);\n        ok(doc?.isDocument());\n        equal(\n            Comment.combineDisplayParts(doc.content),\n            \"\\n\\n```md\\n{@includeCode includeInDoc.md}\\n```\",\n        );\n    });\n\n    it(\"@includeCode warns about missing regions\", () => {\n        convert(\"includeTag/missingRegion\");\n\n        logger.expectMessage(\n            \"error: @includeCode *noRegion* the region was not found in the file.\",\n        );\n\n        logger.expectMessage(\n            \"error: @includeCode *missingStart* the region opening comment was not found in the file.\",\n        );\n\n        logger.expectMessage(\n            \"error: @includeCode *missingEnd* the region closing comment was not found in the file.\",\n        );\n    });\n\n    it(\"@includeCode warns about duplicate regions\", () => {\n        convert(\"includeTag/duplicateRegion\");\n\n        logger.expectMessage(\n            \"error: @includeCode *dupStart* the region opening comment was found multiple times in the file.\",\n        );\n\n        logger.expectMessage(\n            \"error: @includeCode *dupEnd* the region closing comment was found multiple times in the file.\",\n        );\n\n        logger.expectMessage(\n            \"error: @includeCode *#dup* the region was found multiple times in the file.\",\n        );\n    });\n\n    it(\"@includeCode warns about invalid line ranges\", () => {\n        convert(\"includeTag/invalidLineRanges\");\n\n        logger.expectMessage(\n            'error: @includeCode *:100-200\" * the file only has*',\n        );\n\n        logger.expectMessage(\n            'error: @includeCode *:200-100\" * an invalid range was specified.',\n        );\n\n        logger.expectMessage('error: @includeCode *:300\" * the file only has*');\n    });\n\n    it(\"@includeCode warns about empty region\", () => {\n        convert(\"includeTag/emptyRegion\");\n\n        logger.expectMessage(\"warn: @includeCode *found but it is empty*\");\n    });\n\n    it(\"@includeCode warns about unsupported region\", () => {\n        convert(\"includeTag/unsupportedExtension\");\n\n        logger.expectMessage(\n            \"error: @includeCode * regions are not supported for this file extension.\",\n        );\n    });\n\n    it(\"@includeCode warns about invalid file references\", () => {\n        convert(\"includeTag/invalidInclude\");\n\n        logger.expectMessage(\n            \"error: @includeCode *doesNotExist.txt* does not exist or is not a file.\",\n        );\n    });\n\n    it(\"@include warns about circular references\", () => {\n        convert(\"includeTag/circularInclude\");\n\n        logger.expectMessage(\n            \"error: @include *#circular* resulted in a circular include:*\",\n        );\n    });\n\n    it(\"#2875 discovers readme files directly adjacent to the package.json file\", () => {\n        const project = convert(\"asConstEnum\");\n        // Previously, would find TypeDoc's root readme\n        equal(project.readme, undefined);\n    });\n\n    it(\"Supports @document tags\", () => {\n        const project = convert(\"documents/docs\");\n\n        equal(reflToTree(project), {\n            hasDocs: \"Variable\",\n        });\n\n        equal(project.documents?.length, 1);\n\n        equal(project.documents[0].content, [\n            { kind: \"text\", text: \"Link to [project](\" },\n            { kind: \"relative-link\", target: 1, targetAnchor: undefined, text: \"./docs.ts\" },\n            { kind: \"text\", text: \")\" },\n        ]);\n\n        equal(project.readme, [\n            { kind: \"text\", text: \"Doc projects readme: [docs](\" },\n            { kind: \"relative-link\", target: 2, targetAnchor: undefined, text: \"./doc.md\" },\n            { kind: \"text\", text: \")\" },\n        ]);\n    });\n\n    it(\"Supports the @sortStrategy tag #2965\", () => {\n        const project = convert(\"sortStrategyTag\");\n\n        const getOrder = (name: string) => query(project, name).children?.map(c => c.name);\n\n        equal(getOrder(\"A\"), [\"b\", \"c\", \"a\"]);\n        equal(getOrder(\"B\"), [\"a\", \"b\", \"c\"]);\n        equal(getOrder(\"C\"), [\"b\", \"c\", \"a\"]);\n\n        const getGroupOrders = (name: string) =>\n            query(project, name).groups?.map(g => [g.title, g.children.map(c => c.name)]);\n\n        equal(getGroupOrders(\"A\"), [\n            [\"Variables\", [\"b\", \"a\"]],\n            [\"Functions\", [\"c\"]],\n        ]);\n\n        equal(getGroupOrders(\"B\"), [\n            [\"Variables\", [\"a\", \"b\"]],\n            [\"Functions\", [\"c\"]],\n        ]);\n\n        equal(getGroupOrders(\"C\"), [\n            [\"Variables\", [\"b\", \"c\"]],\n            [\"Functions\", [\"a\"]],\n        ]);\n\n        const getCategoryOrders = (name: string) =>\n            query(project, name).categories?.map(g => [g.title, g.children.map(c => c.name)]);\n\n        equal(getCategoryOrders(\"D\"), [\n            [\"Cat\", [\"b\", \"a\", \"c\"]],\n        ]);\n\n        logger.expectMessage(\n            `warn: Comment for E specifies @sortStrategy with \"invalid\", which is an invalid sort strategy*`,\n        );\n        logger.expectMessage(\n            `warn: Comment for E specifies @sortStrategy with \"invalid2\", which is an invalid sort strategy*`,\n        );\n    });\n\n    it(\"Handles different type parameter comments on class/constructor\", () => {\n        const project = convert(\"ctorTypeParam\");\n\n        const ctor = query(project, \"Generic.constructor\");\n        equal(ctor.signatures?.length, 2);\n\n        // @template on the class gets saved to class type parameters\n        equal(\n            Comment.combineDisplayParts(query(project, \"Generic\").typeParameters?.[0].comment?.summary),\n            \"class docs\",\n        );\n        // Custom @template tag for this constructor\n        equal(Comment.combineDisplayParts(ctor.signatures[0].typeParameters?.[0].comment?.summary), \"ctor docs\");\n        // Inherits description from class's @template\n        equal(Comment.combineDisplayParts(ctor.signatures[1].typeParameters?.[0].comment?.summary), \"class docs\");\n    });\n});\n"
  },
  {
    "path": "src/test/comments.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport ts from \"typescript\";\nimport type { CommentParserConfig } from \"../lib/converter/comments/index.js\";\n\nimport { lexBlockComment } from \"../lib/converter/comments/blockLexer.js\";\nimport { lexLineComments } from \"../lib/converter/comments/lineLexer.js\";\nimport { type Token, TokenSyntaxKind } from \"../lib/converter/comments/lexer.js\";\nimport { parseComment, parseCommentString } from \"../lib/converter/comments/parser.js\";\nimport { lexCommentString } from \"../lib/converter/comments/rawLexer.js\";\nimport { Comment, type CommentDisplayPart, CommentTag } from \"../lib/models/index.js\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { extractTagName } from \"../lib/converter/comments/tagName.js\";\nimport { type FileId, FileRegistry } from \"../lib/models/FileRegistry.js\";\nimport { dedent, MinimalSourceFile, type NormalizedPath } from \"#utils\";\n\nconst neverCalled = () => {\n    throw new Error(\"Should not be called\");\n};\n\ndescribe(\"Block Comment Lexer\", () => {\n    function lex(text: string): Token[] {\n        return Array.from(lexBlockComment(text));\n    }\n    function lexNoPos(text: string): Omit<Token, \"pos\">[] {\n        return Array.from(lexBlockComment(text), (t) => {\n            const { pos: _, ...noPos } = t;\n            return noPos;\n        });\n    }\n\n    it(\"Should handle an empty comment\", () => {\n        const tokens = lex(\"/**/\");\n        equal(tokens, []);\n\n        const tokens2 = lex(\"/***/\");\n        equal(tokens2, []);\n\n        const tokens3 = lex(\"/**  */\");\n        equal(tokens3, []);\n    });\n\n    it(\"Should handle a trivial comment\", () => {\n        const tokens = lex(\"/** Comment */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\", pos: 4 },\n        ]);\n    });\n\n    it(\"Should handle a multiline comment without stars\", () => {\n        const tokens = lex(\"/* Comment\\nNext line */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\", pos: 3 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 10 },\n            { kind: TokenSyntaxKind.Text, text: \"Next line\", pos: 11 },\n        ]);\n    });\n\n    it(\"Should handle a multiline comment with stars\", () => {\n        const tokens = lex(\"/*\\n * Comment\\n * Next line */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\", pos: 6 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 13 },\n            { kind: TokenSyntaxKind.Text, text: \"Next line\", pos: 17 },\n        ]);\n    });\n\n    it(\"Should handle an indented comment with stars\", () => {\n        const tokens = lex(`/**\n            * Text\n            */`);\n\n        equal(tokens, [{ kind: TokenSyntaxKind.Text, text: \"Text\", pos: 18 }]);\n    });\n\n    it(\"Should handle an indented comment without stars\", () => {\n        const tokens = lex(`/*\n            Text\n            */`);\n\n        equal(tokens, [{ kind: TokenSyntaxKind.Text, text: \"Text\", pos: 15 }]);\n    });\n\n    it(\"Should handle a list within a comment without stars\", () => {\n        const tokens = lex(\n            dedent(`\n            /*\n             Comment start\n              * This is a list item\n            */\n        `),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment start\", pos: 4 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 17 },\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \" * This is a list item\",\n                pos: 19,\n            },\n        ]);\n    });\n\n    it(\"Should handle higher detected indentation than the rest of the comment\", () => {\n        const tokens = lex(\n            dedent(`\n        /*\n             A\n        B\n            */\n        `),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"A\", pos: 8 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 9 },\n            { kind: TokenSyntaxKind.Text, text: \"B\", pos: 10 },\n        ]);\n    });\n\n    it(\"Should handle a comment with stars missing a space\", () => {\n        const tokens = lex(\n            dedent(`\n            /*\n             * A\n             *B\n             */\n            `),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"A\", pos: 6 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 7 },\n            { kind: TokenSyntaxKind.Text, text: \"B\", pos: 10 },\n        ]);\n    });\n\n    it(\"Should handle braces\", () => {\n        const tokens = lex(\"/* {} */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 3 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 4 },\n        ]);\n    });\n\n    it(\"Should handle escaping braces\", () => {\n        const tokens = lex(\"/* \\\\{\\\\} */\");\n\n        equal(tokens, [{ kind: TokenSyntaxKind.Text, text: \"{}\", pos: 3 }]);\n    });\n\n    it(\"Should allow escaping slashes\", () => {\n        const tokens = lex(\"/* Text *\\\\/ */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text */\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should allow escaping slashes in code blocks\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             * \\`\\`\\`ts\n             * /* inner block comment *\\\\/\n             * \\`\\`\\`\n             */\n            `),\n        );\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"```ts\\n/* inner block comment */\\n```\",\n                pos: 7,\n            },\n        ]);\n    });\n\n    it(\"Should pass through unknown escapes\", () => {\n        const tokens = lex(\"/* \\\\\\\\ \\\\n */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"\\\\\\\\ \\\\n\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should recognize tags\", () => {\n        const tokens = lex(\"/* @tag @a @abc234 @abc-234 */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@tag\", pos: 3 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 7 },\n            { kind: TokenSyntaxKind.Tag, text: \"@a\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 10 },\n            { kind: TokenSyntaxKind.Tag, text: \"@abc234\", pos: 11 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 18 },\n            { kind: TokenSyntaxKind.Tag, text: \"@abc-234\", pos: 19 },\n        ]);\n    });\n\n    it(\"Should not indiscriminately create tags\", () => {\n        const tokens = lex(\"/* @123 @@ @ */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"@123 @@ @\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should allow escaping @ to prevent a tag creation\", () => {\n        const tokens = lex(\"/* not a \\\\@tag */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"not a @tag\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should not mistake an email for a modifier tag\", () => {\n        const tokens = lex(\"/* test@example.com */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test@example.com\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should not mistake a scoped package for a tag\", () => {\n        const tokens = lex(\"/* @typescript-eslint/parser @jest/globals */\");\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"@typescript-eslint/parser @jest/globals\",\n                pos: 3,\n            },\n        ]);\n    });\n\n    it(\"Should allow escaping @ in an email\", () => {\n        const tokens = lex(\"/* test\\\\@example.com */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test@example.com\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should allow inline code\", () => {\n        const tokens = lex(\"/* test `code` after */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 3 },\n            { kind: TokenSyntaxKind.Code, text: \"`code`\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 14 },\n        ]);\n    });\n\n    it(\"Should allow inline code with multiple ticks\", () => {\n        const tokens = lex(\"/* test ```not ```` closed``` after */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 3 },\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"```not ```` closed```\",\n                pos: 8,\n            },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 29 },\n        ]);\n    });\n\n    it(\"Should allow escaping ticks\", () => {\n        const tokens = lex(\"/* test `\\\\`` after */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 3 },\n            { kind: TokenSyntaxKind.Code, text: \"`\\\\``\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 12 },\n        ]);\n    });\n\n    it(\"Should handle stars within code\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             * \\`\\`\\`ts\n             *   test()\n             * \\`\\`\\`\n             */`),\n        );\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"```ts\\n  test()\\n```\",\n                pos: 7,\n            },\n        ]);\n    });\n\n    it(\"Should indent code without stars\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n            \\`\\`\\`ts\n              test()\n            \\`\\`\\`\n            */`),\n        );\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"```ts\\n  test()\\n```\",\n                pos: 4,\n            },\n        ]);\n    });\n\n    it(\"Should treat unclosed inline code as text\", () => {\n        const tokens = lex(\"/* text ` still text */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"text ` still text\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should treat unclosed code blocks as code\", () => {\n        const tokens = lex(\n            dedent(`\n                /*\n                 * Text\n                 * \\`\\`\\`ts\n                 * foo();\n                 */`),\n        );\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 6 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 10 },\n            { kind: TokenSyntaxKind.Code, text: \"```ts\\nfoo();\", pos: 14 },\n        ]);\n    });\n\n    it(\"Should handle tags after unclosed code\", () => {\n        const tokens = lex(\n            dedent(`\n                /*\n                 * Text\n                 * code? \\`\\` fake\n                 * @blockTag text\n                 */`),\n        );\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 6 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 10 },\n            { kind: TokenSyntaxKind.Text, text: \"code? `` fake\", pos: 14 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 27 },\n            { kind: TokenSyntaxKind.Tag, text: \"@blockTag\", pos: 31 },\n            { kind: TokenSyntaxKind.Text, text: \" text\", pos: 40 },\n        ]);\n    });\n\n    it(\"Should handle text on the first line of a comment\", () => {\n        let tokens = lex(\n            dedent(`\n                /* Text\n                 * Text2\n                 */`),\n        );\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 3 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 7 },\n            { kind: TokenSyntaxKind.Text, text: \"Text2\", pos: 11 },\n        ]);\n\n        tokens = lex(\n            dedent(`\n                /** Text\n                 * Text2\n                 */`),\n        );\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 4 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \"Text2\", pos: 12 },\n        ]);\n    });\n\n    it(\"Should handle a full comment\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             * This is a summary.\n             *\n             * @remarks\n             * Detailed text here with a {@link Inline | inline link}\n             *\n             * @alpha @beta\n             */`),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"This is a summary.\", pos: 7 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 25 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 28 },\n            { kind: TokenSyntaxKind.Tag, text: \"@remarks\", pos: 32 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 40 },\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"Detailed text here with a \",\n                pos: 44,\n            },\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 70 },\n            { kind: TokenSyntaxKind.Tag, text: \"@link\", pos: 71 },\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \" Inline | inline link\",\n                pos: 76,\n            },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 97 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 98 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 101 },\n            { kind: TokenSyntaxKind.Tag, text: \"@alpha\", pos: 105 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 111 },\n            { kind: TokenSyntaxKind.Tag, text: \"@beta\", pos: 112 },\n        ]);\n    });\n\n    it(\"Should handle starred comments without an end tag in code\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             *Text\n             *\\`\\`\\`\n             *Text\n             */`),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 6 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 10 },\n            { kind: TokenSyntaxKind.Code, text: \"```\\nText\", pos: 13 },\n        ]);\n    });\n\n    it(\"Should handle type annotations after tags at the start of a line\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             * @param {string} foo\n             */`),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\", pos: 7 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 13 },\n            { kind: TokenSyntaxKind.TypeAnnotation, text: \"{string}\", pos: 14 },\n            { kind: TokenSyntaxKind.Text, text: \" foo\", pos: 22 },\n        ]);\n    });\n\n    it(\"Should handle type annotations containing string literals\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             * @param {\"{{}}\"}\n             * @param {\\`\\${\"{}\"}\\`}\n             * @param {\"text\\\\\"more {}\"}\n             * @param {'{'}\n             * EOF\n             */`),\n        );\n\n        const expectedAnnotations = [\n            '{\"{{}}\"}',\n            '{`${\"{}\"}`}',\n            '{\"text\\\\\"more {}\"}',\n            \"{'{'}\",\n        ];\n\n        const expectedTokens = expectedAnnotations.flatMap((text) => [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\" },\n            { kind: TokenSyntaxKind.Text, text: \" \" },\n            { kind: TokenSyntaxKind.TypeAnnotation, text },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n        ]);\n        expectedTokens.push({ kind: TokenSyntaxKind.Text, text: \"EOF\" });\n\n        equal(\n            tokens.map((tok) => ({ kind: tok.kind, text: tok.text })),\n            expectedTokens,\n        );\n    });\n\n    it(\"Should handle type annotations with object literals\", () => {\n        const tokens = lex(\n            dedent(`\n            /**\n             * @param {{ a: string }}\n             * @param {{ a: string; b: { c: { d: string }} }}\n             * EOF\n             */`),\n        );\n\n        const expectedAnnotations = [\n            \"{{ a: string }}\",\n            \"{{ a: string; b: { c: { d: string }} }}\",\n        ];\n\n        const expectedTokens = expectedAnnotations.flatMap((text) => [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\" },\n            { kind: TokenSyntaxKind.Text, text: \" \" },\n            { kind: TokenSyntaxKind.TypeAnnotation, text },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n        ]);\n        expectedTokens.push({ kind: TokenSyntaxKind.Text, text: \"EOF\" });\n\n        equal(\n            tokens.map((tok) => ({ kind: tok.kind, text: tok.text })),\n            expectedTokens,\n        );\n    });\n\n    it(\"Should handle unclosed type annotations\", () => {\n        const tokens = lex(\"/** @type {oops */\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@type\", pos: 4 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 9 },\n            { kind: TokenSyntaxKind.TypeAnnotation, text: \"{oops\", pos: 10 },\n        ]);\n    });\n\n    it(\"Should not parse inline tags as types\", () => {\n        const tokens = lex(\"/** @param {@link foo} */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\", pos: 4 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 10 },\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 11 },\n            { kind: TokenSyntaxKind.Tag, text: \"@link\", pos: 12 },\n            { kind: TokenSyntaxKind.Text, text: \" foo\", pos: 17 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 21 },\n        ]);\n    });\n\n    it(\"Should allow inline tags directly next to braces\", () => {\n        const tokens = lex(\"/** {@inline} */\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 4 },\n            { kind: TokenSyntaxKind.Tag, text: \"@inline\", pos: 5 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 12 },\n        ]);\n    });\n\n    it(\"Should detect unmatched code ticks within a line\", () => {\n        const tokens = lexNoPos(\n            \"/** non-code `tick\\n\\nstill non-code, `code` */\",\n        );\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"non-code `tick\",\n            },\n            {\n                kind: TokenSyntaxKind.NewLine,\n                text: \"\\n\",\n            },\n            {\n                kind: TokenSyntaxKind.NewLine,\n                text: \"\\n\",\n            },\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"still non-code, \",\n            },\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"`code`\",\n            },\n        ]);\n    });\n});\n\ndescribe(\"Line Comment Lexer\", () => {\n    function lex(text: string): Token[] {\n        return Array.from(\n            lexLineComments(text, [\n                {\n                    kind: ts.SyntaxKind.SingleLineCommentTrivia,\n                    pos: 0,\n                    end: text.length,\n                },\n            ]),\n        );\n    }\n\n    function lexNoPos(text: string): Omit<Token, \"pos\">[] {\n        return lex(text).map((t) => {\n            const { pos: _, ...noPos } = t;\n            return noPos;\n        });\n    }\n\n    it(\"Should handle an empty string\", () => {\n        equal(lex(\"//\"), []);\n\n        equal(lex(\"//   \"), []);\n    });\n\n    it(\"Should handle a trivial comment\", () => {\n        const tokens = lex(\"// Comment \");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should handle a multiline comment\", () => {\n        const tokens = lex(\"// Comment\\n  // Next line \");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\", pos: 3 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 10 },\n            { kind: TokenSyntaxKind.Text, text: \"Next line\", pos: 16 },\n        ]);\n    });\n\n    it(\"Should handle braces\", () => {\n        const tokens = lex(\"// {}\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 3 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 4 },\n        ]);\n    });\n\n    it(\"Should handle escaping braces\", () => {\n        const tokens = lex(\"// \\\\{\\\\}\");\n\n        equal(tokens, [{ kind: TokenSyntaxKind.Text, text: \"{}\", pos: 3 }]);\n    });\n\n    it(\"Should pass through unknown escapes\", () => {\n        const tokens = lex(\"// \\\\\\\\ \\\\n\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"\\\\\\\\ \\\\n\", pos: 3 },\n        ]);\n        equal(lex(\"// *\\\\/\"), [\n            { kind: TokenSyntaxKind.Text, text: \"*\\\\/\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should recognize tags\", () => {\n        const tokens = lex(\"// @tag @a @abc234 @abc-234\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@tag\", pos: 3 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 7 },\n            { kind: TokenSyntaxKind.Tag, text: \"@a\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 10 },\n            { kind: TokenSyntaxKind.Tag, text: \"@abc234\", pos: 11 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 18 },\n            { kind: TokenSyntaxKind.Tag, text: \"@abc-234\", pos: 19 },\n        ]);\n    });\n\n    it(\"Should not indiscriminately create tags\", () => {\n        const tokens = lex(\"// @123 @@ @\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"@123 @@ @\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should allow escaping @ to prevent a tag creation\", () => {\n        const tokens = lex(\"// not a \\\\@tag\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"not a @tag\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should not mistake an email for a modifier tag\", () => {\n        const tokens = lex(\"// test@example.com\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test@example.com\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should not mistake a scoped package for a tag\", () => {\n        const tokens = lex(\"// @typescript-eslint/parser @jest/globals\");\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"@typescript-eslint/parser @jest/globals\",\n                pos: 3,\n            },\n        ]);\n    });\n\n    it(\"Should allow escaping @ in an email\", () => {\n        const tokens = lex(\"// test\\\\@example.com\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test@example.com\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should allow inline code\", () => {\n        const tokens = lex(\"// test `code` after\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 3 },\n            { kind: TokenSyntaxKind.Code, text: \"`code`\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 14 },\n        ]);\n    });\n\n    it(\"Should allow inline code with multiple ticks\", () => {\n        const tokens = lex(\"// test ```not ```` closed``` after\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 3 },\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"```not ```` closed```\",\n                pos: 8,\n            },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 29 },\n        ]);\n    });\n\n    it(\"Should allow escaping ticks\", () => {\n        const tokens = lex(\"// test `\\\\`` after\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 3 },\n            { kind: TokenSyntaxKind.Code, text: \"`\\\\``\", pos: 8 },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 12 },\n        ]);\n    });\n\n    it(\"Should treat unclosed inline code as text\", () => {\n        const tokens = lex(\"// text ` still text\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"text ` still text\", pos: 3 },\n        ]);\n    });\n\n    it(\"Should handle tags after unclosed code\", () => {\n        const tokens = lex(\n            dedent(`\n            // Text\n            // code? \\`\\` fake\n            // @blockTag text\n        `),\n        );\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 3 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 7 },\n            { kind: TokenSyntaxKind.Text, text: \"code? `` fake\", pos: 11 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 24 },\n            { kind: TokenSyntaxKind.Tag, text: \"@blockTag\", pos: 28 },\n            { kind: TokenSyntaxKind.Text, text: \" text\", pos: 37 },\n        ]);\n    });\n\n    it(\"Should handle a full comment\", () => {\n        const tokens = lex(\n            dedent(`\n            // This is a summary.\n            //\n            // @remarks\n            // Detailed text here with a {@link Inline | inline link}\n            //\n            // @alpha @beta\n            `),\n        );\n\n        equal(\n            tokens.map((tok) => ({ kind: tok.kind, text: tok.text })),\n            [\n                { kind: TokenSyntaxKind.Text, text: \"This is a summary.\" },\n                { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n                { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n                { kind: TokenSyntaxKind.Tag, text: \"@remarks\" },\n                { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n                {\n                    kind: TokenSyntaxKind.Text,\n                    text: \"Detailed text here with a \",\n                },\n                { kind: TokenSyntaxKind.OpenBrace, text: \"{\" },\n                { kind: TokenSyntaxKind.Tag, text: \"@link\" },\n                { kind: TokenSyntaxKind.Text, text: \" Inline | inline link\" },\n                { kind: TokenSyntaxKind.CloseBrace, text: \"}\" },\n                { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n                { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n                { kind: TokenSyntaxKind.Tag, text: \"@alpha\" },\n                { kind: TokenSyntaxKind.Text, text: \" \" },\n                { kind: TokenSyntaxKind.Tag, text: \"@beta\" },\n            ],\n        );\n    });\n\n    it(\"Should handle unclosed code blocks\", () => {\n        const tokens = lex(\n            dedent(`\n            // Text\n            // \\`\\`\\`\n            // Text`),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\", pos: 3 },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\", pos: 7 },\n            { kind: TokenSyntaxKind.Code, text: \"```\\nText\", pos: 11 },\n        ]);\n    });\n\n    it(\"Should handle type annotations after tags at the start of a line\", () => {\n        const tokens = lex(`// @param {string} foo`);\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\", pos: 3 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 9 },\n            { kind: TokenSyntaxKind.TypeAnnotation, text: \"{string}\", pos: 10 },\n            { kind: TokenSyntaxKind.Text, text: \" foo\", pos: 18 },\n        ]);\n    });\n\n    it(\"Should handle type annotations containing string literals\", () => {\n        const tokens = lex(\n            dedent(`\n            // @param {\"{{}}\"}\n            // @param {\\`\\${\"{}\"}\\`}\n            // @param {\"text\\\\\"more {}\"}\n            // @param {'{'}\n            // EOF\n            `),\n        );\n\n        const expectedAnnotations = [\n            '{\"{{}}\"}',\n            '{`${\"{}\"}`}',\n            '{\"text\\\\\"more {}\"}',\n            \"{'{'}\",\n        ];\n\n        const expectedTokens = expectedAnnotations.flatMap((text) => [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\" },\n            { kind: TokenSyntaxKind.Text, text: \" \" },\n            { kind: TokenSyntaxKind.TypeAnnotation, text },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n        ]);\n        expectedTokens.push({ kind: TokenSyntaxKind.Text, text: \"EOF\" });\n\n        equal(\n            tokens.map((tok) => ({ kind: tok.kind, text: tok.text })),\n            expectedTokens,\n        );\n    });\n\n    it(\"Should handle type annotations with object literals\", () => {\n        const tokens = lex(\n            dedent(`\n            // @param {{ a: string }}\n            // @param {{ a: string; b: { c: { d: string }} }}\n            // EOF\n            `),\n        );\n\n        const expectedAnnotations = [\n            \"{{ a: string }}\",\n            \"{{ a: string; b: { c: { d: string }} }}\",\n        ];\n\n        const expectedTokens = expectedAnnotations.flatMap((text) => [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\" },\n            { kind: TokenSyntaxKind.Text, text: \" \" },\n            { kind: TokenSyntaxKind.TypeAnnotation, text },\n            { kind: TokenSyntaxKind.NewLine, text: \"\\n\" },\n        ]);\n        expectedTokens.push({ kind: TokenSyntaxKind.Text, text: \"EOF\" });\n\n        equal(\n            tokens.map((tok) => ({ kind: tok.kind, text: tok.text })),\n            expectedTokens,\n        );\n    });\n\n    it(\"Should handle unclosed type annotations\", () => {\n        const tokens = lex(\"// @type {oops\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@type\", pos: 3 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 8 },\n            { kind: TokenSyntaxKind.TypeAnnotation, text: \"{oops\", pos: 9 },\n        ]);\n    });\n\n    it(\"Should not parse inline tags as types\", () => {\n        const tokens = lex(\"// @param { @link foo}\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Tag, text: \"@param\", pos: 3 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 9 },\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 10 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 11 },\n            { kind: TokenSyntaxKind.Tag, text: \"@link\", pos: 12 },\n            { kind: TokenSyntaxKind.Text, text: \" foo\", pos: 17 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 21 },\n        ]);\n    });\n\n    it(\"Should allow inline tags directly next to braces\", () => {\n        const tokens = lex(\"// {@inline}\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 3 },\n            { kind: TokenSyntaxKind.Tag, text: \"@inline\", pos: 4 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 11 },\n        ]);\n    });\n\n    it(\"Should detect unmatched code ticks within a line\", () => {\n        const tokens = lexNoPos(\n            \"// non-code `tick\\n//\\n//still non-code, `code`\",\n        );\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"non-code `tick\",\n            },\n            {\n                kind: TokenSyntaxKind.NewLine,\n                text: \"\\n\",\n            },\n            {\n                kind: TokenSyntaxKind.NewLine,\n                text: \"\\n\",\n            },\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"still non-code, \",\n            },\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"`code`\",\n            },\n        ]);\n    });\n});\n\ndescribe(\"Raw Lexer\", () => {\n    function lex(text: string): Token[] {\n        return Array.from(lexCommentString(text));\n    }\n    function lexNoPos(text: string): Omit<Token, \"pos\">[] {\n        return Array.from(lexCommentString(text), (t) => {\n            const { pos: _, ...noPos } = t;\n            return noPos;\n        });\n    }\n\n    it(\"Should handle an empty string\", () => {\n        equal(lex(\"\"), []);\n\n        equal(lex(\"   \\n   \"), []);\n    });\n\n    it(\"Should handle a trivial comment\", () => {\n        const tokens = lex(\" Comment \");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\", pos: 1 },\n        ]);\n    });\n\n    it(\"Should handle a multiline comment\", () => {\n        const tokens = lex(\" Comment\\nNext line \");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Comment\\nNext line\", pos: 1 },\n        ]);\n    });\n\n    it(\"Should handle braces\", () => {\n        const tokens = lex(\"{}\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 0 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 1 },\n        ]);\n    });\n\n    it(\"Should handle escaping braces\", () => {\n        const tokens = lex(\"\\\\{\\\\}\");\n\n        equal(tokens, [{ kind: TokenSyntaxKind.Text, text: \"{}\", pos: 0 }]);\n    });\n\n    it(\"Should pass through unknown escapes\", () => {\n        const tokens = lex(\"\\\\\\\\ \\\\n\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"\\\\\\\\ \\\\n\", pos: 0 },\n        ]);\n        equal(lex(\"*\\\\/\"), [\n            { kind: TokenSyntaxKind.Text, text: \"*\\\\/\", pos: 0 },\n        ]);\n    });\n\n    it(\"Should not recognize tags\", () => {\n        const tokens = lex(\"@123 @@ @ @tag @a @abc234 @abc-234\");\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"@123 @@ @ @tag @a @abc234 @abc-234\",\n                pos: 0,\n            },\n        ]);\n    });\n\n    it(\"Should allow escaping @ to prevent a tag creation\", () => {\n        const tokens = lex(\"not a \\\\@tag\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"not a @tag\", pos: 0 },\n        ]);\n    });\n\n    it(\"Should allow inline code\", () => {\n        const tokens = lex(\"test `code` after\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 0 },\n            { kind: TokenSyntaxKind.Code, text: \"`code`\", pos: 5 },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 11 },\n        ]);\n    });\n\n    // https://github.com/TypeStrong/typedoc/issues/1922#issuecomment-1166278275\n    it(\"Should handle code blocks ending a string\", () => {\n        const tokens = lex(\"`code`\");\n\n        equal(tokens, [\n            {\n                kind: \"code\",\n                text: \"`code`\",\n                pos: 0,\n            },\n        ]);\n    });\n\n    it(\"Should allow inline code with multiple ticks\", () => {\n        const tokens = lex(\"test ```not ```` closed``` after\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 0 },\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"```not ```` closed```\",\n                pos: 5,\n            },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 26 },\n        ]);\n    });\n\n    it(\"Should allow escaping ticks\", () => {\n        const tokens = lex(\"test `\\\\`` after\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"test \", pos: 0 },\n            { kind: TokenSyntaxKind.Code, text: \"`\\\\``\", pos: 5 },\n            { kind: TokenSyntaxKind.Text, text: \" after\", pos: 9 },\n        ]);\n    });\n\n    it(\"Should treat unclosed inline code as text\", () => {\n        const tokens = lex(\"text ` still text\");\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"text ` still text\", pos: 0 },\n        ]);\n    });\n\n    it(\"Should handle unclosed code blocks\", () => {\n        const tokens = lex(\n            dedent(`\n            Text\n            \\`\\`\\`\n            Text`),\n        );\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.Text, text: \"Text\\n\", pos: 0 },\n            { kind: TokenSyntaxKind.Code, text: \"```\\nText\", pos: 5 },\n        ]);\n    });\n\n    it(\"Should allow inline tags directly next to braces\", () => {\n        const tokens = lex(\"{@inline}\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 0 },\n            { kind: TokenSyntaxKind.Tag, text: \"@inline\", pos: 1 },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 8 },\n        ]);\n    });\n\n    it(\"Should allow inline tags with spaces surrounding the braces\", () => {\n        const tokens = lex(\"{ @link https://example.com example }\");\n\n        equal(tokens, [\n            { kind: TokenSyntaxKind.OpenBrace, text: \"{\", pos: 0 },\n            { kind: TokenSyntaxKind.Text, text: \" \", pos: 1 },\n            { kind: TokenSyntaxKind.Tag, text: \"@link\", pos: 2 },\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \" https://example.com example \",\n                pos: 7,\n            },\n            { kind: TokenSyntaxKind.CloseBrace, text: \"}\", pos: 36 },\n        ]);\n    });\n\n    it(\"Should detect unmatched code ticks within a line\", () => {\n        const tokens = lexNoPos(\"non-code `tick\\n\\nstill non-code, `code`\");\n\n        equal(tokens, [\n            {\n                kind: TokenSyntaxKind.Text,\n                text: \"non-code `tick\\n\\nstill non-code, \",\n            },\n            {\n                kind: TokenSyntaxKind.Code,\n                text: \"`code`\",\n            },\n        ]);\n    });\n});\n\ndescribe(\"Comment Parser\", () => {\n    const config: CommentParserConfig = {\n        blockTags: new Set([\n            \"@param\",\n            \"@remarks\",\n            \"@module\",\n            \"@inheritDoc\",\n            \"@defaultValue\",\n        ]),\n        inlineTags: new Set([\"@link\"]),\n        modifierTags: new Set([\n            \"@public\",\n            \"@private\",\n            \"@protected\",\n            \"@readonly\",\n            \"@enum\",\n            \"@event\",\n            \"@packageDocumentation\",\n        ]),\n        preservedTypeAnnotationTags: new Set([\"@fires\"]),\n        jsDocCompatibility: {\n            defaultTag: true,\n            exampleTag: true,\n            ignoreUnescapedBraces: false,\n            inheritDocTag: false,\n        },\n        suppressCommentWarningsInDeclarationFiles: false,\n        useTsLinkResolution: false,\n        commentStyle: \"jsdoc\",\n        validationOptions: {\n            notExported: false,\n            invalidLink: false,\n            invalidPath: true,\n            rewrittenLink: false,\n            notDocumented: false,\n            unusedMergeModuleWith: false,\n        },\n    };\n\n    it(\"Should recognize @defaultValue as code\", () => {\n        const files = new FileRegistry();\n        const logger = new TestLogger();\n        const file = \"/** @defaultValue code */\";\n        const content = lexBlockComment(file);\n        const comment = parseComment(\n            content,\n            new MinimalSourceFile(file, \"/dev/zero\" as NormalizedPath),\n            { logger, files, config, createSymbolId: neverCalled },\n        );\n\n        equal(\n            comment,\n            new Comment(\n                [],\n                [\n                    new CommentTag(\"@defaultValue\", [\n                        { kind: \"code\", text: \"```ts\\ncode\\n```\" },\n                    ]),\n                ],\n            ),\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should recognize @defaultValue as not code if it contains an inline tag\", () => {\n        const files = new FileRegistry();\n        const logger = new TestLogger();\n        const file = \"/** @defaultValue text {@link foo} */\";\n        const content = lexBlockComment(file);\n        const comment = parseComment(\n            content,\n            new MinimalSourceFile(file, \"/dev/zero\" as NormalizedPath),\n            { logger, files, config, createSymbolId: neverCalled },\n        );\n\n        equal(\n            comment,\n            new Comment(\n                [],\n                [\n                    new CommentTag(\"@defaultValue\", [\n                        { kind: \"text\", text: \"text \" },\n                        { kind: \"inline-tag\", tag: \"@link\", text: \"foo\" },\n                    ]),\n                ],\n            ),\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should recognize @defaultValue as not code if it contains code\", () => {\n        const files = new FileRegistry();\n        const logger = new TestLogger();\n        const file = \"/** @defaultValue text `code` */\";\n        const content = lexBlockComment(file);\n        const comment = parseComment(\n            content,\n            new MinimalSourceFile(file, \"/dev/zero\" as NormalizedPath),\n            { logger, files, config, createSymbolId: neverCalled },\n        );\n\n        equal(\n            comment,\n            new Comment(\n                [],\n                [\n                    new CommentTag(\"@defaultValue\", [\n                        { kind: \"text\", text: \"text \" },\n                        { kind: \"code\", text: \"`code`\" },\n                    ]),\n                ],\n            ),\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should rewrite @inheritdoc to @inheritDoc\", () => {\n        const files = new FileRegistry();\n        const logger = new TestLogger();\n        const file = \"/** @inheritdoc */\";\n        const content = lexBlockComment(file);\n        const comment = parseComment(\n            content,\n            new MinimalSourceFile(file, \"/dev/zero\" as NormalizedPath),\n            { logger, files, config, createSymbolId: neverCalled },\n        );\n\n        logger.expectMessage(\n            \"warn: The @inheritDoc tag should be properly capitalized\",\n        );\n        logger.expectNoOtherMessages();\n        equal(comment, new Comment([], [new CommentTag(\"@inheritDoc\", [])]));\n    });\n\n    let files: FileRegistry;\n    function getComment(text: string) {\n        files = new FileRegistry();\n        const logger = new TestLogger();\n        const content = lexBlockComment(text);\n        const comment = parseComment(\n            content,\n            new MinimalSourceFile(text, \"/dev/zero\" as NormalizedPath),\n            { logger, files, config, createSymbolId: neverCalled },\n        );\n        logger.expectNoOtherMessages();\n        return comment;\n    }\n\n    afterEach(() => {\n        files = undefined!;\n    });\n\n    it(\"Simple summary\", () => {\n        const comment = getComment(\"/** Summary! */\");\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary!\" }]);\n        equal(comment.blockTags, []);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Summary with remarks\", () => {\n        const comment = getComment(`/**\n            * Summary\n            * @remarks Remarks\n            */`);\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary\" }]);\n        equal(comment.blockTags, [\n            new CommentTag(\"@remarks\", [{ kind: \"text\", text: \"Remarks\" }]),\n        ]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Parameter without content\", () => {\n        const comment = getComment(`/**\n            * Summary\n            * @param\n            */`);\n\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary\" }]);\n        const tag = new CommentTag(\"@param\", []);\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Parameter name\", () => {\n        const comment = getComment(`/**\n            * Summary\n            * @param T Param text\n            */`);\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary\" }]);\n        const tag = new CommentTag(\"@param\", [\n            { kind: \"text\", text: \"Param text\" },\n        ]);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Parameter name with no content\", () => {\n        const comment = getComment(`/**\n            * Summary\n            * @param T\n            */`);\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary\" }]);\n        const tag = new CommentTag(\"@param\", []);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Parameter name with dash\", () => {\n        const comment = getComment(`/**\n            * Summary\n            * @param T - Param text\n            */`);\n\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary\" }]);\n        const tag = new CommentTag(\"@param\", [\n            { kind: \"text\", text: \"Param text\" },\n        ]);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Parameter name with type annotation\", () => {\n        const comment = getComment(`/**\n            * Summary\n            * @param {string} T - Param text\n            */`);\n\n        equal(comment.summary, [{ kind: \"text\", text: \"Summary\" }]);\n        const tag = new CommentTag(\"@param\", [\n            { kind: \"text\", text: \"Param text\" },\n        ]);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Optional parameter name\", () => {\n        const comment = getComment(`/**\n            * @param {string} [T] Param text\n            */`);\n\n        const tag = new CommentTag(\"@param\", [\n            { kind: \"text\", text: \"Param text\" },\n        ]);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Optional parameter name with default\", () => {\n        const comment = getComment(`/**\n            * @param {string} [T = 123] Param text\n            */`);\n\n        const tag = new CommentTag(\"@param\", [\n            { kind: \"text\", text: \"Param text\" },\n        ]);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Optional parameter name with default that contains brackets\", () => {\n        const comment = getComment(`/**\n            * @param {string} [T = [1, [\"st[r\"]]] Param text\n            */`);\n\n        const tag = new CommentTag(\"@param\", [\n            { kind: \"text\", text: \"Param text\" },\n        ]);\n        tag.name = \"T\";\n\n        equal(comment.blockTags, [tag]);\n        equal(comment.modifierTags, new Set());\n    });\n\n    it(\"Recognizes markdown links\", () => {\n        const comment = getComment(`/**\n            * [text](./relative.md) ![](image.png)\n            * Not relative: [passwd](/etc/passwd) [Windows](C:\\\\\\\\\\\\\\\\Windows) [example.com](http://example.com) [hash](#hash)\n            */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: \"[text](\" },\n                {\n                    kind: \"relative-link\",\n                    text: \"./relative.md\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: \") ![](\" },\n                {\n                    kind: \"relative-link\",\n                    text: \"image.png\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text:\n                        \")\\nNot relative: [passwd](/etc/passwd) [Windows](C:\\\\\\\\\\\\\\\\Windows) [example.com](http://example.com) [hash](#hash)\",\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"#2606 Recognizes markdown links which contain inline code in the label\", () => {\n        const comment = getComment(`/**\n            * [\\`text\\`](./relative.md)\n            * [\\`text\\`\n            * more](./relative.md)\n            * [\\`text\\`\n            *\n            * more](./relative.md)\n            */`);\n\n        equal(\n            comment.summary,\n            [\n                // Simple case with code\n                { kind: \"text\", text: \"[\" },\n                { kind: \"code\", text: \"`text`\" },\n                { kind: \"text\", text: \"](\" },\n                {\n                    kind: \"relative-link\",\n                    text: \"./relative.md\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                // Labels can also include single newlines\n                { kind: \"text\", text: \")\\n[\" },\n                { kind: \"code\", text: \"`text`\" },\n                { kind: \"text\", text: \"\\nmore](\" },\n                {\n                    kind: \"relative-link\",\n                    text: \"./relative.md\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                // But not double!\n                { kind: \"text\", text: \")\\n[\" },\n                { kind: \"code\", text: \"`text`\" },\n                { kind: \"text\", text: \"\\n\\nmore](./relative.md)\" },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes markdown links which contain inline code in the label\", () => {\n        const comment = getComment(`/**\n            * [\\`text\\`](./relative.md)\n            */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: \"[\" },\n                { kind: \"code\", text: \"`text`\" },\n                { kind: \"text\", text: \"](\" },\n                {\n                    kind: \"relative-link\",\n                    text: \"./relative.md\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: \")\" },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes markdown links which contain parentheses and escapes in the label\", () => {\n        const comment = getComment(String.raw`/**\n            * [(parens) \\[brackets\\]](./relative.md)\n            *\n            * [\n            *  multi-line\n            *  \\[brackets\\]\n            *  (parens)\n            * ](\n            *   ./relative.md\n            *   )\n            */`);\n\n        const link = {\n            kind: \"relative-link\",\n            text: \"./relative.md\",\n            target: 1 as FileId,\n            targetAnchor: undefined,\n        } as const;\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: String.raw`[(parens) \\[brackets\\]](` },\n                link,\n                { kind: \"text\", text: `)\\n\\n[\\n multi-line\\n ${String.raw`\\[brackets\\]`}\\n (parens)\\n](\\n  ` },\n                link,\n                { kind: \"text\", text: \"\\n  )\" },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Parses markdown link titles with arbitrarily-separated arbitrary combinations of text and code\", () => {\n        const comment = `/**\n            [text](./1)\n            [text \\`code\\`](  \\t ./2   )\n            [\\ntext \\`code\\`\\n](./3)\n            [\\ntext\\n\\`code\\`\\n]( ./4 )\n            [ \\t\\`code\\` text]( \\t./5\\t )\n\n            [\\n\\n\\`code\\`](./no1)\n            [text\\n\\n](./no2)\n            [  text\\n](\\n  \\n ./no3 \\n)\n            [  text\\n\\ntext](./no4)\n            */`;\n\n        const relativeParts = getComment(comment).summary.filter(p => p.kind === \"relative-link\");\n\n        for (let i = 0; i < relativeParts.length; i++) {\n            equal(relativeParts[i].text, `./${i + 1}`);\n        }\n        equal(relativeParts.length, 5);\n    });\n\n    it(\"Recognizes markdown reference definition blocks\", () => {\n        const comment = getComment(`/**\n            * [1]: ./example.md\n            * [2]:<./example with space>\n            * [3]: https://example.com\n            * [4]: #hash\n            * [^footnote]: ./example.md\n            */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: \"[1]: \" },\n                {\n                    kind: \"relative-link\",\n                    text: \"./example.md\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: \"\\n[2]:\" },\n                {\n                    kind: \"relative-link\",\n                    text: \"<./example with space>\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: \"\\n[3]: https://example.com\\n[4]: #hash\\n[^footnote]: ./example.md\",\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Does not mistake mailto: links as relative paths\", () => {\n        const comment = getComment(`/**\n            * [1]: mailto:example@example.com\n            */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: \"[1]: mailto:example@example.com\" },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes HTML image links\", () => {\n        const comment = getComment(`/**\n        * <img width=100 height=\"200\" src=\"./test.png\" >\n        * <img src=\"./test space.png\"/>\n        * <img src=\"https://example.com/favicon.ico\">\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<img width=100 height=\"200\" src=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.png\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: '\" >\\n<img src=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test space.png\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: '\"/>\\n<img src=\"https://example.com/favicon.ico\">',\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes HTML picture source srcset links\", () => {\n        const comment = getComment(`/**\n        * <source media=\"(prefers-color-scheme: light)\"  srcset=\"./test.png\" >\n        * <source srcset=\"./test2.png 100w, ./test3.png 2x\" >\n        * <source media=\"(prefers-color-scheme: dark)\"  srcset=\"./test%20space.png, ./test5.png\"/>\n        * <source srcset=\"https://example.com/favicon.ico\">\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<source media=\"(prefers-color-scheme: light)\"  srcset=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.png\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: '\" >\\n<source srcset=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test2.png\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: \" 100w, \" },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test3.png\",\n                    target: 3 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: ' 2x\" >\\n<source media=\"(prefers-color-scheme: dark)\"  srcset=\"',\n                },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test%20space.png\",\n                    target: 4 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: \", \",\n                },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test5.png\",\n                    target: 5 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: '\"/>\\n<source srcset=\"https://example.com/favicon.ico\">',\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    // cspell:words imagesrcset\n    it(\"Recognizes <link imagesrcset> links\", () => {\n        const comment = getComment(`/**\n        * <link imagesrcset=\"./test.png 100w\" >\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<link imagesrcset=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.png\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: ' 100w\" >' },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes HTML audio and video src links\", () => {\n        const comment = getComment(`/**\n        * <source src=\"./test.wav\" >\n        * <source media=\"(prefers-color-scheme: dark)\" src=\"./test_dark.mp4\"/>\n        * <source src=\"https://example.com/test.wav\">\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<source src=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.wav\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: '\" >\\n<source media=\"(prefers-color-scheme: dark)\" src=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test_dark.mp4\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: '\"/>\\n<source src=\"https://example.com/test.wav\">',\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes img tag with both src and srcset\", () => {\n        const comment = getComment(`/**\n        * <img src=\"./test.png\" srcset=\"./test2.png\">\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<img src=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.png\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: '\" srcset=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test2.png\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: '\">',\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes HTML anchor links\", () => {\n        const comment = getComment(`/**\n        * <a data-foo=\"./path.txt\" href=\"./test.png\" >\n        * <a href=\"./test space.png\"/>\n        * <a href=\"https://example.com/favicon.ico\">\n        * <a href=\"#hash\">\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<a data-foo=\"./path.txt\" href=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.png\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: '\" >\\n<a href=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test space.png\",\n                    target: 2 as FileId,\n                    targetAnchor: undefined,\n                },\n                {\n                    kind: \"text\",\n                    text: '\"/>\\n<a href=\"https://example.com/favicon.ico\">\\n<a href=\"#hash\">',\n                },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Recognizes anchors within relative links\", () => {\n        const comment = getComment(`/**\n            * <a href=\"./path.md#foo\" >\n            * [test](./test.txt#bar)\n            */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<a href=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./path.md#foo\",\n                    target: 1 as FileId,\n                    targetAnchor: \"foo\",\n                },\n                { kind: \"text\", text: '\" >\\n[test](' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./test.txt#bar\",\n                    target: 2 as FileId,\n                    targetAnchor: \"bar\",\n                },\n                { kind: \"text\", text: \")\" },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Properly handles character escapes\", () => {\n        const comment = getComment(`/**\n        * <a href=\"./&amp;&#97;.png\" >\n        */`);\n\n        equal(\n            comment.summary,\n            [\n                { kind: \"text\", text: '<a href=\"' },\n                {\n                    kind: \"relative-link\",\n                    text: \"./&amp;&#97;.png\",\n                    target: 1 as FileId,\n                    targetAnchor: undefined,\n                },\n                { kind: \"text\", text: '\" >' },\n            ] satisfies CommentDisplayPart[],\n        );\n\n        equal(files.getName(1 as FileId), \"&a.png\");\n        equal(files.getName(1 as FileId), \"&a.png\");\n    });\n});\n\ndescribe(\"Raw Comment Parser\", () => {\n    const config: CommentParserConfig = {\n        blockTags: new Set([\n            \"@param\",\n            \"@remarks\",\n            \"@module\",\n            \"@inheritDoc\",\n            \"@defaultValue\",\n        ]),\n        inlineTags: new Set([\"@link\"]),\n        modifierTags: new Set([\n            \"@public\",\n            \"@private\",\n            \"@protected\",\n            \"@readonly\",\n            \"@enum\",\n            \"@event\",\n            \"@packageDocumentation\",\n        ]),\n        preservedTypeAnnotationTags: new Set([\"@fires\"]),\n        jsDocCompatibility: {\n            defaultTag: true,\n            exampleTag: true,\n            ignoreUnescapedBraces: false,\n            inheritDocTag: false,\n        },\n        suppressCommentWarningsInDeclarationFiles: false,\n        useTsLinkResolution: false,\n        commentStyle: \"jsdoc\",\n        validationOptions: {\n            notExported: false,\n            invalidLink: false,\n            invalidPath: true,\n            rewrittenLink: false,\n            notDocumented: false,\n            unusedMergeModuleWith: false,\n        },\n    };\n\n    function getComment(text: string) {\n        const files = new FileRegistry();\n        const logger = new TestLogger();\n        const content = lexCommentString(text);\n        const comment = parseCommentString(\n            content,\n            config,\n            new MinimalSourceFile(text, \"/dev/zero\" as NormalizedPath),\n            logger,\n            files,\n        );\n        logger.expectNoOtherMessages();\n        return comment;\n    }\n\n    it(\"Recognizes markdown links which contain parentheses and escapes in the label\", () => {\n        const comment = getComment(dedent(String.raw`\n            [(parens) \\[brackets\\]](./relative.md)\n\n            [\n             multi-line\n             \\[brackets\\]\n             (parens)\n            ](\n              ./relative.md\n              )\n            `));\n\n        const link = {\n            kind: \"relative-link\",\n            text: \"./relative.md\",\n            target: 1 as FileId,\n            targetAnchor: undefined,\n        } as const;\n\n        equal(\n            comment.content,\n            [\n                { kind: \"text\", text: String.raw`[(parens) \\[brackets\\]](` },\n                link,\n                { kind: \"text\", text: `)\\n\\n[\\n multi-line\\n ${String.raw`\\[brackets\\]`}\\n (parens)\\n](\\n  ` },\n                link,\n                { kind: \"text\", text: \"\\n  )\" },\n            ] satisfies CommentDisplayPart[],\n        );\n    });\n\n    it(\"Parses markdown link titles with arbitrarily-separated arbitrary combinations of text and code\", () => {\n        const comment = `/**\n            [text](./1)\n            [text \\`code\\`](  \\t ./2   )\n            [\\ntext \\`code\\`\\n](./3)\n            [\\ntext\\n\\`code\\`\\n]( ./4 )\n            [ \\t\\`code\\` text]( \\t./5\\t )\n\n            [\\n\\n\\`code\\`](./no1)\n            [text\\n\\n](./no2)\n            [  text\\n](\\n  \\n ./no3 \\n)\n            [  text\\n\\ntext](./no4)\n            */`;\n\n        const relativeParts = getComment(comment).content.filter(p => p.kind === \"relative-link\");\n\n        for (let i = 0; i < relativeParts.length; i++) {\n            equal(relativeParts[i].text, `./${i + 1}`);\n        }\n        equal(relativeParts.length, 5);\n    });\n});\n\ndescribe(\"extractTagName\", () => {\n    it(\"Handles simple name\", () => {\n        equal(extractTagName(\"T - abc\"), { name: \"T\", newText: \"abc\" });\n        equal(extractTagName(\"Ta abc\"), { name: \"Ta\", newText: \"abc\" });\n    });\n\n    it(\"Handles a bracketed name\", () => {\n        equal(extractTagName(\"[T] - abc\"), { name: \"T\", newText: \"abc\" });\n        equal(extractTagName(\"[  Ta ] - abc\"), { name: \"Ta\", newText: \"abc\" });\n        equal(extractTagName(\"[Tb] abc\"), { name: \"Tb\", newText: \"abc\" });\n    });\n\n    it(\"Handles a bracketed name with simple defaults\", () => {\n        equal(extractTagName(\"[T = 1] - abc\"), { name: \"T\", newText: \"abc\" });\n        equal(extractTagName(\"[  Ta = 'x'] - abc\"), {\n            name: \"Ta\",\n            newText: \"abc\",\n        });\n    });\n\n    it(\"Handles a bracketed name with problematic defaults\", () => {\n        equal(extractTagName(\"[T = []] - abc\"), { name: \"T\", newText: \"abc\" });\n        equal(extractTagName(\"[Ta = '['] - abc\"), {\n            name: \"Ta\",\n            newText: \"abc\",\n        });\n    });\n\n    it(\"Handles an incomplete bracketed name without crashing\", () => {\n        // Not really ideal, but the comment is badly broken enough here that users\n        // should get an error from TS when trying to use it, so this is probably fine.\n        equal(extractTagName(\"[T - abc\"), { name: \"T\", newText: \"\" });\n        equal(extractTagName(\"[Ta\"), { name: \"Ta\", newText: \"\" });\n    });\n});\n"
  },
  {
    "path": "src/test/converter/alias/alias.ts",
    "content": "import { TestClass } from \"../class/class.js\";\n\n/**\n * A type that describes a compare function, e.g. for array.sort().\n */\nexport type TCompareFunction<T> = (a: T, b: T) => number;\n\n/**\n * A type for IDs.\n */\nexport type TId = number | string;\n\n/**\n * Conditional types from TS2.8\n */\nexport type IsString<T> = T extends string ? \"string\" : \"not string\";\n\n/**\n * Extracts the type of a promise.\n */\nexport type PromiseType<T> = T extends PromiseLike<infer U> ? U : T;\n\n/**\n * {@link class!class.TestClass}\n */\nexport type MergedCrossReference = TestClass;\n"
  },
  {
    "path": "src/test/converter/alias/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"alias\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 8,\n            \"name\": \"IsString\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Conditional types from TS2.8\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"alias.ts\",\n                    \"line\": 16,\n                    \"character\": 12,\n                    \"url\": \"typedoc://alias.ts#L16\"\n                }\n            ],\n            \"typeParameters\": [\n                {\n                    \"id\": 9,\n                    \"name\": \"T\",\n                    \"variant\": \"typeParam\",\n                    \"kind\": 131072,\n                    \"flags\": {}\n                }\n            ],\n            \"type\": {\n                \"type\": \"conditional\",\n                \"checkType\": {\n                    \"type\": \"reference\",\n                    \"target\": 9,\n                    \"name\": \"T\",\n                    \"package\": \"typedoc\",\n                    \"refersToTypeParameter\": true\n                },\n                \"extendsType\": {\n                    \"type\": \"intrinsic\",\n                    \"name\": \"string\"\n                },\n                \"trueType\": {\n                    \"type\": \"literal\",\n                    \"value\": \"string\"\n                },\n                \"falseType\": {\n                    \"type\": \"literal\",\n                    \"value\": \"not string\"\n                }\n            }\n        },\n        {\n            \"id\": 12,\n            \"name\": \"MergedCrossReference\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"inline-tag\",\n                        \"tag\": \"@link\",\n                        \"text\": \"class!class.TestClass\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"alias.ts\",\n                    \"line\": 26,\n                    \"character\": 12,\n                    \"url\": \"typedoc://alias.ts#L26\"\n                }\n            ],\n            \"type\": {\n                \"type\": \"reference\",\n                \"target\": {\n                    \"packageName\": \"typedoc\",\n                    \"packagePath\": \"src/test/converter/class/class.ts\",\n                    \"qualifiedName\": \"TestClass\"\n                },\n                \"name\": \"TestClass\",\n                \"package\": \"typedoc\"\n            }\n        },\n        {\n            \"id\": 10,\n            \"name\": \"PromiseType\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Extracts the type of a promise.\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"alias.ts\",\n                    \"line\": 21,\n                    \"character\": 12,\n                    \"url\": \"typedoc://alias.ts#L21\"\n                }\n            ],\n            \"typeParameters\": [\n                {\n                    \"id\": 11,\n                    \"name\": \"T\",\n                    \"variant\": \"typeParam\",\n                    \"kind\": 131072,\n                    \"flags\": {}\n                }\n            ],\n            \"type\": {\n                \"type\": \"conditional\",\n                \"checkType\": {\n                    \"type\": \"reference\",\n                    \"target\": 11,\n                    \"name\": \"T\",\n                    \"package\": \"typedoc\",\n                    \"refersToTypeParameter\": true\n                },\n                \"extendsType\": {\n                    \"type\": \"reference\",\n                    \"target\": {\n                        \"packageName\": \"typescript\",\n                        \"packagePath\": \"lib/lib.es5.d.ts\",\n                        \"qualifiedName\": \"PromiseLike\"\n                    },\n                    \"typeArguments\": [\n                        {\n                            \"type\": \"inferred\",\n                            \"name\": \"U\"\n                        }\n                    ],\n                    \"name\": \"PromiseLike\",\n                    \"package\": \"typescript\"\n                },\n                \"trueType\": {\n                    \"type\": \"reference\",\n                    \"target\": {\n                        \"packageName\": \"typedoc\",\n                        \"packagePath\": \"src/test/converter/alias/alias.ts\",\n                        \"qualifiedName\": \"U\"\n                    },\n                    \"name\": \"U\",\n                    \"package\": \"typedoc\",\n                    \"refersToTypeParameter\": true\n                },\n                \"falseType\": {\n                    \"type\": \"reference\",\n                    \"target\": 11,\n                    \"name\": \"T\",\n                    \"package\": \"typedoc\",\n                    \"refersToTypeParameter\": true\n                }\n            }\n        },\n        {\n            \"id\": 1,\n            \"name\": \"TCompareFunction\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"A type that describes a compare function, e.g. for array.sort().\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"alias.ts\",\n                    \"line\": 6,\n                    \"character\": 12,\n                    \"url\": \"typedoc://alias.ts#L6\"\n                }\n            ],\n            \"typeParameters\": [\n                {\n                    \"id\": 6,\n                    \"name\": \"T\",\n                    \"variant\": \"typeParam\",\n                    \"kind\": 131072,\n                    \"flags\": {}\n                }\n            ],\n            \"type\": {\n                \"type\": \"reflection\",\n                \"declaration\": {\n                    \"id\": 2,\n                    \"name\": \"__type\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 65536,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"__type\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"parameters\": [\n                                {\n                                    \"id\": 4,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 6,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                },\n                                {\n                                    \"id\": 5,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 6,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            }\n        },\n        {\n            \"id\": 7,\n            \"name\": \"TId\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"A type for IDs.\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"alias.ts\",\n                    \"line\": 11,\n                    \"character\": 12,\n                    \"url\": \"typedoc://alias.ts#L11\"\n                }\n            ],\n            \"type\": {\n                \"type\": \"union\",\n                \"types\": [\n                    {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    },\n                    {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                ]\n            }\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Type Aliases\",\n            \"children\": [\n                8,\n                12,\n                10,\n                1,\n                7\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"0\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"TCompareFunction\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"TId\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"IsString\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"PromiseType\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/alias/alias.ts\",\n            \"qualifiedName\": \"MergedCrossReference\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/alias/alias.ts\"\n        },\n        \"reflections\": {\n            \"1\": 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/class/access.ts",
    "content": "/**\n * A variable that is made private via comment.\n * @private\n */\nexport const fakePrivateVariable = \"test\";\n\n/**\n * A variable that is made protected via comment.\n * @protected\n */\nexport const fakeProtectedVariable = \"test\";\n\n/**\n * A function that is made private via comment.\n * @private\n */\nexport function fakePrivateFunction() {}\n\n/**\n * A function that is made protected via comment.\n * @protected\n */\nexport function fakeProtectedFunction() {}\n\n/**\n * A class that is documented as being private.\n * @private\n */\nexport class PrivateClass {\n    /**\n     * A variable that is made private via comment.\n     * @private\n     */\n    fakePrivateProperty: string;\n\n    /**\n     * A variable that is made protected via comment.\n     * @protected\n     */\n    fakeProtectedProperty: string;\n\n    /**\n     * A function that is made private via comment.\n     * @private\n     */\n    fakePrivateMethod() {}\n\n    /**\n     * A function that is made protected via comment.\n     * @protected\n     */\n    fakeProtectedMethod() {}\n\n    private privateArrow = () => {};\n\n    /** @hidden - should not show up */\n    constructor() {}\n\n    private static get privateStaticGetter() {\n        return 1;\n    }\n}\n"
  },
  {
    "path": "src/test/converter/class/class.ts",
    "content": "/**\n * TestClass comment short text.\n *\n * TestClass comment text.\n *\n * @see {@link TestClass} @ fixtures\n */\nexport class TestClass {\n    /**\n     * publicProperty short text.\n     */\n    public publicProperty: string;\n\n    /**\n     * privateProperty short text.\n     */\n    private privateProperty: number[];\n\n    /**\n     * staticProperty short text.\n     */\n    static staticProperty: TestClass;\n\n    /**\n     * Constructor short text.\n     */\n    constructor() {}\n\n    /**\n     * publicMethod short text.\n     * @category AnotherTest\n     * @category Test\n     */\n    public publicMethod() {}\n\n    /**\n     * protectedMethod short text.\n     * @category Test\n     * @category AnotherTest\n     */\n    protected protectedMethod() {}\n\n    /**\n     * privateMethod short text.\n     *\n     * @category AnotherTest\n     */\n    private privateMethod() {}\n\n    /**\n     * staticMethod short text.\n     */\n    static staticMethod() {}\n\n    /**\n     * arrow method\n     */\n    arrowMethod = () => {};\n}\n\nexport class TestSubClass extends TestClass {\n    /**\n     * publicMethod short text.\n     */\n    public publicMethod() {}\n\n    /**\n     * protectedMethod short text.\n     */\n    protected protectedMethod() {}\n\n    /**\n     * Constructor short text.\n     *\n     * @param p1 Constructor param\n     * @param p2 Private string property\n     * @param p3 Public number property\n     * @param p4 Public implicit any property\n     */\n    constructor(\n        p1,\n        private p2: string,\n        public p3: number,\n        public p4,\n    ) {\n        super();\n    }\n}\n\nexport abstract class TestAbstractClass {\n    abstract myAbstractProperty: string;\n\n    protected abstract myAbstractMethod(): void;\n}\n\nexport class TestAbstractClassImplementation extends TestAbstractClass {\n    myAbstractProperty: string;\n\n    protected myAbstractMethod(): void {}\n}\n\nexport interface TestSubClass {\n    /**\n     * mergedMethod short text.\n     */\n    mergedMethod();\n}\n\nexport namespace TestSubClass {\n    /**\n     * staticMergedMethod short text.\n     */\n    export function staticMergedMethod() {}\n}\n\nconst x = \"literal\";\n\nexport class ComputedNames {\n    [Symbol.toStringTag] = \"computed\";\n    [x] = true;\n    [\"literal2\"] = true;\n    y = false;\n}\n\nexport class Ts38PrivateFields {\n    /** Docs */\n    #foo = 1;\n}\n\nexport abstract class Abstract {\n    abstract needsImpl(): number;\n}\n\n// TS 4.2\nexport type AbstractMe = abstract new () => Abstract;\n"
  },
  {
    "path": "src/test/converter/class/constructor-properties.ts",
    "content": "/**\n * A class with constructor properties.\n */\nexport class Vector2 {\n    /**\n     * @param x  X component of the Vector\n     * @param y  Y component of the Vector\n     * @param name Vector name\n     */\n    constructor(\n        public x: number,\n        public y: number,\n        readonly name: string,\n    ) {}\n}\n\n/**\n * A class with inherited and overwritten constructor properties.\n */\nexport class Vector3 extends Vector2 {\n    /**\n     * @param x  X component of the Vector\n     * @param y  Y component of the Vector\n     * @param z  Z component of the Vector\n     * @param name Vector name\n     */\n    constructor(\n        x: number,\n        public y: number,\n        public z: number,\n        readonly name: string,\n    ) {\n        super(x, y, name);\n    }\n}\n\nexport {};\n"
  },
  {
    "path": "src/test/converter/class/decorators.ts",
    "content": "/**\n * A decorated class.\n */\n@decoratorWithOptions({\n    name: \"Name of class\",\n})\nexport class DecoratedClass {\n    /**\n     * A decorated method.\n     */\n    @decoratorAtom\n    @decoratorWithParam(false)\n    decoratedMethod() {}\n}\n\n/**\n * A decorator with no options.\n */\nexport function decoratorAtom(\n    target: Object,\n    propertyKey: string | symbol,\n    descriptor: TypedPropertyDescriptor<any>,\n) {\n    target[propertyKey].writable = true;\n}\n\n/**\n * A decorator with a parameter.\n *\n * @param value  The parameter of this decorator.\n */\nexport function decoratorWithParam(value: boolean): MethodDecorator {\n    return function (\n        target: Object,\n        propertyKey: string | symbol,\n        descriptor: TypedPropertyDescriptor<any>,\n    ) {\n        target[propertyKey].enumerable = value;\n    };\n}\n\n/**\n * A decorator consuming an options object.\n *\n * @param options  The options object of this decorator.\n * @param options.name  A property on the options object of this decorator.\n */\nexport function decoratorWithOptions(options: {\n    name: string;\n}): ClassDecorator {\n    return function (target) {\n        (target as any).options = options;\n    };\n}\n"
  },
  {
    "path": "src/test/converter/class/events-overloads.ts",
    "content": "/**\n * Encapsulates some information for background http transfers.\n *\n * @see https://github.com/TypeStrong/typedoc/issues/136\n */\nexport interface Test {\n    /**\n     * Subscribe for a general event by name.\n     *\n     * @event\n     * @param event The name of the event to subscribe for.\n     * @param handler The handler called when the event occurs.\n     */\n    on(event: string, handler: (e: any) => void): void;\n\n    /**\n     * Subscribe for error notifications.\n     *\n     * @event\n     * @param event The name of the event to subscribe for.\n     * @param handler A handler that will receive the error details\n     */\n    on(event: \"error\", handler: (e: any) => void): void;\n\n    /**\n     * Subscribe for progress notifications.\n     *\n     * @event\n     * @param event The name of the event to subscribe for.\n     * @param handler A handler that will receive a progress event with the current and expected total bytes\n     */\n    on(event: \"progress\", handler: (e: any) => void): void;\n\n    /**\n     * Subscribe for success notification.\n     *\n     * @event\n     * @param event The name of the event to subscribe for.\n     * @param handler A function that will be called with general event data upon successful completion\n     */\n    on(event: \"complete\", handler: (e: any) => void): void;\n}\n"
  },
  {
    "path": "src/test/converter/class/events.ts",
    "content": "export class EventDispatcher {\n    /**\n     * This is an event documentation.\n     * @event\n     */\n    static EVENT_CLICK = \"click\";\n}\n"
  },
  {
    "path": "src/test/converter/class/generic-class.ts",
    "content": "/**\n * GenericClass short text.\n * @param T  Generic parameter.\n */\nexport class GenericClass<T> {\n    /**\n     * Generic property.\n     */\n    protected value: T;\n\n    /**\n     * Generic property array.\n     */\n    protected values: T[];\n\n    /**\n     * Constructor short text.\n     * @param value  Constructor parameter.\n     */\n    constructor(value: T) {\n        this.value = value;\n    }\n\n    /**\n     * getValue short text.\n     * @return Return value comment.\n     */\n    getValue(): T {\n        return this.value;\n    }\n}\n\n/**\n * NonGenericClass short text.\n */\nexport class NonGenericClass extends GenericClass<string> {}\n"
  },
  {
    "path": "src/test/converter/class/getter-setter.ts",
    "content": "export class GetterSetter {\n    private _name: string;\n\n    get name(): string {\n        return this._name;\n    }\n    set name(value: string) {\n        this._name = value;\n    }\n\n    get readOnlyName(): string {\n        return this._name;\n    }\n\n    set writeOnlyName(value: string) {\n        this._name = value;\n    }\n\n    /**\n     * Accessor comment\n     */\n    accessor autoAccessor: string;\n}\n\nexport interface Ts51UnrelatedAccessorTypes {\n    get prop(): 1;\n    set prop(value: 2);\n}\n\nexport {};\n"
  },
  {
    "path": "src/test/converter/class/specs-with-lump-categories.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"class\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"access\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 8,\n                    \"name\": \"PrivateClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {\n                        \"isPrivate\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class that is documented as being private.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 13,\n                            \"name\": \"fakePrivateProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A variable that is made private via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 34,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L34\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 14,\n                            \"name\": \"fakeProtectedProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A variable that is made protected via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 40,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L40\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 9,\n                            \"name\": \"privateStaticGetter\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {\n                                \"isPrivate\": true,\n                                \"isStatic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 59,\n                                    \"character\": 23,\n                                    \"url\": \"typedoc://access.ts#L59\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 10,\n                                \"name\": \"privateStaticGetter\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"access.ts\",\n                                        \"line\": 59,\n                                        \"character\": 23,\n                                        \"url\": \"typedoc://access.ts#L59\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"number\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 15,\n                            \"name\": \"fakePrivateMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 46,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L46\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 16,\n                                    \"name\": \"fakePrivateMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isPrivate\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A function that is made private via comment.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"access.ts\",\n                                            \"line\": 46,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://access.ts#L46\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 17,\n                            \"name\": \"fakeProtectedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 52,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L52\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 18,\n                                    \"name\": \"fakeProtectedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isProtected\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A function that is made protected via comment.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"access.ts\",\n                                            \"line\": 52,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://access.ts#L52\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 19,\n                            \"name\": \"privateArrow\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 54,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://access.ts#L54\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 20,\n                                    \"name\": \"privateArrow\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"access.ts\",\n                                            \"line\": 54,\n                                            \"character\": 27,\n                                            \"url\": \"typedoc://access.ts#L54\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                13,\n                                14\n                            ]\n                        },\n                        {\n                            \"title\": \"Accessors\",\n                            \"children\": [\n                                9\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                15,\n                                17,\n                                19\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 29,\n                            \"character\": 13,\n                            \"url\": \"typedoc://access.ts#L29\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"fakePrivateVariable\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isPrivate\": true,\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A variable that is made private via comment.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 5,\n                            \"character\": 13,\n                            \"url\": \"typedoc://access.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": \"test\"\n                    },\n                    \"defaultValue\": \"\\\"test\\\"\"\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"fakeProtectedVariable\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isProtected\": true,\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A variable that is made protected via comment.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 11,\n                            \"character\": 13,\n                            \"url\": \"typedoc://access.ts#L11\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": \"test\"\n                    },\n                    \"defaultValue\": \"\\\"test\\\"\"\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"fakePrivateFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {\n                        \"isPrivate\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 17,\n                            \"character\": 16,\n                            \"url\": \"typedoc://access.ts#L17\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"fakePrivateFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A function that is made private via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 17,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://access.ts#L17\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"fakeProtectedFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {\n                        \"isProtected\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 23,\n                            \"character\": 16,\n                            \"url\": \"typedoc://access.ts#L23\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 5,\n                            \"name\": \"fakeProtectedFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A function that is made protected via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 23,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://access.ts#L23\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        8\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        6,\n                        7\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        2,\n                        4\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"access.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://access.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 21,\n            \"name\": \"class\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 60,\n                    \"name\": \"TestSubClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 4,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 61,\n                            \"name\": \"staticMergedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 64,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 113,\n                                    \"character\": 20,\n                                    \"url\": \"typedoc://class.ts#L113\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 62,\n                                    \"name\": \"staticMergedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"staticMergedMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 113,\n                                            \"character\": 20,\n                                            \"url\": \"typedoc://class.ts#L113\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Functions\",\n                            \"children\": [\n                                61\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 61,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L61\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 102,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L102\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 109,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L109\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 86,\n                    \"name\": \"Abstract\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {\n                        \"isAbstract\": true\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 87,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 88,\n                                    \"name\": \"Abstract\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 86,\n                                        \"name\": \"Abstract\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 89,\n                            \"name\": \"needsImpl\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isAbstract\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 131,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://class.ts#L131\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 90,\n                                    \"name\": \"needsImpl\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 131,\n                                            \"character\": 13,\n                                            \"url\": \"typedoc://class.ts#L131\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                87\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                89\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 130,\n                            \"character\": 22,\n                            \"url\": \"typedoc://class.ts#L130\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 75,\n                    \"name\": \"ComputedNames\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 76,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 77,\n                                    \"name\": \"ComputedNames\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 75,\n                                        \"name\": \"ComputedNames\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 80,\n                            \"name\": \"[toStringTag]\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 119,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L119\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"defaultValue\": \"\\\"computed\\\"\"\n                        },\n                        {\n                            \"id\": 81,\n                            \"name\": \"literal\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 120,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L120\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            },\n                            \"defaultValue\": \"true\"\n                        },\n                        {\n                            \"id\": 78,\n                            \"name\": \"literal2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 121,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L121\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            },\n                            \"defaultValue\": \"true\"\n                        },\n                        {\n                            \"id\": 79,\n                            \"name\": \"y\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 122,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L122\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            },\n                            \"defaultValue\": \"false\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                76\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                80,\n                                81,\n                                78,\n                                79\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 118,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L118\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 63,\n                    \"name\": \"TestAbstractClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {\n                        \"isAbstract\": true\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 64,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 65,\n                                    \"name\": \"TestAbstractClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 63,\n                                        \"name\": \"TestAbstractClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 66,\n                            \"name\": \"myAbstractProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isAbstract\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 91,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://class.ts#L91\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 67,\n                            \"name\": \"myAbstractMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true,\n                                \"isAbstract\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 93,\n                                    \"character\": 23,\n                                    \"url\": \"typedoc://class.ts#L93\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 68,\n                                    \"name\": \"myAbstractMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 93,\n                                            \"character\": 23,\n                                            \"url\": \"typedoc://class.ts#L93\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                64\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                66\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                67\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 90,\n                            \"character\": 22,\n                            \"url\": \"typedoc://class.ts#L90\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 69,\n                            \"name\": \"TestAbstractClassImplementation\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 69,\n                    \"name\": \"TestAbstractClassImplementation\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 70,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 71,\n                                    \"name\": \"TestAbstractClassImplementation\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 69,\n                                        \"name\": \"TestAbstractClassImplementation\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 65,\n                                        \"name\": \"TestAbstractClass.constructor\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 64,\n                                \"name\": \"TestAbstractClass.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 72,\n                            \"name\": \"myAbstractProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 97,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L97\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 66,\n                                \"name\": \"TestAbstractClass.myAbstractProperty\"\n                            }\n                        },\n                        {\n                            \"id\": 73,\n                            \"name\": \"myAbstractMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 99,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://class.ts#L99\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 74,\n                                    \"name\": \"myAbstractMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 99,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://class.ts#L99\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 68,\n                                        \"name\": \"TestAbstractClass.myAbstractMethod\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 67,\n                                \"name\": \"TestAbstractClass.myAbstractMethod\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                70\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                72\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                73\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 96,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L96\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 63,\n                            \"name\": \"TestAbstractClass\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 22,\n                    \"name\": \"TestClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"TestClass comment short text.\\n\\nTestClass comment text.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"inline-tag\",\n                                        \"tag\": \"@link\",\n                                        \"text\": \"TestClass\",\n                                        \"target\": 22\n                                    },\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \" @ fixtures\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 26,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 27,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L27\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 27,\n                                    \"name\": \"TestClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 27,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://class.ts#L27\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 22,\n                                        \"name\": \"TestClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 29,\n                            \"name\": \"privateProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"privateProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 17,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://class.ts#L17\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"number\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 28,\n                            \"name\": \"publicProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"publicProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 12,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 23,\n                            \"name\": \"staticProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"staticProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 22,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 22,\n                                \"name\": \"TestClass\",\n                                \"package\": \"typedoc\"\n                            }\n                        },\n                        {\n                            \"id\": 36,\n                            \"name\": \"arrowMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 58,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L58\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"arrowMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"arrow method\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 58,\n                                            \"character\": 18,\n                                            \"url\": \"typedoc://class.ts#L58\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 34,\n                            \"name\": \"privateMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 48,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://class.ts#L48\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 35,\n                                    \"name\": \"privateMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"privateMethod short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"AnotherTest\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 48,\n                                            \"character\": 12,\n                                            \"url\": \"typedoc://class.ts#L48\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 32,\n                            \"name\": \"protectedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 41,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://class.ts#L41\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 33,\n                                    \"name\": \"protectedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"protectedMethod short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Test\"\n                                                    }\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"AnotherTest\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 41,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://class.ts#L41\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 30,\n                            \"name\": \"publicMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 34,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L34\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 31,\n                                    \"name\": \"publicMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"publicMethod short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"AnotherTest\"\n                                                    }\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Test\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 34,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L34\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 24,\n                            \"name\": \"staticMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 53,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L53\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 25,\n                                    \"name\": \"staticMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"staticMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 53,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L53\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                26\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                29,\n                                28,\n                                23\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                36,\n                                34,\n                                32,\n                                30,\n                                24\n                            ]\n                        }\n                    ],\n                    \"categories\": [\n                        {\n                            \"title\": \"AnotherTest\",\n                            \"children\": [\n                                34,\n                                32,\n                                30\n                            ]\n                        },\n                        {\n                            \"title\": \"Other\",\n                            \"children\": [\n                                26,\n                                29,\n                                28,\n                                23,\n                                36,\n                                24\n                            ]\n                        },\n                        {\n                            \"title\": \"Test\",\n                            \"children\": [\n                                32,\n                                30\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L8\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 38,\n                            \"name\": \"TestSubClass\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"TestSubClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"TestClass comment short text.\\n\\nTestClass comment text.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"inline-tag\",\n                                        \"tag\": \"@link\",\n                                        \"text\": \"TestClass\",\n                                        \"target\": 22\n                                    },\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \" @ fixtures\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 42,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 80,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L80\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 43,\n                                    \"name\": \"TestSubClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 80,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://class.ts#L80\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 44,\n                                            \"name\": \"p1\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Constructor param\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 45,\n                                            \"name\": \"p2\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Private string property\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 46,\n                                            \"name\": \"p3\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Public number property\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 47,\n                                            \"name\": \"p4\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Public implicit any property\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 38,\n                                        \"name\": \"TestSubClass\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 27,\n                                        \"name\": \"TestClass.constructor\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 26,\n                                \"name\": \"TestClass.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 52,\n                            \"name\": \"p2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Private string property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 82,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://class.ts#L82\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 53,\n                            \"name\": \"p3\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Public number property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 83,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://class.ts#L83\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        },\n                        {\n                            \"id\": 54,\n                            \"name\": \"p4\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Public implicit any property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 84,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://class.ts#L84\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"any\"\n                            }\n                        },\n                        {\n                            \"id\": 57,\n                            \"name\": \"publicProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"publicProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 12,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 28,\n                                \"name\": \"TestClass.publicProperty\"\n                            }\n                        },\n                        {\n                            \"id\": 39,\n                            \"name\": \"staticProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"staticProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 22,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 22,\n                                \"name\": \"TestClass\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 23,\n                                \"name\": \"TestClass.staticProperty\"\n                            }\n                        },\n                        {\n                            \"id\": 58,\n                            \"name\": \"arrowMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 58,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L58\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 59,\n                                    \"name\": \"arrowMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isInherited\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"arrow method\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 58,\n                                            \"character\": 18,\n                                            \"url\": \"typedoc://class.ts#L58\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 37,\n                                        \"name\": \"TestClass.arrowMethod\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 36,\n                                \"name\": \"TestClass.arrowMethod\"\n                            }\n                        },\n                        {\n                            \"id\": 55,\n                            \"name\": \"mergedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 106,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L106\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 56,\n                                    \"name\": \"mergedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"mergedMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 106,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://class.ts#L106\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 50,\n                            \"name\": \"protectedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 70,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://class.ts#L70\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 51,\n                                    \"name\": \"protectedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"protectedMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 70,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://class.ts#L70\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 33,\n                                        \"name\": \"TestClass.protectedMethod\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 32,\n                                \"name\": \"TestClass.protectedMethod\"\n                            }\n                        },\n                        {\n                            \"id\": 48,\n                            \"name\": \"publicMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 65,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L65\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 49,\n                                    \"name\": \"publicMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"publicMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 65,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L65\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 31,\n                                        \"name\": \"TestClass.publicMethod\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 30,\n                                \"name\": \"TestClass.publicMethod\"\n                            }\n                        },\n                        {\n                            \"id\": 40,\n                            \"name\": \"staticMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isStatic\": true,\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 53,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L53\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"staticMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isInherited\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"staticMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 53,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L53\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 25,\n                                        \"name\": \"TestClass.staticMethod\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 24,\n                                \"name\": \"TestClass.staticMethod\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                42\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                52,\n                                53,\n                                54,\n                                57,\n                                39\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                58,\n                                55,\n                                50,\n                                48,\n                                40\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 61,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L61\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 102,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L102\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 109,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L109\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 22,\n                            \"name\": \"TestClass\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 82,\n                    \"name\": \"Ts38PrivateFields\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 83,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 84,\n                                    \"name\": \"Ts38PrivateFields\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 82,\n                                        \"name\": \"Ts38PrivateFields\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 85,\n                            \"name\": \"#foo\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Docs\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 127,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L127\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"defaultValue\": \"1\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                83\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                85\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 125,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L125\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 91,\n                    \"name\": \"AbstractMe\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 135,\n                            \"character\": 12,\n                            \"url\": \"typedoc://class.ts#L135\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 92,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 135,\n                                    \"character\": 25,\n                                    \"url\": \"typedoc://class.ts#L135\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 93,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {\n                                        \"isAbstract\": true\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 86,\n                                        \"name\": \"Abstract\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Namespaces\",\n                    \"children\": [\n                        60\n                    ]\n                },\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        86,\n                        75,\n                        63,\n                        69,\n                        22,\n                        38,\n                        82\n                    ]\n                },\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        91\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"class.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://class.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 94,\n            \"name\": \"constructor-properties\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 95,\n                    \"name\": \"Vector2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class with constructor properties.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 96,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://constructor-properties.ts#L10\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 97,\n                                    \"name\": \"Vector2\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-properties.ts\",\n                                            \"line\": 10,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-properties.ts#L10\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 98,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"X component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 99,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Y component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 100,\n                                            \"name\": \"name\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Vector name\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 95,\n                                        \"name\": \"Vector2\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 103,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isReadonly\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Vector name\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 13,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://constructor-properties.ts#L13\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 101,\n                            \"name\": \"x\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"X component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 11,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L11\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        },\n                        {\n                            \"id\": 102,\n                            \"name\": \"y\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Y component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 12,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                96\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                103,\n                                101,\n                                102\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"constructor-properties.ts\",\n                            \"line\": 4,\n                            \"character\": 13,\n                            \"url\": \"typedoc://constructor-properties.ts#L4\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 104,\n                            \"name\": \"Vector3\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 104,\n                    \"name\": \"Vector3\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class with inherited and overwritten constructor properties.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 105,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 27,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://constructor-properties.ts#L27\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 106,\n                                    \"name\": \"Vector3\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-properties.ts\",\n                                            \"line\": 27,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-properties.ts#L27\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 107,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"X component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 108,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Y component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 109,\n                                            \"name\": \"z\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Z component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 110,\n                                            \"name\": \"name\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Vector name\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 104,\n                                        \"name\": \"Vector3\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 97,\n                                        \"name\": \"Vector2.constructor\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 96,\n                                \"name\": \"Vector2.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 113,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isReadonly\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Vector name\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 31,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://constructor-properties.ts#L31\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 103,\n                                \"name\": \"Vector2.name\"\n                            }\n                        },\n                        {\n                            \"id\": 114,\n                            \"name\": \"x\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"X component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 11,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L11\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 101,\n                                \"name\": \"Vector2.x\"\n                            }\n                        },\n                        {\n                            \"id\": 111,\n                            \"name\": \"y\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Y component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 29,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L29\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 102,\n                                \"name\": \"Vector2.y\"\n                            }\n                        },\n                        {\n                            \"id\": 112,\n                            \"name\": \"z\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Z component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 30,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L30\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                105\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                113,\n                                114,\n                                111,\n                                112\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"constructor-properties.ts\",\n                            \"line\": 20,\n                            \"character\": 13,\n                            \"url\": \"typedoc://constructor-properties.ts#L20\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 95,\n                            \"name\": \"Vector2\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        95,\n                        104\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"constructor-properties.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://constructor-properties.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 115,\n            \"name\": \"decorators\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 129,\n                    \"name\": \"DecoratedClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A decorated class.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 130,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 131,\n                                    \"name\": \"DecoratedClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 129,\n                                        \"name\": \"DecoratedClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 132,\n                            \"name\": \"decoratedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 13,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://decorators.ts#L13\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 133,\n                                    \"name\": \"decoratedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A decorated method.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"decorators.ts\",\n                                            \"line\": 13,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://decorators.ts#L13\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                130\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                132\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 7,\n                            \"character\": 13,\n                            \"url\": \"typedoc://decorators.ts#L7\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 116,\n                    \"name\": \"decoratorAtom\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 19,\n                            \"character\": 16,\n                            \"url\": \"typedoc://decorators.ts#L19\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 117,\n                            \"name\": \"decoratorAtom\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A decorator with no options.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 19,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://decorators.ts#L19\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 118,\n                                    \"name\": \"target\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                                            \"qualifiedName\": \"Object\"\n                                        },\n                                        \"name\": \"Object\",\n                                        \"package\": \"typescript\"\n                                    }\n                                },\n                                {\n                                    \"id\": 119,\n                                    \"name\": \"propertyKey\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"union\",\n                                        \"types\": [\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            },\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"symbol\"\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"id\": 120,\n                                    \"name\": \"descriptor\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                                            \"qualifiedName\": \"TypedPropertyDescriptor\"\n                                        },\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        ],\n                                        \"name\": \"TypedPropertyDescriptor\",\n                                        \"package\": \"typescript\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 124,\n                    \"name\": \"decoratorWithOptions\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 48,\n                            \"character\": 16,\n                            \"url\": \"typedoc://decorators.ts#L48\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 125,\n                            \"name\": \"decoratorWithOptions\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A decorator consuming an options object.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 48,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://decorators.ts#L48\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 126,\n                                    \"name\": \"options\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The options object of this decorator.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 127,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 128,\n                                                    \"name\": \"name\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"comment\": {\n                                                        \"summary\": [\n                                                            {\n                                                                \"kind\": \"text\",\n                                                                \"text\": \"A property on the options object of this decorator.\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"decorators.ts\",\n                                                            \"line\": 49,\n                                                            \"character\": 4,\n                                                            \"url\": \"typedoc://decorators.ts#L49\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        128\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": {\n                                    \"packageName\": \"typescript\",\n                                    \"packagePath\": \"lib/lib.decorators.legacy.d.ts\",\n                                    \"qualifiedName\": \"ClassDecorator\"\n                                },\n                                \"name\": \"ClassDecorator\",\n                                \"package\": \"typescript\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 121,\n                    \"name\": \"decoratorWithParam\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 32,\n                            \"character\": 16,\n                            \"url\": \"typedoc://decorators.ts#L32\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 122,\n                            \"name\": \"decoratorWithParam\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A decorator with a parameter.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 32,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://decorators.ts#L32\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 123,\n                                    \"name\": \"value\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The parameter of this decorator.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": {\n                                    \"packageName\": \"typescript\",\n                                    \"packagePath\": \"lib/lib.decorators.legacy.d.ts\",\n                                    \"qualifiedName\": \"MethodDecorator\"\n                                },\n                                \"name\": \"MethodDecorator\",\n                                \"package\": \"typescript\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        129\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        116,\n                        124,\n                        121\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"decorators.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://decorators.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 161,\n            \"name\": \"events\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 162,\n                    \"name\": \"EventDispatcher\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 164,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 165,\n                                    \"name\": \"EventDispatcher\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 162,\n                                        \"name\": \"EventDispatcher\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 163,\n                            \"name\": \"EVENT_CLICK\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is an event documentation.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@group\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Events\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"events.ts\",\n                                    \"line\": 6,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://events.ts#L6\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"defaultValue\": \"\\\"click\\\"\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                164\n                            ]\n                        },\n                        {\n                            \"title\": \"Events\",\n                            \"children\": [\n                                163\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"events.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://events.ts#L1\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        162\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"events.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://events.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 134,\n            \"name\": \"events-overloads\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 135,\n                    \"name\": \"Test\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Encapsulates some information for background http transfers.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"https://github.com/TypeStrong/typedoc/issues/136\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 136,\n                            \"name\": \"on\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 14,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L14\"\n                                },\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 23,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L23\"\n                                },\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 32,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L32\"\n                                },\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 41,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L41\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 137,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for a general event by name.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 14,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L14\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 138,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 139,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The handler called when the event occurs.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 140,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 141,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 142,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                },\n                                {\n                                    \"id\": 143,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for error notifications.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 23,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L23\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 144,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"literal\",\n                                                \"value\": \"error\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 145,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"A handler that will receive the error details\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 146,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 147,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 148,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                },\n                                {\n                                    \"id\": 149,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for progress notifications.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 32,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L32\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 150,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"literal\",\n                                                \"value\": \"progress\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 151,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"A handler that will receive a progress event with the current and expected total bytes\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 152,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 153,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 154,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                },\n                                {\n                                    \"id\": 155,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for success notification.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 41,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L41\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 156,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"literal\",\n                                                \"value\": \"complete\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 157,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"A function that will be called with general event data upon successful completion\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 158,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 159,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 160,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Events\",\n                            \"children\": [\n                                136\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"events-overloads.ts\",\n                            \"line\": 6,\n                            \"character\": 17,\n                            \"url\": \"typedoc://events-overloads.ts#L6\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        135\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"events-overloads.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://events-overloads.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 166,\n            \"name\": \"generic-class\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 167,\n                    \"name\": \"GenericClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"GenericClass short text.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 169,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 20,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L20\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 170,\n                                    \"name\": \"GenericClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 20,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L20\"\n                                        }\n                                    ],\n                                    \"typeParameters\": [\n                                        {\n                                            \"id\": 171,\n                                            \"name\": \"T\",\n                                            \"variant\": \"typeParam\",\n                                            \"kind\": 131072,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Generic parameter.\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 172,\n                                            \"name\": \"value\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Constructor parameter.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 168,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"GenericClass.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 167,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 168,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"GenericClass.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"GenericClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 173,\n                            \"name\": \"value\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 9,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L9\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 168,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"qualifiedName\": \"GenericClass.T\",\n                                \"refersToTypeParameter\": true\n                            }\n                        },\n                        {\n                            \"id\": 174,\n                            \"name\": \"values\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property array.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 14,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 168,\n                                    \"name\": \"T\",\n                                    \"package\": \"typedoc\",\n                                    \"qualifiedName\": \"GenericClass.T\",\n                                    \"refersToTypeParameter\": true\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 175,\n                            \"name\": \"getValue\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 28,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L28\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 176,\n                                    \"name\": \"getValue\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"getValue short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@returns\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Return value comment.\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 28,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 168,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"GenericClass.T\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                169\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                173,\n                                174\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                175\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-class.ts\",\n                            \"line\": 5,\n                            \"character\": 13,\n                            \"url\": \"typedoc://generic-class.ts#L5\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 168,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic parameter.\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 177,\n                            \"name\": \"NonGenericClass\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 177,\n                    \"name\": \"NonGenericClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"NonGenericClass short text.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 178,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 20,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L20\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 179,\n                                    \"name\": \"NonGenericClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 20,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L20\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 180,\n                                            \"name\": \"value\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Constructor parameter.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 177,\n                                        \"name\": \"NonGenericClass\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 170,\n                                        \"name\": \"GenericClass.constructor\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 169,\n                                \"name\": \"GenericClass.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 181,\n                            \"name\": \"value\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 9,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L9\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 173,\n                                \"name\": \"GenericClass.value\"\n                            }\n                        },\n                        {\n                            \"id\": 182,\n                            \"name\": \"values\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property array.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 14,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 174,\n                                \"name\": \"GenericClass.values\"\n                            }\n                        },\n                        {\n                            \"id\": 183,\n                            \"name\": \"getValue\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 28,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L28\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 184,\n                                    \"name\": \"getValue\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isInherited\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"getValue short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@returns\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Return value comment.\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 28,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 176,\n                                        \"name\": \"GenericClass.getValue\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 175,\n                                \"name\": \"GenericClass.getValue\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                178\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                181,\n                                182\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                183\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-class.ts\",\n                            \"line\": 36,\n                            \"character\": 13,\n                            \"url\": \"typedoc://generic-class.ts#L36\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 167,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            ],\n                            \"name\": \"GenericClass\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        167,\n                        177\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"generic-class.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://generic-class.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 185,\n            \"name\": \"getter-setter\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 186,\n                    \"name\": \"GetterSetter\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 187,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 188,\n                                    \"name\": \"GetterSetter\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 186,\n                                        \"name\": \"GetterSetter\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 189,\n                            \"name\": \"_name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 2,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://getter-setter.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 199,\n                            \"name\": \"autoAccessor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Accessor comment\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 22,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://getter-setter.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 190,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 4,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L4\"\n                                },\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 7,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L7\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 191,\n                                \"name\": \"name\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 4,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L4\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            },\n                            \"setSignature\": {\n                                \"id\": 192,\n                                \"name\": \"name\",\n                                \"variant\": \"signature\",\n                                \"kind\": 1048576,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 7,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L7\"\n                                    }\n                                ],\n                                \"parameters\": [\n                                    {\n                                        \"id\": 193,\n                                        \"name\": \"value\",\n                                        \"variant\": \"param\",\n                                        \"kind\": 32768,\n                                        \"flags\": {},\n                                        \"type\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"void\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 194,\n                            \"name\": \"readOnlyName\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 11,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L11\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 195,\n                                \"name\": \"readOnlyName\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 11,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L11\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 196,\n                            \"name\": \"writeOnlyName\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 15,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L15\"\n                                }\n                            ],\n                            \"setSignature\": {\n                                \"id\": 197,\n                                \"name\": \"writeOnlyName\",\n                                \"variant\": \"signature\",\n                                \"kind\": 1048576,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 15,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L15\"\n                                    }\n                                ],\n                                \"parameters\": [\n                                    {\n                                        \"id\": 198,\n                                        \"name\": \"value\",\n                                        \"variant\": \"param\",\n                                        \"kind\": 32768,\n                                        \"flags\": {},\n                                        \"type\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"void\"\n                                }\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                187\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                189\n                            ]\n                        },\n                        {\n                            \"title\": \"Accessors\",\n                            \"children\": [\n                                199,\n                                190,\n                                194,\n                                196\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"getter-setter.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://getter-setter.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 200,\n                    \"name\": \"Ts51UnrelatedAccessorTypes\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 201,\n                            \"name\": \"prop\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 26,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L26\"\n                                },\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 27,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L27\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 202,\n                                \"name\": \"prop\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 26,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L26\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 1\n                                }\n                            },\n                            \"setSignature\": {\n                                \"id\": 203,\n                                \"name\": \"prop\",\n                                \"variant\": \"signature\",\n                                \"kind\": 1048576,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 27,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L27\"\n                                    }\n                                ],\n                                \"parameters\": [\n                                    {\n                                        \"id\": 204,\n                                        \"name\": \"value\",\n                                        \"variant\": \"param\",\n                                        \"kind\": 32768,\n                                        \"flags\": {},\n                                        \"type\": {\n                                            \"type\": \"literal\",\n                                            \"value\": 2\n                                        }\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"void\"\n                                }\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Accessors\",\n                            \"children\": [\n                                201\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"getter-setter.ts\",\n                            \"line\": 25,\n                            \"character\": 17,\n                            \"url\": \"typedoc://getter-setter.ts#L25\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        186\n                    ]\n                },\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        200\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"getter-setter.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://getter-setter.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 205,\n            \"name\": \"type-operator\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 211,\n                    \"name\": \"GenericClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 213,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 214,\n                                    \"name\": \"GenericClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"typeParameters\": [\n                                        {\n                                            \"id\": 215,\n                                            \"name\": \"T\",\n                                            \"variant\": \"typeParam\",\n                                            \"kind\": 131072,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"typeOperator\",\n                                                \"operator\": \"keyof\",\n                                                \"target\": {\n                                                    \"type\": \"reference\",\n                                                    \"target\": 206,\n                                                    \"name\": \"TestClass\",\n                                                    \"package\": \"typedoc\"\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 211,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 212,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"GenericClass.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"GenericClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 216,\n                            \"name\": \"c\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 14,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 212,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"qualifiedName\": \"GenericClass.T\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                213\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                216\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 13,\n                            \"character\": 13,\n                            \"url\": \"typedoc://type-operator.ts#L13\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 212,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"typeOperator\",\n                                \"operator\": \"keyof\",\n                                \"target\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 206,\n                                    \"name\": \"TestClass\",\n                                    \"package\": \"typedoc\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 206,\n                    \"name\": \"TestClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"TestClass comment short text.\\n\\nTestClass comment text.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"inline-tag\",\n                                        \"tag\": \"@link\",\n                                        \"text\": \"TestClass\",\n                                        \"target\": 206\n                                    },\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \" @ fixtures\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 207,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 208,\n                                    \"name\": \"TestClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 206,\n                                        \"name\": \"TestClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 209,\n                            \"name\": \"a\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 9,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L9\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 210,\n                            \"name\": \"b\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L10\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                207\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                209,\n                                210\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://type-operator.ts#L8\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        211,\n                        206\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"type-operator.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://type-operator.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                21,\n                94,\n                115,\n                161,\n                134,\n                166,\n                185,\n                205\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakePrivateFunction\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakePrivateFunction\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakeProtectedFunction\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakeProtectedFunction\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakePrivateVariable\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakeProtectedVariable\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateStaticGetter\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateStaticGetter\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakePrivateProperty\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakeProtectedProperty\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakePrivateMethod\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakePrivateMethod\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakeProtectedMethod\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakeProtectedMethod\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateArrow\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateArrow\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticProperty\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.__constructor\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicProperty\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.privateProperty\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicMethod\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicMethod\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.protectedMethod\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.protectedMethod\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.privateMethod\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.privateMethod\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticProperty\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.__constructor\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p1\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p2\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p3\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p4\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.publicMethod\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.publicMethod\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.protectedMethod\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.protectedMethod\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.p2\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.p3\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.p4\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.mergedMethod\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.mergedMethod\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicProperty\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.staticMergedMethod\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.staticMergedMethod\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass.myAbstractProperty\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass.myAbstractMethod\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass.myAbstractMethod\"\n        },\n        \"69\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation.myAbstractProperty\"\n        },\n        \"73\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation.myAbstractMethod\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation.myAbstractMethod\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.literal2\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.y\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.[toStringTag]\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.literal\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Ts38PrivateFields\"\n        },\n        \"85\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Ts38PrivateFields.#foo\"\n        },\n        \"86\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Abstract\"\n        },\n        \"89\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Abstract.needsImpl\"\n        },\n        \"90\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Abstract.needsImpl\"\n        },\n        \"91\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"AbstractMe\"\n        },\n        \"92\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"93\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"94\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"95\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2\"\n        },\n        \"96\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.__constructor\"\n        },\n        \"97\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2\"\n        },\n        \"98\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"99\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"100\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"name\"\n        },\n        \"101\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.x\"\n        },\n        \"102\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.y\"\n        },\n        \"103\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.name\"\n        },\n        \"104\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3\"\n        },\n        \"105\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.__constructor\"\n        },\n        \"106\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3\"\n        },\n        \"107\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"108\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"109\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"110\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"name\"\n        },\n        \"111\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.y\"\n        },\n        \"112\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.z\"\n        },\n        \"113\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.name\"\n        },\n        \"114\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.x\"\n        },\n        \"115\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"116\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorAtom\"\n        },\n        \"117\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorAtom\"\n        },\n        \"118\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"target\"\n        },\n        \"119\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"propertyKey\"\n        },\n        \"120\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"descriptor\"\n        },\n        \"121\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithParam\"\n        },\n        \"122\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithParam\"\n        },\n        \"123\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"124\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithOptions\"\n        },\n        \"125\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithOptions\"\n        },\n        \"126\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"options\"\n        },\n        \"127\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"128\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"__type.name\"\n        },\n        \"129\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"DecoratedClass\"\n        },\n        \"132\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"DecoratedClass.decoratedMethod\"\n        },\n        \"133\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"DecoratedClass.decoratedMethod\"\n        },\n        \"134\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"135\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test\"\n        },\n        \"136\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"137\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"138\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"139\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"140\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"141\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"142\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"143\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"144\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"145\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"146\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"147\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"148\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"149\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"150\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"151\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"152\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"153\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"154\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"155\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"156\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"157\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"158\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"159\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"160\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"161\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"162\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events.ts\",\n            \"qualifiedName\": \"EventDispatcher\"\n        },\n        \"163\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events.ts\",\n            \"qualifiedName\": \"EventDispatcher.EVENT_CLICK\"\n        },\n        \"166\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"167\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass\"\n        },\n        \"168\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"169\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.__constructor\"\n        },\n        \"170\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass\"\n        },\n        \"171\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"172\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"173\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.value\"\n        },\n        \"174\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.values\"\n        },\n        \"175\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"176\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"177\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"NonGenericClass\"\n        },\n        \"178\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.__constructor\"\n        },\n        \"179\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"NonGenericClass\"\n        },\n        \"180\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"181\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.value\"\n        },\n        \"182\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.values\"\n        },\n        \"183\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"184\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"185\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"186\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter\"\n        },\n        \"189\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter._name\"\n        },\n        \"190\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.name\"\n        },\n        \"191\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.name\"\n        },\n        \"192\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.name\"\n        },\n        \"193\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"194\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.readOnlyName\"\n        },\n        \"195\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.readOnlyName\"\n        },\n        \"196\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.writeOnlyName\"\n        },\n        \"197\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.writeOnlyName\"\n        },\n        \"198\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"199\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.autoAccessor\"\n        },\n        \"200\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes\"\n        },\n        \"201\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes.prop\"\n        },\n        \"202\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes.prop\"\n        },\n        \"203\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes.prop\"\n        },\n        \"204\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"205\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"206\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"TestClass\"\n        },\n        \"209\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"TestClass.a\"\n        },\n        \"210\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"TestClass.b\"\n        },\n        \"211\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass\"\n        },\n        \"212\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"215\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"216\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass.c\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/class/access.ts\",\n            \"2\": \"src/test/converter/class/class.ts\",\n            \"3\": \"src/test/converter/class/constructor-properties.ts\",\n            \"4\": \"src/test/converter/class/decorators.ts\",\n            \"5\": \"src/test/converter/class/events-overloads.ts\",\n            \"6\": \"src/test/converter/class/events.ts\",\n            \"7\": \"src/test/converter/class/generic-class.ts\",\n            \"8\": \"src/test/converter/class/getter-setter.ts\",\n            \"9\": \"src/test/converter/class/type-operator.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 21,\n            \"3\": 94,\n            \"4\": 115,\n            \"5\": 134,\n            \"6\": 161,\n            \"7\": 166,\n            \"8\": 185,\n            \"9\": 205\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/class/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"class\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"access\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 8,\n                    \"name\": \"PrivateClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {\n                        \"isPrivate\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class that is documented as being private.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 13,\n                            \"name\": \"fakePrivateProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A variable that is made private via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 34,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L34\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 14,\n                            \"name\": \"fakeProtectedProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A variable that is made protected via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 40,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L40\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 9,\n                            \"name\": \"privateStaticGetter\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {\n                                \"isPrivate\": true,\n                                \"isStatic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 59,\n                                    \"character\": 23,\n                                    \"url\": \"typedoc://access.ts#L59\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 10,\n                                \"name\": \"privateStaticGetter\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"access.ts\",\n                                        \"line\": 59,\n                                        \"character\": 23,\n                                        \"url\": \"typedoc://access.ts#L59\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"number\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 15,\n                            \"name\": \"fakePrivateMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 46,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L46\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 16,\n                                    \"name\": \"fakePrivateMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isPrivate\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A function that is made private via comment.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"access.ts\",\n                                            \"line\": 46,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://access.ts#L46\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 17,\n                            \"name\": \"fakeProtectedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 52,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://access.ts#L52\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 18,\n                                    \"name\": \"fakeProtectedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isProtected\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A function that is made protected via comment.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"access.ts\",\n                                            \"line\": 52,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://access.ts#L52\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 19,\n                            \"name\": \"privateArrow\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 54,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://access.ts#L54\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 20,\n                                    \"name\": \"privateArrow\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"access.ts\",\n                                            \"line\": 54,\n                                            \"character\": 27,\n                                            \"url\": \"typedoc://access.ts#L54\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                13,\n                                14\n                            ]\n                        },\n                        {\n                            \"title\": \"Accessors\",\n                            \"children\": [\n                                9\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                15,\n                                17,\n                                19\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 29,\n                            \"character\": 13,\n                            \"url\": \"typedoc://access.ts#L29\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"fakePrivateVariable\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isPrivate\": true,\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A variable that is made private via comment.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 5,\n                            \"character\": 13,\n                            \"url\": \"typedoc://access.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": \"test\"\n                    },\n                    \"defaultValue\": \"\\\"test\\\"\"\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"fakeProtectedVariable\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isProtected\": true,\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A variable that is made protected via comment.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 11,\n                            \"character\": 13,\n                            \"url\": \"typedoc://access.ts#L11\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": \"test\"\n                    },\n                    \"defaultValue\": \"\\\"test\\\"\"\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"fakePrivateFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {\n                        \"isPrivate\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 17,\n                            \"character\": 16,\n                            \"url\": \"typedoc://access.ts#L17\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"fakePrivateFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A function that is made private via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 17,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://access.ts#L17\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"fakeProtectedFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {\n                        \"isProtected\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"access.ts\",\n                            \"line\": 23,\n                            \"character\": 16,\n                            \"url\": \"typedoc://access.ts#L23\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 5,\n                            \"name\": \"fakeProtectedFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A function that is made protected via comment.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"access.ts\",\n                                    \"line\": 23,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://access.ts#L23\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        8\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        6,\n                        7\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        2,\n                        4\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"access.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://access.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 21,\n            \"name\": \"class\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 60,\n                    \"name\": \"TestSubClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 4,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 61,\n                            \"name\": \"staticMergedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 64,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 113,\n                                    \"character\": 20,\n                                    \"url\": \"typedoc://class.ts#L113\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 62,\n                                    \"name\": \"staticMergedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"staticMergedMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 113,\n                                            \"character\": 20,\n                                            \"url\": \"typedoc://class.ts#L113\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Functions\",\n                            \"children\": [\n                                61\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 61,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L61\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 102,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L102\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 109,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L109\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 86,\n                    \"name\": \"Abstract\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {\n                        \"isAbstract\": true\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 87,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 88,\n                                    \"name\": \"Abstract\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 86,\n                                        \"name\": \"Abstract\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 89,\n                            \"name\": \"needsImpl\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isAbstract\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 131,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://class.ts#L131\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 90,\n                                    \"name\": \"needsImpl\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 131,\n                                            \"character\": 13,\n                                            \"url\": \"typedoc://class.ts#L131\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                87\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                89\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 130,\n                            \"character\": 22,\n                            \"url\": \"typedoc://class.ts#L130\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 75,\n                    \"name\": \"ComputedNames\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 76,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 77,\n                                    \"name\": \"ComputedNames\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 75,\n                                        \"name\": \"ComputedNames\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 80,\n                            \"name\": \"[toStringTag]\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 119,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L119\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"defaultValue\": \"\\\"computed\\\"\"\n                        },\n                        {\n                            \"id\": 81,\n                            \"name\": \"literal\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 120,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L120\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            },\n                            \"defaultValue\": \"true\"\n                        },\n                        {\n                            \"id\": 78,\n                            \"name\": \"literal2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 121,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L121\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            },\n                            \"defaultValue\": \"true\"\n                        },\n                        {\n                            \"id\": 79,\n                            \"name\": \"y\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 122,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L122\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            },\n                            \"defaultValue\": \"false\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                76\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                80,\n                                81,\n                                78,\n                                79\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 118,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L118\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 63,\n                    \"name\": \"TestAbstractClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {\n                        \"isAbstract\": true\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 64,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 65,\n                                    \"name\": \"TestAbstractClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 63,\n                                        \"name\": \"TestAbstractClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 66,\n                            \"name\": \"myAbstractProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isAbstract\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 91,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://class.ts#L91\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 67,\n                            \"name\": \"myAbstractMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true,\n                                \"isAbstract\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 93,\n                                    \"character\": 23,\n                                    \"url\": \"typedoc://class.ts#L93\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 68,\n                                    \"name\": \"myAbstractMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 93,\n                                            \"character\": 23,\n                                            \"url\": \"typedoc://class.ts#L93\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                64\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                66\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                67\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 90,\n                            \"character\": 22,\n                            \"url\": \"typedoc://class.ts#L90\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 69,\n                            \"name\": \"TestAbstractClassImplementation\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 69,\n                    \"name\": \"TestAbstractClassImplementation\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 70,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 71,\n                                    \"name\": \"TestAbstractClassImplementation\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 69,\n                                        \"name\": \"TestAbstractClassImplementation\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 65,\n                                        \"name\": \"TestAbstractClass.constructor\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 64,\n                                \"name\": \"TestAbstractClass.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 72,\n                            \"name\": \"myAbstractProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 97,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L97\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 66,\n                                \"name\": \"TestAbstractClass.myAbstractProperty\"\n                            }\n                        },\n                        {\n                            \"id\": 73,\n                            \"name\": \"myAbstractMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 99,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://class.ts#L99\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 74,\n                                    \"name\": \"myAbstractMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 99,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://class.ts#L99\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 68,\n                                        \"name\": \"TestAbstractClass.myAbstractMethod\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 67,\n                                \"name\": \"TestAbstractClass.myAbstractMethod\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                70\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                72\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                73\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 96,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L96\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 63,\n                            \"name\": \"TestAbstractClass\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 22,\n                    \"name\": \"TestClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"TestClass comment short text.\\n\\nTestClass comment text.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"inline-tag\",\n                                        \"tag\": \"@link\",\n                                        \"text\": \"TestClass\",\n                                        \"target\": 22\n                                    },\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \" @ fixtures\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 26,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 27,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L27\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 27,\n                                    \"name\": \"TestClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 27,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://class.ts#L27\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 22,\n                                        \"name\": \"TestClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 29,\n                            \"name\": \"privateProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"privateProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 17,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://class.ts#L17\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"number\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 28,\n                            \"name\": \"publicProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"publicProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 12,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 23,\n                            \"name\": \"staticProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"staticProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 22,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 22,\n                                \"name\": \"TestClass\",\n                                \"package\": \"typedoc\"\n                            }\n                        },\n                        {\n                            \"id\": 36,\n                            \"name\": \"arrowMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 58,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L58\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"arrowMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"arrow method\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 58,\n                                            \"character\": 18,\n                                            \"url\": \"typedoc://class.ts#L58\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 34,\n                            \"name\": \"privateMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 48,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://class.ts#L48\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 35,\n                                    \"name\": \"privateMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"privateMethod short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"AnotherTest\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 48,\n                                            \"character\": 12,\n                                            \"url\": \"typedoc://class.ts#L48\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 32,\n                            \"name\": \"protectedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 41,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://class.ts#L41\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 33,\n                                    \"name\": \"protectedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"protectedMethod short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Test\"\n                                                    }\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"AnotherTest\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 41,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://class.ts#L41\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 30,\n                            \"name\": \"publicMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 34,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L34\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 31,\n                                    \"name\": \"publicMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"publicMethod short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"AnotherTest\"\n                                                    }\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"@category\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Test\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 34,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L34\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 24,\n                            \"name\": \"staticMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 53,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L53\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 25,\n                                    \"name\": \"staticMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"staticMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 53,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L53\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                26\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                29,\n                                28,\n                                23\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                36,\n                                34,\n                                32,\n                                30,\n                                24\n                            ]\n                        }\n                    ],\n                    \"categories\": [\n                        {\n                            \"title\": \"AnotherTest\",\n                            \"children\": [\n                                34,\n                                32,\n                                30\n                            ]\n                        },\n                        {\n                            \"title\": \"Other\",\n                            \"children\": [\n                                26,\n                                29,\n                                28,\n                                23,\n                                36,\n                                24\n                            ]\n                        },\n                        {\n                            \"title\": \"Test\",\n                            \"children\": [\n                                32,\n                                30\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L8\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 38,\n                            \"name\": \"TestSubClass\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"TestSubClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"TestClass comment short text.\\n\\nTestClass comment text.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"inline-tag\",\n                                        \"tag\": \"@link\",\n                                        \"text\": \"TestClass\",\n                                        \"target\": 22\n                                    },\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \" @ fixtures\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 42,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 80,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L80\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 43,\n                                    \"name\": \"TestSubClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 80,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://class.ts#L80\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 44,\n                                            \"name\": \"p1\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Constructor param\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 45,\n                                            \"name\": \"p2\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Private string property\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 46,\n                                            \"name\": \"p3\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Public number property\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 47,\n                                            \"name\": \"p4\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Public implicit any property\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 38,\n                                        \"name\": \"TestSubClass\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 27,\n                                        \"name\": \"TestClass.constructor\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 26,\n                                \"name\": \"TestClass.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 52,\n                            \"name\": \"p2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Private string property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 82,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://class.ts#L82\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 53,\n                            \"name\": \"p3\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Public number property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 83,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://class.ts#L83\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        },\n                        {\n                            \"id\": 54,\n                            \"name\": \"p4\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Public implicit any property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 84,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://class.ts#L84\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"any\"\n                            }\n                        },\n                        {\n                            \"id\": 57,\n                            \"name\": \"publicProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"publicProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 12,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 28,\n                                \"name\": \"TestClass.publicProperty\"\n                            }\n                        },\n                        {\n                            \"id\": 39,\n                            \"name\": \"staticProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"staticProperty short text.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 22,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 22,\n                                \"name\": \"TestClass\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 23,\n                                \"name\": \"TestClass.staticProperty\"\n                            }\n                        },\n                        {\n                            \"id\": 58,\n                            \"name\": \"arrowMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 58,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L58\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 59,\n                                    \"name\": \"arrowMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isInherited\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"arrow method\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 58,\n                                            \"character\": 18,\n                                            \"url\": \"typedoc://class.ts#L58\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 37,\n                                        \"name\": \"TestClass.arrowMethod\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 36,\n                                \"name\": \"TestClass.arrowMethod\"\n                            }\n                        },\n                        {\n                            \"id\": 55,\n                            \"name\": \"mergedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 106,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L106\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 56,\n                                    \"name\": \"mergedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"mergedMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 106,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://class.ts#L106\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 50,\n                            \"name\": \"protectedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 70,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://class.ts#L70\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 51,\n                                    \"name\": \"protectedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"protectedMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 70,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://class.ts#L70\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 33,\n                                        \"name\": \"TestClass.protectedMethod\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 32,\n                                \"name\": \"TestClass.protectedMethod\"\n                            }\n                        },\n                        {\n                            \"id\": 48,\n                            \"name\": \"publicMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 65,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L65\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 49,\n                                    \"name\": \"publicMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"publicMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 65,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L65\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 31,\n                                        \"name\": \"TestClass.publicMethod\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 30,\n                                \"name\": \"TestClass.publicMethod\"\n                            }\n                        },\n                        {\n                            \"id\": 40,\n                            \"name\": \"staticMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isStatic\": true,\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 53,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://class.ts#L53\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"staticMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isInherited\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"staticMethod short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"class.ts\",\n                                            \"line\": 53,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://class.ts#L53\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 25,\n                                        \"name\": \"TestClass.staticMethod\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 24,\n                                \"name\": \"TestClass.staticMethod\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                42\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                52,\n                                53,\n                                54,\n                                57,\n                                39\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                58,\n                                55,\n                                50,\n                                48,\n                                40\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 61,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L61\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 102,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L102\"\n                        },\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 109,\n                            \"character\": 17,\n                            \"url\": \"typedoc://class.ts#L109\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 22,\n                            \"name\": \"TestClass\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 82,\n                    \"name\": \"Ts38PrivateFields\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 83,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 84,\n                                    \"name\": \"Ts38PrivateFields\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 82,\n                                        \"name\": \"Ts38PrivateFields\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 85,\n                            \"name\": \"#foo\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Docs\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 127,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://class.ts#L127\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"defaultValue\": \"1\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                83\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                85\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 125,\n                            \"character\": 13,\n                            \"url\": \"typedoc://class.ts#L125\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 91,\n                    \"name\": \"AbstractMe\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"class.ts\",\n                            \"line\": 135,\n                            \"character\": 12,\n                            \"url\": \"typedoc://class.ts#L135\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 92,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"class.ts\",\n                                    \"line\": 135,\n                                    \"character\": 25,\n                                    \"url\": \"typedoc://class.ts#L135\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 93,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {\n                                        \"isAbstract\": true\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 86,\n                                        \"name\": \"Abstract\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Namespaces\",\n                    \"children\": [\n                        60\n                    ]\n                },\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        86,\n                        75,\n                        63,\n                        69,\n                        22,\n                        38,\n                        82\n                    ]\n                },\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        91\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"class.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://class.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 94,\n            \"name\": \"constructor-properties\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 95,\n                    \"name\": \"Vector2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class with constructor properties.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 96,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://constructor-properties.ts#L10\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 97,\n                                    \"name\": \"Vector2\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-properties.ts\",\n                                            \"line\": 10,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-properties.ts#L10\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 98,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"X component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 99,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Y component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 100,\n                                            \"name\": \"name\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Vector name\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 95,\n                                        \"name\": \"Vector2\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 103,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isReadonly\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Vector name\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 13,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://constructor-properties.ts#L13\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 101,\n                            \"name\": \"x\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"X component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 11,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L11\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        },\n                        {\n                            \"id\": 102,\n                            \"name\": \"y\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Y component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 12,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                96\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                103,\n                                101,\n                                102\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"constructor-properties.ts\",\n                            \"line\": 4,\n                            \"character\": 13,\n                            \"url\": \"typedoc://constructor-properties.ts#L4\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 104,\n                            \"name\": \"Vector3\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 104,\n                    \"name\": \"Vector3\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class with inherited and overwritten constructor properties.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 105,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 27,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://constructor-properties.ts#L27\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 106,\n                                    \"name\": \"Vector3\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-properties.ts\",\n                                            \"line\": 27,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-properties.ts#L27\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 107,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"X component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 108,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Y component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 109,\n                                            \"name\": \"z\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Z component of the Vector\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 110,\n                                            \"name\": \"name\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Vector name\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 104,\n                                        \"name\": \"Vector3\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"overwrites\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 97,\n                                        \"name\": \"Vector2.constructor\"\n                                    }\n                                }\n                            ],\n                            \"overwrites\": {\n                                \"type\": \"reference\",\n                                \"target\": 96,\n                                \"name\": \"Vector2.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 113,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isReadonly\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Vector name\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 31,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://constructor-properties.ts#L31\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 103,\n                                \"name\": \"Vector2.name\"\n                            }\n                        },\n                        {\n                            \"id\": 114,\n                            \"name\": \"x\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"X component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 11,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L11\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 101,\n                                \"name\": \"Vector2.x\"\n                            }\n                        },\n                        {\n                            \"id\": 111,\n                            \"name\": \"y\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Y component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 29,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L29\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 102,\n                                \"name\": \"Vector2.y\"\n                            }\n                        },\n                        {\n                            \"id\": 112,\n                            \"name\": \"z\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Z component of the Vector\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-properties.ts\",\n                                    \"line\": 30,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://constructor-properties.ts#L30\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                105\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                113,\n                                114,\n                                111,\n                                112\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"constructor-properties.ts\",\n                            \"line\": 20,\n                            \"character\": 13,\n                            \"url\": \"typedoc://constructor-properties.ts#L20\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 95,\n                            \"name\": \"Vector2\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        95,\n                        104\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"constructor-properties.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://constructor-properties.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 115,\n            \"name\": \"decorators\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 129,\n                    \"name\": \"DecoratedClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A decorated class.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 130,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 131,\n                                    \"name\": \"DecoratedClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 129,\n                                        \"name\": \"DecoratedClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 132,\n                            \"name\": \"decoratedMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 13,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://decorators.ts#L13\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 133,\n                                    \"name\": \"decoratedMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A decorated method.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"decorators.ts\",\n                                            \"line\": 13,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://decorators.ts#L13\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                130\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                132\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 7,\n                            \"character\": 13,\n                            \"url\": \"typedoc://decorators.ts#L7\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 116,\n                    \"name\": \"decoratorAtom\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 19,\n                            \"character\": 16,\n                            \"url\": \"typedoc://decorators.ts#L19\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 117,\n                            \"name\": \"decoratorAtom\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A decorator with no options.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 19,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://decorators.ts#L19\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 118,\n                                    \"name\": \"target\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                                            \"qualifiedName\": \"Object\"\n                                        },\n                                        \"name\": \"Object\",\n                                        \"package\": \"typescript\"\n                                    }\n                                },\n                                {\n                                    \"id\": 119,\n                                    \"name\": \"propertyKey\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"union\",\n                                        \"types\": [\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            },\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"symbol\"\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"id\": 120,\n                                    \"name\": \"descriptor\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                                            \"qualifiedName\": \"TypedPropertyDescriptor\"\n                                        },\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        ],\n                                        \"name\": \"TypedPropertyDescriptor\",\n                                        \"package\": \"typescript\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 124,\n                    \"name\": \"decoratorWithOptions\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 48,\n                            \"character\": 16,\n                            \"url\": \"typedoc://decorators.ts#L48\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 125,\n                            \"name\": \"decoratorWithOptions\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A decorator consuming an options object.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 48,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://decorators.ts#L48\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 126,\n                                    \"name\": \"options\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The options object of this decorator.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 127,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 128,\n                                                    \"name\": \"name\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"comment\": {\n                                                        \"summary\": [\n                                                            {\n                                                                \"kind\": \"text\",\n                                                                \"text\": \"A property on the options object of this decorator.\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"decorators.ts\",\n                                                            \"line\": 49,\n                                                            \"character\": 4,\n                                                            \"url\": \"typedoc://decorators.ts#L49\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        128\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": {\n                                    \"packageName\": \"typescript\",\n                                    \"packagePath\": \"lib/lib.decorators.legacy.d.ts\",\n                                    \"qualifiedName\": \"ClassDecorator\"\n                                },\n                                \"name\": \"ClassDecorator\",\n                                \"package\": \"typescript\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 121,\n                    \"name\": \"decoratorWithParam\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"decorators.ts\",\n                            \"line\": 32,\n                            \"character\": 16,\n                            \"url\": \"typedoc://decorators.ts#L32\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 122,\n                            \"name\": \"decoratorWithParam\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A decorator with a parameter.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"decorators.ts\",\n                                    \"line\": 32,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://decorators.ts#L32\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 123,\n                                    \"name\": \"value\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The parameter of this decorator.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": {\n                                    \"packageName\": \"typescript\",\n                                    \"packagePath\": \"lib/lib.decorators.legacy.d.ts\",\n                                    \"qualifiedName\": \"MethodDecorator\"\n                                },\n                                \"name\": \"MethodDecorator\",\n                                \"package\": \"typescript\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        129\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        116,\n                        124,\n                        121\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"decorators.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://decorators.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 161,\n            \"name\": \"events\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 162,\n                    \"name\": \"EventDispatcher\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 164,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 165,\n                                    \"name\": \"EventDispatcher\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 162,\n                                        \"name\": \"EventDispatcher\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 163,\n                            \"name\": \"EVENT_CLICK\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is an event documentation.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@group\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Events\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"events.ts\",\n                                    \"line\": 6,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://events.ts#L6\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"defaultValue\": \"\\\"click\\\"\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                164\n                            ]\n                        },\n                        {\n                            \"title\": \"Events\",\n                            \"children\": [\n                                163\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"events.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://events.ts#L1\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        162\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"events.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://events.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 134,\n            \"name\": \"events-overloads\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 135,\n                    \"name\": \"Test\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Encapsulates some information for background http transfers.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"https://github.com/TypeStrong/typedoc/issues/136\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 136,\n                            \"name\": \"on\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 14,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L14\"\n                                },\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 23,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L23\"\n                                },\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 32,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L32\"\n                                },\n                                {\n                                    \"fileName\": \"events-overloads.ts\",\n                                    \"line\": 41,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://events-overloads.ts#L41\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 137,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for a general event by name.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 14,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L14\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 138,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 139,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The handler called when the event occurs.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 140,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 141,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 142,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                },\n                                {\n                                    \"id\": 143,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for error notifications.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 23,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L23\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 144,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"literal\",\n                                                \"value\": \"error\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 145,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"A handler that will receive the error details\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 146,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 147,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 148,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                },\n                                {\n                                    \"id\": 149,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for progress notifications.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 32,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L32\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 150,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"literal\",\n                                                \"value\": \"progress\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 151,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"A handler that will receive a progress event with the current and expected total bytes\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 152,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 153,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 154,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                },\n                                {\n                                    \"id\": 155,\n                                    \"name\": \"on\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Subscribe for success notification.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@group\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Events\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"events-overloads.ts\",\n                                            \"line\": 41,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://events-overloads.ts#L41\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 156,\n                                            \"name\": \"event\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"The name of the event to subscribe for.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"literal\",\n                                                \"value\": \"complete\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 157,\n                                            \"name\": \"handler\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"A function that will be called with general event data upon successful completion\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reflection\",\n                                                \"declaration\": {\n                                                    \"id\": 158,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 65536,\n                                                    \"flags\": {},\n                                                    \"signatures\": [\n                                                        {\n                                                            \"id\": 159,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"signature\",\n                                                            \"kind\": 4096,\n                                                            \"flags\": {},\n                                                            \"parameters\": [\n                                                                {\n                                                                    \"id\": 160,\n                                                                    \"name\": \"e\",\n                                                                    \"variant\": \"param\",\n                                                                    \"kind\": 32768,\n                                                                    \"flags\": {},\n                                                                    \"type\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            ],\n                                                            \"type\": {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"void\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Events\",\n                            \"children\": [\n                                136\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"events-overloads.ts\",\n                            \"line\": 6,\n                            \"character\": 17,\n                            \"url\": \"typedoc://events-overloads.ts#L6\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        135\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"events-overloads.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://events-overloads.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 166,\n            \"name\": \"generic-class\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 167,\n                    \"name\": \"GenericClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"GenericClass short text.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 169,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 20,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L20\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 170,\n                                    \"name\": \"GenericClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 20,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L20\"\n                                        }\n                                    ],\n                                    \"typeParameters\": [\n                                        {\n                                            \"id\": 171,\n                                            \"name\": \"T\",\n                                            \"variant\": \"typeParam\",\n                                            \"kind\": 131072,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Generic parameter.\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 172,\n                                            \"name\": \"value\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Constructor parameter.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 168,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"GenericClass.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 167,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 168,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"GenericClass.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"GenericClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 173,\n                            \"name\": \"value\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 9,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L9\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 168,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"qualifiedName\": \"GenericClass.T\",\n                                \"refersToTypeParameter\": true\n                            }\n                        },\n                        {\n                            \"id\": 174,\n                            \"name\": \"values\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property array.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 14,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 168,\n                                    \"name\": \"T\",\n                                    \"package\": \"typedoc\",\n                                    \"qualifiedName\": \"GenericClass.T\",\n                                    \"refersToTypeParameter\": true\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 175,\n                            \"name\": \"getValue\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 28,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L28\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 176,\n                                    \"name\": \"getValue\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"getValue short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@returns\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Return value comment.\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 28,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 168,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"GenericClass.T\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                169\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                173,\n                                174\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                175\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-class.ts\",\n                            \"line\": 5,\n                            \"character\": 13,\n                            \"url\": \"typedoc://generic-class.ts#L5\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 168,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic parameter.\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 177,\n                            \"name\": \"NonGenericClass\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 177,\n                    \"name\": \"NonGenericClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"NonGenericClass short text.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 178,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 20,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L20\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 179,\n                                    \"name\": \"NonGenericClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Constructor short text.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 20,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L20\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 180,\n                                            \"name\": \"value\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Constructor parameter.\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 177,\n                                        \"name\": \"NonGenericClass\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 170,\n                                        \"name\": \"GenericClass.constructor\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 169,\n                                \"name\": \"GenericClass.constructor\"\n                            }\n                        },\n                        {\n                            \"id\": 181,\n                            \"name\": \"value\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 9,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L9\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 173,\n                                \"name\": \"GenericClass.value\"\n                            }\n                        },\n                        {\n                            \"id\": 182,\n                            \"name\": \"values\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isProtected\": true,\n                                \"isInherited\": true\n                            },\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic property array.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 14,\n                                    \"character\": 14,\n                                    \"url\": \"typedoc://generic-class.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 174,\n                                \"name\": \"GenericClass.values\"\n                            }\n                        },\n                        {\n                            \"id\": 183,\n                            \"name\": \"getValue\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-class.ts\",\n                                    \"line\": 28,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://generic-class.ts#L28\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 184,\n                                    \"name\": \"getValue\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {\n                                        \"isInherited\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"getValue short text.\"\n                                            }\n                                        ],\n                                        \"blockTags\": [\n                                            {\n                                                \"tag\": \"@returns\",\n                                                \"content\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Return value comment.\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"generic-class.ts\",\n                                            \"line\": 28,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://generic-class.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 176,\n                                        \"name\": \"GenericClass.getValue\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 175,\n                                \"name\": \"GenericClass.getValue\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                178\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                181,\n                                182\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                183\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-class.ts\",\n                            \"line\": 36,\n                            \"character\": 13,\n                            \"url\": \"typedoc://generic-class.ts#L36\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 167,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            ],\n                            \"name\": \"GenericClass\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        167,\n                        177\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"generic-class.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://generic-class.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 185,\n            \"name\": \"getter-setter\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 186,\n                    \"name\": \"GetterSetter\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 187,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 188,\n                                    \"name\": \"GetterSetter\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 186,\n                                        \"name\": \"GetterSetter\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 189,\n                            \"name\": \"_name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 2,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://getter-setter.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 199,\n                            \"name\": \"autoAccessor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Accessor comment\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 22,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://getter-setter.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 190,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 4,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L4\"\n                                },\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 7,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L7\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 191,\n                                \"name\": \"name\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 4,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L4\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            },\n                            \"setSignature\": {\n                                \"id\": 192,\n                                \"name\": \"name\",\n                                \"variant\": \"signature\",\n                                \"kind\": 1048576,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 7,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L7\"\n                                    }\n                                ],\n                                \"parameters\": [\n                                    {\n                                        \"id\": 193,\n                                        \"name\": \"value\",\n                                        \"variant\": \"param\",\n                                        \"kind\": 32768,\n                                        \"flags\": {},\n                                        \"type\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"void\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 194,\n                            \"name\": \"readOnlyName\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 11,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L11\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 195,\n                                \"name\": \"readOnlyName\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 11,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L11\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 196,\n                            \"name\": \"writeOnlyName\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 15,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L15\"\n                                }\n                            ],\n                            \"setSignature\": {\n                                \"id\": 197,\n                                \"name\": \"writeOnlyName\",\n                                \"variant\": \"signature\",\n                                \"kind\": 1048576,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 15,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L15\"\n                                    }\n                                ],\n                                \"parameters\": [\n                                    {\n                                        \"id\": 198,\n                                        \"name\": \"value\",\n                                        \"variant\": \"param\",\n                                        \"kind\": 32768,\n                                        \"flags\": {},\n                                        \"type\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"void\"\n                                }\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                187\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                189\n                            ]\n                        },\n                        {\n                            \"title\": \"Accessors\",\n                            \"children\": [\n                                199,\n                                190,\n                                194,\n                                196\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"getter-setter.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://getter-setter.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 200,\n                    \"name\": \"Ts51UnrelatedAccessorTypes\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 201,\n                            \"name\": \"prop\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 262144,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 26,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L26\"\n                                },\n                                {\n                                    \"fileName\": \"getter-setter.ts\",\n                                    \"line\": 27,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://getter-setter.ts#L27\"\n                                }\n                            ],\n                            \"getSignature\": {\n                                \"id\": 202,\n                                \"name\": \"prop\",\n                                \"variant\": \"signature\",\n                                \"kind\": 524288,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 26,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L26\"\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 1\n                                }\n                            },\n                            \"setSignature\": {\n                                \"id\": 203,\n                                \"name\": \"prop\",\n                                \"variant\": \"signature\",\n                                \"kind\": 1048576,\n                                \"flags\": {},\n                                \"sources\": [\n                                    {\n                                        \"fileName\": \"getter-setter.ts\",\n                                        \"line\": 27,\n                                        \"character\": 8,\n                                        \"url\": \"typedoc://getter-setter.ts#L27\"\n                                    }\n                                ],\n                                \"parameters\": [\n                                    {\n                                        \"id\": 204,\n                                        \"name\": \"value\",\n                                        \"variant\": \"param\",\n                                        \"kind\": 32768,\n                                        \"flags\": {},\n                                        \"type\": {\n                                            \"type\": \"literal\",\n                                            \"value\": 2\n                                        }\n                                    }\n                                ],\n                                \"type\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"void\"\n                                }\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Accessors\",\n                            \"children\": [\n                                201\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"getter-setter.ts\",\n                            \"line\": 25,\n                            \"character\": 17,\n                            \"url\": \"typedoc://getter-setter.ts#L25\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        186\n                    ]\n                },\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        200\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"getter-setter.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://getter-setter.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 205,\n            \"name\": \"type-operator\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 211,\n                    \"name\": \"GenericClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 213,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 214,\n                                    \"name\": \"GenericClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"typeParameters\": [\n                                        {\n                                            \"id\": 215,\n                                            \"name\": \"T\",\n                                            \"variant\": \"typeParam\",\n                                            \"kind\": 131072,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"typeOperator\",\n                                                \"operator\": \"keyof\",\n                                                \"target\": {\n                                                    \"type\": \"reference\",\n                                                    \"target\": 206,\n                                                    \"name\": \"TestClass\",\n                                                    \"package\": \"typedoc\"\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 211,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 212,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"GenericClass.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"GenericClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 216,\n                            \"name\": \"c\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 14,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 212,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"qualifiedName\": \"GenericClass.T\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                213\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                216\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 13,\n                            \"character\": 13,\n                            \"url\": \"typedoc://type-operator.ts#L13\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 212,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"typeOperator\",\n                                \"operator\": \"keyof\",\n                                \"target\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 206,\n                                    \"name\": \"TestClass\",\n                                    \"package\": \"typedoc\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 206,\n                    \"name\": \"TestClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"TestClass comment short text.\\n\\nTestClass comment text.\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@see\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"inline-tag\",\n                                        \"tag\": \"@link\",\n                                        \"text\": \"TestClass\",\n                                        \"target\": 206\n                                    },\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \" @ fixtures\"\n                                    }\n                                ]\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 207,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 208,\n                                    \"name\": \"TestClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 206,\n                                        \"name\": \"TestClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 209,\n                            \"name\": \"a\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 9,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L9\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 210,\n                            \"name\": \"b\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L10\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                207\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                209,\n                                210\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://type-operator.ts#L8\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        211,\n                        206\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"type-operator.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://type-operator.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                21,\n                94,\n                115,\n                161,\n                134,\n                166,\n                185,\n                205\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakePrivateFunction\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakePrivateFunction\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakeProtectedFunction\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakeProtectedFunction\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakePrivateVariable\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"fakeProtectedVariable\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateStaticGetter\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateStaticGetter\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakePrivateProperty\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakeProtectedProperty\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakePrivateMethod\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakePrivateMethod\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakeProtectedMethod\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.fakeProtectedMethod\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateArrow\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/access.ts\",\n            \"qualifiedName\": \"PrivateClass.privateArrow\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticProperty\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.__constructor\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicProperty\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.privateProperty\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicMethod\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicMethod\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.protectedMethod\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.protectedMethod\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.privateMethod\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.privateMethod\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticProperty\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.staticMethod\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.__constructor\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p1\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p2\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p3\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"p4\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.publicMethod\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.publicMethod\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.protectedMethod\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.protectedMethod\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.p2\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.p3\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.p4\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.mergedMethod\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.mergedMethod\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.publicProperty\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestClass.arrowMethod\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.staticMergedMethod\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestSubClass.staticMergedMethod\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass.myAbstractProperty\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass.myAbstractMethod\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClass.myAbstractMethod\"\n        },\n        \"69\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation.myAbstractProperty\"\n        },\n        \"73\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation.myAbstractMethod\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"TestAbstractClassImplementation.myAbstractMethod\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.literal2\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.y\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.[toStringTag]\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"ComputedNames.literal\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Ts38PrivateFields\"\n        },\n        \"85\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Ts38PrivateFields.#foo\"\n        },\n        \"86\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Abstract\"\n        },\n        \"89\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Abstract.needsImpl\"\n        },\n        \"90\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"Abstract.needsImpl\"\n        },\n        \"91\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"AbstractMe\"\n        },\n        \"92\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"93\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/class.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"94\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"95\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2\"\n        },\n        \"96\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.__constructor\"\n        },\n        \"97\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2\"\n        },\n        \"98\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"99\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"100\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"name\"\n        },\n        \"101\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.x\"\n        },\n        \"102\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.y\"\n        },\n        \"103\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.name\"\n        },\n        \"104\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3\"\n        },\n        \"105\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.__constructor\"\n        },\n        \"106\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3\"\n        },\n        \"107\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"108\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"109\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"110\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"name\"\n        },\n        \"111\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.y\"\n        },\n        \"112\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.z\"\n        },\n        \"113\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector3.name\"\n        },\n        \"114\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/constructor-properties.ts\",\n            \"qualifiedName\": \"Vector2.x\"\n        },\n        \"115\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"116\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorAtom\"\n        },\n        \"117\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorAtom\"\n        },\n        \"118\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"target\"\n        },\n        \"119\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"propertyKey\"\n        },\n        \"120\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"descriptor\"\n        },\n        \"121\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithParam\"\n        },\n        \"122\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithParam\"\n        },\n        \"123\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"124\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithOptions\"\n        },\n        \"125\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"decoratorWithOptions\"\n        },\n        \"126\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"options\"\n        },\n        \"127\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"128\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"__type.name\"\n        },\n        \"129\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"DecoratedClass\"\n        },\n        \"132\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"DecoratedClass.decoratedMethod\"\n        },\n        \"133\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/decorators.ts\",\n            \"qualifiedName\": \"DecoratedClass.decoratedMethod\"\n        },\n        \"134\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"135\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test\"\n        },\n        \"136\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"137\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"138\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"139\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"140\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"141\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"142\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"143\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"144\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"145\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"146\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"147\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"148\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"149\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"150\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"151\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"152\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"153\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"154\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"155\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"Test.on\"\n        },\n        \"156\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"157\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"handler\"\n        },\n        \"158\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"159\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"160\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events-overloads.ts\",\n            \"qualifiedName\": \"e\"\n        },\n        \"161\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"162\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events.ts\",\n            \"qualifiedName\": \"EventDispatcher\"\n        },\n        \"163\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/events.ts\",\n            \"qualifiedName\": \"EventDispatcher.EVENT_CLICK\"\n        },\n        \"166\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"167\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass\"\n        },\n        \"168\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"169\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.__constructor\"\n        },\n        \"170\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass\"\n        },\n        \"171\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"172\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"173\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.value\"\n        },\n        \"174\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.values\"\n        },\n        \"175\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"176\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"177\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"NonGenericClass\"\n        },\n        \"178\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.__constructor\"\n        },\n        \"179\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"NonGenericClass\"\n        },\n        \"180\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"181\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.value\"\n        },\n        \"182\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.values\"\n        },\n        \"183\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"184\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/generic-class.ts\",\n            \"qualifiedName\": \"GenericClass.getValue\"\n        },\n        \"185\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"186\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter\"\n        },\n        \"189\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter._name\"\n        },\n        \"190\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.name\"\n        },\n        \"191\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.name\"\n        },\n        \"192\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.name\"\n        },\n        \"193\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"194\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.readOnlyName\"\n        },\n        \"195\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.readOnlyName\"\n        },\n        \"196\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.writeOnlyName\"\n        },\n        \"197\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.writeOnlyName\"\n        },\n        \"198\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"199\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"GetterSetter.autoAccessor\"\n        },\n        \"200\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes\"\n        },\n        \"201\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes.prop\"\n        },\n        \"202\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes.prop\"\n        },\n        \"203\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"Ts51UnrelatedAccessorTypes.prop\"\n        },\n        \"204\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/getter-setter.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"205\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"206\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"TestClass\"\n        },\n        \"209\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"TestClass.a\"\n        },\n        \"210\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"TestClass.b\"\n        },\n        \"211\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass\"\n        },\n        \"212\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"215\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass.T\"\n        },\n        \"216\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/class/type-operator.ts\",\n            \"qualifiedName\": \"GenericClass.c\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/class/access.ts\",\n            \"2\": \"src/test/converter/class/class.ts\",\n            \"3\": \"src/test/converter/class/constructor-properties.ts\",\n            \"4\": \"src/test/converter/class/decorators.ts\",\n            \"5\": \"src/test/converter/class/events-overloads.ts\",\n            \"6\": \"src/test/converter/class/events.ts\",\n            \"7\": \"src/test/converter/class/generic-class.ts\",\n            \"8\": \"src/test/converter/class/getter-setter.ts\",\n            \"9\": \"src/test/converter/class/type-operator.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 21,\n            \"3\": 94,\n            \"4\": 115,\n            \"5\": 134,\n            \"6\": 161,\n            \"7\": 166,\n            \"8\": 185,\n            \"9\": 205\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/class/type-operator.ts",
    "content": "/**\n * TestClass comment short text.\n *\n * TestClass comment text.\n *\n * @see {@link TestClass} @ fixtures\n */\nexport class TestClass {\n    a: string;\n    b: number;\n}\n\nexport class GenericClass<T extends keyof TestClass> {\n    c: T;\n}\n"
  },
  {
    "path": "src/test/converter/comment/comment.ts",
    "content": "/**\n * Module doc comment with document and link to [self](./comment.ts) and {@link https://example.com}\n *\n * @document document.md\n * @packageDocumentation\n */\nimport \"./comment2\";\n\n/**\n * A Comment for a class\n *\n * ## Some Markup\n * **with more markup**\n *\n * An example with decorators that should not parse to tag\n * ```\n * @myDecorator\n * @FactoryDecorator('a', 'b', 'c')\n * export class CommentedClass {\n *   myProp: string = 'myProp';\n *\n *   @PropDecorator() decoratedProp: string;\n *\n *   constructor(@ParamDecorator public param: string) { }\n *\n *   myMethod() { }\n * }\n * ```\n * @deprecated\n *\n * @type {Data<object>} will also be removed\n *\n * @groupDescription Methods\n * Methods description!\n *\n * @gh3020 {type annotation}\n */\nexport class CommentedClass {\n    /**\n     * The main prop\n     */\n    prop: string;\n\n    /**\n     * @hidden\n     */\n    hiddenprop: string;\n\n    /**\n     * Hidden function\n     * @hidden\n     */\n    hidden(...args: any[]): void {}\n\n    /**\n     * Single hidden signature\n     * @hidden\n     */\n    hiddenWithImplementation(arg: any);\n    hiddenWithImplementation(...args: any[]): void {}\n\n    /**\n     * Multiple hidden 1\n     * @hidden\n     */\n    multipleHidden(arg: any);\n    /**\n     * Multiple hidden 2\n     * @hidden\n     */\n    multipleHidden(arg1: any, arg2: any);\n    multipleHidden(...args: any[]): void {}\n\n    /**\n     * Mixed hidden 1\n     * @hidden\n     */\n    mixedHidden(arg: any);\n    /**\n     * Mixed hidden 2\n     */\n    mixedHidden(arg1: any, arg2: any);\n    mixedHidden(...args: any[]): void {}\n\n    /**\n     * @ignore\n     */\n    ignoredprop: string;\n}\n\nexport type UnionWithCommentsOnMembers =\n    /**\n     * Doc of foo1.\n     */\n    | \"foo1\"\n    /**\n     * Doc of foo2.\n     */\n    | \"foo2\";\n"
  },
  {
    "path": "src/test/converter/comment/comment2.ts",
    "content": "/**\n * This is a module doc with the packageDocumentation tag to mark it as documentation\n * for the whole module. It is *not* documentation for the `multiply` function.\n *\n * @packageDocumentation\n */\n\nexport function multiply(a: number, b: number) {\n    return a * b;\n}\n"
  },
  {
    "path": "src/test/converter/comment/comment3.ts",
    "content": "/**\n * This is a module doc with the module tag to mark it as documentation\n * for the whole module. It is *not* documentation for the `multiply` function.\n *\n * @module\n */\n\nexport function multiply(a: number, b: number) {\n    return a * b;\n}\n"
  },
  {
    "path": "src/test/converter/comment/comment4.ts",
    "content": "/**\n * This is a comment containing a multiline code block\n * ```ts\n * export function multiply(a: number, b: number) {\n *   return a * b;\n * }\n * ```\n * @module\n */\n\nexport function multiply(a: number, b: number) {\n    return a * b;\n}\n"
  },
  {
    "path": "src/test/converter/comment/document.md",
    "content": "External doc included with `@document` tag!\n"
  },
  {
    "path": "src/test/converter/comment/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"comment\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"comment\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Module doc comment with document and link to [self](\"\n                    },\n                    {\n                        \"kind\": \"relative-link\",\n                        \"text\": \"./comment.ts\",\n                        \"target\": 1\n                    },\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \") and \"\n                    },\n                    {\n                        \"kind\": \"inline-tag\",\n                        \"tag\": \"@link\",\n                        \"text\": \"https://example.com\",\n                        \"target\": \"https://example.com\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 3,\n                    \"name\": \"CommentedClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A Comment for a class\\n\\n## Some Markup\\n**with more markup**\\n\\nAn example with decorators that should not parse to tag\\n\"\n                            },\n                            {\n                                \"kind\": \"code\",\n                                \"text\": \"```\\n@myDecorator\\n@FactoryDecorator('a', 'b', 'c')\\nexport class CommentedClass {\\n  myProp: string = 'myProp';\\n\\n  @PropDecorator() decoratedProp: string;\\n\\n  constructor(@ParamDecorator public param: string) { }\\n\\n  myMethod() { }\\n}\\n```\"\n                            }\n                        ],\n                        \"blockTags\": [\n                            {\n                                \"tag\": \"@deprecated\",\n                                \"content\": []\n                            },\n                            {\n                                \"tag\": \"@groupDescription\",\n                                \"content\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Methods\\nMethods description!\"\n                                    }\n                                ]\n                            },\n                            {\n                                \"tag\": \"@gh3020\",\n                                \"content\": [],\n                                \"typeAnnotation\": \"{type annotation}\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 4,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 5,\n                                    \"name\": \"CommentedClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 3,\n                                        \"name\": \"CommentedClass\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 6,\n                            \"name\": \"prop\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"The main prop\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"comment.ts\",\n                                    \"line\": 42,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://comment.ts#L42\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 20,\n                            \"name\": \"mixedHidden\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"comment.ts\",\n                                    \"line\": 82,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://comment.ts#L82\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 23,\n                                    \"name\": \"mixedHidden\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Mixed hidden 2\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"comment.ts\",\n                                            \"line\": 82,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://comment.ts#L82\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 24,\n                                            \"name\": \"arg1\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 25,\n                                            \"name\": \"arg2\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"any\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                4\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                6\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"description\": [\n                                {\n                                    \"kind\": \"text\",\n                                    \"text\": \"Methods description!\"\n                                }\n                            ],\n                            \"children\": [\n                                20\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"comment.ts\",\n                            \"line\": 38,\n                            \"character\": 13,\n                            \"url\": \"typedoc://comment.ts#L38\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"UnionWithCommentsOnMembers\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"comment.ts\",\n                            \"line\": 91,\n                            \"character\": 12,\n                            \"url\": \"typedoc://comment.ts#L91\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"union\",\n                        \"types\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": \"foo1\"\n                            },\n                            {\n                                \"type\": \"literal\",\n                                \"value\": \"foo2\"\n                            }\n                        ],\n                        \"elementSummaries\": [\n                            [\n                                {\n                                    \"kind\": \"text\",\n                                    \"text\": \"Doc of foo1.\"\n                                }\n                            ],\n                            [\n                                {\n                                    \"kind\": \"text\",\n                                    \"text\": \"Doc of foo2.\"\n                                }\n                            ]\n                        ]\n                    }\n                }\n            ],\n            \"documents\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"document\",\n                    \"variant\": \"document\",\n                    \"kind\": 8388608,\n                    \"flags\": {},\n                    \"content\": [\n                        {\n                            \"kind\": \"text\",\n                            \"text\": \"External doc included with \"\n                        },\n                        {\n                            \"kind\": \"code\",\n                            \"text\": \"`@document`\"\n                        },\n                        {\n                            \"kind\": \"text\",\n                            \"text\": \" tag!\"\n                        }\n                    ],\n                    \"frontmatter\": {}\n                }\n            ],\n            \"childrenIncludingDocuments\": [\n                2,\n                3,\n                27\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Documents\",\n                    \"children\": [\n                        2\n                    ]\n                },\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        3\n                    ]\n                },\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        27\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"comment.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://comment.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 28,\n            \"name\": \"comment2\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a module doc with the packageDocumentation tag to mark it as documentation\\nfor the whole module. It is *not* documentation for the \"\n                    },\n                    {\n                        \"kind\": \"code\",\n                        \"text\": \"`multiply`\"\n                    },\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \" function.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 29,\n                    \"name\": \"multiply\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"comment2.ts\",\n                            \"line\": 8,\n                            \"character\": 16,\n                            \"url\": \"typedoc://comment2.ts#L8\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 30,\n                            \"name\": \"multiply\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"comment2.ts\",\n                                    \"line\": 8,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://comment2.ts#L8\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 31,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 32,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        29\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"comment2.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://comment2.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 33,\n            \"name\": \"comment3\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a module doc with the module tag to mark it as documentation\\nfor the whole module. It is *not* documentation for the \"\n                    },\n                    {\n                        \"kind\": \"code\",\n                        \"text\": \"`multiply`\"\n                    },\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \" function.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 34,\n                    \"name\": \"multiply\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"comment3.ts\",\n                            \"line\": 8,\n                            \"character\": 16,\n                            \"url\": \"typedoc://comment3.ts#L8\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 35,\n                            \"name\": \"multiply\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"comment3.ts\",\n                                    \"line\": 8,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://comment3.ts#L8\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 36,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        34\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"comment3.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://comment3.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 38,\n            \"name\": \"comment4\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a comment containing a multiline code block\\n\"\n                    },\n                    {\n                        \"kind\": \"code\",\n                        \"text\": \"```ts\\nexport function multiply(a: number, b: number) {\\n  return a * b;\\n}\\n```\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 39,\n                    \"name\": \"multiply\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"comment4.ts\",\n                            \"line\": 11,\n                            \"character\": 16,\n                            \"url\": \"typedoc://comment4.ts#L11\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 40,\n                            \"name\": \"multiply\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"comment4.ts\",\n                                    \"line\": 11,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://comment4.ts#L11\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 42,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        39\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"comment4.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://comment4.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                28,\n                33,\n                38\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"CommentedClass\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"CommentedClass.prop\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"CommentedClass.mixedHidden\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"CommentedClass.mixedHidden\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"arg1\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"arg2\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment.ts\",\n            \"qualifiedName\": \"UnionWithCommentsOnMembers\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment2.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment2.ts\",\n            \"qualifiedName\": \"multiply\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment2.ts\",\n            \"qualifiedName\": \"multiply\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment2.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment2.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment3.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment3.ts\",\n            \"qualifiedName\": \"multiply\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment3.ts\",\n            \"qualifiedName\": \"multiply\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment3.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment3.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment4.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment4.ts\",\n            \"qualifiedName\": \"multiply\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment4.ts\",\n            \"qualifiedName\": \"multiply\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment4.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/comment/comment4.ts\",\n            \"qualifiedName\": \"b\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/comment/comment.ts\",\n            \"2\": \"src/test/converter/comment/document.md\",\n            \"3\": \"src/test/converter/comment/comment2.ts\",\n            \"4\": \"src/test/converter/comment/comment3.ts\",\n            \"5\": \"src/test/converter/comment/comment4.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 2,\n            \"3\": 28,\n            \"4\": 33,\n            \"5\": 38\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/declaration/declaration.d.ts",
    "content": "export declare class Decl {\n    prop: number;\n}\n\nexport declare const x: number;\n"
  },
  {
    "path": "src/test/converter/declaration/export-declaration.d.ts",
    "content": "export declare class Exported {}\n\ndeclare class NotExported {}\n"
  },
  {
    "path": "src/test/converter/declaration/external.d.ts",
    "content": "import ts = require(\"typescript\");\n\nexport const ActionSet: ts.server.ActionSet;\n"
  },
  {
    "path": "src/test/converter/declaration/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"declaration\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"declaration\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"Decl\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 4,\n                                    \"name\": \"Decl\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 2,\n                                        \"name\": \"Decl\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 5,\n                            \"name\": \"prop\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"declaration.d.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://declaration.d.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                3\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                5\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"declaration.d.ts\",\n                            \"line\": 1,\n                            \"character\": 21,\n                            \"url\": \"typedoc://declaration.d.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"x\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"declaration.d.ts\",\n                            \"line\": 5,\n                            \"character\": 21,\n                            \"url\": \"typedoc://declaration.d.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        2\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        6\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"declaration.d.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://declaration.d.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 7,\n            \"name\": \"export-declaration\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 8,\n                    \"name\": \"Exported\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 9,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 10,\n                                    \"name\": \"Exported\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 8,\n                                        \"name\": \"Exported\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                9\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-declaration.d.ts\",\n                            \"line\": 1,\n                            \"character\": 21,\n                            \"url\": \"typedoc://export-declaration.d.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"NotExported\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 12,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 13,\n                                    \"name\": \"NotExported\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 11,\n                                        \"name\": \"NotExported\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                12\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-declaration.d.ts\",\n                            \"line\": 3,\n                            \"character\": 14,\n                            \"url\": \"typedoc://export-declaration.d.ts#L3\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        8,\n                        11\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export-declaration.d.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export-declaration.d.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 14,\n            \"name\": \"external\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 15,\n                    \"name\": \"ActionSet\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"external.d.ts\",\n                            \"line\": 3,\n                            \"character\": 13,\n                            \"url\": \"typedoc://external.d.ts#L3\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": {\n                            \"packageName\": \"typescript\",\n                            \"packagePath\": \"lib/typescript.d.ts\",\n                            \"qualifiedName\": \"ts.server.ActionSet\"\n                        },\n                        \"name\": \"ts.server.ActionSet\",\n                        \"package\": \"typescript\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        15\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"external.d.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://external.d.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                7,\n                14\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/declaration.d.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/declaration.d.ts\",\n            \"qualifiedName\": \"Decl\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/declaration.d.ts\",\n            \"qualifiedName\": \"Decl.prop\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/declaration.d.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/export-declaration.d.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/export-declaration.d.ts\",\n            \"qualifiedName\": \"Exported\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/export-declaration.d.ts\",\n            \"qualifiedName\": \"NotExported\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/external.d.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/declaration/external.d.ts\",\n            \"qualifiedName\": \"ActionSet\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/declaration/declaration.d.ts\",\n            \"2\": \"src/test/converter/declaration/export-declaration.d.ts\",\n            \"3\": \"src/test/converter/declaration/external.d.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 7,\n            \"3\": 14\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/enum/enum.ts",
    "content": "/**\n * This is a simple enumeration.\n */\nexport enum SimpleEnum {\n    /**\n     * This is the first enum member.\n     */\n    EnumValue1 = 1,\n\n    /**\n     * This is the second enum member.\n     */\n    EnumValue2 = 2,\n\n    /**\n     * This is the third enum member.\n     */\n    EnumValue3 = 4,\n}\n\n/**\n * This is an enumeration extended by a module.\n */\nexport enum ModuleEnum {\n    /**\n     * This is the first enum member.\n     */\n    EnumValue1 = 1,\n\n    /**\n     * This is the second enum member.\n     */\n    EnumValue2 = 2,\n\n    /**\n     * This is the third enum member.\n     */\n    EnumValue3 = 4,\n}\n\n/**\n * This is a module extending an enumeration.\n */\nexport namespace ModuleEnum {\n    /**\n     * This is a variable appended to an enumeration.\n     */\n    export let enumValue: string;\n\n    /**\n     * This is a function appended to an enumeration.\n     */\n    export function enumFunction() {}\n}\n\n/**\n * This is a const enum.\n */\nexport const enum ConstEnum {\n    a = 1,\n    b = a + 1,\n}\n"
  },
  {
    "path": "src/test/converter/enum/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"enum\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 9,\n            \"name\": \"ModuleEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 4,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a module extending an enumeration.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 12,\n                    \"name\": \"enumValue\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is a variable appended to an enumeration.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 48,\n                            \"character\": 15,\n                            \"url\": \"typedoc://enum.ts#L48\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"enumFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 53,\n                            \"character\": 20,\n                            \"url\": \"typedoc://enum.ts#L53\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 11,\n                            \"name\": \"enumFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function appended to an enumeration.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"enum.ts\",\n                                    \"line\": 53,\n                                    \"character\": 20,\n                                    \"url\": \"typedoc://enum.ts#L53\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        12\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        10\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 24,\n                    \"character\": 12,\n                    \"url\": \"typedoc://enum.ts#L24\"\n                },\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 44,\n                    \"character\": 17,\n                    \"url\": \"typedoc://enum.ts#L44\"\n                }\n            ]\n        },\n        {\n            \"id\": 13,\n            \"name\": \"ConstEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 8,\n            \"flags\": {\n                \"isConst\": true\n            },\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a const enum.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 14,\n                    \"name\": \"a\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 60,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L60\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    }\n                },\n                {\n                    \"id\": 15,\n                    \"name\": \"b\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 61,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L61\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 2\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumeration Members\",\n                    \"children\": [\n                        14,\n                        15\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 59,\n                    \"character\": 18,\n                    \"url\": \"typedoc://enum.ts#L59\"\n                }\n            ]\n        },\n        {\n            \"id\": 5,\n            \"name\": \"ModuleEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 8,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is an enumeration extended by a module.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 6,\n                    \"name\": \"EnumValue1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the first enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 28,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L28\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    }\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"EnumValue2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the second enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 33,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L33\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 2\n                    }\n                },\n                {\n                    \"id\": 8,\n                    \"name\": \"EnumValue3\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the third enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 38,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L38\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 4\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumeration Members\",\n                    \"children\": [\n                        6,\n                        7,\n                        8\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 24,\n                    \"character\": 12,\n                    \"url\": \"typedoc://enum.ts#L24\"\n                },\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 44,\n                    \"character\": 17,\n                    \"url\": \"typedoc://enum.ts#L44\"\n                }\n            ]\n        },\n        {\n            \"id\": 1,\n            \"name\": \"SimpleEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 8,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a simple enumeration.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"EnumValue1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the first enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 8,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L8\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    }\n                },\n                {\n                    \"id\": 3,\n                    \"name\": \"EnumValue2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the second enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 13,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L13\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 2\n                    }\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"EnumValue3\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the third enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 18,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L18\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 4\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumeration Members\",\n                    \"children\": [\n                        2,\n                        3,\n                        4\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 4,\n                    \"character\": 12,\n                    \"url\": \"typedoc://enum.ts#L4\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Namespaces\",\n            \"children\": [\n                9\n            ]\n        },\n        {\n            \"title\": \"Enumerations\",\n            \"children\": [\n                13,\n                5,\n                1\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"0\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum.EnumValue1\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum.EnumValue2\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum.EnumValue3\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.EnumValue1\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.EnumValue2\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.EnumValue3\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.enumFunction\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.enumFunction\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.enumValue\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ConstEnum\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ConstEnum.a\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ConstEnum.b\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/enum/enum.ts\"\n        },\n        \"reflections\": {\n            \"1\": 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/enum/specs.nodoc.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"enum\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 9,\n            \"name\": \"ModuleEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 4,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a module extending an enumeration.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 12,\n                    \"name\": \"enumValue\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is a variable appended to an enumeration.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 48,\n                            \"character\": 15,\n                            \"url\": \"typedoc://enum.ts#L48\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"enumFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 53,\n                            \"character\": 20,\n                            \"url\": \"typedoc://enum.ts#L53\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 11,\n                            \"name\": \"enumFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function appended to an enumeration.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"enum.ts\",\n                                    \"line\": 53,\n                                    \"character\": 20,\n                                    \"url\": \"typedoc://enum.ts#L53\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        12\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        10\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 24,\n                    \"character\": 12,\n                    \"url\": \"typedoc://enum.ts#L24\"\n                },\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 44,\n                    \"character\": 17,\n                    \"url\": \"typedoc://enum.ts#L44\"\n                }\n            ]\n        },\n        {\n            \"id\": 13,\n            \"name\": \"ConstEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 8,\n            \"flags\": {\n                \"isConst\": true\n            },\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a const enum.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 14,\n                    \"name\": \"a\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 60,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L60\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    }\n                },\n                {\n                    \"id\": 15,\n                    \"name\": \"b\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 61,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L61\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 2\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumeration Members\",\n                    \"children\": [\n                        14,\n                        15\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 59,\n                    \"character\": 18,\n                    \"url\": \"typedoc://enum.ts#L59\"\n                }\n            ]\n        },\n        {\n            \"id\": 5,\n            \"name\": \"ModuleEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 8,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is an enumeration extended by a module.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 6,\n                    \"name\": \"EnumValue1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the first enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 28,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L28\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    }\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"EnumValue2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the second enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 33,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L33\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 2\n                    }\n                },\n                {\n                    \"id\": 8,\n                    \"name\": \"EnumValue3\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the third enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 38,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L38\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 4\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumeration Members\",\n                    \"children\": [\n                        6,\n                        7,\n                        8\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 24,\n                    \"character\": 12,\n                    \"url\": \"typedoc://enum.ts#L24\"\n                },\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 44,\n                    \"character\": 17,\n                    \"url\": \"typedoc://enum.ts#L44\"\n                }\n            ]\n        },\n        {\n            \"id\": 1,\n            \"name\": \"SimpleEnum\",\n            \"variant\": \"declaration\",\n            \"kind\": 8,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This is a simple enumeration.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"EnumValue1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the first enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 8,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L8\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    }\n                },\n                {\n                    \"id\": 3,\n                    \"name\": \"EnumValue2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the second enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 13,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L13\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 2\n                    }\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"EnumValue3\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 16,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the third enum member.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"enum.ts\",\n                            \"line\": 18,\n                            \"character\": 4,\n                            \"url\": \"typedoc://enum.ts#L18\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 4\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumeration Members\",\n                    \"children\": [\n                        2,\n                        3,\n                        4\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"enum.ts\",\n                    \"line\": 4,\n                    \"character\": 12,\n                    \"url\": \"typedoc://enum.ts#L4\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Namespaces\",\n            \"children\": [\n                9\n            ]\n        },\n        {\n            \"title\": \"Enumerations\",\n            \"children\": [\n                13,\n                5,\n                1\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"0\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum.EnumValue1\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum.EnumValue2\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"SimpleEnum.EnumValue3\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.EnumValue1\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.EnumValue2\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.EnumValue3\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.enumFunction\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.enumFunction\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ModuleEnum.enumValue\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ConstEnum\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ConstEnum.a\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/enum/enum.ts\",\n            \"qualifiedName\": \"ConstEnum.b\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/enum/enum.ts\"\n        },\n        \"reflections\": {\n            \"1\": 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/exports/export-assignment.ts",
    "content": "function add(x: number, y: number) {\n    return x + y;\n}\n\nexport = add;\n"
  },
  {
    "path": "src/test/converter/exports/export-default.ts",
    "content": "const x = 5;\nexport default x;\n"
  },
  {
    "path": "src/test/converter/exports/export-with-local.ts",
    "content": "export const x = 5;\n\n// This will not show up in the generated docs\nlet localVar = 0;\n\nexport function add(x: number, y: number) {\n    return x + y + localVar;\n}\n"
  },
  {
    "path": "src/test/converter/exports/export.ts",
    "content": "import ModDefault, { a as b } from \"./mod.js\";\nimport * as Mod from \"./mod.js\";\nexport * from \"./mod.js\";\n\nexport { add, b as c, Mod, ModDefault };\n\nfunction add(x: number, y: number) {\n    return x + y;\n}\n\n/**\n * This is a comment for Mod that overwrites the one specified in \"mod\"\n */\nexport * as Mod2 from \"./mod.js\";\n\n// Note that this will show up in the docs, not the default function from mod.\n// export * from \"./mod.js\" does *not* re-export the default function.\nexport default function (a: number) {}\n\nimport * as x from \"./test.json\";\n\n/** @hidden */\nexport const x2: string = x.issue;\n\nexport namespace GH1453 {\n    export const Module = Mod;\n    export const TypedModule: typeof import(\"./mod\") = Mod;\n    export const Member = Mod.a;\n    export const TypedMember: typeof import(\"./mod\").a = Mod.a;\n\n    export type Foo = import(\"./mod\").GH1453Helper;\n}\n"
  },
  {
    "path": "src/test/converter/exports/mod.ts",
    "content": "/**\n * Doc comment for Mod\n */\n\n/**\n * A simple named export that will be exported from export.ts\n */\nexport const a = 1;\n\n/**\n * An export of a local under a different name.\n */\nexport { a as b };\n\n/**\n * An export with a module specifier that comes from this file.\n */\nexport { a as c } from \"./mod.js\";\n\n/**\n * Will not be re-exported from export.ts using export * from...\n */\nexport default function () {}\n\n/**\n * This is annotated with the hidden tag and will therefore not be included in the generated documentation.\n * This *would* cause a broken link since it is also re-exported from export.ts, but the CommentPlugin removes\n * broken links caused by hidden/ignore/internal tags.\n * @hidden\n */\nexport const hidden = true;\n\n/**\n * This export is from a file external to the documentation that will not be included in the resulting docs.\n * No reference should be created.\n */\nexport { Node } from \"typescript\";\n\n// TS 3.8 namespace exports\nexport * as ThisModule from \"./mod.js\";\n\nexport type GH1453Helper = `1`;\n"
  },
  {
    "path": "src/test/converter/exports/no-doc-members.ts",
    "content": "/**\n * This module has documentation, but no exported members do.\n * @see https://github.com/TypeStrong/typedoc/issues/1948\n * @module\n */\nexport const abc = 123;\n"
  },
  {
    "path": "src/test/converter/exports/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"exports\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 9,\n            \"name\": \"export\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 11,\n                    \"name\": \"GH1453\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 4,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 16,\n                            \"name\": \"Foo\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2097152,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 31,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://export.ts#L31\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 20,\n                                \"name\": \"GH1453Helper\",\n                                \"package\": \"typedoc\"\n                            }\n                        },\n                        {\n                            \"id\": 14,\n                            \"name\": \"Member\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 32,\n                            \"flags\": {\n                                \"isConst\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 28,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://export.ts#L28\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            \"defaultValue\": \"Mod.a\"\n                        },\n                        {\n                            \"id\": 12,\n                            \"name\": \"Module\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 32,\n                            \"flags\": {\n                                \"isConst\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 26,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://export.ts#L26\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 17,\n                                \"name\": \"__module\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"defaultValue\": \"Mod\"\n                        },\n                        {\n                            \"id\": 15,\n                            \"name\": \"TypedMember\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 32,\n                            \"flags\": {\n                                \"isConst\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 29,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://export.ts#L29\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 18,\n                                \"name\": \"a\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"defaultValue\": \"Mod.a\"\n                        },\n                        {\n                            \"id\": 13,\n                            \"name\": \"TypedModule\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 32,\n                            \"flags\": {\n                                \"isConst\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 27,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://export.ts#L27\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 17,\n                                \"name\": \"__module\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"defaultValue\": \"Mod\"\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Type Aliases\",\n                            \"children\": [\n                                16\n                            ]\n                        },\n                        {\n                            \"title\": \"Variables\",\n                            \"children\": [\n                                14,\n                                12,\n                                15,\n                                13\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 25,\n                            \"character\": 17,\n                            \"url\": \"typedoc://export.ts#L25\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"add\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 7,\n                            \"character\": 9,\n                            \"url\": \"typedoc://export.ts#L7\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 28,\n                            \"name\": \"add\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 7,\n                                    \"character\": 9,\n                                    \"url\": \"typedoc://export.ts#L7\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 29,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 30,\n                                    \"name\": \"y\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 31,\n                    \"name\": \"default\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 18,\n                            \"character\": 0,\n                            \"url\": \"typedoc://export.ts#L18\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 32,\n                            \"name\": \"default\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export.ts\",\n                                    \"line\": 18,\n                                    \"character\": 0,\n                                    \"url\": \"typedoc://export.ts#L18\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 33,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 34,\n                    \"name\": \"a\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://mod.ts#L8\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 46,\n                    \"name\": \"b\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An export of a local under a different name.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 13,\n                            \"character\": 14,\n                            \"url\": \"typedoc://mod.ts#L13\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 42,\n                    \"name\": \"c\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 5,\n                            \"character\": 19,\n                            \"url\": \"typedoc://export.ts#L5\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 36,\n                    \"name\": \"GH1453Helper\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 42,\n                            \"character\": 12,\n                            \"url\": \"typedoc://mod.ts#L42\"\n                        }\n                    ],\n                    \"target\": 20\n                },\n                {\n                    \"id\": 43,\n                    \"name\": \"Mod\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 5,\n                            \"character\": 22,\n                            \"url\": \"typedoc://export.ts#L5\"\n                        }\n                    ],\n                    \"target\": 17\n                },\n                {\n                    \"id\": 45,\n                    \"name\": \"Mod2\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is a comment for Mod that overwrites the one specified in \\\"mod\\\"\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 14,\n                            \"character\": 12,\n                            \"url\": \"typedoc://export.ts#L14\"\n                        }\n                    ],\n                    \"target\": 17\n                },\n                {\n                    \"id\": 44,\n                    \"name\": \"ModDefault\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 5,\n                            \"character\": 27,\n                            \"url\": \"typedoc://export.ts#L5\"\n                        }\n                    ],\n                    \"target\": 40\n                },\n                {\n                    \"id\": 47,\n                    \"name\": \"ThisModule\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 40,\n                            \"character\": 12,\n                            \"url\": \"typedoc://mod.ts#L40\"\n                        }\n                    ],\n                    \"target\": 17\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Namespaces\",\n                    \"children\": [\n                        11\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        27,\n                        31\n                    ]\n                },\n                {\n                    \"title\": \"References\",\n                    \"children\": [\n                        34,\n                        46,\n                        42,\n                        36,\n                        43,\n                        45,\n                        44,\n                        47\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 1,\n            \"name\": \"export-assignment\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 23,\n                    \"name\": \"export=\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-assignment.ts\",\n                            \"line\": 1,\n                            \"character\": 9,\n                            \"url\": \"typedoc://export-assignment.ts#L1\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 24,\n                            \"name\": \"export=\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export-assignment.ts\",\n                                    \"line\": 1,\n                                    \"character\": 9,\n                                    \"url\": \"typedoc://export-assignment.ts#L1\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 25,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 26,\n                                    \"name\": \"y\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        23\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export-assignment.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export-assignment.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 2,\n            \"name\": \"export-default\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 48,\n                    \"name\": \"default\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-default.ts\",\n                            \"line\": 1,\n                            \"character\": 6,\n                            \"url\": \"typedoc://export-default.ts#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 5\n                    },\n                    \"defaultValue\": \"5\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        48\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export-default.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export-default.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 3,\n            \"name\": \"export-with-local\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 8,\n                    \"name\": \"x\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-with-local.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://export-with-local.ts#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 5\n                    },\n                    \"defaultValue\": \"5\"\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"add\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-with-local.ts\",\n                            \"line\": 6,\n                            \"character\": 16,\n                            \"url\": \"typedoc://export-with-local.ts#L6\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 5,\n                            \"name\": \"add\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export-with-local.ts\",\n                                    \"line\": 6,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://export-with-local.ts#L6\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 6,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 7,\n                                    \"name\": \"y\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        8\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        4\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export-with-local.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export-with-local.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 17,\n            \"name\": \"mod\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 20,\n                    \"name\": \"GH1453Helper\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 42,\n                            \"character\": 12,\n                            \"url\": \"typedoc://mod.ts#L42\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": \"1\"\n                    }\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"a\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A simple named export that will be exported from export.ts\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://mod.ts#L8\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    },\n                    \"defaultValue\": \"1\"\n                },\n                {\n                    \"id\": 40,\n                    \"name\": \"default\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 23,\n                            \"character\": 0,\n                            \"url\": \"typedoc://mod.ts#L23\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 41,\n                            \"name\": \"default\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Will not be re-exported from export.ts using export * from...\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mod.ts\",\n                                    \"line\": 23,\n                                    \"character\": 0,\n                                    \"url\": \"typedoc://mod.ts#L23\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 37,\n                    \"name\": \"b\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An export of a local under a different name.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 13,\n                            \"character\": 14,\n                            \"url\": \"typedoc://mod.ts#L13\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"c\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An export with a module specifier that comes from this file.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 18,\n                            \"character\": 14,\n                            \"url\": \"typedoc://mod.ts#L18\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 39,\n                    \"name\": \"ThisModule\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 40,\n                            \"character\": 12,\n                            \"url\": \"typedoc://mod.ts#L40\"\n                        }\n                    ],\n                    \"target\": 17\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        20\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        18\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        40\n                    ]\n                },\n                {\n                    \"title\": \"References\",\n                    \"children\": [\n                        37,\n                        38,\n                        39\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mod.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://mod.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 21,\n            \"name\": \"no-doc-members\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This module has documentation, but no exported members do.\"\n                    }\n                ],\n                \"blockTags\": [\n                    {\n                        \"tag\": \"@see\",\n                        \"content\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"https://github.com/TypeStrong/typedoc/issues/1948\"\n                            }\n                        ]\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 22,\n                    \"name\": \"abc\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"no-doc-members.ts\",\n                            \"line\": 6,\n                            \"character\": 13,\n                            \"url\": \"typedoc://no-doc-members.ts#L6\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 123\n                    },\n                    \"defaultValue\": \"123\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        22\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"no-doc-members.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://no-doc-members.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                9,\n                1,\n                2,\n                3,\n                17,\n                21\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-assignment.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-default.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-with-local.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-with-local.ts\",\n            \"qualifiedName\": \"add\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-with-local.ts\",\n            \"qualifiedName\": \"add\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-with-local.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-with-local.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-with-local.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"GH1453\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"GH1453.Module\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"GH1453.TypedModule\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"GH1453.Member\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"GH1453.TypedMember\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"GH1453.Foo\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"GH1453Helper\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/no-doc-members.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/no-doc-members.ts\",\n            \"qualifiedName\": \"abc\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-assignment.ts\",\n            \"qualifiedName\": \"add\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-assignment.ts\",\n            \"qualifiedName\": \"add\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-assignment.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-assignment.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"add\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"add\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"default\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"default\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"GH1453Helper\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"c\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"ThisModule\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"default\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"default\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"c\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"Mod\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"ModDefault\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"Mod2\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"ThisModule\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export-default.ts\",\n            \"qualifiedName\": \"x\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/exports/export-assignment.ts\",\n            \"2\": \"src/test/converter/exports/export-default.ts\",\n            \"3\": \"src/test/converter/exports/export-with-local.ts\",\n            \"4\": \"src/test/converter/exports/export.ts\",\n            \"5\": \"src/test/converter/exports/mod.ts\",\n            \"6\": \"src/test/converter/exports/no-doc-members.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 2,\n            \"3\": 3,\n            \"4\": 9,\n            \"5\": 17,\n            \"6\": 21\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/exports/specs.nodoc.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"exports\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 9,\n            \"name\": \"export\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 46,\n                    \"name\": \"b\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An export of a local under a different name.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 13,\n                            \"character\": 14,\n                            \"url\": \"typedoc://mod.ts#L13\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 45,\n                    \"name\": \"Mod2\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is a comment for Mod that overwrites the one specified in \\\"mod\\\"\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export.ts\",\n                            \"line\": 14,\n                            \"character\": 12,\n                            \"url\": \"typedoc://export.ts#L14\"\n                        }\n                    ],\n                    \"target\": 17\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"References\",\n                    \"children\": [\n                        46,\n                        45\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 17,\n            \"name\": \"mod\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 18,\n                    \"name\": \"a\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A simple named export that will be exported from export.ts\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 8,\n                            \"character\": 13,\n                            \"url\": \"typedoc://mod.ts#L8\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    },\n                    \"defaultValue\": \"1\"\n                },\n                {\n                    \"id\": 40,\n                    \"name\": \"default\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 23,\n                            \"character\": 0,\n                            \"url\": \"typedoc://mod.ts#L23\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 41,\n                            \"name\": \"default\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Will not be re-exported from export.ts using export * from...\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mod.ts\",\n                                    \"line\": 23,\n                                    \"character\": 0,\n                                    \"url\": \"typedoc://mod.ts#L23\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 37,\n                    \"name\": \"b\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An export of a local under a different name.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 13,\n                            \"character\": 14,\n                            \"url\": \"typedoc://mod.ts#L13\"\n                        }\n                    ],\n                    \"target\": 18\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"c\",\n                    \"variant\": \"reference\",\n                    \"kind\": 4194304,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An export with a module specifier that comes from this file.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mod.ts\",\n                            \"line\": 18,\n                            \"character\": 14,\n                            \"url\": \"typedoc://mod.ts#L18\"\n                        }\n                    ],\n                    \"target\": 18\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        18\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        40\n                    ]\n                },\n                {\n                    \"title\": \"References\",\n                    \"children\": [\n                        37,\n                        38\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mod.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://mod.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 21,\n            \"name\": \"no-doc-members\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"This module has documentation, but no exported members do.\"\n                    }\n                ],\n                \"blockTags\": [\n                    {\n                        \"tag\": \"@see\",\n                        \"content\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"https://github.com/TypeStrong/typedoc/issues/1948\"\n                            }\n                        ]\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"no-doc-members.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://no-doc-members.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                9,\n                17,\n                21\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/no-doc-members.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"c\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"default\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"default\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/export.ts\",\n            \"qualifiedName\": \"Mod2\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/exports/mod.ts\",\n            \"qualifiedName\": \"b\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/exports/export-assignment.ts\",\n            \"2\": \"src/test/converter/exports/export-default.ts\",\n            \"3\": \"src/test/converter/exports/export-with-local.ts\",\n            \"4\": \"src/test/converter/exports/export.ts\",\n            \"5\": \"src/test/converter/exports/mod.ts\",\n            \"6\": \"src/test/converter/exports/no-doc-members.ts\"\n        },\n        \"reflections\": {\n            \"4\": 9,\n            \"5\": 17,\n            \"6\": 21\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/exports/test.json",
    "content": "{\n    \"issue\": \"https://github.com/TypeStrong/typedoc/issues/1323\"\n}\n"
  },
  {
    "path": "src/test/converter/function/function.ts",
    "content": "/**\n * This is a simple exported function.\n */\nexport function exportedFunction(): void {}\n\n/**\n * This is a function with multiple arguments and a return value.\n *\n * @param paramZ - This is a string parameter.\n * @param paramG - This is a parameter flagged with any.\n *     This sentence is placed in the next line.\n *\n * @param paramA\n *   This is a **parameter** pointing to an interface.\n *\n *   ```\n *   const value:BaseClass = new BaseClass('test');\n *   functionWithArguments('arg', 0, value);\n *   ```\n *\n * @returns This is the return value of the function.\n */\nexport function functionWithParameters(\n    paramZ: string,\n    paramG: any,\n    paramA: Object,\n): number {\n    return 0;\n}\n\n/**\n * This is a function that is assigned to a variable.\n *\n * @param someParam  This is some numeric parameter.\n * @return This is the return value of the function.\n */\nexport const variableFunction = function (someParam: number): number {\n    return 0;\n};\n\n/**\n * This is a function with a parameter that is optional.\n *\n * @param requiredParam  A normal parameter.\n * @param optionalParam  An optional parameter.\n */\nexport function functionWithOptionalValue(\n    requiredParam: string,\n    optionalParam?: string,\n) {}\n\n/**\n * This is a function with a parameter that has a default value.\n *\n * @param valueA  A parameter with a default string value.\n * @param valueB  A parameter with a default numeric value.\n * @param valueC  A parameter with a default NaN value.\n * @param valueD  A parameter with a default boolean value.\n * @param valueE  A parameter with a default null value.\n * @return This is the return value of the function.\n */\nexport function functionWithDefaults(\n    valueA: string = \"defaultValue\",\n    valueB: number = 100,\n    valueC: number = Number.NaN,\n    valueD: boolean = true,\n    valueE: boolean = null!,\n): string {\n    return valueA;\n}\n\n/**\n * This is a function with rest parameter.\n *\n * @param rest  The rest parameter.\n * @return This is the return value of the function.\n */\nexport function functionWithRest(...rest: string[]): string {\n    return rest.join(\", \");\n}\n\n/**\n * This is the first signature of a function with multiple signatures.\n *\n * @param value  The name value.\n */\nexport function multipleSignatures(value: string): string;\n\n/**\n * This is the second signature of a function with multiple signatures.\n *\n * @param value       An object containing the name value.\n * @param value.name  A value of the object.\n */\nexport function multipleSignatures(value: { name: string }): string;\n\n/**\n * This comment is on the actual implementation of the function.\n * TypeDoc used to allow this for providing \"default\" comments that would be\n * copied to each signature. It no longer does this, and instead treats\n * this comment as belonging to the function reflection itself.\n * Any `@param` or `@returns` tags within this comment won't be applied\n * to signatures.\n */\nexport function multipleSignatures(): string {\n    if (arguments.length > 0) {\n        if (typeof arguments[0] === \"object\") {\n            return arguments[0].name;\n        } else {\n            return arguments[0];\n        }\n    }\n\n    return \"\";\n}\n\n/**\n * This is a function that is extended by a module.\n *\n * @param arg An argument.\n */\nexport function moduleFunction(arg: string): string {\n    return \"\";\n}\n\n/**\n * This is an assertion function.\n *\n * @param condition The condition that is asserted to be true when this function returns.\n */\nexport function assertionFunction(condition: boolean): asserts condition {}\n\n/**\n * Assertion function with a type.\n * @param anything\n */\nexport function checkerFunction(anything: any): anything is string {\n    return typeof anything === \"string\";\n}\n\n/**\n * Asserts that an argument is not null.\n * @param arg\n */\nexport function assertIsNonNull<T>(\n    arg: T | null | undefined,\n): asserts arg is T {\n    if (arg == null) {\n        throw new Error(\"Was nullable\");\n    }\n}\n\n/**\n * Checks that an argument is not null.\n * @param arg\n */\nexport function isNonNull<T>(arg: T | null | undefined): arg is T {\n    return arg != null;\n}\n\n/**\n * This is the module extending the function moduleFunction().\n */\nexport namespace moduleFunction {\n    /**\n     * This variable is appended to a function.\n     */\n    export let functionVariable: string;\n\n    /**\n     * This function is appended to another function.\n     */\n    export function append() {}\n\n    /**\n     * This function is appended to another function.\n     */\n    export function prepend() {}\n}\n\nexport class Predicates {\n    static isString(x: unknown): x is string {\n        return false;\n    }\n    isString(): this is string {\n        return false;\n    }\n    static assert(x: unknown): asserts x {}\n    assertString(): asserts this is string {}\n}\n\n/**\n * Returns true if fn returns true for every item in the iterator\n *\n * Returns true if the iterator is empty\n * @function\n */\nexport const all: {\n    <T>(fn: (item: T) => boolean, iterator: Iterable<T>): boolean;\n    <T>(fn: (item: T) => boolean): (iterator: Iterable<T>) => boolean;\n} = () => false as any;\n\nexport function boolOrUndef(x: number) {\n    if (x < 5) return true;\n    if (x > 20) return false;\n    return undefined;\n}\n\nexport function merged() {}\nmerged.nsFn = function () {};\n"
  },
  {
    "path": "src/test/converter/function/generic-function.ts",
    "content": "/**\n * Generic function short text.\n * @param <T>      Generic function type parameter.\n * @param value  Generic function parameter.\n * @returns      Generic function return value.\n */\nexport function genericFunction<T extends Object>(value: T): T {\n    return value;\n}\n\n/**\n * A function with a generic type array parameter.\n *\n * @param param A generic parameter.\n * @param params A generic array parameter.\n * @returns A generic array.\n */\nexport function functionWithGenericArrayParameter<T>(\n    param: T,\n    params: T[],\n): T[] {\n    return params;\n}\n\n/**\n * @param param this describes param\n * @template T this describes T\n */\nexport function functionWithTemplate<T>(param: T): T {\n    return param;\n}\n"
  },
  {
    "path": "src/test/converter/function/implicit-types.ts",
    "content": "export interface BreakpointRange {\n    start: number;\n    end: number;\n}\n\nlet _breakpoints: {\n    small: BreakpointRange;\n    medium: BreakpointRange;\n    large: BreakpointRange;\n    xlarge: BreakpointRange;\n    xxlarge: BreakpointRange;\n};\n\nexport function getBreakpoints() {\n    if (!_breakpoints) {\n        const small = 64;\n        const medium = 128;\n        const large = 256;\n        const xlarge = 512;\n        const xxlarge = 1024;\n\n        _breakpoints = {\n            small: { start: small, end: medium },\n            medium: { start: medium, end: large },\n            large: { start: large, end: xlarge },\n            xlarge: { start: xlarge, end: xxlarge },\n            xxlarge: { start: xxlarge, end: 999999999 },\n        };\n    }\n\n    return _breakpoints;\n}\n"
  },
  {
    "path": "src/test/converter/function/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"function\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"function\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 33,\n                    \"name\": \"moduleFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 4,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This is the module extending the function moduleFunction().\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 38,\n                            \"name\": \"functionVariable\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 32,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This variable is appended to a function.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 168,\n                                    \"character\": 15,\n                                    \"url\": \"typedoc://function.ts#L168\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 34,\n                            \"name\": \"append\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 64,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 173,\n                                    \"character\": 20,\n                                    \"url\": \"typedoc://function.ts#L173\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 35,\n                                    \"name\": \"append\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This function is appended to another function.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 173,\n                                            \"character\": 20,\n                                            \"url\": \"typedoc://function.ts#L173\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 36,\n                            \"name\": \"prepend\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 64,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 178,\n                                    \"character\": 20,\n                                    \"url\": \"typedoc://function.ts#L178\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"prepend\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This function is appended to another function.\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 178,\n                                            \"character\": 20,\n                                            \"url\": \"typedoc://function.ts#L178\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Variables\",\n                            \"children\": [\n                                38\n                            ]\n                        },\n                        {\n                            \"title\": \"Functions\",\n                            \"children\": [\n                                34,\n                                36\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 122,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L122\"\n                        },\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 164,\n                            \"character\": 17,\n                            \"url\": \"typedoc://function.ts#L164\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 63,\n                    \"name\": \"Predicates\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 70,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 71,\n                                    \"name\": \"Predicates\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 63,\n                                        \"name\": \"Predicates\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 74,\n                            \"name\": \"assertString\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 189,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://function.ts#L189\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 75,\n                                    \"name\": \"assertString\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 189,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://function.ts#L189\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"predicate\",\n                                        \"name\": \"this\",\n                                        \"asserts\": true,\n                                        \"targetType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 72,\n                            \"name\": \"isString\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 185,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://function.ts#L185\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 73,\n                                    \"name\": \"isString\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 185,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://function.ts#L185\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"predicate\",\n                                        \"name\": \"this\",\n                                        \"asserts\": false,\n                                        \"targetType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 67,\n                            \"name\": \"assert\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 188,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://function.ts#L188\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 68,\n                                    \"name\": \"assert\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 188,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://function.ts#L188\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 69,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"unknown\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"predicate\",\n                                        \"name\": \"x\",\n                                        \"asserts\": true\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 64,\n                            \"name\": \"isString\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isStatic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 182,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://function.ts#L182\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 65,\n                                    \"name\": \"isString\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 182,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://function.ts#L182\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 66,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"unknown\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"predicate\",\n                                        \"name\": \"x\",\n                                        \"asserts\": false,\n                                        \"targetType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                70\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                74,\n                                72,\n                                67,\n                                64\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 181,\n                            \"character\": 13,\n                            \"url\": \"typedoc://function.ts#L181\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 76,\n                    \"name\": \"all\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Returns true if fn returns true for every item in the iterator\\n\\nReturns true if the iterator is empty\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 198,\n                            \"character\": 13,\n                            \"url\": \"typedoc://function.ts#L198\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 77,\n                            \"name\": \"all\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 199,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://function.ts#L199\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 78,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 79,\n                                    \"name\": \"fn\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 80,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 81,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"parameters\": [\n                                                        {\n                                                            \"id\": 82,\n                                                            \"name\": \"item\",\n                                                            \"variant\": \"param\",\n                                                            \"kind\": 32768,\n                                                            \"flags\": {},\n                                                            \"type\": {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 78,\n                                                                \"name\": \"T\",\n                                                                \"package\": \"typedoc\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"boolean\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                },\n                                {\n                                    \"id\": 83,\n                                    \"name\": \"iterator\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es2015.iterable.d.ts\",\n                                            \"qualifiedName\": \"Iterable\"\n                                        },\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 78,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"Iterable\",\n                                        \"package\": \"typescript\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"boolean\"\n                            }\n                        },\n                        {\n                            \"id\": 84,\n                            \"name\": \"all\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 200,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://function.ts#L200\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 85,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 86,\n                                    \"name\": \"fn\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 87,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 88,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"parameters\": [\n                                                        {\n                                                            \"id\": 89,\n                                                            \"name\": \"item\",\n                                                            \"variant\": \"param\",\n                                                            \"kind\": 32768,\n                                                            \"flags\": {},\n                                                            \"type\": {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 85,\n                                                                \"name\": \"T\",\n                                                                \"package\": \"typedoc\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"boolean\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 90,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 91,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 92,\n                                                    \"name\": \"iterator\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": {\n                                                            \"packageName\": \"typescript\",\n                                                            \"packagePath\": \"lib/lib.es2015.iterable.d.ts\",\n                                                            \"qualifiedName\": \"Iterable\"\n                                                        },\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 85,\n                                                                \"name\": \"T\",\n                                                                \"package\": \"typedoc\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"Iterable\",\n                                                        \"package\": \"typescript\"\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"boolean\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 39,\n                    \"name\": \"assertionFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 131,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L131\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 40,\n                            \"name\": \"assertionFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is an assertion function.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 131,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L131\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"condition\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The condition that is asserted to be true when this function returns.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"predicate\",\n                                \"name\": \"condition\",\n                                \"asserts\": true\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 45,\n                    \"name\": \"assertIsNonNull\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 145,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L145\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 46,\n                            \"name\": \"assertIsNonNull\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Asserts that an argument is not null.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 145,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L145\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 47,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 48,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"union\",\n                                        \"types\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 47,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"refersToTypeParameter\": true\n                                            },\n                                            {\n                                                \"type\": \"literal\",\n                                                \"value\": null\n                                            },\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"undefined\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"predicate\",\n                                \"name\": \"arg\",\n                                \"asserts\": true,\n                                \"targetType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 47,\n                                    \"name\": \"T\",\n                                    \"package\": \"typedoc\",\n                                    \"refersToTypeParameter\": true\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 53,\n                    \"name\": \"boolOrUndef\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 203,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L203\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 54,\n                            \"name\": \"boolOrUndef\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 203,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L203\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 55,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"union\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"undefined\"\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 42,\n                    \"name\": \"checkerFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 137,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L137\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 43,\n                            \"name\": \"checkerFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Assertion function with a type.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 137,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L137\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 44,\n                                    \"name\": \"anything\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"predicate\",\n                                \"name\": \"anything\",\n                                \"asserts\": false,\n                                \"targetType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"exportedFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 4,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L4\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"exportedFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a simple exported function.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 4,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L4\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 13,\n                    \"name\": \"functionWithDefaults\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 62,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L62\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 14,\n                            \"name\": \"functionWithDefaults\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function with a parameter that has a default value.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is the return value of the function.\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 62,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L62\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 15,\n                                    \"name\": \"valueA\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A parameter with a default string value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"defaultValue\": \"\\\"defaultValue\\\"\"\n                                },\n                                {\n                                    \"id\": 16,\n                                    \"name\": \"valueB\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A parameter with a default numeric value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    },\n                                    \"defaultValue\": \"100\"\n                                },\n                                {\n                                    \"id\": 17,\n                                    \"name\": \"valueC\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A parameter with a default NaN value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    },\n                                    \"defaultValue\": \"Number.NaN\"\n                                },\n                                {\n                                    \"id\": 18,\n                                    \"name\": \"valueD\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A parameter with a default boolean value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 19,\n                                    \"name\": \"valueE\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A parameter with a default null value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"...\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"functionWithOptionalValue\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 47,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L47\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 10,\n                            \"name\": \"functionWithOptionalValue\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function with a parameter that is optional.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 47,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L47\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 11,\n                                    \"name\": \"requiredParam\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A normal parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                },\n                                {\n                                    \"id\": 12,\n                                    \"name\": \"optionalParam\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {\n                                        \"isOptional\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"An optional parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"functionWithParameters\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 23,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L23\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 5,\n                            \"name\": \"functionWithParameters\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function with multiple arguments and a return value.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is the return value of the function.\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 23,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L23\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 6,\n                                    \"name\": \"paramZ\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is a string parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                },\n                                {\n                                    \"id\": 7,\n                                    \"name\": \"paramG\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is a parameter flagged with any.\\n    This sentence is placed in the next line.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                },\n                                {\n                                    \"id\": 8,\n                                    \"name\": \"paramA\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is a **parameter** pointing to an interface.\\n\\n  \"\n                                            },\n                                            {\n                                                \"kind\": \"code\",\n                                                \"text\": \"```\\n  const value:BaseClass = new BaseClass('test');\\n  functionWithArguments('arg', 0, value);\\n  ```\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                                            \"qualifiedName\": \"Object\"\n                                        },\n                                        \"name\": \"Object\",\n                                        \"package\": \"typescript\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 20,\n                    \"name\": \"functionWithRest\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 78,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L78\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 21,\n                            \"name\": \"functionWithRest\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function with rest parameter.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is the return value of the function.\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 78,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L78\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 22,\n                                    \"name\": \"rest\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {\n                                        \"isRest\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The rest parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 49,\n                    \"name\": \"isNonNull\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 157,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L157\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 50,\n                            \"name\": \"isNonNull\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Checks that an argument is not null.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 157,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L157\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 51,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 52,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"union\",\n                                        \"types\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 51,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"refersToTypeParameter\": true\n                                            },\n                                            {\n                                                \"type\": \"literal\",\n                                                \"value\": null\n                                            },\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"undefined\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"predicate\",\n                                \"name\": \"arg\",\n                                \"asserts\": false,\n                                \"targetType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 51,\n                                    \"name\": \"T\",\n                                    \"package\": \"typedoc\",\n                                    \"refersToTypeParameter\": true\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 56,\n                    \"name\": \"merged\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 58,\n                            \"name\": \"nsFn\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 210,\n                                    \"character\": 7,\n                                    \"url\": \"typedoc://function.ts#L210\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 59,\n                                    \"name\": \"nsFn\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"function.ts\",\n                                            \"line\": 210,\n                                            \"character\": 14,\n                                            \"url\": \"typedoc://function.ts#L210\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                58\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 209,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L209\"\n                        },\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 210,\n                            \"character\": 0,\n                            \"url\": \"typedoc://function.ts#L210\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 57,\n                            \"name\": \"merged\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 209,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L209\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 30,\n                    \"name\": \"moduleFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 122,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L122\"\n                        },\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 164,\n                            \"character\": 17,\n                            \"url\": \"typedoc://function.ts#L164\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 31,\n                            \"name\": \"moduleFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function that is extended by a module.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 122,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L122\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 32,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"An argument.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 23,\n                    \"name\": \"multipleSignatures\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"This comment is on the actual implementation of the function.\\nTypeDoc used to allow this for providing \\\"default\\\" comments that would be\\ncopied to each signature. It no longer does this, and instead treats\\nthis comment as belonging to the function reflection itself.\\nAny \"\n                            },\n                            {\n                                \"kind\": \"code\",\n                                \"text\": \"`@param`\"\n                            },\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \" or \"\n                            },\n                            {\n                                \"kind\": \"code\",\n                                \"text\": \"`@returns`\"\n                            },\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \" tags within this comment won't be applied\\nto signatures.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 87,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L87\"\n                        },\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 95,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L95\"\n                        },\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 105,\n                            \"character\": 16,\n                            \"url\": \"typedoc://function.ts#L105\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 24,\n                            \"name\": \"multipleSignatures\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is the first signature of a function with multiple signatures.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 87,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L87\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 25,\n                                    \"name\": \"value\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"The name value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 26,\n                            \"name\": \"multipleSignatures\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is the second signature of a function with multiple signatures.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 95,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://function.ts#L95\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 27,\n                                    \"name\": \"value\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"An object containing the name value.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 28,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 29,\n                                                    \"name\": \"name\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"comment\": {\n                                                        \"summary\": [\n                                                            {\n                                                                \"kind\": \"text\",\n                                                                \"text\": \"A value of the object.\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"function.ts\",\n                                                            \"line\": 95,\n                                                            \"character\": 44,\n                                                            \"url\": \"typedoc://function.ts#L95\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        29\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 60,\n                    \"name\": \"variableFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"function.ts\",\n                            \"line\": 37,\n                            \"character\": 13,\n                            \"url\": \"typedoc://function.ts#L37\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 61,\n                            \"name\": \"variableFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"This is a function that is assigned to a variable.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is the return value of the function.\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"function.ts\",\n                                    \"line\": 37,\n                                    \"character\": 32,\n                                    \"url\": \"typedoc://function.ts#L37\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 62,\n                                    \"name\": \"someParam\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"This is some numeric parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Namespaces\",\n                    \"children\": [\n                        33\n                    ]\n                },\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        63\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        76,\n                        39,\n                        45,\n                        53,\n                        42,\n                        2,\n                        13,\n                        9,\n                        4,\n                        20,\n                        49,\n                        56,\n                        30,\n                        23,\n                        60\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"function.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://function.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 93,\n            \"name\": \"generic-function\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 98,\n                    \"name\": \"functionWithGenericArrayParameter\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-function.ts\",\n                            \"line\": 18,\n                            \"character\": 16,\n                            \"url\": \"typedoc://generic-function.ts#L18\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 99,\n                            \"name\": \"functionWithGenericArrayParameter\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"A function with a generic type array parameter.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A generic array.\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-function.ts\",\n                                    \"line\": 18,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://generic-function.ts#L18\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 100,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 101,\n                                    \"name\": \"param\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A generic parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 100,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                },\n                                {\n                                    \"id\": 102,\n                                    \"name\": \"params\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"A generic array parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"reference\",\n                                            \"target\": 100,\n                                            \"name\": \"T\",\n                                            \"package\": \"typedoc\",\n                                            \"refersToTypeParameter\": true\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 100,\n                                    \"name\": \"T\",\n                                    \"package\": \"typedoc\",\n                                    \"refersToTypeParameter\": true\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 103,\n                    \"name\": \"functionWithTemplate\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-function.ts\",\n                            \"line\": 29,\n                            \"character\": 16,\n                            \"url\": \"typedoc://generic-function.ts#L29\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 104,\n                            \"name\": \"functionWithTemplate\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-function.ts\",\n                                    \"line\": 29,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://generic-function.ts#L29\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 105,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"this describes T\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 106,\n                                    \"name\": \"param\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"this describes param\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 105,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 105,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 94,\n                    \"name\": \"genericFunction\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"generic-function.ts\",\n                            \"line\": 7,\n                            \"character\": 16,\n                            \"url\": \"typedoc://generic-function.ts#L7\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 95,\n                            \"name\": \"genericFunction\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Generic function short text.\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Generic function return value.\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"generic-function.ts\",\n                                    \"line\": 7,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://generic-function.ts#L7\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 96,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Generic function type parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typescript\",\n                                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                                            \"qualifiedName\": \"Object\"\n                                        },\n                                        \"name\": \"Object\",\n                                        \"package\": \"typescript\"\n                                    }\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 97,\n                                    \"name\": \"value\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Generic function parameter.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 96,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 96,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        98,\n                        103,\n                        94\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"generic-function.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://generic-function.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 107,\n            \"name\": \"implicit-types\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 116,\n                    \"name\": \"BreakpointRange\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 118,\n                            \"name\": \"end\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"implicit-types.ts\",\n                                    \"line\": 3,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://implicit-types.ts#L3\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        },\n                        {\n                            \"id\": 117,\n                            \"name\": \"start\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"implicit-types.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://implicit-types.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                118,\n                                117\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"implicit-types.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://implicit-types.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 108,\n                    \"name\": \"getBreakpoints\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"implicit-types.ts\",\n                            \"line\": 14,\n                            \"character\": 16,\n                            \"url\": \"typedoc://implicit-types.ts#L14\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 109,\n                            \"name\": \"getBreakpoints\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"implicit-types.ts\",\n                                    \"line\": 14,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://implicit-types.ts#L14\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 110,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 113,\n                                            \"name\": \"large\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"implicit-types.ts\",\n                                                    \"line\": 9,\n                                                    \"character\": 4,\n                                                    \"url\": \"typedoc://implicit-types.ts#L9\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 116,\n                                                \"name\": \"BreakpointRange\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 112,\n                                            \"name\": \"medium\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"implicit-types.ts\",\n                                                    \"line\": 8,\n                                                    \"character\": 4,\n                                                    \"url\": \"typedoc://implicit-types.ts#L8\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 116,\n                                                \"name\": \"BreakpointRange\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 111,\n                                            \"name\": \"small\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"implicit-types.ts\",\n                                                    \"line\": 7,\n                                                    \"character\": 4,\n                                                    \"url\": \"typedoc://implicit-types.ts#L7\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 116,\n                                                \"name\": \"BreakpointRange\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 114,\n                                            \"name\": \"xlarge\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"implicit-types.ts\",\n                                                    \"line\": 10,\n                                                    \"character\": 4,\n                                                    \"url\": \"typedoc://implicit-types.ts#L10\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 116,\n                                                \"name\": \"BreakpointRange\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 115,\n                                            \"name\": \"xxlarge\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"implicit-types.ts\",\n                                                    \"line\": 11,\n                                                    \"character\": 4,\n                                                    \"url\": \"typedoc://implicit-types.ts#L11\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 116,\n                                                \"name\": \"BreakpointRange\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                113,\n                                                112,\n                                                111,\n                                                114,\n                                                115\n                                            ]\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        116\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        108\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"implicit-types.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://implicit-types.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                93,\n                107\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"exportedFunction\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"exportedFunction\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithParameters\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithParameters\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"paramZ\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"paramG\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"paramA\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithOptionalValue\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithOptionalValue\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"requiredParam\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"optionalParam\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithDefaults\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithDefaults\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"valueA\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"valueB\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"valueC\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"valueD\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"valueE\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithRest\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"functionWithRest\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"rest\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"multipleSignatures\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"multipleSignatures\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"multipleSignatures\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type.name\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction.append\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction.append\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction.prepend\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction.prepend\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"moduleFunction.functionVariable\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"assertionFunction\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"assertionFunction\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"condition\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"checkerFunction\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"checkerFunction\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"anything\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"assertIsNonNull\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"assertIsNonNull\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"isNonNull\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"isNonNull\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"boolOrUndef\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"boolOrUndef\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"merged\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"merged\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"merged.nsFn\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"merged.nsFn\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"variableFunction\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"variableFunction\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"someParam\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates\"\n        },\n        \"64\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.isString\"\n        },\n        \"65\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.isString\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.assert\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.assert\"\n        },\n        \"69\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.isString\"\n        },\n        \"73\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.isString\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.assertString\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"Predicates.assertString\"\n        },\n        \"76\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"all\"\n        },\n        \"77\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"all\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"fn\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"item\"\n        },\n        \"83\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"iterator\"\n        },\n        \"84\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"all\"\n        },\n        \"85\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"86\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"fn\"\n        },\n        \"87\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"88\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"89\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"item\"\n        },\n        \"90\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"91\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"92\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/function.ts\",\n            \"qualifiedName\": \"iterator\"\n        },\n        \"93\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"94\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"genericFunction\"\n        },\n        \"95\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"genericFunction\"\n        },\n        \"96\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"97\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"value\"\n        },\n        \"98\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"functionWithGenericArrayParameter\"\n        },\n        \"99\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"functionWithGenericArrayParameter\"\n        },\n        \"100\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"101\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"param\"\n        },\n        \"102\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"params\"\n        },\n        \"103\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"functionWithTemplate\"\n        },\n        \"104\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"functionWithTemplate\"\n        },\n        \"105\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"106\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/generic-function.ts\",\n            \"qualifiedName\": \"param\"\n        },\n        \"107\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"108\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"getBreakpoints\"\n        },\n        \"109\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"getBreakpoints\"\n        },\n        \"110\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"111\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"__type.small\"\n        },\n        \"112\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"__type.medium\"\n        },\n        \"113\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"__type.large\"\n        },\n        \"114\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"__type.xlarge\"\n        },\n        \"115\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"__type.xxlarge\"\n        },\n        \"116\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"BreakpointRange\"\n        },\n        \"117\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"BreakpointRange.start\"\n        },\n        \"118\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/function/implicit-types.ts\",\n            \"qualifiedName\": \"BreakpointRange.end\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/function/function.ts\",\n            \"2\": \"src/test/converter/function/generic-function.ts\",\n            \"3\": \"src/test/converter/function/implicit-types.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 93,\n            \"3\": 107\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/inherit-param-doc/inherit-param-doc.ts",
    "content": "export interface Base {\n    /**\n     * @param a - Parameter A.\n     * @param b - Parameter B.\n     */\n    method1(a: number, b: string): void;\n    /**\n     * @param a - Parameter A.\n     * @param b - Parameter B.\n     */\n    method2(a: number, b: string): void;\n}\n\nexport class Class1 implements Base {\n    /** @inheritDoc */\n    method1(a: number, b: string): void {}\n    /** @inheritDoc */\n    method2(): void {}\n}\n\nexport class Class2 implements Base {\n    /**\n     * @inheritDoc\n     *\n     * @param a - Custom parameter A doc.\n     */\n    method1(a: number, b: string): void {}\n    /**\n     * @inheritDoc\n     *\n     * @param a - Custom parameter A doc.\n     */\n    method2(a: number): void {}\n}\n\nexport class Class3 implements Base {\n    /**\n     * @inheritDoc\n     *\n     * @param c - Custom second parameter doc with name change.\n     */\n    method1(a: number, c: string): void {}\n    method2(a: number): void {}\n}\n"
  },
  {
    "path": "src/test/converter/inherit-param-doc/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"inherit-param-doc\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 10,\n            \"name\": \"Class1\",\n            \"variant\": \"declaration\",\n            \"kind\": 128,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 11,\n                    \"name\": \"constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 12,\n                            \"name\": \"Class1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 10,\n                                \"name\": \"Class1\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 13,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 16,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L16\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 14,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 16,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L16\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 15,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter A.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 16,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter B.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            },\n                            \"implementationOf\": {\n                                \"type\": \"reference\",\n                                \"target\": 3,\n                                \"name\": \"Base.method1\"\n                            }\n                        }\n                    ],\n                    \"implementationOf\": {\n                        \"type\": \"reference\",\n                        \"target\": 2,\n                        \"name\": \"Base.method1\"\n                    }\n                },\n                {\n                    \"id\": 17,\n                    \"name\": \"method2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 18,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L18\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 18,\n                            \"name\": \"method2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 18,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L18\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            },\n                            \"implementationOf\": {\n                                \"type\": \"reference\",\n                                \"target\": 7,\n                                \"name\": \"Base.method2\"\n                            }\n                        }\n                    ],\n                    \"implementationOf\": {\n                        \"type\": \"reference\",\n                        \"target\": 6,\n                        \"name\": \"Base.method2\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Constructors\",\n                    \"children\": [\n                        11\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        13,\n                        17\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"inherit-param-doc.ts\",\n                    \"line\": 14,\n                    \"character\": 13,\n                    \"url\": \"typedoc://inherit-param-doc.ts#L14\"\n                }\n            ],\n            \"implementedTypes\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 1,\n                    \"name\": \"Base\",\n                    \"package\": \"typedoc\"\n                }\n            ]\n        },\n        {\n            \"id\": 19,\n            \"name\": \"Class2\",\n            \"variant\": \"declaration\",\n            \"kind\": 128,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 20,\n                    \"name\": \"constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 21,\n                            \"name\": \"Class2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 19,\n                                \"name\": \"Class2\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 22,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 27,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L27\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 23,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 27,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L27\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 24,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Custom parameter A doc.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 25,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter B.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            },\n                            \"implementationOf\": {\n                                \"type\": \"reference\",\n                                \"target\": 3,\n                                \"name\": \"Base.method1\"\n                            }\n                        }\n                    ],\n                    \"implementationOf\": {\n                        \"type\": \"reference\",\n                        \"target\": 2,\n                        \"name\": \"Base.method1\"\n                    }\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"method2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 33,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L33\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 27,\n                            \"name\": \"method2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 33,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L33\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 28,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Custom parameter A doc.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            },\n                            \"implementationOf\": {\n                                \"type\": \"reference\",\n                                \"target\": 7,\n                                \"name\": \"Base.method2\"\n                            }\n                        }\n                    ],\n                    \"implementationOf\": {\n                        \"type\": \"reference\",\n                        \"target\": 6,\n                        \"name\": \"Base.method2\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Constructors\",\n                    \"children\": [\n                        20\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        22,\n                        26\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"inherit-param-doc.ts\",\n                    \"line\": 21,\n                    \"character\": 13,\n                    \"url\": \"typedoc://inherit-param-doc.ts#L21\"\n                }\n            ],\n            \"implementedTypes\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 1,\n                    \"name\": \"Base\",\n                    \"package\": \"typedoc\"\n                }\n            ]\n        },\n        {\n            \"id\": 29,\n            \"name\": \"Class3\",\n            \"variant\": \"declaration\",\n            \"kind\": 128,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 30,\n                    \"name\": \"constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 31,\n                            \"name\": \"Class3\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 29,\n                                \"name\": \"Class3\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 32,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 42,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L42\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 33,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 42,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L42\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 34,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter A.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 35,\n                                    \"name\": \"c\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Custom second parameter doc with name change.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            },\n                            \"implementationOf\": {\n                                \"type\": \"reference\",\n                                \"target\": 3,\n                                \"name\": \"Base.method1\"\n                            }\n                        }\n                    ],\n                    \"implementationOf\": {\n                        \"type\": \"reference\",\n                        \"target\": 2,\n                        \"name\": \"Base.method1\"\n                    }\n                },\n                {\n                    \"id\": 36,\n                    \"name\": \"method2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 43,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L43\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 37,\n                            \"name\": \"method2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 43,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L43\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 38,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter A.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            },\n                            \"implementationOf\": {\n                                \"type\": \"reference\",\n                                \"target\": 7,\n                                \"name\": \"Base.method2\"\n                            }\n                        }\n                    ],\n                    \"implementationOf\": {\n                        \"type\": \"reference\",\n                        \"target\": 6,\n                        \"name\": \"Base.method2\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Constructors\",\n                    \"children\": [\n                        30\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        32,\n                        36\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"inherit-param-doc.ts\",\n                    \"line\": 36,\n                    \"character\": 13,\n                    \"url\": \"typedoc://inherit-param-doc.ts#L36\"\n                }\n            ],\n            \"implementedTypes\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 1,\n                    \"name\": \"Base\",\n                    \"package\": \"typedoc\"\n                }\n            ]\n        },\n        {\n            \"id\": 1,\n            \"name\": \"Base\",\n            \"variant\": \"declaration\",\n            \"kind\": 256,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 6,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L6\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 6,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L6\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 4,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter A.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 5,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter B.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"method2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-param-doc.ts\",\n                            \"line\": 11,\n                            \"character\": 4,\n                            \"url\": \"typedoc://inherit-param-doc.ts#L11\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 7,\n                            \"name\": \"method2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-param-doc.ts\",\n                                    \"line\": 11,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-param-doc.ts#L11\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 8,\n                                    \"name\": \"a\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter A.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 9,\n                                    \"name\": \"b\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Parameter B.\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        2,\n                        6\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"inherit-param-doc.ts\",\n                    \"line\": 1,\n                    \"character\": 17,\n                    \"url\": \"typedoc://inherit-param-doc.ts#L1\"\n                }\n            ],\n            \"implementedBy\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 10,\n                    \"name\": \"Class1\"\n                },\n                {\n                    \"type\": \"reference\",\n                    \"target\": 19,\n                    \"name\": \"Class2\"\n                },\n                {\n                    \"type\": \"reference\",\n                    \"target\": 29,\n                    \"name\": \"Class3\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Classes\",\n            \"children\": [\n                10,\n                19,\n                29\n            ]\n        },\n        {\n            \"title\": \"Interfaces\",\n            \"children\": [\n                1\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"0\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Base\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Base.method1\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Base.method1\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Base.method2\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Base.method2\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class1\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class1.method1\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class1.method1\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class1.method2\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class1.method2\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class2\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class2.method1\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class2.method1\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"b\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class2.method2\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class2.method2\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class3\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class3.method1\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class3.method1\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"c\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class3.method2\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"Class3.method2\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\",\n            \"qualifiedName\": \"a\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/inherit-param-doc/inherit-param-doc.ts\"\n        },\n        \"reflections\": {\n            \"1\": 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/inheritance/inherit-doc.ts",
    "content": "/**\n * Source interface summary\n *\n * @typeParam T - Source interface type parameter\n */\nexport interface InterfaceSource<T> {\n    /**\n     * Source interface property description\n     *\n     * @typeParam T - Source interface type parameter\n     */\n    property: T;\n\n    /**\n     * Source interface method description\n     *\n     * @param arg\n     */\n    someMethod(arg: number): T;\n}\n\n/**\n * @inheritDoc InterfaceSource\n */\nexport interface InterfaceTarget<T> {\n    /**\n     * @inheritDoc InterfaceSource.property\n     */\n    property: T;\n\n    /**\n     * @inheritDoc InterfaceSource.someMethod\n     *\n     * @param arg\n     */\n    someMethod(arg: number): T;\n}\n\n/**\n * Function summary\n *\n * This part of the commentary will be inherited by other entities\n *\n * @remarks\n *\n * Remarks will be inherited\n *\n * @default\n *\n * This part of the commentary will not be inherited (this is an abuse of this tag)\n *\n * @typeParam T - Type of arguments\n * @param arg1 - First argument\n * @param arg2 - Second argument\n * @returns Stringified sum or concatenation of numeric arguments\n */\nexport function functionSource<T>(arg1: T, arg2: T): string {\n    if (typeof arg1 === \"number\" && typeof arg2 === \"number\") {\n        return `${arg1 + arg2}`;\n    }\n    return `${arg1}${arg2}`;\n}\n\n/**\n * @inheritDoc functionSource\n *\n * @example\n *\n * This function inherited commentary from the `functionSource` function\n *\n * @typeParam T - This will be inherited\n * @param arg1 - This will be inherited\n * @param arg2 - This will be inherited\n */\nexport function functionTargetLocal<T>(arg1: T, arg2: T) {\n    return \"\";\n}\n"
  },
  {
    "path": "src/test/converter/inheritance/mergable-class.ts",
    "content": "export interface MyCtor {\n    staticProp: 1;\n    new (): My;\n}\n\nexport interface My {\n    instanceProp: 1;\n}\n\nexport declare const My: MyCtor;\n\nexport class MySubClass extends My {}\n"
  },
  {
    "path": "src/test/converter/inheritance/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"inheritance\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"inherit-doc\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 12,\n                    \"name\": \"InterfaceSource\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Source interface summary\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 14,\n                            \"name\": \"property\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Source interface property description\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@typeParam\",\n                                        \"name\": \"T\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Source interface type parameter\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-doc.ts\",\n                                    \"line\": 12,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-doc.ts#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 13,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"qualifiedName\": \"InterfaceSource.T\",\n                                \"refersToTypeParameter\": true\n                            }\n                        },\n                        {\n                            \"id\": 15,\n                            \"name\": \"someMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-doc.ts\",\n                                    \"line\": 19,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-doc.ts#L19\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 16,\n                                    \"name\": \"someMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Source interface method description\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"inherit-doc.ts\",\n                                            \"line\": 19,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://inherit-doc.ts#L19\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 17,\n                                            \"name\": \"arg\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 13,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"InterfaceSource.T\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                14\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                15\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-doc.ts\",\n                            \"line\": 6,\n                            \"character\": 17,\n                            \"url\": \"typedoc://inherit-doc.ts#L6\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 13,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Source interface type parameter\"\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"InterfaceTarget\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Source interface summary\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 20,\n                            \"name\": \"property\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Source interface property description\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-doc.ts\",\n                                    \"line\": 29,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-doc.ts#L29\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 19,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"qualifiedName\": \"InterfaceTarget.T\",\n                                \"refersToTypeParameter\": true\n                            }\n                        },\n                        {\n                            \"id\": 21,\n                            \"name\": \"someMethod\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-doc.ts\",\n                                    \"line\": 36,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://inherit-doc.ts#L36\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 22,\n                                    \"name\": \"someMethod\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Source interface method description\"\n                                            }\n                                        ]\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"inherit-doc.ts\",\n                                            \"line\": 36,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://inherit-doc.ts#L36\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 23,\n                                            \"name\": \"arg\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 19,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"InterfaceTarget.T\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                20\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                21\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-doc.ts\",\n                            \"line\": 25,\n                            \"character\": 17,\n                            \"url\": \"typedoc://inherit-doc.ts#L25\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 19,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Source interface type parameter\"\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"functionSource\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-doc.ts\",\n                            \"line\": 57,\n                            \"character\": 16,\n                            \"url\": \"typedoc://inherit-doc.ts#L57\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"functionSource\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Function summary\\n\\nThis part of the commentary will be inherited by other entities\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@remarks\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Remarks will be inherited\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"tag\": \"@default\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"code\",\n                                                \"text\": \"```ts\\nThis part of the commentary will not be inherited (this is an abuse of this tag)\\n```\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Stringified sum or concatenation of numeric arguments\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-doc.ts\",\n                                    \"line\": 57,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://inherit-doc.ts#L57\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 4,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Type of arguments\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 5,\n                                    \"name\": \"arg1\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"First argument\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 4,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                },\n                                {\n                                    \"id\": 6,\n                                    \"name\": \"arg2\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Second argument\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 4,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"functionTargetLocal\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"inherit-doc.ts\",\n                            \"line\": 75,\n                            \"character\": 16,\n                            \"url\": \"typedoc://inherit-doc.ts#L75\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 8,\n                            \"name\": \"functionTargetLocal\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Function summary\\n\\nThis part of the commentary will be inherited by other entities\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@remarks\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Remarks will be inherited\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"tag\": \"@example\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"code\",\n                                                \"text\": \"```ts\\nThis function inherited commentary from the `functionSource` function\\n```\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Stringified sum or concatenation of numeric arguments\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"inherit-doc.ts\",\n                                    \"line\": 75,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://inherit-doc.ts#L75\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 9,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Type of arguments\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 10,\n                                    \"name\": \"arg1\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"First argument\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 9,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                },\n                                {\n                                    \"id\": 11,\n                                    \"name\": \"arg2\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Second argument\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 9,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        12,\n                        18\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        2,\n                        7\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"inherit-doc.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://inherit-doc.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 24,\n            \"name\": \"mergable-class\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 32,\n                    \"name\": \"MySubClass\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 34,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mergable-class.ts\",\n                                    \"line\": 3,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mergable-class.ts#L3\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 35,\n                                    \"name\": \"MySubClass\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"mergable-class.ts\",\n                                            \"line\": 3,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://mergable-class.ts#L3\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 32,\n                                        \"name\": \"MySubClass\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": -1,\n                                        \"name\": \"My.constructor\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"My.constructor\",\n                                \"package\": \"typedoc\"\n                            }\n                        },\n                        {\n                            \"id\": 36,\n                            \"name\": \"instanceProp\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mergable-class.ts\",\n                                    \"line\": 7,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mergable-class.ts#L7\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 31,\n                                \"name\": \"My.instanceProp\"\n                            }\n                        },\n                        {\n                            \"id\": 33,\n                            \"name\": \"staticProp\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isStatic\": true,\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mergable-class.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mergable-class.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"My.staticProp\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                34\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                36,\n                                33\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mergable-class.ts\",\n                            \"line\": 12,\n                            \"character\": 13,\n                            \"url\": \"typedoc://mergable-class.ts#L12\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 30,\n                            \"name\": \"My\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 30,\n                    \"name\": \"My\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 31,\n                            \"name\": \"instanceProp\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mergable-class.ts\",\n                                    \"line\": 7,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mergable-class.ts#L7\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                31\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mergable-class.ts\",\n                            \"line\": 6,\n                            \"character\": 17,\n                            \"url\": \"typedoc://mergable-class.ts#L6\"\n                        },\n                        {\n                            \"fileName\": \"mergable-class.ts\",\n                            \"line\": 10,\n                            \"character\": 21,\n                            \"url\": \"typedoc://mergable-class.ts#L10\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 32,\n                            \"name\": \"MySubClass\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 25,\n                    \"name\": \"MyCtor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 27,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mergable-class.ts\",\n                                    \"line\": 1,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://mergable-class.ts#L1\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 28,\n                                    \"name\": \"MyCtor\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"mergable-class.ts\",\n                                            \"line\": 3,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://mergable-class.ts#L3\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 30,\n                                        \"name\": \"My\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 26,\n                            \"name\": \"staticProp\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mergable-class.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mergable-class.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                27\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                26\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mergable-class.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://mergable-class.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 29,\n                    \"name\": \"My\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mergable-class.ts\",\n                            \"line\": 6,\n                            \"character\": 17,\n                            \"url\": \"typedoc://mergable-class.ts#L6\"\n                        },\n                        {\n                            \"fileName\": \"mergable-class.ts\",\n                            \"line\": 10,\n                            \"character\": 21,\n                            \"url\": \"typedoc://mergable-class.ts#L10\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": 25,\n                        \"name\": \"MyCtor\",\n                        \"package\": \"typedoc\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        32\n                    ]\n                },\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        30,\n                        25\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        29\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mergable-class.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://mergable-class.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                24\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"functionSource\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"functionSource\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"arg1\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"arg2\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"functionTargetLocal\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"functionTargetLocal\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"arg1\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"arg2\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceSource\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceSource.T\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceSource.property\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceSource.someMethod\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceSource.someMethod\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceTarget\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceTarget.T\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceTarget.property\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceTarget.someMethod\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"InterfaceTarget.someMethod\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MyCtor\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MyCtor.staticProp\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MyCtor\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MyCtor\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"My\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"My\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"My.instanceProp\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MySubClass\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MyCtor.staticProp\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MyCtor.__new\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"MySubClass\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/inheritance/mergable-class.ts\",\n            \"qualifiedName\": \"My.instanceProp\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/inheritance/inherit-doc.ts\",\n            \"2\": \"src/test/converter/inheritance/mergable-class.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 24\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/interface/constructor-type.ts",
    "content": "export interface Constructor {\n    // No return type defined. Used the parent one.\n    new (x: string, y: string);\n\n    // A return type is defined and is the same as the parent one.\n    new (x: string, y: string): Constructor;\n\n    // A return type is defined and is not the same as the parent one.\n    new (x: string, y: string): Instance;\n}\n\nexport interface Instance {}\n"
  },
  {
    "path": "src/test/converter/interface/index-signature.ts",
    "content": "export interface StrIndex {\n    [x: string]: 1;\n}\n\nexport interface NumIndex {\n    [x: number]: 1;\n}\n\nexport interface BothIndex {\n    /** Number index */\n    [x: number]: 1;\n    /** String index */\n    [x: string]: 1 | 2;\n}\n\nexport type TypeIndex = { [x: string]: 1 };\n"
  },
  {
    "path": "src/test/converter/interface/interface-empty.ts",
    "content": "/**\n * An empty interface\n */\nexport interface EmptyInterface {}\n\n/**\n * A class implementing an empty interface.\n */\nexport class ClassImplementingEmptyInterface implements EmptyInterface {\n    private name: string;\n    public goto() {}\n}\n\nexport {};\n"
  },
  {
    "path": "src/test/converter/interface/interface-implementation.ts",
    "content": "export namespace Forms {\n    /**\n     * Function signature of an event listener callback\n     */\n    export interface EventListener<T> {\n        /** @param parameter param text */\n        (parameter: T): any;\n    }\n\n    /**\n     * Encapsulates a subscription to an event dispatcher, and allows for unsubscribing\n     */\n    export interface SubscriptionInt<T> {\n        listener: EventListener<T>;\n        priority: number;\n        filter: any;\n\n        /**\n         * Remove this subscription from its dispatcher\n         */\n        unsubscribe(): void;\n    }\n\n    export class Subscription<V> implements SubscriptionInt<V> {\n        constructor(\n            public listener: EventListener<V>,\n            public filter: any,\n            public priority: number,\n            public dispatcher: EventDispatcher<V>,\n        ) {}\n\n        unsubscribe(): void {}\n    }\n\n    /**\n     * The main interface of the event system.\n     * An IEventDispatcher is an object that keeps a list of listeners, and sends dispatches events of a certain type to them.\n     * This might otherwise be known as a Signal.\n     */\n    export interface EventDispatcherInt<U> {\n        add(\n            listener: EventListener<U>,\n            filter?: any,\n            priority?: number,\n        ): SubscriptionInt<U>;\n        remove(subscription: SubscriptionInt<U>): void;\n        dispatch(parameter: U): boolean;\n        clear(): void;\n        hasListeners(): boolean;\n    }\n\n    /**\n     * Implementation of IEventDispatcher\n     * @see IEventDispatcher\n     */\n    export class EventDispatcher<T> implements EventDispatcherInt<T> {\n        private subscriptions: SubscriptionInt<T>[];\n\n        add(\n            listener: EventListener<T>,\n            filter: any = null,\n            priority: number = 0,\n        ): SubscriptionInt<T> {\n            return new Subscription<T>(listener, filter, priority, this);\n        }\n\n        remove(subscription: SubscriptionInt<T>): void {}\n\n        dispatch(event: T): boolean {\n            return false;\n        }\n\n        clear(): void {}\n\n        hasListeners(): boolean {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/interface/merging.ts",
    "content": "export interface Base {\n    base: 1;\n}\n\nexport interface Base2 {\n    base2: 2;\n}\n\nexport interface Child extends Base, Base2 {\n    child: 1;\n}\n\n// merged!\nexport interface Child extends Base {\n    child3: 2;\n}\n\nexport interface Child2 extends Child, Base {\n    child2: 1;\n}\n"
  },
  {
    "path": "src/test/converter/interface/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"interface\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"constructor-type\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"Constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"constructor-type.ts\",\n                                    \"line\": 1,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://constructor-type.ts#L1\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 4,\n                                    \"name\": \"Constructor\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-type.ts\",\n                                            \"line\": 3,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-type.ts#L3\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 5,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 6,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                },\n                                {\n                                    \"id\": 7,\n                                    \"name\": \"Constructor\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-type.ts\",\n                                            \"line\": 6,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-type.ts#L6\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 8,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 9,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 2,\n                                        \"name\": \"Constructor\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                },\n                                {\n                                    \"id\": 10,\n                                    \"name\": \"Constructor\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"constructor-type.ts\",\n                                            \"line\": 9,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://constructor-type.ts#L9\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 11,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        },\n                                        {\n                                            \"id\": 12,\n                                            \"name\": \"y\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 13,\n                                        \"name\": \"Instance\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                3\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"constructor-type.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://constructor-type.ts#L1\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 13,\n                    \"name\": \"Instance\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"constructor-type.ts\",\n                            \"line\": 12,\n                            \"character\": 17,\n                            \"url\": \"typedoc://constructor-type.ts#L12\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        2,\n                        13\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"constructor-type.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://constructor-type.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 14,\n            \"name\": \"index-signature\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 21,\n                    \"name\": \"BothIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 9,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L9\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 22,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Number index\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 11,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L11\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 23,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        },\n                        {\n                            \"id\": 24,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"String index\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 13,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L13\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 25,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"union\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"literal\",\n                                        \"value\": 1\n                                    },\n                                    {\n                                        \"type\": \"literal\",\n                                        \"value\": 2\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"NumIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 5,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L5\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 19,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 6,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L6\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 20,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 15,\n                    \"name\": \"StrIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L1\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 16,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L2\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 17,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"TypeIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 16,\n                            \"character\": 12,\n                            \"url\": \"typedoc://index-signature.ts#L16\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 27,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"indexSignatures\": [\n                                {\n                                    \"id\": 28,\n                                    \"name\": \"__index\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 8192,\n                                    \"flags\": {},\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 29,\n                                            \"name\": \"x\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"literal\",\n                                        \"value\": 1\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        21,\n                        18,\n                        15\n                    ]\n                },\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        26\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"index-signature.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://index-signature.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 30,\n            \"name\": \"interface-empty\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 32,\n                    \"name\": \"ClassImplementingEmptyInterface\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A class implementing an empty interface.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 33,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 34,\n                                    \"name\": \"ClassImplementingEmptyInterface\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 32,\n                                        \"name\": \"ClassImplementingEmptyInterface\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 35,\n                            \"name\": \"name\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isPrivate\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-empty.ts\",\n                                    \"line\": 10,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://interface-empty.ts#L10\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 36,\n                            \"name\": \"goto\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 2048,\n                            \"flags\": {\n                                \"isPublic\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-empty.ts\",\n                                    \"line\": 11,\n                                    \"character\": 11,\n                                    \"url\": \"typedoc://interface-empty.ts#L11\"\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"goto\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-empty.ts\",\n                                            \"line\": 11,\n                                            \"character\": 11,\n                                            \"url\": \"typedoc://interface-empty.ts#L11\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"void\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                33\n                            ]\n                        },\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                35\n                            ]\n                        },\n                        {\n                            \"title\": \"Methods\",\n                            \"children\": [\n                                36\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"interface-empty.ts\",\n                            \"line\": 9,\n                            \"character\": 13,\n                            \"url\": \"typedoc://interface-empty.ts#L9\"\n                        }\n                    ],\n                    \"implementedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 31,\n                            \"name\": \"EmptyInterface\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 31,\n                    \"name\": \"EmptyInterface\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An empty interface\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"interface-empty.ts\",\n                            \"line\": 4,\n                            \"character\": 17,\n                            \"url\": \"typedoc://interface-empty.ts#L4\"\n                        }\n                    ],\n                    \"implementedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 32,\n                            \"name\": \"ClassImplementingEmptyInterface\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        32\n                    ]\n                },\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        31\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"interface-empty.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://interface-empty.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 38,\n            \"name\": \"interface-implementation\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 39,\n                    \"name\": \"Forms\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 4,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 83,\n                            \"name\": \"EventDispatcher\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 128,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Implementation of IEventDispatcher\"\n                                    }\n                                ],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@see\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"IEventDispatcher\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"children\": [\n                                {\n                                    \"id\": 85,\n                                    \"name\": \"constructor\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 512,\n                                    \"flags\": {},\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 86,\n                                            \"name\": \"EventDispatcher\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 16384,\n                                            \"flags\": {},\n                                            \"typeParameters\": [\n                                                {\n                                                    \"id\": 87,\n                                                    \"name\": \"T\",\n                                                    \"variant\": \"typeParam\",\n                                                    \"kind\": 131072,\n                                                    \"flags\": {}\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 83,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 84,\n                                                        \"name\": \"T\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                                        \"refersToTypeParameter\": true\n                                                    }\n                                                ],\n                                                \"name\": \"EventDispatcher\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.EventDispatcher\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"id\": 88,\n                                    \"name\": \"subscriptions\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isPrivate\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 57,\n                                            \"character\": 16,\n                                            \"url\": \"typedoc://interface-implementation.ts#L57\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"reference\",\n                                            \"target\": 44,\n                                            \"typeArguments\": [\n                                                {\n                                                    \"type\": \"reference\",\n                                                    \"target\": 84,\n                                                    \"name\": \"T\",\n                                                    \"package\": \"typedoc\",\n                                                    \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                                    \"refersToTypeParameter\": true\n                                                }\n                                            ],\n                                            \"name\": \"SubscriptionInt\",\n                                            \"package\": \"typedoc\",\n                                            \"qualifiedName\": \"Forms.SubscriptionInt\"\n                                        }\n                                    }\n                                },\n                                {\n                                    \"id\": 89,\n                                    \"name\": \"add\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 59,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L59\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 90,\n                                            \"name\": \"add\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 59,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L59\"\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 91,\n                                                    \"name\": \"listener\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 40,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 84,\n                                                                \"name\": \"T\",\n                                                                \"package\": \"typedoc\",\n                                                                \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"EventListener\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventListener\"\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 92,\n                                                    \"name\": \"filter\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"any\"\n                                                    },\n                                                    \"defaultValue\": \"null\"\n                                                },\n                                                {\n                                                    \"id\": 93,\n                                                    \"name\": \"priority\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"number\"\n                                                    },\n                                                    \"defaultValue\": \"0\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 44,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 84,\n                                                        \"name\": \"T\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                                        \"refersToTypeParameter\": true\n                                                    }\n                                                ],\n                                                \"name\": \"SubscriptionInt\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.SubscriptionInt\"\n                                            },\n                                            \"implementationOf\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 69,\n                                                \"name\": \"EventDispatcherInt.add\"\n                                            }\n                                        }\n                                    ],\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 68,\n                                        \"name\": \"EventDispatcherInt.add\"\n                                    }\n                                },\n                                {\n                                    \"id\": 100,\n                                    \"name\": \"clear\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 73,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L73\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 101,\n                                            \"name\": \"clear\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 73,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L73\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"void\"\n                                            },\n                                            \"implementationOf\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 80,\n                                                \"name\": \"EventDispatcherInt.clear\"\n                                            }\n                                        }\n                                    ],\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 79,\n                                        \"name\": \"EventDispatcherInt.clear\"\n                                    }\n                                },\n                                {\n                                    \"id\": 97,\n                                    \"name\": \"dispatch\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 69,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L69\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 98,\n                                            \"name\": \"dispatch\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 69,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L69\"\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 99,\n                                                    \"name\": \"event\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 84,\n                                                        \"name\": \"T\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                                        \"refersToTypeParameter\": true\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"boolean\"\n                                            },\n                                            \"implementationOf\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 77,\n                                                \"name\": \"EventDispatcherInt.dispatch\"\n                                            }\n                                        }\n                                    ],\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 76,\n                                        \"name\": \"EventDispatcherInt.dispatch\"\n                                    }\n                                },\n                                {\n                                    \"id\": 102,\n                                    \"name\": \"hasListeners\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 75,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L75\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 103,\n                                            \"name\": \"hasListeners\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 75,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L75\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"boolean\"\n                                            },\n                                            \"implementationOf\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 82,\n                                                \"name\": \"EventDispatcherInt.hasListeners\"\n                                            }\n                                        }\n                                    ],\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 81,\n                                        \"name\": \"EventDispatcherInt.hasListeners\"\n                                    }\n                                },\n                                {\n                                    \"id\": 94,\n                                    \"name\": \"remove\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 67,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L67\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 95,\n                                            \"name\": \"remove\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 67,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L67\"\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 96,\n                                                    \"name\": \"subscription\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 44,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 84,\n                                                                \"name\": \"T\",\n                                                                \"package\": \"typedoc\",\n                                                                \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"SubscriptionInt\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.SubscriptionInt\"\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"void\"\n                                            },\n                                            \"implementationOf\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 74,\n                                                \"name\": \"EventDispatcherInt.remove\"\n                                            }\n                                        }\n                                    ],\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 73,\n                                        \"name\": \"EventDispatcherInt.remove\"\n                                    }\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Constructors\",\n                                    \"children\": [\n                                        85\n                                    ]\n                                },\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        88\n                                    ]\n                                },\n                                {\n                                    \"title\": \"Methods\",\n                                    \"children\": [\n                                        89,\n                                        100,\n                                        97,\n                                        102,\n                                        94\n                                    ]\n                                }\n                            ],\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-implementation.ts\",\n                                    \"line\": 56,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://interface-implementation.ts#L56\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 84,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"implementedTypes\": [\n                                {\n                                    \"type\": \"reference\",\n                                    \"target\": 66,\n                                    \"typeArguments\": [\n                                        {\n                                            \"type\": \"reference\",\n                                            \"target\": 84,\n                                            \"name\": \"T\",\n                                            \"package\": \"typedoc\",\n                                            \"qualifiedName\": \"Forms.EventDispatcher.T\",\n                                            \"refersToTypeParameter\": true\n                                        }\n                                    ],\n                                    \"name\": \"EventDispatcherInt\",\n                                    \"package\": \"typedoc\",\n                                    \"qualifiedName\": \"Forms.EventDispatcherInt\"\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 51,\n                            \"name\": \"Subscription\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 128,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Encapsulates a subscription to an event dispatcher, and allows for unsubscribing\"\n                                    }\n                                ]\n                            },\n                            \"children\": [\n                                {\n                                    \"id\": 53,\n                                    \"name\": \"constructor\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 512,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 25,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L25\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 54,\n                                            \"name\": \"Subscription\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 16384,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 25,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L25\"\n                                                }\n                                            ],\n                                            \"typeParameters\": [\n                                                {\n                                                    \"id\": 55,\n                                                    \"name\": \"V\",\n                                                    \"variant\": \"typeParam\",\n                                                    \"kind\": 131072,\n                                                    \"flags\": {}\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 56,\n                                                    \"name\": \"listener\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 40,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 52,\n                                                                \"name\": \"V\",\n                                                                \"package\": \"typedoc\",\n                                                                \"qualifiedName\": \"Forms.Subscription.V\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"EventListener\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventListener\"\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 57,\n                                                    \"name\": \"filter\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"any\"\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 58,\n                                                    \"name\": \"priority\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"number\"\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 59,\n                                                    \"name\": \"dispatcher\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 83,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 52,\n                                                                \"name\": \"V\",\n                                                                \"package\": \"typedoc\",\n                                                                \"qualifiedName\": \"Forms.Subscription.V\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"EventDispatcher\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventDispatcher\"\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 51,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 52,\n                                                        \"name\": \"V\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.Subscription.V\",\n                                                        \"refersToTypeParameter\": true\n                                                    }\n                                                ],\n                                                \"name\": \"Subscription\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.Subscription\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"id\": 63,\n                                    \"name\": \"dispatcher\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isPublic\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 29,\n                                            \"character\": 19,\n                                            \"url\": \"typedoc://interface-implementation.ts#L29\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 83,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 52,\n                                                \"name\": \"V\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.Subscription.V\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"EventDispatcher\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"Forms.EventDispatcher\"\n                                    }\n                                },\n                                {\n                                    \"id\": 61,\n                                    \"name\": \"filter\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isPublic\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 27,\n                                            \"character\": 19,\n                                            \"url\": \"typedoc://interface-implementation.ts#L27\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    },\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 48,\n                                        \"name\": \"SubscriptionInt.filter\"\n                                    }\n                                },\n                                {\n                                    \"id\": 60,\n                                    \"name\": \"listener\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isPublic\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 26,\n                                            \"character\": 19,\n                                            \"url\": \"typedoc://interface-implementation.ts#L26\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 40,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 52,\n                                                \"name\": \"V\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.Subscription.V\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"EventListener\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"Forms.EventListener\"\n                                    },\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 46,\n                                        \"name\": \"SubscriptionInt.listener\"\n                                    }\n                                },\n                                {\n                                    \"id\": 62,\n                                    \"name\": \"priority\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isPublic\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 28,\n                                            \"character\": 19,\n                                            \"url\": \"typedoc://interface-implementation.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    },\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 47,\n                                        \"name\": \"SubscriptionInt.priority\"\n                                    }\n                                },\n                                {\n                                    \"id\": 64,\n                                    \"name\": \"unsubscribe\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 32,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L32\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 65,\n                                            \"name\": \"unsubscribe\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Remove this subscription from its dispatcher\"\n                                                    }\n                                                ]\n                                            },\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 32,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L32\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"void\"\n                                            },\n                                            \"implementationOf\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 50,\n                                                \"name\": \"SubscriptionInt.unsubscribe\"\n                                            }\n                                        }\n                                    ],\n                                    \"implementationOf\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 49,\n                                        \"name\": \"SubscriptionInt.unsubscribe\"\n                                    }\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Constructors\",\n                                    \"children\": [\n                                        53\n                                    ]\n                                },\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        63,\n                                        61,\n                                        60,\n                                        62\n                                    ]\n                                },\n                                {\n                                    \"title\": \"Methods\",\n                                    \"children\": [\n                                        64\n                                    ]\n                                }\n                            ],\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-implementation.ts\",\n                                    \"line\": 24,\n                                    \"character\": 17,\n                                    \"url\": \"typedoc://interface-implementation.ts#L24\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 52,\n                                    \"name\": \"V\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"implementedTypes\": [\n                                {\n                                    \"type\": \"reference\",\n                                    \"target\": 44,\n                                    \"typeArguments\": [\n                                        {\n                                            \"type\": \"reference\",\n                                            \"target\": 52,\n                                            \"name\": \"V\",\n                                            \"package\": \"typedoc\",\n                                            \"qualifiedName\": \"Forms.Subscription.V\",\n                                            \"refersToTypeParameter\": true\n                                        }\n                                    ],\n                                    \"name\": \"SubscriptionInt\",\n                                    \"package\": \"typedoc\",\n                                    \"qualifiedName\": \"Forms.SubscriptionInt\"\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 66,\n                            \"name\": \"EventDispatcherInt\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 256,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"The main interface of the event system.\\nAn IEventDispatcher is an object that keeps a list of listeners, and sends dispatches events of a certain type to them.\\nThis might otherwise be known as a Signal.\"\n                                    }\n                                ]\n                            },\n                            \"children\": [\n                                {\n                                    \"id\": 68,\n                                    \"name\": \"add\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 41,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L41\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 69,\n                                            \"name\": \"add\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 41,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L41\"\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 70,\n                                                    \"name\": \"listener\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 40,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 67,\n                                                                \"name\": \"U\",\n                                                                \"package\": \"typedoc\",\n                                                                \"qualifiedName\": \"Forms.EventDispatcherInt.U\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"EventListener\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventListener\"\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 71,\n                                                    \"name\": \"filter\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"any\"\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 72,\n                                                    \"name\": \"priority\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"number\"\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 44,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 67,\n                                                        \"name\": \"U\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventDispatcherInt.U\",\n                                                        \"refersToTypeParameter\": true\n                                                    }\n                                                ],\n                                                \"name\": \"SubscriptionInt\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.SubscriptionInt\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"id\": 79,\n                                    \"name\": \"clear\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 48,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L48\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 80,\n                                            \"name\": \"clear\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 48,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L48\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"void\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"id\": 76,\n                                    \"name\": \"dispatch\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 47,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L47\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 77,\n                                            \"name\": \"dispatch\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 47,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L47\"\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 78,\n                                                    \"name\": \"parameter\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 67,\n                                                        \"name\": \"U\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.EventDispatcherInt.U\",\n                                                        \"refersToTypeParameter\": true\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"boolean\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"id\": 81,\n                                    \"name\": \"hasListeners\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 49,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L49\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 82,\n                                            \"name\": \"hasListeners\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 49,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L49\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"boolean\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"id\": 73,\n                                    \"name\": \"remove\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 46,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L46\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 74,\n                                            \"name\": \"remove\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 46,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L46\"\n                                                }\n                                            ],\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 75,\n                                                    \"name\": \"subscription\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 44,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"reference\",\n                                                                \"target\": 67,\n                                                                \"name\": \"U\",\n                                                                \"package\": \"typedoc\",\n                                                                \"qualifiedName\": \"Forms.EventDispatcherInt.U\",\n                                                                \"refersToTypeParameter\": true\n                                                            }\n                                                        ],\n                                                        \"name\": \"SubscriptionInt\",\n                                                        \"package\": \"typedoc\",\n                                                        \"qualifiedName\": \"Forms.SubscriptionInt\"\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"void\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Methods\",\n                                    \"children\": [\n                                        68,\n                                        79,\n                                        76,\n                                        81,\n                                        73\n                                    ]\n                                }\n                            ],\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-implementation.ts\",\n                                    \"line\": 40,\n                                    \"character\": 21,\n                                    \"url\": \"typedoc://interface-implementation.ts#L40\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 67,\n                                    \"name\": \"U\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"implementedBy\": [\n                                {\n                                    \"type\": \"reference\",\n                                    \"target\": 83,\n                                    \"name\": \"EventDispatcher\"\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 40,\n                            \"name\": \"EventListener\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 256,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Function signature of an event listener callback\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-implementation.ts\",\n                                    \"line\": 5,\n                                    \"character\": 21,\n                                    \"url\": \"typedoc://interface-implementation.ts#L5\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"signatures\": [\n                                {\n                                    \"id\": 42,\n                                    \"name\": \"EventListener\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 7,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L7\"\n                                        }\n                                    ],\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 43,\n                                            \"name\": \"parameter\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"param text\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 41,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.EventListener.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"id\": 44,\n                            \"name\": \"SubscriptionInt\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 256,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Encapsulates a subscription to an event dispatcher, and allows for unsubscribing\"\n                                    }\n                                ]\n                            },\n                            \"children\": [\n                                {\n                                    \"id\": 48,\n                                    \"name\": \"filter\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 16,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L16\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                },\n                                {\n                                    \"id\": 46,\n                                    \"name\": \"listener\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 14,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L14\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 40,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 45,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Forms.SubscriptionInt.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"EventListener\",\n                                        \"package\": \"typedoc\",\n                                        \"qualifiedName\": \"Forms.EventListener\"\n                                    }\n                                },\n                                {\n                                    \"id\": 47,\n                                    \"name\": \"priority\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 15,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L15\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 49,\n                                    \"name\": \"unsubscribe\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 2048,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"interface-implementation.ts\",\n                                            \"line\": 21,\n                                            \"character\": 8,\n                                            \"url\": \"typedoc://interface-implementation.ts#L21\"\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 50,\n                                            \"name\": \"unsubscribe\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 4096,\n                                            \"flags\": {},\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Remove this subscription from its dispatcher\"\n                                                    }\n                                                ]\n                                            },\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"interface-implementation.ts\",\n                                                    \"line\": 21,\n                                                    \"character\": 8,\n                                                    \"url\": \"typedoc://interface-implementation.ts#L21\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"void\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        48,\n                                        46,\n                                        47\n                                    ]\n                                },\n                                {\n                                    \"title\": \"Methods\",\n                                    \"children\": [\n                                        49\n                                    ]\n                                }\n                            ],\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"interface-implementation.ts\",\n                                    \"line\": 13,\n                                    \"character\": 21,\n                                    \"url\": \"typedoc://interface-implementation.ts#L13\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 45,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"implementedBy\": [\n                                {\n                                    \"type\": \"reference\",\n                                    \"target\": 51,\n                                    \"name\": \"Subscription\"\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Classes\",\n                            \"children\": [\n                                83,\n                                51\n                            ]\n                        },\n                        {\n                            \"title\": \"Interfaces\",\n                            \"children\": [\n                                66,\n                                40,\n                                44\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"interface-implementation.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://interface-implementation.ts#L1\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Namespaces\",\n                    \"children\": [\n                        39\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"interface-implementation.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://interface-implementation.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 104,\n            \"name\": \"merging\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 105,\n                    \"name\": \"Base\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 106,\n                            \"name\": \"base\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                106\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"merging.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://merging.ts#L1\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 109,\n                            \"name\": \"Child\"\n                        },\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 114,\n                            \"name\": \"Child2\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 107,\n                    \"name\": \"Base2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 108,\n                            \"name\": \"base2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 6,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L6\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 2\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                108\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"merging.ts\",\n                            \"line\": 5,\n                            \"character\": 17,\n                            \"url\": \"typedoc://merging.ts#L5\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 109,\n                            \"name\": \"Child\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 109,\n                    \"name\": \"Child\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 112,\n                            \"name\": \"base\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 106,\n                                \"name\": \"Base.base\"\n                            }\n                        },\n                        {\n                            \"id\": 113,\n                            \"name\": \"base2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 6,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L6\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 2\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 108,\n                                \"name\": \"Base2.base2\"\n                            }\n                        },\n                        {\n                            \"id\": 110,\n                            \"name\": \"child\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L10\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        },\n                        {\n                            \"id\": 111,\n                            \"name\": \"child3\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 15,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L15\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 2\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                112,\n                                113,\n                                110,\n                                111\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"merging.ts\",\n                            \"line\": 9,\n                            \"character\": 17,\n                            \"url\": \"typedoc://merging.ts#L9\"\n                        },\n                        {\n                            \"fileName\": \"merging.ts\",\n                            \"line\": 14,\n                            \"character\": 17,\n                            \"url\": \"typedoc://merging.ts#L14\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 105,\n                            \"name\": \"Base\",\n                            \"package\": \"typedoc\"\n                        },\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 107,\n                            \"name\": \"Base2\",\n                            \"package\": \"typedoc\"\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 114,\n                            \"name\": \"Child2\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 114,\n                    \"name\": \"Child2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 118,\n                            \"name\": \"base\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L2\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 112,\n                                \"name\": \"Child.base\"\n                            }\n                        },\n                        {\n                            \"id\": 119,\n                            \"name\": \"base2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 6,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L6\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 2\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 113,\n                                \"name\": \"Child.base2\"\n                            }\n                        },\n                        {\n                            \"id\": 116,\n                            \"name\": \"child\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L10\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 110,\n                                \"name\": \"Child.child\"\n                            }\n                        },\n                        {\n                            \"id\": 115,\n                            \"name\": \"child2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 19,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L19\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            }\n                        },\n                        {\n                            \"id\": 117,\n                            \"name\": \"child3\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"merging.ts\",\n                                    \"line\": 15,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://merging.ts#L15\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"literal\",\n                                \"value\": 2\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 111,\n                                \"name\": \"Child.child3\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                118,\n                                119,\n                                116,\n                                115,\n                                117\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"merging.ts\",\n                            \"line\": 18,\n                            \"character\": 17,\n                            \"url\": \"typedoc://merging.ts#L18\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 109,\n                            \"name\": \"Child\",\n                            \"package\": \"typedoc\"\n                        },\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 105,\n                            \"name\": \"Base\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        105,\n                        107,\n                        109,\n                        114\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"merging.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://merging.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                14,\n                30,\n                38,\n                104\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"Constructor\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"Constructor\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"Constructor\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"Constructor\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"Constructor\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/constructor-type.ts\",\n            \"qualifiedName\": \"Instance\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"StrIndex\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"StrIndex.__index\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"NumIndex\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"NumIndex.__index\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"BothIndex\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"BothIndex.__index\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"BothIndex.__index\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"TypeIndex\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/index-signature.ts\",\n            \"qualifiedName\": \"__type.__index\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-empty.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-empty.ts\",\n            \"qualifiedName\": \"EmptyInterface\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-empty.ts\",\n            \"qualifiedName\": \"ClassImplementingEmptyInterface\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-empty.ts\",\n            \"qualifiedName\": \"ClassImplementingEmptyInterface.name\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-empty.ts\",\n            \"qualifiedName\": \"ClassImplementingEmptyInterface.goto\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-empty.ts\",\n            \"qualifiedName\": \"ClassImplementingEmptyInterface.goto\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventListener\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventListener.T\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventListener\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"parameter\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt.T\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt.listener\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt.priority\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt.filter\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt.unsubscribe\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.SubscriptionInt.unsubscribe\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.V\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.__constructor\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.V\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"listener\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"filter\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"priority\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"dispatcher\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.listener\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.filter\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.priority\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.dispatcher\"\n        },\n        \"64\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.unsubscribe\"\n        },\n        \"65\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.Subscription.unsubscribe\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.U\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.add\"\n        },\n        \"69\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.add\"\n        },\n        \"70\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"listener\"\n        },\n        \"71\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"filter\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"priority\"\n        },\n        \"73\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.remove\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.remove\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"subscription\"\n        },\n        \"76\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.dispatch\"\n        },\n        \"77\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.dispatch\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"parameter\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.clear\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.clear\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.hasListeners\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcherInt.hasListeners\"\n        },\n        \"83\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher\"\n        },\n        \"84\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.T\"\n        },\n        \"87\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.T\"\n        },\n        \"88\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.subscriptions\"\n        },\n        \"89\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.add\"\n        },\n        \"90\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.add\"\n        },\n        \"91\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"listener\"\n        },\n        \"92\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"filter\"\n        },\n        \"93\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"priority\"\n        },\n        \"94\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.remove\"\n        },\n        \"95\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.remove\"\n        },\n        \"96\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"subscription\"\n        },\n        \"97\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.dispatch\"\n        },\n        \"98\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.dispatch\"\n        },\n        \"99\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"event\"\n        },\n        \"100\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.clear\"\n        },\n        \"101\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.clear\"\n        },\n        \"102\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.hasListeners\"\n        },\n        \"103\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"qualifiedName\": \"Forms.EventDispatcher.hasListeners\"\n        },\n        \"104\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"105\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base\"\n        },\n        \"106\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base.base\"\n        },\n        \"107\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base2\"\n        },\n        \"108\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base2.base2\"\n        },\n        \"109\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child\"\n        },\n        \"110\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child.child\"\n        },\n        \"111\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child.child3\"\n        },\n        \"112\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base.base\"\n        },\n        \"113\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base2.base2\"\n        },\n        \"114\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child2\"\n        },\n        \"115\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child2.child2\"\n        },\n        \"116\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child.child\"\n        },\n        \"117\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Child.child3\"\n        },\n        \"118\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base.base\"\n        },\n        \"119\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/interface/merging.ts\",\n            \"qualifiedName\": \"Base2.base2\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/interface/constructor-type.ts\",\n            \"2\": \"src/test/converter/interface/index-signature.ts\",\n            \"3\": \"src/test/converter/interface/interface-empty.ts\",\n            \"4\": \"src/test/converter/interface/interface-implementation.ts\",\n            \"5\": \"src/test/converter/interface/merging.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 14,\n            \"3\": 30,\n            \"4\": 38,\n            \"5\": 104\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/js/export-eq-type.js",
    "content": "/** @typedef {string} Foo */\n\n/** @param {Foo} x x desc */\nconst foo = (x) => x;\n\nmodule.exports = foo;\n"
  },
  {
    "path": "src/test/converter/js/index.js",
    "content": "/** */\n\n/**\n * not included anywhere\n * @typedef {Object} InterfaceIsh\n * @property {string} foo docs for property\n * more docs for property\n */\n\n/**\n * @typedef {object} AlsoInterfaceIsh docs for interface\n * @property {string} foo docs for property\n * @prop {string} bar can also use prop tag\n */\n\n/**\n * @typedef {Object} ObjectAlias type alias since it doesn't have a property tag\n */\n\n/**\n * @typedef {string | number} UnionType docs for alias\n * @typedef {{ x: string } & { y: number }} IntersectionType docs for alias\n */\n\n/**\n * @callback NoReturnTag even though in the same comment block\n * @callback HasReturnTag\n * @returns {string}\n */\n\n/**\n * @template T\n * @callback IdentityFn\n * @param {T} data\n * @return {T} the data\n */\n\n/**\n * @callback OptionalArg\n * @param {string} [data] an optional argument\n */\n\n/**\n * @template T comment on template\n * @typedef {T} Identity comment on alias\n */\n\n/**\n * @callback Foo\n * @param {...string} args Foo param description\n * @returns {number} Foo return description\n */\n\n/** @type {Foo} */\nexport const usedFoo = () => 1;\n\n/**\n * @enum {string} enum comment\n */\nexport const ColumnType = {\n    STRING: \"string\",\n    NUMBER: \"number\",\n};\n"
  },
  {
    "path": "src/test/converter/js/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"js\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"export-eq-type\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"Foo\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-eq-type.js\",\n                            \"line\": 1,\n                            \"character\": 22,\n                            \"url\": \"typedoc://export-eq-type.js#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                },\n                {\n                    \"id\": 43,\n                    \"name\": \"export=\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"export-eq-type.js\",\n                            \"line\": 4,\n                            \"character\": 6,\n                            \"url\": \"typedoc://export-eq-type.js#L4\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 44,\n                            \"name\": \"export=\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"export-eq-type.js\",\n                                    \"line\": 4,\n                                    \"character\": 12,\n                                    \"url\": \"typedoc://export-eq-type.js#L4\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 45,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"x desc\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        2\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        43\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"export-eq-type.js\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://export-eq-type.js#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 3,\n            \"name\": \"index\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 7,\n                    \"name\": \"ColumnType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 8,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"enum comment\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 9,\n                            \"name\": \"NUMBER\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 16,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index.js\",\n                                    \"line\": 62,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index.js#L62\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 8,\n                            \"name\": \"STRING\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 16,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index.js\",\n                                    \"line\": 61,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index.js#L61\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Enumeration Members\",\n                            \"children\": [\n                                9,\n                                8\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 60,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L60\"\n                        },\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 58,\n                            \"character\": 3,\n                            \"url\": \"typedoc://index.js#L58\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 12,\n                    \"name\": \"AlsoInterfaceIsh\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"docs for interface\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 14,\n                            \"name\": \"bar\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"can also use prop tag\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index.js\",\n                                    \"line\": 13,\n                                    \"character\": 18,\n                                    \"url\": \"typedoc://index.js#L13\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 13,\n                            \"name\": \"foo\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"docs for property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index.js\",\n                                    \"line\": 12,\n                                    \"character\": 22,\n                                    \"url\": \"typedoc://index.js#L12\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                14,\n                                13\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 11,\n                            \"character\": 21,\n                            \"url\": \"typedoc://index.js#L11\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"InterfaceIsh\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 11,\n                            \"name\": \"foo\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"docs for property\\nmore docs for property\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index.js\",\n                                    \"line\": 6,\n                                    \"character\": 22,\n                                    \"url\": \"typedoc://index.js#L6\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                11\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 5,\n                            \"character\": 21,\n                            \"url\": \"typedoc://index.js#L5\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 39,\n                    \"name\": \"Foo\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 49,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L49\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 40,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 42,\n                                            \"name\": \"args\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {\n                                                \"isRest\": true\n                                            },\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"Foo param description\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"array\",\n                                                \"elementType\": {\n                                                    \"type\": \"intrinsic\",\n                                                    \"name\": \"string\"\n                                                }\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"id\": 25,\n                    \"name\": \"HasReturnTag\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 27,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L27\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 26,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 27,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"id\": 37,\n                    \"name\": \"Identity\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"comment on alias\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 45,\n                            \"character\": 16,\n                            \"url\": \"typedoc://index.js#L45\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 38,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"comment on template\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": 38,\n                        \"name\": \"T\",\n                        \"package\": \"typedoc\",\n                        \"refersToTypeParameter\": true\n                    }\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"IdentityFn\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 33,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L33\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 32,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {}\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 29,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 30,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 31,\n                                            \"name\": \"data\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 32,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 32,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"id\": 17,\n                    \"name\": \"IntersectionType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"docs for alias\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 22,\n                            \"character\": 44,\n                            \"url\": \"typedoc://index.js#L22\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intersection\",\n                        \"types\": [\n                            {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 18,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 19,\n                                            \"name\": \"x\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"index.js\",\n                                                    \"line\": 22,\n                                                    \"character\": 15,\n                                                    \"url\": \"typedoc://index.js#L22\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                19\n                                            ]\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 20,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 21,\n                                            \"name\": \"y\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"index.js\",\n                                                    \"line\": 22,\n                                                    \"character\": 31,\n                                                    \"url\": \"typedoc://index.js#L22\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"number\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                21\n                                            ]\n                                        }\n                                    ]\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 22,\n                    \"name\": \"NoReturnTag\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"even though in the same comment block\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 26,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L26\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 23,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 24,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"id\": 15,\n                    \"name\": \"ObjectAlias\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"type alias since it doesn't have a property tag\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 17,\n                            \"character\": 21,\n                            \"url\": \"typedoc://index.js#L17\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": {\n                            \"packageName\": \"typescript\",\n                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                            \"qualifiedName\": \"Object\"\n                        },\n                        \"name\": \"Object\",\n                        \"package\": \"typescript\"\n                    }\n                },\n                {\n                    \"id\": 33,\n                    \"name\": \"OptionalArg\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 39,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L39\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 34,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 35,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 4096,\n                                    \"flags\": {},\n                                    \"parameters\": [\n                                        {\n                                            \"id\": 36,\n                                            \"name\": \"data\",\n                                            \"variant\": \"param\",\n                                            \"kind\": 32768,\n                                            \"flags\": {\n                                                \"isOptional\": true\n                                            },\n                                            \"comment\": {\n                                                \"summary\": [\n                                                    {\n                                                        \"kind\": \"text\",\n                                                        \"text\": \"an optional argument\"\n                                                    }\n                                                ]\n                                            },\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"any\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"id\": 16,\n                    \"name\": \"UnionType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"docs for alias\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 21,\n                            \"character\": 30,\n                            \"url\": \"typedoc://index.js#L21\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"union\",\n                        \"types\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            },\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"usedFoo\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index.js\",\n                            \"line\": 55,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index.js#L55\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 5,\n                            \"name\": \"usedFoo\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [],\n                                \"blockTags\": [\n                                    {\n                                        \"tag\": \"@returns\",\n                                        \"content\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Foo return description\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index.js\",\n                                    \"line\": 55,\n                                    \"character\": 13,\n                                    \"url\": \"typedoc://index.js#L55\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 6,\n                                    \"name\": \"args\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {\n                                        \"isRest\": true\n                                    },\n                                    \"comment\": {\n                                        \"summary\": [\n                                            {\n                                                \"kind\": \"text\",\n                                                \"text\": \"Foo param description\"\n                                            }\n                                        ]\n                                    },\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Enumerations\",\n                    \"children\": [\n                        7\n                    ]\n                },\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        12,\n                        10\n                    ]\n                },\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        39,\n                        25,\n                        37,\n                        28,\n                        17,\n                        22,\n                        15,\n                        33,\n                        16\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        4\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"index.js\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://index.js#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                3\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/export-eq-type.js\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/export-eq-type.js\",\n            \"qualifiedName\": \"Foo\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"usedFoo\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"usedFoo\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"args\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"ColumnType\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__object.STRING\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__object.NUMBER\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"InterfaceIsh\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type.foo\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"AlsoInterfaceIsh\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type.foo\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type.bar\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"ObjectAlias\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"UnionType\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"IntersectionType\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type.x\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type.y\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"NoReturnTag\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"HasReturnTag\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"IdentityFn\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"data\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"T\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"OptionalArg\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"data\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"Identity\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"T\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"Foo\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/index.js\",\n            \"qualifiedName\": \"args\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/export-eq-type.js\",\n            \"qualifiedName\": \"foo\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/export-eq-type.js\",\n            \"qualifiedName\": \"foo\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/js/export-eq-type.js\",\n            \"qualifiedName\": \"x\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/js/export-eq-type.js\",\n            \"2\": \"src/test/converter/js/index.js\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 3\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/mixin/mixin.ts",
    "content": "/**\n * Any function\n */\nexport type AnyFunction<A = any> = (...input: any[]) => A;\n\n/**\n * Any constructor function\n */\nexport type AnyConstructor<A = object> = new (...input: any[]) => A;\n\n/**\n * Mixin type helper\n */\nexport type Mixin<T extends AnyFunction> = InstanceType<ReturnType<T>>;\n\n/**\n * Base class\n */\nexport class Base {\n    baseProperty = \"init\";\n\n    baseMethod(): number {\n        return 42;\n    }\n}\n\n/**\n * The \"mixin function\" of the Mixin1\n */\nexport const Mixin1Func = <T extends AnyConstructor<Base>>(base: T) =>\n    /**\n     * Internal class of the Mixin1\n     */\n    class Mixin1Class extends base {\n        property1 = \"init\";\n\n        method1(arg: Mixin1Type[]): Mixin1Type[] {\n            return [...arg, this];\n        }\n    };\n\n/**\n * The \"instance type\" of the Mixin1 using the interface notation (supports recursive type definition)\n */\nexport interface Mixin1Type extends Mixin<typeof Mixin1Func> {}\n\n/**\n * The \"mixin function\" of the Mixin2\n */\nexport const Mixin2 = <T extends AnyConstructor<Mixin1Type & Base>>(base: T) =>\n    /**\n     * Internal class of the Mixin2\n     */\n    class Mixin2 extends base {\n        property2 = \"init\";\n\n        method2(arg: Mixin2Type): Mixin2Type {\n            return arg;\n        }\n    };\n\n/**\n * The \"instance type\" of the Mixin2 using the interface notation (supports recursive type definition)\n */\nexport interface Mixin2Type extends Mixin<typeof Mixin2> {}\n\n/**\n * The \"mixin function\" of the Mixin3\n */\nexport const Mixin3 = <T extends AnyConstructor<object>>(base: T) =>\n    /**\n     * Internal class of the Mixin3\n     */\n    class Mixin3 extends base {};\n\n/**\n * The \"instance type\" of the Mixin3 using the regular type notation (does not work well for recursive type definition)\n * Is not well supported by the TypeDoc\n */\nexport type Mixin3 = Mixin<typeof Mixin3>;\n\n/**\n * Class that inherits from Base and consumes Mixin1 and Mixin2, in order.\n */\nexport class SomeClassWithMixin extends Mixin2(Mixin1Func(Base)) {\n    classWithMixinProperty = \"init\";\n\n    classWithMixinMethod(): string {\n        return \"42\";\n    }\n}\n"
  },
  {
    "path": "src/test/converter/mixin/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"mixin\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 13,\n            \"name\": \"Base\",\n            \"variant\": \"declaration\",\n            \"kind\": 128,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Base class\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 14,\n                    \"name\": \"constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 15,\n                            \"name\": \"Base\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 13,\n                                \"name\": \"Base\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 16,\n                    \"name\": \"baseProperty\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 20,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L20\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\"\n                },\n                {\n                    \"id\": 17,\n                    \"name\": \"baseMethod\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 22,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L22\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 18,\n                            \"name\": \"baseMethod\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 22,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mixin.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Constructors\",\n                    \"children\": [\n                        14\n                    ]\n                },\n                {\n                    \"title\": \"Properties\",\n                    \"children\": [\n                        16\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        17\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 19,\n                    \"character\": 13,\n                    \"url\": \"typedoc://mixin.ts#L19\"\n                }\n            ]\n        },\n        {\n            \"id\": 64,\n            \"name\": \"SomeClassWithMixin\",\n            \"variant\": \"declaration\",\n            \"kind\": 128,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Class that inherits from Base and consumes Mixin1 and Mixin2, in order.\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 69,\n                    \"name\": \"constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 70,\n                            \"name\": \"SomeClassWithMixin\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 64,\n                                \"name\": \"SomeClassWithMixin\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin2(Mixin1Func(Base)).constructor\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).constructor\"\n                    }\n                },\n                {\n                    \"id\": 82,\n                    \"name\": \"baseProperty\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 20,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L20\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).baseProperty\"\n                    }\n                },\n                {\n                    \"id\": 71,\n                    \"name\": \"classWithMixinProperty\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 86,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L86\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\"\n                },\n                {\n                    \"id\": 78,\n                    \"name\": \"property1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 35,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L35\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).property1\"\n                    }\n                },\n                {\n                    \"id\": 74,\n                    \"name\": \"property2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 55,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L55\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).property2\"\n                    }\n                },\n                {\n                    \"id\": 83,\n                    \"name\": \"baseMethod\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 22,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L22\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 84,\n                            \"name\": \"baseMethod\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 22,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mixin.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin2(Mixin1Func(Base)).baseMethod\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).baseMethod\"\n                    }\n                },\n                {\n                    \"id\": 72,\n                    \"name\": \"classWithMixinMethod\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 88,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L88\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 73,\n                            \"name\": \"classWithMixinMethod\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 88,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mixin.ts#L88\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 79,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 37,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L37\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 80,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 37,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://mixin.ts#L37\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 81,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"reference\",\n                                            \"target\": 27,\n                                            \"name\": \"Mixin1Type\",\n                                            \"package\": \"typedoc\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 27,\n                                    \"name\": \"Mixin1Type\",\n                                    \"package\": \"typedoc\"\n                                }\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin2(Mixin1Func(Base)).method1\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).method1\",\n                        \"package\": \"typedoc\"\n                    }\n                },\n                {\n                    \"id\": 75,\n                    \"name\": \"method2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 57,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L57\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 76,\n                            \"name\": \"method2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 57,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://mixin.ts#L57\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 77,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 43,\n                                        \"name\": \"Mixin2Type\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 43,\n                                \"name\": \"Mixin2Type\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin2(Mixin1Func(Base)).method2\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin2(Mixin1Func(Base)).method2\",\n                        \"package\": \"typedoc\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Constructors\",\n                    \"children\": [\n                        69\n                    ]\n                },\n                {\n                    \"title\": \"Properties\",\n                    \"children\": [\n                        82,\n                        71,\n                        78,\n                        74\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        83,\n                        72,\n                        79,\n                        75\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 85,\n                    \"character\": 13,\n                    \"url\": \"typedoc://mixin.ts#L85\"\n                }\n            ],\n            \"extendedTypes\": [\n                {\n                    \"type\": \"intersection\",\n                    \"types\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 39,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"intersection\",\n                                    \"types\": [\n                                        {\n                                            \"type\": \"reflection\",\n                                            \"declaration\": {\n                                                \"id\": 65,\n                                                \"name\": \"__type\",\n                                                \"variant\": \"declaration\",\n                                                \"kind\": 65536,\n                                                \"flags\": {},\n                                                \"children\": [\n                                                    {\n                                                        \"id\": 66,\n                                                        \"name\": \"prototype\",\n                                                        \"variant\": \"declaration\",\n                                                        \"kind\": 1024,\n                                                        \"flags\": {},\n                                                        \"type\": {\n                                                            \"type\": \"reference\",\n                                                            \"target\": 23,\n                                                            \"typeArguments\": [\n                                                                {\n                                                                    \"type\": \"intrinsic\",\n                                                                    \"name\": \"any\"\n                                                                }\n                                                            ],\n                                                            \"name\": \"Mixin1Class\",\n                                                            \"package\": \"typedoc\"\n                                                        }\n                                                    }\n                                                ],\n                                                \"groups\": [\n                                                    {\n                                                        \"title\": \"Properties\",\n                                                        \"children\": [\n                                                            66\n                                                        ]\n                                                    }\n                                                ],\n                                                \"signatures\": [\n                                                    {\n                                                        \"id\": 67,\n                                                        \"name\": \"SomeClassWithMixin\",\n                                                        \"variant\": \"signature\",\n                                                        \"kind\": 16384,\n                                                        \"flags\": {},\n                                                        \"parameters\": [\n                                                            {\n                                                                \"id\": 68,\n                                                                \"name\": \"input\",\n                                                                \"variant\": \"param\",\n                                                                \"kind\": 32768,\n                                                                \"flags\": {\n                                                                    \"isRest\": true\n                                                                },\n                                                                \"type\": {\n                                                                    \"type\": \"array\",\n                                                                    \"elementType\": {\n                                                                        \"type\": \"intrinsic\",\n                                                                        \"name\": \"any\"\n                                                                    }\n                                                                }\n                                                            }\n                                                        ],\n                                                        \"type\": {\n                                                            \"type\": \"reference\",\n                                                            \"target\": 23,\n                                                            \"name\": \"Mixin1Class\",\n                                                            \"package\": \"typedoc\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        },\n                                        {\n                                            \"type\": \"query\",\n                                            \"queryType\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 13,\n                                                \"name\": \"Base\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"this\"\n                                }\n                            ],\n                            \"name\": \"Mixin2\",\n                            \"package\": \"typedoc\"\n                        },\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 23,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"query\",\n                                    \"queryType\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 13,\n                                        \"name\": \"Base\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                },\n                                {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"this\"\n                                }\n                            ],\n                            \"name\": \"Mixin1Class\",\n                            \"package\": \"typedoc\"\n                        },\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 13,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"this\"\n                                }\n                            ],\n                            \"name\": \"Base\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"id\": 27,\n            \"name\": \"Mixin1Type\",\n            \"variant\": \"declaration\",\n            \"kind\": 256,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"The \\\"instance type\\\" of the Mixin1 using the interface notation (supports recursive type definition)\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 32,\n                    \"name\": \"baseProperty\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 20,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L20\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.baseProperty\"\n                    }\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"property1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 35,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L35\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.property1\"\n                    }\n                },\n                {\n                    \"id\": 33,\n                    \"name\": \"baseMethod\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 22,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L22\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 34,\n                            \"name\": \"baseMethod\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 22,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mixin.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin.baseMethod\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.baseMethod\"\n                    }\n                },\n                {\n                    \"id\": 29,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 37,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L37\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 30,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 37,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://mixin.ts#L37\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 31,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"reference\",\n                                            \"target\": 27,\n                                            \"name\": \"Mixin1Type\",\n                                            \"package\": \"typedoc\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 27,\n                                    \"name\": \"Mixin1Type\",\n                                    \"package\": \"typedoc\"\n                                }\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin.method1\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.method1\",\n                        \"package\": \"typedoc\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Properties\",\n                    \"children\": [\n                        32,\n                        28\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        33,\n                        29\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 45,\n                    \"character\": 17,\n                    \"url\": \"typedoc://mixin.ts#L45\"\n                }\n            ],\n            \"extendedTypes\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 11,\n                    \"typeArguments\": [\n                        {\n                            \"type\": \"query\",\n                            \"queryType\": {\n                                \"type\": \"reference\",\n                                \"target\": 19,\n                                \"name\": \"Mixin1Func\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"name\": \"Mixin\",\n                    \"package\": \"typedoc\"\n                }\n            ]\n        },\n        {\n            \"id\": 43,\n            \"name\": \"Mixin2Type\",\n            \"variant\": \"declaration\",\n            \"kind\": 256,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"The \\\"instance type\\\" of the Mixin2 using the interface notation (supports recursive type definition)\"\n                    }\n                ]\n            },\n            \"children\": [\n                {\n                    \"id\": 52,\n                    \"name\": \"baseProperty\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 20,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L20\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.baseProperty\"\n                    }\n                },\n                {\n                    \"id\": 48,\n                    \"name\": \"property1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 35,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L35\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.property1\"\n                    }\n                },\n                {\n                    \"id\": 44,\n                    \"name\": \"property2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 55,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L55\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    },\n                    \"defaultValue\": \"\\\"init\\\"\",\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.property2\"\n                    }\n                },\n                {\n                    \"id\": 53,\n                    \"name\": \"baseMethod\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 22,\n                            \"character\": 4,\n                            \"url\": \"typedoc://mixin.ts#L22\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 54,\n                            \"name\": \"baseMethod\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 22,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://mixin.ts#L22\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin.baseMethod\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.baseMethod\"\n                    }\n                },\n                {\n                    \"id\": 49,\n                    \"name\": \"method1\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 37,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L37\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 50,\n                            \"name\": \"method1\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 37,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://mixin.ts#L37\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 51,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"reference\",\n                                            \"target\": 27,\n                                            \"name\": \"Mixin1Type\",\n                                            \"package\": \"typedoc\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"reference\",\n                                    \"target\": 27,\n                                    \"name\": \"Mixin1Type\",\n                                    \"package\": \"typedoc\"\n                                }\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin.method1\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.method1\",\n                        \"package\": \"typedoc\"\n                    }\n                },\n                {\n                    \"id\": 45,\n                    \"name\": \"method2\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {\n                        \"isInherited\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 57,\n                            \"character\": 8,\n                            \"url\": \"typedoc://mixin.ts#L57\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 46,\n                            \"name\": \"method2\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {\n                                \"isInherited\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mixin.ts\",\n                                    \"line\": 57,\n                                    \"character\": 8,\n                                    \"url\": \"typedoc://mixin.ts#L57\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 47,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 43,\n                                        \"name\": \"Mixin2Type\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 43,\n                                \"name\": \"Mixin2Type\",\n                                \"package\": \"typedoc\"\n                            },\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": -1,\n                                \"name\": \"Mixin.method2\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"inheritedFrom\": {\n                        \"type\": \"reference\",\n                        \"target\": -1,\n                        \"name\": \"Mixin.method2\",\n                        \"package\": \"typedoc\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Properties\",\n                    \"children\": [\n                        52,\n                        48,\n                        44\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        53,\n                        49,\n                        45\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 65,\n                    \"character\": 17,\n                    \"url\": \"typedoc://mixin.ts#L65\"\n                }\n            ],\n            \"extendedTypes\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 11,\n                    \"typeArguments\": [\n                        {\n                            \"type\": \"query\",\n                            \"queryType\": {\n                                \"type\": \"reference\",\n                                \"target\": 35,\n                                \"name\": \"Mixin2\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"name\": \"Mixin\",\n                    \"package\": \"typedoc\"\n                }\n            ]\n        },\n        {\n            \"id\": 6,\n            \"name\": \"AnyConstructor\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Any constructor function\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 9,\n                    \"character\": 12,\n                    \"url\": \"typedoc://mixin.ts#L9\"\n                }\n            ],\n            \"typeParameters\": [\n                {\n                    \"id\": 10,\n                    \"name\": \"A\",\n                    \"variant\": \"typeParam\",\n                    \"kind\": 131072,\n                    \"flags\": {},\n                    \"default\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"object\"\n                    }\n                }\n            ],\n            \"type\": {\n                \"type\": \"reflection\",\n                \"declaration\": {\n                    \"id\": 7,\n                    \"name\": \"__type\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 9,\n                            \"character\": 41,\n                            \"url\": \"typedoc://mixin.ts#L9\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 8,\n                            \"name\": \"__type\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"parameters\": [\n                                {\n                                    \"id\": 9,\n                                    \"name\": \"input\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {\n                                        \"isRest\": true\n                                    },\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"any\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 10,\n                                \"name\": \"A\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ]\n                }\n            }\n        },\n        {\n            \"id\": 1,\n            \"name\": \"AnyFunction\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Any function\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 4,\n                    \"character\": 12,\n                    \"url\": \"typedoc://mixin.ts#L4\"\n                }\n            ],\n            \"typeParameters\": [\n                {\n                    \"id\": 5,\n                    \"name\": \"A\",\n                    \"variant\": \"typeParam\",\n                    \"kind\": 131072,\n                    \"flags\": {},\n                    \"default\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"any\"\n                    }\n                }\n            ],\n            \"type\": {\n                \"type\": \"reflection\",\n                \"declaration\": {\n                    \"id\": 2,\n                    \"name\": \"__type\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 65536,\n                    \"flags\": {},\n                    \"signatures\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"__type\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"parameters\": [\n                                {\n                                    \"id\": 4,\n                                    \"name\": \"input\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {\n                                        \"isRest\": true\n                                    },\n                                    \"type\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"any\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 5,\n                                \"name\": \"A\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ]\n                }\n            }\n        },\n        {\n            \"id\": 11,\n            \"name\": \"Mixin\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"Mixin type helper\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 14,\n                    \"character\": 12,\n                    \"url\": \"typedoc://mixin.ts#L14\"\n                }\n            ],\n            \"typeParameters\": [\n                {\n                    \"id\": 12,\n                    \"name\": \"T\",\n                    \"variant\": \"typeParam\",\n                    \"kind\": 131072,\n                    \"flags\": {},\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": 1,\n                        \"name\": \"AnyFunction\",\n                        \"package\": \"typedoc\"\n                    }\n                }\n            ],\n            \"type\": {\n                \"type\": \"reference\",\n                \"target\": {\n                    \"packageName\": \"typescript\",\n                    \"packagePath\": \"lib/lib.es5.d.ts\",\n                    \"qualifiedName\": \"InstanceType\"\n                },\n                \"typeArguments\": [\n                    {\n                        \"type\": \"reference\",\n                        \"target\": {\n                            \"packageName\": \"typescript\",\n                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                            \"qualifiedName\": \"ReturnType\"\n                        },\n                        \"typeArguments\": [\n                            {\n                                \"type\": \"reference\",\n                                \"target\": 12,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        ],\n                        \"name\": \"ReturnType\",\n                        \"package\": \"typescript\"\n                    }\n                ],\n                \"name\": \"InstanceType\",\n                \"package\": \"typescript\"\n            },\n            \"extendedBy\": [\n                {\n                    \"type\": \"reference\",\n                    \"target\": 27,\n                    \"name\": \"Mixin1Type\"\n                },\n                {\n                    \"type\": \"reference\",\n                    \"target\": 43,\n                    \"name\": \"Mixin2Type\"\n                }\n            ]\n        },\n        {\n            \"id\": 63,\n            \"name\": \"Mixin3\",\n            \"variant\": \"declaration\",\n            \"kind\": 2097152,\n            \"flags\": {},\n            \"comment\": {\n                \"summary\": [\n                    {\n                        \"kind\": \"text\",\n                        \"text\": \"The \\\"instance type\\\" of the Mixin3 using the regular type notation (does not work well for recursive type definition)\\nIs not well supported by the TypeDoc\"\n                    }\n                ]\n            },\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 70,\n                    \"character\": 13,\n                    \"url\": \"typedoc://mixin.ts#L70\"\n                },\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 80,\n                    \"character\": 12,\n                    \"url\": \"typedoc://mixin.ts#L80\"\n                }\n            ],\n            \"type\": {\n                \"type\": \"reference\",\n                \"target\": 11,\n                \"typeArguments\": [\n                    {\n                        \"type\": \"query\",\n                        \"queryType\": {\n                            \"type\": \"reference\",\n                            \"target\": 55,\n                            \"name\": \"Mixin3\",\n                            \"package\": \"typedoc\"\n                        }\n                    }\n                ],\n                \"name\": \"Mixin\",\n                \"package\": \"typedoc\"\n            }\n        },\n        {\n            \"id\": 19,\n            \"name\": \"Mixin1Func\",\n            \"variant\": \"declaration\",\n            \"kind\": 64,\n            \"flags\": {},\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 30,\n                    \"character\": 13,\n                    \"url\": \"typedoc://mixin.ts#L30\"\n                }\n            ],\n            \"signatures\": [\n                {\n                    \"id\": 20,\n                    \"name\": \"Mixin1Func\",\n                    \"variant\": \"signature\",\n                    \"kind\": 4096,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"The \\\"mixin function\\\" of the Mixin1\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 30,\n                            \"character\": 26,\n                            \"url\": \"typedoc://mixin.ts#L30\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 21,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 6,\n                                \"typeArguments\": [\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": 13,\n                                        \"name\": \"Base\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                ],\n                                \"name\": \"AnyConstructor\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"parameters\": [\n                        {\n                            \"id\": 22,\n                            \"name\": \"base\",\n                            \"variant\": \"param\",\n                            \"kind\": 32768,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 21,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intersection\",\n                        \"types\": [\n                            {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 23,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 24,\n                                            \"name\": \"prototype\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 23,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"any\"\n                                                    }\n                                                ],\n                                                \"name\": \"Mixin1Class\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                24\n                                            ]\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 25,\n                                            \"name\": \"Mixin1Func\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 16384,\n                                            \"flags\": {},\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 26,\n                                                    \"name\": \"input\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {\n                                                        \"isRest\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"any\"\n                                                        }\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 23,\n                                                \"name\": \"Mixin1Class\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"type\": \"reference\",\n                                \"target\": 21,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        ]\n                    }\n                }\n            ]\n        },\n        {\n            \"id\": 35,\n            \"name\": \"Mixin2\",\n            \"variant\": \"declaration\",\n            \"kind\": 64,\n            \"flags\": {},\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 50,\n                    \"character\": 13,\n                    \"url\": \"typedoc://mixin.ts#L50\"\n                }\n            ],\n            \"signatures\": [\n                {\n                    \"id\": 36,\n                    \"name\": \"Mixin2\",\n                    \"variant\": \"signature\",\n                    \"kind\": 4096,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"The \\\"mixin function\\\" of the Mixin2\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 50,\n                            \"character\": 22,\n                            \"url\": \"typedoc://mixin.ts#L50\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 37,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 6,\n                                \"typeArguments\": [\n                                    {\n                                        \"type\": \"intersection\",\n                                        \"types\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 27,\n                                                \"name\": \"Mixin1Type\",\n                                                \"package\": \"typedoc\"\n                                            },\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 13,\n                                                \"name\": \"Base\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"name\": \"AnyConstructor\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"parameters\": [\n                        {\n                            \"id\": 38,\n                            \"name\": \"base\",\n                            \"variant\": \"param\",\n                            \"kind\": 32768,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 37,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intersection\",\n                        \"types\": [\n                            {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 39,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 40,\n                                            \"name\": \"prototype\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 39,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"any\"\n                                                    }\n                                                ],\n                                                \"name\": \"Mixin2\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                40\n                                            ]\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 41,\n                                            \"name\": \"Mixin2\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 16384,\n                                            \"flags\": {},\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 42,\n                                                    \"name\": \"input\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {\n                                                        \"isRest\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"any\"\n                                                        }\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 39,\n                                                \"name\": \"Mixin2\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"type\": \"reference\",\n                                \"target\": 37,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        ]\n                    }\n                }\n            ]\n        },\n        {\n            \"id\": 55,\n            \"name\": \"Mixin3\",\n            \"variant\": \"declaration\",\n            \"kind\": 64,\n            \"flags\": {},\n            \"sources\": [\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 70,\n                    \"character\": 13,\n                    \"url\": \"typedoc://mixin.ts#L70\"\n                },\n                {\n                    \"fileName\": \"mixin.ts\",\n                    \"line\": 80,\n                    \"character\": 12,\n                    \"url\": \"typedoc://mixin.ts#L80\"\n                }\n            ],\n            \"signatures\": [\n                {\n                    \"id\": 56,\n                    \"name\": \"Mixin3\",\n                    \"variant\": \"signature\",\n                    \"kind\": 4096,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"The \\\"mixin function\\\" of the Mixin3\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mixin.ts\",\n                            \"line\": 70,\n                            \"character\": 22,\n                            \"url\": \"typedoc://mixin.ts#L70\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 57,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 6,\n                                \"typeArguments\": [\n                                    {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"object\"\n                                    }\n                                ],\n                                \"name\": \"AnyConstructor\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ],\n                    \"parameters\": [\n                        {\n                            \"id\": 58,\n                            \"name\": \"base\",\n                            \"variant\": \"param\",\n                            \"kind\": 32768,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 57,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intersection\",\n                        \"types\": [\n                            {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 59,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 60,\n                                            \"name\": \"prototype\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 59,\n                                                \"typeArguments\": [\n                                                    {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"any\"\n                                                    }\n                                                ],\n                                                \"name\": \"Mixin3\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                60\n                                            ]\n                                        }\n                                    ],\n                                    \"signatures\": [\n                                        {\n                                            \"id\": 61,\n                                            \"name\": \"Mixin3\",\n                                            \"variant\": \"signature\",\n                                            \"kind\": 16384,\n                                            \"flags\": {},\n                                            \"parameters\": [\n                                                {\n                                                    \"id\": 62,\n                                                    \"name\": \"input\",\n                                                    \"variant\": \"param\",\n                                                    \"kind\": 32768,\n                                                    \"flags\": {\n                                                        \"isRest\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"any\"\n                                                        }\n                                                    }\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"reference\",\n                                                \"target\": 59,\n                                                \"name\": \"Mixin3\",\n                                                \"package\": \"typedoc\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"type\": \"reference\",\n                                \"target\": 57,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        ]\n                    }\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Classes\",\n            \"children\": [\n                13,\n                64\n            ]\n        },\n        {\n            \"title\": \"Interfaces\",\n            \"children\": [\n                27,\n                43\n            ]\n        },\n        {\n            \"title\": \"Type Aliases\",\n            \"children\": [\n                6,\n                1,\n                11,\n                63\n            ]\n        },\n        {\n            \"title\": \"Functions\",\n            \"children\": [\n                19,\n                35,\n                55\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"0\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"AnyFunction\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"input\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"A\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"AnyConstructor\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"input\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"A\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseProperty\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"19\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Func\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Func\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"base\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"Mixin1Class.prototype\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"input\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Type\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.property1\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.method1\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.method1\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseProperty\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"base\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"Mixin2.prototype\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"input\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2Type\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2.property2\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2.method2\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2.method2\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.property1\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.method1\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.method1\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseProperty\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin3\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin3\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"base\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin3\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"Mixin3.prototype\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin3\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"input\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin3\"\n        },\n        \"64\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"SomeClassWithMixin\"\n        },\n        \"65\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"Mixin1Class.prototype\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"input\"\n        },\n        \"71\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"SomeClassWithMixin.classWithMixinProperty\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"SomeClassWithMixin.classWithMixinMethod\"\n        },\n        \"73\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"SomeClassWithMixin.classWithMixinMethod\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2.property2\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2.method2\"\n        },\n        \"76\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin2.method2\"\n        },\n        \"77\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.property1\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.method1\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Mixin1Class.method1\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseProperty\"\n        },\n        \"83\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        },\n        \"84\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/mixin/mixin.ts\",\n            \"qualifiedName\": \"Base.baseMethod\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/mixin/mixin.ts\"\n        },\n        \"reflections\": {\n            \"1\": 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/react/react.tsx",
    "content": "/** @jsx React.createElement */\ndeclare namespace React {\n    namespace JSX {\n        interface IntrinsicElements {\n            [x: string]: any;\n        }\n    }\n\n    function createElement(): any;\n}\n\nexport interface DemoProps {\n    name: string;\n    age: number;\n}\n\nexport class Demo {\n    private foo: number;\n\n    constructor(props: DemoProps) {\n        this.foo = props.age;\n        this.foo;\n    }\n\n    render() {\n        return <div>Hello world!</div>;\n    }\n}\n"
  },
  {
    "path": "src/test/converter/react/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"react\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 4,\n            \"name\": \"Demo\",\n            \"variant\": \"declaration\",\n            \"kind\": 128,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 5,\n                    \"name\": \"constructor\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 512,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"react.tsx\",\n                            \"line\": 20,\n                            \"character\": 4,\n                            \"url\": \"typedoc://react.tsx#L20\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 6,\n                            \"name\": \"Demo\",\n                            \"variant\": \"signature\",\n                            \"kind\": 16384,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"react.tsx\",\n                                    \"line\": 20,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://react.tsx#L20\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 7,\n                                    \"name\": \"props\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 1,\n                                        \"name\": \"DemoProps\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"reference\",\n                                \"target\": 4,\n                                \"name\": \"Demo\",\n                                \"package\": \"typedoc\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 8,\n                    \"name\": \"foo\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {\n                        \"isPrivate\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"react.tsx\",\n                            \"line\": 18,\n                            \"character\": 12,\n                            \"url\": \"typedoc://react.tsx#L18\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"render\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2048,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"react.tsx\",\n                            \"line\": 25,\n                            \"character\": 4,\n                            \"url\": \"typedoc://react.tsx#L25\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 10,\n                            \"name\": \"render\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"react.tsx\",\n                                    \"line\": 25,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://react.tsx#L25\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"any\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Constructors\",\n                    \"children\": [\n                        5\n                    ]\n                },\n                {\n                    \"title\": \"Properties\",\n                    \"children\": [\n                        8\n                    ]\n                },\n                {\n                    \"title\": \"Methods\",\n                    \"children\": [\n                        9\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"react.tsx\",\n                    \"line\": 17,\n                    \"character\": 13,\n                    \"url\": \"typedoc://react.tsx#L17\"\n                }\n            ]\n        },\n        {\n            \"id\": 1,\n            \"name\": \"DemoProps\",\n            \"variant\": \"declaration\",\n            \"kind\": 256,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 3,\n                    \"name\": \"age\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"react.tsx\",\n                            \"line\": 14,\n                            \"character\": 4,\n                            \"url\": \"typedoc://react.tsx#L14\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"name\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 1024,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"react.tsx\",\n                            \"line\": 13,\n                            \"character\": 4,\n                            \"url\": \"typedoc://react.tsx#L13\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Properties\",\n                    \"children\": [\n                        3,\n                        2\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"react.tsx\",\n                    \"line\": 12,\n                    \"character\": 17,\n                    \"url\": \"typedoc://react.tsx#L12\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Classes\",\n            \"children\": [\n                4\n            ]\n        },\n        {\n            \"title\": \"Interfaces\",\n            \"children\": [\n                1\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"0\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"\"\n        },\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"DemoProps\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"DemoProps.name\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"DemoProps.age\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"Demo\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"Demo.__constructor\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"Demo\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"props\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"Demo.foo\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"Demo.render\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/react/react.tsx\",\n            \"qualifiedName\": \"Demo.render\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/react/react.tsx\"\n        },\n        \"reflections\": {\n            \"1\": 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"ESNext\",\n        \"module\": \"CommonJS\",\n        \"jsx\": \"react\",\n        \"experimentalDecorators\": true,\n        \"resolveJsonModule\": true,\n        \"rootDir\": \".\",\n        \"strictNullChecks\": true,\n        \"allowJs\": true,\n        \"noEmit\": true,\n        \"outDir\": \"dist\",\n\n        // See #1524. We might force this to false eventually.\n        \"skipLibCheck\": true\n    },\n    \"include\": [\".\"]\n}\n"
  },
  {
    "path": "src/test/converter/types/general.ts",
    "content": "declare function makeValue<T>(): T;\n\nexport type BigIntLiteral = 1n;\nexport const BigIntLiteralType = makeValue<1n>();\n\nexport type NegativeBigIntLiteral = -1n;\nexport const NegativeBigIntLiteralType = makeValue<-1n>();\n\nexport type NumArray = number[];\nexport const numArray = makeValue<number[]>();\n\nexport type BigIntAlias = bigint;\n\nexport type NegativeOne = -1;\nexport const negativeOne = -1;\n\nexport type FirstIfString<T extends unknown[]> = T extends [\n    infer S extends string,\n    ...unknown[],\n] ? S :\n    never;\n"
  },
  {
    "path": "src/test/converter/types/index-signature.ts",
    "content": "export interface SymbolIndex {\n    [sym: symbol]: unknown;\n}\n\nexport interface PartialIndex {\n    [optName: `data-${string}`]: unknown;\n}\n\nexport interface UnionIndex {\n    [optName: string | symbol]: unknown;\n    [numName: number]: string;\n}\n\nexport interface ReadonlyIndex {\n    readonly [x: string]: string;\n}\n\ndeclare const symbolMethodName: symbol;\ndeclare const symbolPropertyName: symbol;\n\nexport class A {\n    [symbolMethodName]() {\n        return 1;\n    }\n    [symbolPropertyName]() {\n        return \"x\";\n    }\n}\n"
  },
  {
    "path": "src/test/converter/types/mapped.ts",
    "content": "export function mapped<T>(arg: T) {\n    return {} as { -readonly [K in keyof T]?: string };\n}\n\nexport type Mappy<T> = { [K in keyof T]: T[K] };\n\nexport type DoubleKey<T> = { [K in keyof T & string as `${K}${K}`]: T[K] };\n\nexport function doubleKey<T>(arg: T) {\n    return {} as { [K in keyof T & string as `${K}${K}`]: T[K] };\n}\n"
  },
  {
    "path": "src/test/converter/types/parens.ts",
    "content": "// Extraneous parenthesis are intentional to test the parens converter.\n// dprint-ignore\nexport type ZZ = (1 & { a: string });\n"
  },
  {
    "path": "src/test/converter/types/query.ts",
    "content": "export const x = 1;\n\nexport type TypeOfX = typeof x;\n"
  },
  {
    "path": "src/test/converter/types/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"types\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"general\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 8,\n                    \"name\": \"BigIntAlias\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 12,\n                            \"character\": 12,\n                            \"url\": \"typedoc://general.ts#L12\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"bigint\"\n                    }\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"BigIntLiteral\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 3,\n                            \"character\": 12,\n                            \"url\": \"typedoc://general.ts#L3\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": {\n                            \"value\": \"1\",\n                            \"negative\": false\n                        }\n                    }\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"FirstIfString\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 17,\n                            \"character\": 12,\n                            \"url\": \"typedoc://general.ts#L17\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 12,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {},\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"unknown\"\n                                }\n                            }\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"conditional\",\n                        \"checkType\": {\n                            \"type\": \"reference\",\n                            \"target\": 12,\n                            \"name\": \"T\",\n                            \"package\": \"typedoc\",\n                            \"refersToTypeParameter\": true\n                        },\n                        \"extendsType\": {\n                            \"type\": \"tuple\",\n                            \"elements\": [\n                                {\n                                    \"type\": \"inferred\",\n                                    \"name\": \"S\",\n                                    \"constraint\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                },\n                                {\n                                    \"type\": \"rest\",\n                                    \"elementType\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"unknown\"\n                                        }\n                                    }\n                                }\n                            ]\n                        },\n                        \"trueType\": {\n                            \"type\": \"reference\",\n                            \"target\": {\n                                \"packageName\": \"typedoc\",\n                                \"packagePath\": \"src/test/converter/types/general.ts\",\n                                \"qualifiedName\": \"S\"\n                            },\n                            \"name\": \"S\",\n                            \"package\": \"typedoc\",\n                            \"refersToTypeParameter\": true\n                        },\n                        \"falseType\": {\n                            \"type\": \"intrinsic\",\n                            \"name\": \"never\"\n                        }\n                    }\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"NegativeBigIntLiteral\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 6,\n                            \"character\": 12,\n                            \"url\": \"typedoc://general.ts#L6\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": {\n                            \"value\": \"1\",\n                            \"negative\": true\n                        }\n                    }\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"NegativeOne\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 14,\n                            \"character\": 12,\n                            \"url\": \"typedoc://general.ts#L14\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": -1\n                    }\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"NumArray\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 9,\n                            \"character\": 12,\n                            \"url\": \"typedoc://general.ts#L9\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"array\",\n                        \"elementType\": {\n                            \"type\": \"intrinsic\",\n                            \"name\": \"number\"\n                        }\n                    }\n                },\n                {\n                    \"id\": 3,\n                    \"name\": \"BigIntLiteralType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 4,\n                            \"character\": 13,\n                            \"url\": \"typedoc://general.ts#L4\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": {\n                            \"value\": \"1\",\n                            \"negative\": false\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 5,\n                    \"name\": \"NegativeBigIntLiteralType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 7,\n                            \"character\": 13,\n                            \"url\": \"typedoc://general.ts#L7\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": {\n                            \"value\": \"1\",\n                            \"negative\": true\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"negativeOne\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 15,\n                            \"character\": 13,\n                            \"url\": \"typedoc://general.ts#L15\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": -1\n                    },\n                    \"defaultValue\": \"-1\"\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"numArray\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"general.ts\",\n                            \"line\": 10,\n                            \"character\": 13,\n                            \"url\": \"typedoc://general.ts#L10\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"array\",\n                        \"elementType\": {\n                            \"type\": \"intrinsic\",\n                            \"name\": \"number\"\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        8,\n                        2,\n                        11,\n                        4,\n                        9,\n                        6\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        3,\n                        5,\n                        10,\n                        7\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"general.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://general.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 13,\n            \"name\": \"index-signature\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 28,\n                    \"name\": \"A\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 29,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 30,\n                                    \"name\": \"A\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 28,\n                                        \"name\": \"A\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                29\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 21,\n                            \"character\": 13,\n                            \"url\": \"typedoc://index-signature.ts#L21\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 31,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"parameters\": [\n                                {\n                                    \"id\": 32,\n                                    \"name\": \"key\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"symbol\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"union\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 33,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 34,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"number\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 35,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 36,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 17,\n                    \"name\": \"PartialIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 5,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L5\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 18,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 6,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L6\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 19,\n                                    \"name\": \"optName\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"templateLiteral\",\n                                        \"head\": \"data-\",\n                                        \"tail\": [\n                                            [\n                                                {\n                                                    \"type\": \"intrinsic\",\n                                                    \"name\": \"string\"\n                                                },\n                                                \"\"\n                                            ]\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"unknown\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 25,\n                    \"name\": \"ReadonlyIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 14,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L14\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 26,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {\n                                \"isReadonly\": true\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 15,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L15\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 27,\n                                    \"name\": \"x\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 14,\n                    \"name\": \"SymbolIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 1,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L1\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 15,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 2,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L2\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 16,\n                                    \"name\": \"sym\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"symbol\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"unknown\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 20,\n                    \"name\": \"UnionIndex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"index-signature.ts\",\n                            \"line\": 9,\n                            \"character\": 17,\n                            \"url\": \"typedoc://index-signature.ts#L9\"\n                        }\n                    ],\n                    \"indexSignatures\": [\n                        {\n                            \"id\": 21,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 10,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L10\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 22,\n                                    \"name\": \"optName\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"union\",\n                                        \"types\": [\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            },\n                                            {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"symbol\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"unknown\"\n                            }\n                        },\n                        {\n                            \"id\": 23,\n                            \"name\": \"__index\",\n                            \"variant\": \"signature\",\n                            \"kind\": 8192,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"index-signature.ts\",\n                                    \"line\": 11,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://index-signature.ts#L11\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 24,\n                                    \"name\": \"numName\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        28\n                    ]\n                },\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        17,\n                        25,\n                        14,\n                        20\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"index-signature.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://index-signature.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 37,\n            \"name\": \"mapped\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 48,\n                    \"name\": \"DoubleKey\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mapped.ts\",\n                            \"line\": 7,\n                            \"character\": 12,\n                            \"url\": \"typedoc://mapped.ts#L7\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 49,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {}\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"mapped\",\n                        \"parameter\": \"K\",\n                        \"parameterType\": {\n                            \"type\": \"intersection\",\n                            \"types\": [\n                                {\n                                    \"type\": \"typeOperator\",\n                                    \"operator\": \"keyof\",\n                                    \"target\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 49,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                },\n                                {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            ]\n                        },\n                        \"templateType\": {\n                            \"type\": \"indexedAccess\",\n                            \"indexType\": {\n                                \"type\": \"reference\",\n                                \"target\": {\n                                    \"packageName\": \"typedoc\",\n                                    \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                    \"qualifiedName\": \"K\"\n                                },\n                                \"name\": \"K\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            },\n                            \"objectType\": {\n                                \"type\": \"reference\",\n                                \"target\": 49,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        },\n                        \"nameType\": {\n                            \"type\": \"templateLiteral\",\n                            \"head\": \"\",\n                            \"tail\": [\n                                [\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typedoc\",\n                                            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                            \"qualifiedName\": \"K\"\n                                        },\n                                        \"name\": \"K\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    },\n                                    \"\"\n                                ],\n                                [\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typedoc\",\n                                            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                            \"qualifiedName\": \"K\"\n                                        },\n                                        \"name\": \"K\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    },\n                                    \"\"\n                                ]\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"id\": 46,\n                    \"name\": \"Mappy\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mapped.ts\",\n                            \"line\": 5,\n                            \"character\": 12,\n                            \"url\": \"typedoc://mapped.ts#L5\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 47,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {}\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"mapped\",\n                        \"parameter\": \"K\",\n                        \"parameterType\": {\n                            \"type\": \"typeOperator\",\n                            \"operator\": \"keyof\",\n                            \"target\": {\n                                \"type\": \"reference\",\n                                \"target\": 47,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        },\n                        \"templateType\": {\n                            \"type\": \"indexedAccess\",\n                            \"indexType\": {\n                                \"type\": \"reference\",\n                                \"target\": {\n                                    \"packageName\": \"typedoc\",\n                                    \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                    \"qualifiedName\": \"K\"\n                                },\n                                \"name\": \"K\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            },\n                            \"objectType\": {\n                                \"type\": \"reference\",\n                                \"target\": 47,\n                                \"name\": \"T\",\n                                \"package\": \"typedoc\",\n                                \"refersToTypeParameter\": true\n                            }\n                        }\n                    }\n                },\n                {\n                    \"id\": 42,\n                    \"name\": \"doubleKey\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mapped.ts\",\n                            \"line\": 9,\n                            \"character\": 16,\n                            \"url\": \"typedoc://mapped.ts#L9\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 43,\n                            \"name\": \"doubleKey\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mapped.ts\",\n                                    \"line\": 9,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://mapped.ts#L9\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 44,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 45,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 44,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"mapped\",\n                                \"parameter\": \"K\",\n                                \"parameterType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                },\n                                \"templateType\": {\n                                    \"type\": \"indexedAccess\",\n                                    \"indexType\": {\n                                        \"type\": \"reference\",\n                                        \"target\": {\n                                            \"packageName\": \"typedoc\",\n                                            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                            \"qualifiedName\": \"K\"\n                                        },\n                                        \"name\": \"K\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    },\n                                    \"objectType\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 44,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                },\n                                \"nameType\": {\n                                    \"type\": \"templateLiteral\",\n                                    \"head\": \"\",\n                                    \"tail\": [\n                                        [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": {\n                                                    \"packageName\": \"typedoc\",\n                                                    \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                                    \"qualifiedName\": \"K\"\n                                                },\n                                                \"name\": \"K\",\n                                                \"package\": \"typedoc\",\n                                                \"refersToTypeParameter\": true\n                                            },\n                                            \"\"\n                                        ],\n                                        [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": {\n                                                    \"packageName\": \"typedoc\",\n                                                    \"packagePath\": \"src/test/converter/types/mapped.ts\",\n                                                    \"qualifiedName\": \"K\"\n                                                },\n                                                \"name\": \"K\",\n                                                \"package\": \"typedoc\",\n                                                \"refersToTypeParameter\": true\n                                            },\n                                            \"\"\n                                        ]\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"mapped\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"mapped.ts\",\n                            \"line\": 1,\n                            \"character\": 16,\n                            \"url\": \"typedoc://mapped.ts#L1\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 39,\n                            \"name\": \"mapped\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"mapped.ts\",\n                                    \"line\": 1,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://mapped.ts#L1\"\n                                }\n                            ],\n                            \"typeParameters\": [\n                                {\n                                    \"id\": 40,\n                                    \"name\": \"T\",\n                                    \"variant\": \"typeParam\",\n                                    \"kind\": 131072,\n                                    \"flags\": {}\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"arg\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 40,\n                                        \"name\": \"T\",\n                                        \"package\": \"typedoc\",\n                                        \"refersToTypeParameter\": true\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"mapped\",\n                                \"parameter\": \"K\",\n                                \"parameterType\": {\n                                    \"type\": \"union\",\n                                    \"types\": [\n                                        {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        },\n                                        {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"number\"\n                                        },\n                                        {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"symbol\"\n                                        }\n                                    ]\n                                },\n                                \"templateType\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                },\n                                \"readonlyModifier\": \"-\",\n                                \"optionalModifier\": \"+\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        48,\n                        46\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        42,\n                        38\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"mapped.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://mapped.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 50,\n            \"name\": \"parens\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 51,\n                    \"name\": \"ZZ\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"parens.ts\",\n                            \"line\": 3,\n                            \"character\": 12,\n                            \"url\": \"typedoc://parens.ts#L3\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intersection\",\n                        \"types\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            {\n                                \"type\": \"reflection\",\n                                \"declaration\": {\n                                    \"id\": 52,\n                                    \"name\": \"__type\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 65536,\n                                    \"flags\": {},\n                                    \"children\": [\n                                        {\n                                            \"id\": 53,\n                                            \"name\": \"a\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 1024,\n                                            \"flags\": {},\n                                            \"sources\": [\n                                                {\n                                                    \"fileName\": \"parens.ts\",\n                                                    \"line\": 3,\n                                                    \"character\": 24,\n                                                    \"url\": \"typedoc://parens.ts#L3\"\n                                                }\n                                            ],\n                                            \"type\": {\n                                                \"type\": \"intrinsic\",\n                                                \"name\": \"string\"\n                                            }\n                                        }\n                                    ],\n                                    \"groups\": [\n                                        {\n                                            \"title\": \"Properties\",\n                                            \"children\": [\n                                                53\n                                            ]\n                                        }\n                                    ]\n                                }\n                            }\n                        ]\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        51\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"parens.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://parens.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 54,\n            \"name\": \"query\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 56,\n                    \"name\": \"TypeOfX\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"query.ts\",\n                            \"line\": 3,\n                            \"character\": 12,\n                            \"url\": \"typedoc://query.ts#L3\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"query\",\n                        \"queryType\": {\n                            \"type\": \"reference\",\n                            \"target\": 55,\n                            \"name\": \"x\",\n                            \"package\": \"typedoc\"\n                        }\n                    }\n                },\n                {\n                    \"id\": 55,\n                    \"name\": \"x\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"query.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://query.ts#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 1\n                    },\n                    \"defaultValue\": \"1\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        56\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        55\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"query.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://query.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 57,\n            \"name\": \"tuple\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 68,\n                    \"name\": \"Empty\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 18,\n                            \"character\": 12,\n                            \"url\": \"typedoc://tuple.ts#L18\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\"\n                    }\n                },\n                {\n                    \"id\": 66,\n                    \"name\": \"LeadingRest\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 14,\n                            \"character\": 12,\n                            \"url\": \"typedoc://tuple.ts#L14\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"rest\",\n                                \"elementType\": {\n                                    \"type\": \"array\",\n                                    \"elementType\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            },\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 58,\n                    \"name\": \"NamedTuple\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 1,\n                            \"character\": 12,\n                            \"url\": \"typedoc://tuple.ts#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"name\",\n                                \"isOptional\": false,\n                                \"element\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            },\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"optionalName\",\n                                \"isOptional\": true,\n                                \"element\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"number\"\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 64,\n                    \"name\": \"WithOptionalElements\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 11,\n                            \"character\": 12,\n                            \"url\": \"typedoc://tuple.ts#L11\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            {\n                                \"type\": \"optional\",\n                                \"elementType\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 2\n                                }\n                            },\n                            {\n                                \"type\": \"optional\",\n                                \"elementType\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 3\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 60,\n                    \"name\": \"WithRestType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 5,\n                            \"character\": 12,\n                            \"url\": \"typedoc://tuple.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            {\n                                \"type\": \"rest\",\n                                \"elementType\": {\n                                    \"type\": \"array\",\n                                    \"elementType\": {\n                                        \"type\": \"literal\",\n                                        \"value\": 2\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 62,\n                    \"name\": \"WithRestTypeNames\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 8,\n                            \"character\": 12,\n                            \"url\": \"typedoc://tuple.ts#L8\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"a\",\n                                \"isOptional\": false,\n                                \"element\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 123\n                                }\n                            },\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"b\",\n                                \"isOptional\": false,\n                                \"element\": {\n                                    \"type\": \"array\",\n                                    \"elementType\": {\n                                        \"type\": \"literal\",\n                                        \"value\": 456\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 67,\n                    \"name\": \"leadingRest\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 16,\n                            \"character\": 13,\n                            \"url\": \"typedoc://tuple.ts#L16\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"rest\",\n                                \"elementType\": {\n                                    \"type\": \"array\",\n                                    \"elementType\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            },\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ]\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 59,\n                    \"name\": \"namedTuple\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 3,\n                            \"character\": 13,\n                            \"url\": \"typedoc://tuple.ts#L3\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"name\",\n                                \"isOptional\": false,\n                                \"element\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"string\"\n                                }\n                            },\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"optionalName\",\n                                \"isOptional\": true,\n                                \"element\": {\n                                    \"type\": \"intrinsic\",\n                                    \"name\": \"number\"\n                                }\n                            }\n                        ]\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 65,\n                    \"name\": \"withOptionalElements\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 12,\n                            \"character\": 13,\n                            \"url\": \"typedoc://tuple.ts#L12\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            {\n                                \"type\": \"optional\",\n                                \"elementType\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 2\n                                }\n                            },\n                            {\n                                \"type\": \"optional\",\n                                \"elementType\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 3\n                                }\n                            }\n                        ]\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 61,\n                    \"name\": \"withRestType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 6,\n                            \"character\": 13,\n                            \"url\": \"typedoc://tuple.ts#L6\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 1\n                            },\n                            {\n                                \"type\": \"rest\",\n                                \"elementType\": {\n                                    \"type\": \"array\",\n                                    \"elementType\": {\n                                        \"type\": \"literal\",\n                                        \"value\": 2\n                                    }\n                                }\n                            }\n                        ]\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 63,\n                    \"name\": \"withRestTypeNames\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"tuple.ts\",\n                            \"line\": 9,\n                            \"character\": 13,\n                            \"url\": \"typedoc://tuple.ts#L9\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"namedTupleMember\",\n                                \"name\": \"a\",\n                                \"isOptional\": false,\n                                \"element\": {\n                                    \"type\": \"literal\",\n                                    \"value\": 123\n                                }\n                            },\n                            {\n                                \"type\": \"rest\",\n                                \"elementType\": {\n                                    \"type\": \"namedTupleMember\",\n                                    \"name\": \"b\",\n                                    \"isOptional\": false,\n                                    \"element\": {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"literal\",\n                                            \"value\": 456\n                                        }\n                                    }\n                                }\n                            }\n                        ]\n                    },\n                    \"defaultValue\": \"...\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        68,\n                        66,\n                        58,\n                        64,\n                        60,\n                        62\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        67,\n                        59,\n                        65,\n                        61,\n                        63\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"tuple.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://tuple.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 69,\n            \"name\": \"type-operator\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 71,\n                    \"name\": \"B\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 2,\n                            \"character\": 12,\n                            \"url\": \"typedoc://type-operator.ts#L2\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"typeOperator\",\n                        \"operator\": \"readonly\",\n                        \"target\": {\n                            \"type\": \"array\",\n                            \"elementType\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"id\": 72,\n                    \"name\": \"C\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"children\": [\n                        {\n                            \"id\": 74,\n                            \"name\": \"prop1\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 4,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L4\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        },\n                        {\n                            \"id\": 75,\n                            \"name\": \"prop2\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"type-operator.ts\",\n                                    \"line\": 5,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://type-operator.ts#L5\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                74,\n                                75\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 3,\n                            \"character\": 12,\n                            \"url\": \"typedoc://type-operator.ts#L3\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 76,\n                    \"name\": \"D\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 2097152,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 7,\n                            \"character\": 12,\n                            \"url\": \"typedoc://type-operator.ts#L7\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"typeOperator\",\n                        \"operator\": \"keyof\",\n                        \"target\": {\n                            \"type\": \"reference\",\n                            \"target\": 72,\n                            \"name\": \"C\",\n                            \"package\": \"typedoc\"\n                        }\n                    }\n                },\n                {\n                    \"id\": 70,\n                    \"name\": \"a\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"type-operator.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://type-operator.ts#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"typeOperator\",\n                        \"operator\": \"unique\",\n                        \"target\": {\n                            \"type\": \"intrinsic\",\n                            \"name\": \"symbol\"\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Type Aliases\",\n                    \"children\": [\n                        71,\n                        72,\n                        76\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        70\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"type-operator.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://type-operator.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 77,\n            \"name\": \"union-or-intersection\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 78,\n                    \"name\": \"FirstType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"First type for union or intersection type tests.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 79,\n                            \"name\": \"firstProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Property of first type.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"union-or-intersection.ts\",\n                                    \"line\": 8,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://union-or-intersection.ts#L8\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                79\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"union-or-intersection.ts\",\n                            \"line\": 4,\n                            \"character\": 17,\n                            \"url\": \"typedoc://union-or-intersection.ts#L4\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 80,\n                    \"name\": \"SecondType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Second type for union or intersection type tests.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 81,\n                            \"name\": \"secondProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Property of second type.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"union-or-intersection.ts\",\n                                    \"line\": 18,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://union-or-intersection.ts#L18\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                81\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"union-or-intersection.ts\",\n                            \"line\": 14,\n                            \"character\": 17,\n                            \"url\": \"typedoc://union-or-intersection.ts#L14\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 82,\n                    \"name\": \"ThirdType\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 256,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Third type for union or intersection type tests.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 85,\n                            \"name\": \"thirdComplexProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Complex Property of third type.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"union-or-intersection.ts\",\n                                    \"line\": 38,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://union-or-intersection.ts#L38\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"array\",\n                                \"elementType\": {\n                                    \"type\": \"union\",\n                                    \"types\": [\n                                        {\n                                            \"type\": \"intrinsic\",\n                                            \"name\": \"string\"\n                                        },\n                                        {\n                                            \"type\": \"array\",\n                                            \"elementType\": {\n                                                \"type\": \"intersection\",\n                                                \"types\": [\n                                                    {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 78,\n                                                        \"name\": \"FirstType\",\n                                                        \"package\": \"typedoc\"\n                                                    },\n                                                    {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 80,\n                                                        \"name\": \"SecondType\",\n                                                        \"package\": \"typedoc\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"id\": 84,\n                            \"name\": \"thirdIntersectionProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Intersection Property of third type.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"union-or-intersection.ts\",\n                                    \"line\": 33,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://union-or-intersection.ts#L33\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intersection\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": 78,\n                                        \"name\": \"FirstType\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": 82,\n                                        \"name\": \"ThirdType\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"id\": 83,\n                            \"name\": \"thirdUnionProperty\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 1024,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Union Property of third type.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"union-or-intersection.ts\",\n                                    \"line\": 28,\n                                    \"character\": 4,\n                                    \"url\": \"typedoc://union-or-intersection.ts#L28\"\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"union\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": 78,\n                                        \"name\": \"FirstType\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    {\n                                        \"type\": \"reference\",\n                                        \"target\": 80,\n                                        \"name\": \"SecondType\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Properties\",\n                            \"children\": [\n                                85,\n                                84,\n                                83\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"union-or-intersection.ts\",\n                            \"line\": 24,\n                            \"character\": 17,\n                            \"url\": \"typedoc://union-or-intersection.ts#L24\"\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Interfaces\",\n                    \"children\": [\n                        78,\n                        80,\n                        82\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"union-or-intersection.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://union-or-intersection.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                13,\n                37,\n                50,\n                54,\n                57,\n                69,\n                77\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"BigIntLiteral\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"BigIntLiteralType\"\n        },\n        \"4\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"NegativeBigIntLiteral\"\n        },\n        \"5\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"NegativeBigIntLiteralType\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"NumArray\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"numArray\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"BigIntAlias\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"NegativeOne\"\n        },\n        \"10\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"negativeOne\"\n        },\n        \"11\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"FirstIfString\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/general.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"13\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"14\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"SymbolIndex\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"SymbolIndex.__index\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"PartialIndex\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"PartialIndex.__index\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"UnionIndex\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"UnionIndex.__index\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"UnionIndex.__index\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"ReadonlyIndex\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"ReadonlyIndex.__index\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"A\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"A.__computed\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"A.__computed\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"A.__computed\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/index-signature.ts\",\n            \"qualifiedName\": \"A.__computed\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"mapped\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"mapped\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"doubleKey\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"doubleKey\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"arg\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"Mappy\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"DoubleKey\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/mapped.ts\",\n            \"qualifiedName\": \"T\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/parens.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/parens.ts\",\n            \"qualifiedName\": \"ZZ\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/parens.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/parens.ts\",\n            \"qualifiedName\": \"__type.a\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/query.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/query.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/query.ts\",\n            \"qualifiedName\": \"TypeOfX\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"NamedTuple\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"namedTuple\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"WithRestType\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"withRestType\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"WithRestTypeNames\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"withRestTypeNames\"\n        },\n        \"64\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"WithOptionalElements\"\n        },\n        \"65\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"withOptionalElements\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"LeadingRest\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"leadingRest\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/tuple.ts\",\n            \"qualifiedName\": \"Empty\"\n        },\n        \"69\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"70\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"a\"\n        },\n        \"71\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"B\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"C\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"__type.prop1\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"__type.prop2\"\n        },\n        \"76\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/type-operator.ts\",\n            \"qualifiedName\": \"D\"\n        },\n        \"77\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"FirstType\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"FirstType.firstProperty\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"SecondType\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"SecondType.secondProperty\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"ThirdType\"\n        },\n        \"83\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"ThirdType.thirdUnionProperty\"\n        },\n        \"84\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"ThirdType.thirdIntersectionProperty\"\n        },\n        \"85\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/types/union-or-intersection.ts\",\n            \"qualifiedName\": \"ThirdType.thirdComplexProperty\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/types/general.ts\",\n            \"2\": \"src/test/converter/types/index-signature.ts\",\n            \"3\": \"src/test/converter/types/mapped.ts\",\n            \"4\": \"src/test/converter/types/parens.ts\",\n            \"5\": \"src/test/converter/types/query.ts\",\n            \"6\": \"src/test/converter/types/tuple.ts\",\n            \"7\": \"src/test/converter/types/type-operator.ts\",\n            \"8\": \"src/test/converter/types/union-or-intersection.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 13,\n            \"3\": 37,\n            \"4\": 50,\n            \"5\": 54,\n            \"6\": 57,\n            \"7\": 69,\n            \"8\": 77\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/types/tuple.ts",
    "content": "export type NamedTuple = [name: string, optionalName?: number];\n\nexport const namedTuple = returnMapped<NamedTuple>();\n\nexport type WithRestType = [1, ...2[]];\nexport const withRestType = returnMapped<WithRestType>();\n\nexport type WithRestTypeNames = [a: 123, ...b: 456[]];\nexport const withRestTypeNames = returnMapped<WithRestTypeNames>();\n\nexport type WithOptionalElements = [1, 2?, 3?];\nexport const withOptionalElements = returnMapped<WithOptionalElements>();\n\nexport type LeadingRest = [...string[], number];\n// returnMapped isn't good enough here.\nexport const leadingRest = {} as any as [...string[], number];\n\nexport type Empty = [];\n\n// Helper to force TS to give us types, rather than type nodes, for a given declaration.\nfunction returnMapped<T>() {\n    return {} as any as { [K in keyof T]: T[K] };\n}\n"
  },
  {
    "path": "src/test/converter/types/type-operator.ts",
    "content": "export const a: unique symbol = Symbol();\nexport type B = readonly number[];\nexport type C = {\n    prop1: string;\n    prop2: number;\n};\nexport type D = keyof C;\n"
  },
  {
    "path": "src/test/converter/types/union-or-intersection.ts",
    "content": "/**\n * First type for union or intersection type tests.\n */\nexport interface FirstType {\n    /**\n     * Property of first type.\n     */\n    firstProperty: string;\n}\n\n/**\n * Second type for union or intersection type tests.\n */\nexport interface SecondType {\n    /**\n     * Property of second type.\n     */\n    secondProperty: number;\n}\n\n/**\n * Third type for union or intersection type tests.\n */\nexport interface ThirdType {\n    /**\n     * Union Property of third type.\n     */\n    thirdUnionProperty: FirstType | SecondType;\n\n    /**\n     * Intersection Property of third type.\n     */\n    thirdIntersectionProperty: FirstType & ThirdType;\n\n    /**\n     * Complex Property of third type.\n     */\n    thirdComplexProperty: ((FirstType & SecondType)[] | string)[];\n}\n"
  },
  {
    "path": "src/test/converter/variables/array.ts",
    "content": "/**\n * A custom array class.\n */\nexport class Array<T> {}\n\n/**\n * A const of a complex type.\n */\nexport const complex: ((Array<string>[] | number[])[] | string)[][] = [];\n\n/**\n * An exported const of the custom array type.\n */\nexport const custom: Array<number> = {};\n\n/**\n * Class array class item\n */\nexport class Foo {}\n\n/**\n * Custom list class\n */\nexport class FooList extends Array<Foo> {}\n"
  },
  {
    "path": "src/test/converter/variables/destructuring.ts",
    "content": "/**\n * Destructuring objects.\n */\nexport const { destructObjectA, destructObjectB, destructObjectC } = {\n    destructObjectA: 0,\n    destructObjectB: \"string\",\n    destructObjectC: 0,\n};\n\n/**\n * Destructuring arrays.\n */\nexport const [destructArrayA, destructArrayB, destructArrayC = 10] = [\n    0,\n    \"string\",\n    0,\n];\n\n/**\n * Array Destructuring with rest\n */\nexport const [\n    destructArrayWithRestA,\n    destructArrayWithRestB,\n    ...destructArrayWithRest\n] = [1, 2, 3, 4];\n\n/**\n * Array Destructuring with ignores\n */\nexport const [destructArrayWithIgnoresA, , ...destructArrayWithIgnoresRest] = [\n    1,\n    2,\n    3,\n    4,\n];\n\n/**\n * Destructuring function parameters.\n */\nexport function drawText({\n    text = \"\",\n    location: [x, y] = [0, 0],\n    bold = false,\n}) {}\n"
  },
  {
    "path": "src/test/converter/variables/literal.ts",
    "content": "const x = \"literal\";\n/**\n * An object literal.\n */\nconst objectLiteral = {\n    valueZ: \"foo\",\n    valueY: function () {\n        return \"foo\";\n    },\n    valueX: {\n        valueZ: \"foo\",\n        valueY: (z: string) => {\n            return { a: \"test\", b: z };\n        },\n        valueA: [100, 200, 300],\n    },\n    valueA: 100,\n    valueB: true,\n    [Symbol.toStringTag]: \"computed\",\n    [x]: true,\n    [\"literal2\"]: true,\n};\n\n/**\n * A typed literal without an initializer.\n */\nexport let typeLiteral: {\n    valueZ: string;\n    valueY: { (): string };\n    valueX: {\n        valueZ: string;\n        valueY: { (z: string): { a: string; b: string } };\n        valueA: number[];\n    };\n    valueA?: number;\n    valueB?: boolean;\n};\n\nlet onSuccess: any = function () {};\nlet onError: any = function () {};\nlet onFinally: any = function () {};\n\nexport const callbackReturn = {\n    success: (successCallback: () => any) => {\n        onSuccess = successCallback;\n        return callbackReturn;\n    },\n    error: (errorCallback: () => any) => {\n        onError = errorCallback;\n        return callbackReturn;\n    },\n    finally: (finallyCallback: () => any) => {\n        onFinally = finallyCallback;\n        return callbackReturn;\n    },\n};\n\nexport { objectLiteral };\n"
  },
  {
    "path": "src/test/converter/variables/specs.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"variables\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"array\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"Array\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A custom array class.\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 4,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 5,\n                                    \"name\": \"Array\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"typeParameters\": [\n                                        {\n                                            \"id\": 6,\n                                            \"name\": \"T\",\n                                            \"variant\": \"typeParam\",\n                                            \"kind\": 131072,\n                                            \"flags\": {}\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 2,\n                                        \"typeArguments\": [\n                                            {\n                                                \"type\": \"reference\",\n                                                \"target\": 3,\n                                                \"name\": \"T\",\n                                                \"package\": \"typedoc\",\n                                                \"qualifiedName\": \"Array.T\",\n                                                \"refersToTypeParameter\": true\n                                            }\n                                        ],\n                                        \"name\": \"Array\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                4\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 4,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L4\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {}\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 12,\n                            \"name\": \"FooList\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"Foo\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Class array class item\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 10,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 11,\n                                    \"name\": \"Foo\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 9,\n                                        \"name\": \"Foo\",\n                                        \"package\": \"typedoc\"\n                                    }\n                                }\n                            ]\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                10\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 19,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L19\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 12,\n                    \"name\": \"FooList\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Custom list class\"\n                            }\n                        ]\n                    },\n                    \"children\": [\n                        {\n                            \"id\": 13,\n                            \"name\": \"constructor\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 512,\n                            \"flags\": {},\n                            \"signatures\": [\n                                {\n                                    \"id\": 14,\n                                    \"name\": \"FooList\",\n                                    \"variant\": \"signature\",\n                                    \"kind\": 16384,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 12,\n                                        \"name\": \"FooList\",\n                                        \"package\": \"typedoc\"\n                                    },\n                                    \"inheritedFrom\": {\n                                        \"type\": \"reference\",\n                                        \"target\": 5,\n                                        \"name\": \"Array.constructor\"\n                                    }\n                                }\n                            ],\n                            \"inheritedFrom\": {\n                                \"type\": \"reference\",\n                                \"target\": 4,\n                                \"name\": \"Array.constructor\"\n                            }\n                        }\n                    ],\n                    \"groups\": [\n                        {\n                            \"title\": \"Constructors\",\n                            \"children\": [\n                                13\n                            ]\n                        }\n                    ],\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 24,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L24\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 2,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"reference\",\n                                    \"target\": 9,\n                                    \"name\": \"Foo\",\n                                    \"package\": \"typedoc\"\n                                }\n                            ],\n                            \"name\": \"Array\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"complex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A const of a complex type.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 9,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L9\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"array\",\n                        \"elementType\": {\n                            \"type\": \"array\",\n                            \"elementType\": {\n                                \"type\": \"union\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"union\",\n                                            \"types\": [\n                                                {\n                                                    \"type\": \"array\",\n                                                    \"elementType\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 2,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"string\"\n                                                            }\n                                                        ],\n                                                        \"name\": \"Array\",\n                                                        \"package\": \"typedoc\"\n                                                    }\n                                                },\n                                                {\n                                                    \"type\": \"array\",\n                                                    \"elementType\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"number\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    \"defaultValue\": \"[]\"\n                },\n                {\n                    \"id\": 8,\n                    \"name\": \"custom\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An exported const of the custom array type.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 14,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L14\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": 2,\n                        \"typeArguments\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ],\n                        \"name\": \"Array\",\n                        \"package\": \"typedoc\"\n                    },\n                    \"defaultValue\": \"{}\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        2,\n                        9,\n                        12\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        7,\n                        8\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"array.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://array.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 15,\n            \"name\": \"destructuring\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"destructArrayA\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 13,\n                            \"character\": 14,\n                            \"url\": \"typedoc://destructuring.ts#L13\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"destructArrayB\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 13,\n                            \"character\": 30,\n                            \"url\": \"typedoc://destructuring.ts#L13\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"destructArrayC\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 13,\n                            \"character\": 46,\n                            \"url\": \"typedoc://destructuring.ts#L13\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"union\",\n                        \"types\": [\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 0\n                            },\n                            {\n                                \"type\": \"literal\",\n                                \"value\": 10\n                            }\n                        ]\n                    },\n                    \"defaultValue\": \"10\"\n                },\n                {\n                    \"id\": 32,\n                    \"name\": \"destructArrayWithIgnoresA\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 31,\n                            \"character\": 14,\n                            \"url\": \"typedoc://destructuring.ts#L31\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 33,\n                    \"name\": \"destructArrayWithIgnoresRest\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 31,\n                            \"character\": 46,\n                            \"url\": \"typedoc://destructuring.ts#L31\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 31,\n                    \"name\": \"destructArrayWithRest\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 25,\n                            \"character\": 7,\n                            \"url\": \"typedoc://destructuring.ts#L25\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"tuple\",\n                        \"elements\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            },\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"id\": 29,\n                    \"name\": \"destructArrayWithRestA\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 23,\n                            \"character\": 4,\n                            \"url\": \"typedoc://destructuring.ts#L23\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 30,\n                    \"name\": \"destructArrayWithRestB\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 24,\n                            \"character\": 4,\n                            \"url\": \"typedoc://destructuring.ts#L24\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 23,\n                    \"name\": \"destructObjectA\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 4,\n                            \"character\": 15,\n                            \"url\": \"typedoc://destructuring.ts#L4\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 24,\n                    \"name\": \"destructObjectB\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 4,\n                            \"character\": 32,\n                            \"url\": \"typedoc://destructuring.ts#L4\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"string\"\n                    }\n                },\n                {\n                    \"id\": 25,\n                    \"name\": \"destructObjectC\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 4,\n                            \"character\": 49,\n                            \"url\": \"typedoc://destructuring.ts#L4\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    }\n                },\n                {\n                    \"id\": 16,\n                    \"name\": \"drawText\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 41,\n                            \"character\": 16,\n                            \"url\": \"typedoc://destructuring.ts#L41\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 17,\n                            \"name\": \"drawText\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Destructuring function parameters.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"destructuring.ts\",\n                                    \"line\": 41,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://destructuring.ts#L41\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 18,\n                                    \"name\": \"__namedParameters\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 19,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 22,\n                                                    \"name\": \"bold\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"boolean\"\n                                                    },\n                                                    \"defaultValue\": \"false\"\n                                                },\n                                                {\n                                                    \"id\": 21,\n                                                    \"name\": \"location\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"tuple\",\n                                                        \"elements\": [\n                                                            {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"number\"\n                                                            },\n                                                            {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"number\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"defaultValue\": \"...\"\n                                                },\n                                                {\n                                                    \"id\": 20,\n                                                    \"name\": \"text\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    },\n                                                    \"defaultValue\": \"\\\"\\\"\"\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        22,\n                                                        21,\n                                                        20\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        26,\n                        27,\n                        28,\n                        32,\n                        33,\n                        31,\n                        29,\n                        30,\n                        23,\n                        24,\n                        25\n                    ]\n                },\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        16\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"destructuring.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://destructuring.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 34,\n            \"name\": \"literal\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 54,\n                    \"name\": \"callbackReturn\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"literal.ts\",\n                            \"line\": 43,\n                            \"character\": 13,\n                            \"url\": \"typedoc://literal.ts#L43\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 55,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"children\": [\n                                {\n                                    \"id\": 62,\n                                    \"name\": \"error\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 48,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L48\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 63,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 64,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"parameters\": [\n                                                        {\n                                                            \"id\": 65,\n                                                            \"name\": \"errorCallback\",\n                                                            \"variant\": \"param\",\n                                                            \"kind\": 32768,\n                                                            \"flags\": {},\n                                                            \"type\": {\n                                                                \"type\": \"reflection\",\n                                                                \"declaration\": {\n                                                                    \"id\": 66,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"declaration\",\n                                                                    \"kind\": 65536,\n                                                                    \"flags\": {},\n                                                                    \"signatures\": [\n                                                                        {\n                                                                            \"id\": 67,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"signature\",\n                                                                            \"kind\": 4096,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"any\"\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"unknown\",\n                                                        \"name\": \"{ success: (successCallback: () => any) => ...; error: (errorCallback: () => any) => ...; finally: (finallyCallback: () => any) => ...; }\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                },\n                                {\n                                    \"id\": 68,\n                                    \"name\": \"finally\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 52,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L52\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 69,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 70,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"parameters\": [\n                                                        {\n                                                            \"id\": 71,\n                                                            \"name\": \"finallyCallback\",\n                                                            \"variant\": \"param\",\n                                                            \"kind\": 32768,\n                                                            \"flags\": {},\n                                                            \"type\": {\n                                                                \"type\": \"reflection\",\n                                                                \"declaration\": {\n                                                                    \"id\": 72,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"declaration\",\n                                                                    \"kind\": 65536,\n                                                                    \"flags\": {},\n                                                                    \"signatures\": [\n                                                                        {\n                                                                            \"id\": 73,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"signature\",\n                                                                            \"kind\": 4096,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"any\"\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"unknown\",\n                                                        \"name\": \"{ success: (successCallback: () => any) => ...; error: (errorCallback: () => any) => ...; finally: (finallyCallback: () => any) => ...; }\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                },\n                                {\n                                    \"id\": 56,\n                                    \"name\": \"success\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 44,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L44\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 57,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 58,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"parameters\": [\n                                                        {\n                                                            \"id\": 59,\n                                                            \"name\": \"successCallback\",\n                                                            \"variant\": \"param\",\n                                                            \"kind\": 32768,\n                                                            \"flags\": {},\n                                                            \"type\": {\n                                                                \"type\": \"reflection\",\n                                                                \"declaration\": {\n                                                                    \"id\": 60,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"declaration\",\n                                                                    \"kind\": 65536,\n                                                                    \"flags\": {},\n                                                                    \"signatures\": [\n                                                                        {\n                                                                            \"id\": 61,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"signature\",\n                                                                            \"kind\": 4096,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"any\"\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"unknown\",\n                                                        \"name\": \"{ success: (successCallback: () => any) => ...; error: (errorCallback: () => any) => ...; finally: (finallyCallback: () => any) => ...; }\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        62,\n                                        68,\n                                        56\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 85,\n                    \"name\": \"objectLiteral\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An object literal.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"literal.ts\",\n                            \"line\": 5,\n                            \"character\": 6,\n                            \"url\": \"typedoc://literal.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 86,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"children\": [\n                                {\n                                    \"id\": 104,\n                                    \"name\": \"[toStringTag]\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 19,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L19\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"defaultValue\": \"\\\"computed\\\"\"\n                                },\n                                {\n                                    \"id\": 105,\n                                    \"name\": \"literal\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 20,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L20\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 106,\n                                    \"name\": \"literal2\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 21,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L21\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 102,\n                                    \"name\": \"valueA\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 17,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L17\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    },\n                                    \"defaultValue\": \"100\"\n                                },\n                                {\n                                    \"id\": 103,\n                                    \"name\": \"valueB\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 18,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L18\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 91,\n                                    \"name\": \"valueX\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 10,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L10\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 92,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 101,\n                                                    \"name\": \"valueA\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 15,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L15\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"number\"\n                                                        }\n                                                    },\n                                                    \"defaultValue\": \"...\"\n                                                },\n                                                {\n                                                    \"id\": 94,\n                                                    \"name\": \"valueY\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 12,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L12\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"reflection\",\n                                                        \"declaration\": {\n                                                            \"id\": 95,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"declaration\",\n                                                            \"kind\": 65536,\n                                                            \"flags\": {},\n                                                            \"signatures\": [\n                                                                {\n                                                                    \"id\": 96,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"signature\",\n                                                                    \"kind\": 4096,\n                                                                    \"flags\": {},\n                                                                    \"parameters\": [\n                                                                        {\n                                                                            \"id\": 97,\n                                                                            \"name\": \"z\",\n                                                                            \"variant\": \"param\",\n                                                                            \"kind\": 32768,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"string\"\n                                                                            }\n                                                                        }\n                                                                    ],\n                                                                    \"type\": {\n                                                                        \"type\": \"reflection\",\n                                                                        \"declaration\": {\n                                                                            \"id\": 98,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"declaration\",\n                                                                            \"kind\": 65536,\n                                                                            \"flags\": {},\n                                                                            \"children\": [\n                                                                                {\n                                                                                    \"id\": 99,\n                                                                                    \"name\": \"a\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 13,\n                                                                                            \"character\": 21,\n                                                                                            \"url\": \"typedoc://literal.ts#L13\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    },\n                                                                                    \"defaultValue\": \"\\\"test\\\"\"\n                                                                                },\n                                                                                {\n                                                                                    \"id\": 100,\n                                                                                    \"name\": \"b\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 13,\n                                                                                            \"character\": 32,\n                                                                                            \"url\": \"typedoc://literal.ts#L13\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    },\n                                                                                    \"defaultValue\": \"z\"\n                                                                                }\n                                                                            ],\n                                                                            \"groups\": [\n                                                                                {\n                                                                                    \"title\": \"Properties\",\n                                                                                    \"children\": [\n                                                                                        99,\n                                                                                        100\n                                                                                    ]\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    },\n                                                    \"defaultValue\": \"...\"\n                                                },\n                                                {\n                                                    \"id\": 93,\n                                                    \"name\": \"valueZ\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 11,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L11\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    },\n                                                    \"defaultValue\": \"\\\"foo\\\"\"\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        101,\n                                                        94,\n                                                        93\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                },\n                                {\n                                    \"id\": 88,\n                                    \"name\": \"valueY\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 7,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L7\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 89,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 90,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                },\n                                {\n                                    \"id\": 87,\n                                    \"name\": \"valueZ\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 6,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L6\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"defaultValue\": \"\\\"foo\\\"\"\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        104,\n                                        105,\n                                        106,\n                                        102,\n                                        103,\n                                        91,\n                                        88,\n                                        87\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 35,\n                    \"name\": \"typeLiteral\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A typed literal without an initializer.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"literal.ts\",\n                            \"line\": 27,\n                            \"character\": 11,\n                            \"url\": \"typedoc://literal.ts#L27\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 36,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"children\": [\n                                {\n                                    \"id\": 52,\n                                    \"name\": \"valueA\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isOptional\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 35,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L35\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 53,\n                                    \"name\": \"valueB\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isOptional\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 36,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L36\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    }\n                                },\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"valueX\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 30,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L30\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 42,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 51,\n                                                    \"name\": \"valueA\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 33,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L33\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"number\"\n                                                        }\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 44,\n                                                    \"name\": \"valueY\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 32,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L32\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"reflection\",\n                                                        \"declaration\": {\n                                                            \"id\": 45,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"declaration\",\n                                                            \"kind\": 65536,\n                                                            \"flags\": {},\n                                                            \"signatures\": [\n                                                                {\n                                                                    \"id\": 46,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"signature\",\n                                                                    \"kind\": 4096,\n                                                                    \"flags\": {},\n                                                                    \"parameters\": [\n                                                                        {\n                                                                            \"id\": 47,\n                                                                            \"name\": \"z\",\n                                                                            \"variant\": \"param\",\n                                                                            \"kind\": 32768,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"string\"\n                                                                            }\n                                                                        }\n                                                                    ],\n                                                                    \"type\": {\n                                                                        \"type\": \"reflection\",\n                                                                        \"declaration\": {\n                                                                            \"id\": 48,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"declaration\",\n                                                                            \"kind\": 65536,\n                                                                            \"flags\": {},\n                                                                            \"children\": [\n                                                                                {\n                                                                                    \"id\": 49,\n                                                                                    \"name\": \"a\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 32,\n                                                                                            \"character\": 33,\n                                                                                            \"url\": \"typedoc://literal.ts#L32\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    }\n                                                                                },\n                                                                                {\n                                                                                    \"id\": 50,\n                                                                                    \"name\": \"b\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 32,\n                                                                                            \"character\": 44,\n                                                                                            \"url\": \"typedoc://literal.ts#L32\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    }\n                                                                                }\n                                                                            ],\n                                                                            \"groups\": [\n                                                                                {\n                                                                                    \"title\": \"Properties\",\n                                                                                    \"children\": [\n                                                                                        49,\n                                                                                        50\n                                                                                    ]\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 43,\n                                                    \"name\": \"valueZ\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 31,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L31\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        51,\n                                                        44,\n                                                        43\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                },\n                                {\n                                    \"id\": 38,\n                                    \"name\": \"valueY\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 29,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L29\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 39,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 40,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                },\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"valueZ\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 28,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        52,\n                                        53,\n                                        41,\n                                        38,\n                                        37\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        54,\n                        85,\n                        35\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"literal.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://literal.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 74,\n            \"name\": \"variable\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 75,\n                    \"name\": \"myConst\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 1,\n                            \"character\": 13,\n                            \"url\": \"typedoc://variable.ts#L1\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"literal\",\n                        \"value\": 15\n                    },\n                    \"defaultValue\": \"15\"\n                },\n                {\n                    \"id\": 76,\n                    \"name\": \"myLet\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 2,\n                            \"character\": 11,\n                            \"url\": \"typedoc://variable.ts#L2\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    },\n                    \"defaultValue\": \"15\"\n                },\n                {\n                    \"id\": 77,\n                    \"name\": \"myVar\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 3,\n                            \"character\": 11,\n                            \"url\": \"typedoc://variable.ts#L3\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"number\"\n                    },\n                    \"defaultValue\": \"15\"\n                },\n                {\n                    \"id\": 81,\n                    \"name\": \"satisfies\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 9,\n                            \"character\": 13,\n                            \"url\": \"typedoc://variable.ts#L9\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 82,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"children\": [\n                                {\n                                    \"id\": 83,\n                                    \"name\": \"a\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"variable.ts\",\n                                            \"line\": 10,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://variable.ts#L10\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    },\n                                    \"defaultValue\": \"1\"\n                                },\n                                {\n                                    \"id\": 84,\n                                    \"name\": \"b\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"variable.ts\",\n                                            \"line\": 11,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://variable.ts#L11\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"defaultValue\": \"\\\"2\\\"\"\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        83,\n                                        84\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 78,\n                    \"name\": \"x\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 5,\n                            \"character\": 11,\n                            \"url\": \"typedoc://variable.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"intrinsic\",\n                        \"name\": \"object\"\n                    }\n                },\n                {\n                    \"id\": 79,\n                    \"name\": \"y\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 6,\n                            \"character\": 11,\n                            \"url\": \"typedoc://variable.ts#L6\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": {\n                            \"packageName\": \"typescript\",\n                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                            \"qualifiedName\": \"Promise\"\n                        },\n                        \"typeArguments\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"string\"\n                            }\n                        ],\n                        \"name\": \"Promise\",\n                        \"package\": \"typescript\"\n                    }\n                },\n                {\n                    \"id\": 80,\n                    \"name\": \"z\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"variable.ts\",\n                            \"line\": 7,\n                            \"character\": 11,\n                            \"url\": \"typedoc://variable.ts#L7\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": {\n                            \"packageName\": \"typescript\",\n                            \"packagePath\": \"lib/lib.es5.d.ts\",\n                            \"qualifiedName\": \"Promise\"\n                        },\n                        \"typeArguments\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"object\"\n                            }\n                        ],\n                        \"name\": \"Promise\",\n                        \"package\": \"typescript\"\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        75,\n                        76,\n                        77,\n                        81,\n                        78,\n                        79,\n                        80\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"variable.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://variable.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                15,\n                34,\n                74\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Array\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Array.T\"\n        },\n        \"6\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Array.T\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"complex\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"custom\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Foo\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"FooList\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"drawText\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"drawText\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"__0\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"text\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"location\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"bold\"\n        },\n        \"23\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructObjectA\"\n        },\n        \"24\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructObjectB\"\n        },\n        \"25\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructObjectC\"\n        },\n        \"26\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayA\"\n        },\n        \"27\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayB\"\n        },\n        \"28\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayC\"\n        },\n        \"29\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayWithRestA\"\n        },\n        \"30\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayWithRestB\"\n        },\n        \"31\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayWithRest\"\n        },\n        \"32\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayWithIgnoresA\"\n        },\n        \"33\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"destructArrayWithIgnoresRest\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"typeLiteral\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueZ\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueY\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueX\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueZ\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueY\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.a\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.b\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueA\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueA\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueB\"\n        },\n        \"54\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"callbackReturn\"\n        },\n        \"55\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"56\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.success\"\n        },\n        \"57\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"58\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"59\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"successCallback\"\n        },\n        \"60\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"61\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"62\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.error\"\n        },\n        \"63\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"64\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"65\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"errorCallback\"\n        },\n        \"66\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"67\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"68\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.finally\"\n        },\n        \"69\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"70\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"71\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"finallyCallback\"\n        },\n        \"72\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"73\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"74\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"75\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"myConst\"\n        },\n        \"76\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"myLet\"\n        },\n        \"77\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"myVar\"\n        },\n        \"78\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"x\"\n        },\n        \"79\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"y\"\n        },\n        \"80\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"81\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"satisfies\"\n        },\n        \"82\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"83\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"__object.a\"\n        },\n        \"84\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/variable.ts\",\n            \"qualifiedName\": \"__object.b\"\n        },\n        \"85\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"objectLiteral\"\n        },\n        \"86\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"87\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueZ\"\n        },\n        \"88\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueY\"\n        },\n        \"89\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"90\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"91\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueX\"\n        },\n        \"92\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"93\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueZ\"\n        },\n        \"94\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueY\"\n        },\n        \"95\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"96\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"97\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"98\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"99\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.a\"\n        },\n        \"100\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.b\"\n        },\n        \"101\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueA\"\n        },\n        \"102\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueA\"\n        },\n        \"103\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueB\"\n        },\n        \"104\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.[toStringTag]\"\n        },\n        \"105\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.literal\"\n        },\n        \"106\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.literal2\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/variables/array.ts\",\n            \"2\": \"src/test/converter/variables/destructuring.ts\",\n            \"3\": \"src/test/converter/variables/literal.ts\",\n            \"4\": \"src/test/converter/variables/variable.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 15,\n            \"3\": 34,\n            \"4\": 74\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/variables/specs.nodoc.json",
    "content": "{\n    \"schemaVersion\": \"2.0\",\n    \"id\": 0,\n    \"name\": \"variables\",\n    \"variant\": \"project\",\n    \"kind\": 1,\n    \"flags\": {},\n    \"children\": [\n        {\n            \"id\": 1,\n            \"name\": \"array\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 2,\n                    \"name\": \"Array\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A custom array class.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 4,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L4\"\n                        }\n                    ],\n                    \"typeParameters\": [\n                        {\n                            \"id\": 3,\n                            \"name\": \"T\",\n                            \"variant\": \"typeParam\",\n                            \"kind\": 131072,\n                            \"flags\": {}\n                        }\n                    ],\n                    \"extendedBy\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 12,\n                            \"name\": \"FooList\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"Foo\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Class array class item\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 19,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L19\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 12,\n                    \"name\": \"FooList\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 128,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"Custom list class\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 24,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L24\"\n                        }\n                    ],\n                    \"extendedTypes\": [\n                        {\n                            \"type\": \"reference\",\n                            \"target\": 2,\n                            \"typeArguments\": [\n                                {\n                                    \"type\": \"reference\",\n                                    \"target\": 9,\n                                    \"name\": \"Foo\",\n                                    \"package\": \"typedoc\"\n                                }\n                            ],\n                            \"name\": \"Array\",\n                            \"package\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 7,\n                    \"name\": \"complex\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A const of a complex type.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 9,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L9\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"array\",\n                        \"elementType\": {\n                            \"type\": \"array\",\n                            \"elementType\": {\n                                \"type\": \"union\",\n                                \"types\": [\n                                    {\n                                        \"type\": \"array\",\n                                        \"elementType\": {\n                                            \"type\": \"union\",\n                                            \"types\": [\n                                                {\n                                                    \"type\": \"array\",\n                                                    \"elementType\": {\n                                                        \"type\": \"reference\",\n                                                        \"target\": 2,\n                                                        \"typeArguments\": [\n                                                            {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"string\"\n                                                            }\n                                                        ],\n                                                        \"name\": \"Array\",\n                                                        \"package\": \"typedoc\"\n                                                    }\n                                                },\n                                                {\n                                                    \"type\": \"array\",\n                                                    \"elementType\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"number\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    \"defaultValue\": \"[]\"\n                },\n                {\n                    \"id\": 8,\n                    \"name\": \"custom\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An exported const of the custom array type.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"array.ts\",\n                            \"line\": 14,\n                            \"character\": 13,\n                            \"url\": \"typedoc://array.ts#L14\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reference\",\n                        \"target\": 2,\n                        \"typeArguments\": [\n                            {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"number\"\n                            }\n                        ],\n                        \"name\": \"Array\",\n                        \"package\": \"typedoc\"\n                    },\n                    \"defaultValue\": \"{}\"\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Classes\",\n                    \"children\": [\n                        2,\n                        9,\n                        12\n                    ]\n                },\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        7,\n                        8\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"array.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://array.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 15,\n            \"name\": \"destructuring\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 16,\n                    \"name\": \"drawText\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 64,\n                    \"flags\": {},\n                    \"sources\": [\n                        {\n                            \"fileName\": \"destructuring.ts\",\n                            \"line\": 41,\n                            \"character\": 16,\n                            \"url\": \"typedoc://destructuring.ts#L41\"\n                        }\n                    ],\n                    \"signatures\": [\n                        {\n                            \"id\": 17,\n                            \"name\": \"drawText\",\n                            \"variant\": \"signature\",\n                            \"kind\": 4096,\n                            \"flags\": {},\n                            \"comment\": {\n                                \"summary\": [\n                                    {\n                                        \"kind\": \"text\",\n                                        \"text\": \"Destructuring function parameters.\"\n                                    }\n                                ]\n                            },\n                            \"sources\": [\n                                {\n                                    \"fileName\": \"destructuring.ts\",\n                                    \"line\": 41,\n                                    \"character\": 16,\n                                    \"url\": \"typedoc://destructuring.ts#L41\"\n                                }\n                            ],\n                            \"parameters\": [\n                                {\n                                    \"id\": 18,\n                                    \"name\": \"__namedParameters\",\n                                    \"variant\": \"param\",\n                                    \"kind\": 32768,\n                                    \"flags\": {},\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 19,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 22,\n                                                    \"name\": \"bold\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"boolean\"\n                                                    },\n                                                    \"defaultValue\": \"false\"\n                                                },\n                                                {\n                                                    \"id\": 21,\n                                                    \"name\": \"location\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"tuple\",\n                                                        \"elements\": [\n                                                            {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"number\"\n                                                            },\n                                                            {\n                                                                \"type\": \"intrinsic\",\n                                                                \"name\": \"number\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"defaultValue\": \"...\"\n                                                },\n                                                {\n                                                    \"id\": 20,\n                                                    \"name\": \"text\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {\n                                                        \"isOptional\": true\n                                                    },\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    },\n                                                    \"defaultValue\": \"\\\"\\\"\"\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        22,\n                                                        21,\n                                                        20\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ],\n                            \"type\": {\n                                \"type\": \"intrinsic\",\n                                \"name\": \"void\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Functions\",\n                    \"children\": [\n                        16\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"destructuring.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://destructuring.ts#L1\"\n                }\n            ]\n        },\n        {\n            \"id\": 34,\n            \"name\": \"literal\",\n            \"variant\": \"declaration\",\n            \"kind\": 2,\n            \"flags\": {},\n            \"children\": [\n                {\n                    \"id\": 85,\n                    \"name\": \"objectLiteral\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {\n                        \"isConst\": true\n                    },\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"An object literal.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"literal.ts\",\n                            \"line\": 5,\n                            \"character\": 6,\n                            \"url\": \"typedoc://literal.ts#L5\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 86,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"children\": [\n                                {\n                                    \"id\": 104,\n                                    \"name\": \"[toStringTag]\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 19,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L19\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"defaultValue\": \"\\\"computed\\\"\"\n                                },\n                                {\n                                    \"id\": 105,\n                                    \"name\": \"literal\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 20,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L20\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 106,\n                                    \"name\": \"literal2\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 21,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L21\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 102,\n                                    \"name\": \"valueA\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 17,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L17\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    },\n                                    \"defaultValue\": \"100\"\n                                },\n                                {\n                                    \"id\": 103,\n                                    \"name\": \"valueB\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 18,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L18\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    },\n                                    \"defaultValue\": \"true\"\n                                },\n                                {\n                                    \"id\": 91,\n                                    \"name\": \"valueX\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 10,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L10\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 92,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 101,\n                                                    \"name\": \"valueA\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 15,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L15\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"number\"\n                                                        }\n                                                    },\n                                                    \"defaultValue\": \"...\"\n                                                },\n                                                {\n                                                    \"id\": 94,\n                                                    \"name\": \"valueY\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 12,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L12\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"reflection\",\n                                                        \"declaration\": {\n                                                            \"id\": 95,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"declaration\",\n                                                            \"kind\": 65536,\n                                                            \"flags\": {},\n                                                            \"signatures\": [\n                                                                {\n                                                                    \"id\": 96,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"signature\",\n                                                                    \"kind\": 4096,\n                                                                    \"flags\": {},\n                                                                    \"parameters\": [\n                                                                        {\n                                                                            \"id\": 97,\n                                                                            \"name\": \"z\",\n                                                                            \"variant\": \"param\",\n                                                                            \"kind\": 32768,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"string\"\n                                                                            }\n                                                                        }\n                                                                    ],\n                                                                    \"type\": {\n                                                                        \"type\": \"reflection\",\n                                                                        \"declaration\": {\n                                                                            \"id\": 98,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"declaration\",\n                                                                            \"kind\": 65536,\n                                                                            \"flags\": {},\n                                                                            \"children\": [\n                                                                                {\n                                                                                    \"id\": 99,\n                                                                                    \"name\": \"a\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 13,\n                                                                                            \"character\": 21,\n                                                                                            \"url\": \"typedoc://literal.ts#L13\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    },\n                                                                                    \"defaultValue\": \"\\\"test\\\"\"\n                                                                                },\n                                                                                {\n                                                                                    \"id\": 100,\n                                                                                    \"name\": \"b\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 13,\n                                                                                            \"character\": 32,\n                                                                                            \"url\": \"typedoc://literal.ts#L13\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    },\n                                                                                    \"defaultValue\": \"z\"\n                                                                                }\n                                                                            ],\n                                                                            \"groups\": [\n                                                                                {\n                                                                                    \"title\": \"Properties\",\n                                                                                    \"children\": [\n                                                                                        99,\n                                                                                        100\n                                                                                    ]\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    },\n                                                    \"defaultValue\": \"...\"\n                                                },\n                                                {\n                                                    \"id\": 93,\n                                                    \"name\": \"valueZ\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 11,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L11\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    },\n                                                    \"defaultValue\": \"\\\"foo\\\"\"\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        101,\n                                                        94,\n                                                        93\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                },\n                                {\n                                    \"id\": 88,\n                                    \"name\": \"valueY\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 7,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L7\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 89,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 90,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    \"defaultValue\": \"...\"\n                                },\n                                {\n                                    \"id\": 87,\n                                    \"name\": \"valueZ\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 6,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L6\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    },\n                                    \"defaultValue\": \"\\\"foo\\\"\"\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        104,\n                                        105,\n                                        106,\n                                        102,\n                                        103,\n                                        91,\n                                        88,\n                                        87\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    \"defaultValue\": \"...\"\n                },\n                {\n                    \"id\": 35,\n                    \"name\": \"typeLiteral\",\n                    \"variant\": \"declaration\",\n                    \"kind\": 32,\n                    \"flags\": {},\n                    \"comment\": {\n                        \"summary\": [\n                            {\n                                \"kind\": \"text\",\n                                \"text\": \"A typed literal without an initializer.\"\n                            }\n                        ]\n                    },\n                    \"sources\": [\n                        {\n                            \"fileName\": \"literal.ts\",\n                            \"line\": 27,\n                            \"character\": 11,\n                            \"url\": \"typedoc://literal.ts#L27\"\n                        }\n                    ],\n                    \"type\": {\n                        \"type\": \"reflection\",\n                        \"declaration\": {\n                            \"id\": 36,\n                            \"name\": \"__type\",\n                            \"variant\": \"declaration\",\n                            \"kind\": 65536,\n                            \"flags\": {},\n                            \"children\": [\n                                {\n                                    \"id\": 52,\n                                    \"name\": \"valueA\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isOptional\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 35,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L35\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"number\"\n                                    }\n                                },\n                                {\n                                    \"id\": 53,\n                                    \"name\": \"valueB\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {\n                                        \"isOptional\": true\n                                    },\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 36,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L36\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"boolean\"\n                                    }\n                                },\n                                {\n                                    \"id\": 41,\n                                    \"name\": \"valueX\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 30,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L30\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 42,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"children\": [\n                                                {\n                                                    \"id\": 51,\n                                                    \"name\": \"valueA\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 33,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L33\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"array\",\n                                                        \"elementType\": {\n                                                            \"type\": \"intrinsic\",\n                                                            \"name\": \"number\"\n                                                        }\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 44,\n                                                    \"name\": \"valueY\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 32,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L32\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"reflection\",\n                                                        \"declaration\": {\n                                                            \"id\": 45,\n                                                            \"name\": \"__type\",\n                                                            \"variant\": \"declaration\",\n                                                            \"kind\": 65536,\n                                                            \"flags\": {},\n                                                            \"signatures\": [\n                                                                {\n                                                                    \"id\": 46,\n                                                                    \"name\": \"__type\",\n                                                                    \"variant\": \"signature\",\n                                                                    \"kind\": 4096,\n                                                                    \"flags\": {},\n                                                                    \"parameters\": [\n                                                                        {\n                                                                            \"id\": 47,\n                                                                            \"name\": \"z\",\n                                                                            \"variant\": \"param\",\n                                                                            \"kind\": 32768,\n                                                                            \"flags\": {},\n                                                                            \"type\": {\n                                                                                \"type\": \"intrinsic\",\n                                                                                \"name\": \"string\"\n                                                                            }\n                                                                        }\n                                                                    ],\n                                                                    \"type\": {\n                                                                        \"type\": \"reflection\",\n                                                                        \"declaration\": {\n                                                                            \"id\": 48,\n                                                                            \"name\": \"__type\",\n                                                                            \"variant\": \"declaration\",\n                                                                            \"kind\": 65536,\n                                                                            \"flags\": {},\n                                                                            \"children\": [\n                                                                                {\n                                                                                    \"id\": 49,\n                                                                                    \"name\": \"a\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 32,\n                                                                                            \"character\": 33,\n                                                                                            \"url\": \"typedoc://literal.ts#L32\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    }\n                                                                                },\n                                                                                {\n                                                                                    \"id\": 50,\n                                                                                    \"name\": \"b\",\n                                                                                    \"variant\": \"declaration\",\n                                                                                    \"kind\": 1024,\n                                                                                    \"flags\": {},\n                                                                                    \"sources\": [\n                                                                                        {\n                                                                                            \"fileName\": \"literal.ts\",\n                                                                                            \"line\": 32,\n                                                                                            \"character\": 44,\n                                                                                            \"url\": \"typedoc://literal.ts#L32\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": {\n                                                                                        \"type\": \"intrinsic\",\n                                                                                        \"name\": \"string\"\n                                                                                    }\n                                                                                }\n                                                                            ],\n                                                                            \"groups\": [\n                                                                                {\n                                                                                    \"title\": \"Properties\",\n                                                                                    \"children\": [\n                                                                                        49,\n                                                                                        50\n                                                                                    ]\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    }\n                                                },\n                                                {\n                                                    \"id\": 43,\n                                                    \"name\": \"valueZ\",\n                                                    \"variant\": \"declaration\",\n                                                    \"kind\": 1024,\n                                                    \"flags\": {},\n                                                    \"sources\": [\n                                                        {\n                                                            \"fileName\": \"literal.ts\",\n                                                            \"line\": 31,\n                                                            \"character\": 8,\n                                                            \"url\": \"typedoc://literal.ts#L31\"\n                                                        }\n                                                    ],\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ],\n                                            \"groups\": [\n                                                {\n                                                    \"title\": \"Properties\",\n                                                    \"children\": [\n                                                        51,\n                                                        44,\n                                                        43\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                },\n                                {\n                                    \"id\": 38,\n                                    \"name\": \"valueY\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 29,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L29\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"reflection\",\n                                        \"declaration\": {\n                                            \"id\": 39,\n                                            \"name\": \"__type\",\n                                            \"variant\": \"declaration\",\n                                            \"kind\": 65536,\n                                            \"flags\": {},\n                                            \"signatures\": [\n                                                {\n                                                    \"id\": 40,\n                                                    \"name\": \"__type\",\n                                                    \"variant\": \"signature\",\n                                                    \"kind\": 4096,\n                                                    \"flags\": {},\n                                                    \"type\": {\n                                                        \"type\": \"intrinsic\",\n                                                        \"name\": \"string\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                },\n                                {\n                                    \"id\": 37,\n                                    \"name\": \"valueZ\",\n                                    \"variant\": \"declaration\",\n                                    \"kind\": 1024,\n                                    \"flags\": {},\n                                    \"sources\": [\n                                        {\n                                            \"fileName\": \"literal.ts\",\n                                            \"line\": 28,\n                                            \"character\": 4,\n                                            \"url\": \"typedoc://literal.ts#L28\"\n                                        }\n                                    ],\n                                    \"type\": {\n                                        \"type\": \"intrinsic\",\n                                        \"name\": \"string\"\n                                    }\n                                }\n                            ],\n                            \"groups\": [\n                                {\n                                    \"title\": \"Properties\",\n                                    \"children\": [\n                                        52,\n                                        53,\n                                        41,\n                                        38,\n                                        37\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                }\n            ],\n            \"groups\": [\n                {\n                    \"title\": \"Variables\",\n                    \"children\": [\n                        85,\n                        35\n                    ]\n                }\n            ],\n            \"sources\": [\n                {\n                    \"fileName\": \"literal.ts\",\n                    \"line\": 1,\n                    \"character\": 0,\n                    \"url\": \"typedoc://literal.ts#L1\"\n                }\n            ]\n        }\n    ],\n    \"groups\": [\n        {\n            \"title\": \"Modules\",\n            \"children\": [\n                1,\n                15,\n                34\n            ]\n        }\n    ],\n    \"packageName\": \"typedoc\",\n    \"symbolIdMap\": {\n        \"1\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"2\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Array\"\n        },\n        \"3\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Array.T\"\n        },\n        \"7\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"complex\"\n        },\n        \"8\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"custom\"\n        },\n        \"9\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"Foo\"\n        },\n        \"12\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/array.ts\",\n            \"qualifiedName\": \"FooList\"\n        },\n        \"15\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"16\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"drawText\"\n        },\n        \"17\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"drawText\"\n        },\n        \"18\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/destructuring.ts\",\n            \"qualifiedName\": \"__0\"\n        },\n        \"20\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"text\"\n        },\n        \"21\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"location\"\n        },\n        \"22\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"\",\n            \"qualifiedName\": \"bold\"\n        },\n        \"34\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"\"\n        },\n        \"35\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"typeLiteral\"\n        },\n        \"36\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"37\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueZ\"\n        },\n        \"38\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueY\"\n        },\n        \"39\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"40\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"41\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueX\"\n        },\n        \"42\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"43\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueZ\"\n        },\n        \"44\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueY\"\n        },\n        \"45\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"46\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"47\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"48\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type\"\n        },\n        \"49\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.a\"\n        },\n        \"50\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.b\"\n        },\n        \"51\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueA\"\n        },\n        \"52\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueA\"\n        },\n        \"53\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__type.valueB\"\n        },\n        \"85\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"objectLiteral\"\n        },\n        \"86\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"87\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueZ\"\n        },\n        \"88\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueY\"\n        },\n        \"89\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"90\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"91\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueX\"\n        },\n        \"92\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"93\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueZ\"\n        },\n        \"94\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueY\"\n        },\n        \"95\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"96\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__function\"\n        },\n        \"97\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"z\"\n        },\n        \"98\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object\"\n        },\n        \"99\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.a\"\n        },\n        \"100\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.b\"\n        },\n        \"101\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueA\"\n        },\n        \"102\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueA\"\n        },\n        \"103\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.valueB\"\n        },\n        \"104\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.[toStringTag]\"\n        },\n        \"105\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.literal\"\n        },\n        \"106\": {\n            \"packageName\": \"typedoc\",\n            \"packagePath\": \"src/test/converter/variables/literal.ts\",\n            \"qualifiedName\": \"__object.literal2\"\n        }\n    },\n    \"files\": {\n        \"entries\": {\n            \"1\": \"src/test/converter/variables/array.ts\",\n            \"2\": \"src/test/converter/variables/destructuring.ts\",\n            \"3\": \"src/test/converter/variables/literal.ts\",\n            \"4\": \"src/test/converter/variables/variable.ts\"\n        },\n        \"reflections\": {\n            \"1\": 1,\n            \"2\": 15,\n            \"3\": 34\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter/variables/variable.ts",
    "content": "export const myConst = 15;\nexport let myLet = 15;\nexport var myVar = 15;\n\nexport let x: object;\nexport let y: Promise<string>;\nexport let z: Promise<object>;\n\nexport const satisfies = {\n    a: 1,\n    b: \"2\",\n} satisfies Record<string, string | number>;\n"
  },
  {
    "path": "src/test/converter.test.ts",
    "content": "import { deepStrictEqual as equal, ok } from \"assert\";\nimport * as FS from \"fs\";\nimport * as Path from \"path\";\nimport {\n    Comment,\n    type CommentDisplayPart,\n    CommentTag,\n    type JSONOutput,\n    ProjectReflection,\n    ReferenceReflection,\n    ReferenceType,\n    Reflection,\n    ReflectionCategory,\n    ReflectionGroup,\n    resetReflectionID,\n    Serializer,\n    type SomeReflection,\n    SourceReference,\n} from \"../index.js\";\nimport type { ModelToObject } from \"../lib/serialization/schema.js\";\nimport { getExpandedEntryPointsForPaths, normalizePath } from \"../lib/utils/index.js\";\nimport { getConverterApp, getConverterBase, getConverterProgram } from \"./programs.js\";\nimport { FileRegistry } from \"../lib/models/FileRegistry.js\";\n\nconst comparisonSerializer = new Serializer();\ncomparisonSerializer.addSerializer({\n    priority: 0,\n    supports(x) {\n        return x instanceof ReferenceType;\n    },\n    toObject(ref: ReferenceType, obj: any) {\n        if (ref.reflection) {\n            obj.target = ref.reflection.getFullName();\n        }\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer({\n    priority: 0,\n    supports(x) {\n        return x instanceof Comment;\n    },\n    toObject(comment: Comment, obj: JSONOutput.Comment) {\n        obj.summary.forEach((part, i) => {\n            if (part.kind === \"inline-tag\" && typeof part.target === \"number\") {\n                const origPart = comment.summary[i] as CommentDisplayPart & {\n                    target: Reflection;\n                };\n                part.target = origPart.target.getFullName();\n            }\n        });\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer<CommentTag>({\n    priority: 0,\n    supports(x) {\n        return x instanceof CommentTag;\n    },\n    toObject(tag: any, obj: JSONOutput.CommentTag) {\n        obj[\"content\"].forEach(\n            (part: JSONOutput.CommentDisplayPart, i: number) => {\n                if (\n                    part.kind === \"inline-tag\" &&\n                    typeof part.target === \"number\"\n                ) {\n                    part.target = tag.content[i].target.getFullName();\n                }\n            },\n        );\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer<SomeReflection>({\n    priority: 0,\n    supports(x) {\n        return x instanceof Reflection;\n    },\n    toObject(refl, obj: any) {\n        delete obj[\"id\"];\n        if (refl.isDeclaration()) {\n            obj[\"childrenIncludingDocuments\"] = refl.childrenIncludingDocuments?.map(id => id.getFullName());\n        }\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer({\n    priority: 0,\n    supports(x) {\n        return x instanceof ReferenceReflection;\n    },\n    toObject(refl: ReferenceReflection, obj: any) {\n        obj.target = refl.getTargetReflectionDeep().getFullName();\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer({\n    priority: 0,\n    supports(x) {\n        return x instanceof ReflectionCategory || x instanceof ReflectionGroup;\n    },\n    toObject(refl: ReflectionCategory | ReflectionGroup, obj: any) {\n        obj.children = refl.children.map((c) => c.getFullName());\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer({\n    priority: -1,\n    supports(obj) {\n        return obj instanceof SourceReference;\n    },\n    toObject(\n        ref: SourceReference,\n        obj: ModelToObject<SourceReference>,\n        _serializer,\n    ) {\n        if (obj.url) {\n            obj.url = `typedoc://${\n                obj.url.substring(\n                    obj.url.indexOf(ref.fileName),\n                )\n            }`;\n        }\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer({\n    priority: -1,\n    supports(obj) {\n        return obj instanceof ProjectReflection;\n    },\n    toObject(project: ProjectReflection, obj: JSONOutput.ProjectReflection) {\n        const idMap: Record<string, JSONOutput.ReflectionSymbolId> = {};\n        for (const [k, v] of Object.entries(obj.symbolIdMap || {})) {\n            idMap[project.getReflectionById(+k)!.getFullName()] = v;\n        }\n        obj.symbolIdMap = idMap;\n        delete obj.packageVersion;\n        return obj;\n    },\n});\ncomparisonSerializer.addSerializer({\n    priority: -1,\n    supports(obj) {\n        return obj instanceof FileRegistry;\n    },\n    toObject(_media: FileRegistry, obj: JSONOutput.FileRegistry) {\n        obj.reflections = {};\n        return obj;\n    },\n});\n\ndescribe(\"Converter\", function () {\n    const base = getConverterBase();\n    const app = getConverterApp();\n\n    it(\"Compiles\", () => {\n        getConverterProgram();\n    });\n\n    const checks: [string, () => void, () => void][] = [\n        [\n            \"specs\",\n            () => {\n                // nop\n            },\n            () => {\n                // nop\n            },\n        ],\n        [\n            \"specs-with-lump-categories\",\n            () => app.options.setValue(\"categorizeByGroup\", false),\n            () => app.options.setValue(\"categorizeByGroup\", true),\n        ],\n        [\n            \"specs.nodoc\",\n            () => app.options.setValue(\"excludeNotDocumented\", true),\n            () => app.options.setValue(\"excludeNotDocumented\", false),\n        ],\n    ];\n\n    FS.readdirSync(base).forEach(function (directory) {\n        const path = Path.join(base, directory);\n        if (!FS.lstatSync(path).isDirectory()) {\n            return;\n        }\n\n        describe(directory, function () {\n            for (const [file, before, after] of checks) {\n                const specsFile = Path.join(path, `${file}.json`);\n                if (!FS.existsSync(specsFile)) {\n                    continue;\n                }\n\n                const specs = JSON.parse(FS.readFileSync(specsFile, \"utf-8\"));\n\n                let result: ProjectReflection | undefined;\n\n                it(`[${file}] converts fixtures`, function () {\n                    before();\n                    resetReflectionID();\n                    app.files = new FileRegistry();\n                    const entryPoints = getExpandedEntryPointsForPaths(\n                        app.logger,\n                        [path],\n                        app.options,\n                        [getConverterProgram()],\n                    );\n                    ok(entryPoints, \"Failed to get entry points\");\n                    result = app.converter.convert(entryPoints);\n                    result.name = directory;\n                    after();\n                });\n\n                it(`[${file}] matches specs`, function () {\n                    // Pass data through a parse/stringify to get rid of undefined properties\n                    const data = JSON.parse(\n                        JSON.stringify(\n                            app.serializer.projectToObject(\n                                result!,\n                                normalizePath(process.cwd()),\n                            ),\n                        ),\n                    );\n                    delete data.symbolIdMap;\n                    const specCopy = { ...specs };\n                    delete specCopy.symbolIdMap;\n\n                    equal(data, specCopy);\n                });\n\n                it(`[${file}] round trips revival`, () => {\n                    const revived = app.deserializer.reviveProject(\n                        specs.name,\n                        specs,\n                        {\n                            projectRoot: normalizePath(process.cwd()),\n                            registry: new FileRegistry(),\n                        },\n                    );\n                    const specs2 = JSON.parse(\n                        JSON.stringify(\n                            comparisonSerializer.projectToObject(\n                                revived,\n                                normalizePath(process.cwd()),\n                            ),\n                        ),\n                    );\n\n                    // Pass data through a parse/stringify to get rid of undefined properties\n                    const data = JSON.parse(\n                        JSON.stringify(\n                            comparisonSerializer.projectToObject(\n                                result!,\n                                normalizePath(process.cwd()),\n                            ),\n                        ),\n                    );\n\n                    equal(data, specs2);\n                });\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/converter2/behavior/asConstEnum.ts",
    "content": "/* Enum-like objects with string literal values */\n\nexport const SomeEnumLike = {\n    a: \"a\",\n    b: \"b\",\n} as const;\n\n/** @enum */\nexport const SomeEnumLikeTagged = {\n    a: \"a\",\n    b: \"b\",\n} as const;\n\n/** @enum */\nexport const ManualEnum: { readonly a: \"a\" } = {\n    a: \"a\",\n};\n\n/** @enum */\nexport const ManualEnumHelper: Readonly<{ a: \"a\" }> = {\n    a: \"a\",\n};\n\n/** @enum */\nexport const WithoutReadonly = {\n    a: \"a\",\n} as { a: \"a\" };\n\n/* Enum-like objects with numeric literal values */\n\nexport const SomeEnumLikeNumeric = {\n    a: 0,\n    b: 1,\n} as const;\n\n/** @enum */\nexport const SomeEnumLikeTaggedNumeric = {\n    a: 0,\n    b: 1,\n} as const;\n\n/** @enum */\nexport const ManualEnumNumeric: { readonly a: 0 } = {\n    a: 0,\n};\n\n/** @enum */\nexport const ManualEnumHelperNumeric: Readonly<{ a: 0 }> = {\n    a: 0,\n};\n\n/** @enum */\nexport const WithoutReadonlyNumeric = {\n    a: 0,\n} as { a: 0 };\n\n/** @enum */\nexport const WithInvalidTypeUnionMember = {\n    // Since this is an invalid type union, this should fail to convert to an enum,\n    // and be represented in the generated docs as a variable instead.\n    a: 0 as 0 | string,\n};\n\n/* Enum-like objects with numeric expression values */\n\n/** @enum */\nexport const WithNumericExpression = {\n    a: 1 << 0,\n};\n"
  },
  {
    "path": "src/test/converter2/behavior/benchmark.ts",
    "content": "export { default as assert } from \"assert\";\nexport { default as \"assert/strict\" } from \"assert/strict\";\nexport { default as async_hooks } from \"async_hooks\";\nexport { default as buffer } from \"buffer\";\nexport { default as child_process } from \"child_process\";\nexport { default as cluster } from \"cluster\";\nexport { default as console } from \"console\";\nexport { default as constants } from \"constants\";\nexport { default as crypto } from \"crypto\";\nexport { default as dgram } from \"dgram\";\nexport { default as diagnostics_channel } from \"diagnostics_channel\";\nexport { default as dns } from \"dns\";\nexport { default as \"dns/promises\" } from \"dns/promises\";\nexport { default as domain } from \"domain\";\nexport { default as events } from \"events\";\nexport { default as fs } from \"fs\";\nexport { default as \"fs/promises\" } from \"fs/promises\";\nexport { default as http } from \"http\";\nexport { default as http2 } from \"http2\";\nexport { default as https } from \"https\";\nexport { default as inspector } from \"inspector\";\n// export { default as \"inspector/promises\" } from \"inspector/promises\"\nexport { default as module } from \"module\";\nexport { default as net } from \"net\";\nexport { default as os } from \"os\";\nexport { default as path } from \"path\";\nexport { default as \"path/posix\" } from \"path/posix\";\nexport { default as \"path/win32\" } from \"path/win32\";\nexport { default as perf_hooks } from \"perf_hooks\";\nexport { default as process } from \"process\";\nexport { default as punycode } from \"punycode\";\nexport { default as querystring } from \"querystring\";\nexport { default as readline } from \"readline\";\nexport { default as \"readline/promises\" } from \"readline/promises\";\nexport { default as repl } from \"repl\";\nexport { default as stream } from \"stream\";\nexport { default as \"stream/consumers\" } from \"stream/consumers\";\nexport { default as \"stream/promises\" } from \"stream/promises\";\nexport { default as \"stream/web\" } from \"stream/web\";\nexport { default as string_decoder } from \"string_decoder\";\n// export { default as sys } from \"sys\"\nexport { default as timers } from \"timers\";\nexport { default as \"timers/promises\" } from \"timers/promises\";\nexport { default as tls } from \"tls\";\nexport { default as trace_events } from \"trace_events\";\nexport { default as tty } from \"tty\";\nexport { default as url } from \"url\";\nexport { default as util } from \"util\";\nexport { default as \"util/types\" } from \"util/types\";\nexport { default as v8 } from \"v8\";\nexport { default as vm } from \"vm\";\nexport { default as wasi } from \"wasi\";\nexport { default as worker_threads } from \"worker_threads\";\nexport { default as zlib } from \"zlib\";\n"
  },
  {
    "path": "src/test/converter2/behavior/blockComment.ts",
    "content": "/** jsdoc block */\nexport const a = 123;\n\n/* block, but not jsdoc */\nexport const b = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/cascadedModifiers.ts",
    "content": "/**\n * @beta\n */\nexport namespace BetaStuff {\n    export class AlsoBeta {\n        betaFish() {}\n\n        /** @alpha */\n        alphaFish() {}\n    }\n}\n\n/** @alpha @beta */\nexport const mutuallyExclusive = true;\n"
  },
  {
    "path": "src/test/converter2/behavior/categoryInheritance.ts",
    "content": "/**\n * @categoryDescription Cat\n * Cat desc\n */\nexport interface Int {\n    /** @category Cat */\n    prop: string;\n}\n\nexport class Cls implements Int {\n    prop = \"\";\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/classTag.ts",
    "content": "/**\n * Variable class\n * @class\n */\nexport const VariableClass = class {\n    /** Stat docs */\n    static stat = 1;\n    /** Inst docs */\n    inst = \"2\";\n};\n\n/**\n * Normal classes can't have call signatures, but this does.\n * @class\n */\nexport declare const CallableClass: {\n    /** Stat docs */\n    stat: string;\n    /** Static signature */\n    (): number;\n} & {\n    /** Ctor docs */\n    new (): {\n        /** Call docs */\n        (): string;\n\n        /** Inst docs */\n        inst: string;\n        /** Method docs */\n        method(): string;\n    };\n};\n\n/**\n * Will not be converted because the class is declared with `@class`\n */\nexport type CallableClass = any;\n\n/** @class */\nexport const BadClass = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/constNamespace.ts",
    "content": "/**\n * const doc\n */\nexport const someConst = {\n    /** a doc */\n    a: 123,\n\n    /** b doc */\n    b() {\n        return \"456\";\n    },\n};\n\n/**\n * ns doc\n * @namespace\n */\nexport const someNs = someConst;\n"
  },
  {
    "path": "src/test/converter2/behavior/constTypeParam.ts",
    "content": "export type HasNames = { names: readonly string[] };\nexport function getNamesExactly<const T extends HasNames>(arg: T): T[\"names\"] {\n    return arg.names;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/ctorTypeParam.ts",
    "content": "/**\n * @template T class docs\n */\nexport class Generic<T> {\n    /** @template T ctor docs */\n    constructor();\n    constructor(x: string);\n\n    constructor(x?: string) {}\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/declareGlobal.ts",
    "content": "import { SyntaxKind } from \"typescript\";\n\ndeclare global {\n    interface DeclareGlobal {\n        method(kind: SyntaxKind): void;\n    }\n}\n\nnamespace NotIncluded {}\n"
  },
  {
    "path": "src/test/converter2/behavior/defaultTag.ts",
    "content": "/**\n * @default\n * @default fn({})\n */\nexport const foo = 1;\n"
  },
  {
    "path": "src/test/converter2/behavior/defaultValueTag.ts",
    "content": "/**\n * @defaultValue\n * @defaultValue fn({})\n */\nexport const foo = 1;\n"
  },
  {
    "path": "src/test/converter2/behavior/destructuredParamRenames.ts",
    "content": "/**\n * @param params - desc\n * @param params.a - paramZ desc\n */\nexport function singleParam({ a }: { a: string }) {\n    return 0;\n}\n\n/**\n * @param params - desc\n */\nexport function extraParam({ a }: { a: string }, extraParameter: string) {\n    return 0;\n}\n\n/**\n * @param params param\n * @param fakeParameter param2\n */\nexport function extraParamComment({ a }: { a: string }) {\n    return 0;\n}\n\n/**\n * @param params params\n * @param params2 params2\n */\nexport function multiParam(\n    { a }: { a: string },\n    { b }: { b: number },\n    { c }: { c: boolean },\n) {\n    return 0;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/documents/doc.md",
    "content": "Link to [project](./docs.ts)\n"
  },
  {
    "path": "src/test/converter2/behavior/documents/docs.ts",
    "content": "/**\n * Link to [doc](./doc.md)\n *\n * @module\n * @document doc.md\n */\n\nexport const hasDocs = true;\n"
  },
  {
    "path": "src/test/converter2/behavior/documents/package.json",
    "content": "{\n    \"name\": \"docs\"\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/documents/readme.md",
    "content": "Doc projects readme: [docs](./doc.md)\n"
  },
  {
    "path": "src/test/converter2/behavior/duplicateHeritageClauses.ts",
    "content": "export interface A {\n    a?: string;\n}\n\nexport interface B extends A {}\nexport interface B extends A {\n    b?: string;\n}\n\nexport interface C extends A {}\nexport class C implements A {}\n\nexport interface D extends Record<\"a\", 1> {}\nexport interface D extends Record<\"a\", 1>, Record<\"b\", 1> {}\n"
  },
  {
    "path": "src/test/converter2/behavior/exampleTags.ts",
    "content": "/**\n * The example tag is problematic.\n * JSDoc expects it to have no code ticks: https://jsdoc.app/tags-example.html\n * TSDoc does not: https://tsdoc.org/pages/tags/example/\n * VSCode says it's code if it does not include a code block: https://github.com/Microsoft/vscode/blob/1.64.2/extensions/typescript-language-features/src/utils/previewer.ts#L52-L60\n *\n * @example\n * // JSDoc style\n * codeHere();\n *\n * @example <caption>JSDoc specialness</caption>\n * // JSDoc style\n * codeHere();\n *\n * @example <caption>JSDoc with braces</caption>\n * x.map(() => { return 1; })\n *\n * @example\n * ```ts\n * // TSDoc style\n * codeHere();\n * ```\n *\n * @example TSDoc name\n * ```ts\n * // TSDoc style\n * codeHere();\n * ```\n *\n * @example Bad {@link} name\n * ```ts\n * oops();\n * ```\n */\nexport const foo = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/excludeCategories.ts",
    "content": "/**\n * @category A\n */\nexport const a = 1;\n/**\n * @category A\n * @category B\n */\nexport const b = 1;\n/**\n * @category C\n */\nexport const c = 1;\nexport const d = 1;\n"
  },
  {
    "path": "src/test/converter2/behavior/excludeNotDocumentedKinds.ts",
    "content": "export interface NotDoc {\n    /** Doc */\n    prop: 123;\n\n    notDoc: 456;\n}\n\n/** Doc */\nexport function identity<T>(x: T): T {\n    return x;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/exportComments.ts",
    "content": "/** abc */\nconst abc = 123;\n\n/** export abc */\nexport { abc, abc as abcRef };\n\n/** foo */\nnamespace foo {\n    export const abc = 123;\n}\n\n/** export foo */\nexport { foo };\n"
  },
  {
    "path": "src/test/converter2/behavior/externalSymbols.ts",
    "content": "import { ParseLinkTitleResult, Token } from \"markdown-it\";\n\n/**\n * Testing custom external link resolution\n * {@link !Promise}\n */\nexport type P = Promise<string>;\n\nexport declare const T: Token;\nexport declare const Pr: ParseLinkTitleResult;\n"
  },
  {
    "path": "src/test/converter2/behavior/groupInheritance.ts",
    "content": "export interface Int {\n    /** @group Group */\n    prop: string;\n}\n\nexport class Cls implements Int {\n    prop = \"\";\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/groupTag.ts",
    "content": "/**\n * @groupDescription Variables\n * Variables desc\n * @groupDescription A\n * A description\n * @groupDescription With Spaces\n * With spaces desc\n * @module\n */\n\n/**\n * @group A\n */\nexport const A = 123;\n\n/**\n * @group A\n * @group B\n */\nexport const B = 123;\n\n/**\n * @group With Spaces\n */\nexport const C = 123;\n\n// no group\nexport const D = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/hiddenAccessor.ts",
    "content": "export class Test {\n    get x() {\n        return 1;\n    }\n\n    get y() {\n        return 1;\n    }\n    /** @hidden */\n    set y(v) {}\n\n    /** @hidden */\n    get z() {\n        return 1;\n    }\n\n    accessor auto!: string;\n\n    /** @hidden */\n    accessor autoHidden!: string;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/hideconstructor.ts",
    "content": "// https://github.com/TypeStrong/typedoc/issues/2577\n\n/** @hideconstructor */\nexport class StaticOnly {\n    static foo() {}\n\n    /** @hideconstructor */\n    notHidden = true;\n}\n\nexport class IgnoredCtor {\n    /** @hideconstructor */\n    constructor() {}\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/hierarchy.ts",
    "content": "export namespace MultipleInheritance {\n    export interface Foundation {}\n    export interface Base extends Foundation {}\n    export interface Branch extends Base {}\n    export interface Base2 {}\n    export interface Combined extends Branch, Base2 {}\n    export interface CombinedChild extends Combined {}\n    export interface CombinedChild2 extends Combined {}\n    export interface Base3 {}\n    export interface CombinedGrandchild extends CombinedChild2, Base3 {}\n    export interface DiamondDiamond extends CombinedChild, CombinedGrandchild {}\n}\n\nexport namespace Generics {\n    export interface Foundation<T> {}\n    export interface Base<TItem> extends Foundation<TItem> {}\n    export interface Item {}\n    export interface Child extends Base<Item[]> {}\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/highlightedProperties.ts",
    "content": "export type MyOptions = {\n    a: number;\n};\n\n/**\n * @param options Param comment\n * @param options.a Highlighted prop\n * @param options.c does not exist\n */\nexport function fn1(options: MyOptions) {}\n\ntype NotExported = {\n    a: number;\n};\n\n/**\n * @param options Param comment\n * @param options.a Highlighted prop\n * @param options.c does not exist\n */\nexport function fn2(options: NotExported) {}\n\nexport interface InterfaceRef {\n    a: string;\n}\n\n/**\n * @param options Param comment\n * @param options.a Highlighted prop\n * @param options.c does not exist\n */\nexport function fn3(options: InterfaceRef) {}\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/circularInclude.ts",
    "content": "/**\n * {@include includeTag.md#circular}\n */\nexport const circular = true;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/duplicateRegion.ts",
    "content": "// #region dupStart\n// #region dupStart\n// #endregion dupStart\n\n// #region dupEnd\n// #endregion dupEnd\n// #endregion dupEnd\n\n/**\n * {@includeCode duplicateRegion.ts#dupStart}\n * {@includeCode duplicateRegion.ts#dupEnd}\n * {@includeCode foldAndRegion.java#dup}\n */\nexport const includeWarnings = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/emptyRegion.ts",
    "content": "// #region empty\n// #endregion empty\n\n/** {@includeCode emptyRegion.ts#empty} */\nexport const emptyRegion = 1;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/foldAndRegion.java",
    "content": "// #region dup\na\n// #endregion dup\n\n// <editor-fold> dup\nb\n// </editor-fold> dup\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/includeInDoc.md",
    "content": "{@includeCode includeInDoc.md}\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/includeTag.md",
    "content": "<!-- #region test -->\n\nLine 3\n\n<!-- #endregion test -->\n\n<!-- #region empty -->\n\n<!-- #endregion empty -->\n\n<!-- #region circular -->\n\n{@include includeTag.md#circular}\n\n<!-- #endregion circular -->\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/includeTag.ts",
    "content": "/**\n * @document includeInDoc.md\n * @module\n */\n\n// #region a\nexport const a = 123;\n// #endregion a\n\n/**\n * {@includeCode includeTag.ts#a}\n */\nexport const region = 456;\n\n/**\n * {@includeCode includeTag.ts:7}\n */\nexport const line = 456;\n\n/**\n * {@include includeTag.md:3}\n */\nexport const lineText = 789;\n\n/**\n * {@include invalid.extension}\n */\nexport const fullFile = 321;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/includeTagDedent.ts",
    "content": "import { equal } from \"node:assert\";\n\n/**\n * {@includeCode includeTagDedent.ts#example}\n */\nexport declare function buildString(n: number): string;\n\nfunction doTest() {\n    // #region example\n    equal(buildString(3), \"123\");\n    equal(buildString(7), \"1234567\");\n    // #endregion example\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/includeTagMultipleRegions.ts",
    "content": "import { equal } from \"node:assert\";\n\n/**\n * {@includeCode includeTagMultipleRegions.ts#example,example2}\n */\nexport declare function buildString(n: number): string;\n\nfunction doTest() {\n    // #region example\n    equal(buildString(3), \"123\");\n    // #endregion example\n\n    {\n        // #region example2\n        equal(buildString(7), \"1234567\");\n        // #endregion example2\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/invalid.extension",
    "content": "Unknown extension doesn't support regions\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/invalidInclude.ts",
    "content": "/**\n * {@includeCode doesNotExist.txt}\n */\nexport const invalidInclude = true;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/invalidLineRanges.ts",
    "content": "/**\n * {@includeCode invalidLineRanges.ts:100-200}\n * {@includeCode invalidLineRanges.ts:200-100}\n * {@includeCode invalidLineRanges.ts:300}\n */\nexport const includeWarnings = 456;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/missingRegion.ts",
    "content": "// #region missingEnd\n// #endregion missingStart\n\n/**\n * {@includeCode missingRegion.ts#noRegion}\n * {@includeCode missingRegion.ts#missingStart}\n * {@includeCode missingRegion.ts#missingEnd}\n */\nexport const includeWarnings = 456;\n"
  },
  {
    "path": "src/test/converter2/behavior/includeTag/unsupportedExtension.ts",
    "content": "/**\n * {@includeCode invalid.extension#region}\n */\nexport const unsupportedExtension = true;\n"
  },
  {
    "path": "src/test/converter2/behavior/inferredPredicates.ts",
    "content": "export const isNumber = (x: unknown) => typeof x === \"number\";\n\nexport const isNonNullish = <T>(x: T) => x != null;\n"
  },
  {
    "path": "src/test/converter2/behavior/inheritDocBasic.ts",
    "content": "/**\n * Summary\n * @remarks Remarks\n * @typeParam T - Type parameter\n */\nexport interface InterfaceSource<T> {\n    /**\n     * Property description\n     */\n    property: T;\n\n    /**\n     * Method description\n     * @param arg arg description\n     */\n    someMethod(arg: number): T;\n}\n\n/**\n * @inheritDoc InterfaceSource\n */\nexport interface InterfaceTarget<T> {\n    /**\n     * @inheritDoc InterfaceSource.property\n     */\n    property: T;\n\n    /**\n     * @inheritDoc InterfaceSource.someMethod\n     *\n     * @example This should still be present\n     * ```ts\n     * someMethod(123)\n     * ```\n     */\n    someMethod(arg: number): T;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/inheritDocJsdoc.ts",
    "content": "/** Foo */\nexport class Foo {\n    /**\n     * Foo.member\n     * @param x Foo.member.x\n     */\n    member(x: number) {}\n}\n\n/** @inheritdoc */\nexport class Bar implements Foo {\n    /** @inheritdoc */\n    member(x: number) {}\n}\n\nexport class Baz extends Foo {\n    /** @inheritdoc */\n    override member(x: number): void {}\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/inheritDocRecursive.ts",
    "content": "/** @inheritDoc B */\nexport interface A {\n    a: string;\n}\n\n/** @inheritDoc C */\nexport interface B {\n    b: string;\n}\n\n/** @inheritDoc A */\nexport interface C {\n    c: string;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/inheritDocSignature.ts",
    "content": "// TS Discord March 24 2023 bug\n// See https://discord.com/channels/508357248330760243/829307039447515176/1088969324770897931\n\nexport class SigRef {\n    /** A */\n    method(): void;\n    /** B */\n    method(x: string): string;\n    method(x?: string) {\n        return x;\n    }\n\n    /** C */\n    prop = 2;\n\n    /** {@inheritDoc method} */\n    test1(): void;\n\n    /** {@inheritDoc method} */\n    test1(x: string): string;\n    test1(x?: string) {\n        return x;\n    }\n\n    /** {@inheritDoc prop} */\n    test2() {}\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/inheritDocWarnings.ts",
    "content": "/**\n * Source\n * @remarks Remarks\n */\nexport const source = 123;\n\nexport const source2 = 123;\n\n/**\n * Target summary\n * @inheritDoc source\n */\nexport const target1 = 123;\n\n/**\n * @inheritDoc source\n * @remarks Target remarks\n */\nexport const target2 = 123;\n\n/**\n * @inheritDoc doesNotExist\n */\nexport const target3 = 123;\n\n/**\n * @inheritDoc source2\n */\nexport const target4 = 123;\n\n/**\n * {@inheritDoc source:bad_label}\n */\nexport const badParse = 456;\n"
  },
  {
    "path": "src/test/converter2/behavior/inlineTag.ts",
    "content": "/** @inline */\ntype Foo = { inlined: true };\n\ntype Bar = { inlined: false };\n\n/** @inline */\ntype Complex<T> = { real: T; imag: T };\n\nexport function foo(param: Foo): Complex<number> {\n    return { real: 1.0, imag: 2.0 };\n}\n\nexport function genericInline<T>(): Complex<T> {\n    throw new Error();\n}\n\n// TypeNode, nested\nexport function bar(param: Record<string, Foo>) {}\n\n// TypeNode, prevented\n/** @preventInline Foo */\nexport function bar2(param: Record<string, Foo>) {}\n\nexport class Class {\n    // Type * 2\n    foo(param: Foo): Complex<number> {\n        return { real: 1.0, imag: 2.0 };\n    }\n\n    // Type, nested\n    bar(param: Record<string, Foo>) {}\n\n    // Type * 2 - prevented\n    /**\n     * @preventInline Foo\n     * @preventInline Complex\n     */\n    baz(param: Foo): Complex<number> {\n        return { real: 1.0, imag: 2.0 };\n    }\n}\n\n/** @inlineType Bar */\nexport function selectiveInline(bar: Bar) {\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/instantiationExpressions.ts",
    "content": "/**\n * Custom Set class, roughly equivalent to:\n * ```ts\n * export class StringSet extends Set<string> {}\n * ```\n *\n * Not quite the same, since the instantiation expression does not cause\n * a type to be created with the same name.\n */\nexport const StringSet = Set<string>;\n"
  },
  {
    "path": "src/test/converter2/behavior/lineComment.ts",
    "content": "// docs\nexport const a = 123;\n\n///// docs\n// with multiple lines\nexport const b = 123;\n\n/** no docs */\nexport const c = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/linkResolution.ts",
    "content": "export namespace Scoping {\n    // TypeScript / TypeDoc\n    /** {@link abc | def} */\n    export type abc = 1;\n\n    /** {@link abc} 2/2 */\n    export namespace Foo {\n        /** {@link abc} 2/2 */\n        export type abc = 2;\n\n        export function bar(): undefined;\n        export function bar(x: number): number;\n        export function bar(x?: number): number | undefined {\n            return x;\n        }\n    }\n\n    /** {@link abc} 1/1 */\n    export interface Bar {\n        /** {@link abc} 1/1 */\n        abc: 3;\n    }\n}\n\n/**\n * TS doesn't recognize any of these, and will link them to the namespace\n * {@link Meanings!A}\n * {@link Meanings!A:namespace}\n * {@link Meanings!A:enum}\n *\n * {@link A:class} doesn't exist, ts links to enum/ns, TypeDoc picks the enum\n * {@link B:class}\n *\n * {@link C:interface}\n * {@link D:type}\n * {@link E:function}\n * {@link F:var}\n *\n * {@link B:constructor}\n * {@link B:constructor(0)}\n * {@link B:constructor(1)}\n *\n * {@link A.A:member}\n * {@link B.prop:event} Don't use this. It doesn't work with TSDoc resolution but is required by the grammar.\n *\n * {@link E:call}\n * {@link E:call(1)}\n *\n * {@link B:new}\n * {@link B:new(1)}\n *\n * {@link B:index}\n * {@link G:complex}\n *\n * {@link E:1}\n * {@link B:0} Weird, but technically ok\n */\nexport namespace Meanings {\n    export enum A {\n        A,\n        B,\n    }\n    export namespace A {\n        export const a = 123;\n    }\n\n    export class B {\n        constructor();\n        constructor(x: number);\n        constructor(_?: number) {}\n\n        /** @event */\n        prop = 1;\n\n        [x: string]: number;\n    }\n\n    export interface C {}\n\n    export type D = 123;\n\n    export function E(): void;\n    export function E(x: number): number;\n    export function E(x?: number) {\n        return x;\n    }\n\n    export const F = 123;\n\n    export interface G {}\n    export namespace G {}\n}\n\n/**\n * {@link https://example.com}\n * {@link ftp://example.com}\n */\nexport namespace URLS {}\n\nexport const A = 1;\n\nexport namespace Globals {\n    /**\n     * {@link URLS!}\n     * {@link !A}\n     * {@link A}\n     */\n    export const A = 2;\n}\n\n/**\n * {@link Navigation~Child.foo}\n * {@link Navigation.Child#foo}\n * {@link Child~foo} bad\n */\nexport namespace Navigation {\n    export class Child {\n        /**\n         * {@link foo} Child.foo, not Child#foo\n         */\n        static foo() {}\n        foo = 456;\n    }\n}\n\n/**\n * {@link GH2808DeeplyNestedLink.prop.nested.here}\n */\nexport interface GH2808DeeplyNestedLink {\n    /** Prop docs */\n    prop: {\n        /** Nested docs */\n        nested: {\n            /** Here docs */\n            here: true;\n        };\n    };\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/linkResolutionErrors.ts",
    "content": "/**\n * {@link Map.size} TS resolves link, not included in docs #2700 #2967\n * {@link DoesNotExist} Symbol does not exist #2681\n * {@link @typedoc/foo.DoesNotExist} Symbol does not exist, looks like an attempt to link to a package directly #2360\n */\nexport const abc = new Map<string, number>();\n"
  },
  {
    "path": "src/test/converter2/behavior/linkResolutionTs.ts",
    "content": "export * from \"./linkResolution.js\";\n\nimport { A as AnotherName, Meanings } from \"./linkResolution.js\";\n\n/** {@link AnotherName | A!}{@link AnotherName A2!}{@link AnotherName} */\nexport const localSymbolRef = 1;\n\n/** {@link Meanings.B.prop | p} */\nexport const scoped = 2;\n"
  },
  {
    "path": "src/test/converter2/behavior/mergedDeclarations.ts",
    "content": "export namespace SingleCommentMultiDeclaration {}\n/** Comment on second declaration */\nexport namespace SingleCommentMultiDeclaration {}\n\n/** Comment 1 */\nexport namespace MultiCommentMultiDeclaration {}\n/** Comment 2 */\nexport namespace MultiCommentMultiDeclaration {}\n"
  },
  {
    "path": "src/test/converter2/behavior/namedTupleMembers.ts",
    "content": "export type PartiallyNamedTuple = [name: string, number];\n\nexport type PartiallyNamedTuple2 = [name?: string, number?];\n\nexport type PartiallyNamedTupleRest = [name?: string, ...number[]];\n\nexport const partiallyNamedTupleRest = {} as any as [\n    name?: string,\n    ...number[],\n];\n"
  },
  {
    "path": "src/test/converter2/behavior/noInfer.ts",
    "content": "export function createStreetLight<C extends string>(\n    colors: C[],\n    defaultColor?: NoInfer<C>,\n) {}\n\n// @ts-expect-error\ncreateStreetLight([\"red\", \"yellow\", \"green\"], \"blue\");\n"
  },
  {
    "path": "src/test/converter2/behavior/overloadTags.js",
    "content": "/**\n * @overload\n * @param {string} value first docs\n * @return {void}\n */\n\n/**\n * @overload\n * @param {number} value second docs\n * @param {number} [maximumFractionDigits] second docs\n * @return {void}\n */\n\n/**\n * @param {string | number} value impl docs\n * @param {number} [maximumFractionDigits] impl docs\n */\nexport function printValue(value, maximumFractionDigits) {}\n"
  },
  {
    "path": "src/test/converter2/behavior/overloads.ts",
    "content": "/**\n * No arg comment\n * {@label NO_ARGS}\n */\nexport function foo(): string;\n/**\n * {@inheritDoc foo:NO_ARGS}\n * {@label WITH_X}\n * @param x docs for x\n */\nexport function foo(x: string): number;\nexport function foo(x?: string): string | number {\n    return x == null ? \"\" : x.length;\n}\n\nexport function bar(): string;\n/**\n * Custom comment\n */\nexport function bar(x: string): string;\n/**\n * Implementation comment\n */\nexport function bar(x?: string) {\n    return x || \"\";\n}\n\n/**\n * {@label bad}\n */\nexport function badLabel() {}\n"
  },
  {
    "path": "src/test/converter2/behavior/readonlyTag.ts",
    "content": "export class Book {\n    /**\n     * Technically property has a setter, but for documentation purposes it should\n     * be presented as readonly.\n     * @readonly\n     */\n    get title(): string {\n        return \"hah\";\n    }\n\n    set title(_value: string) {\n        throw new Error(\"This property is read-only!\");\n    }\n\n    /**\n     * Should be documented as readonly because no consumer should change it.\n     * @readonly\n     */\n    author!: string;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/refusingToRecurse.ts",
    "content": "type OptionalKeys<T> = {\n    [K in keyof T]: T[K] extends { $opt: any } ? K : never;\n}[keyof T];\n\ntype FromSchema<T> = T extends typeof String ? string :\n    T extends readonly [typeof Array, infer U] ? FromSchema<U>[] :\n    & {\n        [K in OptionalKeys<T>]?: FromSchema<\n            (T[K] & { $opt: unknown })[\"$opt\"]\n        >;\n    }\n    & {\n        [K in Exclude<keyof T, OptionalKeys<T>>]: FromSchema<T[K]>;\n    };\n\nexport const schema = {\n    x: [\n        Array,\n        {\n            z: String,\n            y: { $opt: String },\n        },\n    ],\n} as const;\n\nexport type Schema = FromSchema<typeof schema>;\n\nexport const schemaTypeBased = null! as Schema;\n\nexport type ExpressionSpecification =\n    | [\"array\", unknown | ExpressionSpecification]\n    | [\n        \"array\",\n        string | ExpressionSpecification,\n        unknown | ExpressionSpecification,\n    ];\n\nexport class Map {\n    getFilter(layerId: string): ExpressionSpecification | void {\n        return;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/removeReflection.ts",
    "content": "export function foo(first: string, second: string, third: string) {\n    first;\n    second;\n    third;\n}\n\nexport function nested(a: 1 | { a; 1 }) {}\n\nexport interface Base {}\n/** @hidden */\nexport interface Hidden extends Base {}\nexport interface NotHidden extends Hidden {}\n\nexport class NotHiddenImpl implements Hidden {}\n"
  },
  {
    "path": "src/test/converter2/behavior/resolutionMode.ts",
    "content": "// Resolve `pkg` as if we were importing with a `require()`\nimport type { TypeFromRequire } from \"dual\" with { \"resolution-mode\": \"require\" };\n\n// Resolve `pkg` as if we were importing with an `import`\nimport type { TypeFromImport } from \"dual\" with { \"resolution-mode\": \"import\" };\n\nexport interface MergedType extends TypeFromRequire, TypeFromImport {}\n"
  },
  {
    "path": "src/test/converter2/behavior/router.ts",
    "content": "export interface Foo {\n    /** {@link Nested.refl} */\n    codeGeneration?: {\n        strings: boolean;\n        wasm: boolean;\n    };\n\n    iterator(options?: {\n        destroyOnReturn?: boolean;\n    }): AsyncIterableIterator<any>;\n}\n\n// `a` gets an anchor because it is directly within a type alias\n/** @category CustomCat */\nexport type Obj = { a: string };\n\n/** @group Abc/Group */\nexport const abc = { abcProp: { nested: true } };\n\n// `b` does NOT get an anchor as it isn't a direct descendent\nexport type ObjArray = { b: string }[];\n\nexport function Func(param: string): { noUrl: boolean } {\n    return { noUrl: !!param };\n}\n\n// Duplicate name with different case\nexport function func() {}\n\nexport namespace Nested {\n    /** {@link Foo.codeGeneration} */\n    export const refl = 1;\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/seeTags.ts",
    "content": "/**\n * @see Double tag\n * @see Second tag\n */\nexport const foo = 123;\n\n/**\n * @see Single tag\n */\nexport const bar = 123;\n"
  },
  {
    "path": "src/test/converter2/behavior/sortStrategyTag.ts",
    "content": "/** @sortStrategy source-order */\nexport namespace A {\n    export const b = 1;\n    export function c() {}\n    export const a = 2;\n}\n\n/** @sortStrategy alphabetical */\nexport namespace B {\n    export function c() {}\n    export const b = 1;\n    export const a = 1;\n}\n\n// Default is kind then alphabetical\nexport namespace C {\n    export const c = 1;\n    export function a() {}\n    export const b = 1;\n}\n\n/** @sortStrategy source-order */\nexport namespace D {\n    /** @category Cat */\n    export const b = 1;\n    /** @category Cat */\n    export const a = 1;\n    /** @category Cat */\n    export const c = 1;\n}\n\n/** @sortStrategy invalid, source-order, invalid2 */\nexport namespace E {}\n"
  },
  {
    "path": "src/test/converter2/behavior/thisType.ts",
    "content": "export class ThisClass {\n    // TypeDoc documents as returning `this`\n    returnThis(): this {\n        return this;\n    }\n\n    // TypeDoc documents as accepting `this`\n    paramThis(x: this) {}\n\n    // TypeDoc documents as containing `ThisClass`\n    prop!: this;\n\n    // TypeDoc documents as returning `ThisClass`\n    returnThisImplicit() {\n        return this;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/behavior/typeAliasInterface.ts",
    "content": "/**\n * Foo docs\n */\nexport type Foo = {\n    /**\n     * Foo.a docs\n     */\n    a: 123;\n    /**\n     * Foo.b docs\n     */\n    b: 456;\n};\n\n/**\n * Bar docs\n * @property a Bar.a docs\n * @interface\n */\nexport type Bar = {\n    [K in keyof Foo]: string;\n};\n"
  },
  {
    "path": "src/test/converter2/behavior/useDeclaredTypeTag.ts",
    "content": "function getData() {\n    return [{ abc: 123 }];\n}\n\n/** @useDeclaredType */\nexport type Data = ReturnType<typeof getData>;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1124.d.ts",
    "content": "export namespace GH1124 {\n    export type PrimitiveType = boolean | string | number | Date;\n}\n\nexport namespace GH1124 {\n    export const Value: string;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1150.ts",
    "content": "/**\n * Conditional type with infer\n */\nexport type PopFront<T extends any[]> = ((...args: T) => any) extends (\n    a: any,\n    ...r: infer R\n) => any ? R :\n    never;\n\nexport type IntersectFirst<T extends any[], R = {}> = {\n    0: R;\n    1: IntersectFirst<\n        PopFront<T>,\n        {\n            [K in keyof R | keyof T[0]]: K extends keyof R ? R[K] : T[0][K];\n        }\n    >;\n}[T[\"length\"] extends 0 ? 0 : 1];\n"
  },
  {
    "path": "src/test/converter2/issues/gh1164.ts",
    "content": "/** Function description\n *\n *  @param scope {@link CommentedClass} Test description.\n *  @returns Test description.\n */\nexport function gh1164(scope: string) {\n    return scope;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1215.d.ts",
    "content": "declare class Foo {\n    set bar(bar: string);\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1255.js",
    "content": "export class C {\n    constructor() {\n        /**\n         * Docs!\n         * @type {number}\n         */\n        this.foo = 123;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1261.ts",
    "content": "export class X {\n    /**\n     * Instantiates X.\n     * @param prop The property of X.\n     */\n    constructor(readonly prop: number) {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1330.ts",
    "content": "export type ExampleParam = Example;\nexport interface Example<T extends ExampleParam = ExampleParam> {}\n\ndeclare const makeExample: () => Example;\ndeclare const makeExample2: () => ExampleParam;\n\n// Recursive type when we don't have a type node.\nexport const testValue = makeExample();\nexport const testValue2 = makeExample2();\n\nexport type HasProp<T> = { key: T };\n\ndeclare const makeProp: <T>(x: T) => HasProp<T>;\nexport const testValue3 = makeProp(1);\n"
  },
  {
    "path": "src/test/converter2/issues/gh1366.d.ts",
    "content": "export interface Foo {\n    prop: number;\n}\n\nexport namespace GH1366 {\n    // This is only allowed in an ambient context.\n    export { Foo };\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1408.ts",
    "content": "export declare function foo<T extends unknown[]>(): T;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1436.d.ts",
    "content": "declare function gh1436(): void;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1449.ts",
    "content": "export function gh1449<T extends [foo: any, bar?: any]>(a: T): T {\n    return a;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1454.ts",
    "content": "export type Foo = string | number;\nexport type Bar = string | number;\n\nexport declare function bar(x: Bar): Bar;\nexport declare function foo(x: Foo): Foo;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1462.ts",
    "content": "const sideEffects = {\n    /** method docs */\n    method() {},\n    /** prop docs */\n    prop: 1,\n};\n\nexport const {\n    /** @function */\n    method: METHOD,\n    prop: PROP,\n} = sideEffects;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1481.js",
    "content": "class GH1481 {}\n/** static docs */\nGH1481.static = function () {};\n\nexports.GH1481 = GH1481;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1483.js",
    "content": "function gh1483() {}\ngh1483.namespaceExport = function () {};\nexports.gh1483 = gh1483;\n\n/** @class */\nfunction gh1483_2() {}\ngh1483_2.staticMethod = function () {};\nexports.gh1483_2 = gh1483_2;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1490.ts",
    "content": "export interface GH1490 {\n    /** With comment */\n    optionalMethod?(): void;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1509.ts",
    "content": "export interface Foo {\n    foo: number;\n}\n\nexport interface PartialFoo extends Partial<Foo> {}\nexport interface ReadonlyFoo extends Readonly<Partial<Foo>> {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1514.ts",
    "content": "export const UNIQUE_SYMBOL = Symbol();\n\nexport interface ComputedUniqueName {\n    [UNIQUE_SYMBOL]: string;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1522.ts",
    "content": "/** @category cat */\nexport declare function over(): string;\n/** @category cat */\nexport declare function over(x: number): number;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1524.d.ts",
    "content": "export function nullable(opt: ?string): void;\nexport function nonNullable(opt: !string): void;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1534.ts",
    "content": "export function gh1534(rt: readonly [number, string]) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1547.ts",
    "content": "export interface ThingA {\n    type: \"ThingA\";\n}\n\nexport interface ThingB {\n    type: \"ThingB\";\n}\n\ntype Things = ThingA | ThingB;\n\ntype ValueOrArray<T> = T | Array<ValueOrArray<T>>;\n\n/**\n * Test.\n */\nexport class Test {\n    /**\n     * Log a thing.\n     *\n     * @param things - Array of things or a thing.\n     */\n    log_thing(things: ValueOrArray<Things>): void {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1552.ts",
    "content": "export const emptyArr = [];\nexport const nonEmptyArr = [1];\nexport const emptyObj = {};\nexport const nonEmptyObj = { x: 1 };\n"
  },
  {
    "path": "src/test/converter2/issues/gh1578/ignored.ts",
    "content": "export const ignored = true;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1578/index.ts",
    "content": "export { ignored } from \"./ignored.js\";\nexport const notIgnored = true;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1580.ts",
    "content": "// Export order matters here. We want TypeDoc to process `B` before `A` so that the\n// implements plugin has to defer handling of `B`\n// dprint-ignore-next-line\nexport { B, A };\n\nclass A {\n    /** Prop docs */\n    prop!: string;\n\n    /** Run docs */\n    run(): void {}\n}\n\nclass B extends A {\n    declare prop: \"B\";\n\n    run(): void {\n        super.run();\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1624.ts",
    "content": "export interface Bar {\n    /** Some property style doc. */\n    baz: () => number;\n}\n\nexport class Foo implements Bar {\n    baz(): number {\n        return 0;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1626.ts",
    "content": "export class Foo {\n    constructor() {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1651.ts",
    "content": "/** bar */\nexport const bar = () => {};\n/** metadata */\nbar.metadata = \"baz\";\n/** fn */\nbar.fn = () => {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh1660.ts",
    "content": "declare const m: {\n    SomeClass: any;\n};\n\nexport type SomeType = typeof m.SomeClass.someProp;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1733.ts",
    "content": "/**\n * @typeParam T T docs\n */\nexport type Foo<T> = T;\n\n/**\n * @typeParam T T docs\n */\nexport class Bar<T> {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1734.ts",
    "content": "/**\n * @asdf Some example text\n */\nexport type Foo = (arg: string) => string;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1745.ts",
    "content": "/**\n * @category My category\n */\nexport type Foo<T, R> = (data: T) => R;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1770.ts",
    "content": "const api = (): {\n    sym1: () => number;\n    sym2: number;\n} => {\n    return null!;\n};\n\nexport const {\n    /**\n     * Docs for Sym1\n     * @function\n     */\n    sym1,\n\n    /**\n     * Docs for Sym2\n     */\n    sym2,\n} = api();\n"
  },
  {
    "path": "src/test/converter2/issues/gh1771.ts",
    "content": "export class Test {\n    method() {}\n}\n\nexport { Test as Test2 };\n\n/**\n * {@link Test2.method}\n */\nexport const check = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1795.ts",
    "content": "export default function foo() {}\nexport { foo };\n"
  },
  {
    "path": "src/test/converter2/issues/gh1804.js",
    "content": "/**\n * @param {number} [arg]\n */\nexport function foo(arg) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1875.ts",
    "content": "export declare function test(this: typeof globalThis, param: string): string;\n\nexport declare function test2(this, param: string): string;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1876.ts",
    "content": "/**\n * @param options.min Nested\n */\nexport function foo(options?: number | { min?: number }): number {\n    return 0;\n}\n\n/**\n * @param options.min Nested\n */\nexport function bar(options: { min: number; max: number } | { min: string }) {\n    return 0;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1880.d.ts",
    "content": "/**\n * This enumeration defines some values.\n *\n * @enum\n */\nexport declare const SomeEnum: {\n    /**\n     * This is the auto property.\n     */\n    readonly AUTO: \"auto\";\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh1896.js",
    "content": "/**\n * Before tag\n * @callback Type1 On Tag\n * @param {number} one Param 1\n * @param {number} two Param 2\n * @returns {number} Ret\n */\n\n/**\n * Before tag\n * @typedef {{(one: number, two: number): number}} Type2\n *\n * Some type 2.\n */\n\nexport const answer = 42;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1898.ts",
    "content": "/** I am documented, but the validator thinks otherwise. */\nexport type FunctionType = (foo: string) => string;\n\nexport type UnDocFn = (foo: string) => string;\n\n/** This docblock works fine. */\nexport class ExampleClass {\n    /** This wrongly complains about not being documented */\n    [Symbol.iterator]() {\n        return {\n            /** This also says it's not documented. */\n            index: 0,\n            /** This one too. */\n            next(): IteratorResult<number> {\n                return { done: false, value: this.index++ };\n            },\n        };\n    }\n\n    /**\n     * @hidden\n     */\n    [Symbol.asyncIterator]() {\n        return {\n            // This does _not_ complain, which is what I would expect.\n            index: 0,\n            // Even though it's not rendered in the final docs, it still complains\n            // that this isn't documented.\n            async next(): Promise<IteratorResult<number>> {\n                return { done: false, value: this.index++ };\n            },\n        };\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1903.ts",
    "content": "/**\n * @hidden\n */\nexport default () => {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh1903b.ts",
    "content": "/** @hidden */\nexport default 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1907/index.ts",
    "content": "export const foo = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1907/package.json",
    "content": "{}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1913.js",
    "content": "/**\n * @returns {[{ [key1: string]: number }, { [key2: string]: string }]} ret\n */\nexports.fn = () => [{ a: 42 }, { b: \"42\" }];\n"
  },
  {
    "path": "src/test/converter2/issues/gh1927.ts",
    "content": "export abstract class Base {\n    /**\n     * Base\n     */\n    abstract get getter(): string;\n}\n\nexport class Derived extends Base {\n    /**\n     * @inheritdoc\n     */\n    public get getter() {\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1942.ts",
    "content": "export enum Foo {\n    A,\n    B = Math.random(),\n}\n\nexport enum Bar {\n    C = \"C\",\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1961.ts",
    "content": "/** first */\n\n/** second */\nexport class WithDocs1 {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1962.ts",
    "content": "/**\n * Documented module\n * @module\n */\nexport function foo() {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1963.ts",
    "content": "/**\n * Module comment\n * @module\n */\n\n/**\n * Some code reproducing a bug.\n */\nexport const bug = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1967.ts",
    "content": "/**\n * @example\n */\nexport const abc = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1968.ts",
    "content": "export class Foo {\n    /** getter */\n    get x() {\n        return 1;\n    }\n    /** setter */\n    set x(value: number) {\n        throw new Error();\n    }\n}\n\nexport class Bar {\n    /** {@inheritDoc Foo.x} */\n    x = 1;\n    /** {@inheritDoc Foo.x:getter} */\n    y = 2;\n    /** {@inheritDoc Foo.x:setter} */\n    z = 3;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1973/a.ts",
    "content": "/**\n * A module\n * @module\n */\n\n/**\n * Comment for a\n */\nexport const a = () => \"a\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh1973/b.ts",
    "content": "/**\n * B module\n * @module\n */\n\n/**\n * Comment for b\n */\nexport const b = () => \"b\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh1973/index.ts",
    "content": "/**\n * A override\n */\nexport * as A from \"./a.js\";\n\n// No override\nexport * as B from \"./b.js\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh1980.ts",
    "content": "/**\n * {@link   http://example.com   }\n * {@link   http://example.com  |   with text}\n * {@link   http://example.com   jsdoc support}\n */\nexport const link = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1986.ts",
    "content": "/**\n * [[include:file.md]] this is not a link.\n */\nexport const a = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh1994.ts",
    "content": "/**\n * Has docs\n */\nexport function documented() {}\n\n/**\n * Some signatures with docs\n */\nexport function documented2(): void;\nexport function documented2(x: number): number;\nexport function documented2(x?: number) {\n    return x;\n}\n\nexport function notDocumented() {}\n\n/** Docs */\nexport class Docs {\n    /** Docs */\n    get x() {\n        return 1;\n    }\n    /** Docs */\n    set x(value: number) {\n        throw value;\n    }\n\n    /** Docs */\n    get y() {\n        return 2;\n    }\n    set y(value: number) {\n        throw value;\n    }\n\n    get z() {\n        return 3;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh1996.ts",
    "content": "export const a = () => {};\n\nexport function b() {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2008.ts",
    "content": "const makeFn = () => () => {};\n\n/** Docs @function */\nexport const myFn = makeFn();\n"
  },
  {
    "path": "src/test/converter2/issues/gh2011.ts",
    "content": "export class Component {}\n\ntype Constructor<T = Record<any, any>> = new (...args: any[]) => T;\n\nexport function Readable<TBase extends Constructor<Component>>(Base: TBase) {\n    abstract class Reader extends Base {}\n    return Reader;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2012.ts",
    "content": "export function model(): number {\n    return 1;\n}\nexport function Model(): string {\n    return \"\";\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2019.ts",
    "content": "export class A {\n    constructor(\n        /**\n         * Param comment\n         */\n        readonly property: string,\n    ) {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2020.js",
    "content": "// @ts-check\n\n/**\n * @typedef {Object} Options Desc\n * @property {string} url - Desc2\n * @property {string} [apiKey] - Desc3\n */\n"
  },
  {
    "path": "src/test/converter2/issues/gh2031.ts",
    "content": "export class MyClass {\n    /**\n     * {@link anotherMethod}\n     *\n     * @param aParam {@link anotherMethod}\n     */\n    aMethod(aParam: number) {}\n\n    anotherMethod() {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2033.ts",
    "content": "export namespace Foo {\n    export interface Bar {}\n}\n\n/** {@link Bar} */\nexport class Foo {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2036.ts",
    "content": "export declare const SingleSimpleCtor: {\n    new (a: string, b: string): Array<string>;\n};\n\nexport declare const MultipleSimpleCtors: {\n    new (a: string, b: string): Array<string>;\n    new (a: string, b: number): Array<string | number>;\n};\n\nexport const AnotherCtor = null! as new (a: string) => Object;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2042.ts",
    "content": "function factory() {\n    /** inner docs */\n    function fn() {}\n    return fn;\n}\n\n/** @function */\nexport const built = factory();\n\n/** outer docs @function */\nexport const built2 = factory();\n\nconst obj = {\n    /** inner docs */\n    fn(x: unknown) {},\n};\n\n/** @function */\nexport const fn = obj.fn;\n\n/**\n * outer docs\n * @param x param-docs\n * @function\n */\nexport const fn2 = obj.fn;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2044/index.js",
    "content": "export { other } from \"./other.js\";\n\n/** @typedef {import(\"./other.js\").Foo} Foo */\n/** @typedef {import(\"./other.js\").Foo} RenamedFoo */\n\n/**\n * @typedef {import(\"./other.js\").Generic<T>} Generic\n * @template {string} T\n */\n\n/**\n * @typedef {import(\"./other.js\").Generic<U>} RenamedGeneric\n * @template {string} U\n */\n\n/**\n * @typedef {import(\"./other.js\").Generic<string>} NonGeneric\n */\n"
  },
  {
    "path": "src/test/converter2/issues/gh2044/other.js",
    "content": "/** @typedef {string} Foo */\n\n/**\n * @typedef {T extends `a${infer F}` ? F : never} Generic\n * @template {string} T\n */\n\nexport const other = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2064.ts",
    "content": "export class PrivateCtorDecl {\n    constructor(private x = 123) {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2079.ts",
    "content": "export function capitalize<T extends string>(string: T) {\n    return (\n        string === \"\" ? \"\" : string[0].toUpperCase() + string.slice(1)\n    ) as Capitalize<T>;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2087.ts",
    "content": "/** Foo type comment */\nexport type Foo = () => number;\n\nexport class Bar {\n    /**\n     * {@inheritDoc Foo:type}\n     */\n    x = 1;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2106.ts",
    "content": "export function balance(address: string): Coin {\n    return {\n        amount: \"\",\n        denom: \"\",\n    };\n}\n\nexport interface Coin {\n    denom: string;\n    amount: string;\n}\n\nexport const Coin = {\n    thisIsAValue: true,\n};\n\nexport type TypeOf = typeof Coin;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2135.ts",
    "content": "export class Camera {\n    /** One */\n    static useCameraPermissions = createPermissionHook();\n}\n\n/** Two */\ndeclare function createPermissionHook(): () => void;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2150/index.ts",
    "content": "import * as Int from \"./int.js\";\n\ntype Int = typeof Int;\n\nexport interface FileInt extends Int {}\n\nexport class FileClass {}\nexport interface FileClass extends Int {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2150/int.ts",
    "content": "/** intFn doc */\nexport function intFn() {}\n\n/** intVar doc */\nexport const intVar = 123;\n\n/** constFn doc */\nexport const constFn = () => {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2156.ts",
    "content": "/**\n * Is documented\n */\nexport const foo = (foo: string): boolean => {\n    return true;\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2165.ts",
    "content": "/**\n * 'module' comment\n * @module\n */\n\nvar globalFile = true;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2175.ts",
    "content": "/**\n * `undefined` is special in that it has no declarations, so we can have\n * an export without any declarations so long as it is undefined.\n */\nexport default undefined;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2200.ts",
    "content": "declare function buildObj<T>(x: T): {\n    [K in keyof T]?: 1;\n};\n\nexport const Test = buildObj({ x: 1 });\n"
  },
  {
    "path": "src/test/converter2/issues/gh2207/index.ts",
    "content": "export * as Mod from \"./mod.js\";\nexport const a = 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2207/mod.ts",
    "content": "/**\n * Module doc for the `foo` module.\n *\n * @module\n */\n\n/**\n * Doc for the `foo` function.\n */\nexport function foo(): string {\n    return \"foo\";\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2220.ts",
    "content": "export class TypeEmitter<T, TOptions extends object = Record<string, never>> {}\n\nexport function createAssetEmitter<T, TOptions extends object>(\n    TypeEmitterClass: typeof TypeEmitter<T, TOptions>,\n): void {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2222.ts",
    "content": "/**\n * @example\n * let x = `str`\n */\nexport const example = 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2233.ts",
    "content": "export interface Int {\n    prop: () => string;\n    prop2: () => string;\n    method(): string;\n    method2(): string;\n}\n\nexport class IntImpl implements Int {\n    prop = () => \"\";\n    prop2() {\n        return \"\";\n    }\n    method = () => \"\";\n    method2() {\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2234.ts",
    "content": "export interface ReadonlyCharMap extends Iterable<string> {\n    at(x: number): string;\n}\n\nexport class CharMap implements ReadonlyCharMap {\n    at() {\n        return \"\";\n    }\n\n    *[Symbol.iterator](): Iterator<string> {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2270.ts",
    "content": "/**\n * Flagging all state references as {@link Immutable} guides IDEs to treat these\n * as {@link https://en.wikipedia.org/wiki/Immutable_object | Immutable Objects}\n * to avoid programming errors.\n */\nexport const A = 123;\n\nexport type Immutable = readonly [];\n"
  },
  {
    "path": "src/test/converter2/issues/gh2290.ts",
    "content": "/** Int comment */\nexport interface CallSignature {\n    /** Sig comment */\n    (x: string): void;\n}\n\n/** Int comment */\nexport interface CallSignature2 {\n    /** Sig comment */\n    (x: string): void;\n\n    /** Prop comment */\n    prop: 123;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2291.ts",
    "content": "/**\n * Parses a JSON string to the specified type.\n */\nexport function safeParse<T>(\n    guard: (o: unknown) => o is T,\n    json: string,\n): T | undefined {\n    try {\n        const o = JSON.parse(json) as unknown;\n        return guard(o) ? o : undefined;\n    } catch {\n        return undefined;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2296.ts",
    "content": "export type HasNames = { names: readonly string[] };\nexport function getNamesExactly<const T extends HasNames>(arg: T): T[\"names\"] {\n    //                       ^^^^^\n    return arg.names;\n}\n\n// Inferred type: readonly [\"Alice\", \"Bob\", \"Eve\"]\n// Note: Didn't need to write 'as const' here\nexport const names = getNamesExactly({ names: [\"Alice\", \"Bob\", \"Eve\"] });\n"
  },
  {
    "path": "src/test/converter2/issues/gh2307.ts",
    "content": "const times = (b: number) => (a: number) => a * b;\n\n/** @function */\nexport const double = times(2);\n\nexport const foo = () => 123;\n\n/** @function */\nexport const all: {\n    <T>(fn: (item: T) => boolean, iterator: Iterable<T>): boolean;\n    <T>(fn: (item: T) => boolean): (iterator: Iterable<T>) => boolean;\n} = () => false as any;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2320.ts",
    "content": "export type BaseUnionMember = {\n    type: string;\n};\n\nexport type Union =\n    | {\n        type: \"one\";\n    }\n    | {\n        type: \"two\";\n    };\n\nexport class GenericClass<U extends BaseUnionMember> {\n    public arrowFunction = <MemberType extends U[\"type\"]>(\n        member: Extract<U, { type: MemberType }>,\n    ) => {};\n\n    public classFunction<MemberType extends U[\"type\"]>(\n        member: Extract<U, { type: MemberType }>,\n    ) {}\n}\n\nexport class ResolvedSubclass extends GenericClass<Union> {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2336.ts",
    "content": "export class ClassVersion {\n    /**\n     * Outer\n     * @returns Returns Outer\n     */\n    outer(): () => void {\n        /**\n         * Inner\n         * @returns Returns Inner\n         */\n        return () => {};\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2360.ts",
    "content": "export class Foo {\n    bar = 1;\n}\n\n/**\n * {@link Foo#bar}\n */\nexport const x = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2364.ts",
    "content": "/**\n * @namespace\n */\nexport let NS = {\n    property: \"blah\",\n};\n\nexport namespace NS {\n    export type T = string;\n}\n\nexport type NS2 = { foo: string };\n\n/**\n * @namespace\n */\nexport const NS2 = {\n    property: \"blah\",\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2372.ts",
    "content": "/**\n * The signature for a function acting as an event handler.\n * @param e Param should work\n */\nexport type EventHandler = (e: Event) => void;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2384.js",
    "content": "/**\n * @typedef {Int8Array | Uint8Array} TypedArray\n * A union type representing all possible TypedArrays.\n */\n\n/**\n * @template {TypedArray} [T = Typed<TypedArray>] desc\n * @typedef {T} Typed A generic type representing a TypedArray.\n */\n\nexport {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2389.js",
    "content": "/**\n * @template {string} T, U\n * @param {T} x\n * @param {U} y\n */\nexport function foo(x, y) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2401.d.ts",
    "content": "/**\n * Comment for module\n * @module foo:bar\n */\ndeclare module \"foo:bar\" {\n    export function doSomething(a: any): void;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2414.ts",
    "content": "export interface ObjectWithIndexSignature {\n    /** Index comment. */\n    [x: string]: any;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2430.js",
    "content": "/**\n * @param {object} props\n * @param {any} props.value Value\n * @param {any} props.trueValue True default\n * @param {any} props.falseValue False default\n */\nexport const Checkbox = ({\n    value,\n    trueValue = true,\n    falseValue: renamed = false,\n}) => {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2436.ts",
    "content": "/** The FOO function */\nfunction foo() {\n    return \"foo\";\n}\n\nfunction bugInner(): { foo: string } {\n    return { foo: \"bar\" };\n}\n\n/** @function */\nexport const bug: {\n    (): { foo: string };\n    foo: typeof foo;\n    bar: 42;\n} = Object.assign(bugInner, {\n    foo,\n    bar: 42 as const,\n});\n"
  },
  {
    "path": "src/test/converter2/issues/gh2437.ts",
    "content": "export interface TemplatedTypeBase {\n    /**\n     * Doc here\n     */\n    prop?: string[];\n}\n\nexport interface One extends TemplatedTypeBase {}\n\nexport interface Two extends TemplatedTypeBase {}\n\nexport type Type = One | Two;\n\nexport function isTemplateInstance(\n    type: Type,\n): type is Type & { prop: string[] } {\n    return true;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2438.d.ts",
    "content": "// This only produces no errors because of skipLibCheck\nexport interface Bad {\n    badCode: true;\n}\n\nexport type { Bad };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2444.ts",
    "content": "function Comparable<T>(impl: { compare(a: T, b: T): number }) {\n    return {\n        ...impl,\n\n        equal(a: T, b: T) {\n            return impl.compare(a, b) === 0;\n        },\n    };\n}\n\nconst BooleanComparable = Comparable<boolean>({\n    compare(a, b) {\n        return +a - +b;\n    },\n});\n\n/** @namespace */\nexport const Boolean = {\n    ...BooleanComparable,\n    hasInstance(value: unknown): value is boolean {\n        return typeof value === \"boolean\";\n    },\n};\n\nconst NumberComparable = Comparable<number>({\n    compare(left, right) {\n        return left === right ? 0 : left < right ? -1 : 1;\n    },\n});\n\n/** @namespace */\nexport const Number = {\n    ...NumberComparable,\n    hasInstance(value: unknown): value is number {\n        return typeof value === \"number\";\n    },\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2451.ts",
    "content": "export type Foo = FooA | FooB;\n\nexport interface BaseFoo<T extends string> {\n    type: T;\n\n    is<Type extends string>(\n        type: Type,\n    ): this is Foo & {\n        type: Type;\n    };\n}\n\nexport interface FooA extends BaseFoo<\"A\"> {}\n\nexport interface FooB extends BaseFoo<\"B\"> {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2466.ts",
    "content": "// Conversion order test for @link\n\nexport interface One extends Two {}\n\n/** {@link method1} */\nexport interface Two {\n    method1(): string;\n}\n\n/** {@link method2} */\nexport interface Three {\n    method2(): string;\n}\n\nexport interface Four extends Three {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2476.ts",
    "content": "declare function test(options?: test.Options): void;\n\ndeclare namespace test {\n    /** Test options */\n    interface Options {\n        a: string;\n        b: number;\n    }\n}\n\nexport { test };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2478.ts",
    "content": "/** @function */\ndeclare const test: (options?: test.Options) => void;\n\ndeclare namespace test {\n    interface Options {\n        a: string;\n        b: number;\n    }\n}\n\nexport { test };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2495.ts",
    "content": "export interface IAnimal {\n    name: number;\n}\n\nexport interface IFish extends IAnimal {\n    maxDepth: number;\n}\n\nexport class IFish implements IFish {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2496.ts",
    "content": "export function f() {\n    return 1;\n}\n\n/** doc */\nexport type ReturnOfF = ReturnType<typeof f>;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2502.ts",
    "content": "// A future TS version might change this so that numbers are hardcoded\n// to show up in a specific order. As of TS 5.3.3, this makes the union display\n// as 3 | 1 | 2.\ntype WeirdOrder = [1, 2, 3][number];\n//   ^?\n\nexport const Test = null! as WeirdOrder;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2507.ts",
    "content": "export interface Value {\n    values: Value[];\n}\n\nexport function fromPartial<I extends Exact<Value, I>>(object: I): void {\n    throw 1;\n}\n\nexport type Exact<P, I extends P> = P extends P ? P & { [K in keyof P]: Exact<P[K], I[K]> } :\n    never;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2508.ts",
    "content": "export enum Color {\n    BLUE = \"Blue\",\n    RED = \"Red\",\n}\n\ntype TypeOf<T> = {\n    [K in keyof T]: T[K][keyof T[K]];\n};\n\ntype Foo = {\n    color: typeof Color;\n};\n\n/** @interface */\nexport type Bar = TypeOf<Foo>;\n//          ^?\n"
  },
  {
    "path": "src/test/converter2/issues/gh2509.ts",
    "content": "export interface Int {\n    /** Cb */\n    cb: () => Promise<any>;\n\n    nested: {\n        /** Cb2 */\n        cb: () => any;\n    };\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2521.d.ts",
    "content": "/**\n * Original comment.\n */\nexport interface Foo {\n    /** Overload 1 */\n    (): void;\n    /** Overload 2 */\n    (baz: number): void;\n}\n\n// Inherits overload comments, but not Foo comment\n// Foo comment could be inherited with {@inheritDoc Foo}\n/** @function */\nexport const fooWithoutComment: Foo;\n\n/**\n * New comment.\n * @function\n */\nexport const fooWithComment: Foo;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2524.ts",
    "content": "export type Alias = {\n    /** {@link Alias.other} {@link other} */\n    readonly default: string;\n    /** {@link Alias.default} {@link default} */\n    readonly other: string;\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2545.ts",
    "content": "/** Parent docs */\nabstract class Parent {\n    /** notAbstract docs  */\n    notAbstract(): void {}\n    /** notAbstract2 docs */\n    notAbstract2(): void {}\n    /** isAbstract docs */\n    abstract isAbstract(): void;\n    /** abstractProperty docs */\n    abstract abstractProperty: string;\n}\n\nexport class Child extends Parent {\n    override notAbstract2(): void {}\n    override isAbstract(): void {}\n\n    override abstractProperty = \"\";\n}\n\n// #2084\nexport class Foo {\n    /** @internal*/\n    isInternal() {}\n}\n\nexport class Bar extends Foo {\n    isInternal() {} // also internal\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2552.js",
    "content": "/**\n * Summary\n * @license MIT\n *\n * Full permission notice.\n */\n\n// TS 5.5 @import comments\n/** @import ts from \"typescript\" */\n\n/**\n * This is an awesome module.\n * @module good-module\n */\n\n/** @import ts2 from \"typescript\" */\nexport const something = 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2553.ts",
    "content": "/**\n * Constructor.\n *\n * @param args - Constructor arguments.\n * @returns New instance.\n */\nexport type Constructor = new (...args: any[]) => object;\n\n/**\n * Typed constructor.\n *\n * @typeParam T - Class type.\n * @param args - Constructor arguments.\n * @returns New instance.\n */\nexport type TypedConstructor<T> = new (...args: any[]) => T;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2555.ts",
    "content": "/**\n * @param props - Component properties.\n * @param props.title - Title.\n * @param props.options - Options.\n * @param props.options.featureA - Turn on or off featureA.\n * @param props.options.featureB - Turn on or off featureB.\n */\nexport function ComponentWithOptions({\n    title,\n    options,\n}: {\n    title: string;\n    options: { featureA: boolean; featureB: boolean };\n}) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2574/default.ts",
    "content": "/**\n * Default export and class implementation\n */\nexport default class DefaultExport {\n    constructor() {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2574/index.ts",
    "content": "import { Default, NotDefault } from \"./reexported\";\n\nexport function usesDefaultExport(param: Default) {}\n\nexport function usesNonDefaultExport(param: NotDefault) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2574/notDefault.ts",
    "content": "export class NotDefaultExport {\n    constructor() {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2574/reexported.ts",
    "content": "export { default as Default } from \"./default\";\nexport { NotDefaultExport as NotDefault } from \"./notDefault\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh2582.ts",
    "content": "function getApi<T>(Ctor: new () => T) {\n    return {\n        /** Member comment */\n        member: 1,\n        /** Fn comment */\n        fn: () => new Ctor(),\n    };\n}\n\nfunction getAPIs<T1, T2>(Ctor1: new () => T1, Ctor2: new () => T2) {\n    const a = getApi(Ctor1);\n\n    return {\n        /** A comment @namespace*/\n        a,\n        /** B comment @namespace */\n        b: getApi(Ctor2),\n    };\n}\n\n/** f32 comment @namespace */\nexport const f32 = getAPIs(Float32Array, Float64Array);\n"
  },
  {
    "path": "src/test/converter2/issues/gh2585.ts",
    "content": "// dprint-ignore\n\nexport type Foo =\n    /**\n     * Doc of foo1.\n     */\n    | \"foo1\"\n    /** Not used */\n    |\n    /**\n     * Doc of foo2.\n     */\n    \"foo2\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh2587.ts",
    "content": "export function foo() {\n    const x = 1;\n    return {\n        /**\n         * Shorthand comment\n         */\n        x,\n    };\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2603.ts",
    "content": "/**\n * @author Ian Awesome\n */\nexport const x = 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2611.d.ts",
    "content": "/**\n * @tagThatIsNotDefined\n */\nexport var num: number;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2614.ts",
    "content": "/**\n * @since 1.0.0\n */\nexport function foo() {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2631/crlf.md",
    "content": "---\r\ntitle: \"Windows Line Endings\"\r\n---\r\n\r\nThis file contains CRLF line endings\r\n"
  },
  {
    "path": "src/test/converter2/issues/gh2631/index.ts",
    "content": "/**\n * @module\n * @document crlf.md\n */\nexport const a = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2634.ts",
    "content": "/**\n * @param a - Number param.\n */\nexport function hidden(a: number): void;\n\n/**\n * @param a - String param.\n */\nexport function hidden(a: string): void;\n\n/** @hidden */\nexport function hidden(a: string | number): void {\n    console.log(a);\n}\n\n/** @hidden */\nexport function implicitlyHidden(x: string): void;\n/** @hidden */\nexport function implicitlyHidden(x: number): void;\nexport function implicitlyHidden() {}\n\n/** @hidden */\nexport const hiddenVariableFunc = () => 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2636.ts",
    "content": "export abstract class A {\n    protected constructor(a: number) {\n        this.a = a;\n    }\n\n    /** a prop @hidden */\n    public readonly a: number;\n}\n\nexport class B extends A {\n    /** @param a a comment */\n    public constructor(a: number) {\n        super(a);\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2638/empty.md",
    "content": ""
  },
  {
    "path": "src/test/converter2/issues/gh2638/index.ts",
    "content": "/**\n * @module\n * @document empty.md\n */\nexport const a = 123;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2644.ts",
    "content": "/**\n * Lambda docs\n * @param value - Value.\n */\nexport const voidLambda = (value: unknown): void => {\n    // ...\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2683.ts",
    "content": "export declare function action(\n    /**\n     * Param comment\n     * @param data - Data\n     */\n    callback: (data: {}) => void,\n): void;\n\n/**\n * @param callback Param comment2\n */\nexport declare function action2(\n    /**\n     * @param data - Data2\n     */\n    callback: (data: {}) => void,\n): void;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2693.ts",
    "content": "export abstract class Foo {\n    abstract foo(): void;\n\n    abstract x: number;\n}\n\n/** @abstract */\nexport class Bar {\n    /** @abstract */\n    foo() {}\n\n    /** @abstract */\n    x!: number;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2698.ts",
    "content": "type Square = {\n    color: \"red\" | \"blue\" | \"green\";\n};\n\ntype TAnimator = {\n    (\n        this: Square,\n        numSpins: number,\n        direction: \"clockwise\" | \"counterclockwise\",\n    ): string;\n};\n\nexport const animator = function (\n    numSpins: number = 2,\n    direction: \"clockwise\" | \"counterclockwise\" = \"counterclockwise\",\n) {\n    console.log(this.color, numSpins, direction);\n    return \"Hello World\";\n} satisfies TAnimator;\n\nanimator.call({ color: \"blue\" }, 77);\n"
  },
  {
    "path": "src/test/converter2/issues/gh2700.ts",
    "content": "/**\n * {@link Map.size | size user specified}\n * {@link Map.size user specified}\n * {@link Map.size}\n */\nexport const abc = new Map<string, number>();\n"
  },
  {
    "path": "src/test/converter2/issues/gh2704.ts",
    "content": "export type Foo = Bar<123>;\n\n/** @ignore */\nexport type Bar<T> = T extends 123 ? true : false;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2718.ts",
    "content": "/** First */\nexport function foo(fatal: true): string;\nexport function foo(fatal: false): string | undefined;\n/** Third */\nexport function foo(fatal: string): string | undefined;\nexport function foo(fatal: unknown): string | undefined {\n    return \"\";\n}\n\nexport declare class Foo {\n    /** First */\n    bar(): string;\n    bar(x: string): number;\n    /** Third */\n    bar(x: number): number;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2719.ts",
    "content": "export const allTimezoneNames = [\"Africa/Abidjan\", \"Africa/Accra\"] as const;\n\nexport type ArrayElement<ArrayType extends ReadonlyArray<any>> = ArrayType[number];\n\nexport type Timezone = ArrayElement<typeof allTimezoneNames>;\n\n/**\n * @enum\n */\nexport const Timezone = allTimezoneNames.reduce(\n    (acc, timezoneName) => {\n        acc[timezoneName] = timezoneName;\n        return acc;\n    },\n    {} as Record<string, string>,\n) as Readonly<\n    {\n        [SpecificTimezoneName in Timezone]: SpecificTimezoneName;\n    }\n>;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2721.ts",
    "content": "export const big = 123n;\n\nexport const neg = -123n;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2725.ts",
    "content": "import { Node } from \"typescript\";\n\n/**\n * {@link Node}\n */\nexport const node = true;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2755.ts",
    "content": "export interface Test {\n    /** A */\n    method(a: string): boolean;\n\n    /** B */\n    method(a: number): number;\n}\n\nexport class Class implements Test {\n    method(a: string): boolean;\n    method(a: number): number;\n    method(a: string | number): number | boolean {\n        if (typeof a === \"string\") {\n            return false;\n        }\n        return 1;\n    }\n}\n\nexport interface MultiCallSignature {\n    /** A */\n    (): string;\n    /** B */\n    (x: string): string;\n}\n\n/** @function */\nexport const Callable: MultiCallSignature = () => \"\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh2774/gh2774.ts",
    "content": "namespace GH2774 {\n    export interface Extensions {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2774/globalAugment.ts",
    "content": "namespace GH2774 {\n    export interface Extensions {\n        globalAugment: string;\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2774/moduleAugment.ts",
    "content": "export {};\n\ndeclare global {\n    namespace GH2774 {\n        export interface Extensions {\n            moduleAugment: string;\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2778.ts",
    "content": "declare module \"common\" {\n    export class Base {}\n}\ndeclare module \"foo/bar1\" {\n    import { Base } from \"common\";\n    export class Bar1 extends Base {}\n}\ndeclare module \"foo/bar2\" {\n    import { Base } from \"common\";\n    export class Bar2 extends Base {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2779.ts",
    "content": "declare module \"bar\" {\n    export namespace Nested {\n        export interface Bar {}\n    }\n}\ndeclare module \"foo\" {\n    export type Foo = import(\"bar\").Nested.Bar;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2792.ts",
    "content": "export type TypeNodeType = {\n    // @ts-expect-error\n    generated: import(\"@typedoc/dummy\").GeneratedType;\n};\n\n// @ts-expect-error\nexport const typeType = null! as import(\"@typedoc/dummy\").GeneratedType;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2800.ts",
    "content": "/**\n * Module docs\n * {@includeCode ./gh2800.ts}\n * @module\n */\nexport const bug = true;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2802.ts",
    "content": "/**\n * Docs\n * @alpha\n */\nexport type AlphaOk = number | string;\n\n/**\n * Docs2\n * @alpha\n */\nexport type AlphaNoGo = (arg: number | string) => void;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2811.ts",
    "content": "export const abc = 123;\n\nexport { abc as rename1 };\n\nimport { rename1 } from \"./gh2811.js\";\nexport { rename1 as rename2 };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2817.ts",
    "content": "export interface Edges<T extends string> {\n    (): string;\n    (x: string): void;\n    new (): Object;\n\n    prop: string;\n    get getter(): T;\n\n    [index: string]: string;\n}\n\n// Should render similarly to Edges\nexport type Edges2<T extends string> = {\n    (): string;\n    (x: string): void;\n    new (): Object;\n\n    prop: string;\n    get getter(): T;\n\n    [index: string]: string;\n};\n\nexport type NotLifted = () => string;\n\nexport type Ctor = new () => string;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2820.ts",
    "content": "export function f(a: Uint8Array): Uint8Array {\n    return a;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2823.ts",
    "content": "export interface T<A, B = number, C = string> {\n    a: A;\n    b: B;\n    c: C;\n}\n\nexport function f0(a: T<number, number, boolean>): T<number, number, boolean> {\n    return a;\n}\n\nexport function f1(a: T<string>): T<string> {\n    return a;\n}\n\nexport function f2(a: T<number>): T<number> {\n    return a;\n}\n\nexport function f3(a: T<number, number>): T<number, number> {\n    return a;\n}\n\nexport function f4(a: T<number, string>): T<number, string> {\n    return a;\n}\n\nexport function f5(a: T<string, string>): T<string, string> {\n    return a;\n}\n\nexport function f6(a: T<number, string, string>): T<number, string, string> {\n    return a;\n}\n\nexport function f7(a: T<number, number, string>): T<number, number, string> {\n    return a;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2842.ts",
    "content": "declare function defineComponent<\n    T extends Record<string, () => any>,\n    U extends Record<string, any>,\n>(component: {\n    computed: T;\n    props: U;\n}): new () => U & { [K in keyof T]: ReturnType<T[K]> };\n\n/** @class */\nexport const ComputedClass = defineComponent({\n    computed: {\n        hello() {\n            return \"hello\";\n        },\n    },\n    props: {\n        name: \"world\",\n    },\n});\n"
  },
  {
    "path": "src/test/converter2/issues/gh2844.ts",
    "content": "export {};\n\ndeclare global {\n    namespace globalThis {\n        interface URL {\n            customMethod(): string;\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2856.ts",
    "content": "export namespace A {\n    export const definedInA = true;\n    export import definedInB = B.definedInB; // Alias\n}\n\nexport namespace B {\n    export import definedInA = A.definedInA; // Alias\n    export const definedInB = true;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2876.ts",
    "content": "export function MyComponent(props: MyComponent.Props) {\n    return;\n}\n\nexport namespace MyComponent {\n    export interface Props {\n        children?: {};\n    }\n}\n\nMyComponent.propTypes = {\n    children: {},\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2881.ts",
    "content": "export interface Callable {\n    (): string;\n}\n\nexport const fnByDefault = () => \"\";\n\nexport const notFn: Callable = () => \"\";\n\n/** @function */\nexport const fnByTag: Callable = () => \"\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh2909.js",
    "content": "module.exports = [];\n"
  },
  {
    "path": "src/test/converter2/issues/gh2914.ts",
    "content": "/**\n * Description\n * @class\n * @category Bug\n */\nexport declare const Bug1: new () => { x: string };\n\n/** @class */\nexport declare const Bug2: new (x: string) => {};\n\n/** @class */\nexport declare const Bug3: new <T extends string>() => {\n    x: T;\n};\n\n/** @class */\nexport declare const Bug4: new <T extends () => U, U extends string>(x: T) => T;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2916.js",
    "content": "/**\n * @typedef {object} HelloProps {@inline}\n * @property {string} name Name property docs\n */\n\n/**\n * @param {HelloProps} props\n */\nexport function hello(props) {\n    return \"Hello {props.name}!\";\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2917.ts",
    "content": "export interface Foo {\n    data: {\n        [key: string]: any;\n    };\n    mixed: {\n        (): string;\n        a: string;\n        [key: string]: any;\n    };\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2920.ts",
    "content": "type EndpointIdentifier = \"main\" | \"test\";\n\n/**\n * @inlineType EndpointIdentifier\n */\nexport function test(endpoint: EndpointIdentifier) {}\n\ntype InlinedConditional<T> = T extends string ? 1 : 2;\n\n/** @inlineType InlinedConditional */\nexport type NotInlined = InlinedConditional<string>;\n\n/** @inline */\ntype StrArr = string[];\n\nexport type InlineArray = StrArr;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2929.js",
    "content": "/**\n * @template {number} [T=1]\n */\nexport class NumberManager {\n    /**\n     * @param {T[]} nums\n     */\n    constructor(nums) {}\n}\n\n/**\n * @template {number} A, B\n */\nexport class EdgeCases {\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2932.ts",
    "content": "/**\n * @inline\n */\ntype Vector2D = [start: number, end: number];\n\nexport function doStuff([start, end]: Vector2D) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2937/index.ts",
    "content": "export const excluded = true;\nexport { notExcluded } from \"./not-excluded.js\";\n"
  },
  {
    "path": "src/test/converter2/issues/gh2937/not-excluded.ts",
    "content": "export const notExcluded = true;\n"
  },
  {
    "path": "src/test/converter2/issues/gh2949.js",
    "content": "/**\n * @callback Test\n * @returns {Promise<*>}\n */\nexport {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh2954.ts",
    "content": "export type AliasA = Readonly<Record<string, string>>;\n\nexport type AliasB<T> = Readonly<Record<string, T>>;\n\nexport type AliasC = Readonly<{}>;\n\nexport interface InterfaceA {\n    propertyA: AliasA;\n    propertyB: AliasB<string>;\n    propertyC: AliasC;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2962.ts",
    "content": "class Class {\n    msg: string;\n\n    constructor(msg: string) {\n        this.msg = msg;\n    }\n}\n\nconst Var = 123;\n\nfunction Func<T>(a: T) {}\n\nexport { type Class, type Func, type Var };\n\nclass Class2 {}\nconst Var2 = 123;\nfunction Func2() {}\nexport type { Class2, Func2, Var2 };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2964.d.ts",
    "content": "declare module \"*.gh2964\" {\n    export const data: \"string\";\n}\n\n/** @ignore */\nexport { data as first } from \"test.gh2964\";\n/** @ignore */\nexport { data as second } from \"test.gh2964\";\n\n/** Comment on variable */\nconst third: \"not ignored\";\n/** @ignore -- does not work as third has a comment */\nexport { third };\n\nconst fourth: \"ignored\";\n/** @ignore -- works as fourth does not have a comment */\nexport { fourth };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2970.ts",
    "content": "/** Comment */\nclass Class {}\n\n/** Comment */\nconst Var = 123;\n\n/** Comment */\nfunction Func() {}\n\nexport type { Class, Func, Var };\n"
  },
  {
    "path": "src/test/converter2/issues/gh2978.ts",
    "content": "export interface Parent {\n    prop: string;\n}\n\nexport interface Child extends Partial<Parent> {}\n\nexport type Tricky<T> = Omit<T, \"x\"> & { x: number };\n\nexport interface HasX {\n    x: string;\n}\n\nexport interface InheritsX extends Tricky<HasX> {\n    // InheritsX.x should *not* be linked to HasX.x\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2994.d.ts",
    "content": "/**\n * {@link x} <-- should be resolved with TS resolution\n * @packageDocumentation\n */\n\n/** Required comment */\nimport { x } from \"gh2994\";\n\nexport var y: 2;\n\ndeclare module \"gh2994\" {\n    var x: 1;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh2999.ts",
    "content": "/**\n * A test object with property a.\n */\nconst LocalObject = {\n    a: 1,\n};\n\nexport const Options = {\n    LocalObject,\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh3003/enums.ts",
    "content": "/**\n * This is a custom enum that is exported as a constant object.\n *\n * @enum\n */\nexport const CustomEnum = {\n    /** A */\n    A: \"A\",\n} as const;\n"
  },
  {
    "path": "src/test/converter2/issues/gh3003/index.ts",
    "content": "import { CustomEnum } from \"./enums.js\";\n\n/**\n * This is a second custom enum that is exported as a constant object.\n *\n * @enum\n */\nconst CustomEnum2 = {\n    ...CustomEnum,\n    D: \"D\",\n} as const;\n\n/** @namespace */\nexport const ExportedObject = {\n    CustomEnum,\n    CustomEnum2,\n};\n"
  },
  {
    "path": "src/test/converter2/issues/gh3006/index.ts",
    "content": "/**\n * @document two words.md\n * @module\n */\n\n/**\n * [link](./two%20words.md)\n */\nexport const x = 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh3006/two words.md",
    "content": "This document's name contains a space, #3006\n"
  },
  {
    "path": "src/test/converter2/issues/gh3009.ts",
    "content": "/**\n * [link with base path](src/test/converter2/issues/gh3009.ts)\n * [link direct](gh3009.ts)\n *\n * [asset link](CHANGELOG.md)\n */\nexport const x = 1;\n"
  },
  {
    "path": "src/test/converter2/issues/gh3012.ts",
    "content": "/**\n * @remarks DictRemarks\n */\nexport const DictionarySchema = {};\n\n/**\n * {@inheritDoc DictionarySchema}\n *\n * @remarks\n * Alias of {@link DictionarySchema}\n */\nexport const NullProtoObjectSchema = DictionarySchema;\n"
  },
  {
    "path": "src/test/converter2/issues/gh3017.ts",
    "content": "export class GH3017 {\n    /** @hidden */\n    constructor() {}\n    #hashPriv = 1;\n    private priv = 2;\n    protected prot = 3;\n    public pub = 4;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3019.ts",
    "content": "class GH3019 {\n    accessor x: string = \"\";\n    accessor y: number = 123;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3020.ts",
    "content": "/**\n * Component demo.\n *\n * @fires {CustomEvent<{id: string, source: Element}>} item-click - event when item is clicked.\n */\nexport class ButtonControlElement extends Object {\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3024.ts",
    "content": "export class GH3024 {\n    method(x: string | undefined) {}\n    method2(x: string | null) {}\n    method3(x: string | null | undefined) {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3026.js",
    "content": "/**\n * @param {object} params params\n * @param {string} params.y y\n * @returns {Promise<void>}\n * @this {{ x: string }} this param\n */\nexport async function extendedResponse({ y }) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3031.js",
    "content": "/**\n * Test for Type Parameters on Constructor Signatures being ignored.\n *\n * @template T - This is documentation for T\n */\nexport class Test {\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3050.js",
    "content": "/**\n * @typedef Foo\n * @property {number} a\n * @property {boolean} b\n */\n\n/**\n * @typedef {Omit<Foo, \"b\">} Bar\n * {@interface}\n * {@interface with text}\n */\n\nexport {};\n"
  },
  {
    "path": "src/test/converter2/issues/gh3064.ts",
    "content": "/**\n * A\n */\nexport type ErrorResult = 1 | 2;\n\n/**\n * B\n */\nexport function ErrorResult(err: any): 1 {\n    return 1;\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3070.ts",
    "content": "export class NumberArray extends Array<number> {\n    foo() {}\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh3071.ts",
    "content": "export interface Other {}\nexport declare function m<Content>(content: Content): Content extends object ? Content : Other;\n"
  },
  {
    "path": "src/test/converter2/issues/gh567.ts",
    "content": "/**\n * @param [x] JSDoc style param name\n */\nexport function foo(x?: string) {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh671.js",
    "content": "/**\n * @param {string} x the string to parse as a number\n * @param {boolean} [int=true] whether to parse as an integer or float\n */\nexport function toNumber(x, int = true) {\n    return int ? parseInt(x) : parseFloat(x);\n}\n"
  },
  {
    "path": "src/test/converter2/issues/gh869.ts",
    "content": "export class Foo {}\nexport namespace Foo {\n    export const x = 1;\n}\n\nexport class Bar extends Foo {}\n"
  },
  {
    "path": "src/test/converter2/issues/gh941.ts",
    "content": "export const propertyName1 = \"p1\";\nexport const propertyName2 = Symbol();\n\nexport const Obj = {\n    [propertyName1]: \"foo\",\n    [propertyName2]: \"bar\",\n};\n"
  },
  {
    "path": "src/test/converter2/package.json",
    "content": "{\n    \"name\": \"typedoc\",\n    \"private\": true,\n    \"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/doc.md",
    "content": "Rendered document\n\nLink to this doc: [link](./doc.md)\n\n```ts\ntest();\n```\n\n> [!NOTE]\n> This is an alert\n"
  },
  {
    "path": "src/test/converter2/renderer/expandType.ts",
    "content": "export type Expandable = {\n    /** A */\n    a: string;\n};\n\n/** @expand */\nexport interface ExpandedByDefault {\n    /** B */\n    b: string;\n}\n\nexport type Expandable2 = {\n    /** C */\n    c: string;\n};\n\n/**\n * @expandType Expandable\n * @preventExpand ExpandedByDefault\n */\nexport type AExpanded = { a: Expandable; b: ExpandedByDefault; c: Expandable2 };\n\n// Defaults are fine\nexport type BExpanded = { a: Expandable; b: ExpandedByDefault; c: Expandable2 };\n\n/**\n * @expandType Expandable\n * @expandType Expandable2\n */\nexport namespace NestedBehavior1 {\n    export type AllExpanded = { a: Expandable; b: ExpandedByDefault; c: Expandable2 };\n    /**\n     * @preventExpand Expandable\n     * @preventExpand Expandable2\n     */\n    export type AExpanded = { a: Expandable; b: ExpandedByDefault; c: Expandable2 };\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/gh2982.ts",
    "content": "export type TMXNode<T> = {} & {\n    base: T;\n};\n\nexport interface TMXDataNode extends TMXNode<{ extra: any }> {\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/gh2995.ts",
    "content": "export interface gh2995 {\n    optionalMethod?(filter: string, args: string[]): any;\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/gh3007.ts",
    "content": "interface MixinConstructor<B extends new (...args: any) => U, U> {\n    new (...args: ConstructorParameters<B>): U;\n}\n\nexport declare class DOMBase<T extends Node> {\n    [Symbol.iterator](): Iterator<T>;\n}\n\nexport interface DOMIterable extends Partial<DOMBase<Node>> {\n}\n\ndeclare const DOMClass_base: MixinConstructor<typeof DOMBase, DOMBase<Node> & object>;\n\nexport declare class DOMClass extends DOMClass_base {\n    private constructor();\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/gh3014.ts",
    "content": "import { GH3014Base } from \"@typedoc/gh3014\";\n\nexport class GH3014 extends GH3014Base {\n    constructor() {\n        super();\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/gh3052.ts",
    "content": "// Without this the reproducer for 3052 doesn't work.\n// Prior to this, TypeDoc would register symbol IDs for types, which caused\n// catchIfCatchable.catchIfCatchable.__type (return type of the signature)\n// to incorrectly be assigned the symbol reference for the catch method\nexport class CustomPromise<T> implements Promise<T> {\n    public readonly [Symbol.toStringTag] = \"Promise\";\n    public then(): any {}\n    public catch(): any {}\n    public finally(): any {}\n}\n\nexport class PromiseReference {\n    public static catchIfCatchable(p: any): typeof Promise.prototype.catch | undefined {\n        throw \"Minimizing for bug reproduction\";\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/renderer/index.ts",
    "content": "/**\n * Module comment\n *\n * @module RendererTests\n * @document doc.md\n */\n\n// Exports from this file will be rendered for the renderer snapshot testing\n\nexport interface BaseInterface {\n    /** Interface method */\n    method(x: string): void;\n\n    base(): void;\n}\n\nexport abstract class BaseClass {\n    /** Base class method */\n    method(x: string) {}\n\n    base() {}\n}\n\n/** Renderer class */\nexport class RenderClass extends BaseClass {\n    /** Index signature */\n    [k: string]: unknown;\n\n    /** Property */\n    prop: string = \"abc\";\n\n    /** Ctor comment */\n    constructor(x: string) {\n        super();\n    }\n\n    /** Method comment */\n    method(x: string) {}\n\n    /** Sig 1 comment */\n    overloaded(): string;\n    /** Sig 2 comment */\n    overloaded(p: string): number;\n    /** Method comment */\n    overloaded(p?: string): number | string {\n        return 1;\n    }\n\n    get getter() {\n        return 1;\n    }\n\n    get getSet() {\n        return 1;\n    }\n    set getSet(value: number) {}\n}\n\n/** Generic class */\nexport class GenericClass<out T extends string = \"\"> {\n    genericMethod<U extends T>() {}\n}\n\nexport class ModifiersClass {\n    protected prot = 1;\n    private priv = 2;\n    public pub = 3;\n    readonly read = 4;\n    /** @deprecated */\n    dep = 5;\n\n    /** #2934 same page link {@linkcode ModifiersClass} */\n    constructor() {}\n}\n\n/**\n * Enum comment {@link Value1}\n * @remarks Block tag\n */\nexport enum Enumeration {\n    /** Value1 comment */\n    Value1,\n    /** Value2 comment */\n    Value2 = Value1,\n}\n\n/** Type alias with nested properties */\nexport type Nested = {\n    options: {\n        /** Value */\n        value?: string;\n        /** Another value */\n        anotherValue?: string;\n        /** More options */\n        moreOptions?: {\n            moreValues: number;\n        };\n        emptyObject: {};\n    };\n};\n\nexport type UnionComments =\n    /** Commentary on abc */\n    | \"abc\"\n    /** Commentary on def */\n    | \"def\";\n\n/**\n * Signature comment\n * #2921 {@link !Promise}\n * @param item Item comment\n */\nexport function box<T>(item: T) {\n    return { box: item };\n}\n\nexport interface NoneCategory {\n    /** @category none */\n    a: 1;\n    b: 2;\n    /** @group none @category none */\n    c: 3;\n}\n\nexport interface NoneGroup {\n    /** @group none */\n    a: 1;\n    b: 2;\n}\n\n/** @disableGroups */\nexport interface DisabledGroups {\n    a: 1;\n    /** [link to readme #3006](./index.ts) */\n    b(): void;\n}\n\nexport * as ExpandType from \"./expandType\";\nexport * as GH2982 from \"./gh2982\";\nexport { gh2995 } from \"./gh2995\";\nexport * as GH3007 from \"./gh3007\";\nexport { GH3014 } from \"./gh3014\";\nexport { box as boxAlias };\nexport * as GH3052 from \"./gh3052\";\n"
  },
  {
    "path": "src/test/converter2/renderer/renderer-readme.md",
    "content": "# gh3023 &lt;test&gt;\n\nAnchor for above heading should be `gh3023-test`\n"
  },
  {
    "path": "src/test/converter2/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"strict\": true,\n        \"module\": \"Node16\",\n        \"checkJs\": true,\n        \"outDir\": \"dist\",\n        \"target\": \"ESNext\",\n        \"noImplicitAny\": false,\n        // GH2774 test case needs global files\n        \"moduleDetection\": \"legacy\",\n\n        \"skipLibCheck\": true\n    },\n    \"typedocOptions\": {\n        \"exclude\": [\"**/ignored.ts\"]\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/typedoc.json",
    "content": "// This is here so we can point to it with doc:c2 and avoid warnings caused by TypeDoc's actual configuration.\n{\n    \"logLevel\": \"Verbose\",\n    \"outputs\": [\n        {\n            \"name\": \"html\",\n            \"path\": \"../../../docs\"\n        },\n        {\n            \"name\": \"json\",\n            \"path\": \"../../../docs/docs.json\"\n        }\n    ],\n    \"disableGit\": true,\n    \"sourceLinkTemplate\": \"{path}\",\n    \"excludeExternals\": true,\n    \"tsconfig\": \"tsconfig.json\",\n    \"validation\": {\n        \"invalidLink\": true,\n        \"notDocumented\": false,\n        \"notExported\": true,\n        \"rewrittenLink\": true,\n        \"unusedMergeModuleWith\": true\n    },\n    \"skipErrorChecking\": true,\n    \"externalSymbolLinkMappings\": {\n        // used by {@link !Promise}\n        \"global\": {\n            \"Promise\": \"#\"\n        },\n        \"@typedoc/gh3014\": {\n            \"GH3014Base\": \"typedoc://GH3014Base\",\n            \"GH3014Base.constructor\": \"typedoc://GH3014Base.constructor\"\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/converter2/validation/callbackParameters.ts",
    "content": "/**\n * Test case from https://github.com/TypeStrong/typedoc/issues/2154\n * @param data The data object to add equality to\n * @param equals The equality function\n * @param hashCode The hash code function\n */\nexport function gh2154(\n    data: unknown,\n    equals: (a: 1, b: 2) => boolean,\n    hashCode: (data: 3) => number,\n) {}\n\nexport class AnotherTest {\n    /**\n     * Property is documented\n     * @param a test\n     * @param b another\n     */\n    equals!: (a: 1, b: 2) => boolean;\n}\n"
  },
  {
    "path": "src/test/converter2/validation/class.ts",
    "content": "export class Foo {\n    /** Comment */\n    constructor();\n    constructor(x: string);\n    constructor(x?: string) {}\n}\n\nexport class Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/externalType.ts",
    "content": "import { Program } from \"typescript\";\nexport declare const program: Program;\n"
  },
  {
    "path": "src/test/converter2/validation/function.ts",
    "content": "/** Foo docs */\nexport function foo() {}\n\nexport function bar();\n/** Bar docs */\nexport function bar(x: string);\nexport function bar() {}\n"
  },
  {
    "path": "src/test/converter2/validation/getSignature.ts",
    "content": "export class Foo {\n    get foo(): Bar {\n        return new Bar();\n    }\n}\n\nclass Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/implemented.ts",
    "content": "export class Foo implements Bar {}\nclass Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/indexSignature.ts",
    "content": "export class Foo {\n    [x: string]: Bar;\n}\n\nclass Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/intentionallyNotDocumented.ts",
    "content": "/** Foo doc */\nexport interface Foo {\n    notDoc: string;\n    notDoc2: string;\n}\n"
  },
  {
    "path": "src/test/converter2/validation/interface.ts",
    "content": "export interface Foo {\n    /** a */\n    method(): void;\n    method(a: string): string;\n}\n"
  },
  {
    "path": "src/test/converter2/validation/namespace.ts",
    "content": "export type Foo = Bar.Baz;\n\nnamespace Bar {\n    export type Baz = 123;\n}\n"
  },
  {
    "path": "src/test/converter2/validation/object.ts",
    "content": "export const x: {\n    foo?: Foo;\n} = {};\n\nclass Foo {}\n"
  },
  {
    "path": "src/test/converter2/validation/parameter.ts",
    "content": "export function Foo(x: Bar) {}\nclass Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/return.ts",
    "content": "export function foo(): Bar {\n    return new Bar();\n}\nclass Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/setSignature.ts",
    "content": "export class Foo {\n    set foo(_value: Bar) {}\n}\n\nclass Bar {}\n"
  },
  {
    "path": "src/test/converter2/validation/typeParameter.ts",
    "content": "class Foo {}\n\nexport class Bar<T extends Foo> {}\n"
  },
  {
    "path": "src/test/converter2/validation/unusedMergeModuleWith.ts",
    "content": "/**\n * @module\n * @mergeModuleWith notUsed\n */\nexport const test = 1;\n"
  },
  {
    "path": "src/test/converter2/validation/variable.ts",
    "content": "type Foo = {};\nexport const foo: Foo = {};\n"
  },
  {
    "path": "src/test/declarationReference.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport {\n    meaningToString,\n    parseComponent,\n    parseComponentPath,\n    parseDeclarationReference,\n    parseMeaning,\n    parseModuleSource,\n    parseString,\n    parseSymbolReference,\n} from \"#utils\";\n\ndescribe(\"Declaration References\", () => {\n    describe(\"String parsing\", () => {\n        const parse = (s: string) => parseString(s, 0, s.length)?.[0];\n\n        it(\"Fails if string does not start with a double quote\", () => {\n            equal(parse(\"x\"), undefined);\n        });\n\n        it(\"Fails if string includes a line terminator\", () => {\n            equal(parse('\"a\\nb\"'), undefined);\n        });\n\n        it(\"Fails if string is unclosed\", () => {\n            equal(parse('\"abc'), undefined);\n        });\n\n        it(\"Bails on bad escapes\", () => {\n            equal(parse('\"\\\\123\"'), undefined);\n            equal(parse('\"\\\\xZZ\"'), undefined);\n            equal(parse('\"\\\\uAAAZ\"'), undefined);\n            equal(parse('\"\\\\u4\"'), undefined);\n            equal(parse('\"\\\\u{41\"'), undefined);\n            equal(parse('\"\\\\uZ\"'), undefined);\n            equal(parse('\"\\\\u{FFFFFFFFFFFFFFFFFFFFFFF}\"'), undefined);\n        });\n\n        it(\"Parses successfully\", () => {\n            equal(parse('\"abc\\\\x41\\\\u0041\\\\u{42}z\\\\n\\\\a\\\\0\"'), \"abcAABz\\na\\0\");\n        });\n    });\n\n    describe(\"Component parsing\", () => {\n        const parse = (s: string) => parseComponent(s, 0, s.length)?.[0];\n\n        it(\"Fails if it is an invalid string\", () => {\n            equal(parse('\"asdf'), undefined);\n        });\n\n        it(\"Fails if there is no valid string\", () => {\n            equal(parse(\"\"), undefined);\n            equal(parse(\"\\n\"), undefined);\n        });\n\n        it(\"Reads valid component\", () => {\n            equal(parse(\"abc\"), \"abc\");\n            equal(parse('\"abc\"'), \"abc\");\n        });\n    });\n\n    describe(\"Component Path parsing\", () => {\n        const parse = (s: string) => parseComponentPath(s, 0, s.length)?.[0];\n\n        it(\"Fails if it is an invalid string\", () => {\n            equal(parse('\"asdf'), undefined);\n        });\n\n        it(\"Fails if a later part of the path fails to parse\", () => {\n            equal(parse('a.\"asdf'), undefined);\n        });\n\n        it(\"Parses a path\", () => {\n            equal(parse(\"a.b\"), [\n                { navigation: \".\", path: \"a\" },\n                { navigation: \".\", path: \"b\" },\n            ]);\n            equal(parse('a#\"b\"'), [\n                { navigation: \".\", path: \"a\" },\n                { navigation: \"#\", path: \"b\" },\n            ]);\n        });\n    });\n\n    describe(\"Meaning parsing\", () => {\n        const parse = (s: string) => {\n            const meaning = parseMeaning(s, 0, s.length);\n            if (meaning) {\n                equal(\n                    meaning[1],\n                    s.length,\n                    \"Parse did not consume full string\",\n                );\n            }\n            return meaning?.[0];\n        };\n\n        it(\"Fails if string does not start with :\", () => {\n            equal(parse(\"class\"), undefined);\n        });\n\n        it(\"Parses a bare keyword\", () => {\n            equal(parse(\":class\"), { keyword: \"class\" });\n        });\n\n        it(\"Parses a keyword with index\", () => {\n            equal(parse(\":class(123)\"), { keyword: \"class\", index: 123 });\n        });\n\n        it(\"Does not parse index if invalid\", () => {\n            const input = \":class(123\";\n            const meaning = parseMeaning(input, 0, input.length);\n            equal(meaning, [{ keyword: \"class\" }, \":class\".length]);\n        });\n\n        it(\"Parses an index\", () => {\n            equal(parse(\":(123)\"), { keyword: undefined, index: 123 });\n        });\n\n        it(\"Parses a bare index\", () => {\n            equal(parse(\":123\"), { index: 123 });\n        });\n\n        it(\"Parses a user identifier\", () => {\n            equal(parse(\":USER_IDENT\"), { label: \"USER_IDENT\" });\n        });\n    });\n\n    describe(\"Symbol reference parsing\", () => {\n        const parse = (s: string) => parseSymbolReference(s, 0, s.length)?.[0];\n\n        it(\"Fails if both parses fail\", () => {\n            equal(parse(\":bad\"), undefined);\n        });\n\n        it(\"Succeeds if path succeeds\", () => {\n            equal(parse(\"a\"), {\n                path: [{ navigation: \".\", path: \"a\" }],\n                meaning: undefined,\n            });\n        });\n\n        it(\"Succeeds if meaning succeeds\", () => {\n            equal(parse(\":class\"), {\n                path: undefined,\n                meaning: { keyword: \"class\" },\n            });\n        });\n\n        it(\"Succeeds both succeed\", () => {\n            equal(parse(\"a:class(1)\"), {\n                path: [{ navigation: \".\", path: \"a\" }],\n                meaning: { keyword: \"class\", index: 1 },\n            });\n        });\n    });\n\n    describe(\"Module source parsing\", () => {\n        const parse = (s: string) => parseModuleSource(s, 0, s.length)?.[0];\n\n        it(\"Fails if empty\", () => {\n            equal(parse(\"\"), undefined);\n            equal(parse(\"!\"), undefined);\n        });\n\n        it(\"Parses strings\", () => {\n            equal(parse('\"ab\"'), \"ab\");\n        });\n\n        it(\"Parses module source characters\", () => {\n            equal(parse(\"abc.def\"), \"abc.def\");\n        });\n    });\n\n    describe(\"Full reference parsing\", () => {\n        const parse = (s: string) => parseDeclarationReference(s, 0, s.length)?.[0];\n\n        it(\"Parses module if there is one\", () => {\n            equal(parse(\"abc!\"), {\n                moduleSource: \"abc\",\n                resolutionStart: \"global\",\n                symbolReference: undefined,\n            });\n        });\n\n        it(\"Does not parse module if there is not one\", () => {\n            equal(parse(\"abc#def\"), {\n                moduleSource: undefined,\n                resolutionStart: \"local\",\n                symbolReference: {\n                    path: [\n                        { navigation: \".\", path: \"abc\" },\n                        { navigation: \"#\", path: \"def\" },\n                    ],\n                    meaning: undefined,\n                },\n            });\n        });\n\n        it(\"Supports referencing global symbols\", () => {\n            equal(parse(\"!abc#def\"), {\n                moduleSource: undefined,\n                resolutionStart: \"global\",\n                symbolReference: {\n                    path: [\n                        { navigation: \".\", path: \"abc\" },\n                        { navigation: \"#\", path: \"def\" },\n                    ],\n                    meaning: undefined,\n                },\n            });\n        });\n\n        it(\"Doesn't crash with an empty/invalid reference\", () => {\n            equal(parse(\"\"), undefined);\n            equal(parse(\"@test/foo\"), undefined);\n        });\n\n        it(\"Handles module reference with top level ~ reference\", () => {\n            equal(parse(\"mod!~foo\"), {\n                moduleSource: \"mod\",\n                resolutionStart: \"global\",\n                symbolReference: {\n                    path: [{ navigation: \"~\", path: \"foo\" }],\n                    meaning: undefined,\n                },\n            });\n        });\n    });\n\n    describe(\"meaningToString\", () => {\n        it(\"Converts to string\", () => {\n            equal(meaningToString({ keyword: \"class\" }), \"class\");\n            equal(meaningToString({ keyword: \"class\", index: 1 }), \"class(1)\");\n            equal(meaningToString({ label: \"X\" }), \"X\");\n            equal(meaningToString({}), \"\");\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/internationalization.test.ts",
    "content": "import { deepEqual as equal, ok } from \"assert/strict\";\nimport { readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport translatable from \"../lib/internationalization/locales/en.cjs\";\nimport { i18n, setDifference } from \"#utils\";\nimport { blockTags, inlineTags, modifierTags } from \"../lib/utils/options/tsdoc-defaults.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport { Internationalization } from \"../lib/internationalization/internationalization.js\";\n\nconst allValidTranslationKeys = Object.keys(translatable);\n// The tag names do not actually exist in the default locale, but are valid\n// for translation, so include them here.\nallValidTranslationKeys.push(...blockTags.map((s) => \"tag_\" + s.substring(1)));\nallValidTranslationKeys.push(\n    ...modifierTags.map((s) => \"tag_\" + s.substring(1)),\n);\nallValidTranslationKeys.push(...inlineTags.map((s) => \"tag_\" + s.substring(1)));\n\ndescribe(\"Internationalization\", () => {\n    let inter: Internationalization;\n    beforeEach(() => {\n        inter = new Internationalization();\n    });\n    afterEach(() => inter.setLocale(\"en\"));\n\n    it(\"Supports getting the list of supported languages\", () => {\n        const langs = inter.getSupportedLanguages();\n        ok(langs.includes(\"en\"));\n        ok(langs.includes(\"ko\"));\n        ok(langs.includes(\"ja\"));\n        ok(langs.includes(\"de\"));\n    });\n\n    it(\"Supports translating without placeholders\", () => {\n        equal(\n            i18n.no_entry_points_to_merge(),\n            \"No entry points provided to merge\",\n        );\n        inter.setLocale(\"zh\");\n        equal(i18n.no_entry_points_to_merge(), \"没有提供合并的入口点\");\n    });\n\n    it(\"Supports translating with placeholders\", () => {\n        equal(i18n.loaded_plugin_0(\"X\"), \"Loaded plugin X\");\n        inter.setLocale(\"zh\");\n        equal(i18n.loaded_plugin_0(\"X\"), \"已加载插件 X\");\n    });\n\n    it(\"Handles locales which do not exist\", () => {\n        equal(i18n.loaded_plugin_0(\"X\"), \"Loaded plugin X\");\n        inter.setLocale(\"fakeLocale\");\n        equal(i18n.loaded_plugin_0(\"X\"), \"Loaded plugin X\");\n    });\n\n    it(\"Supports adding translations for loaded locale\", () => {\n        inter.addTranslations(\"en\", { testTranslation: \"Test translation\" });\n        // @ts-expect-error testTranslation isn't a defined translation\n        equal(i18n.testTranslation(), \"Test translation\");\n    });\n\n    it(\"Supports adding translations for not-loaded locale\", () => {\n        inter.addTranslations(\"fake\", { testTranslation: \"Fake translation\" });\n        inter.setLocale(\"fake\");\n        // @ts-expect-error testTranslation isn't a defined translation\n        equal(i18n.testTranslation(), \"Fake translation\");\n    });\n\n    it(\"Considers translations which have only been added by plugins to be real\", () => {\n        inter.addTranslations(\"fake\", { testTranslation: \"Fake translation\" });\n        const supported = inter.getSupportedLanguages();\n        ok(supported.includes(\"fake\"));\n    });\n});\n\ndescribe(\"Locales\", () => {\n    const localeRoot = join(\n        fileURLToPath(import.meta.url),\n        \"../../lib/internationalization/locales\",\n    );\n\n    for (const locale of readdirSync(localeRoot)) {\n        it(`${locale} defines a valid locale`, () => {\n            const req = createRequire(fileURLToPath(import.meta.url));\n            const translations = req(join(localeRoot, locale)) as Record<\n                string,\n                string\n            >;\n\n            for (const [key, translation] of Object.entries(translations)) {\n                const validPlaceholders = Array.from(\n                    key.matchAll(/_(\\d+)_|(\\d+)$/g),\n                    (m) => m[1] || m[2],\n                );\n\n                for (const placeholder of translation.matchAll(/\\{(\\d+?)\\}/g)) {\n                    ok(\n                        validPlaceholders.includes(placeholder[1]),\n                        `${key} translation references \"${placeholder[0]}\" which will not be available at runtime.`,\n                    );\n                }\n            }\n\n            const extraKeys = Array.from(\n                setDifference(\n                    Object.keys(translations),\n                    allValidTranslationKeys,\n                ),\n            );\n            equal(\n                extraKeys,\n                [],\n                `${locale} defines translations which do not exist in the default locale.`,\n            );\n        });\n    }\n});\n"
  },
  {
    "path": "src/test/issues.c2.test.ts",
    "content": "import { deepStrictEqual as equal, notDeepStrictEqual as notEqual, ok } from \"assert\";\nimport {\n    Comment,\n    CommentTag,\n    DeclarationReflection,\n    IntrinsicType,\n    LiteralType,\n    type ProjectReflection,\n    QueryType,\n    ReferenceReflection,\n    ReflectionKind,\n    ReflectionType,\n    SignatureReflection,\n    UnionType,\n} from \"../lib/models/index.js\";\nimport type { InlineTagDisplayPart } from \"../lib/models/Comment.js\";\nimport { getConverter2App, getConverter2Project } from \"./programs.js\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { equalKind, getComment, getLinks, getSigComment, query, querySig, reflToTree } from \"./utils.js\";\nimport { DefaultTheme, type FileId, i18n, KindRouter, PageEvent, ReflectionSymbolId } from \"../index.js\";\nimport { normalizePath, TYPEDOC_ROOT } from \"#node-utils\";\nimport { NormalizedPathUtils } from \"#utils\";\n\nconst app = getConverter2App();\n\ndescribe(\"Issue Tests\", () => {\n    let logger: TestLogger;\n    let convert: (...entries: string[]) => ProjectReflection;\n    let optionsSnap: { __optionSnapshot: never };\n\n    beforeEach(function () {\n        app.logger = logger = new TestLogger();\n        optionsSnap = app.options.snapshot();\n        const issueNumber = this.currentTest?.title.match(/#(\\d+)/)?.[1];\n        ok(issueNumber, \"Test name must contain an issue number.\");\n        convert = (...entries) =>\n            getConverter2Project(\n                entries.length ? entries : [`gh${issueNumber}`],\n                \"issues\",\n            );\n    });\n\n    afterEach(() => {\n        app.options.restore(optionsSnap);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#567\", () => {\n        const project = convert();\n        const foo = query(project, \"foo\");\n        const sig = foo.signatures?.[0];\n        ok(sig, \"Missing signature\");\n        ok(sig.comment, \"No comment for signature\");\n        const param = sig.parameters?.[0];\n        equal(param?.name, \"x\");\n        equal(\n            Comment.combineDisplayParts(param.comment?.summary),\n            \"JSDoc style param name\",\n        );\n    });\n\n    it(\"#671\", () => {\n        const project = convert();\n        const toNumber = query(project, \"toNumber\");\n        const sig = toNumber.signatures?.[0];\n        ok(sig, \"Missing signatures\");\n\n        const paramComments = sig.parameters?.map((param) => Comment.combineDisplayParts(param.comment?.summary));\n        equal(paramComments, [\n            \"the string to parse as a number\",\n            \"whether to parse as an integer or float\",\n        ]);\n    });\n\n    it(\"#869\", () => {\n        const project = convert();\n        const classFoo = project.children?.find(\n            (r) => r.name === \"Foo\" && r.kind === ReflectionKind.Class,\n        );\n        ok(classFoo instanceof DeclarationReflection);\n        equal(\n            classFoo.children?.find((r) => r.name === \"x\"),\n            undefined,\n        );\n\n        const nsFoo = project.children?.find(\n            (r) => r.name === \"Foo\" && r.kind === ReflectionKind.Namespace,\n        );\n        ok(nsFoo instanceof DeclarationReflection);\n        ok(nsFoo.children?.find((r) => r.name === \"x\"));\n    });\n\n    it(\"#941 Supports computed names \", () => {\n        const project = convert();\n        const obj = query(project, \"Obj\");\n        equal(\n            obj.type?.visit({\n                reflection(r) {\n                    return r.declaration.children?.map((c) => c.name);\n                },\n            }),\n            [\"[propertyName2]\", \"p1\"],\n        );\n    });\n\n    it(\"#1124\", () => {\n        const project = convert();\n        equal(\n            project.children?.length,\n            1,\n            \"Namespace with type and value converted twice\",\n        );\n    });\n\n    it(\"#1150\", () => {\n        const project = convert();\n        const refl = query(project, \"IntersectFirst\");\n        equal(refl.kind, ReflectionKind.TypeAlias);\n        equal(refl.type?.type, \"indexedAccess\");\n    });\n\n    it(\"#1164\", () => {\n        const project = convert();\n        const refl = query(project, \"gh1164\");\n        equal(\n            Comment.combineDisplayParts(\n                refl.signatures?.[0]?.parameters?.[0]?.comment?.summary,\n            ),\n            \"{@link CommentedClass} Test description.\",\n        );\n        const tag = refl.signatures?.[0]?.comment?.blockTags.find(\n            (x) => x.tag === \"@returns\",\n        );\n        ok(tag);\n        equal(Comment.combineDisplayParts(tag.content), \"Test description.\");\n    });\n\n    it(\"#1215\", () => {\n        const project = convert();\n        const foo = query(project, \"Foo.bar\");\n        ok(foo.setSignature instanceof SignatureReflection);\n        equal(foo.setSignature.type?.toString(), \"void\");\n    });\n\n    it(\"#1255\", () => {\n        const project = convert();\n        const foo = query(project, \"C.foo\");\n        equal(Comment.combineDisplayParts(foo.comment?.summary), \"Docs!\");\n    });\n\n    it(\"#1261\", () => {\n        const project = convert();\n        const prop = query(project, \"X.prop\");\n        equal(\n            Comment.combineDisplayParts(prop.comment?.summary),\n            \"The property of X.\",\n        );\n    });\n\n    it(\"#1330\", () => {\n        const project = convert();\n        const example = query(project, \"ExampleParam\");\n        equal(example.type?.type, \"reference\");\n        equal(example.type.toString(), \"Example\");\n    });\n\n    it(\"#1366\", () => {\n        const project = convert();\n        const foo = query(project, \"GH1366.Foo\");\n        equal(foo.kind, ReflectionKind.Reference);\n    });\n\n    it(\"#1408\", () => {\n        const project = convert();\n        const foo = querySig(project, \"foo\");\n        const type = foo.typeParameters?.[0].type;\n        equal(type?.toString(), \"unknown[]\");\n    });\n\n    it(\"#1436\", () => {\n        const project = convert();\n        equal(\n            project.children?.map((c) => c.name),\n            [\"gh1436\"],\n        );\n    });\n\n    it(\"#1449\", () => {\n        const project = convert();\n        const refl = query(project, \"gh1449\").signatures?.[0];\n        equal(\n            refl?.typeParameters?.[0].type?.toString(),\n            \"[foo: any, bar?: any]\",\n        );\n    });\n\n    it(\"#1454\", () => {\n        const project = convert();\n        const foo = querySig(project, \"foo\");\n        equal(foo.type?.type, \"reference\");\n        equal(foo.type.toString(), \"Foo\");\n\n        const bar = querySig(project, \"bar\");\n        equal(bar.type?.type, \"reference\");\n        equal(bar.type.toString(), \"Bar\");\n    });\n\n    it(\"#1462\", () => {\n        const project = convert();\n        const prop = query(project, \"PROP\");\n        equal(prop.type?.toString(), \"number\");\n\n        // Would be nice to get this to work someday\n        equal(prop.comment?.summary, void 0);\n\n        const method = query(project, \"METHOD\");\n        equal(\n            Comment.combineDisplayParts(\n                method.signatures?.[0].comment?.summary,\n            ),\n            \"method docs\",\n        );\n    });\n\n    it(\"#1481\", () => {\n        const project = convert();\n        const signature = query(project, \"GH1481.static\").signatures?.[0];\n        equal(\n            Comment.combineDisplayParts(signature?.comment?.summary),\n            \"static docs\",\n        );\n        equal(signature?.type?.toString(), \"void\");\n    });\n\n    it(\"#1483\", () => {\n        const project = convert();\n        equal(\n            query(project, \"gh1483.namespaceExport\").kind,\n            ReflectionKind.Method,\n        );\n        equal(\n            query(project, \"gh1483_2.staticMethod\").kind,\n            ReflectionKind.Method,\n        );\n    });\n\n    it(\"#1490\", () => {\n        const project = convert();\n        const refl = query(project, \"GH1490.optionalMethod\");\n        equal(\n            Comment.combineDisplayParts(refl.signatures?.[0]?.comment?.summary),\n            \"With comment\",\n        );\n    });\n\n    it(\"#1509\", () => {\n        const project = convert();\n        const pFoo = query(project, \"PartialFoo.foo\");\n        equal(pFoo.flags.isOptional, true);\n\n        const rFoo = query(project, \"ReadonlyFoo.foo\");\n        equal(rFoo.flags.isReadonly, true);\n        equal(rFoo.flags.isOptional, true);\n    });\n\n    it(\"#1514\", () => {\n        const project = convert();\n        // Not ideal. Really we want to handle these names nicer...\n        query(project, \"ComputedUniqueName.[UNIQUE_SYMBOL]\");\n    });\n\n    it(\"#1522\", () => {\n        app.options.setValue(\"categorizeByGroup\", true);\n        const project = convert();\n        equal(\n            project.groups?.map((g) => g.categories?.map((c) => c.title)),\n            [[\"cat\"]],\n        );\n    });\n\n    it(\"#1524\", () => {\n        const project = convert();\n        const nullableParam = query(project, \"nullable\").signatures?.[0]\n            ?.parameters?.[0];\n        equal(nullableParam?.type?.toString(), \"string | null\");\n\n        const nonNullableParam = query(project, \"nonNullable\").signatures?.[0]\n            ?.parameters?.[0];\n        equal(nonNullableParam?.type?.toString(), \"string\");\n    });\n\n    it(\"#1534\", () => {\n        const project = convert();\n        const func = query(project, \"gh1534\");\n        equal(\n            func.signatures?.[0]?.parameters?.[0]?.type?.toString(),\n            \"readonly [number, string]\",\n        );\n    });\n\n    it(\"#1547\", () => {\n        const project = convert();\n        equal(\n            project.children?.map((c) => c.name),\n            [\"Test\", \"ThingA\", \"ThingB\"],\n        );\n    });\n\n    it(\"#1552\", () => {\n        const project = convert();\n        equal(query(project, \"emptyArr\").defaultValue, \"[]\");\n        equal(query(project, \"nonEmptyArr\").defaultValue, \"...\");\n        equal(query(project, \"emptyObj\").defaultValue, \"{}\");\n        equal(query(project, \"nonEmptyObj\").defaultValue, \"...\");\n    });\n\n    it(\"#1578\", () => {\n        const project = convert();\n        ok(query(project, \"notIgnored\"));\n        ok(\n            !project.getChildByName(\"ignored\"),\n            \"Symbol re-exported from ignored file is ignored.\",\n        );\n    });\n\n    it(\"#1580\", () => {\n        const project = convert();\n        ok(\n            query(project, \"B.prop\").hasComment(),\n            \"Overwritten property with no comment should be inherited\",\n        );\n        ok(\n            query(project, \"B.run\").signatures?.[0]?.hasComment(),\n            \"Overwritten method with no comment should be inherited\",\n        );\n    });\n\n    it(\"#1624\", () => {\n        const project = convert();\n        // #1637\n        equal(query(project, \"Bar.baz\").kind, ReflectionKind.Property);\n\n        equal(\n            Comment.combineDisplayParts(\n                query(project, \"Foo.baz\").comment?.summary,\n            ),\n            \"Some property style doc.\",\n            \"Property methods declared in interface should still allow comment inheritance\",\n        );\n    });\n\n    it(\"#1626\", () => {\n        const project = convert();\n        const ctor = query(project, \"Foo.constructor\");\n        equal(ctor.sources?.[0]?.line, 2);\n        equal(ctor.sources[0].character, 4);\n    });\n\n    it(\"#1651 Handles comment discovery with expando functions \", () => {\n        const project = convert();\n        equal(\n            project.children?.map((c) => c.name),\n            [\"bar\"],\n        );\n\n        equal(\n            project.children[0].children?.map((c) => c.name),\n            [\"metadata\", \"fn\"],\n        );\n\n        const comments = [\n            query(project, \"bar\"),\n            query(project, \"bar.metadata\"),\n            querySig(project, \"bar.fn\"),\n            querySig(project, \"bar\"),\n        ].map((r) => Comment.combineDisplayParts(r.comment?.summary));\n\n        equal(comments, [\"\", \"metadata\", \"fn\", \"bar\"]);\n    });\n\n    it(\"#1660\", () => {\n        const project = convert();\n        const alias = query(project, \"SomeType\");\n        ok(alias.type instanceof QueryType);\n        equal(alias.type.queryType.name, \"m.SomeClass.someProp\");\n    });\n\n    it(\"#1733\", () => {\n        const project = convert();\n        const alias = query(project, \"Foo\");\n        equal(alias.typeParameters?.[0].comment?.summary, [\n            { kind: \"text\", text: \"T docs\" },\n        ]);\n        const cls = query(project, \"Bar\");\n        equal(cls.typeParameters?.[0].comment?.summary, [\n            { kind: \"text\", text: \"T docs\" },\n        ]);\n    });\n\n    it(\"#1734\", () => {\n        const project = convert();\n        const alias = query(project, \"Foo\");\n\n        const expectedComment = new Comment();\n        expectedComment.blockTags = [\n            new CommentTag(\"@asdf\", [\n                { kind: \"text\", text: \"Some example text\" },\n            ]),\n        ];\n        equal(alias.comment, expectedComment);\n\n        logger.expectMessage(\"warn: Encountered an unknown block tag @asdf\");\n    });\n\n    it(\"#1745\", () => {\n        app.options.setValue(\"categorizeByGroup\", true);\n        const project = convert();\n        const Foo = query(project, \"Foo\");\n        ok(Foo.type instanceof ReflectionType, \"invalid type\");\n\n        const group = project.groups?.find((g) => g.title === \"Type Aliases\");\n        ok(group, \"missing group\");\n        const cat = group.categories?.find(\n            (cat) => cat.title === \"My category\",\n        );\n        ok(cat, \"missing cat\");\n\n        ok(cat.children.includes(Foo), \"not included in cat\");\n    });\n\n    it(\"#1770\", () => {\n        const project = convert();\n        const sym1 = querySig(project, \"sym1\");\n        equal(\n            Comment.combineDisplayParts(sym1.comment?.summary),\n            \"Docs for Sym1\",\n        );\n\n        const sym2 = query(project, \"sym2\");\n        equal(\n            Comment.combineDisplayParts(sym2.comment?.summary),\n            \"Docs for Sym2\",\n        );\n    });\n\n    it(\"#1771\", () => {\n        const project = convert();\n        const check = query(project, \"check\");\n        const tag = check.comment?.summary[0] as\n            | InlineTagDisplayPart\n            | undefined;\n        equal(tag?.kind, \"inline-tag\");\n        equal(tag.text, \"Test2.method\");\n        ok(\n            tag.target === query(project, \"Test.method\"),\n            \"Incorrect resolution\",\n        );\n    });\n\n    it(\"#1795\", () => {\n        const project = convert();\n        equal(\n            project.children?.map((c) => c.name),\n            [\"foo\", \"default\"],\n        );\n        ok(project.children[0].kind !== ReflectionKind.Reference);\n        ok(project.children[1].kind === ReflectionKind.Reference);\n    });\n\n    it(\"#1804\", () => {\n        const project = convert();\n        const foo = query(project, \"foo\");\n        const sig = foo.signatures?.[0];\n        ok(sig);\n        const param = sig.parameters?.[0];\n        ok(param);\n        ok(param.flags.isOptional);\n    });\n\n    it(\"#1875\", () => {\n        const project = convert();\n        const test = query(project, \"test\");\n        equal(\n            test.signatures?.[0].parameters?.map((p) => p.type?.toString()),\n            [\"typeof globalThis\", \"string\"],\n        );\n\n        const test2 = query(project, \"test2\");\n        equal(\n            test2.signatures?.[0].parameters?.map((p) => p.type?.toString()),\n            [\"any\", \"string\"],\n        );\n    });\n\n    it(\"#1876\", () => {\n        const project = convert();\n        const foo = query(project, \"foo\");\n        const fooSig = foo.signatures?.[0].parameters?.[0];\n        ok(fooSig);\n        ok(fooSig.type instanceof UnionType);\n        ok(fooSig.type.types[1] instanceof ReflectionType);\n        equal(\n            Comment.combineDisplayParts(\n                fooSig.type.types[1].declaration.getChildByName(\"min\")?.comment\n                    ?.summary,\n            ),\n            \"Nested\",\n        );\n\n        const bar = query(project, \"bar\");\n        const barSig = bar.signatures?.[0].parameters?.[0];\n        ok(barSig);\n        ok(barSig.type instanceof UnionType);\n        ok(barSig.type.types[0] instanceof ReflectionType);\n        ok(barSig.type.types[1] instanceof ReflectionType);\n        equal(\n            Comment.combineDisplayParts(\n                barSig.type.types[0].declaration.getChildByName(\"min\")?.comment\n                    ?.summary,\n            ),\n            \"Nested\",\n        );\n        equal(\n            Comment.combineDisplayParts(\n                barSig.type.types[1].declaration.getChildByName(\"min\")?.comment\n                    ?.summary,\n            ),\n            \"Nested\",\n        );\n    });\n\n    it(\"#1880\", () => {\n        const project = convert();\n        const SomeEnum = query(project, \"SomeEnum\");\n        equal(SomeEnum.kind, ReflectionKind.Enum);\n        ok(SomeEnum.hasComment(), \"Missing @enum variable comment\");\n\n        const auto = query(project, \"SomeEnum.AUTO\");\n        ok(auto.hasComment(), \"Missing @enum member comment\");\n    });\n\n    it(\"#1896\", () => {\n        const project = convert();\n        const Type1 = query(project, \"Type1\");\n        const Type2 = query(project, \"Type2\");\n        equal(Type1.type?.type, \"reflection\" as const);\n        equal(Type2.type?.type, \"reflection\" as const);\n\n        equal(Type1.comment, new Comment([{ kind: \"text\", text: \"On Tag\" }]));\n        equal(\n            Type2.comment,\n            new Comment([{ kind: \"text\", text: \"Some type 2.\" }]),\n        );\n    });\n\n    it(\"#1898\", () => {\n        app.options.setValue(\"validation\", true);\n        const project = convert();\n        app.validate(project);\n        logger.expectMessage(\n            \"warn: UnDocFn (TypeAlias), defined in */gh1898.ts, does not have any documentation\",\n        );\n    });\n\n    it(\"#1903\", () => {\n        const project = convert();\n        equal(\n            Object.values(project.reflections).map((r) => r.name),\n            [\"typedoc\"],\n        );\n    });\n\n    it(\"#1903b\", () => {\n        const project = convert(\"gh1903b\");\n        equal(\n            Object.values(project.reflections).map((r) => r.name),\n            [\"typedoc\"],\n        );\n    });\n\n    it(\"#1907\", () => {\n        const project = convert();\n        // gh2190 - we now skip the first package.json we encounter because it doesn't contain a name field.\n        equal(project.packageName, \"typedoc\");\n    });\n\n    it(\"#1913\", () => {\n        const project = convert();\n        const fn = query(project, \"fn\");\n\n        equal(\n            fn.signatures?.[0].comment,\n            new Comment(\n                [],\n                [new CommentTag(\"@returns\", [{ kind: \"text\", text: \"ret\" }])],\n            ),\n        );\n    });\n\n    it(\"#1927\", () => {\n        const project = convert();\n        const ref = query(project, \"Derived.getter\");\n\n        equal(\n            ref.getSignature?.comment,\n            new Comment([{ kind: \"text\", text: \"Base\" }]),\n        );\n    });\n\n    it(\"#1942\", () => {\n        const project = convert();\n        equal(query(project, \"Foo.A\").type, new LiteralType(0));\n        equal(query(project, \"Foo.B\").type, new IntrinsicType(\"number\"));\n        equal(query(project, \"Bar.C\").type, new LiteralType(\"C\"));\n    });\n\n    it(\"#1961\", () => {\n        const project = convert();\n        equal(\n            Comment.combineDisplayParts(\n                query(project, \"WithDocs1\").comment?.summary,\n            ),\n            \"second\",\n        );\n    });\n\n    it(\"#1962\", () => {\n        const project = convert();\n        const foo = query(project, \"foo\");\n        ok(foo.signatures);\n        ok(project.hasComment(), \"Missing module comment\");\n        ok(\n            !foo.signatures[0].hasComment(),\n            \"Module comment attached to signature\",\n        );\n    });\n\n    it(\"#1963\", () => {\n        const project = convert();\n        ok(project.hasComment(), \"Missing module comment\");\n    });\n\n    it(\"#1967\", () => {\n        const project = convert();\n        equal(\n            query(project, \"abc\").comment,\n            new Comment(\n                [],\n                [\n                    new CommentTag(\"@example\", [\n                        {\n                            kind: \"code\",\n                            text: \"```ts\\n\\n```\",\n                        },\n                    ]),\n                ],\n            ),\n        );\n    });\n\n    it(\"#1968\", () => {\n        const project = convert();\n        const comments = [\"Bar.x\", \"Bar.y\", \"Bar.z\"].map((n) =>\n            Comment.combineDisplayParts(query(project, n).comment?.summary)\n        );\n        equal(comments, [\"getter\", \"getter\", \"setter\"]);\n    });\n\n    it(\"#1973\", () => {\n        const project = convert();\n        const comments = [\"A\", \"B\"].map((n) => Comment.combineDisplayParts(query(project, n).comment?.summary));\n\n        equal(comments, [\"A override\", \"B module\"]);\n\n        const comments2 = [\"A.a\", \"B.b\"].map((n) => Comment.combineDisplayParts(querySig(project, n).comment?.summary));\n\n        equal(comments2, [\"Comment for a\", \"Comment for b\"]);\n    });\n\n    it(\"#1980\", () => {\n        const project = convert();\n        const link = query(project, \"link\");\n        equal(\n            link.comment?.summary.filter((t) => t.kind === \"inline-tag\"),\n            [\n                {\n                    kind: \"inline-tag\",\n                    tag: \"@link\",\n                    target: \"http://example.com\",\n                    text: \"http://example.com\",\n                },\n                {\n                    kind: \"inline-tag\",\n                    tag: \"@link\",\n                    target: \"http://example.com\",\n                    text: \"with text\",\n                },\n                {\n                    kind: \"inline-tag\",\n                    tag: \"@link\",\n                    target: \"http://example.com\",\n                    text: \"jsdoc support\",\n                },\n            ],\n        );\n    });\n\n    it(\"#1986\", () => {\n        const project = convert();\n        const a = query(project, \"a\");\n        equal(\n            Comment.combineDisplayParts(a.comment?.summary),\n            \"[[include:file.md]] this is not a link.\",\n        );\n    });\n\n    it(\"#1994\", () => {\n        app.options.setValue(\"excludeNotDocumented\", true);\n        const project = convert();\n        for (const exp of [\"documented\", \"documented2\", \"Docs.x\", \"Docs.y\"]) {\n            query(project, exp);\n        }\n        for (const rem of [\"notDocumented\", \"Docs.z\"]) {\n            ok(!project.getChildByName(rem));\n        }\n\n        const y = query(project, \"Docs.y\");\n        equal(y.sources?.length, 1);\n        ok(y.getSignature);\n        ok(!y.setSignature);\n    });\n\n    it(\"#1996\", () => {\n        const project = convert();\n        const a = querySig(project, \"a\");\n        equal(a.sources?.[0].fileName, \"gh1996.ts\");\n        equal(a.sources[0].line, 1);\n        equal(a.sources[0].character, 17);\n        const b = querySig(project, \"b\");\n        equal(b.sources?.[0].fileName, \"gh1996.ts\");\n        equal(b.sources[0].line, 3);\n        equal(b.sources[0].character, 16);\n    });\n\n    it(\"#2008\", () => {\n        const project = convert();\n        const fn = querySig(project, \"myFn\");\n        equal(Comment.combineDisplayParts(fn.comment?.summary), \"Docs\");\n    });\n\n    it(\"#2011\", () => {\n        const project = convert();\n        const readable = query(project, \"Readable\").signatures![0];\n        const type = readable.type!;\n        equal(type.type, \"intersection\" as const);\n        notEqual(type.types[0], \"intersection\");\n        notEqual(type.types[1], \"intersection\");\n    });\n\n    it(\"#2019\", () => {\n        const project = convert();\n        const param = query(project, \"A.constructor\").signatures![0]\n            .parameters![0];\n        const prop = query(project, \"A.property\");\n\n        equal(\n            Comment.combineDisplayParts(param.comment?.summary),\n            \"Param comment\",\n            \"Constructor parameter\",\n        );\n        equal(\n            Comment.combineDisplayParts(prop.comment?.summary),\n            \"Param comment\",\n            \"Property\",\n        );\n    });\n\n    it(\"#2020\", () => {\n        const project = convert();\n        const opt = query(project, \"Options\");\n        equal(Comment.combineDisplayParts(opt.comment?.summary), \"Desc\");\n        equal(\n            Comment.combineDisplayParts(\n                opt.getChildByName(\"url\")?.comment?.summary,\n            ),\n            \"Desc2\",\n        );\n        equal(\n            Comment.combineDisplayParts(\n                opt.getChildByName(\"apiKey\")?.comment?.summary,\n            ),\n            \"Desc3\",\n        );\n    });\n\n    it(\"#2031\", () => {\n        const project = convert();\n        const sig = query(project, \"MyClass.aMethod\").signatures![0];\n        const summaryLink = sig.comment?.summary[0];\n        ok(summaryLink?.kind === \"inline-tag\");\n        ok(summaryLink.target);\n\n        const paramLink = sig.parameters![0].comment?.summary[0];\n        ok(paramLink?.kind === \"inline-tag\");\n        ok(paramLink.target);\n    });\n\n    it(\"#2033\", () => {\n        const project = convert();\n        const cls = project.children!.find(\n            (c) => c.name === \"Foo\" && c.kind === ReflectionKind.Class,\n        );\n        ok(cls);\n\n        const link = cls.comment?.summary[0];\n        ok(link?.kind === \"inline-tag\");\n        ok(link.target);\n    });\n\n    it(\"#2036\", () => {\n        const project = convert();\n        const SingleSimpleCtor = query(project, \"SingleSimpleCtor\");\n        const MultipleSimpleCtors = query(project, \"MultipleSimpleCtors\");\n        const AnotherCtor = query(project, \"AnotherCtor\");\n\n        equal(SingleSimpleCtor.type?.type, \"reflection\" as const);\n        equal(MultipleSimpleCtors.type?.type, \"reflection\" as const);\n        equal(AnotherCtor.type?.type, \"reflection\" as const);\n\n        equal(SingleSimpleCtor.type.declaration.signatures?.length, 1);\n        equal(MultipleSimpleCtors.type.declaration.signatures?.length, 2);\n        equal(AnotherCtor.type.declaration.signatures?.length, 1);\n    });\n\n    it(\"#2042\", () => {\n        const project = convert();\n        for (\n            const [name, docs, sigDocs] of [\n                [\"built\", \"\", \"inner docs\"],\n                [\"built2\", \"outer docs\", \"inner docs\"],\n                [\"fn\", \"\", \"inner docs\"],\n                [\"fn2\", \"outer docs\", \"inner docs\"],\n            ]\n        ) {\n            const refl = query(project, name);\n            ok(refl.signatures?.[0]);\n            equal(\n                Comment.combineDisplayParts(refl.comment?.summary),\n                docs,\n                name + \" docs\",\n            );\n            equal(\n                Comment.combineDisplayParts(\n                    refl.signatures[0].comment?.summary,\n                ),\n                sigDocs,\n                name + \" sig docs\",\n            );\n        }\n    });\n\n    it(\"#2044\", () => {\n        const project = convert();\n        for (\n            const [name, ref] of [\n                [\"Foo\", false],\n                [\"RenamedFoo\", true],\n                [\"Generic\", false],\n                [\"RenamedGeneric\", true],\n                [\"NonGeneric\", false],\n            ] as const\n        ) {\n            const decl = query(project, name);\n            equal(decl instanceof ReferenceReflection, ref, `${name} = ${ref}`);\n        }\n    });\n\n    it(\"#2064\", () => {\n        app.options.setValue(\"excludePrivate\", false);\n        const project = convert();\n        query(project, \"PrivateCtorDecl.x\");\n    });\n\n    it(\"#2079\", () => {\n        const project = convert();\n        const cap = query(project, \"capitalize\");\n        const sig = cap.signatures![0];\n        equal(sig.type?.toString(), \"Capitalize<T>\");\n    });\n\n    it(\"#2087\", () => {\n        const project = convert();\n        const x = query(project, \"Bar.x\");\n        equal(\n            Comment.combineDisplayParts(x.comment?.summary),\n            \"Foo type comment\",\n        );\n    });\n\n    it(\"#2106 Handles types/values with same name \", () => {\n        const project = convert();\n        const balance = querySig(project, \"balance\");\n        equal(balance.type?.type, \"reference\");\n        equal(balance.type.reflection?.kind, ReflectionKind.Interface);\n\n        const TypeOf = query(project, \"TypeOf\");\n        equal(TypeOf.type?.type, \"query\");\n        equal(TypeOf.type.queryType.reflection?.kind, ReflectionKind.Variable);\n    });\n\n    it(\"#2135\", () => {\n        const project = convert();\n        const hook = query(project, \"Camera.useCameraPermissions\");\n        equal(hook.type?.type, \"reflection\" as const);\n        equal(Comment.combineDisplayParts(hook.comment?.summary), \"One\");\n    });\n\n    it(\"#2150\", () => {\n        const project = convert();\n        const intFn = query(project, \"FileInt.intFn\");\n        equal(intFn.kind, ReflectionKind.Method, \"intFn interface method\");\n        equal(\n            Comment.combineDisplayParts(intFn.signatures?.[0].comment?.summary),\n            \"intFn doc\",\n        );\n\n        const intProp = query(project, \"FileInt.intVar\");\n        equal(intProp.kind, ReflectionKind.Property, \"intVar interface prop\");\n        equal(\n            Comment.combineDisplayParts(intProp.comment?.summary),\n            \"intVar doc\",\n        );\n\n        const constFn = query(project, \"FileInt.constFn\");\n        equal(constFn.kind, ReflectionKind.Method, \"constFn interface method\");\n        equal(\n            Comment.combineDisplayParts(\n                constFn.signatures?.[0].comment?.summary,\n            ),\n            \"constFn doc\",\n        );\n\n        const intFn2 = query(project, \"FileClass.intFn\");\n        equal(intFn2.kind, ReflectionKind.Method, \"intFn class method\");\n\n        const intProp2 = query(project, \"FileClass.intVar\");\n        equal(intProp2.kind, ReflectionKind.Property, \"intVar class prop\");\n\n        const constFn2 = query(project, \"FileClass.constFn\");\n        equal(constFn2.kind, ReflectionKind.Method, \"constFn class method\");\n        equal(\n            Comment.combineDisplayParts(\n                constFn2.signatures?.[0].comment?.summary,\n            ),\n            \"constFn doc\",\n        );\n    });\n\n    it(\"#2156\", () => {\n        app.options.setValue(\"excludeNotDocumented\", true);\n        const project = convert();\n        const foo = querySig(project, \"foo\");\n        equal(\n            Comment.combineDisplayParts(foo.comment?.summary),\n            \"Is documented\",\n        );\n    });\n\n    it(\"#2165 module comments on global files\", () => {\n        const project = convert();\n        equal(\n            Comment.combineDisplayParts(project.comment?.summary),\n            \"'module' comment\",\n        );\n    });\n\n    it(\"#2175\", () => {\n        const project = convert();\n        const def = query(project, \"default\");\n        equal(def.type?.type, \"intrinsic\");\n        equal(def.type.toString(), \"undefined\");\n    });\n\n    it(\"#2200\", () => {\n        const project = convert();\n        const Test = query(project, \"Test\");\n        equal(Test.type?.type, \"reflection\" as const);\n        equal(\n            Test.type.declaration.getChildByName(\"x\")?.flags.isOptional,\n            true,\n        );\n    });\n\n    it(\"#2207\", () => {\n        const project = convert();\n        const mod = query(project, \"Mod\");\n        equal(mod.sources?.[0].line, 1);\n    });\n\n    it(\"#2220\", () => {\n        const project = convert();\n        const fn = query(project, \"createAssetEmitter\");\n        const param = fn.signatures?.[0].parameters?.[0];\n        ok(param);\n        equal(param.type?.type, \"query\");\n        equal(param.type.queryType.reflection?.name, \"TypeEmitter\");\n    });\n\n    it(\"#2222\", () => {\n        const project = convert();\n        const example = query(project, \"example\");\n        equal(\n            Comment.combineDisplayParts(\n                example.comment?.getTag(\"@example\")?.content,\n            ),\n            \"```ts\\nlet x = `str`\\n```\",\n        );\n    });\n\n    it(\"#2233\", () => {\n        const project = convert();\n        const int = query(project, \"Int\");\n        const cls = query(project, \"IntImpl\");\n\n        for (const name of [\"prop\", \"prop2\", \"method\", \"method2\"]) {\n            const intFn = int.getChildByName(name) as DeclarationReflection;\n            const clsFn = cls.getChildByName(name) as DeclarationReflection;\n            equal(\n                clsFn.implementationOf?.reflection?.getFullName(),\n                intFn.getFullName(),\n                `${name} method not properly linked`,\n            );\n\n            const intTarget = intFn.signatures?.[0] || intFn;\n            const clsSig = clsFn.signatures?.[0] ||\n                clsFn.type?.visit({\n                    reflection: (r) => r.declaration.signatures?.[0],\n                });\n\n            equal(\n                clsSig!.implementationOf?.reflection?.getFullName(),\n                intTarget.getFullName(),\n                `${name} signature not properly linked`,\n            );\n        }\n    });\n\n    it(\"#2234 Handles implementationOf with symbols \", () => {\n        const project = convert();\n        const cm = query(project, \"CharMap\");\n        equal(\n            cm.children?.map((c) => c.name),\n            [\"constructor\", \"[iterator]\", \"at\"],\n        );\n\n        equal(\n            cm.children[1].implementationOf?.name,\n            \"ReadonlyCharMap.[iterator]\",\n        );\n    });\n\n    it(\"#2270 Handles http links with TS link resolution \", () => {\n        const project = convert();\n        const links = getLinks(query(project, \"A\"));\n        equal(links, [\n            {\n                display: \"Immutable\",\n                target: [ReflectionKind.TypeAlias, \"Immutable\"],\n            },\n            {\n                display: \"Immutable Objects\",\n                target: \"https://en.wikipedia.org/wiki/Immutable_object\",\n            },\n        ]);\n    });\n\n    it(\"#2290 Handles comments on interfaces with call signatures \", () => {\n        const project = convert();\n\n        equal(getComment(project, \"CallSignature\"), \"Int comment\");\n        equal(getComment(project, \"CallSignature2\"), \"Int comment\");\n        equal(getComment(project, \"CallSignature2.prop\"), \"Prop comment\");\n\n        equal(\n            Comment.combineDisplayParts(\n                query(project, \"CallSignature\").signatures![0].comment?.summary,\n            ),\n            \"Sig comment\",\n        );\n\n        equal(\n            Comment.combineDisplayParts(\n                query(project, \"CallSignature2\").signatures![0].comment\n                    ?.summary,\n            ),\n            \"Sig comment\",\n        );\n    });\n\n    it(\"#2291 Does not warn on notDocumented edge case \", () => {\n        app.options.setValue(\"validation\", { notDocumented: true });\n        const project = convert();\n        app.validate(project);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2296 Supports TS 5.0 \", () => {\n        const project = convert();\n        const names = query(project, \"names\");\n        equal(names.type?.toString(), 'readonly [\"Alice\", \"Bob\", \"Eve\"]');\n\n        const getNamesExactly = query(project, \"getNamesExactly\");\n        const sig = getNamesExactly.signatures![0];\n        const tp = sig.typeParameters![0];\n        equal(tp.flags.isConst, true);\n    });\n\n    it(\"#2307 Detects source locations coming from types and prefers value declarations, \", () => {\n        const project = convert();\n\n        const getLines = (name: string) => {\n            const refl = query(project, name);\n            return refl.signatures?.flatMap((sig) => sig.sources!.map((src) => src.line));\n        };\n\n        equal(getLines(\"double\"), [4]);\n        equal(getLines(\"foo\"), [6]);\n        equal(getLines(\"all\"), [10, 11]);\n    });\n\n    it(\"#2320 Uses type parameters from parent class in arrow-methods, \", () => {\n        const project = convert();\n        const arrow = querySig(project, \"ResolvedSubclass.arrowFunction\");\n\n        equal(arrow.typeParameters![0].type?.toString(), '\"one\" | \"two\"');\n    });\n\n    it(\"#2336 Handles comments with nested methods \", () => {\n        const project = convert();\n\n        const outer = querySig(project, \"ClassVersion.outer\");\n        equal(Comment.combineDisplayParts(outer.comment?.summary), \"Outer\");\n\n        equal(outer.type?.type, \"reflection\");\n        equal(\n            Comment.combineDisplayParts(\n                outer.type.declaration.signatures![0].comment?.summary,\n            ),\n            \"\",\n        );\n    });\n\n    it(\"#2360 Supports nested paths with tsLinkResolution \", () => {\n        const project = convert();\n        const x = query(project, \"x\");\n        const link = x.comment?.summary[0];\n        equal(link?.kind, \"inline-tag\");\n        equal(link.target, query(project, \"Foo.bar\"));\n    });\n\n    it(\"#2364 Handles duplicate declarations with @namespace \", () => {\n        const project = convert();\n        equal(\n            project.children?.map((c) => c.name),\n            [\"NS\", \"NS2\", \"NS2\"],\n        );\n        const ns = query(project, \"NS\");\n        equal(\n            ns.children?.map((c) => c.name),\n            [\"T\", \"property\"],\n        );\n    });\n\n    it(\"#2364 Gets properties when types/variables are merged with @namespace \", () => {\n        const project = convert();\n        const ns = project.children?.find(\n            (c) => c.name == \"NS2\" && c.kind == ReflectionKind.Namespace,\n        );\n        equal(\n            ns?.children?.map((c) => c.name),\n            [\"property\"],\n        );\n    });\n\n    it(\"#2372 Puts delegate type alias comments on the type alias \", () => {\n        const project = convert();\n        equal(\n            getComment(project, \"EventHandler\"),\n            \"The signature for a function acting as an event handler.\",\n        );\n\n        const typeSig = query(project, \"EventHandler\").type?.visit({\n            reflection(r) {\n                return r.declaration.signatures![0];\n            },\n        });\n\n        equal(Comment.combineDisplayParts(typeSig?.comment?.summary), \"\");\n    });\n\n    it(\"#2384 Handles spaces in JSDoc default parameter names \", () => {\n        const project = convert();\n        const Typed = query(project, \"Typed\");\n        equal(Typed.typeParameters?.length, 1);\n        equal(\n            Comment.combineDisplayParts(\n                Typed.typeParameters[0].comment?.summary,\n            ),\n            \"desc\",\n        );\n    });\n\n    it(\"#2389 Handles @template parameter constraints correctly, \", () => {\n        const project = convert();\n        const foo = query(project, \"foo\");\n        equal(foo.signatures?.length, 1);\n        equal(foo.signatures[0].typeParameters?.length, 2);\n\n        const [T, U] = foo.signatures[0].typeParameters;\n        equal(T.type?.toString(), \"string\");\n        equal(U.type?.toString(), undefined);\n    });\n\n    // This is rather unfortunate, we need to do this so that files which include only\n    // a single declare module can still have a comment on them, but it looks really\n    // weird and wrong if there are multiple declare module statements in a file...\n    // there's probably some nicer way of doing this that I'm not seeing right now.\n    it(\"#2401 Uses module comment discovery on 'declare module \\\"foo\\\"' \", () => {\n        const project = convert();\n        equal(\n            Comment.combineDisplayParts(project.comment?.summary),\n            \"Comment for module\",\n        );\n    });\n\n    it(\"#2414 Includes index signature comments \", () => {\n        const project = convert();\n        equal(\n            Comment.combineDisplayParts(\n                query(project, \"ObjectWithIndexSignature\").indexSignatures?.[0]\n                    ?.comment?.summary,\n            ),\n            \"Index comment.\",\n        );\n    });\n\n    it(\"#2430 Handles destructured object parameter defaults, \", () => {\n        const project = convert();\n        const Checkbox = querySig(project, \"Checkbox\");\n        equal(Checkbox.parameters?.length, 1);\n        equal(Checkbox.parameters[0].name, \"props\");\n        const type = Checkbox.parameters[0].type;\n        equal(type?.type, \"reflection\");\n        equal(\n            type.declaration.children?.map((c) => c.name),\n            [\"falseValue\", \"trueValue\", \"value\"],\n        );\n        equal(\n            type.declaration.children.map((c) => c.defaultValue),\n            [\"false\", \"true\", undefined],\n        );\n    });\n\n    it(\"#2436 Handles function-namespaces created with Object.assign \", () => {\n        const project = convert();\n        equal(query(project, \"bug\").kind, ReflectionKind.Function);\n        const foo = query(project, \"bug.foo\");\n        const bar = query(project, \"bug.bar\");\n        // It'd be kind of nice if foo became a method, but the symbol only has\n        // a Property flag, and there are other nicer ways to formulate this that do.\n        equal(foo.kind, ReflectionKind.Property, \"method\");\n        equal(bar.kind, ReflectionKind.Property, \"property\");\n    });\n\n    it(\"#2437 Does not warn due to the diamond problem in comment discovery \", () => {\n        convert();\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2438 Handles recursive aliases without looping infinitely \", () => {\n        const bad = query(convert(), \"Bad\");\n        equal(bad.kind, ReflectionKind.Interface);\n    });\n\n    it(\"#2444 Handles transient symbols correctly, \", () => {\n        const project = convert();\n        const boolEq = query(project, \"Boolean.equal\");\n        const numEq = query(project, \"Number.equal\");\n        equal(boolEq.signatures![0].parameters![0].type?.toString(), \"boolean\");\n        equal(numEq.signatures![0].parameters![0].type?.toString(), \"number\");\n    });\n\n    it(\"#2451 Handles unions created due to union within intersection, \", () => {\n        const project = convert();\n\n        const is = querySig(project, \"FooA.is\");\n        equal(is.type?.toString(), \"this is Foo & { type: Type }\");\n    });\n\n    it(\"#2466 Does not care about conversion order for @link resolution, \", () => {\n        const project = convert();\n\n        const Two = query(project, \"Two\");\n        equal(getLinks(Two), [\n            {\n                display: \"method1\",\n                target: [ReflectionKind.Method, \"Two.method1\"],\n            },\n        ]);\n\n        const Three = query(project, \"Three\");\n        equal(getLinks(Three), [\n            {\n                display: \"method2\",\n                target: [ReflectionKind.Method, \"Three.method2\"],\n            },\n        ]);\n    });\n\n    it(\"#2476 Creates a separate namespace for `declare namespace` case \", () => {\n        const project = convert();\n\n        equal(\n            project.children?.map((c) => [c.name, c.kind]),\n            [\n                [\"test\", ReflectionKind.Namespace],\n                [\"test\", ReflectionKind.Function],\n            ],\n        );\n\n        equal(\n            project.children[0].children?.map((c) => c.name),\n            [\"Options\"],\n        );\n    });\n\n    it(\"#2478 Creates a separate namespace for `declare namespace` case with variables \", () => {\n        const project = convert();\n\n        equal(\n            project.children?.map((c) => [c.name, c.kind]),\n            [\n                [\"test\", ReflectionKind.Namespace],\n                [\"test\", ReflectionKind.Function],\n            ],\n        );\n\n        equal(\n            project.children[0].children?.map((c) => c.name),\n            [\"Options\"],\n        );\n    });\n\n    it(\"#2495 Does not crash when rendering recursive hierarchy, \", () => {\n        const project = convert();\n\n        const theme = new DefaultTheme(app.renderer);\n        theme.router = new KindRouter(app);\n        theme.router.buildPages(project);\n        const page = new PageEvent(project);\n        page.project = project;\n        const context = theme.getRenderContext(page);\n        context.hierarchyTemplate(page);\n    });\n\n    it(\"#2496 Correctly cleans up references to functions \", () => {\n        app.options.setValue(\"excludeNotDocumented\", true);\n        convert();\n    });\n\n    it(\"#2502 Sorts literal numeric unions when converting a type, \", () => {\n        const project = convert();\n        const refl = query(project, \"Test\");\n        equal(refl.type?.toString(), \"1 | 2 | 3\");\n    });\n\n    it(\"#2507 Handles an infinitely recursive type, \", () => {\n        const project = convert();\n        const type = querySig(project, \"fromPartial\").typeParameters![0].type;\n\n        equal(\n            type?.toString(),\n            \"Value & { values: Value[] & (Value & { values: Value[] & (Value & { values: (...) & (...) })[] })[] }\",\n        );\n    });\n\n    it(\"#2508 Handles constructed references to enumeration types, \", () => {\n        const project = convert();\n        const refl = query(project, \"Bar.color\");\n        equal(refl.type?.type, \"reference\");\n        equal(refl.type.toString(), \"Color\");\n        equal(refl.type.reflection?.id, query(project, \"Color\").id);\n    });\n\n    it(\"#2509 Does not duplicate comments due to signatures being present, \", () => {\n        const project = convert();\n        const cb = query(project, \"Int.cb\");\n        equal(Comment.combineDisplayParts(cb.comment?.summary), \"Cb\");\n        equal(cb.type?.type, \"reflection\");\n        equal(cb.type.declaration.signatures![0].comment, undefined);\n\n        const nested = query(project, \"Int.nested\");\n        equal(nested.type?.type, \"reflection\");\n        const cb2 = nested.type.declaration.children![0];\n        equal(Comment.combineDisplayParts(cb2.comment?.summary), \"Cb2\");\n        equal(cb2.type?.type, \"reflection\");\n        equal(cb2.type.declaration.signatures![0].comment, undefined);\n    });\n\n    it(\"#2521 Specifying comment on variable still inherits signature comments, \", () => {\n        const project = convert();\n\n        equal(getComment(project, \"fooWithoutComment\"), \"\");\n        equal(getSigComment(project, \"fooWithoutComment\", 0), \"Overload 1\");\n        equal(getSigComment(project, \"fooWithoutComment\", 1), \"Overload 2\");\n\n        equal(getComment(project, \"fooWithComment\"), \"New comment.\");\n        equal(getSigComment(project, \"fooWithComment\", 0), \"Overload 1\");\n        equal(getSigComment(project, \"fooWithComment\", 1), \"Overload 2\");\n    });\n\n    it(\"#2524 Handles links to type alias properties\", () => {\n        const project = convert();\n        app.options.setValue(\"validation\", false);\n        app.options.setValue(\"validation\", { invalidLink: true });\n        app.validate(project);\n\n        const def = query(project, \"Alias.default\");\n        equal(getLinks(def), [\n            {\n                display: \"other\",\n                target: [ReflectionKind.Property, \"Alias.other\"],\n            },\n            {\n                display: \"other\",\n                target: [ReflectionKind.Property, \"Alias.other\"],\n            },\n        ]);\n\n        const other = query(project, \"Alias.other\");\n        equal(getLinks(other), [\n            {\n                display: \"default\",\n                target: [ReflectionKind.Property, \"Alias.default\"],\n            },\n            {\n                display: \"default\",\n                target: [ReflectionKind.Property, \"Alias.default\"],\n            },\n        ]);\n    });\n\n    it(\"#2545 discovers comments from non-exported 'parent' methods\", () => {\n        const project = convert();\n\n        equal(getSigComment(project, \"Child.notAbstract\"), \"notAbstract docs\");\n        equal(\n            getSigComment(project, \"Child.notAbstract2\"),\n            \"notAbstract2 docs\",\n        );\n        equal(getSigComment(project, \"Child.isAbstract\"), \"isAbstract docs\");\n        equal(\n            getComment(project, \"Child.abstractProperty\"),\n            \"abstractProperty docs\",\n        );\n\n        // #2084\n        equal(\n            querySig(project, \"Bar.isInternal\").comment?.hasModifier(\n                \"@internal\",\n            ),\n            true,\n        );\n    });\n\n    it(\"#2552 Ignores @license and @import comments, \", () => {\n        const project = convert();\n        equal(\n            Comment.combineDisplayParts(project.comment?.summary),\n            \"This is an awesome module.\",\n        );\n        equal(getComment(project, \"something\"), \"\");\n    });\n\n    it(\"#2553 Does not warn about documented constructor signature type aliases, \", () => {\n        const project = convert();\n        app.validate(project);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2555 allows nested @param comments\", () => {\n        const project = convert();\n        const sig = querySig(project, \"ComponentWithOptions\");\n        const param = sig.parameters?.[0];\n        equal(param?.type?.type, \"reflection\");\n        const title = param.type.declaration.getChildOrTypePropertyByName([\n            \"title\",\n        ]);\n        const options = param.type.declaration.getChildOrTypePropertyByName([\n            \"options\",\n        ]);\n        const featureA = param.type.declaration.getChildOrTypePropertyByName([\n            \"options\",\n            \"featureA\",\n        ]);\n        const featureB = param.type.declaration.getChildOrTypePropertyByName([\n            \"options\",\n            \"featureB\",\n        ]);\n\n        const comments = [param, title, options, featureA, featureB].map((d) =>\n            Comment.combineDisplayParts(d?.comment?.summary)\n        );\n\n        equal(comments, [\n            \"Component properties.\",\n            \"Title.\",\n            \"Options.\",\n            \"Turn on or off featureA.\",\n            \"Turn on or off featureB.\",\n        ]);\n    });\n\n    it(\"#2574 default export\", () => {\n        const project = convert();\n        const sig = querySig(project, \"usesDefaultExport\");\n        const param = sig.parameters?.[0];\n        ok(param, \"Missing parameter\");\n        equal(param.name, \"param\", \"Incorrect parameter name\");\n        equal(\n            param.type?.type,\n            \"reference\",\n            \"Parameter is not a reference type\",\n        );\n        equal(param.type.name, \"DefaultExport\", \"Incorrect reference name\");\n        equal(param.type.qualifiedName, \"default\", \"Incorrect qualified name\");\n    });\n\n    it(\"#2574 not default export\", () => {\n        const project = convert();\n        const sig = querySig(project, \"usesNonDefaultExport\");\n        const param = sig.parameters?.[0];\n        ok(param, \"Missing parameter\");\n        equal(param.name, \"param\", \"Incorrect parameter name\");\n        equal(\n            param.type?.type,\n            \"reference\",\n            \"Parameter is not a reference type\",\n        );\n        equal(param.type.name, \"NotDefaultExport\", \"Incorrect reference name\");\n        equal(\n            param.type.qualifiedName,\n            \"NotDefaultExport\",\n            \"Incorrect qualified name\",\n        );\n    });\n\n    it(\"#2582 nested @namespace\", () => {\n        const project = convert();\n\n        equalKind(query(project, \"f32\"), ReflectionKind.Namespace);\n        equalKind(query(project, \"f32.a\"), ReflectionKind.Namespace);\n        equalKind(query(project, \"f32.a.member\"), ReflectionKind.Variable);\n        equalKind(query(project, \"f32.a.fn\"), ReflectionKind.Function);\n        equalKind(query(project, \"f32.b\"), ReflectionKind.Namespace);\n        equalKind(query(project, \"f32.b.member\"), ReflectionKind.Reference); // Somewhat odd, but not wrong...\n        equalKind(query(project, \"f32.b.fn\"), ReflectionKind.Function);\n\n        equal(getComment(project, \"f32\"), \"f32 comment\");\n        equal(getComment(project, \"f32.a\"), \"A comment\");\n        equal(getComment(project, \"f32.a.member\"), \"Member comment\");\n        equal(getSigComment(project, \"f32.a.fn\"), \"Fn comment\");\n        equal(getComment(project, \"f32.b\"), \"B comment\");\n    });\n\n    it(\"#2585 supports comments on union members\", () => {\n        const project = convert();\n        const Foo = query(project, \"Foo\");\n        equal(Foo.type?.type, \"union\");\n\n        equal(Foo.type.elementSummaries?.length, 2);\n        equal(Foo.type.elementSummaries.map(Comment.combineDisplayParts), [\n            \"Doc of foo1.\",\n            \"Doc of foo2.\",\n        ]);\n    });\n\n    it(\"#2587 comment on shorthand property declaration\", () => {\n        const project = convert();\n\n        const sig = querySig(project, \"foo\");\n        equal(sig.type?.type, \"reflection\");\n        const x = sig.type.declaration.getChildByName(\"x\");\n        ok(x);\n\n        equal(\n            Comment.combineDisplayParts(x.comment?.summary),\n            \"Shorthand comment\",\n        );\n    });\n\n    it(\"#2603 handles @author tag\", () => {\n        const project = convert();\n        const x = query(project, \"x\");\n        equal(\n            x.comment?.getTag(\"@author\"),\n            new CommentTag(\"@author\", [{ kind: \"text\", text: \"Ian Awesome\" }]),\n        );\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2611 can suppress warnings from comments in declaration files\", () => {\n        app.options.setValue(\n            \"suppressCommentWarningsInDeclarationFiles\",\n            false,\n        );\n        convert();\n        logger.expectMessage(\n            \"warn: Encountered an unknown block tag @tagThatIsNotDefined\",\n        );\n        logger.expectNoOtherMessages();\n        logger.reset();\n\n        app.options.setValue(\"suppressCommentWarningsInDeclarationFiles\", true);\n        convert();\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2614 supports @since tag\", () => {\n        const project = convert();\n        const foo = querySig(project, \"foo\");\n        equal(\n            foo.comment?.getTag(\"@since\"),\n            new CommentTag(\"@since\", [{ kind: \"text\", text: \"1.0.0\" }]),\n        );\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2631 handles CRLF line endings in frontmatter\", () => {\n        const project = convert();\n        equal(\n            project.documents?.map((d) => d.name),\n            [\"Windows Line Endings\"],\n        );\n    });\n\n    it(\"#2634 handles @hidden on function implementations\", () => {\n        const project = convert();\n        equal(project.children?.map((c) => c.name) || [], []);\n    });\n\n    it(\"#2636 does not treat parameters as class properties\", () => {\n        const project = convert();\n        const sig = querySig(project, \"B.constructor\");\n        equal(sig.parameters?.length, 1);\n    });\n\n    it(\"#2638 empty markdown file\", () => {\n        const project = convert();\n        equal(\n            project.documents?.map((d) => d.content),\n            [[]],\n        );\n    });\n\n    it(\"#2644 allows comments on signature parents to count for being documented\", () => {\n        app.options.setValue(\"validation\", { notDocumented: true });\n        const project = convert();\n        app.validate(project);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2683 supports @param on parameters with functions\", () => {\n        const project = convert();\n        const action = querySig(project, \"action\");\n        const callback = action.parameters![0];\n        equal(\n            Comment.combineDisplayParts(callback.comment?.summary),\n            \"Param comment\",\n        );\n\n        equal(callback.type?.type, \"reflection\");\n        const data = callback.type.declaration.signatures![0].parameters![0];\n        equal(Comment.combineDisplayParts(data?.comment?.summary), \"Data\");\n\n        const action2 = querySig(project, \"action2\");\n        const callback2 = action2.parameters![0];\n        equal(\n            Comment.combineDisplayParts(callback2.comment?.summary),\n            \"Param comment2\",\n        );\n\n        equal(callback2.type?.type, \"reflection\");\n        const data2 = callback2.type.declaration.signatures![0].parameters![0];\n        // Overwritten by the @param on the wrapping signature, so we never\n        // had a chance to copy the data's @param to the parameter.\n        equal(data2.comment, undefined);\n    });\n\n    it(\"#2693 handles the @abstract tag\", () => {\n        const project = convert();\n        ok(query(project, \"Foo.foo\").flags.isAbstract);\n        ok(!querySig(project, \"Foo.foo\").flags.isAbstract);\n        ok(query(project, \"Foo.x\").flags.isAbstract);\n\n        ok(query(project, \"Bar.foo\").flags.isAbstract);\n        ok(!querySig(project, \"Bar.foo\").flags.isAbstract);\n        ok(query(project, \"Bar.x\").flags.isAbstract);\n    });\n\n    it(\"#2698 handles this parameters present in type but not node\", () => {\n        const project = convert();\n        const animator = querySig(project, \"animator\");\n        equal(\n            animator.parameters?.map((p) => p.name),\n            [\"this\", \"numSpins\", \"direction\"],\n        );\n\n        equal(\n            animator.parameters.map((p) => p.defaultValue),\n            [undefined, \"2\", '\"counterclockwise\"'],\n        );\n    });\n\n    it(\"#2700 respects user specified link text when resolving external links\", () => {\n        const project = convert();\n\n        const abc = query(project, \"abc\");\n        ok(abc.comment);\n\n        const resolvers = app.converter[\"_externalSymbolResolvers\"].slice();\n        app.converter.addUnknownSymbolResolver(() => {\n            return {\n                target: \"https://typedoc.org\",\n                caption: \"resolver caption\",\n            };\n        });\n        app.converter.resolveLinks(abc);\n        app.converter[\"_externalSymbolResolvers\"] = resolvers;\n\n        equal(getLinks(abc), [\n            { display: \"size user specified\", target: \"https://typedoc.org\" },\n            { display: \"user specified\", target: \"https://typedoc.org\" },\n            { display: \"resolver caption\", target: \"https://typedoc.org\" },\n        ]);\n    });\n\n    it(\"#2704 implicitly adds symbols tagged with @ignore to intentionallyNotExported list\", () => {\n        app.options.setValue(\"validation\", {\n            notExported: true,\n            notDocumented: false,\n        });\n        const project = convert();\n        app.validate(project);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2718 uses the comment on the first signature for subsequent signatures\", () => {\n        const project = convert();\n        equal(getSigComment(project, \"foo\", 0), \"First\");\n        equal(getSigComment(project, \"foo\", 1), \"First\");\n        equal(getSigComment(project, \"foo\", 2), \"Third\");\n\n        equal(getSigComment(project, \"Foo.bar\", 0), \"First\");\n        equal(getSigComment(project, \"Foo.bar\", 1), \"First\");\n        equal(getSigComment(project, \"Foo.bar\", 2), \"Third\");\n    });\n\n    it(\"#2719 handles @enum where types are declared before the variable\", () => {\n        const project = convert();\n        const tz = query(project, \"Timezone\");\n        equal(tz.kind, ReflectionKind.Enum);\n\n        equal(\n            tz.children?.map((c) => c.name),\n            [\"Africa/Abidjan\", \"Africa/Accra\"],\n        );\n    });\n\n    it(\"#2721 handles bigint literals in default values\", () => {\n        const project = convert();\n        equal(query(project, \"big\").defaultValue, \"123n\");\n        equal(query(project, \"neg\").defaultValue, \"-123n\");\n    });\n\n    it(\"#2725 respects symbol IDs when resolving links with user configured resolver\", () => {\n        app.options.setValue(\"externalSymbolLinkMappings\", {\n            typescript: {\n                \"ts.Node\": \"https://typescriptlang.org\",\n            },\n        });\n        const project = convert();\n        equal(getLinks(query(project, \"node\")), [\n            { display: \"Node\", target: \"https://typescriptlang.org\" },\n        ]);\n    });\n\n    it(\"#2755 handles multiple signature when discovering inherited comments\", () => {\n        const project = convert();\n        equal(getSigComment(project, \"Test.method\", 0), \"A\");\n        equal(getSigComment(project, \"Test.method\", 1), \"B\");\n\n        equal(getSigComment(project, \"Class.method\", 0), \"A\");\n        equal(getSigComment(project, \"Class.method\", 1), \"B\");\n\n        equal(getSigComment(project, \"Callable\", 0), \"A\");\n        equal(getSigComment(project, \"Callable\", 1), \"B\");\n    });\n\n    it(\"#2774 gets global symbols in a consistent manner\", () => {\n        const project = convert(\n            \"gh2774/gh2774.ts\",\n            \"gh2774/globalAugment.ts\",\n            \"gh2774/moduleAugment.ts\",\n        );\n\n        const decl = query(project, \"gh2774/gh2774.GH2774\");\n        equal(\n            decl.children?.map((c) => c.name),\n            [\"Extensions\"],\n        );\n    });\n\n    it(\"#2778 creates modules for declare module blocks\", () => {\n        const project = convert();\n        equal(\n            project.children?.map((c) => c.name),\n            [\"common\", \"foo/bar1\", \"foo/bar2\"],\n        );\n        equal(\n            project.children.map((c) => c.kind),\n            [\n                ReflectionKind.Module,\n                ReflectionKind.Module,\n                ReflectionKind.Module,\n            ],\n        );\n    });\n\n    it(\"#2779 handles import type references\", () => {\n        const project = convert();\n        const Bar = query(project, \"bar.Nested.Bar\");\n        const Foo = query(project, \"foo.Foo\");\n\n        equal(Foo.type?.type, \"reference\");\n        equal(Foo.type.reflection?.getFullName(), Bar.getFullName());\n    });\n\n    it(\"#2792 handles @ts-expect-error on import types by converting to any\", () => {\n        const project = convert();\n        const node = query(project, \"TypeNodeType.generated\");\n        equal(node.type?.toString(), \"any\");\n\n        const type = query(project, \"typeType\");\n        equal(type.type?.toString(), \"any\");\n    });\n\n    it(\"#2800 handles @include tags on project\", () => {\n        const project = convert();\n        const includeTag = project.comment?.summary.find(\n            (t) => t.kind === \"inline-tag\",\n        );\n        equal(includeTag, undefined);\n\n        ok(\n            Comment.combineDisplayParts(project.comment?.summary).includes(\n                \"const bug\",\n            ),\n        );\n    });\n\n    it(\"#2802 preserves @alpha tags on signature types\", () => {\n        const project = convert();\n        const alpha1 = query(project, \"AlphaOk\");\n        equal(Comment.combineDisplayParts(alpha1.comment?.summary), \"Docs\");\n        ok(alpha1.comment?.hasModifier(\"@alpha\"));\n\n        const alpha2 = query(project, \"AlphaNoGo\");\n        equal(Comment.combineDisplayParts(alpha2.comment?.summary), \"Docs2\");\n        ok(alpha2.comment?.hasModifier(\"@alpha\"));\n\n        // Modifiers should not have been cascaded\n        equal(alpha2.type?.type, \"reflection\");\n        equal(alpha2.type.declaration.comment, undefined);\n    });\n\n    it(\"#2811 avoids references to references\", () => {\n        const project = convert();\n        const abc = query(project, \"abc\");\n        const rename1 = query(project, \"rename1\");\n        ok(rename1.isReference());\n        ok(rename1.getTargetReflection() === abc);\n\n        const rename2 = query(project, \"rename2\");\n        ok(rename2.isReference());\n        ok(rename2.getTargetReflection() === abc);\n    });\n\n    it(\"#2817 handles edge cases with lifted type aliases\", () => {\n        const project = convert();\n        equal(reflToTree(project), {\n            Ctor: \"TypeAlias\",\n            Edges: {\n                \"Constructor:constructor\": \"Constructor\",\n                getter: \"Accessor\",\n                prop: \"Property\",\n            },\n            Edges2: {\n                getter: \"Accessor\",\n                prop: \"Property\",\n            },\n            NotLifted: \"TypeAlias\",\n        });\n\n        const edges = query(project, \"Edges2\");\n        equal(edges.indexSignatures?.length, 1);\n        equal(edges.signatures?.length, 3);\n\n        equal(edges.signatures[0].name, edges.name);\n    });\n\n    it(\"#2820 does not include defaulted type arguments\", () => {\n        const project = convert();\n        const f = querySig(project, \"f\");\n\n        equal(f.type?.toString(), \"Uint8Array\");\n        equal(f.parameters?.[0].type?.toString(), \"Uint8Array\");\n    });\n\n    it(\"#2823 avoids including defaulted type arguments\", () => {\n        const project = convert();\n\n        const sigNames = [\"f0\", \"f1\", \"f2\", \"f3\", \"f4\", \"f5\", \"f6\", \"f7\"];\n        const sigs = sigNames.map((name) => querySig(project, name));\n        const returnTypes = sigs.map((s) => s.type?.toString());\n        const paramTypes = sigs.map((s) => s.parameters?.[0].type?.toString());\n\n        const expectedTypes = [\n            \"T<number, number, boolean>\",\n            \"T<string>\",\n            \"T<number>\",\n            \"T<number, number>\",\n            \"T<number, string>\",\n            \"T<string, string>\",\n            \"T<number, string, string>\",\n            \"T<number, number, string>\",\n        ];\n\n        equal(returnTypes, expectedTypes);\n        equal(paramTypes, expectedTypes);\n    });\n\n    it(\"#2842 handles computed properties with @class\", () => {\n        const project = convert();\n        const hello = query(project, \"ComputedClass.hello\");\n\n        equal(hello.kind, ReflectionKind.Property);\n        equal(hello.type?.toString(), \"string\");\n    });\n\n    it(\"#2844 treats partially-external symbols as not external\", () => {\n        app.options.setValue(\"excludeExternals\", true);\n        const project = convert();\n        const url = query(project, \"globalThis.URL\");\n        equal(\n            url.children?.map((c) => c.name),\n            [\"customMethod\"],\n        );\n    });\n\n    it(\"#2856 supports deferring export conversion\", () => {\n        const project = convert();\n\n        ok(!query(project, \"A.definedInA\").isReference());\n        ok(query(project, \"A.definedInB\").isReference());\n\n        ok(query(project, \"B.definedInA\").isReference());\n        ok(!query(project, \"B.definedInB\").isReference());\n    });\n\n    it(\"#2876 converts both expando and namespace properties\", () => {\n        const project = convert();\n\n        equal(reflToTree(project), {\n            \"Namespace:MyComponent\": {\n                \"Props\": {\n                    \"children\": \"Property\",\n                },\n                \"propTypes\": \"Variable\",\n            },\n            \"Function:MyComponent\": \"Function\",\n        });\n    });\n\n    it(\"#2881 converts variables as functions if desired\", () => {\n        const project = convert();\n\n        equal(reflToTree(project), {\n            Callable: \"Interface\",\n            fnByDefault: \"Function\",\n            fnByTag: \"Function\",\n            notFn: \"Variable\",\n        });\n    });\n\n    it(\"#2909 handles array export declarations\", () => {\n        const project = convert();\n        const exp = query(project, \"export=\");\n        equal(exp.type?.toString(), \"never[]\");\n    });\n\n    it(\"#2914 does not categorize @class constructor if class is categorized\", () => {\n        app.options.setValue(\"categorizeByGroup\", false);\n        const project = convert();\n        const Bug1 = query(project, \"Bug1\");\n        equal(Bug1.children?.map(c => c.name), [\"constructor\", \"x\"]);\n        equal(Bug1.categories === undefined, true, \"Should not have categories\");\n\n        equal(project.categories?.length, 2);\n        equal(project.categories[0].title, \"Bug\");\n        equal(project.categories[1].title, \"Other\");\n    });\n\n    it(\"#2914 includes constructor parameters\", () => {\n        app.options.setValue(\"categorizeByGroup\", false);\n        const project = convert();\n        const ctor = querySig(project, \"Bug2.constructor\");\n        equal(ctor.parameters?.length, 1);\n        equal(ctor.parameters[0].name, \"x\");\n        equal(ctor.parameters[0].type?.toString(), \"string\");\n    });\n\n    it(\"#2914 converts constructor type parameters as class type parameters\", () => {\n        const project = convert();\n        const Bug3 = query(project, \"Bug3\");\n        equal(Bug3.typeParameters?.length, 1);\n        equal(Bug3.typeParameters[0].type?.toString(), \"string\");\n        const ctor = querySig(project, \"Bug3.constructor\");\n        equal(ctor.typeParameters, undefined);\n    });\n\n    it(\"#2914 includes call signatures on the class type\", () => {\n        const project = convert();\n        const Bug4 = query(project, \"Bug4\");\n        equal(Bug4.signatures?.length, 1);\n        equal(Bug4.signatures[0].type?.toString(), \"U\");\n    });\n\n    it(\"#2916 handles @inline on @typedef declared types\", () => {\n        const project = convert();\n        const hello = querySig(project, \"hello\");\n        equal(hello.parameters?.[0].type?.toString(), \"{ name: string }\");\n    });\n\n    it(\"#2917 stringifies index signatures\", () => {\n        const project = convert();\n        const data = query(project, \"Foo.data\");\n        equal(data.type?.toString(), \"{ [key: string]: any }\");\n        const mixed = query(project, \"Foo.mixed\");\n        equal(mixed.type?.toString(), \"{ (): string; a: string; [key: string]: any }\");\n    });\n\n    it(\"#2920 handles inlining union types\", () => {\n        const project = convert();\n        const test = querySig(project, \"test\");\n        equal(test.parameters?.[0].type?.toString(), '\"main\" | \"test\"');\n\n        const test2 = query(project, \"NotInlined\");\n        equal(test2.type?.toString(), \"InlinedConditional<string>\");\n\n        const test3 = query(project, \"InlineArray\");\n        equal(test3.type?.toString(), \"string[]\");\n    });\n\n    it(\"#2929 handles type parameters on JS classes\", () => {\n        const project = convert();\n        const NumberManager = query(project, \"NumberManager\");\n        equal(NumberManager.typeParameters?.map(t => t.type?.toString()), [\"number\"]);\n        equal(NumberManager.typeParameters?.map(t => t.default?.toString()), [\"1\"]);\n\n        const EdgeCases = query(project, \"EdgeCases\");\n        equal(EdgeCases.typeParameters?.map(t => t.type?.toString()), [\"number\", undefined]);\n    });\n\n    it(\"#2932 handles @inline on tuple types\", () => {\n        const project = convert();\n        const sig = querySig(project, \"doStuff\");\n        equal(sig.parameters?.[0].type?.toString(), \"[start: number, end: number]\");\n    });\n\n    it(\"#2937 resolves symbols before checking if they are excluded/external\", () => {\n        app.options.setValue(\"exclude\", [\"!**/not-excluded.ts\"]);\n        const project = convert();\n        equal(project.children?.map(c => c.name), [\"notExcluded\"]);\n    });\n\n    it(\"#2949 handles JSDoc wildcard types\", () => {\n        const project = convert();\n        equal(query(project, \"Test\").type?.toString(), \"() => Promise<any>\");\n    });\n\n    it(\"#2954 handles Readonly with Record type\", () => {\n        const project = convert();\n        equal(query(project, \"InterfaceA.propertyA\").type?.toString(), \"AliasA\");\n        equal(query(project, \"InterfaceA.propertyB\").type?.toString(), \"AliasB<string>\");\n        equal(query(project, \"InterfaceA.propertyC\").type?.toString(), \"AliasC\");\n    });\n\n    it(\"#2962 handles type-only exports\", () => {\n        const project = convert();\n        equal(project.children?.map(c => [c.name, ReflectionKind[c.kind]]), [\n            [\"Class\", \"Interface\"],\n            [\"Class2\", \"Interface\"],\n            [\"Func\", \"TypeAlias\"],\n            [\"Func2\", \"TypeAlias\"],\n            [\"Var\", \"TypeAlias\"],\n            [\"Var2\", \"TypeAlias\"],\n        ]);\n\n        equal(query(project, \"Class\").children?.map(c => c.name), [\"msg\"]);\n        equal(query(project, \"Func\").type?.toString(), \"(a: T) => void\");\n        equal(query(project, \"Var\").type?.toString(), \"123\");\n    });\n\n    it(\"#2964 handles ignored instances of wildcard declared modules\", () => {\n        const project = convert();\n        equal(project.children?.map(c => c.name), [\"third\"]);\n    });\n\n    it(\"#2970 includes comments on type only exports\", () => {\n        const project = convert();\n        equal(project.children?.map(c => [c.name, Comment.combineDisplayParts(c.comment?.summary)]), [\n            [\"Class\", \"Comment\"],\n            [\"Func\", \"Comment\"],\n            [\"Var\", \"Comment\"],\n        ]);\n    });\n\n    it(\"#2978 handles parent properties through mapped types\", () => {\n        const project = convert();\n        const prop = query(project, \"Child.prop\");\n        equal(prop.inheritedFrom?.reflection?.getFullName(), \"Parent.prop\");\n        const x = query(project, \"InheritsX.x\");\n        equal(x.inheritedFrom?.reflection?.getFullName(), undefined);\n        equal(x.inheritedFrom?.name, \"Tricky.x\");\n    });\n\n    it(\"#2994 uses TS link resolution in first comment of file\", () => {\n        const project = convert();\n        const link = project.comment?.summary.find(part => part.kind === \"inline-tag\");\n        ok(link?.target instanceof ReflectionSymbolId);\n    });\n\n    it(\"#2999 picks up parent comments from shorthand property assignments\", () => {\n        const project = convert();\n        const opts = query(project, \"Options\");\n        equal(opts.type?.type, \"reflection\");\n        const local = opts.type.declaration.getChildByName(\"LocalObject\");\n        equal(Comment.combineDisplayParts(local?.comment?.summary), \"A test object with property a.\");\n    });\n\n    it(\"#3003 handles @enum on properties within @namespace\", () => {\n        const project = convert();\n\n        const a = query(project, \"ExportedObject.CustomEnum\");\n        equalKind(a, ReflectionKind.Enum);\n        equal(a.children?.map(c => c.name), [\"A\"]);\n        equal(a.children?.map(c => c.type?.toString()), ['\"A\"']);\n        const b = query(project, \"ExportedObject.CustomEnum2\");\n        equalKind(b, ReflectionKind.Enum);\n        equal(b.children?.map(c => c.name), [\"A\", \"D\"]);\n        equal(b.children?.map(c => c.type?.toString()), ['\"A\"', '\"D\"']);\n    });\n\n    it(\"#3006 handles documents containing spaces in their names\", () => {\n        const project = convert();\n        equal([\"two words\"], project.documents?.map(doc => doc.name));\n        const doc = project.documents?.[0];\n        const x = query(project, \"x\");\n\n        ok(x.comment?.summary[1].kind === \"relative-link\");\n        ok(x.comment.summary[1].target);\n        ok(project.files.resolve(x.comment.summary[1].target, project) === doc);\n    });\n\n    it(\"#3009 supports a base path for resolving relative links\", () => {\n        app.options.setValue(\"basePath\", TYPEDOC_ROOT);\n        const project = convert();\n        const x = query(project, \"x\");\n        const links = x.comment?.summary.filter(part => part.kind === \"relative-link\");\n        equal(links?.length, 3);\n        equal(links[0].target, 1);\n        equal(links[1].target, 1);\n        equal(links[2].target, 2);\n        ok(app.files.resolve(1 as FileId, project) == project);\n        equal(\n            app.files.resolve(2 as FileId, project),\n            NormalizedPathUtils.resolve(normalizePath(TYPEDOC_ROOT), normalizePath(\"CHANGELOG.md\")),\n        );\n    });\n\n    it(\"#3012 removes @remarks from inheriting comment\", () => {\n        const project = convert();\n        const nullProto = query(project, \"NullProtoObjectSchema\");\n        equal(nullProto.comment?.blockTags.map(t => t.tag), [\"@remarks\"]);\n        equal(nullProto.comment?.blockTags.map(t => Comment.combineDisplayParts(t.content)), [\"DictRemarks\"]);\n\n        logger.expectMessage(\"warn: Content in the @remarks block will be overwritten*\");\n    });\n\n    it(\"#3017 supports excluding #private fields only\", () => {\n        app.options.setValue(\"excludePrivate\", false);\n        app.options.setValue(\"excludePrivateClassFields\", false);\n        let project = convert();\n        equal(query(project, \"GH3017\").children?.map(c => c.name), [\"#hashPriv\", \"priv\", \"prot\", \"pub\"]);\n\n        app.options.setValue(\"excludePrivate\", false);\n        app.options.setValue(\"excludePrivateClassFields\", true);\n        project = convert();\n        equal(query(project, \"GH3017\").children?.map(c => c.name), [\"priv\", \"prot\", \"pub\"]);\n\n        app.options.setValue(\"excludePrivate\", true);\n        app.options.setValue(\"excludePrivateClassFields\", false);\n        project = convert();\n        equal(query(project, \"GH3017\").children?.map(c => c.name), [\"prot\", \"pub\"]);\n\n        app.options.setValue(\"excludePrivate\", true);\n        app.options.setValue(\"excludePrivateClassFields\", true);\n        project = convert();\n        equal(query(project, \"GH3017\").children?.map(c => c.name), [\"prot\", \"pub\"]);\n    });\n\n    it(\"#3019 correctly parses accessor types\", () => {\n        const project = convert();\n        equal(query(project, \"GH3019.x\").type?.toString(), \"string\");\n        equal(query(project, \"GH3019.y\").type?.toString(), \"number\");\n    });\n\n    it(\"#3020 permits preserving type annotations\", () => {\n        app.options.setValue(\"blockTags\", [\"@fires\"]);\n        app.options.setValue(\"preservedTypeAnnotationTags\", [\"@fires\"]);\n        const project = convert();\n        const btn = query(project, \"ButtonControlElement\");\n\n        equal(btn.comment?.blockTags.length, 1);\n        equal(btn.comment.blockTags[0].tag, \"@fires\");\n        equal(btn.comment.blockTags[0].typeAnnotation, \"{CustomEvent<{id: string, source: Element}>}\");\n    });\n\n    it(\"#3024 places null and undefined last in unions converted from types\", () => {\n        const project = convert();\n        const method = querySig(project, \"GH3024.method\");\n        equal(method.parameters?.[0].type?.toString(), \"string | undefined\");\n\n        const method2 = querySig(project, \"GH3024.method2\");\n        equal(method2.parameters?.[0].type?.toString(), \"string | null\");\n\n        const method3 = querySig(project, \"GH3024.method3\");\n        equal(method3.parameters?.[0].type?.toString(), \"string | null | undefined\");\n    });\n\n    it(\"#3026 handles @this parameter comments and destructured parameter renames with this parameters\", () => {\n        const project = convert();\n        const sig = querySig(project, \"extendedResponse\");\n        equal(sig.parameters?.map(p => p.name), [\"this\", \"params\"]);\n\n        const comments = sig.parameters.map(p => Comment.combineDisplayParts(p.comment?.summary));\n        equal(comments, [\"this param\", \"params\"]);\n\n        const types = sig.parameters.map(p => p.type?.toString());\n        equal(types, [\"{ x: string }\", \"{ y: string }\"]);\n    });\n\n    it(\"#3031 handles @template type parameters on JS classes\", () => {\n        app.options.setValue(\"validation\", { notDocumented: true });\n        app.options.setValue(\"requiredToBeDocumented\", [\"Class\", \"TypeParameter\"]);\n\n        const project = convert();\n        app.validate(project);\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#3050 supports alternative inline tag syntax for modifiers when parsing JSDoc comments\", () => {\n        const project = convert();\n\n        const bar = query(project, \"Bar\");\n        equalKind(bar, ReflectionKind.Interface);\n        // This happens twice, once for Foo and once for Bar\n        logger.expectMessage(\"warn: \" + i18n.inline_tag_0_not_parsed_as_modifier_tag_1(\"@interface\", \"with text\"));\n        logger.expectMessage(\"warn: \" + i18n.inline_tag_0_not_parsed_as_modifier_tag_1(\"@interface\", \"with text\"));\n    });\n\n    it(\"#3064 does not produce warnings regarding duplicate comments for declaration merged types/functions\", () => {\n        const project = convert();\n\n        equal(project.children?.length, 2);\n        equalKind(project.children[0], ReflectionKind.TypeAlias);\n        equalKind(project.children[1], ReflectionKind.Function);\n\n        equal(Comment.combineDisplayParts(project.children[0].comment?.summary), \"A\");\n        equal(Comment.combineDisplayParts(project.children[1].signatures?.[0].comment?.summary), \"B\");\n    });\n\n    it(\"#3070 does not warn due to bad comment in declaration file\", () => {\n        app.options.setValue(\"excludeExternals\", false);\n        app.options.setValue(\"suppressCommentWarningsInDeclarationFiles\", true);\n        convert();\n    });\n\n    it(\"#3071 correctly handles substitution types\", () => {\n        const project = convert();\n        const m = querySig(project, \"m\");\n        equal(m.type?.toString(), \"Content extends object ? Content : Other\");\n    });\n});\n"
  },
  {
    "path": "src/test/merge.test.ts",
    "content": "import { deepStrictEqual as equal, ok } from \"assert\";\nimport { join } from \"path\";\nimport { Application, EntryPointStrategy, normalizePath, ReferenceType } from \"../index.js\";\nimport { getConverterBase } from \"./programs.js\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { query } from \"./utils.js\";\n\nconst base = getConverterBase();\n\ndescribe(\"Merging projects\", () => {\n    it(\"Handles multiple projects\", async () => {\n        const app = await Application.bootstrap({\n            entryPointStrategy: EntryPointStrategy.Merge,\n            entryPoints: [\n                normalizePath(join(base, \"alias/specs.json\")),\n                normalizePath(join(base, \"class/*specs.json\")),\n            ],\n            projectDocuments: [],\n            name: \"typedoc\",\n        });\n        const logger = new TestLogger();\n        app.logger = logger;\n\n        const project = await app.convert();\n        logger.expectNoOtherMessages();\n\n        equal(project?.name, \"typedoc\");\n        equal(\n            project.children?.map((c) => c.name),\n            [\"alias\", \"class\"],\n        );\n\n        const crossRef = query(project, \"alias.MergedCrossReference\");\n        const testClass = query(project, \"class.class.TestClass\");\n        ok(crossRef.type instanceof ReferenceType);\n\n        ok(\n            testClass === crossRef.type.reflection,\n            \"Cross project reference did not work\",\n        );\n        const link = crossRef.comment?.summary[0];\n        equal(link?.kind, \"inline-tag\" as const);\n        equal(link.target, testClass, \"Cross project link did not work\");\n    });\n});\n"
  },
  {
    "path": "src/test/models/comment.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { Comment, type CommentDisplayPart, CommentTag } from \"../../index.js\";\n\ndescribe(\"Comment.similarTo\", () => {\n    it(\"Checks for similar summaries\", () => {\n        const a = new Comment([{ kind: \"text\", text: \"a\" }]);\n        const b = new Comment([{ kind: \"text\", text: \"a\" }]);\n        const c = new Comment([{ kind: \"text\", text: \"c\" }]);\n\n        equal(a.similarTo(b), true);\n        equal(a.similarTo(c), false);\n    });\n\n    it(\"Ignores modifier tags\", () => {\n        const a = new Comment([{ kind: \"text\", text: \"a\" }]);\n        a.modifierTags.add(\"@test\");\n        const b = new Comment([{ kind: \"text\", text: \"a\" }]);\n\n        equal(a.similarTo(b), true);\n    });\n\n    it(\"Checks block tags\", () => {\n        const a = new Comment([], [new CommentTag(\"@test\", [{ kind: \"text\", text: \"a\" }])]);\n        const b = new Comment([], [new CommentTag(\"@test\", [{ kind: \"text\", text: \"a\" }])]);\n        const c = new Comment([], [new CommentTag(\"@test\", [{ kind: \"text\", text: \"c\" }])]);\n        const d = new Comment([], [new CommentTag(\"@test2\", [{ kind: \"text\", text: \"c\" }])]);\n        const e = new Comment();\n\n        equal(a.similarTo(b), true);\n        equal(a.similarTo(c), false);\n        equal(a.similarTo(d), false);\n        equal(a.similarTo(e), false);\n    });\n});\n\ndescribe(\"Comment.combineDisplayParts\", () => {\n    it(\"Handles text and code\", () => {\n        const parts: CommentDisplayPart[] = [\n            { kind: \"text\", text: \"a\" },\n            { kind: \"code\", text: \"`b`\" },\n        ];\n        equal(Comment.combineDisplayParts(parts), \"a`b`\");\n    });\n\n    it(\"Handles inline tags\", () => {\n        const parts: CommentDisplayPart[] = [\n            { kind: \"inline-tag\", text: \"`b`\", tag: \"@test\" },\n        ];\n        equal(Comment.combineDisplayParts(parts), \"{@test `b`}\");\n    });\n});\n\ndescribe(\"Comment.splitPartsToHeaderAndBody\", () => {\n    it(\"Handles a simple case\", () => {\n        const parts: CommentDisplayPart[] = [{ kind: \"text\", text: \"a\\nb\" }];\n\n        equal(Comment.splitPartsToHeaderAndBody(parts), {\n            header: \"a\",\n            body: [{ kind: \"text\", text: \"b\" }],\n        });\n    });\n\n    it(\"Refuses to split a code block\", () => {\n        const parts: CommentDisplayPart[] = [{ kind: \"code\", text: \"`a\\nb`\" }];\n\n        equal(Comment.splitPartsToHeaderAndBody(parts), {\n            header: \"\",\n            body: [{ kind: \"code\", text: \"`a\\nb`\" }],\n        });\n    });\n\n    it(\"Handles a newline in a code block after text\", () => {\n        const parts: CommentDisplayPart[] = [\n            { kind: \"text\", text: \"Header\" },\n            { kind: \"code\", text: \"`a\\nb`\" },\n        ];\n\n        equal(Comment.splitPartsToHeaderAndBody(parts), {\n            header: \"Header\",\n            body: [{ kind: \"code\", text: \"`a\\nb`\" }],\n        });\n    });\n\n    it(\"Handles header consisting of multiple display parts\", () => {\n        const parts: CommentDisplayPart[] = [\n            { kind: \"text\", text: \"Header\" },\n            { kind: \"text\", text: \" more \" },\n            { kind: \"text\", text: \"text\\nbody\" },\n        ];\n\n        equal(Comment.splitPartsToHeaderAndBody(parts), {\n            header: \"Header more text\",\n            body: [{ kind: \"text\", text: \"body\" }],\n        });\n    });\n\n    it(\"Handles empty body\", () => {\n        const parts: CommentDisplayPart[] = [\n            { kind: \"text\", text: \"Header\\n\" },\n        ];\n\n        equal(Comment.splitPartsToHeaderAndBody(parts), {\n            header: \"Header\",\n            body: [],\n        });\n    });\n\n    it(\"Trims the header text\", () => {\n        const parts: CommentDisplayPart[] = [\n            { kind: \"text\", text: \"Header  \\n\" },\n        ];\n\n        equal(Comment.splitPartsToHeaderAndBody(parts), {\n            header: \"Header\",\n            body: [],\n        });\n    });\n});\n\ndescribe(\"Comment.getShortSummary\", () => {\n    it(\"Gets the @summary tag if present\", () => {\n        const comment = new Comment(\n            [{ kind: \"text\", text: \"Summary\" }],\n            [new CommentTag(\"@summary\", [{ kind: \"text\", text: \"Tag\" }])],\n        );\n\n        equal(comment.getShortSummary(true), [{ kind: \"text\", text: \"Tag\" }]);\n    });\n\n    it(\"Ignores the body if instructed\", () => {\n        const comment = new Comment([{ kind: \"text\", text: \"Hi\" }]);\n        equal(comment.getShortSummary(false), []);\n    });\n\n    it(\"Handles an empty comment\", () => {\n        const comment = new Comment([]);\n        equal(comment.getShortSummary(true), []);\n    });\n\n    it(\"Handles a one line comment\", () => {\n        const comment = new Comment([{ kind: \"text\", text: \"Hi\" }]);\n        equal(comment.getShortSummary(true), [{ kind: \"text\", text: \"Hi\" }]);\n    });\n\n    it(\"Handles a multi-paragraph comment\", () => {\n        const comment = new Comment([\n            {\n                kind: \"text\",\n                text: \"Paragraph one\\n\\nParagraph two\",\n            },\n        ]);\n\n        equal(comment.getShortSummary(true), [\n            { kind: \"text\", text: \"Paragraph one\" },\n        ]);\n    });\n\n    it(\"Gets the first paragraph of a comment\", () => {\n        const comment = new Comment([\n            {\n                kind: \"text\",\n                text: \"Stuff\\nwith\\nnewlines \",\n            },\n            {\n                kind: \"inline-tag\",\n                tag: \"@link\",\n                text: \"Element\",\n            },\n            {\n                kind: \"text\",\n                text: \"\\nmore text\\n\",\n            },\n            {\n                kind: \"code\",\n                text: \"```json\\n{}\\n```\",\n            },\n        ]);\n\n        equal(comment.getShortSummary(true), [\n            {\n                kind: \"text\",\n                text: \"Stuff\\nwith\\nnewlines \",\n            },\n            {\n                kind: \"inline-tag\",\n                tag: \"@link\",\n                text: \"Element\",\n            },\n            {\n                kind: \"text\",\n                text: \"\\nmore text\\n\",\n            },\n        ]);\n    });\n});\n"
  },
  {
    "path": "src/test/models/kind.test.ts",
    "content": "import { ReflectionKind } from \"#models\";\nimport { getEnumKeys } from \"#utils\";\nimport { deepStrictEqual as equal } from \"assert/strict\";\n\ndescribe(\"ReflectionKind\", () => {\n    const mismatches: Partial<Record<ReflectionKind, string>> = {\n        [ReflectionKind.Enum]: \"Enumeration\",\n        [ReflectionKind.EnumMember]: \"Enumeration Member\",\n        [ReflectionKind.CallSignature]: \"Call Signature\",\n        [ReflectionKind.IndexSignature]: \"Index Signature\",\n        [ReflectionKind.ConstructorSignature]: \"Constructor Signature\",\n        [ReflectionKind.TypeLiteral]: \"Type Literal\",\n        [ReflectionKind.TypeParameter]: \"Type Parameter\",\n        [ReflectionKind.GetSignature]: \"Get Signature\",\n        [ReflectionKind.SetSignature]: \"Set Signature\",\n        [ReflectionKind.TypeAlias]: \"Type Alias\",\n    };\n\n    it(\"Has singular translations which match the enum names\", () => {\n        for (const name of getEnumKeys(ReflectionKind)) {\n            const kind = ReflectionKind[name as \"Project\"];\n            equal(mismatches[kind] || name, ReflectionKind.singularString(kind));\n        }\n    });\n\n    it(\"Has singular translations which match the pluralized enum names\", () => {\n        const plural = (s: string) =>\n            s.endsWith(\"y\")\n                ? s.slice(0, -1) + \"ies\"\n                : s.endsWith(\"s\")\n                ? s + \"es\"\n                : s + \"s\";\n\n        const mismatchesPlural: Partial<Record<ReflectionKind, string>> = Object.fromEntries(\n            Object.entries(mismatches).map(e => [e[0], plural(e[1])]),\n        );\n\n        for (const name of getEnumKeys(ReflectionKind)) {\n            const kind = ReflectionKind[name as \"Project\"];\n            equal(mismatchesPlural[kind] || plural(name), ReflectionKind.pluralString(kind));\n        }\n    });\n});\n"
  },
  {
    "path": "src/test/models/reflections.test.ts",
    "content": "import { ok } from \"assert\";\nimport { FileRegistry, ProjectReflection } from \"../../lib/models/index.js\";\n\ndescribe(\"ProjectReflection\", () => {\n    it(\"getReflectionById works with the project ID\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        ok(project === project.getReflectionById(project.id));\n    });\n});\n"
  },
  {
    "path": "src/test/models/types.test.ts",
    "content": "// Tests the `toString` functionality of the type models\n\nimport * as T from \"../../lib/models/types.js\";\nimport { strictEqual as equal } from \"assert\";\nimport { ProjectReflection } from \"../../lib/models/index.js\";\nimport { FileRegistry } from \"../../lib/models/FileRegistry.js\";\n\ndescribe(\"Type.toString\", () => {\n    describe(\"Union types\", () => {\n        it(\"Does not wrap simple types\", () => {\n            const type = new T.UnionType([\n                new T.LiteralType(1),\n                new T.LiteralType(BigInt(\"1\")),\n            ]);\n\n            equal(type.toString(), \"1 | 1n\");\n        });\n\n        it(\"Does not wrap intersection types\", () => {\n            const type = new T.UnionType([\n                new T.IntersectionType([\n                    new T.LiteralType(1),\n                    new T.LiteralType(2),\n                ]),\n                new T.LiteralType(3),\n            ]);\n\n            equal(type.toString(), \"1 & 2 | 3\");\n        });\n\n        it(\"Wraps conditional types\", () => {\n            const type = new T.UnionType([\n                new T.ConditionalType(\n                    new T.LiteralType(1),\n                    new T.LiteralType(2),\n                    new T.LiteralType(3),\n                    new T.LiteralType(4),\n                ),\n                new T.LiteralType(5),\n            ]);\n            equal(type.toString(), \"(1 extends 2 ? 3 : 4) | 5\");\n        });\n    });\n\n    describe(\"Intersection types\", () => {\n        it(\"Does not wrap simple types\", () => {\n            const type = new T.IntersectionType([\n                new T.LiteralType(1),\n                new T.LiteralType(BigInt(\"1\")),\n            ]);\n\n            equal(type.toString(), \"1 & 1n\");\n        });\n\n        it(\"Wraps union types\", () => {\n            const type = new T.IntersectionType([\n                new T.UnionType([new T.LiteralType(1), new T.LiteralType(2)]),\n                new T.LiteralType(3),\n            ]);\n\n            equal(type.toString(), \"(1 | 2) & 3\");\n        });\n\n        it(\"Wraps conditional types\", () => {\n            const type = new T.IntersectionType([\n                new T.ConditionalType(\n                    new T.LiteralType(1),\n                    new T.LiteralType(2),\n                    new T.LiteralType(3),\n                    new T.LiteralType(4),\n                ),\n                new T.LiteralType(5),\n            ]);\n\n            equal(type.toString(), \"(1 extends 2 ? 3 : 4) & 5\");\n        });\n    });\n\n    describe(\"Conditional types\", () => {\n        it(\"Wraps union types\", () => {\n            const type = new T.ConditionalType(\n                new T.UnionType([new T.LiteralType(1), new T.LiteralType(2)]),\n                new T.LiteralType(\"ext\"),\n                new T.LiteralType(\"true\"),\n                new T.LiteralType(\"false\"),\n            );\n            equal(type.toString(), '(1 | 2) extends \"ext\" ? \"true\" : \"false\"');\n        });\n\n        it(\"Wraps intersection types\", () => {\n            const type = new T.ConditionalType(\n                new T.IntersectionType([\n                    new T.LiteralType(1),\n                    new T.LiteralType(2),\n                ]),\n                new T.LiteralType(\"ext\"),\n                new T.LiteralType(\"true\"),\n                new T.LiteralType(\"false\"),\n            );\n            equal(type.toString(), '(1 & 2) extends \"ext\" ? \"true\" : \"false\"');\n        });\n    });\n\n    describe(\"Array types\", () => {\n        it(\"Does not wrap other array types\", () => {\n            const type = new T.ArrayType(\n                new T.ArrayType(new T.IntrinsicType(\"string\")),\n            );\n            equal(type.toString(), \"string[][]\");\n        });\n\n        it(\"Wraps union types\", () => {\n            const type = new T.ArrayType(\n                new T.UnionType([new T.LiteralType(1), new T.LiteralType(2)]),\n            );\n            equal(type.toString(), \"(1 | 2)[]\");\n        });\n\n        it(\"Wraps intersection types\", () => {\n            const type = new T.ArrayType(\n                new T.IntersectionType([\n                    new T.LiteralType(1),\n                    new T.LiteralType(2),\n                ]),\n            );\n            equal(type.toString(), \"(1 & 2)[]\");\n        });\n    });\n\n    describe(\"Unknown types\", () => {\n        const type = new T.UnknownType(\"foo\");\n\n        it(\"Should not be wrapped when root level\", () => {\n            equal(type.toString(), \"foo\");\n        });\n\n        it(\"Should be wrapped everywhere\", () => {\n            const arr = new T.ArrayType(type);\n            equal(arr.toString(), \"(foo)[]\");\n\n            const union = new T.UnionType([type, type]);\n            equal(union.toString(), \"(foo) | (foo)\");\n\n            const intersection = new T.IntersectionType([type, type]);\n            equal(intersection.toString(), \"(foo) & (foo)\");\n        });\n    });\n\n    describe(\"Indexed access types\", () => {\n        it(\"Renders\", () => {\n            const type = new T.IndexedAccessType(\n                new T.IntrinsicType(\"string\"),\n                new T.LiteralType(\"length\"),\n            );\n\n            equal(type.toString(), 'string[\"length\"]');\n        });\n    });\n\n    describe(\"Inferred types\", () => {\n        it(\"Renders\", () => {\n            const type = new T.InferredType(\"TFoo\");\n            equal(type.toString(), \"infer TFoo\");\n        });\n\n        it(\"Renders with a constraint\", () => {\n            const type = new T.InferredType(\"TFoo\", new T.LiteralType(123));\n            equal(type.toString(), \"infer TFoo extends 123\");\n        });\n    });\n\n    describe(\"Mapped types\", () => {\n        it(\"Renders a simple case\", () => {\n            const type = new T.MappedType(\n                \"K\",\n                new T.LiteralType(1),\n                new T.LiteralType(2),\n                undefined,\n                undefined,\n                undefined,\n            );\n            equal(type.toString(), \"{ [K in 1]: 2 }\");\n        });\n\n        it(\"Renders with readonly modifiers\", () => {\n            const type = new T.MappedType(\n                \"K\",\n                new T.LiteralType(1),\n                new T.LiteralType(2),\n                \"+\",\n                undefined,\n                undefined,\n            );\n            equal(type.toString(), \"{ readonly [K in 1]: 2 }\");\n\n            const type2 = new T.MappedType(\n                \"K\",\n                new T.LiteralType(1),\n                new T.LiteralType(2),\n                \"-\",\n                undefined,\n                undefined,\n            );\n            equal(type2.toString(), \"{ -readonly [K in 1]: 2 }\");\n        });\n\n        it(\"Renders with optional modifiers\", () => {\n            const type = new T.MappedType(\n                \"K\",\n                new T.LiteralType(1),\n                new T.LiteralType(2),\n                undefined,\n                \"+\",\n                undefined,\n            );\n            equal(type.toString(), \"{ [K in 1]?: 2 }\");\n\n            const type2 = new T.MappedType(\n                \"K\",\n                new T.LiteralType(1),\n                new T.LiteralType(2),\n                undefined,\n                \"-\",\n                undefined,\n            );\n            equal(type2.toString(), \"{ [K in 1]-?: 2 }\");\n        });\n\n        it(\"Renders with name modifiers\", () => {\n            const type = new T.MappedType(\n                \"K\",\n                new T.LiteralType(1),\n                new T.LiteralType(2),\n                undefined,\n                undefined,\n                new T.LiteralType(3),\n            );\n            equal(type.toString(), \"{ [K in 1 as 3]: 2 }\");\n        });\n    });\n\n    describe(\"Optional type\", () => {\n        it(\"Renders a simple case\", () => {\n            const type = new T.OptionalType(new T.LiteralType(1));\n            equal(type.toString(), \"1?\");\n        });\n\n        it(\"Wraps intersections\", () => {\n            const type = new T.OptionalType(\n                new T.IntersectionType([\n                    new T.LiteralType(1),\n                    new T.LiteralType(2),\n                ]),\n            );\n            equal(type.toString(), \"(1 & 2)?\");\n        });\n\n        it(\"Wraps type operators\", () => {\n            const type = new T.OptionalType(\n                new T.TypeOperatorType(new T.LiteralType(1), \"keyof\"),\n            );\n            equal(type.toString(), \"(keyof 1)?\");\n        });\n\n        it(\"Does not wrap type query\", () => {\n            const project = new ProjectReflection(\"test\", new FileRegistry());\n            const type = new T.OptionalType(\n                new T.QueryType(\n                    T.ReferenceType.createBrokenReference(\"X\", project, undefined),\n                ),\n            );\n            equal(type.toString(), \"typeof X?\");\n        });\n    });\n\n    describe(\"Tuple\", () => {\n        it(\"Works with members\", () => {\n            const type = new T.TupleType([\n                new T.OptionalType(new T.LiteralType(123)),\n            ]);\n            equal(type.toString(), \"[123?]\");\n        });\n    });\n\n    describe(\"Type operator\", () => {\n        it(\"Does not wrap type query\", () => {\n            const project = new ProjectReflection(\"test\", new FileRegistry());\n            const type = new T.TypeOperatorType(\n                new T.QueryType(\n                    T.ReferenceType.createBrokenReference(\"X\", project, undefined),\n                ),\n                \"keyof\",\n            );\n            equal(type.toString(), \"keyof typeof X\");\n        });\n    });\n\n    describe(\"Predicate type\", () => {\n        it(\"Works without a type\", () => {\n            const type = new T.PredicateType(\"X\", true, undefined);\n            equal(type.toString(), \"asserts X\");\n        });\n\n        it(\"Works with a type\", () => {\n            const type = new T.PredicateType(\"X\", false, new T.LiteralType(1));\n            equal(type.toString(), \"X is 1\");\n        });\n\n        it(\"Works with asserts\", () => {\n            const type = new T.PredicateType(\"X\", true, new T.LiteralType(1));\n            equal(type.toString(), \"asserts X is 1\");\n        });\n    });\n\n    describe(\"Rest type\", () => {\n        it(\"Does not wrap simple types\", () => {\n            const type = new T.RestType(new T.ArrayType(new T.LiteralType(1)));\n            equal(type.toString(), \"...1[]\");\n        });\n    });\n\n    describe(\"Template literal type\", () => {\n        it(\"Renders\", () => {\n            const type = new T.TemplateLiteralType(\"a\", [\n                [new T.IntrinsicType(\"string\"), \"b\"],\n            ]);\n            equal(type.toString(), \"`a${string}b`\");\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/module/a.ts",
    "content": "import { multiply } from \"./b.js\";\n\nexport function add(a: number, b: number) {\n    return a + multiply(b, 1);\n}\n"
  },
  {
    "path": "src/test/module/b.ts",
    "content": "export function multiply(a: number, b: number) {\n    return a * b;\n}\n"
  },
  {
    "path": "src/test/output/Slugger.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { Slugger } from \"../../lib/output/index.js\";\n\ndescribe(\"Slugger\", () => {\n    it(\"Is case sensitive #2012\", () => {\n        const slugger = new Slugger({ lowercase: true });\n        equal(slugger.slug(\"model\"), \"model\");\n        equal(slugger.slug(\"Model\"), \"model-1\");\n    });\n\n    it(\"Is case sensitive even when lowercasing output is disabled\", () => {\n        const slugger = new Slugger({ lowercase: false });\n        equal(slugger.slug(\"model\"), \"model\");\n        equal(slugger.slug(\"Model\"), \"Model-1\");\n    });\n\n    it(\"Handles embedded html characters\", () => {\n        const slugger = new Slugger({ lowercase: true });\n        equal(slugger.slug(\"test <T>\"), \"test-t\");\n        equal(slugger.slug(\"test <T>\"), \"test-t-1\");\n    });\n\n    it(\"Handles adjacent whitespace\", () => {\n        const slugger = new Slugger({ lowercase: true });\n        equal(slugger.slug(\"test    test2\"), \"test-test2\");\n    });\n\n    it(\"Handles empty slugs\", () => {\n        const slugger = new Slugger({ lowercase: true });\n        equal(slugger.slug(\"$\"), \"_\");\n        equal(slugger.slug(\"$\"), \"_-1\");\n    });\n});\n"
  },
  {
    "path": "src/test/output/formatter.test.ts",
    "content": "import { equal } from \"assert\";\nimport {\n    ArrayType,\n    ConditionalType,\n    IndexedAccessType,\n    InferredType,\n    IntersectionType,\n    IntrinsicType,\n    LiteralType,\n    MappedType,\n    NamedTupleMember,\n    OptionalType,\n    PredicateType,\n    QueryType,\n    ReferenceType,\n    ReflectionType,\n    RestType,\n    type SomeType,\n    TemplateLiteralType,\n    TupleType,\n    TypeContext,\n    TypeOperatorType,\n    UnionType,\n    UnknownType,\n} from \"../../lib/models/types.js\";\nimport { dedent, JSX } from \"#utils\";\nimport {\n    DeclarationReflection,\n    FileRegistry,\n    ParameterReflection,\n    ProjectReflection,\n    ReflectionFlag,\n    ReflectionKind,\n    SignatureReflection,\n    TypeParameterReflection,\n} from \"../../lib/models/index.js\";\nimport { FormattedCodeBuilder, FormattedCodeGenerator, Wrap } from \"../../lib/output/formatter.js\";\nimport { type PageDefinition, type Router, Slugger } from \"../../lib/output/index.js\";\n\nconst renderElementToText = JSX.renderElementToText;\n\nexport function renderType(type: SomeType, maxWidth = 80, startWidth = 0) {\n    class DummyRouter implements Router {\n        buildPages(): PageDefinition[] {\n            return [];\n        }\n        hasUrl(): boolean {\n            return true;\n        }\n        getLinkTargets(): [] {\n            return [];\n        }\n        getAnchor(): string | undefined {\n            return \"\";\n        }\n        hasOwnDocument(): boolean {\n            return true;\n        }\n        relativeUrl(): string {\n            return \"\";\n        }\n        baseRelativeUrl(): string {\n            return \"\";\n        }\n        getFullUrl(): string {\n            return \"\";\n        }\n        getSlugger(): Slugger {\n            return new Slugger({ lowercase: false });\n        }\n    }\n\n    const builder = new FormattedCodeBuilder(new DummyRouter(), null!);\n    const tree = builder.type(type, TypeContext.none);\n    const generator = new FormattedCodeGenerator(maxWidth, startWidth);\n    generator.node(tree, Wrap.Detect);\n    return generator.toElement();\n}\n\ndescribe(\"Formatter\", () => {\n    it(\"Handles a literal type\", () => {\n        const literal = new LiteralType(123);\n        const text = renderElementToText(renderType(literal));\n        equal(text, \"123\");\n    });\n\n    it(\"Handles a conditional type\", () => {\n        const [a, b, c, d] = [\"a\", \"b\", \"c\", \"d\"].map(\n            (x) => new LiteralType(x),\n        );\n        const cond = new ConditionalType(a, b, c, d);\n\n        const text = renderElementToText(renderType(cond));\n        equal(text, `\"a\" extends \"b\" ? \"c\" : \"d\"`);\n\n        const wrappedText = renderElementToText(renderType(cond, 10));\n        equal(\n            wrappedText,\n            dedent(`\n            \"a\" extends \"b\"\n                ? \"c\"\n                : \"d\"\n            `),\n        );\n    });\n\n    it(\"Handles an indexed access type\", () => {\n        const [a, b] = [\"object\", \"index\"].map((x) => new LiteralType(x));\n        const type = new IndexedAccessType(a, b);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, `\"object\"[\"index\"]`);\n\n        const wrappedText = renderElementToText(renderType(type, 2));\n        equal(wrappedText, `\"object\"[\"index\"]`);\n    });\n\n    it(\"Handles a simple inferred type\", () => {\n        const [a, _b, c, d] = [\"a\", \"b\", \"c\", \"d\"].map(\n            (x) => new LiteralType(x),\n        );\n        const inferred = new InferredType(\"U\");\n        const type = new ConditionalType(a, inferred, c, d);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, `\"a\" extends infer U ? \"c\" : \"d\"`);\n    });\n\n    it(\"Handles a complex inferred type\", () => {\n        const [a, b, c, d] = [\"a\", \"b\", \"c\", \"d\"].map(\n            (x) => new LiteralType(x),\n        );\n        const inferred = new InferredType(\"U\", b);\n        const type = new ConditionalType(a, inferred, c, d);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, `\"a\" extends infer U extends \"b\" ? \"c\" : \"d\"`);\n\n        const wrappedText = renderElementToText(renderType(type, 2));\n        equal(\n            wrappedText,\n            dedent(`\n            \"a\" extends infer U extends\n                \"b\"\n                ? \"c\"\n                : \"d\"\n            `),\n        );\n    });\n\n    it(\"Handles intersection types\", () => {\n        const types = [\"a\", \"b\", \"c\", \"d\"].map((x) => new LiteralType(x));\n        const type = new IntersectionType(types);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, `\"a\" & \"b\" & \"c\" & \"d\"`);\n    });\n\n    it(\"Handles intrinsic types\", () => {\n        const type = new IntrinsicType(\"string\");\n        const text = renderElementToText(renderType(type));\n        equal(text, `string`);\n    });\n\n    it(\"Handles mapped types\", () => {\n        const [a, b, c, d] = [\"a\", \"b\", \"c\", \"d\"].map(\n            (x) => new LiteralType(x),\n        );\n        const type = new MappedType(\"K\", a, new UnionType([c, d]), \"+\", \"-\", b);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, `{ readonly [K in \"a\" as \"b\"]-?: \"c\" | \"d\" }`);\n\n        const text2 = renderElementToText(renderType(type, 50, 8));\n        equal(\n            text2,\n            dedent(`\n                {\n                    readonly [K in \"a\" as \"b\"]-?: \"c\" | \"d\"\n                }\n            `),\n        );\n\n        const text3 = renderElementToText(renderType(type, 40, 8));\n        equal(\n            text3,\n            dedent(`\n                {\n                    readonly [K in \"a\" as \"b\"]-?:\n                        | \"c\"\n                        | \"d\"\n                }\n            `),\n        );\n    });\n\n    it(\"Handles named tuple members\", () => {\n        const type = new NamedTupleMember(\"a\", false, new LiteralType(123));\n\n        const text = renderElementToText(renderType(type));\n        equal(text, `a: 123`);\n\n        const type2 = new NamedTupleMember(\"a\", true, new LiteralType(123));\n        const text2 = renderElementToText(renderType(type2));\n        equal(text2, `a?: 123`);\n    });\n\n    it(\"Handles optional types\", () => {\n        const type = new OptionalType(new LiteralType(123));\n        const text = renderElementToText(renderType(type));\n        equal(text, `123?`);\n    });\n\n    it(\"Handles predicate types\", () => {\n        const type = new PredicateType(\"x\", true);\n        const text = renderElementToText(renderType(type));\n        equal(text, `asserts x`);\n\n        const type2 = new PredicateType(\n            \"x\",\n            false,\n            new IntrinsicType(\"string\"),\n        );\n        const text2 = renderElementToText(renderType(type2));\n        equal(text2, `x is string`);\n    });\n\n    it(\"Handles query types\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        const type = new QueryType(\n            ReferenceType.createBrokenReference(\"x\", project, undefined),\n        );\n        const text = renderElementToText(renderType(type));\n        equal(text, `typeof x`);\n    });\n\n    it(\"Handles a simple reference type\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        const type = ReferenceType.createBrokenReference(\"x\", project, undefined);\n        const text = renderElementToText(renderType(type));\n        equal(text, `x`);\n    });\n\n    it(\"Handles a resolved reference type\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        const ns = new DeclarationReflection(\n            \"ns\",\n            ReflectionKind.Namespace,\n            project,\n        );\n        const ns2 = new DeclarationReflection(\n            \"target\", // shares name with target\n            ReflectionKind.Namespace,\n            project,\n        );\n        const target = new DeclarationReflection(\n            \"target\",\n            ReflectionKind.Variable,\n            ns,\n        );\n        project.registerReflection(ns, undefined, undefined);\n        project.registerReflection(ns2, undefined, undefined);\n        project.registerReflection(target, undefined, undefined);\n\n        const type = ReferenceType.createResolvedReference(\n            \"x\",\n            target,\n            project,\n        );\n        const text = renderElementToText(renderType(type));\n        equal(text, `ns.target`);\n\n        target.kind = ReflectionKind.TypeParameter;\n        const text2 = renderElementToText(renderType(type));\n        equal(text2, `target`);\n    });\n\n    it(\"Handles a reference type pointing to an external url\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        const type = ReferenceType.createBrokenReference(\"x\", project, undefined);\n        type.externalUrl = \"https://example.com\";\n        const text = renderElementToText(renderType(type));\n        equal(text, `x`);\n    });\n\n    it(\"Handles a reference type targeting a type parameter\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        const type = ReferenceType.createBrokenReference(\"x\", project, undefined);\n        type.refersToTypeParameter = true;\n        const text = renderElementToText(renderType(type));\n        equal(text, `x`);\n    });\n\n    it(\"Handles a reference type with type arguments\", () => {\n        const project = new ProjectReflection(\"\", new FileRegistry());\n        const type = ReferenceType.createBrokenReference(\"x\", project, undefined);\n        type.typeArguments = [\n            new LiteralType(123),\n            new LiteralType(456),\n            new LiteralType(789),\n        ];\n        const text = renderElementToText(renderType(type));\n        equal(text, `x<123, 456, 789>`);\n\n        const text2 = renderElementToText(renderType(type, 0));\n        equal(\n            text2,\n            dedent(`\n                x<\n                    123,\n                    456,\n                    789,\n                >\n            `),\n        );\n    });\n\n    it(\"Handles an index signature reflection type\", () => {\n        const decl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        decl.indexSignatures = [\n            new SignatureReflection(\n                \"__index\",\n                ReflectionKind.IndexSignature,\n                decl,\n            ),\n        ];\n        decl.indexSignatures[0].type = new IntrinsicType(\"string\");\n        decl.indexSignatures[0].parameters = [\n            new ParameterReflection(\"x\", ReflectionKind.Parameter),\n        ];\n        decl.indexSignatures[0].parameters[0].type = new IntrinsicType(\n            \"number\",\n        );\n\n        const type = new ReflectionType(decl);\n        const text = renderElementToText(renderType(type));\n        equal(text, `{ [x: number]: string }`);\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n                {\n                    [x: number]: string;\n                }\n            `),\n        );\n    });\n\n    it(\"Handles single signature callback reflection types\", () => {\n        const decl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const sig = new SignatureReflection(\n            \"__call\",\n            ReflectionKind.CallSignature,\n            decl,\n        );\n        decl.signatures = [sig];\n        sig.type = new LiteralType(\"str\");\n        sig.parameters = [\n            new ParameterReflection(\"x\", ReflectionKind.Parameter),\n            new ParameterReflection(\"y\", ReflectionKind.Parameter),\n        ];\n        sig.parameters[0].setFlag(ReflectionFlag.Optional);\n        sig.parameters[1].setFlag(ReflectionFlag.Rest);\n        sig.parameters[0].type = new IntrinsicType(\"string\");\n        sig.parameters[1].type = new IntrinsicType(\"number\");\n\n        const type = new ReflectionType(decl);\n        const text = renderElementToText(renderType(type));\n        equal(text, `(x?: string, ...y: number) => \"str\"`);\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n            (\n                x?: string,\n                ...y: number,\n            ) => \"str\"\n            `),\n        );\n    });\n\n    it(\"Handles abstract construct signature\", () => {\n        const decl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const sig = new SignatureReflection(\n            \"__call\",\n            ReflectionKind.ConstructorSignature,\n            decl,\n        );\n        sig.type = new IntrinsicType(\"Number\");\n        sig.flags.setFlag(ReflectionFlag.Abstract, true);\n        decl.signatures = [sig];\n\n        const type = new ReflectionType(decl);\n        const text = renderElementToText(renderType(type));\n        equal(text, `abstract new () => Number`);\n    });\n\n    it(\"Handles multiple signature callback reflection types\", () => {\n        const decl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const sig = new SignatureReflection(\n            \"__call\",\n            ReflectionKind.CallSignature,\n            decl,\n        );\n        decl.signatures = [sig, sig];\n        sig.type = new LiteralType(\"str\");\n        sig.parameters = [\n            new ParameterReflection(\"x\", ReflectionKind.Parameter),\n            new ParameterReflection(\"y\", ReflectionKind.Parameter),\n        ];\n        sig.parameters[0].type = new IntrinsicType(\"string\");\n        sig.parameters[1].type = new IntrinsicType(\"number\");\n\n        const type = new ReflectionType(decl);\n        const text = renderElementToText(renderType(type, 1000, 0));\n        equal(\n            text,\n            `{ (x: string, y: number): \"str\"; (x: string, y: number): \"str\" }`,\n        );\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n            {\n                (\n                    x: string,\n                    y: number,\n                ): \"str\";\n                (\n                    x: string,\n                    y: number,\n                ): \"str\";\n            }\n            `),\n        );\n    });\n\n    it(\"Handles type parameters on signatures\", () => {\n        const decl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const sig = new SignatureReflection(\n            \"__call\",\n            ReflectionKind.CallSignature,\n            decl,\n        );\n        const a = new TypeParameterReflection(\"a\", sig, undefined);\n        a.setFlag(ReflectionFlag.Const);\n        a.type = new IntrinsicType(\"string\");\n        const b = new TypeParameterReflection(\"b\", sig, \"in out\");\n        const c = new TypeParameterReflection(\"c\", sig, undefined);\n        c.default = new IntrinsicType(\"string\");\n        sig.typeParameters = [a, b, c];\n        decl.signatures = [sig];\n\n        const type = new ReflectionType(decl);\n        const text = renderElementToText(renderType(type));\n        equal(text, `<const a extends string, in out b, c = string>() => any`);\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n                <\n                    const a extends\n                        string,\n                    in out b,\n                    c = string,\n                >() => any\n            `),\n        );\n    });\n\n    it(\"Handles simple object types\", () => {\n        const refl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const a = new DeclarationReflection(\"a\", ReflectionKind.Property, refl);\n        a.type = new IntrinsicType(\"string\");\n        refl.addChild(a);\n        const b = new DeclarationReflection(\"b\", ReflectionKind.Property, refl);\n        b.getSignature = new SignatureReflection(\n            \"b\",\n            ReflectionKind.GetSignature,\n            b,\n        );\n        b.getSignature.type = new IntrinsicType(\"string\");\n        b.setSignature = new SignatureReflection(\n            \"b\",\n            ReflectionKind.SetSignature,\n            b,\n        );\n        b.setSignature.type = new IntrinsicType(\"void\");\n        b.setSignature.parameters = [\n            new ParameterReflection(\"value\", ReflectionKind.Parameter),\n        ];\n        b.setSignature.parameters[0].type = new UnionType([\n            new IntrinsicType(\"string\"),\n            new IntrinsicType(\"number\"),\n        ]);\n        refl.addChild(b);\n\n        const type = new ReflectionType(refl);\n        const text = renderElementToText(renderType(type));\n        equal(\n            text,\n            \"{ a: string; get b(): string; set b(value: string | number): void }\",\n        );\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n                {\n                    a: string;\n                    get b(): string;\n                    set b(\n                        value:\n                            | string\n                            | number,\n                    ): void;\n                }\n            `),\n        );\n    });\n\n    it(\"Handles get/set only properties\", () => {\n        const refl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const a = new DeclarationReflection(\"a\", ReflectionKind.Property, refl);\n        a.getSignature = new SignatureReflection(\n            \"a\",\n            ReflectionKind.GetSignature,\n            a,\n        );\n        a.getSignature.type = new IntrinsicType(\"string\");\n        refl.addChild(a);\n        const b = new DeclarationReflection(\"b\", ReflectionKind.Property, refl);\n        b.setSignature = new SignatureReflection(\n            \"b\",\n            ReflectionKind.SetSignature,\n            b,\n        );\n        b.setSignature.type = new IntrinsicType(\"void\");\n        b.setSignature.parameters = [\n            new ParameterReflection(\"value\", ReflectionKind.Parameter),\n        ];\n        b.setSignature.parameters[0].type = new UnionType([\n            new IntrinsicType(\"string\"),\n            new IntrinsicType(\"number\"),\n        ]);\n        refl.addChild(b);\n\n        const type = new ReflectionType(refl);\n        const text = renderElementToText(renderType(type));\n        equal(text, \"{ get a(): string; set b(value: string | number): void }\");\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n                {\n                    get a(): string;\n                    set b(\n                        value:\n                            | string\n                            | number,\n                    ): void;\n                }\n            `),\n        );\n    });\n\n    it(\"Handles callable members\", () => {\n        const refl = new DeclarationReflection(\n            \"__type\",\n            ReflectionKind.TypeLiteral,\n        );\n        const a = new DeclarationReflection(\"a\", ReflectionKind.Property, refl);\n        const sig = new SignatureReflection(\n            \"a\",\n            ReflectionKind.CallSignature,\n            a,\n        );\n        sig.type = new IntrinsicType(\"string\");\n        a.signatures = [sig, sig];\n        refl.addChild(a);\n\n        const type = new ReflectionType(refl);\n        const text = renderElementToText(renderType(type));\n        equal(text, \"{ a(): string; a(): string }\");\n\n        const textWrap = renderElementToText(renderType(type, 0));\n        equal(\n            textWrap,\n            dedent(`\n                {\n                    a(): string;\n                    a(): string;\n                }\n            `),\n        );\n    });\n\n    it(\"Handles rest types\", () => {\n        const type = new RestType(new LiteralType(\"x\"));\n        const text = renderElementToText(renderType(type));\n        equal(text, `...\"x\"`);\n    });\n\n    it(\"Handles template literal types\", () => {\n        const type = new TemplateLiteralType(\"head\", [\n            [new LiteralType(123), \"more\"],\n            [new LiteralType(2), \"\"],\n        ]);\n        const text = renderElementToText(renderType(type));\n        equal(text, \"`head${123}more${2}`\");\n    });\n\n    it(\"Handles tuple types\", () => {\n        const types = Array.from({ length: 5 }, (_, i) => new LiteralType(i));\n        const type = new TupleType(types);\n        const text = renderElementToText(renderType(type));\n        equal(text, `[0, 1, 2, 3, 4]`);\n\n        const text2 = renderElementToText(renderType(type, 0));\n        equal(\n            text2,\n            dedent(`\n            [\n                0,\n                1,\n                2,\n                3,\n                4,\n            ]\n        `),\n        );\n    });\n\n    it(\"Handles type operator types\", () => {\n        const type = new TypeOperatorType(new LiteralType(123), \"keyof\");\n        const text = renderElementToText(renderType(type));\n        equal(text, `keyof 123`);\n    });\n\n    it(\"Handles a union type\", () => {\n        const lit = new LiteralType(123);\n        const union = new UnionType([lit, lit, lit, lit, lit]);\n        const text = renderElementToText(renderType(union));\n        equal(text, \"123 | 123 | 123 | 123 | 123\");\n\n        const wrappedText = renderElementToText(renderType(union, 10));\n        equal(\n            wrappedText,\n            `\\n    | ${union.types.map((t) => t.toString()).join(\"\\n    | \")}`,\n        );\n    });\n\n    it(\"Handles unknown types\", () => {\n        const type = new UnknownType(\"a | <b\");\n        const text = renderElementToText(renderType(type));\n        equal(text, \"a | <b\");\n    });\n\n    it(\"Adds parenthesis when required\", () => {\n        const [a, b, c, d] = Array.from(\n            { length: 4 },\n            (_, i) => new LiteralType(i),\n        );\n        const type = new IntersectionType([\n            new UnionType([a, b]),\n            new UnionType([c, d]),\n        ]);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, \"(0 | 1) & (2 | 3)\");\n    });\n\n    it(\"Adds parenthesis for functions inside an array, #2892\", () => {\n        const decl = new DeclarationReflection(\"__type\", ReflectionKind.TypeLiteral);\n        decl.signatures = [new SignatureReflection(\"__call\", ReflectionKind.CallSignature, decl)];\n        decl.signatures[0].type = new IntrinsicType(\"number\");\n        const fnType = new ReflectionType(decl);\n        const type = new ArrayType(fnType);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, \"(() => number)[]\");\n    });\n\n    it(\"Adds parenthesis for functions inside a union, #2892\", () => {\n        const decl = new DeclarationReflection(\"__type\", ReflectionKind.TypeLiteral);\n        decl.signatures = [new SignatureReflection(\"__call\", ReflectionKind.CallSignature, decl)];\n        decl.signatures[0].type = new IntrinsicType(\"number\");\n        const fnType = new ReflectionType(decl);\n        const type = new UnionType([fnType, new IntrinsicType(\"string\")]);\n\n        const text = renderElementToText(renderType(type));\n        equal(text, \"(() => number) | string\");\n    });\n});\n"
  },
  {
    "path": "src/test/output/lib.test.tsx",
    "content": "import { deepStrictEqual as equal } from \"node:assert\";\nimport { wbr } from \"../../lib/output/themes/lib.js\";\nimport { JSX } from \"#utils\";\n\ndescribe(\"wbr\", () => {\n    it(\"No breaks\", () => {\n        equal(wbr(\"hello\"), [\"hello\"]);\n    });\n\n    it(\"Adds <wbr> to camelCased text\", () => {\n        equal(wbr(\"helloWorld\"), [\"hello\", <wbr />, \"World\"]);\n        equal(wbr(\"helloWorldMulti\"), [\"hello\", <wbr />, \"World\", <wbr />, \"Multi\"]);\n    });\n\n    it(\"Adds <wbr> to snake_cased text\", () => {\n        equal(wbr(\"snake_case_text\"), [\"snake_\", <wbr />, \"case_\", <wbr />, \"text\"]);\n        equal(wbr(\"snake__case__text\"), [\"snake__\", <wbr />, \"case__\", <wbr />, \"text\"]);\n    });\n\n    it(\"Adds <wbr> to dashed-text\", () => {\n        equal(wbr(\"dashed-text\"), [\"dashed-\", <wbr />, \"text\"]);\n    });\n\n    it(\"Adds <wbr> appropriately with acronyms\", () => {\n        equal(wbr(\"HTMLImageElement\"), [\"HTML\", <wbr />, \"Image\", <wbr />, \"Element\"]);\n        equal(wbr(\"theHTMLImageElement\"), [\"the\", <wbr />, \"HTML\", <wbr />, \"Image\", <wbr />, \"Element\"]);\n    });\n});\n"
  },
  {
    "path": "src/test/output/output.test.ts",
    "content": "import { deepStrictEqual as equal, throws } from \"assert\";\nimport { getConverter2App } from \"../programs.js\";\nimport { resolve } from \"path\";\nimport { Outputs } from \"../../lib/output/output.js\";\nimport { TestLogger } from \"../TestLogger.js\";\nimport { FileRegistry, ProjectReflection } from \"../../lib/models/index.js\";\nimport { normalizePath } from \"#node-utils\";\nimport type { TranslatedString } from \"#utils\";\n\nconst app = getConverter2App();\n\ndescribe(\"Output\", () => {\n    let optionsSnap: { __optionSnapshot: never };\n\n    let outputs: Outputs;\n    let logger: TestLogger;\n    let htmlWritten = false;\n    let jsonWritten = false;\n\n    const dummyProject = new ProjectReflection(\"\", new FileRegistry());\n\n    before(() => {\n        optionsSnap = app.options.snapshot();\n    });\n\n    beforeEach(() => {\n        // Throw away output configuration for debug rendering of c2 projects\n        app.options.reset();\n\n        outputs = new Outputs(app);\n        outputs.addOutput(\"html\", () => {\n            htmlWritten = true;\n            return Promise.resolve();\n        });\n        outputs.addOutput(\"json\", () => {\n            jsonWritten = true;\n            return Promise.resolve();\n        });\n\n        logger = app.logger = new TestLogger();\n\n        htmlWritten = false;\n        jsonWritten = false;\n    });\n\n    afterEach(() => {\n        app.options.restore(optionsSnap);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Uses the --out output by default\", () => {\n        const specs = outputs.getOutputSpecs();\n        equal(specs, [{ name: \"html\", path: normalizePath(resolve(\"./docs\")) }]);\n    });\n\n    it(\"Does not use default value of --out if there is a specified output shortcut\", () => {\n        app.options.setValue(\"html\", \"./html_docs\");\n        const specs = outputs.getOutputSpecs();\n        equal(specs, [{ name: \"html\", path: normalizePath(resolve(\"./html_docs\")) }]);\n    });\n\n    it(\"Uses --out if specified\", () => {\n        app.options.setValue(\"html\", \"./html_docs\");\n        app.options.setValue(\"out\", \"./out_docs\");\n        const specs = outputs.getOutputSpecs();\n        equal(specs, [\n            { name: \"html\", path: normalizePath(resolve(\"./out_docs\")) },\n            { name: \"html\", path: normalizePath(resolve(\"./html_docs\")) },\n        ]);\n    });\n\n    it(\"Uses --outputs if specified\", () => {\n        app.options.setValue(\"outputs\", [\n            { name: \"html\", path: \"./html_docs\" },\n        ]);\n        const specs = outputs.getOutputSpecs();\n        equal(specs, [{ name: \"html\", path: normalizePath(resolve(\"./html_docs\")) }]);\n    });\n\n    it(\"Prioritizes shortcuts if both outputs and shortcuts are specified\", () => {\n        app.options.setValue(\"outputs\", [\n            { name: \"html\", path: \"./html_docs\" },\n        ]);\n        app.options.setValue(\"html\", \"./html_docs2\");\n        const specs = outputs.getOutputSpecs();\n        equal(specs, [{ name: \"html\", path: normalizePath(resolve(\"./html_docs2\")) }]);\n    });\n\n    it(\"Prioritizes --out if both outputs and --out are specified\", () => {\n        app.options.setValue(\"outputs\", [\n            { name: \"html\", path: \"./html_docs\" },\n        ]);\n        app.options.setValue(\"out\", \"./html_docs2\");\n        const specs = outputs.getOutputSpecs();\n        equal(specs, [{ name: \"html\", path: normalizePath(resolve(\"./html_docs2\")) }]);\n    });\n\n    it(\"Supports specifying a different default output name\", () => {\n        outputs.setDefaultOutputName(\"json\");\n        const specs = outputs.getOutputSpecs();\n        try {\n            equal(specs, [{ name: \"json\", path: normalizePath(resolve(\"./docs\")) }]);\n        } finally {\n            outputs.setDefaultOutputName(\"html\");\n        }\n    });\n\n    it(\"Errors if an output is attempted to be redefined\", () => {\n        throws(\n            () => outputs.addOutput(\"json\", () => Promise.resolve()),\n            new Error(\"Output type 'json' has already been defined\"),\n        );\n    });\n\n    it(\"Errors if an unspecified output is written\", async () => {\n        await outputs.writeOutput(\n            {\n                name: \"notDefined\",\n                path: \"./docs\",\n            },\n            dummyProject,\n        );\n\n        logger.expectMessage(\n            'error: Specified output \"notDefined\" has not been defined.',\n        );\n    });\n\n    it(\"Writes all selected outputs, even if one fails\", async () => {\n        app.options.setValue(\"outputs\", [\n            { name: \"html\", path: \"./html_docs\" },\n            { name: \"notDefined\", path: \"./dummy\" },\n            { name: \"json\", path: \"./json_docs\" },\n        ]);\n\n        await outputs.writeOutputs(dummyProject);\n        equal(htmlWritten, true);\n        equal(jsonWritten, true);\n\n        logger.expectMessage(\n            'error: Specified output \"notDefined\" has not been defined.',\n        );\n        logger.expectMessage(\"info: html generated at ./html_docs\");\n        logger.expectMessage(\"info: json generated at ./json_docs\");\n    });\n\n    it(\"Skips writing an output if setting options fails\", async () => {\n        app.options.setValue(\"outputs\", [\n            {\n                name: \"html\",\n                path: \"./html_docs\",\n                options: { notDefined: true } as any,\n            },\n        ]);\n\n        await outputs.writeOutputs(dummyProject);\n        equal(htmlWritten, false);\n\n        logger.expectMessage(\n            \"error: Unknown option 'notDefined' You may have meant:*\",\n        );\n    });\n\n    it(\"Logs an error if an output prints an error message\", async () => {\n        outputs.addOutput(\"test\", () => {\n            app.logger.error(\"Test Error\" as TranslatedString);\n            return Promise.resolve();\n        });\n        await outputs.writeOutput({ name: \"test\", path: \"test\" }, dummyProject);\n\n        logger.expectMessage(\"error: Test Error\");\n        logger.expectMessage(\n            \"error: test output could not be generated due to the errors above\",\n        );\n    });\n\n    it(\"Logs an error if an output throws\", async () => {\n        outputs.addOutput(\"test\", () => Promise.reject(new Error(\"Test Error\")));\n        await outputs.writeOutput({ name: \"test\", path: \"test\" }, dummyProject);\n\n        logger.expectMessage(\"error: Test Error\");\n        logger.expectMessage(\n            \"error: test output could not be generated due to the errors above\",\n        );\n    });\n\n    it(\"Logs an error if an output throws a non-error\", async () => {\n        // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n        outputs.addOutput(\"test\", () => Promise.reject(\"Test Error\"));\n        await outputs.writeOutput({ name: \"test\", path: \"test\" }, dummyProject);\n\n        logger.expectMessage(\"error: Test Error\");\n        logger.expectMessage(\n            \"error: test output could not be generated due to the errors above\",\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/output/router.test.ts",
    "content": "import { deepStrictEqual as equal, ok, throws } from \"assert\";\nimport {\n    CategoryRouter,\n    GroupRouter,\n    KindDirRouter,\n    KindRouter,\n    type PageDefinition,\n    StructureDirRouter,\n    StructureRouter,\n} from \"../../lib/output/index.js\";\nimport { getConverter2App, getConverter2Project } from \"../programs.js\";\nimport { query } from \"../utils.js\";\nimport { DeclarationReflection, type Reflection, ReflectionKind } from \"../../lib/models/index.js\";\n\nconst app = getConverter2App();\n\nconst getProject = () => getConverter2Project([\"router\"], \"behavior\");\n\ndescribe(\"KindRouter\", () => {\n    it(\"Creates index page if project has a readme\", () => {\n        const project = getProject();\n        project.readme = [{ kind: \"text\", text: \"text\" }];\n        const router = new KindRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(pages.map((p) => [p.model.getFullName(), p.url]).slice(0, 3), [\n            [\"typedoc\", \"index.html\"],\n            [\"typedoc\", \"modules.html\"],\n            [\"typedoc\", \"hierarchy.html\"],\n        ]);\n    });\n\n    it(\"Defines URLs for expected reflections\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new KindRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(\n            pages.map((p) => [p.model.getFullName(), p.url]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"typedoc\", \"hierarchy.html\"],\n                [\"Nested\", \"modules/Nested.html\"],\n                [\"Nested.refl\", \"variables/Nested.refl.html\"],\n                [\"Foo\", \"interfaces/Foo.html\"],\n                [\"Obj\", \"types/Obj.html\"],\n                [\"ObjArray\", \"types/ObjArray.html\"],\n                [\"abc\", \"variables/abc.html\"],\n                [\"func\", \"functions/func.html\"],\n                [\"Func\", \"functions/Func-1.html\"],\n            ],\n        );\n\n        const linkable = router.getLinkTargets() as Reflection[];\n        equal(\n            linkable.map((refl) => [\n                refl.getFullName(),\n                router.getFullUrl(refl),\n            ]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"Nested\", \"modules/Nested.html\"],\n                [\"Nested.refl\", \"variables/Nested.refl.html\"],\n                [\"Foo\", \"interfaces/Foo.html\"],\n                [\"Foo.codeGeneration\", \"interfaces/Foo.html#codegeneration\"],\n                [\"Foo.iterator\", \"interfaces/Foo.html#iterator\"],\n                [\"Foo.iterator.iterator\", \"interfaces/Foo.html#iterator-1\"],\n                [\"Obj\", \"types/Obj.html\"],\n                [\"Obj.a\", \"types/Obj.html#a\"],\n                [\"ObjArray\", \"types/ObjArray.html\"],\n                [\"abc\", \"variables/abc.html\"],\n                [\"abc.__type.abcProp\", \"variables/abc.html#abcprop\"],\n                [\"func\", \"functions/func.html\"],\n                [\"func.func\", \"functions/func.html#func\"],\n                [\"Func\", \"functions/Func-1.html\"],\n                [\"Func.Func\", \"functions/Func-1.html#func\"],\n            ],\n        );\n    });\n\n    it(\"Can retrieve the anchor for a reflection\", () => {\n        const project = getProject();\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        equal(router.getAnchor(query(project, \"Obj\")), undefined);\n        equal(\n            router.getAnchor(query(project, \"Foo.codeGeneration\")),\n            \"codegeneration\",\n        );\n    });\n\n    it(\"Can check if a reflection has its own page\", () => {\n        const project = getProject();\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        equal(router.hasOwnDocument(query(project, \"Obj\")), true);\n        equal(\n            router.hasOwnDocument(query(project, \"Foo.codeGeneration\")),\n            false,\n        );\n\n        equal(\n            router.hasOwnDocument(\n                new DeclarationReflection(\"dummy\", ReflectionKind.Variable),\n            ),\n            false,\n        );\n    });\n\n    it(\"Can get relative URLs between pages\", () => {\n        const project = getProject();\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        const Foo = query(project, \"Foo\");\n        const codeGen = query(project, \"Foo.codeGeneration\");\n        const iterator = query(project, \"Foo.iterator\");\n        const abc = query(project, \"abc\");\n        const Obj = query(project, \"Obj\");\n        const ObjArray = query(project, \"ObjArray\");\n\n        equal(router.relativeUrl(Foo, abc), \"../variables/abc.html\");\n        equal(router.relativeUrl(abc, Foo), \"../interfaces/Foo.html\");\n        equal(\n            router.relativeUrl(abc, codeGen),\n            \"../interfaces/Foo.html#codegeneration\",\n        );\n\n        equal(router.relativeUrl(Obj, ObjArray), \"ObjArray.html\");\n        equal(router.relativeUrl(Foo, codeGen), \"#codegeneration\");\n        equal(router.relativeUrl(iterator, codeGen), \"#codegeneration\");\n        equal(router.relativeUrl(Foo, Foo), \"\");\n    });\n\n    it(\"Can get a URL to an asset relative to the base\", () => {\n        const project = getProject();\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        const Foo = query(project, \"Foo\");\n\n        equal(\n            router.baseRelativeUrl(Foo, \"assets/search.js\"),\n            \"../assets/search.js\",\n        );\n        equal(\n            router.baseRelativeUrl(project, \"assets/search.js\"),\n            \"assets/search.js\",\n        );\n\n        equal(\n            router.baseRelativeUrl(Foo, \"./\"),\n            \"../\",\n        );\n        equal(\n            router.baseRelativeUrl(project, \"./\"),\n            \"./\",\n        );\n    });\n\n    it(\"Can get a full URL to a reflection\", () => {\n        const project = getProject();\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        const Foo = query(project, \"Foo\");\n\n        equal(router.getFullUrl(Foo), \"interfaces/Foo.html\");\n\n        const ObjArray = query(project, \"ObjArray\");\n        equal(ObjArray.type?.type, \"array\");\n        equal(ObjArray.type.elementType.type, \"reflection\");\n        const b = ObjArray.type.elementType.declaration.getChildByName([\"b\"])!;\n        throws(() => router.getFullUrl(b));\n    });\n\n    it(\"Can get the slugger for the appropriate page\", () => {\n        const project = getProject();\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        const Foo = query(project, \"Foo\");\n        const codeGen = query(project, \"Foo.codeGeneration\");\n        ok(router.getSlugger(Foo) === router.getSlugger(codeGen));\n    });\n\n    it(\"Can link to the modules page\", () => {\n        const project = getProject();\n        project.readme = [{ kind: \"text\", text: \"Needed so we create a modules page\" }];\n        const router = new KindRouter(app);\n        router.buildPages(project);\n\n        const Foo = query(project, \"Foo\");\n        equal(router.relativeUrl(project, project), \"modules.html\");\n        equal(router.relativeUrl(Foo, project), \"../modules.html\");\n    });\n});\n\ndescribe(\"KindDirRouter\", () => {\n    it(\"Defines URLs for expected reflections\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new KindDirRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(\n            pages.map((p) => [p.model.getFullName(), p.url]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"typedoc\", \"hierarchy.html\"],\n                [\"Nested\", \"modules/Nested/index.html\"],\n                [\"Nested.refl\", \"variables/Nested.refl/index.html\"],\n                [\"Foo\", \"interfaces/Foo/index.html\"],\n                [\"Obj\", \"types/Obj/index.html\"],\n                [\"ObjArray\", \"types/ObjArray/index.html\"],\n                [\"abc\", \"variables/abc/index.html\"],\n                [\"func\", \"functions/func/index.html\"],\n                [\"Func\", \"functions/Func-1/index.html\"],\n            ],\n        );\n    });\n\n    it(\"Does not include trailing /index.html in full URLs\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new KindDirRouter(app);\n        router.buildPages(project);\n\n        equal(\n            router.getFullUrl(query(project, \"Nested.refl\")),\n            \"variables/Nested.refl/\",\n        );\n        equal(\n            router.getFullUrl(query(project, \"Foo.codeGeneration\")),\n            \"interfaces/Foo/#codegeneration\",\n        );\n    });\n\n    it(\"Does not include trailing /index.html in relative URLs\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new KindDirRouter(app);\n        router.buildPages(project);\n\n        equal(\n            router.relativeUrl(\n                query(project, \"Nested.refl\"),\n                query(project, \"Foo.codeGeneration\"),\n            ),\n            \"../../interfaces/Foo/#codegeneration\",\n        );\n    });\n});\n\ndescribe(\"StructureRouter\", () => {\n    it(\"Defines URLs for expected reflections\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new StructureRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(\n            pages.map((p) => [p.model.getFullName(), p.url]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"typedoc\", \"hierarchy.html\"],\n                [\"Nested\", \"Nested.html\"],\n                [\"Nested.refl\", \"Nested/refl.html\"],\n                [\"Foo\", \"Foo.html\"],\n                [\"Obj\", \"Obj.html\"],\n                [\"ObjArray\", \"ObjArray.html\"],\n                [\"abc\", \"abc.html\"],\n                [\"func\", \"func.html\"],\n                [\"Func\", \"Func-1.html\"],\n            ],\n        );\n    });\n});\n\ndescribe(\"StructureDirRouter\", () => {\n    it(\"Defines URLs for expected reflections\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new StructureDirRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(\n            pages.map((p) => [p.model.getFullName(), p.url]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"typedoc\", \"hierarchy.html\"],\n                [\"Nested\", \"Nested/index.html\"],\n                [\"Nested.refl\", \"Nested/refl/index.html\"],\n                [\"Foo\", \"Foo/index.html\"],\n                [\"Obj\", \"Obj/index.html\"],\n                [\"ObjArray\", \"ObjArray/index.html\"],\n                [\"abc\", \"abc/index.html\"],\n                [\"func\", \"func/index.html\"],\n                [\"Func\", \"Func-1/index.html\"],\n            ],\n        );\n    });\n\n    it(\"Does not include trailing /index.html in full URLs\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new StructureDirRouter(app);\n        router.buildPages(project);\n\n        equal(router.getFullUrl(query(project, \"Nested.refl\")), \"Nested/refl/\");\n        equal(\n            router.getFullUrl(query(project, \"Foo.codeGeneration\")),\n            \"Foo/#codegeneration\",\n        );\n    });\n\n    it(\"Does not include trailing /index.html in relative URLs\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new StructureDirRouter(app);\n        router.buildPages(project);\n\n        equal(\n            router.relativeUrl(\n                query(project, \"Nested.refl\"),\n                query(project, \"Foo.codeGeneration\"),\n            ),\n            \"../../Foo/#codegeneration\",\n        );\n\n        equal(\n            router.relativeUrl(\n                query(project, \"Nested\"),\n                query(project, \"Nested.refl\"),\n            ),\n            \"refl/\",\n        );\n\n        equal(router.relativeUrl(query(project, \"Nested.refl\"), query(project, \"Nested\")), \"../\");\n    });\n});\n\ndescribe(\"GroupRouter\", () => {\n    it(\"Defines URLs for expected reflections\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new GroupRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(\n            pages.map((p) => [p.model.getFullName(), p.url]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"typedoc\", \"hierarchy.html\"],\n                [\"Nested\", \"Namespaces/Nested.html\"],\n                [\"Nested.refl\", \"Variables/Nested.refl.html\"],\n                [\"Foo\", \"Interfaces/Foo.html\"],\n                [\"Obj\", \"Type_Aliases/Obj.html\"],\n                [\"ObjArray\", \"Type_Aliases/ObjArray.html\"],\n                [\"abc\", \"Abc/Group/abc.html\"],\n                [\"func\", \"Functions/func.html\"],\n                [\"Func\", \"Functions/Func-1.html\"],\n            ],\n        );\n    });\n});\n\ndescribe(\"CategoryRouter\", () => {\n    it(\"Defines URLs for expected reflections\", () => {\n        const project = getProject();\n        delete project.readme;\n        const router = new CategoryRouter(app);\n\n        const pages = router.buildPages(project) as PageDefinition<Reflection>[];\n        equal(\n            pages.map((p) => [p.model.getFullName(), p.url]),\n            [\n                [\"typedoc\", \"index.html\"],\n                [\"typedoc\", \"hierarchy.html\"],\n                [\"Nested\", \"Other/Nested.html\"],\n                [\"Nested.refl\", \"Other/Nested.refl.html\"],\n                [\"Foo\", \"Other/Foo.html\"],\n                [\"Obj\", \"CustomCat/Obj.html\"],\n                [\"ObjArray\", \"Other/ObjArray.html\"],\n                [\"abc\", \"Other/abc.html\"],\n                [\"func\", \"Other/func.html\"],\n                [\"Func\", \"Other/Func-1.html\"],\n            ],\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/packages.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { join } from \"path\";\nimport { normalizePath } from \"../lib/utils/index.js\";\nimport { expandPackages } from \"../lib/utils/package-manifest.js\";\n\nimport { tempdirProject } from \"@typestrong/fs-fixture-builder\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { createGlobString, MinimatchSet } from \"../lib/utils/paths.js\";\n\ndescribe(\"Packages support\", () => {\n    using project = tempdirProject();\n\n    afterEach(() => {\n        project.rm();\n    });\n\n    it(\"handles monorepos\", () => {\n        project.addJsonFile(\"tsconfig.json\", {\n            compilerOptions: {\n                strict: true,\n                sourceMap: true,\n            },\n            exclude: [\"node_modules\", \"dist\"],\n        });\n        const childTsconfig = {\n            extends: \"../../tsconfig.json\",\n            compilerOptions: {\n                outDir: \"dist\",\n            },\n        };\n        project.addJsonFile(\"package.json\", {\n            name: \"typedoc-multi-package-example\",\n            main: \"dist/index.js\",\n            workspaces: [\"packages/*\"],\n        });\n\n        // Bar, types entry point\n        project.addFile(\n            \"packages/bar/index.d.ts\",\n            \"export function bar(): void;\",\n        );\n        project.addJsonFile(\"packages/bar/package.json\", {\n            name: \"typedoc-multi-package-bar\",\n            version: \"1.0.0\",\n            types: \"index.d.ts\",\n        });\n        project.addJsonFile(\"packages/bar/tsconfig.json\", childTsconfig);\n\n        // Baz, TypeScript \"main\" entry point\n        project.addFile(\"packages/baz/index.ts\", \"export function baz(): {}\");\n        project.addJsonFile(\"packages/baz/package.json\", {\n            name: \"typedoc-multi-package-baz\",\n            version: \"1.0.0\",\n            main: \"index.ts\",\n        });\n        project.addJsonFile(\"packages/baz/tsconfig.json\", childTsconfig);\n\n        // Bay, entry point with \"typedoc.entryPoint\"\n        project.addFile(\"packages/bay/dist/index.js\", \"module.exports = 123\");\n        project.addFile(\"packages/bay/index.ts\", \"export function foo() {}\");\n        project.addJsonFile(\"packages/bay/package.json\", {\n            name: \"typedoc-multi-package-bay\",\n            version: \"1.0.0\",\n            main: \"dist/index\",\n            typedoc: {\n                entryPoint: \"index.ts\",\n            },\n        });\n        project.addJsonFile(\"packages/bay/tsconfig.json\", childTsconfig);\n\n        // Ign, ignored package\n        project.addFile(\"packages/ign/dist/index.js\", \"module.exports = 123\");\n        project.addFile(\"packages/ign/index.ts\", \"export function ign() {}\");\n        project.addJsonFile(\"packages/ign/package.json\", {\n            name: \"typedoc-multi-package-ign\",\n            version: \"1.0.0\",\n            main: \"dist/index\",\n        });\n        project.addJsonFile(\"packages/ign/tsconfig.json\", childTsconfig);\n\n        project.write();\n        const logger = new TestLogger();\n        const packages = expandPackages(\n            logger,\n            normalizePath(project.cwd),\n            [createGlobString(normalizePath(project.cwd), \".\")],\n            new MinimatchSet([createGlobString(normalizePath(project.cwd), \"**/ign\")]),\n        );\n\n        equal(\n            packages,\n            [\n                join(project.cwd, \"packages/bar\"),\n                join(project.cwd, \"packages/bay\"),\n                join(project.cwd, \"packages/baz\"),\n            ].map(normalizePath),\n        );\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"handles single packages\", () => {\n        project.addJsonFile(\"tsconfig.json\", {\n            compilerOptions: {\n                outDir: \"dist\",\n                sourceMap: true,\n                strict: true,\n            },\n            include: [\"src\"],\n        });\n        project.addJsonFile(\"package.json\", {\n            name: \"typedoc-single-package\",\n            main: \"dist/index.js\",\n        });\n        // Split up this string so that VSCode doesn't try to use it for this file.\n        project.addFile(\"dist/index.js\", `//` + `# sourceMappingURL=index.js.map`);\n        project.addJsonFile(\"dist/index.js.map\", {\n            version: 3,\n            file: \"index.js\",\n            sourceRoot: \"\",\n            sources: [\"../src/index.ts\"],\n            names: [],\n            mappings: \"\",\n        });\n        project.addFile(\n            \"src/index.ts\",\n            `export function helloWorld() { return \"Hello World!\"; }`,\n        );\n        project.write();\n\n        const logger = new TestLogger();\n        const packages = expandPackages(\n            logger,\n            normalizePath(project.cwd),\n            [createGlobString(normalizePath(project.cwd), \".\")],\n            new MinimatchSet([]),\n        );\n\n        logger.expectNoOtherMessages();\n        equal(packages, [normalizePath(project.cwd)]);\n    });\n\n    it(\"Handles TS 4.7 extensions\", () => {\n        project.addJsonFile(\"tsconfig.json\", {\n            compilerOptions: {\n                outDir: \"dist\",\n                sourceMap: true,\n                strict: true,\n            },\n            include: [\"src\"],\n        });\n        project.addJsonFile(\"package.json\", {\n            name: \"typedoc-single-package\",\n            main: \"dist/index.cjs\",\n        });\n        // Split up this string so that VSCode doesn't try to use it for this file.\n        project.addFile(\"dist/index.cjs\", `//` + `# sourceMappingURL=index.cjs.map`);\n        project.addJsonFile(\"dist/index.cjs.map\", {\n            version: 3,\n            file: \"index.cjs\",\n            sourceRoot: \"\",\n            sources: [\"../src/index.cts\"],\n            names: [],\n            mappings: \"\",\n        });\n        project.addFile(\n            \"src/index.cts\",\n            `export function helloWorld() { return \"Hello World!\"; }`,\n        );\n        project.write();\n\n        const logger = new TestLogger();\n        const packages = expandPackages(\n            logger,\n            normalizePath(project.cwd),\n            [createGlobString(normalizePath(project.cwd), \".\")],\n            new MinimatchSet([]),\n        );\n\n        logger.expectNoOtherMessages();\n        equal(packages, [normalizePath(project.cwd)]);\n    });\n});\n"
  },
  {
    "path": "src/test/plugins/absolute.ts",
    "content": "export function load() {\n    // nop\n}\n"
  },
  {
    "path": "src/test/plugins/relative.ts",
    "content": "export function load() {\n    // nop\n}\n"
  },
  {
    "path": "src/test/programs.ts",
    "content": "import { deepStrictEqual as equal, ok } from \"assert\";\nimport { join } from \"path\";\nimport ts from \"typescript\";\nimport {\n    type Application,\n    EntryPointStrategy,\n    type JSONOutput,\n    ProjectReflection,\n    SourceReference,\n    TSConfigReader,\n    type TypeDocOptions,\n} from \"../index.js\";\nimport type { ModelToObject } from \"../lib/serialization/schema.js\";\nimport { createAppForTesting } from \"../lib/application.js\";\nimport { existsSync } from \"fs\";\nimport { diagnostics } from \"../lib/utils/loggers.js\";\nimport { normalizePath, OptionDefaults, readFile, ValidatingFileRegistry } from \"#node-utils\";\n\nlet converterApp: Application | undefined;\nlet converterProgram: ts.Program | undefined;\nlet converter2App: Application | undefined;\nlet converter2Program: ts.Program | undefined;\n\nexport function getConverterBase() {\n    return join(process.cwd(), \"src/test/converter\");\n}\n\nexport function getConverterApp() {\n    if (!converterApp) {\n        converterApp = createAppForTesting();\n        for (\n            const [name, value] of Object.entries(\n                {\n                    name: \"typedoc\",\n                    excludeExternals: true,\n                    disableSources: false,\n                    excludePrivate: false,\n                    excludePrivateClassFields: false,\n                    tsconfig: join(getConverterBase(), \"tsconfig.json\"),\n                    externalPattern: [\"**/node_modules/**\"],\n                    plugin: [],\n                    entryPointStrategy: EntryPointStrategy.Expand,\n                    gitRevision: \"fake\",\n                    readme: \"none\",\n                    skipErrorChecking: true,\n                    preservedTypeAnnotationTags: [\"@gh3020\"],\n                    blockTags: [...OptionDefaults.blockTags, \"@gh3020\"],\n                } satisfies TypeDocOptions,\n            )\n        ) {\n            converterApp.options.setValue(name as never, value as never);\n        }\n        new TSConfigReader().read(\n            converterApp.options,\n            converterApp.logger,\n            process.cwd(),\n        );\n\n        converterApp.serializer.addSerializer({\n            priority: -1,\n            supports(obj) {\n                return obj instanceof SourceReference;\n            },\n            toObject(\n                ref: SourceReference,\n                obj: ModelToObject<SourceReference>,\n                _serializer,\n            ) {\n                if (obj.url) {\n                    obj.url = `typedoc://${\n                        obj.url.substring(\n                            obj.url.indexOf(ref.fileName),\n                        )\n                    }`;\n                }\n                return obj;\n            },\n        });\n        converterApp.serializer.addSerializer({\n            priority: -1,\n            supports(obj) {\n                return obj instanceof ProjectReflection;\n            },\n            toObject(\n                _refl: ProjectReflection,\n                obj: JSONOutput.ProjectReflection,\n            ) {\n                delete obj.packageVersion;\n                return obj;\n            },\n        });\n    }\n\n    return converterApp;\n}\n\nexport function getConverterProgram() {\n    if (!converterProgram) {\n        const app = getConverterApp();\n        converterProgram = ts.createProgram(\n            app.options.getFileNames(),\n            app.options.getCompilerOptions(app.logger),\n        );\n\n        const errors = ts.getPreEmitDiagnostics(converterProgram);\n        equal(errors, []);\n    }\n    return converterProgram;\n}\n\nexport function getConverter2Base() {\n    return join(process.cwd(), \"src/test/converter2\");\n}\n\nexport function getConverter2App() {\n    if (!converter2App) {\n        converter2App = createAppForTesting();\n\n        // This is a base-bones version of the TypeDocReader's read method\n        // which doesn't handle a JS config, so can be done synchronously\n        const result = ts.readConfigFile(join(getConverter2Base(), \"typedoc.json\"), readFile);\n        for (const [name, value] of Object.entries(result.config)) {\n            converter2App.options.setValue(name as never, value as never, getConverter2Base());\n        }\n\n        new TSConfigReader().read(\n            converter2App.options,\n            converter2App.logger,\n            process.cwd(),\n        );\n    }\n    return converter2App;\n}\n\nexport function getConverter2Program() {\n    if (!converter2Program) {\n        const app = getConverter2App();\n        converter2Program = ts.createProgram(\n            app.options.getFileNames(),\n            app.options.getCompilerOptions(app.logger),\n        );\n\n        const errors = ts.getPreEmitDiagnostics(converter2Program);\n        diagnostics(app.logger, errors);\n        equal(errors.length, 0);\n    }\n\n    return converter2Program;\n}\n\nexport function getConverter2Project(entries: string[], folder: string) {\n    const app = getConverter2App();\n    const base = getConverter2Base();\n    const program = getConverter2Program();\n\n    const entryPoints = entries\n        .map((entry) =>\n            [\n                join(base, `${folder}/${entry}.ts`),\n                join(base, `${folder}/${entry}.d.ts`),\n                join(base, `${folder}/${entry}.tsx`),\n                join(base, `${folder}/${entry}.js`),\n                join(base, folder, entry, \"index.ts\"),\n                join(base, folder, entry, \"index.js\"),\n                join(base, folder, entry),\n            ].find(existsSync)\n        )\n        .filter((x) => x !== undefined)\n        .map(normalizePath);\n\n    const files = entryPoints.map((e) => program.getSourceFile(e));\n    for (const [index, file] of files.entries()) {\n        ok(file, `No source file found for ${entryPoints[index]}`);\n    }\n\n    ok(entryPoints.length > 0, \"Expected at least one entry point\");\n\n    app.options.setValue(\"entryPoints\", entryPoints);\n    app.files = new ValidatingFileRegistry(app.options.getValue(\"basePath\"));\n    return app.converter.convert(\n        files.map((file, index) => {\n            return {\n                displayName: entries[index].replace(/\\.[tj]sx?$/, \"\"),\n                program,\n                sourceFile: file!,\n            };\n        }),\n    );\n}\n"
  },
  {
    "path": "src/test/project.test.ts",
    "content": "import { JSONOutput, splitUnquotedString } from \"../index.js\";\nimport Assert from \"assert\";\nimport { JSON_SCHEMA_VERSION } from \"../lib/models/ProjectReflection.js\";\n\ndescribe(\"Project\", function () {\n    describe(\"splitUnquotedString\", () => {\n        let result: string[] | undefined;\n\n        it(\"unquoted string\", function () {\n            result = splitUnquotedString(\"foo.bar\", \".\");\n            Assert.strictEqual(result.length, 2, \"Wrong length\");\n            Assert.strictEqual(result[0], \"foo\", \"Wrong split\");\n            Assert.strictEqual(result[1], \"bar\", \"Wrong split\");\n        });\n\n        it(\"quoted string\", function () {\n            result = splitUnquotedString('\"foo.bar\"', \".\");\n            Assert.strictEqual(result.length, 1, \"Wrong length\");\n            Assert.strictEqual(result[0], '\"foo.bar\"', \"Wrong split\");\n        });\n\n        it(\"quoted start, unquoted end\", function () {\n            result = splitUnquotedString('\"foo.d\".bar', \".\");\n            Assert.strictEqual(result.length, 2, \"Wrong length\");\n            Assert.strictEqual(result[0], '\"foo.d\"', \"Wrong split\");\n            Assert.strictEqual(result[1], \"bar\", \"Wrong split\");\n        });\n\n        it(\"unmatched quotes\", function () {\n            result = splitUnquotedString('\"foo.d', \".\");\n            Assert.strictEqual(result.length, 2, \"Wrong length\");\n            Assert.strictEqual(result[0], '\"foo', \"Wrong split\");\n            Assert.strictEqual(result[1], \"d\", \"Wrong split\");\n        });\n    });\n\n    describe(\"JSON schema version\", () => {\n        Assert.strictEqual(JSON_SCHEMA_VERSION, JSONOutput.SCHEMA_VERSION);\n    });\n});\n"
  },
  {
    "path": "src/test/renderer/DefaultTheme.test.ts",
    "content": "import { buildRendererSpecs } from \"./testRendererUtils.js\";\nimport { deepEqual as equal } from \"assert/strict\";\nimport { glob, readFile } from \"#node-utils\";\nimport type { GlobString, NormalizedPath } from \"#utils\";\nimport { join, relative } from \"path\";\n\ndescribe(\"DefaultTheme\", () => {\n    it(\"Matches render snapshot\", async function () {\n        const SPEC_PATH = \"src/test/renderer/specs\" as NormalizedPath;\n        const outPath = \"tmp/renderer\" as NormalizedPath;\n\n        await buildRendererSpecs(outPath);\n\n        const expectedFiles = glob(\"**/*\" as GlobString, SPEC_PATH);\n        const actualFiles = glob(\"**/*\" as GlobString, outPath);\n        const relPaths = expectedFiles.map(p => relative(SPEC_PATH, p)).sort();\n\n        equal(\n            actualFiles.map(p => relative(outPath, p)).sort(),\n            relPaths,\n        );\n\n        for (const rel of relPaths) {\n            const expected = JSON.parse(readFile(join(SPEC_PATH, rel)));\n            const actual = JSON.parse(readFile(join(outPath, rel)));\n\n            equal(actual, expected);\n        }\n    });\n});\n"
  },
  {
    "path": "src/test/renderer/specs/classes/BaseClass.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"BaseClass\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": [\n                                \"Class BaseClass\",\n                                {\n                                    \"code.tsd-tag\": \"Abstract\"\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"section.tsd-panel.tsd-hierarchy\",\n                    \"props\": {\n                        \"data-refl\": \"14\"\n                    },\n                    \"children\": [\n                        {\n                            \"h4\": [\n                                \"Hierarchy (\",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"../hierarchy.html#BaseClass\"\n                                    },\n                                    \"children\": \"View Summary\"\n                                },\n                                \")\"\n                            ]\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li.tsd-hierarchy-item\": [\n                                    {\n                                        \"span.tsd-hierarchy-target\": \"BaseClass\"\n                                    },\n                                    {\n                                        \"ul.tsd-hierarchy\": {\n                                            \"li.tsd-hierarchy-item\": {\n                                                \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                \"props\": {\n                                                    \"href\": \"RenderClass.json\"\n                                                },\n                                                \"children\": \"RenderClass\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:17\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Methods\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#base\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"base\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#method\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"method\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructorbaseclass\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"BaseClass\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"BaseClass\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorbaseclass\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": {\n                                                        \"h4.tsd-returns-title\": [\n                                                            \"Returns \",\n                                                            {\n                                                                \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                \"props\": {\n                                                                    \"href\": \"\"\n                                                                },\n                                                                \"children\": \"BaseClass\"\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#base\": [\n                                                {\n                                                    \"span\": \"base\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#base\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#base-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"base\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#base-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"void\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"index.ts\"\n                                                                                },\n                                                                                \"children\": \"index.ts:21\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#method\": [\n                                                {\n                                                    \"span\": \"method\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#method\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#method-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"method\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"(\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-kind-parameter\": \"x\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"string\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \")\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#method-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Base class method\"\n                                                                }\n                                                            },\n                                                            {\n                                                                \"div.tsd-parameters\": [\n                                                                    {\n                                                                        \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                    },\n                                                                    {\n                                                                        \"ul.tsd-parameter-list\": {\n                                                                            \"li\": {\n                                                                                \"span\": [\n                                                                                    {\n                                                                                        \"span.tsd-kind-parameter\": \"x\"\n                                                                                    },\n                                                                                    \": \",\n                                                                                    {\n                                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                                    }\n                                                                                ]\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"void\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"index.ts\"\n                                                                                },\n                                                                                \"children\": \"index.ts:19\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Methods\"\n                                            },\n                                            \"children\": \"Methods\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#base\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"base\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#method\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"method\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/GH3007.DOMBase.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH3007.json\"\n                                        },\n                                        \"children\": \"GH3007\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"DOMBase\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Class DOMBase<T>\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel\": [\n                        {\n                            \"h4\": \"Type Parameters\"\n                        },\n                        {\n                            \"ul.tsd-type-parameter-list\": {\n                                \"li\": {\n                                    \"span#t\": [\n                                        {\n                                            \"span.tsd-kind-type-parameter\": \"T\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-keyword\": \"extends\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-type\": \"Node\"\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh3007.ts\"\n                                    },\n                                    \"children\": \"gh3007.ts:5\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Methods\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#iterator\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"[iterator]\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructordombase\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"DOMBase\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructordombaset\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"extends\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"Node\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"DOMBase\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#t\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructordombase\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"section.tsd-panel\": [\n                                                                {\n                                                                    \"h4\": \"Type Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-type-parameter-list\": {\n                                                                        \"li\": {\n                                                                            \"span#constructordombaset\": [\n                                                                                {\n                                                                                    \"span.tsd-kind-type-parameter\": \"T\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-signature-keyword\": \"extends\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-signature-type\": \"Node\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                    \"props\": {\n                                                                        \"href\": \"\"\n                                                                    },\n                                                                    \"children\": \"DOMBase\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                                    \"props\": {\n                                                                        \"href\": \"#t\"\n                                                                    },\n                                                                    \"children\": \"T\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#iterator\": [\n                                            {\n                                                \"span\": \"[iterator]\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#iterator\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#iterator-1\": [\n                                                        {\n                                                            \"span.tsd-kind-call-signature\": \"\\\"[iterator]\\\"\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"Iterator\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#t\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#iterator-1\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"Iterator\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                                    \"props\": {\n                                                                        \"href\": \"#t\"\n                                                                    },\n                                                                    \"children\": \"T\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": {\n                                                                \"ul\": {\n                                                                    \"li\": [\n                                                                        \"Defined in \",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"gh3007.ts\"\n                                                                            },\n                                                                            \"children\": \"gh3007.ts:6\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Methods\"\n                                            },\n                                            \"children\": \"Methods\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#iterator\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"[iterator]\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/GH3007.DOMClass.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH3007.json\"\n                                        },\n                                        \"children\": \"GH3007\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"DOMClass\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Class DOMClass\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"section.tsd-panel.tsd-hierarchy\",\n                    \"props\": {\n                        \"data-refl\": \"146\"\n                    },\n                    \"children\": [\n                        {\n                            \"h4\": \"Hierarchy\"\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li.tsd-hierarchy-item\": [\n                                    {\n                                        \"span.tsd-signature-type\": \"DOMClass_base\"\n                                    },\n                                    {\n                                        \"ul.tsd-hierarchy\": {\n                                            \"li.tsd-hierarchy-item\": {\n                                                \"span.tsd-hierarchy-target\": \"DOMClass\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh3007.ts\"\n                                    },\n                                    \"children\": \"gh3007.ts:14\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Methods\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link.tsd-is-inherited\",\n                                                        \"props\": {\n                                                            \"href\": \"#iterator\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"[iterator]\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member.tsd-is-inherited\": [\n                                    {\n                                        \"h3.tsd-anchor-link#iterator\": [\n                                            {\n                                                \"span\": \"[iterator]\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#iterator\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures.tsd-is-inherited\": {\n                                            \"li.tsd-is-inherited\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#iterator-1\": [\n                                                        {\n                                                            \"span.tsd-kind-call-signature\": \"\\\"[iterator]\\\"\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"Iterator\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-type\": \"Node\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#iterator-1\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"Iterator\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"Node\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": [\n                                                                {\n                                                                    \"p\": \"Inherited from DOMClass_base.[iterator]\"\n                                                                },\n                                                                {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"gh3007.ts\"\n                                                                                },\n                                                                                \"children\": \"gh3007.ts:6\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Methods\"\n                                        },\n                                        \"children\": \"Methods\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a.tsd-is-inherited\",\n                                            \"props\": {\n                                                \"href\": \"#iterator\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"[iterator]\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/GH3014.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"GH3014\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Class GH3014\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"section.tsd-panel.tsd-hierarchy\",\n                    \"props\": {\n                        \"data-refl\": \"151\"\n                    },\n                    \"children\": [\n                        {\n                            \"h4\": \"Hierarchy\"\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li.tsd-hierarchy-item\": [\n                                    {\n                                        \"tag\": \"a.tsd-signature-type.external\",\n                                        \"props\": {\n                                            \"href\": \"typedoc://GH3014Base\",\n                                            \"target\": \"_blank\"\n                                        },\n                                        \"children\": \"GH3014Base\"\n                                    },\n                                    {\n                                        \"ul.tsd-hierarchy\": {\n                                            \"li.tsd-hierarchy-item\": {\n                                                \"span.tsd-hierarchy-target\": \"GH3014\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh3014.ts\"\n                                    },\n                                    \"children\": \"gh3014.ts:3\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Constructors\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#constructor\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"constructor\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructorgh3014\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"GH3014\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"GH3014\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorgh3014\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                    \"props\": {\n                                                                        \"href\": \"\"\n                                                                    },\n                                                                    \"children\": \"GH3014\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": [\n                                                                {\n                                                                    \"p\": [\n                                                                        \"Overrides \",\n                                                                        {\n                                                                            \"tag\": \"a.external\",\n                                                                            \"props\": {\n                                                                                \"href\": \"typedoc://GH3014Base.constructor\",\n                                                                                \"target\": \"_blank\"\n                                                                            },\n                                                                            \"children\": \"GH3014Base.constructor\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"gh3014.ts\"\n                                                                                },\n                                                                                \"children\": \"gh3014.ts:4\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Constructors\"\n                                        },\n                                        \"children\": \"Constructors\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a\",\n                                            \"props\": {\n                                                \"href\": \"#constructor\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"constructor\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/GH3052.CustomPromise.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH3052.json\"\n                                        },\n                                        \"children\": \"GH3052\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"CustomPromise\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Class CustomPromise<T>\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel\": [\n                        {\n                            \"h4\": \"Type Parameters\"\n                        },\n                        {\n                            \"ul.tsd-type-parameter-list\": {\n                                \"li\": {\n                                    \"span#t\": {\n                                        \"span.tsd-kind-type-parameter\": \"T\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel\": [\n                        {\n                            \"h4\": \"Implements\"\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li\": [\n                                    {\n                                        \"span.tsd-signature-type\": \"Promise\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \"<\"\n                                    },\n                                    {\n                                        \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                        \"props\": {\n                                            \"href\": \"#t\"\n                                        },\n                                        \"children\": \"T\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \">\"\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh3052.ts\"\n                                    },\n                                    \"children\": \"gh3052.ts:5\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Properties\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#tostringtag\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": [\n                                                                    \"[to\",\n                                                                    {\n                                                                        \"wbr\": []\n                                                                    },\n                                                                    \"String\",\n                                                                    {\n                                                                        \"wbr\": []\n                                                                    },\n                                                                    \"Tag]\"\n                                                                ]\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Methods\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#catch\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"catch\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#finally\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"finally\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#then\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"then\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructorcustompromise\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"CustomPromise\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorcustompromiset\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"CustomPromise\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#t\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorcustompromise\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"section.tsd-panel\": [\n                                                                {\n                                                                    \"h4\": \"Type Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-type-parameter-list\": {\n                                                                        \"li\": {\n                                                                            \"span#constructorcustompromiset\": {\n                                                                                \"span.tsd-kind-type-parameter\": \"T\"\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                    \"props\": {\n                                                                        \"href\": \"\"\n                                                                    },\n                                                                    \"children\": \"CustomPromise\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                                    \"props\": {\n                                                                        \"href\": \"#t\"\n                                                                    },\n                                                                    \"children\": \"T\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#tostringtag\": [\n                                            {\n                                                \"code.tsd-tag\": \"Readonly\"\n                                            },\n                                            {\n                                                \"span\": [\n                                                    \"[to\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"String\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"Tag]\"\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#tostringtag\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"\\\"[toStringTag]\\\"\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"\\\"Promise\\\"\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": [\n                                            {\n                                                \"p\": \"Implementation of Promise.[toStringTag]\"\n                                            },\n                                            {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"gh3052.ts\"\n                                                            },\n                                                            \"children\": \"gh3052.ts:6\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#catch\": [\n                                                {\n                                                    \"span\": \"catch\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#catch\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#catch-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"catch\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"any\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#catch-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Attaches a callback for only the rejection of the Promise.\"\n                                                                }\n                                                            },\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"any\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"p\": \"A Promise for the completion of the callback.\"\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": [\n                                                                    {\n                                                                        \"p\": \"Implementation of Promise.catch\"\n                                                                    },\n                                                                    {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"gh3052.ts\"\n                                                                                    },\n                                                                                    \"children\": \"gh3052.ts:8\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#finally\": [\n                                                {\n                                                    \"span\": \"finally\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#finally\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#finally-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"finally\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"any\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#finally-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The\\nresolved value cannot be modified from the callback.\"\n                                                                }\n                                                            },\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"any\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"p\": \"A Promise for the completion of the callback.\"\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": [\n                                                                    {\n                                                                        \"p\": \"Implementation of Promise.finally\"\n                                                                    },\n                                                                    {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"gh3052.ts\"\n                                                                                    },\n                                                                                    \"children\": \"gh3052.ts:9\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#then\": [\n                                                {\n                                                    \"span\": \"then\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#then\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#then-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"then\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"any\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#then-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Attaches callbacks for the resolution and/or rejection of the Promise.\"\n                                                                }\n                                                            },\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"any\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"p\": \"A Promise for the completion of which ever callback is executed.\"\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": [\n                                                                    {\n                                                                        \"p\": \"Implementation of Promise.then\"\n                                                                    },\n                                                                    {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"gh3052.ts\"\n                                                                                    },\n                                                                                    \"children\": \"gh3052.ts:7\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Properties\"\n                                            },\n                                            \"children\": \"Properties\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#tostringtag\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"[to\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"String\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Tag]\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Methods\"\n                                            },\n                                            \"children\": \"Methods\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#catch\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"catch\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#finally\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"finally\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#then\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"then\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/GH3052.PromiseReference.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH3052.json\"\n                                        },\n                                        \"children\": \"GH3052\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"PromiseReference\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Class PromiseReference\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh3052.ts\"\n                                    },\n                                    \"children\": \"gh3052.ts:12\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Methods\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#catchifcatchable\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": [\n                                                                    \"catch\",\n                                                                    {\n                                                                        \"wbr\": []\n                                                                    },\n                                                                    \"If\",\n                                                                    {\n                                                                        \"wbr\": []\n                                                                    },\n                                                                    \"Catchable\"\n                                                                ]\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructorpromisereference\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"PromiseReference\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"PromiseReference\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorpromisereference\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": {\n                                                        \"h4.tsd-returns-title\": [\n                                                            \"Returns \",\n                                                            {\n                                                                \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                \"props\": {\n                                                                    \"href\": \"\"\n                                                                },\n                                                                \"children\": \"PromiseReference\"\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#catchifcatchable\": [\n                                            {\n                                                \"code.tsd-tag\": \"Static\"\n                                            },\n                                            {\n                                                \"span\": [\n                                                    \"catch\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"If\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"Catchable\"\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#catchifcatchable\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#catchifcatchable-1\": [\n                                                        {\n                                                            \"span.tsd-kind-call-signature\": \"catchIfCatchable\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                        },\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"    \",\n                                                        {\n                                                            \"span.tsd-kind-parameter\": \"p\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"any\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \",\"\n                                                        },\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \")\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"    \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"|\"\n                                                        },\n                                                        \" (\",\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"        \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"=\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"never\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                        },\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"            \",\n                                                        {\n                                                            \"span.tsd-kind-parameter\": \"onrejected\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"?:\"\n                                                        },\n                                                        \" (\",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-kind-parameter\": \"reason\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"any\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \")\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"=>\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"|\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"PromiseLike\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        \") \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"|\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"null\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \",\"\n                                                        },\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"        \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \")\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"=>\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"Promise\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-type\": \"any\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"    )\",\n                                                        {\n                                                            \"br\": []\n                                                        },\n                                                        \"    \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"|\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"undefined\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#catchifcatchable-1\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"div.tsd-parameters\": [\n                                                                {\n                                                                    \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-parameter-list\": {\n                                                                        \"li\": {\n                                                                            \"span\": [\n                                                                                {\n                                                                                    \"span.tsd-kind-parameter\": \"p\"\n                                                                                },\n                                                                                \": \",\n                                                                                {\n                                                                                    \"span.tsd-signature-type\": \"any\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"br\": []\n                                                                },\n                                                                \"    \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"|\"\n                                                                },\n                                                                \" (\",\n                                                                {\n                                                                    \"br\": []\n                                                                },\n                                                                \"        \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"=\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"never\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"(\"\n                                                                },\n                                                                {\n                                                                    \"br\": []\n                                                                },\n                                                                \"            \",\n                                                                {\n                                                                    \"span.tsd-kind-parameter\": \"onrejected\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"?:\"\n                                                                },\n                                                                \" (\",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"(\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-kind-parameter\": \"reason\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"any\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \")\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"=>\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"|\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"PromiseLike\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                },\n                                                                \") \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"|\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"null\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \",\"\n                                                                },\n                                                                {\n                                                                    \"br\": []\n                                                                },\n                                                                \"        \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \")\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"=>\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"Promise\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"any\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                },\n                                                                {\n                                                                    \"br\": []\n                                                                },\n                                                                \"    )\",\n                                                                {\n                                                                    \"br\": []\n                                                                },\n                                                                \"    \",\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"|\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"undefined\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"ul\": [\n                                                                {\n                                                                    \"li\": [\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"=\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"never\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \">\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                                        },\n                                                                        {\n                                                                            \"br\": []\n                                                                        },\n                                                                        \"    \",\n                                                                        {\n                                                                            \"span.tsd-kind-parameter\": \"onrejected\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"?:\"\n                                                                        },\n                                                                        \" (\",\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-kind-parameter\": \"reason\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \":\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"any\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \")\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"=>\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"|\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"PromiseLike\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \">\"\n                                                                        },\n                                                                        \") \",\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"|\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"null\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \",\"\n                                                                        },\n                                                                        {\n                                                                            \"br\": []\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \")\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"=>\"\n                                                                        },\n                                                                        \" \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"Promise\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"any\"\n                                                                        },\n                                                                        {\n                                                                            \"span.tsd-signature-symbol\": \">\"\n                                                                        },\n                                                                        {\n                                                                            \"ul.tsd-parameters\": {\n                                                                                \"li.tsd-parameter-signature\": {\n                                                                                    \"ul.tsd-signatures\": [\n                                                                                        {\n                                                                                            \"li.tsd-signature\": [\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"=\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type\": \"never\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"(\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"br\": []\n                                                                                                },\n                                                                                                \"    \",\n                                                                                                {\n                                                                                                    \"span.tsd-kind-parameter\": \"onrejected\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"?:\"\n                                                                                                },\n                                                                                                \" (\",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"(\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-kind-parameter\": \"reason\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type\": \"any\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \")\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"=>\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"|\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type\": \"PromiseLike\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                                                },\n                                                                                                \") \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"|\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type\": \"null\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \",\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"br\": []\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \")\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                                                },\n                                                                                                \" \",\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type\": \"Promise\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-type\": \"any\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                                                }\n                                                                                            ]\n                                                                                        },\n                                                                                        {\n                                                                                            \"li.tsd-description\": [\n                                                                                                {\n                                                                                                    \"div.tsd-comment.tsd-typography\": {\n                                                                                                        \"p\": \"Attaches a callback for only the rejection of the Promise.\"\n                                                                                                    }\n                                                                                                },\n                                                                                                {\n                                                                                                    \"section.tsd-panel\": [\n                                                                                                        {\n                                                                                                            \"h4\": \"Type Parameters\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"ul.tsd-type-parameter-list\": {\n                                                                                                                \"li\": {\n                                                                                                                    \"span\": [\n                                                                                                                        {\n                                                                                                                            \"span.tsd-kind-type-parameter\": \"TResult\"\n                                                                                                                        },\n                                                                                                                        \" = \",\n                                                                                                                        {\n                                                                                                                            \"span.tsd-signature-type\": \"never\"\n                                                                                                                        }\n                                                                                                                    ]\n                                                                                                                }\n                                                                                                            }\n                                                                                                        }\n                                                                                                    ]\n                                                                                                },\n                                                                                                {\n                                                                                                    \"div.tsd-parameters\": [\n                                                                                                        {\n                                                                                                            \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"ul.tsd-parameter-list\": {\n                                                                                                                \"li\": [\n                                                                                                                    {\n                                                                                                                        \"span\": [\n                                                                                                                            {\n                                                                                                                                \"code.tsd-tag\": \"Optional\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-kind-parameter\": \"onrejected\"\n                                                                                                                            },\n                                                                                                                            \": (\",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \"(\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-kind-parameter\": \"reason\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \":\"\n                                                                                                                            },\n                                                                                                                            \" \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-type\": \"any\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \")\"\n                                                                                                                            },\n                                                                                                                            \" \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \"=>\"\n                                                                                                                            },\n                                                                                                                            \" \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                                                                            },\n                                                                                                                            \" \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \"|\"\n                                                                                                                            },\n                                                                                                                            \" \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-type\": \"PromiseLike\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \"<\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-type.tsd-kind-type-parameter\": \"TResult\"\n                                                                                                                            },\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \">\"\n                                                                                                                            },\n                                                                                                                            \") \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-symbol\": \"|\"\n                                                                                                                            },\n                                                                                                                            \" \",\n                                                                                                                            {\n                                                                                                                                \"span.tsd-signature-type\": \"null\"\n                                                                                                                            }\n                                                                                                                        ]\n                                                                                                                    },\n                                                                                                                    {\n                                                                                                                        \"div.tsd-comment.tsd-typography\": {\n                                                                                                                            \"p\": \"The callback to execute when the Promise is rejected.\"\n                                                                                                                        }\n                                                                                                                    }\n                                                                                                                ]\n                                                                                                            }\n                                                                                                        }\n                                                                                                    ]\n                                                                                                },\n                                                                                                {\n                                                                                                    \"h4.tsd-returns-title\": [\n                                                                                                        \"Returns \",\n                                                                                                        {\n                                                                                                            \"span.tsd-signature-type\": \"Promise\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"span.tsd-signature-type\": \"any\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"span.tsd-signature-symbol\": \">\"\n                                                                                                        }\n                                                                                                    ]\n                                                                                                },\n                                                                                                {\n                                                                                                    \"p\": \"A Promise for the completion of the callback.\"\n                                                                                                }\n                                                                                            ]\n                                                                                        }\n                                                                                    ]\n                                                                                }\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"li\": {\n                                                                        \"span.tsd-signature-type\": \"undefined\"\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": {\n                                                                \"ul\": {\n                                                                    \"li\": [\n                                                                        \"Defined in \",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"gh3052.ts\"\n                                                                            },\n                                                                            \"children\": \"gh3052.ts:13\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Methods\"\n                                            },\n                                            \"children\": \"Methods\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#catchifcatchable\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"catch\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"If\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Catchable\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/GenericClass.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"GenericClass\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Class GenericClass<T>\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel.tsd-comment\": {\n                        \"div.tsd-comment.tsd-typography\": {\n                            \"p\": \"Generic class\"\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel\": [\n                        {\n                            \"h4\": \"Type Parameters\"\n                        },\n                        {\n                            \"ul.tsd-type-parameter-list\": {\n                                \"li\": {\n                                    \"span#t\": [\n                                        {\n                                            \"span.tsd-signature-keyword\": \"out\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-kind-type-parameter\": \"T\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-keyword\": \"extends\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-type\": \"string\"\n                                        },\n                                        \" = \",\n                                        {\n                                            \"span.tsd-signature-type\": \"\\\"\\\"\"\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:60\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Methods\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#genericmethod\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": [\n                                                                    \"generic\",\n                                                                    {\n                                                                        \"wbr\": []\n                                                                    },\n                                                                    \"Method\"\n                                                                ]\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructorgenericclass\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"GenericClass\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"out\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorgenericclasst\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"extends\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"string\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"=\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"\\\"\\\"\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"GenericClass\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#t\"\n                                                            },\n                                                            \"children\": \"T\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorgenericclass\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"section.tsd-panel\": [\n                                                                {\n                                                                    \"h4\": \"Type Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-type-parameter-list\": {\n                                                                        \"li\": {\n                                                                            \"span#constructorgenericclasst\": [\n                                                                                {\n                                                                                    \"span.tsd-signature-keyword\": \"out\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-kind-type-parameter\": \"T\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-signature-keyword\": \"extends\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-signature-type\": \"string\"\n                                                                                },\n                                                                                \" = \",\n                                                                                {\n                                                                                    \"span.tsd-signature-type\": \"\\\"\\\"\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                    \"props\": {\n                                                                        \"href\": \"\"\n                                                                    },\n                                                                    \"children\": \"GenericClass\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"<\"\n                                                                },\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                                    \"props\": {\n                                                                        \"href\": \"#t\"\n                                                                    },\n                                                                    \"children\": \"T\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \">\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#genericmethod\": [\n                                            {\n                                                \"span\": [\n                                                    \"generic\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"Method\"\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#genericmethod\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#genericmethod-1\": [\n                                                        {\n                                                            \"span.tsd-kind-call-signature\": \"genericMethod\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"<\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                            \"props\": {\n                                                                \"href\": \"#genericmethodu\"\n                                                            },\n                                                            \"children\": \"U\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"extends\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"string\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \">\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"void\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#genericmethod-1\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"section.tsd-panel\": [\n                                                                {\n                                                                    \"h4\": \"Type Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-type-parameter-list\": {\n                                                                        \"li\": {\n                                                                            \"span#genericmethodu\": [\n                                                                                {\n                                                                                    \"span.tsd-kind-type-parameter\": \"U\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-signature-keyword\": \"extends\"\n                                                                                },\n                                                                                \" \",\n                                                                                {\n                                                                                    \"span.tsd-signature-type\": \"string\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"void\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": {\n                                                                \"ul\": {\n                                                                    \"li\": [\n                                                                        \"Defined in \",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"index.ts\"\n                                                                            },\n                                                                            \"children\": \"index.ts:61\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Methods\"\n                                            },\n                                            \"children\": \"Methods\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#genericmethod\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"generic\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Method\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/ModifiersClass.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"ModifiersClass\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Class ModifiersClass\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:64\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Properties\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link.deprecated\",\n                                                            \"props\": {\n                                                                \"href\": \"#dep\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"dep\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link.tsd-is-protected\",\n                                                            \"props\": {\n                                                                \"href\": \"#prot\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"prot\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#pub\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"pub\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#read\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"read\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructormodifiersclass\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"ModifiersClass\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"()\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"ModifiersClass\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructormodifiersclass\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"div.tsd-comment.tsd-typography\": {\n                                                                \"p\": [\n                                                                    \"#2934 same page link\",\n                                                                    {\n                                                                        \"tag\": \"a.tsd-kind-class\",\n                                                                        \"props\": {\n                                                                            \"href\": \"#\"\n                                                                        },\n                                                                        \"children\": {\n                                                                            \"code\": \"ModifiersClass\"\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            }\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                    \"props\": {\n                                                                        \"href\": \"\"\n                                                                    },\n                                                                    \"children\": \"ModifiersClass\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": {\n                                                                \"ul\": {\n                                                                    \"li\": [\n                                                                        \"Defined in \",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"index.ts\"\n                                                                            },\n                                                                            \"children\": \"index.ts:73\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#dep\": [\n                                                {\n                                                    \"span.deprecated\": \"dep\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#dep\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"dep\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-type\": \"number\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \" = 5\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-comment.tsd-typography\": {\n                                                \"div.tsd-tag-deprecated\": {\n                                                    \"h4.tsd-anchor-link#deprecated\": [\n                                                        \"Deprecated\",\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#deprecated\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:70\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member.tsd-is-protected\": [\n                                        {\n                                            \"h3.tsd-anchor-link#prot\": [\n                                                {\n                                                    \"code.tsd-tag\": \"Protected\"\n                                                },\n                                                {\n                                                    \"span\": \"prot\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#prot\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"prot\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-type\": \"number\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \" = 1\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:65\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#pub\": [\n                                                {\n                                                    \"span\": \"pub\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#pub\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"pub\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-type\": \"number\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \" = 3\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:67\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#read\": [\n                                                {\n                                                    \"code.tsd-tag\": \"Readonly\"\n                                                },\n                                                {\n                                                    \"span\": \"read\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#read\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"read\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-type\": \"4\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:68\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Properties\"\n                                            },\n                                            \"children\": \"Properties\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#dep\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"dep\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-is-protected\",\n                                                    \"props\": {\n                                                        \"href\": \"#prot\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"prot\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#pub\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"pub\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#read\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"read\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/classes/RenderClass.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"RenderClass\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Class RenderClass\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel.tsd-comment\": {\n                        \"div.tsd-comment.tsd-typography\": {\n                            \"p\": \"Renderer class\"\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"section.tsd-panel.tsd-hierarchy\",\n                    \"props\": {\n                        \"data-refl\": \"22\"\n                    },\n                    \"children\": [\n                        {\n                            \"h4\": [\n                                \"Hierarchy (\",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"../hierarchy.html#RenderClass\"\n                                    },\n                                    \"children\": \"View Summary\"\n                                },\n                                \")\"\n                            ]\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li.tsd-hierarchy-item\": [\n                                    {\n                                        \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                        \"props\": {\n                                            \"href\": \"BaseClass.json\"\n                                        },\n                                        \"children\": \"BaseClass\"\n                                    },\n                                    {\n                                        \"ul.tsd-hierarchy\": {\n                                            \"li.tsd-hierarchy-item\": {\n                                                \"span.tsd-hierarchy-target\": \"RenderClass\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel\": [\n                        {\n                            \"h4.tsd-before-signature\": \"Indexable\"\n                        },\n                        {\n                            \"ul.tsd-signatures\": {\n                                \"li.tsd-index-signature\": [\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-signature-symbol\": \"[\"\n                                            },\n                                            {\n                                                \"span.tsd-kind-parameter\": \"k\"\n                                            },\n                                            \": \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"]:\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"unknown\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-comment.tsd-typography\": {\n                                            \"p\": \"Index signature\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:25\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Constructors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructor\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"constructor\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Properties\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#prop\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"prop\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Accessors\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#getset\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": [\n                                                                    \"get\",\n                                                                    {\n                                                                        \"wbr\": []\n                                                                    },\n                                                                    \"Set\"\n                                                                ]\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#getter\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"getter\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Methods\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link.tsd-is-inherited\",\n                                                            \"props\": {\n                                                                \"href\": \"#base\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"base\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#method\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"method\"\n                                                            }\n                                                        },\n                                                        \"\\n\",\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#overloaded\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"overloaded\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Constructors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Constructors\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#constructor\": [\n                                            {\n                                                \"span\": \"constructor\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#constructorrenderclass\": [\n                                                        {\n                                                            \"span.tsd-signature-keyword\": \"new\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-constructor-signature\": \"RenderClass\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-kind-parameter\": \"x\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"string\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \")\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                            \"props\": {\n                                                                \"href\": \"\"\n                                                            },\n                                                            \"children\": \"RenderClass\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#constructorrenderclass\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"div.tsd-comment.tsd-typography\": {\n                                                                \"p\": \"Ctor comment\"\n                                                            }\n                                                        },\n                                                        {\n                                                            \"div.tsd-parameters\": [\n                                                                {\n                                                                    \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-parameter-list\": {\n                                                                        \"li\": {\n                                                                            \"span\": [\n                                                                                {\n                                                                                    \"span.tsd-kind-parameter\": \"x\"\n                                                                                },\n                                                                                \": \",\n                                                                                {\n                                                                                    \"span.tsd-signature-type\": \"string\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                                                    \"props\": {\n                                                                        \"href\": \"\"\n                                                                    },\n                                                                    \"children\": \"RenderClass\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": [\n                                                                {\n                                                                    \"p\": [\n                                                                        \"Overrides \",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"BaseClass.json\"\n                                                                            },\n                                                                            \"children\": \"BaseClass\"\n                                                                        },\n                                                                        \".\",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"BaseClass.json#constructor\"\n                                                                            },\n                                                                            \"children\": \"constructor\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"index.ts\"\n                                                                                },\n                                                                                \"children\": \"index.ts:33\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#prop\": [\n                                            {\n                                                \"span\": \"prop\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#prop\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"prop\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \" = \\\"abc\\\"\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-comment.tsd-typography\": {\n                                            \"p\": \"Property\"\n                                        }\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"index.ts\"\n                                                        },\n                                                        \"children\": \"index.ts:30\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Accessors\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Accessors\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#getset\": [\n                                                {\n                                                    \"span\": [\n                                                        \"get\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Set\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#getset\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": [\n                                                {\n                                                    \"li\": [\n                                                        {\n                                                            \"div.tsd-signature#getsetgetset\": [\n                                                                {\n                                                                    \"span.tsd-signature-keyword\": \"get\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-kind-get-signature\": \"getSet\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"()\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"number\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"div.tsd-description\": [\n                                                                {\n                                                                    \"h4.tsd-returns-title\": [\n                                                                        \"Returns \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"number\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"aside.tsd-sources\": {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"index.ts\"\n                                                                                    },\n                                                                                    \"children\": \"index.ts:53\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"li\": [\n                                                        {\n                                                            \"div.tsd-signature#getsetgetset-1\": [\n                                                                {\n                                                                    \"span.tsd-signature-keyword\": \"set\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-kind-set-signature\": \"getSet\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"(\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-kind-parameter\": \"value\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"number\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \")\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"void\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"div.tsd-description\": [\n                                                                {\n                                                                    \"div.tsd-parameters\": [\n                                                                        {\n                                                                            \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                        },\n                                                                        {\n                                                                            \"ul.tsd-parameter-list\": {\n                                                                                \"li\": {\n                                                                                    \"span\": [\n                                                                                        {\n                                                                                            \"span.tsd-kind-parameter\": \"value\"\n                                                                                        },\n                                                                                        \": \",\n                                                                                        {\n                                                                                            \"span.tsd-signature-type\": \"number\"\n                                                                                        }\n                                                                                    ]\n                                                                                }\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"h4.tsd-returns-title\": [\n                                                                        \"Returns \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"void\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"aside.tsd-sources\": {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"index.ts\"\n                                                                                    },\n                                                                                    \"children\": \"index.ts:56\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#getter\": [\n                                                {\n                                                    \"span\": \"getter\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#getter\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li\": [\n                                                    {\n                                                        \"div.tsd-signature#gettergetter\": [\n                                                            {\n                                                                \"span.tsd-signature-keyword\": \"get\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-kind-get-signature\": \"getter\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"number\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"number\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"index.ts\"\n                                                                                },\n                                                                                \"children\": \"index.ts:49\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member.tsd-is-inherited\": [\n                                        {\n                                            \"h3.tsd-anchor-link#base\": [\n                                                {\n                                                    \"span\": \"base\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#base\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures.tsd-is-inherited\": {\n                                                \"li.tsd-is-inherited\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#base-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"base\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#base-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"void\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": [\n                                                                    {\n                                                                        \"p\": [\n                                                                            \"Inherited from \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"BaseClass.json\"\n                                                                                },\n                                                                                \"children\": \"BaseClass\"\n                                                                            },\n                                                                            \".\",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"BaseClass.json#base\"\n                                                                                },\n                                                                                \"children\": \"base\"\n                                                                            }\n                                                                        ]\n                                                                    },\n                                                                    {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"index.ts\"\n                                                                                    },\n                                                                                    \"children\": \"index.ts:21\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#method\": [\n                                                {\n                                                    \"span\": \"method\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#method\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#method-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"method\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"(\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-kind-parameter\": \"x\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"string\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \")\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#method-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Method comment\"\n                                                                }\n                                                            },\n                                                            {\n                                                                \"div.tsd-parameters\": [\n                                                                    {\n                                                                        \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                    },\n                                                                    {\n                                                                        \"ul.tsd-parameter-list\": {\n                                                                            \"li\": {\n                                                                                \"span\": [\n                                                                                    {\n                                                                                        \"span.tsd-kind-parameter\": \"x\"\n                                                                                    },\n                                                                                    \": \",\n                                                                                    {\n                                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                                    }\n                                                                                ]\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"void\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": [\n                                                                    {\n                                                                        \"p\": [\n                                                                            \"Overrides \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"BaseClass.json\"\n                                                                                },\n                                                                                \"children\": \"BaseClass\"\n                                                                            },\n                                                                            \".\",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"BaseClass.json#method\"\n                                                                                },\n                                                                                \"children\": \"method\"\n                                                                            }\n                                                                        ]\n                                                                    },\n                                                                    {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"index.ts\"\n                                                                                    },\n                                                                                    \"children\": \"index.ts:38\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#overloaded\": [\n                                                {\n                                                    \"span\": \"overloaded\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#overloaded\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": [\n                                                {\n                                                    \"li.\": [\n                                                        {\n                                                            \"div.tsd-signature.tsd-anchor-link#overloaded-1\": [\n                                                                {\n                                                                    \"span.tsd-kind-call-signature\": \"overloaded\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"()\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"string\"\n                                                                },\n                                                                {\n                                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                                    \"props\": {\n                                                                        \"href\": \"#overloaded-1\",\n                                                                        \"aria-label\": \"Permalink\"\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"div.tsd-description\": [\n                                                                {\n                                                                    \"div.tsd-comment.tsd-typography\": {\n                                                                        \"p\": \"Sig 1 comment\"\n                                                                    }\n                                                                },\n                                                                {\n                                                                    \"h4.tsd-returns-title\": [\n                                                                        \"Returns \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"string\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"aside.tsd-sources\": {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"index.ts\"\n                                                                                    },\n                                                                                    \"children\": \"index.ts:41\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"li.\": [\n                                                        {\n                                                            \"div.tsd-signature.tsd-anchor-link#overloaded-2\": [\n                                                                {\n                                                                    \"span.tsd-kind-call-signature\": \"overloaded\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"(\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-kind-parameter\": \"p\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"string\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \")\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \":\"\n                                                                },\n                                                                \" \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"number\"\n                                                                },\n                                                                {\n                                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                                    \"props\": {\n                                                                        \"href\": \"#overloaded-2\",\n                                                                        \"aria-label\": \"Permalink\"\n                                                                    }\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"div.tsd-description\": [\n                                                                {\n                                                                    \"div.tsd-comment.tsd-typography\": {\n                                                                        \"p\": \"Sig 2 comment\"\n                                                                    }\n                                                                },\n                                                                {\n                                                                    \"div.tsd-parameters\": [\n                                                                        {\n                                                                            \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                        },\n                                                                        {\n                                                                            \"ul.tsd-parameter-list\": {\n                                                                                \"li\": {\n                                                                                    \"span\": [\n                                                                                        {\n                                                                                            \"span.tsd-kind-parameter\": \"p\"\n                                                                                        },\n                                                                                        \": \",\n                                                                                        {\n                                                                                            \"span.tsd-signature-type\": \"string\"\n                                                                                        }\n                                                                                    ]\n                                                                                }\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"h4.tsd-returns-title\": [\n                                                                        \"Returns \",\n                                                                        {\n                                                                            \"span.tsd-signature-type\": \"number\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"aside.tsd-sources\": {\n                                                                        \"ul\": {\n                                                                            \"li\": [\n                                                                                \"Defined in \",\n                                                                                {\n                                                                                    \"tag\": \"a\",\n                                                                                    \"props\": {\n                                                                                        \"href\": \"index.ts\"\n                                                                                    },\n                                                                                    \"children\": \"index.ts:43\"\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    }\n                                                                }\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Constructors\"\n                                            },\n                                            \"children\": \"Constructors\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#constructor\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"constructor\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Properties\"\n                                            },\n                                            \"children\": \"Properties\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#prop\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"prop\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Accessors\"\n                                            },\n                                            \"children\": \"Accessors\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#getset\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"get\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Set\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#getter\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"getter\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Methods\"\n                                            },\n                                            \"children\": \"Methods\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a.tsd-is-inherited\",\n                                                    \"props\": {\n                                                        \"href\": \"#base\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"base\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#method\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"method\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#overloaded\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"overloaded\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/documents/doc.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": {\n                        \"tag\": \"ul.tsd-breadcrumb\",\n                        \"props\": {\n                            \"aria-label\": \"Breadcrumb\"\n                        },\n                        \"children\": {\n                            \"li\": {\n                                \"tag\": \"a\",\n                                \"props\": {\n                                    \"href\": \"\",\n                                    \"aria-current\": \"page\"\n                                },\n                                \"children\": \"doc\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"div.tsd-panel.tsd-typography\": [\n                        {\n                            \"p\": \"Rendered document\"\n                        },\n                        {\n                            \"p\": [\n                                \"Link to this doc:\",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\"\n                                    },\n                                    \"children\": \"link\"\n                                }\n                            ]\n                        },\n                        {\n                            \"pre\": [\n                                {\n                                    \"code.ts\": \"test();\"\n                                },\n                                {\n                                    \"tag\": \"button\",\n                                    \"props\": {\n                                        \"type\": \"button\"\n                                    },\n                                    \"children\": \"Copy\"\n                                }\n                            ]\n                        },\n                        {\n                            \"div.tsd-alert.tsd-alert-note\": [\n                                {\n                                    \"div.tsd-alert-title\": {\n                                        \"span\": \"Note\"\n                                    }\n                                },\n                                {\n                                    \"p\": \"This is an alert\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": []\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/enums/Enumeration.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"Enumeration\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Enumeration Enumeration\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel.tsd-comment\": [\n                        {\n                            \"div.tsd-comment.tsd-typography\": {\n                                \"p\": [\n                                    \"Enum comment\",\n                                    {\n                                        \"tag\": \"a.tsd-kind-enum-member\",\n                                        \"props\": {\n                                            \"href\": \"#value1\"\n                                        },\n                                        \"children\": \"Value1\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"div.tsd-comment.tsd-typography\": {\n                                \"div.tsd-tag-remarks\": [\n                                    {\n                                        \"h4.tsd-anchor-link#remarks\": [\n                                            \"Remarks\",\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#remarks\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"p\": \"Block tag\"\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:80\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Enumeration Members\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#value1\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"Value1\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#value2\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"Value2\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Enumeration Members\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Enumeration Members\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#value1\": [\n                                                {\n                                                    \"span\": \"Value1\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#value1\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-enum-member\": \"Value1\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-type\": \"0\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-comment.tsd-typography\": {\n                                                \"p\": \"Value1 comment\"\n                                            }\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:82\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#value2\": [\n                                                {\n                                                    \"span\": \"Value2\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#value2\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-enum-member\": \"Value2\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-type\": \"0\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-comment.tsd-typography\": {\n                                                \"p\": \"Value2 comment\"\n                                            }\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:84\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Enumeration Members\"\n                                        },\n                                        \"children\": \"Enumeration Members\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#value1\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"Value1\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#value2\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"Value2\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/functions/box.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"box\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Function box\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel\": {\n                        \"ul.tsd-signatures\": {\n                            \"li.\": [\n                                {\n                                    \"div.tsd-signature.tsd-anchor-link#box\": [\n                                        {\n                                            \"span.tsd-kind-call-signature\": \"box\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \"<\"\n                                        },\n                                        {\n                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                            \"props\": {\n                                                \"href\": \"#boxt\"\n                                            },\n                                            \"children\": \"T\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \">\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \"(\"\n                                        },\n                                        {\n                                            \"span.tsd-kind-parameter\": \"item\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \":\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                            \"props\": {\n                                                \"href\": \"#boxt\"\n                                            },\n                                            \"children\": \"T\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \")\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \":\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-symbol\": \"{\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-kind-property\": \"box\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \":\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                            \"props\": {\n                                                \"href\": \"#boxt\"\n                                            },\n                                            \"children\": \"T\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-symbol\": \"}\"\n                                        },\n                                        {\n                                            \"tag\": \"a.tsd-anchor-icon\",\n                                            \"props\": {\n                                                \"href\": \"#box\",\n                                                \"aria-label\": \"Permalink\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"div.tsd-description\": [\n                                        {\n                                            \"div.tsd-comment.tsd-typography\": {\n                                                \"p\": \"Signature comment\\n#2921 !Promise\"\n                                            }\n                                        },\n                                        {\n                                            \"section.tsd-panel\": [\n                                                {\n                                                    \"h4\": \"Type Parameters\"\n                                                },\n                                                {\n                                                    \"ul.tsd-type-parameter-list\": {\n                                                        \"li\": {\n                                                            \"span#boxt\": {\n                                                                \"span.tsd-kind-type-parameter\": \"T\"\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-parameters\": [\n                                                {\n                                                    \"h4.tsd-parameters-title\": \"Parameters\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameter-list\": {\n                                                        \"li\": [\n                                                            {\n                                                                \"span\": [\n                                                                    {\n                                                                        \"span.tsd-kind-parameter\": \"item\"\n                                                                    },\n                                                                    \": \",\n                                                                    {\n                                                                        \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                                        \"props\": {\n                                                                            \"href\": \"#boxt\"\n                                                                        },\n                                                                        \"children\": \"T\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Item comment\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"h4.tsd-returns-title\": [\n                                                \"Returns \",\n                                                {\n                                                    \"span.tsd-signature-symbol\": \"{\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-kind-property\": \"box\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                                                    \"props\": {\n                                                        \"href\": \"#boxt\"\n                                                    },\n                                                    \"children\": \"T\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"span.tsd-signature-symbol\": \"}\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"index.ts\"\n                                                            },\n                                                            \"children\": \"index.ts:113\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": []\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/hierarchy.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            }\n                        },\n                        {\n                            \"h1\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"h2\": \"Hierarchy Summary\"\n                },\n                {\n                    \"ul.tsd-full-hierarchy\": {\n                        \"tag\": \"li#BaseClass\",\n                        \"props\": {\n                            \"data-refl\": \"14\"\n                        },\n                        \"children\": [\n                            {\n                                \"tag\": \"a\",\n                                \"props\": {\n                                    \"href\": \"classes/BaseClass.json\"\n                                },\n                                \"children\": \"BaseClass\"\n                            },\n                            {\n                                \"ul\": {\n                                    \"tag\": \"li#RenderClass\",\n                                    \"props\": {\n                                        \"data-refl\": \"22\"\n                                    },\n                                    \"children\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"classes/RenderClass.json\"\n                                        },\n                                        \"children\": \"RenderClass\"\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": []\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/index.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            }\n                        },\n                        {\n                            \"h1\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-panel.tsd-typography\": [\n                        {\n                            \"h1#gh3023-test.tsd-anchor-link\": [\n                                \"gh3023 &lt;test&gt;\",\n                                {\n                                    \"tag\": \"a.tsd-anchor-icon\",\n                                    \"props\": {\n                                        \"href\": \"#gh3023-test\",\n                                        \"aria-label\": \"Permalink\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"p\": [\n                                \"Anchor for above heading should be\",\n                                {\n                                    \"code\": \"gh3023-test\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"a\",\n                                \"props\": {\n                                    \"href\": \"#gh3023-test\"\n                                },\n                                \"children\": {\n                                    \"span\": \"gh3023 <test>\"\n                                }\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/BaseInterface.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"BaseInterface\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Interface BaseInterface\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"BaseInterface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-call-signature\",\n                            \"props\": {\n                                \"href\": \"#base-1\"\n                            },\n                            \"children\": \"base\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"()\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"void\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-call-signature\",\n                            \"props\": {\n                                \"href\": \"#method-1\"\n                            },\n                            \"children\": \"method\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"(\"\n                        },\n                        {\n                            \"span.tsd-kind-parameter\": \"x\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \")\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"void\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:10\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Methods\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#base\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"base\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#method\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"method\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#base\": [\n                                                {\n                                                    \"span\": \"base\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#base\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#base-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"base\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"()\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#base-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"void\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"index.ts\"\n                                                                                },\n                                                                                \"children\": \"index.ts:14\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#method\": [\n                                                {\n                                                    \"span\": \"method\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#method\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"ul.tsd-signatures\": {\n                                                \"li.\": [\n                                                    {\n                                                        \"div.tsd-signature.tsd-anchor-link#method-1\": [\n                                                            {\n                                                                \"span.tsd-kind-call-signature\": \"method\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \"(\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-kind-parameter\": \"x\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"string\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \")\"\n                                                            },\n                                                            {\n                                                                \"span.tsd-signature-symbol\": \":\"\n                                                            },\n                                                            \" \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            },\n                                                            {\n                                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                                \"props\": {\n                                                                    \"href\": \"#method-1\",\n                                                                    \"aria-label\": \"Permalink\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"div.tsd-description\": [\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Interface method\"\n                                                                }\n                                                            },\n                                                            {\n                                                                \"div.tsd-parameters\": [\n                                                                    {\n                                                                        \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                    },\n                                                                    {\n                                                                        \"ul.tsd-parameter-list\": {\n                                                                            \"li\": {\n                                                                                \"span\": [\n                                                                                    {\n                                                                                        \"span.tsd-kind-parameter\": \"x\"\n                                                                                    },\n                                                                                    \": \",\n                                                                                    {\n                                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                                    }\n                                                                                ]\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"h4.tsd-returns-title\": [\n                                                                    \"Returns \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"void\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"aside.tsd-sources\": {\n                                                                    \"ul\": {\n                                                                        \"li\": [\n                                                                            \"Defined in \",\n                                                                            {\n                                                                                \"tag\": \"a\",\n                                                                                \"props\": {\n                                                                                    \"href\": \"index.ts\"\n                                                                                },\n                                                                                \"children\": \"index.ts:12\"\n                                                                            }\n                                                                        ]\n                                                                    }\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Methods\"\n                                        },\n                                        \"children\": \"Methods\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#base\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"base\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#method\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"method\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/DisabledGroups.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"DisabledGroups\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Interface DisabledGroups\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"DisabledGroups\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"1\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-call-signature\",\n                            \"props\": {\n                                \"href\": \"#b-1\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"()\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"void\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:132\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": {\n                                            \"div.tsd-index-list\": [\n                                                {\n                                                    \"tag\": \"a.tsd-index-link\",\n                                                    \"props\": {\n                                                        \"href\": \"#a\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"a\"\n                                                    }\n                                                },\n                                                \"\\n\",\n                                                {\n                                                    \"tag\": \"a.tsd-index-link\",\n                                                    \"props\": {\n                                                        \"href\": \"#b\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"b\"\n                                                    }\n                                                },\n                                                \"\\n\"\n                                            ]\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-member-group\": [\n                        {\n                            \"section.tsd-panel.tsd-member\": [\n                                {\n                                    \"h3.tsd-anchor-link#a\": [\n                                        {\n                                            \"span\": \"a\"\n                                        },\n                                        {\n                                            \"tag\": \"a.tsd-anchor-icon\",\n                                            \"props\": {\n                                                \"href\": \"#a\",\n                                                \"aria-label\": \"Permalink\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"div.tsd-signature\": [\n                                        {\n                                            \"span.tsd-kind-property\": \"a\"\n                                        },\n                                        {\n                                            \"span.tsd-signature-symbol\": \":\"\n                                        },\n                                        \" \",\n                                        {\n                                            \"span.tsd-signature-type\": \"1\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"aside.tsd-sources\": {\n                                        \"ul\": {\n                                            \"li\": [\n                                                \"Defined in \",\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"index.ts\"\n                                                    },\n                                                    \"children\": \"index.ts:133\"\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"section.tsd-panel.tsd-member\": [\n                                {\n                                    \"h3.tsd-anchor-link#b\": [\n                                        {\n                                            \"span\": \"b\"\n                                        },\n                                        {\n                                            \"tag\": \"a.tsd-anchor-icon\",\n                                            \"props\": {\n                                                \"href\": \"#b\",\n                                                \"aria-label\": \"Permalink\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"ul.tsd-signatures\": {\n                                        \"li.\": [\n                                            {\n                                                \"div.tsd-signature.tsd-anchor-link#b-1\": [\n                                                    {\n                                                        \"span.tsd-kind-call-signature\": \"b\"\n                                                    },\n                                                    {\n                                                        \"span.tsd-signature-symbol\": \"()\"\n                                                    },\n                                                    {\n                                                        \"span.tsd-signature-symbol\": \":\"\n                                                    },\n                                                    \" \",\n                                                    {\n                                                        \"span.tsd-signature-type\": \"void\"\n                                                    },\n                                                    {\n                                                        \"tag\": \"a.tsd-anchor-icon\",\n                                                        \"props\": {\n                                                            \"href\": \"#b-1\",\n                                                            \"aria-label\": \"Permalink\"\n                                                        }\n                                                    }\n                                                ]\n                                            },\n                                            {\n                                                \"div.tsd-description\": [\n                                                    {\n                                                        \"div.tsd-comment.tsd-typography\": {\n                                                            \"p\": {\n                                                                \"tag\": \"a\",\n                                                                \"props\": {\n                                                                    \"href\": \"../\"\n                                                                },\n                                                                \"children\": \"link to readme #3006\"\n                                                            }\n                                                        }\n                                                    },\n                                                    {\n                                                        \"h4.tsd-returns-title\": [\n                                                            \"Returns \",\n                                                            {\n                                                                \"span.tsd-signature-type\": \"void\"\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"aside.tsd-sources\": {\n                                                            \"ul\": {\n                                                                \"li\": [\n                                                                    \"Defined in \",\n                                                                    {\n                                                                        \"tag\": \"a\",\n                                                                        \"props\": {\n                                                                            \"href\": \"index.ts\"\n                                                                        },\n                                                                        \"children\": \"index.ts:135\"\n                                                                    }\n                                                                ]\n                                                            }\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"#a\"\n                                    },\n                                    \"children\": {\n                                        \"span\": \"a\"\n                                    }\n                                },\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"#b\"\n                                    },\n                                    \"children\": {\n                                        \"span\": \"b\"\n                                    }\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/ExpandType.ExpandedByDefault.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"ExpandedByDefault\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Interface ExpandedByDefault\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"ExpandedByDefault\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:7\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#b\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"b\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#b\": [\n                                            {\n                                                \"span\": \"b\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#b\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"b\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-comment.tsd-typography\": {\n                                            \"p\": \"B\"\n                                        }\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"expandType.ts\"\n                                                        },\n                                                        \"children\": \"expandType.ts:9\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a\",\n                                            \"props\": {\n                                                \"href\": \"#b\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"b\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/GH2982.TMXDataNode.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH2982.json\"\n                                        },\n                                        \"children\": \"GH2982\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"TMXDataNode\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Interface TMXDataNode\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"TMXDataNode\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#base\"\n                            },\n                            \"children\": \"base\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-property\": \"extra\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"any\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"section.tsd-panel.tsd-hierarchy\",\n                    \"props\": {\n                        \"data-refl\": \"123\"\n                    },\n                    \"children\": [\n                        {\n                            \"h4\": [\n                                \"Hierarchy (\",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"../hierarchy.html#GH2982.TMXDataNode\"\n                                    },\n                                    \"children\": \"View Summary\"\n                                },\n                                \")\"\n                            ]\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li.tsd-hierarchy-item\": [\n                                    {\n                                        \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                        \"props\": {\n                                            \"href\": \"../types/GH2982.TMXNode.json\"\n                                        },\n                                        \"children\": \"TMXNode\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \"<\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \"{\"\n                                    },\n                                    \" \",\n                                    {\n                                        \"span.tsd-kind-property\": \"extra\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \":\"\n                                    },\n                                    \" \",\n                                    {\n                                        \"span.tsd-signature-type\": \"any\"\n                                    },\n                                    \" \",\n                                    {\n                                        \"span.tsd-signature-symbol\": \"}\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \">\"\n                                    },\n                                    {\n                                        \"ul.tsd-hierarchy\": {\n                                            \"li.tsd-hierarchy-item\": {\n                                                \"span.tsd-hierarchy-target\": \"TMXDataNode\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh2982.ts\"\n                                    },\n                                    \"children\": \"gh2982.ts:5\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link.tsd-is-inherited\",\n                                                        \"props\": {\n                                                            \"href\": \"#base\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"base\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member.tsd-is-inherited\": [\n                                    {\n                                        \"h3.tsd-anchor-link#base\": [\n                                            {\n                                                \"span\": \"base\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#base\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"base\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"{\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-kind-property\": \"extra\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"any\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"}\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": [\n                                            {\n                                                \"p\": \"Inherited from TMXNode.base\"\n                                            },\n                                            {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"gh2982.ts\"\n                                                            },\n                                                            \"children\": \"gh2982.ts:2\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a.tsd-is-inherited\",\n                                            \"props\": {\n                                                \"href\": \"#base\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"base\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/GH3007.DOMIterable.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH3007.json\"\n                                        },\n                                        \"children\": \"GH3007\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"DOMIterable\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Interface DOMIterable\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"DOMIterable\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#iterator\"\n                            },\n                            \"children\": \"\\\"[iterator]\\\"\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"?:\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"()\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=>\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"Iterator\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"<\"\n                        },\n                        {\n                            \"span.tsd-signature-type\": \"Node\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \">\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"section.tsd-panel.tsd-hierarchy\",\n                    \"props\": {\n                        \"data-refl\": \"142\"\n                    },\n                    \"children\": [\n                        {\n                            \"h4\": \"Hierarchy\"\n                        },\n                        {\n                            \"ul.tsd-hierarchy\": {\n                                \"li.tsd-hierarchy-item\": [\n                                    {\n                                        \"span.tsd-signature-type\": \"Partial\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \"<\"\n                                    },\n                                    {\n                                        \"tag\": \"a.tsd-signature-type.tsd-kind-class\",\n                                        \"props\": {\n                                            \"href\": \"../classes/GH3007.DOMBase.json\"\n                                        },\n                                        \"children\": \"DOMBase\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \"<\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-type\": \"Node\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \">\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \">\"\n                                    },\n                                    {\n                                        \"ul.tsd-hierarchy\": {\n                                            \"li.tsd-hierarchy-item\": {\n                                                \"span.tsd-hierarchy-target\": \"DOMIterable\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh3007.ts\"\n                                    },\n                                    \"children\": \"gh3007.ts:9\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link.tsd-is-inherited\",\n                                                        \"props\": {\n                                                            \"href\": \"#iterator\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"[iterator]?\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member.tsd-is-inherited\": [\n                                    {\n                                        \"h3.tsd-anchor-link#iterator\": [\n                                            {\n                                                \"code.tsd-tag\": \"Optional\"\n                                            },\n                                            {\n                                                \"span\": \"[iterator]\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#iterator\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"\\\"[iterator]\\\"\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"?:\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"()\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"=>\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"Iterator\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"<\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-type\": \"Node\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \">\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": [\n                                            {\n                                                \"p\": \"Inherited from Partial.[iterator]\"\n                                            },\n                                            {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"gh3007.ts\"\n                                                            },\n                                                            \"children\": \"gh3007.ts:6\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a.tsd-is-inherited\",\n                                            \"props\": {\n                                                \"href\": \"#iterator\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"[iterator]\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/NoneCategory.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"NoneCategory\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Interface NoneCategory\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"NoneCategory\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"1\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"2\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#c\"\n                            },\n                            \"children\": \"c\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"3\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:117\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#c\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"c\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Properties\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#a\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"a\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Properties - Other\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#b\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"b\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-member-group\": {\n                        \"section.tsd-panel.tsd-member\": [\n                            {\n                                \"h3.tsd-anchor-link#c\": [\n                                    {\n                                        \"span\": \"c\"\n                                    },\n                                    {\n                                        \"tag\": \"a.tsd-anchor-icon\",\n                                        \"props\": {\n                                            \"href\": \"#c\",\n                                            \"aria-label\": \"Permalink\"\n                                        }\n                                    }\n                                ]\n                            },\n                            {\n                                \"div.tsd-signature\": [\n                                    {\n                                        \"span.tsd-kind-property\": \"c\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \":\"\n                                    },\n                                    \" \",\n                                    {\n                                        \"span.tsd-signature-type\": \"3\"\n                                    }\n                                ]\n                            },\n                            {\n                                \"aside.tsd-sources\": {\n                                    \"ul\": {\n                                        \"li\": [\n                                            \"Defined in \",\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"index.ts\"\n                                                },\n                                                \"children\": \"index.ts:122\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#a\": [\n                                            {\n                                                \"span\": \"a\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#a\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"a\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"1\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"index.ts\"\n                                                        },\n                                                        \"children\": \"index.ts:119\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties - Other\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties - Other\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#b\": [\n                                            {\n                                                \"span\": \"b\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#b\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"b\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"2\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"index.ts\"\n                                                        },\n                                                        \"children\": \"index.ts:120\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"#c\"\n                                    },\n                                    \"children\": {\n                                        \"span\": \"c\"\n                                    }\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Properties\"\n                                            },\n                                            \"children\": \"Properties\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#a\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"a\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Properties - Other\"\n                                            },\n                                            \"children\": \"Properties - Other\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#b\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"b\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/NoneGroup.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"NoneGroup\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Interface NoneGroup\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"NoneGroup\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"1\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"2\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:125\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": [\n                                        {\n                                            \"section.tsd-index-section\": {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#a\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"a\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        },\n                                        {\n                                            \"section.tsd-index-section\": [\n                                                {\n                                                    \"h3.tsd-index-heading\": \"Properties\"\n                                                },\n                                                {\n                                                    \"div.tsd-index-list\": [\n                                                        {\n                                                            \"tag\": \"a.tsd-index-link\",\n                                                            \"props\": {\n                                                                \"href\": \"#b\"\n                                                            },\n                                                            \"children\": {\n                                                                \"span\": \"b\"\n                                                            }\n                                                        },\n                                                        \"\\n\"\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-member-group\": {\n                        \"section.tsd-panel.tsd-member\": [\n                            {\n                                \"h3.tsd-anchor-link#a\": [\n                                    {\n                                        \"span\": \"a\"\n                                    },\n                                    {\n                                        \"tag\": \"a.tsd-anchor-icon\",\n                                        \"props\": {\n                                            \"href\": \"#a\",\n                                            \"aria-label\": \"Permalink\"\n                                        }\n                                    }\n                                ]\n                            },\n                            {\n                                \"div.tsd-signature\": [\n                                    {\n                                        \"span.tsd-kind-property\": \"a\"\n                                    },\n                                    {\n                                        \"span.tsd-signature-symbol\": \":\"\n                                    },\n                                    \" \",\n                                    {\n                                        \"span.tsd-signature-type\": \"1\"\n                                    }\n                                ]\n                            },\n                            {\n                                \"aside.tsd-sources\": {\n                                    \"ul\": {\n                                        \"li\": [\n                                            \"Defined in \",\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"index.ts\"\n                                                },\n                                                \"children\": \"index.ts:127\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#b\": [\n                                            {\n                                                \"span\": \"b\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#b\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"b\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"2\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"index.ts\"\n                                                        },\n                                                        \"children\": \"index.ts:128\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"#a\"\n                                    },\n                                    \"children\": {\n                                        \"span\": \"a\"\n                                    }\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Properties\"\n                                            },\n                                            \"children\": \"Properties\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#b\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"b\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/interfaces/gh2995.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"gh2995\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Interface gh2995\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"interface\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-interface\": \"gh2995\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-call-signature\",\n                            \"props\": {\n                                \"href\": \"#optionalmethod-1\"\n                            },\n                            \"children\": \"optionalMethod\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"?\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"(\"\n                        },\n                        {\n                            \"span.tsd-kind-parameter\": \"filter\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \",\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-parameter\": \"args\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"[]\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \")\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"any\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh2995.ts\"\n                                    },\n                                    \"children\": \"gh2995.ts:1\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Methods\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#optionalmethod\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": [\n                                                                \"optional\",\n                                                                {\n                                                                    \"wbr\": []\n                                                                },\n                                                                \"Method?\"\n                                                            ]\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Methods\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Methods\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#optionalmethod\": [\n                                            {\n                                                \"code.tsd-tag\": \"Optional\"\n                                            },\n                                            {\n                                                \"span\": [\n                                                    \"optional\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"Method\"\n                                                ]\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#optionalmethod\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"ul.tsd-signatures\": {\n                                            \"li.\": [\n                                                {\n                                                    \"div.tsd-signature.tsd-anchor-link#optionalmethod-1\": [\n                                                        {\n                                                            \"span.tsd-kind-call-signature\": \"optionalMethod\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"?\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"(\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-kind-parameter\": \"filter\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"string\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \",\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-kind-parameter\": \"args\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"string\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \"[]\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \")\"\n                                                        },\n                                                        {\n                                                            \"span.tsd-signature-symbol\": \":\"\n                                                        },\n                                                        \" \",\n                                                        {\n                                                            \"span.tsd-signature-type\": \"any\"\n                                                        },\n                                                        {\n                                                            \"tag\": \"a.tsd-anchor-icon\",\n                                                            \"props\": {\n                                                                \"href\": \"#optionalmethod-1\",\n                                                                \"aria-label\": \"Permalink\"\n                                                            }\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"div.tsd-description\": [\n                                                        {\n                                                            \"div.tsd-parameters\": [\n                                                                {\n                                                                    \"h4.tsd-parameters-title\": \"Parameters\"\n                                                                },\n                                                                {\n                                                                    \"ul.tsd-parameter-list\": [\n                                                                        {\n                                                                            \"li\": {\n                                                                                \"span\": [\n                                                                                    {\n                                                                                        \"span.tsd-kind-parameter\": \"filter\"\n                                                                                    },\n                                                                                    \": \",\n                                                                                    {\n                                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                                    }\n                                                                                ]\n                                                                            }\n                                                                        },\n                                                                        {\n                                                                            \"li\": {\n                                                                                \"span\": [\n                                                                                    {\n                                                                                        \"span.tsd-kind-parameter\": \"args\"\n                                                                                    },\n                                                                                    \": \",\n                                                                                    {\n                                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                                    },\n                                                                                    {\n                                                                                        \"span.tsd-signature-symbol\": \"[]\"\n                                                                                    }\n                                                                                ]\n                                                                            }\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"h4.tsd-returns-title\": [\n                                                                \"Returns \",\n                                                                {\n                                                                    \"span.tsd-signature-type\": \"any\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"aside.tsd-sources\": {\n                                                                \"ul\": {\n                                                                    \"li\": [\n                                                                        \"Defined in \",\n                                                                        {\n                                                                            \"tag\": \"a\",\n                                                                            \"props\": {\n                                                                                \"href\": \"gh2995.ts\"\n                                                                            },\n                                                                            \"children\": \"gh2995.ts:2\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            }\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Methods\"\n                                        },\n                                        \"children\": \"Methods\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a\",\n                                            \"props\": {\n                                                \"href\": \"#optionalmethod\"\n                                            },\n                                            \"children\": {\n                                                \"span\": [\n                                                    \"optional\",\n                                                    {\n                                                        \"wbr\": []\n                                                    },\n                                                    \"Method\"\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/modules/ExpandType.NestedBehavior1.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"NestedBehavior1\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Namespace NestedBehavior1\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Type Aliases\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Type Aliases\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#aexpanded\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/ExpandType.NestedBehavior1.AExpanded.json\"\n                                                },\n                                                \"children\": \"AExpanded\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#aexpanded\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#allexpanded\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/ExpandType.NestedBehavior1.AllExpanded.json\"\n                                                },\n                                                \"children\": \"AllExpanded\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#allexpanded\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Type Aliases\"\n                                        },\n                                        \"children\": \"Type Aliases\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#aexpanded\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"A\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Expanded\"\n                                                    ]\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#allexpanded\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"All\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Expanded\"\n                                                    ]\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/modules/ExpandType.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"ExpandType\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Namespace ExpandType\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Namespaces\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Namespaces\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#nestedbehavior1\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"ExpandType.NestedBehavior1.json\"\n                                                },\n                                                \"children\": \"NestedBehavior1\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#nestedbehavior1\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Interfaces\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Interfaces\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#expandedbydefault\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                                                },\n                                                \"children\": \"ExpandedByDefault\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#expandedbydefault\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Type Aliases\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Type Aliases\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#aexpanded\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/ExpandType.AExpanded.json\"\n                                                },\n                                                \"children\": \"AExpanded\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#aexpanded\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#bexpanded\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/ExpandType.BExpanded.json\"\n                                                },\n                                                \"children\": \"BExpanded\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#bexpanded\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#expandable\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/ExpandType.Expandable.json\"\n                                                },\n                                                \"children\": \"Expandable\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#expandable\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#expandable2\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/ExpandType.Expandable2.json\"\n                                                },\n                                                \"children\": \"Expandable2\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#expandable2\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Namespaces\"\n                                            },\n                                            \"children\": \"Namespaces\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#nestedbehavior1\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"Nested\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Behavior1\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Interfaces\"\n                                            },\n                                            \"children\": \"Interfaces\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#expandedbydefault\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"Expanded\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"By\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Default\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Type Aliases\"\n                                            },\n                                            \"children\": \"Type Aliases\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#aexpanded\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"A\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Expanded\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#bexpanded\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"B\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Expanded\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#expandable\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"Expandable\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#expandable2\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"Expandable2\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/modules/GH2982.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"GH2982\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Namespace GH2982\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Interfaces\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Interfaces\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#tmxdatanode\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../interfaces/GH2982.TMXDataNode.json\"\n                                                },\n                                                \"children\": \"TMXDataNode\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#tmxdatanode\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Type Aliases\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Type Aliases\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#tmxnode\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../types/GH2982.TMXNode.json\"\n                                                },\n                                                \"children\": \"TMXNode\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#tmxnode\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Interfaces\"\n                                            },\n                                            \"children\": \"Interfaces\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#tmxdatanode\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"TMX\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Data\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Node\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Type Aliases\"\n                                            },\n                                            \"children\": \"Type Aliases\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#tmxnode\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"TMX\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Node\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/modules/GH3007.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"GH3007\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Namespace GH3007\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Classes\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Classes\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#dombase\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../classes/GH3007.DOMBase.json\"\n                                                },\n                                                \"children\": \"DOMBase\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#dombase\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#domclass\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../classes/GH3007.DOMClass.json\"\n                                                },\n                                                \"children\": \"DOMClass\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#domclass\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Interfaces\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Interfaces\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#domiterable\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../interfaces/GH3007.DOMIterable.json\"\n                                                },\n                                                \"children\": \"DOMIterable\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#domiterable\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Classes\"\n                                            },\n                                            \"children\": \"Classes\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#dombase\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"DOM\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Base\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#domclass\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"DOM\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Class\"\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Interfaces\"\n                                            },\n                                            \"children\": \"Interfaces\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#domiterable\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"DOM\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Iterable\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/modules/GH3052.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"GH3052\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Namespace GH3052\"\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Classes\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Classes\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#custompromise\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../classes/GH3052.CustomPromise.json\"\n                                                },\n                                                \"children\": \"CustomPromise\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#custompromise\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#promisereference\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"../classes/GH3052.PromiseReference.json\"\n                                                },\n                                                \"children\": \"PromiseReference\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#promisereference\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Classes\"\n                                        },\n                                        \"children\": \"Classes\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#custompromise\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"Custom\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Promise\"\n                                                    ]\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#promisereference\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"Promise\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Reference\"\n                                                    ]\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/modules.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            }\n                        },\n                        {\n                            \"h1\": \"typedoc\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel.tsd-comment\": {\n                        \"div.tsd-comment.tsd-typography\": {\n                            \"p\": \"Module comment\"\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Documents\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Documents\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#doc\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"documents/doc.json\"\n                                                },\n                                                \"children\": \"doc\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#doc\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Namespaces\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Namespaces\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#expandtype\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"modules/ExpandType.json\"\n                                                },\n                                                \"children\": \"ExpandType\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#expandtype\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#gh2982\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"modules/GH2982.json\"\n                                                },\n                                                \"children\": \"GH2982\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#gh2982\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#gh3007\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"modules/GH3007.json\"\n                                                },\n                                                \"children\": \"GH3007\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#gh3007\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#gh3052\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"modules/GH3052.json\"\n                                                },\n                                                \"children\": \"GH3052\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#gh3052\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Enumerations\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Enumerations\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#enumeration\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"enums/Enumeration.json\"\n                                                },\n                                                \"children\": \"Enumeration\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#enumeration\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Classes\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Classes\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#baseclass\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"classes/BaseClass.json\"\n                                                },\n                                                \"children\": \"BaseClass\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#baseclass\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#genericclass\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"classes/GenericClass.json\"\n                                                },\n                                                \"children\": \"GenericClass\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#genericclass\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#gh3014\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"classes/GH3014.json\"\n                                                },\n                                                \"children\": \"GH3014\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#gh3014\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#modifiersclass\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"classes/ModifiersClass.json\"\n                                                },\n                                                \"children\": \"ModifiersClass\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#modifiersclass\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#renderclass\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"classes/RenderClass.json\"\n                                                },\n                                                \"children\": \"RenderClass\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#renderclass\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Interfaces\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Interfaces\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#baseinterface\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"interfaces/BaseInterface.json\"\n                                                },\n                                                \"children\": \"BaseInterface\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#baseinterface\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#disabledgroups\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"interfaces/DisabledGroups.json\"\n                                                },\n                                                \"children\": \"DisabledGroups\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#disabledgroups\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#gh2995\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"interfaces/gh2995.json\"\n                                                },\n                                                \"children\": \"gh2995\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#gh2995\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#nonecategory\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"interfaces/NoneCategory.json\"\n                                                },\n                                                \"children\": \"NoneCategory\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#nonecategory\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#nonegroup\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"interfaces/NoneGroup.json\"\n                                                },\n                                                \"children\": \"NoneGroup\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#nonegroup\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Type Aliases\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Type Aliases\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#nested\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"types/Nested.json\"\n                                                },\n                                                \"children\": \"Nested\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#nested\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                },\n                                {\n                                    \"dt.tsd-member-summary#unioncomments\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"types/UnionComments.json\"\n                                                },\n                                                \"children\": \"UnionComments\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#unioncomments\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Functions\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Functions\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#box\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"functions/box.json\"\n                                                },\n                                                \"children\": \"box\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#box\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-References\"\n                            },\n                            \"children\": {\n                                \"h2\": \"References\"\n                            }\n                        },\n                        {\n                            \"dl.tsd-member-summaries\": [\n                                {\n                                    \"dt.tsd-member-summary#boxalias\": {\n                                        \"span.tsd-member-summary-name\": [\n                                            {\n                                                \"span\": \"boxAlias\"\n                                            },\n                                            {\n                                                \"span\": \" → \"\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"functions/box.json\"\n                                                },\n                                                \"children\": \"box\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#boxalias\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                },\n                                {\n                                    \"dd.tsd-member-summary\": []\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": [\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Documents\"\n                                            },\n                                            \"children\": \"Documents\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#doc\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"doc\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Namespaces\"\n                                            },\n                                            \"children\": \"Namespaces\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#expandtype\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Expand\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Type\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#gh2982\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"GH2982\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#gh3007\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"GH3007\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#gh3052\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"GH3052\"\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Enumerations\"\n                                            },\n                                            \"children\": \"Enumerations\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#enumeration\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"Enumeration\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Classes\"\n                                            },\n                                            \"children\": \"Classes\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#baseclass\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Base\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Class\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#genericclass\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Generic\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Class\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#gh3014\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"GH3014\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#modifiersclass\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Modifiers\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Class\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#renderclass\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Render\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Class\"\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Interfaces\"\n                                            },\n                                            \"children\": \"Interfaces\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#baseinterface\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Base\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Interface\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#disabledgroups\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Disabled\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Groups\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#gh2995\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"gh2995\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#nonecategory\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"None\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Category\"\n                                                        ]\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#nonegroup\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"None\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Group\"\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Type Aliases\"\n                                            },\n                                            \"children\": \"Type Aliases\"\n                                        },\n                                        {\n                                            \"div\": [\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#nested\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": \"Nested\"\n                                                    }\n                                                },\n                                                {\n                                                    \"tag\": \"a\",\n                                                    \"props\": {\n                                                        \"href\": \"#unioncomments\"\n                                                    },\n                                                    \"children\": {\n                                                        \"span\": [\n                                                            \"Union\",\n                                                            {\n                                                                \"wbr\": []\n                                                            },\n                                                            \"Comments\"\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-Functions\"\n                                            },\n                                            \"children\": \"Functions\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#box\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"box\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                    \"props\": {\n                                        \"open\": true\n                                    },\n                                    \"children\": [\n                                        {\n                                            \"tag\": \"summary.tsd-accordion-summary\",\n                                            \"props\": {\n                                                \"data-key\": \"section-References\"\n                                            },\n                                            \"children\": \"References\"\n                                        },\n                                        {\n                                            \"div\": {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#boxalias\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": [\n                                                        \"box\",\n                                                        {\n                                                            \"wbr\": []\n                                                        },\n                                                        \"Alias\"\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/ExpandType.AExpanded.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"AExpanded\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias AExpanded\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"AExpanded\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable.json\"\n                            },\n                            \"children\": \"Expandable\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                            \"props\": {\n                                \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                            },\n                            \"children\": \"ExpandedByDefault\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#c\"\n                            },\n                            \"children\": \"c\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable2.json\"\n                            },\n                            \"children\": \"Expandable2\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:21\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#a\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"a\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#b\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"b\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#c\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"c\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#a\": [\n                                                {\n                                                    \"span\": \"a\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#a\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"a\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable.json\"\n                                                    },\n                                                    \"children\": \"Expandable\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-type-declaration\": [\n                                                {\n                                                    \"h4\": \"Type Declaration\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameters\": {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5#a\": [\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"a\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \": \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"A\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:21\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#b\": [\n                                                {\n                                                    \"span\": \"b\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#b\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"b\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                                                    \"props\": {\n                                                        \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                                                    },\n                                                    \"children\": \"ExpandedByDefault\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:21\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#c\": [\n                                                {\n                                                    \"span\": \"c\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#c\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"c\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable2.json\"\n                                                    },\n                                                    \"children\": \"Expandable2\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:21\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#a\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"a\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#b\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"b\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#c\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"c\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/ExpandType.BExpanded.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"BExpanded\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias BExpanded\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"BExpanded\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable.json\"\n                            },\n                            \"children\": \"Expandable\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                            \"props\": {\n                                \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                            },\n                            \"children\": \"ExpandedByDefault\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#c\"\n                            },\n                            \"children\": \"c\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable2.json\"\n                            },\n                            \"children\": \"Expandable2\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:24\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#a\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"a\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#b\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"b\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#c\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"c\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#a\": [\n                                                {\n                                                    \"span\": \"a\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#a\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"a\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable.json\"\n                                                    },\n                                                    \"children\": \"Expandable\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:24\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#b\": [\n                                                {\n                                                    \"span\": \"b\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#b\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"b\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                                                    \"props\": {\n                                                        \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                                                    },\n                                                    \"children\": \"ExpandedByDefault\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-type-declaration\": [\n                                                {\n                                                    \"h4\": \"Type Declaration\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameters\": {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5#b\": [\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"b\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \": \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"B\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:24\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#c\": [\n                                                {\n                                                    \"span\": \"c\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#c\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"c\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable2.json\"\n                                                    },\n                                                    \"children\": \"Expandable2\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:24\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#a\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"a\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#b\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"b\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#c\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"c\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/ExpandType.Expandable.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"Expandable\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias Expandable\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"Expandable\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:1\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#a\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"a\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#a\": [\n                                            {\n                                                \"span\": \"a\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#a\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"a\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-comment.tsd-typography\": {\n                                            \"p\": \"A\"\n                                        }\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"expandType.ts\"\n                                                        },\n                                                        \"children\": \"expandType.ts:3\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a\",\n                                            \"props\": {\n                                                \"href\": \"#a\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"a\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/ExpandType.Expandable2.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"Expandable2\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias Expandable2\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"Expandable2\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#c\"\n                            },\n                            \"children\": \"c\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:12\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#c\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"c\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#c\": [\n                                            {\n                                                \"span\": \"c\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#c\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"c\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-comment.tsd-typography\": {\n                                            \"p\": \"C\"\n                                        }\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"expandType.ts\"\n                                                        },\n                                                        \"children\": \"expandType.ts:14\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a\",\n                                            \"props\": {\n                                                \"href\": \"#c\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"c\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/ExpandType.NestedBehavior1.AExpanded.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.NestedBehavior1.json\"\n                                        },\n                                        \"children\": \"NestedBehavior1\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"AExpanded\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias AExpanded\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"AExpanded\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable.json\"\n                            },\n                            \"children\": \"Expandable\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                            \"props\": {\n                                \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                            },\n                            \"children\": \"ExpandedByDefault\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#c\"\n                            },\n                            \"children\": \"c\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable2.json\"\n                            },\n                            \"children\": \"Expandable2\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:36\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#a\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"a\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#b\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"b\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#c\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"c\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#a\": [\n                                                {\n                                                    \"span\": \"a\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#a\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"a\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable.json\"\n                                                    },\n                                                    \"children\": \"Expandable\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:36\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#b\": [\n                                                {\n                                                    \"span\": \"b\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#b\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"b\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                                                    \"props\": {\n                                                        \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                                                    },\n                                                    \"children\": \"ExpandedByDefault\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-type-declaration\": [\n                                                {\n                                                    \"h4\": \"Type Declaration\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameters\": {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5#b\": [\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"b\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \": \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"B\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:36\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#c\": [\n                                                {\n                                                    \"span\": \"c\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#c\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"c\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable2.json\"\n                                                    },\n                                                    \"children\": \"Expandable2\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:36\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#a\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"a\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#b\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"b\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#c\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"c\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/ExpandType.NestedBehavior1.AllExpanded.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.json\"\n                                        },\n                                        \"children\": \"ExpandType\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/ExpandType.NestedBehavior1.json\"\n                                        },\n                                        \"children\": \"NestedBehavior1\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"AllExpanded\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias AllExpanded\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"AllExpanded\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#a\"\n                            },\n                            \"children\": \"a\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable.json\"\n                            },\n                            \"children\": \"Expandable\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#b\"\n                            },\n                            \"children\": \"b\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                            \"props\": {\n                                \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                            },\n                            \"children\": \"ExpandedByDefault\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#c\"\n                            },\n                            \"children\": \"c\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                            \"props\": {\n                                \"href\": \"ExpandType.Expandable2.json\"\n                            },\n                            \"children\": \"Expandable2\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"expandType.ts\"\n                                    },\n                                    \"children\": \"expandType.ts:31\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#a\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"a\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#b\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"b\"\n                                                        }\n                                                    },\n                                                    \"\\n\",\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#c\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"c\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": [\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#a\": [\n                                                {\n                                                    \"span\": \"a\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#a\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"a\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable.json\"\n                                                    },\n                                                    \"children\": \"Expandable\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-type-declaration\": [\n                                                {\n                                                    \"h4\": \"Type Declaration\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameters\": {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5#a\": [\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"a\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \": \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"A\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:31\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#b\": [\n                                                {\n                                                    \"span\": \"b\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#b\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"b\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-interface\",\n                                                    \"props\": {\n                                                        \"href\": \"../interfaces/ExpandType.ExpandedByDefault.json\"\n                                                    },\n                                                    \"children\": \"ExpandedByDefault\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-type-declaration\": [\n                                                {\n                                                    \"h4\": \"Type Declaration\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameters\": {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5#b\": [\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"b\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \": \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"B\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:31\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"section.tsd-panel.tsd-member\": [\n                                        {\n                                            \"h3.tsd-anchor-link#c\": [\n                                                {\n                                                    \"span\": \"c\"\n                                                },\n                                                {\n                                                    \"tag\": \"a.tsd-anchor-icon\",\n                                                    \"props\": {\n                                                        \"href\": \"#c\",\n                                                        \"aria-label\": \"Permalink\"\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-signature\": [\n                                                {\n                                                    \"span.tsd-kind-property\": \"c\"\n                                                },\n                                                {\n                                                    \"span.tsd-signature-symbol\": \":\"\n                                                },\n                                                \" \",\n                                                {\n                                                    \"tag\": \"a.tsd-signature-type.tsd-kind-type-alias\",\n                                                    \"props\": {\n                                                        \"href\": \"ExpandType.Expandable2.json\"\n                                                    },\n                                                    \"children\": \"Expandable2\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"div.tsd-type-declaration\": [\n                                                {\n                                                    \"h4\": \"Type Declaration\"\n                                                },\n                                                {\n                                                    \"ul.tsd-parameters\": {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5#c\": [\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"c\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \": \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"C\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"aside.tsd-sources\": {\n                                                \"ul\": {\n                                                    \"li\": [\n                                                        \"Defined in \",\n                                                        {\n                                                            \"tag\": \"a\",\n                                                            \"props\": {\n                                                                \"href\": \"expandType.ts\"\n                                                            },\n                                                            \"children\": \"expandType.ts:31\"\n                                                        }\n                                                    ]\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": [\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#a\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"a\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#b\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"b\"\n                                                }\n                                            },\n                                            {\n                                                \"tag\": \"a\",\n                                                \"props\": {\n                                                    \"href\": \"#c\"\n                                                },\n                                                \"children\": {\n                                                    \"span\": \"c\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/GH2982.TMXNode.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": [\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"../modules/GH2982.json\"\n                                        },\n                                        \"children\": \"GH2982\"\n                                    }\n                                },\n                                {\n                                    \"li\": {\n                                        \"tag\": \"a\",\n                                        \"props\": {\n                                            \"href\": \"\",\n                                            \"aria-current\": \"page\"\n                                        },\n                                        \"children\": \"TMXNode\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"h1\": \"Type Alias TMXNode<T>\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-kind-type-alias\": \"TMXNode\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{}\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"&\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-property\": \"base\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"tag\": \"a.tsd-signature-type.tsd-kind-type-parameter\",\n                            \"props\": {\n                                \"href\": \"#t\"\n                            },\n                            \"children\": \"T\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel\": [\n                        {\n                            \"h4\": \"Type Parameters\"\n                        },\n                        {\n                            \"ul.tsd-type-parameter-list\": {\n                                \"li\": {\n                                    \"span#t\": {\n                                        \"span.tsd-kind-type-parameter\": \"T\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"gh2982.ts\"\n                                    },\n                                    \"children\": \"gh2982.ts:1\"\n                                }\n                            ]\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": []\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/Nested.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"Nested\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Type Alias Nested\"\n                        }\n                    ]\n                },\n                {\n                    \"section.tsd-panel.tsd-comment\": {\n                        \"div.tsd-comment.tsd-typography\": {\n                            \"p\": \"Type alias with nested properties\"\n                        }\n                    }\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-signature-keyword\": \"type\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-type-alias\": \"Nested\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"=\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"tag\": \"a.tsd-kind-property\",\n                            \"props\": {\n                                \"href\": \"#options\"\n                            },\n                            \"children\": \"options\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"        \",\n                        {\n                            \"span.tsd-kind-property\": \"anotherValue\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"?:\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"        \",\n                        {\n                            \"span.tsd-kind-property\": \"emptyObject\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{}\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"        \",\n                        {\n                            \"span.tsd-kind-property\": \"moreOptions\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"?:\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"{\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-kind-property\": \"moreValues\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"number\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"        \",\n                        {\n                            \"span.tsd-kind-property\": \"value\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"?:\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"string\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        \"    \",\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \";\"\n                        },\n                        {\n                            \"br\": []\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \"}\"\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:88\"\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"section.tsd-panel-group.tsd-index-group\": {\n                        \"section.tsd-panel.tsd-index-panel\": {\n                            \"tag\": \"details.tsd-index-content.tsd-accordion\",\n                            \"props\": {\n                                \"open\": true\n                            },\n                            \"children\": [\n                                {\n                                    \"summary.tsd-accordion-summary.tsd-index-summary\": {\n                                        \"h5.tsd-index-heading.uppercase\": \"Index\"\n                                    }\n                                },\n                                {\n                                    \"div.tsd-accordion-details\": {\n                                        \"section.tsd-index-section\": [\n                                            {\n                                                \"h3.tsd-index-heading\": \"Properties\"\n                                            },\n                                            {\n                                                \"div.tsd-index-list\": [\n                                                    {\n                                                        \"tag\": \"a.tsd-index-link\",\n                                                        \"props\": {\n                                                            \"href\": \"#options\"\n                                                        },\n                                                        \"children\": {\n                                                            \"span\": \"options\"\n                                                        }\n                                                    },\n                                                    \"\\n\"\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"tag\": \"details.tsd-panel-group.tsd-member-group.tsd-accordion\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"tag\": \"summary.tsd-accordion-summary\",\n                            \"props\": {\n                                \"data-key\": \"section-Properties\"\n                            },\n                            \"children\": {\n                                \"h2\": \"Properties\"\n                            }\n                        },\n                        {\n                            \"section\": {\n                                \"section.tsd-panel.tsd-member\": [\n                                    {\n                                        \"h3.tsd-anchor-link#options\": [\n                                            {\n                                                \"span\": \"options\"\n                                            },\n                                            {\n                                                \"tag\": \"a.tsd-anchor-icon\",\n                                                \"props\": {\n                                                    \"href\": \"#options\",\n                                                    \"aria-label\": \"Permalink\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-signature\": [\n                                            {\n                                                \"span.tsd-kind-property\": \"options\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"{\"\n                                            },\n                                            {\n                                                \"br\": []\n                                            },\n                                            \"    \",\n                                            {\n                                                \"span.tsd-kind-property\": \"anotherValue\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"?:\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \";\"\n                                            },\n                                            {\n                                                \"br\": []\n                                            },\n                                            \"    \",\n                                            {\n                                                \"span.tsd-kind-property\": \"emptyObject\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"{}\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \";\"\n                                            },\n                                            {\n                                                \"br\": []\n                                            },\n                                            \"    \",\n                                            {\n                                                \"span.tsd-kind-property\": \"moreOptions\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"?:\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"{\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-kind-property\": \"moreValues\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \":\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"number\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-symbol\": \"}\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \";\"\n                                            },\n                                            {\n                                                \"br\": []\n                                            },\n                                            \"    \",\n                                            {\n                                                \"span.tsd-kind-property\": \"value\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"?:\"\n                                            },\n                                            \" \",\n                                            {\n                                                \"span.tsd-signature-type\": \"string\"\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \";\"\n                                            },\n                                            {\n                                                \"br\": []\n                                            },\n                                            {\n                                                \"span.tsd-signature-symbol\": \"}\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"div.tsd-type-declaration\": [\n                                            {\n                                                \"h4\": \"Type Declaration\"\n                                            },\n                                            {\n                                                \"ul.tsd-parameters\": [\n                                                    {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5\": [\n                                                                    {\n                                                                        \"code.tsd-tag\": \"Optional\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"anotherValue\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \"?: \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Another value\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"li.tsd-parameter\": {\n                                                            \"h5\": [\n                                                                {\n                                                                    \"span.tsd-kind-property\": \"emptyObject\"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \": \"\n                                                                },\n                                                                {\n                                                                    \"span.tsd-signature-symbol\": \"{}\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    },\n                                                    {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5\": [\n                                                                    {\n                                                                        \"code.tsd-tag\": \"Optional\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"moreOptions\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \"?: \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \"{\"\n                                                                    },\n                                                                    \" \",\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"moreValues\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \":\"\n                                                                    },\n                                                                    \" \",\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"number\"\n                                                                    },\n                                                                    \" \",\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \"}\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"More options\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    },\n                                                    {\n                                                        \"li.tsd-parameter\": [\n                                                            {\n                                                                \"h5\": [\n                                                                    {\n                                                                        \"code.tsd-tag\": \"Optional\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-kind-property\": \"value\"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-symbol\": \"?: \"\n                                                                    },\n                                                                    {\n                                                                        \"span.tsd-signature-type\": \"string\"\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"div.tsd-comment.tsd-typography\": {\n                                                                    \"p\": \"Value\"\n                                                                }\n                                                            }\n                                                        ]\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"aside.tsd-sources\": {\n                                            \"ul\": {\n                                                \"li\": [\n                                                    \"Defined in \",\n                                                    {\n                                                        \"tag\": \"a\",\n                                                        \"props\": {\n                                                            \"href\": \"index.ts\"\n                                                        },\n                                                        \"children\": \"index.ts:89\"\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": {\n                    \"tag\": \"details.tsd-accordion.tsd-page-navigation\",\n                    \"props\": {\n                        \"open\": true\n                    },\n                    \"children\": [\n                        {\n                            \"summary.tsd-accordion-summary\": {\n                                \"h3\": \"On This Page\"\n                            }\n                        },\n                        {\n                            \"div.tsd-accordion-details\": {\n                                \"tag\": \"details.tsd-accordion.tsd-page-navigation-section\",\n                                \"props\": {\n                                    \"open\": true\n                                },\n                                \"children\": [\n                                    {\n                                        \"tag\": \"summary.tsd-accordion-summary\",\n                                        \"props\": {\n                                            \"data-key\": \"section-Properties\"\n                                        },\n                                        \"children\": \"Properties\"\n                                    },\n                                    {\n                                        \"div\": {\n                                            \"tag\": \"a\",\n                                            \"props\": {\n                                                \"href\": \"#options\"\n                                            },\n                                            \"children\": {\n                                                \"span\": \"options\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/specs/types/UnionComments.json",
    "content": "{\n    \"div.container.container-main\": [\n        {\n            \"div.col-content\": [\n                {\n                    \"div.tsd-page-title\": [\n                        {\n                            \"tag\": \"ul.tsd-breadcrumb\",\n                            \"props\": {\n                                \"aria-label\": \"Breadcrumb\"\n                            },\n                            \"children\": {\n                                \"li\": {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"\",\n                                        \"aria-current\": \"page\"\n                                    },\n                                    \"children\": \"UnionComments\"\n                                }\n                            }\n                        },\n                        {\n                            \"h1\": \"Type Alias UnionComments\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-signature\": [\n                        {\n                            \"span.tsd-kind-type-alias\": \"UnionComments\"\n                        },\n                        {\n                            \"span.tsd-signature-symbol\": \":\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"\\\"abc\\\"\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-symbol\": \"|\"\n                        },\n                        \" \",\n                        {\n                            \"span.tsd-signature-type\": \"\\\"def\\\"\"\n                        }\n                    ]\n                },\n                {\n                    \"div.tsd-type-declaration\": [\n                        {\n                            \"h4\": \"Type Declaration\"\n                        },\n                        {\n                            \"ul\": [\n                                {\n                                    \"li\": [\n                                        {\n                                            \"span.tsd-signature-type\": \"\\\"abc\\\"\"\n                                        },\n                                        {\n                                            \"div.tsd-comment.tsd-typography\": {\n                                                \"p\": \"Commentary on abc\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"li\": [\n                                        {\n                                            \"span.tsd-signature-type\": \"\\\"def\\\"\"\n                                        },\n                                        {\n                                            \"div.tsd-comment.tsd-typography\": {\n                                                \"p\": \"Commentary on def\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                },\n                {\n                    \"aside.tsd-sources\": {\n                        \"ul\": {\n                            \"li\": [\n                                \"Defined in \",\n                                {\n                                    \"tag\": \"a\",\n                                    \"props\": {\n                                        \"href\": \"index.ts\"\n                                    },\n                                    \"children\": \"index.ts:102\"\n                                }\n                            ]\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"div.col-sidebar\": {\n                \"div.page-menu\": []\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/test/renderer/testRendererUtils.ts",
    "content": "import { type Reflection, resetReflectionID } from \"#models\";\nimport { HtmlAttributeParser, loadTestHighlighter, ParserState } from \"#node-utils\";\nimport { rm } from \"node:fs/promises\";\nimport { DefaultTheme, KindRouter, PageEvent, PageKind, type RenderTemplate } from \"../../lib/output/index.js\";\nimport { type JsxChildren, type JsxElement, JsxFragment } from \"../../lib/utils-common/jsx.elements.js\";\nimport { Raw } from \"../../lib/utils-common/jsx.js\";\nimport { getConverter2App, getConverter2Project } from \"../programs.js\";\nimport { assert } from \"#utils\";\n\nfunction shouldIgnoreElement(el: JsxElement) {\n    switch (el.tag) {\n        case \"svg\":\n        case \"head\":\n        case \"script\":\n        case \"header\":\n        case \"footer\":\n            return true;\n        case \"div\":\n            return [\n                \"site-menu\",\n                \"overlay\",\n                \"tsd-navigation settings\",\n            ].includes((el.props as any)?.[\"class\"]);\n    }\n\n    return false;\n}\n\nfunction collapseStrings(data: any[]): unknown {\n    let lastString = -1;\n    for (let i = 0; i < data.length;) {\n        if (typeof data[i] === \"string\") {\n            if (lastString === -1) {\n                lastString = i;\n                ++i;\n            } else {\n                data[lastString] += data.splice(i, 1)[0];\n            }\n        } else {\n            lastString = -1;\n            ++i;\n        }\n    }\n    if (data.length === 1) {\n        return data[0];\n    }\n    return data;\n}\n\n// This is a very hacky html parser only intended to handle output from markdown-it\n// for inclusion in the renderer specs. Don't use it for anything that requires actual\n// security.\nfunction parseHtmlToJsxElement(html: string): JsxChildren[] {\n    const stack: JsxElement[] = [];\n    const output: JsxChildren[] = [];\n    let pos = 0;\n    let last = 0;\n\n    function currentChildList() {\n        if (stack.length) {\n            return stack[stack.length - 1].children;\n        }\n        return output;\n    }\n\n    function skipWs() {\n        while (pos < html.length && /\\s/.test(html[pos])) ++pos;\n    }\n\n    function takeWord() {\n        const start = pos;\n        while (pos < html.length && /[a-z0-9-]/i.test(html[pos])) ++pos;\n        return html.slice(start, pos);\n    }\n\n    function startTag() {\n        assert(html[pos] === \"<\");\n\n        ++pos;\n        skipWs();\n\n        const tag = takeWord();\n\n        const parser = new HtmlAttributeParser(html, pos);\n        const props: Record<string, string> = {};\n\n        while (parser.state !== ParserState.END) {\n            if (parser.state === ParserState.BeforeAttributeValue) {\n                parser.step();\n                props[parser.currentAttributeName] = parser.currentAttributeValue;\n            } else {\n                parser.step();\n            }\n        }\n\n        pos = parser.pos - 1;\n\n        const element = {\n            tag,\n            props,\n            children: [],\n        };\n\n        if (html[pos] === \"/\") {\n            // self closing tag\n            currentChildList().push(element);\n            ++pos;\n            skipWs();\n        } else {\n            currentChildList().push(element);\n            stack.push(element);\n        }\n\n        assert(html[pos] === \">\");\n        ++pos;\n        last = pos;\n    }\n\n    function endTag() {\n        assert(html[pos] === \"<\" && html[pos + 1] === \"/\");\n        pos += 2;\n        skipWs();\n\n        const tag = takeWord();\n        if (stack.length === 0 || stack[stack.length - 1].tag !== tag) {\n            throw new Error(`Invalid HTML, failed to match end tag: ${tag}`);\n        }\n        stack.pop();\n\n        skipWs();\n        assert(html[pos] === \">\");\n        ++pos;\n        last = pos;\n    }\n\n    function saveContent() {\n        if (pos !== last) {\n            const content = html.slice(last, pos);\n            currentChildList().push(content.trim());\n        }\n        last = pos;\n    }\n\n    while (pos < html.length) {\n        switch (html[pos]) {\n            case \"<\":\n                saveContent();\n                if (html[pos + 1] == \"/\") {\n                    endTag();\n                } else {\n                    startTag();\n                }\n                break;\n            default:\n                ++pos;\n                break;\n        }\n    }\n\n    saveContent();\n    return output;\n}\n\nfunction renderElementToSnapshot(element: JsxChildren): unknown {\n    if (typeof element === \"string\" || typeof element === \"number\" || typeof element === \"bigint\") {\n        return element.toString().replaceAll(\"\\u00a0\", \" \");\n    }\n\n    if (!element || typeof element === \"boolean\") {\n        return \"\";\n    }\n\n    if (Array.isArray(element)) {\n        return collapseStrings(element.flatMap(renderElementToSnapshot).filter(Boolean));\n    }\n\n    if (shouldIgnoreElement(element)) {\n        return;\n    }\n\n    const { tag, props, children } = element;\n\n    if (typeof tag === \"function\") {\n        if (tag === Raw) {\n            return renderElementToSnapshot(parseHtmlToJsxElement(String((props as any).html)));\n        }\n        if (tag === JsxFragment) {\n            return collapseStrings(children.flatMap(renderElementToSnapshot).filter(Boolean));\n        }\n        return renderElementToSnapshot(tag(Object.assign({ children }, props)));\n    }\n\n    let name = tag;\n    let propsData: Record<string, unknown> | undefined;\n    let childrenData: unknown;\n\n    for (const [key, val] of Object.entries(props ?? {})) {\n        if (val == null) continue;\n        if (key === \"class\") {\n            name += \".\" + val.replaceAll(\" \", \".\");\n            continue;\n        }\n        if (key === \"id\") {\n            name += \"#\" + val;\n            continue;\n        }\n\n        propsData ||= {};\n\n        if (typeof val == \"boolean\") {\n            propsData[key] = val;\n        } else {\n            propsData[key] = typeof val === \"string\" ? val : JSON.stringify(val);\n        }\n    }\n\n    const collapsed = collapseStrings(children.flatMap(renderElementToSnapshot).filter(Boolean));\n    if (Array.isArray(collapsed) || typeof collapsed === \"string\") {\n        if (collapsed.length) {\n            childrenData = collapsed;\n        }\n    } else if (typeof collapsed === \"object\") {\n        childrenData = collapsed;\n    }\n\n    if (propsData) {\n        return { tag: name, props: propsData, children: childrenData };\n    }\n    return { [name]: childrenData || [] };\n}\n\nexport class TestTheme extends DefaultTheme {\n    override render(page: PageEvent<Reflection>): string {\n        const templateMapping: Record<string, any> = {\n            [PageKind.Index]: this.indexTemplate,\n            [PageKind.Document]: this.documentTemplate,\n            [PageKind.Hierarchy]: this.hierarchyTemplate,\n            [PageKind.Reflection]: this.reflectionTemplate,\n        };\n        const template = templateMapping[page.pageKind] as RenderTemplate<PageEvent<Reflection>>;\n\n        const templateOutput = this.defaultLayoutTemplate(page, template);\n        const snapshot = renderElementToSnapshot(templateOutput) as any;\n        return JSON.stringify(snapshot.children.body, null, 4) + \"\\n\";\n    }\n\n    override async preRender() {\n        loadTestHighlighter();\n    }\n}\n\nexport class TestRouter extends KindRouter {\n    override extension = \".json\";\n}\n\nexport async function buildRendererSpecs(specPath: string) {\n    await rm(specPath, { recursive: true, force: true });\n\n    const app2 = getConverter2App();\n    app2.renderer.defineTheme(\"test-theme\", TestTheme);\n    app2.renderer.defineRouter(\"test-router\", TestRouter);\n\n    const snap = app2.options.snapshot();\n\n    app2.options.setValue(\"options\", \"src/test/converter2/typedoc.json\");\n    await app2.options.read(app2.logger);\n\n    app2.options.setValue(\"theme\", \"test-theme\");\n    app2.options.setValue(\"router\", \"test-router\");\n    // Unfortunate not to set this in typedoc.json for converter2, but plenty\n    // of tests expect to test the default option, not this.\n    app2.options.setValue(\"categorizeByGroup\", true);\n    app2.options.setValue(\"readme\", \"src/test/converter2/renderer/renderer-readme.md\");\n\n    resetReflectionID();\n    const project = getConverter2Project([\"renderer\"], \".\");\n    await app2.generateDocs(project, specPath);\n    await rm(`${specPath}/assets`, { recursive: true });\n    await rm(`${specPath}/.nojekyll`);\n\n    app2.renderer.removeTheme(\"test-theme\");\n    app2.renderer.removeRouter(\"test-router\");\n    app2.options.restore(snap);\n}\n"
  },
  {
    "path": "src/test/slow/README.md",
    "content": "Put slow tests which should be run by CI, but likely aren't useful to run when testing locally in this folder.\nThey will not be run when running `pnpm test`, but may be run by doing `pnpm test:full`\n"
  },
  {
    "path": "src/test/slow/entry-point.test.ts",
    "content": "import { tempdirProject } from \"@typestrong/fs-fixture-builder\";\nimport { deepStrictEqual as equal, ok } from \"assert\";\nimport { join } from \"path\";\nimport { Application, EntryPointStrategy, normalizePath } from \"../../index.js\";\n\ndescribe(\"Entry Points\", () => {\n    using fixture = tempdirProject();\n    const tsconfig = join(fixture.cwd, \"tsconfig.json\");\n\n    beforeEach(() => {\n        fixture.files.length = 0;\n        fixture.addJsonFile(\"tsconfig.json\", {\n            include: [\".\"],\n        });\n        fixture.addJsonFile(\"package.json\", {\n            main: \"index.ts\",\n        });\n        fixture.addFile(\"index.ts\", \"export function fromIndex() {}\");\n        fixture.addFile(\"extra.ts\", \"export function extra() {}\");\n        fixture.write();\n    });\n\n    afterEach(() => {\n        fixture.rm();\n    });\n\n    it(\"Supports expanding existing paths\", async () => {\n        const app = await Application.bootstrap({\n            tsconfig,\n            entryPoints: [normalizePath(fixture.cwd)],\n            entryPointStrategy: EntryPointStrategy.Expand,\n        });\n\n        equal(app.options.getValue(\"entryPoints\"), [normalizePath(fixture.cwd)]);\n\n        const entryPoints = app.getDefinedEntryPoints();\n        ok(entryPoints);\n        equal(\n            entryPoints.length,\n            2,\n            \"There are two files, so both should be expanded\",\n        );\n    });\n\n    it(\"Supports expanding globs in paths\", async () => {\n        const app = await Application.bootstrap({\n            entryPointStrategy: EntryPointStrategy.Expand,\n            tsconfig,\n        });\n        app.options.setValue(\"entryPoints\", [\"*.ts\"], fixture.cwd);\n\n        equal(app.options.getValue(\"entryPoints\"), [\n            `${normalizePath(fixture.cwd)}/*.ts`,\n        ]);\n\n        const entryPoints = app.getDefinedEntryPoints();\n        ok(entryPoints);\n        equal(\n            entryPoints.length,\n            2,\n            \"There are two files, so both should be expanded\",\n        );\n    });\n\n    it(\"Supports resolving directories\", async () => {\n        const app = await Application.bootstrap({\n            tsconfig: normalizePath(tsconfig),\n            entryPoints: [normalizePath(fixture.cwd)],\n            entryPointStrategy: EntryPointStrategy.Resolve,\n        });\n\n        const entryPoints = app.getDefinedEntryPoints();\n        ok(entryPoints);\n        equal(\n            entryPoints.length,\n            1,\n            \"entry-points/index.ts should have been the sole entry point\",\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/slow/internationalization-usage.test.ts",
    "content": "import ts from \"typescript\";\nimport { ok } from \"assert/strict\";\nimport { Logger, Options, TSConfigReader } from \"../../index.js\";\nimport { join } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\n\ndescribe(\"Internationalization\", () => {\n    it(\"Does not include strings in translatable object which are unused\", () => {\n        const options = new Options();\n        const tsconfigReader = new TSConfigReader();\n        const logger = new Logger();\n        tsconfigReader.read(options, logger, process.cwd());\n\n        const defaultLocaleTs = join(\n            fileURLToPath(import.meta.url),\n            \"../../../lib/internationalization/locales/en.cts\",\n        );\n\n        const host: ts.LanguageServiceHost = {\n            getScriptFileNames: () => options.getFileNames().slice(),\n            getScriptVersion: () => \"unused\",\n            getScriptSnapshot: (fileName) => {\n                if (!existsSync(fileName)) return undefined;\n                return ts.ScriptSnapshot.fromString(\n                    readFileSync(fileName, \"utf-8\"),\n                );\n            },\n            getCurrentDirectory: () => process.cwd(),\n            getCompilationSettings: () => options.getCompilerOptions(logger),\n            getDefaultLibFileName: (opts) => ts.getDefaultLibFilePath(opts),\n            fileExists: ts.sys.fileExists,\n            readFile: ts.sys.readFile,\n            readDirectory: ts.sys.readDirectory,\n            directoryExists: ts.sys.directoryExists,\n            getDirectories: ts.sys.getDirectories,\n        };\n\n        const service = ts.createLanguageService(\n            host,\n            ts.createDocumentRegistry(),\n        );\n\n        const program = service.getProgram();\n        ok(program, \"Failed to get program for i18n analysis\");\n\n        const sf = program.getSourceFile(defaultLocaleTs);\n        ok(sf, \"Failed to get source file\");\n\n        const moduleSymbol = program.getTypeChecker().getSymbolAtLocation(sf)!;\n        const translatable = moduleSymbol.exports?.get(\n            \"export=\" as ts.__String,\n        );\n        ok(translatable, \"Failed to get translatable symbol\");\n\n        ok(ts.isExportAssignment(translatable.valueDeclaration!));\n        ok(ts.isAsExpression(translatable.valueDeclaration.expression));\n        ok(\n            ts.isObjectLiteralExpression(\n                translatable.valueDeclaration.expression.expression,\n            ),\n        );\n        const translatableObj = translatable.valueDeclaration.expression.expression;\n\n        translatableObj.forEachChild((child) => {\n            ok(ts.isPropertyAssignment(child));\n            const refs = service.getReferencesAtPosition(\n                sf.fileName,\n                child.getStart(),\n            );\n            const refCount = refs?.filter(\n                (ref) =>\n                    !/locales\\/.*\\.cts$/.test(ref.fileName) &&\n                    !ref.fileName.endsWith(\"translatable.ts\"),\n            ).length ?? 0;\n            ok(\n                refCount,\n                `Translatable key ${child.name.getText()} is not referenced.`,\n            );\n        });\n\n        service.dispose();\n    });\n});\n"
  },
  {
    "path": "src/test/utils/fs.test.ts",
    "content": "import * as fs from \"fs\";\nimport { createServer } from \"net\";\nimport { type Project, tempdirProject } from \"@typestrong/fs-fixture-builder\";\nimport { type AssertionError, deepStrictEqual as equal } from \"assert\";\nimport { basename, dirname, join, normalize, resolve } from \"path\";\nimport { createGlobString, glob, inferPackageEntryPointPaths, normalizePath } from \"#node-utils\";\nimport type { NormalizedPath } from \"#utils\";\n\ndescribe(\"fs.ts\", () => {\n    describe(\"glob\", () => {\n        let fix: Project;\n        let cwd: NormalizedPath;\n        beforeEach(() => {\n            fix = tempdirProject();\n            cwd = normalizePath(fix.cwd);\n        });\n        afterEach(() => {\n            fix.rm();\n        });\n\n        it(\"handles root match\", () => {\n            fix.write();\n\n            const result = glob(createGlobString(\"\", cwd), cwd, {\n                includeDirectories: true,\n            });\n            equal(result.map(normalize), [fix.cwd].map(normalize));\n        });\n\n        it(\"Handles basic globbing\", () => {\n            fix.addFile(\"test.ts\");\n            fix.addFile(\"test2.ts\");\n            fix.addFile(\"a.ts\");\n            fix.addFile(\"b.js\");\n            fix.write();\n\n            equal(\n                glob(createGlobString(cwd, `*.ts`), cwd).map((f) => basename(f)),\n                [\"a.ts\", \"test.ts\", \"test2.ts\"],\n            );\n            equal(\n                glob(createGlobString(cwd, `**/test*.ts`), cwd).map((f) => basename(f)),\n                [\"test.ts\", \"test2.ts\"],\n            );\n        });\n\n        describe(\"when 'followSymlinks' option is true\", () => {\n            it(\"should navigate symlinked directories\", () => {\n                const target = dirname(fix.dir(\"a\").addFile(\"test.ts\").path);\n                fix.write();\n                fs.symlinkSync(target, resolve(fix.cwd, \"b\"), \"junction\");\n                equal(\n                    glob(createGlobString(cwd, `b/*.ts`), cwd, {\n                        followSymlinks: true,\n                    }).map((f) => basename(f)),\n                    [\"test.ts\"],\n                );\n            });\n\n            it(\"should navigate recursive symlinked directories only once\", () => {\n                fix.addFile(\"test.ts\");\n                fix.write();\n                fs.symlinkSync(\n                    fix.cwd,\n                    resolve(fix.cwd, \"recursive\"),\n                    \"junction\",\n                );\n                equal(\n                    glob(createGlobString(cwd, `**/*.ts`), cwd, {\n                        followSymlinks: true,\n                    }).map((f) => basename(f)),\n                    [\"test.ts\", \"test.ts\"],\n                );\n            });\n\n            it(\"should handle symlinked files\", function () {\n                const { path } = fix.addFile(\"test.ts\");\n                fix.write();\n                try {\n                    fs.symlinkSync(\n                        path,\n                        resolve(dirname(path), \"test-2.ts\"),\n                        \"file\",\n                    );\n                } catch (err) {\n                    // on windows, you need elevated permissions to create a file symlink.\n                    // maybe we have them! maybe we don't!\n                    if (\n                        (err as NodeJS.ErrnoException).code === \"EPERM\" &&\n                        process.platform === \"win32\"\n                    ) {\n                        return this.skip();\n                    }\n                }\n                equal(\n                    glob(createGlobString(cwd, `**/*.ts`), cwd, {\n                        followSymlinks: true,\n                    }).map((f) => basename(f)),\n                    [\"test-2.ts\", \"test.ts\"],\n                );\n            });\n        });\n\n        describe(\"when node_modules is present in the pattern\", function () {\n            it(\"should traverse node_modules\", function () {\n                fix.dir(\"node_modules\").addFile(\"test.ts\");\n                fix.write();\n                equal(\n                    glob(createGlobString(cwd, `node_modules/test.ts`), cwd).map((f) => basename(f)),\n                    [\"test.ts\"],\n                );\n            });\n        });\n\n        describe(\"when node_modules is not present in the pattern\", function () {\n            it(\"should not traverse node_modules\", function () {\n                fix.dir(\"node_modules\").addFile(\"test.ts\");\n                fix.write();\n                equal(\n                    glob(createGlobString(cwd, `**/test.ts`), cwd).map((f) => basename(f)),\n                    [],\n                );\n            });\n        });\n\n        it(\"should ignore anything that is not a file, symbolic link, or directory\", function (done) {\n            // Use unix socket for example, because that's easiest to create.\n            // Skip on Windows because it doesn't support unix sockets\n            if (process.platform === \"win32\") {\n                return this.skip();\n            }\n            fix.write();\n\n            const sockServer = createServer()\n                .unref()\n                .listen(resolve(fix.cwd, \"socket.sock\"))\n                .once(\"listening\", () => {\n                    let err: AssertionError | null = null;\n                    try {\n                        equal(glob(createGlobString(cwd, `*.sock`), cwd), []);\n                    } catch (e) {\n                        err = e as AssertionError;\n                    } finally {\n                        sockServer.close(() => {\n                            done(err);\n                        });\n                    }\n                });\n        });\n    });\n\n    describe(\"inferPackageEntryPointPaths\", () => {\n        using fixture = tempdirProject();\n        afterEach(() => fixture.rm());\n        const packagePath = (path: string) => normalizePath(join(fixture.cwd, path));\n\n        const inferExports = () =>\n            inferPackageEntryPointPaths(fixture.cwd + \"/package.json\").map(\n                (s) => [s[0], normalizePath(s[1])],\n            );\n\n        it(\"Supports string exports shorthand\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                main: \"./main.js\",\n                exports: \"./exp.js\",\n            });\n            fixture.write();\n\n            equal(inferExports(), [[\".\", packagePath(\"exp.js\")]]);\n        });\n\n        it(\"Uses the main field if exports are not defined\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                main: \"./main.js\",\n            });\n            fixture.write();\n\n            equal(inferExports(), [[\".\", packagePath(\"main.js\")]]);\n        });\n\n        it(\"Supports simple object exports\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                exports: {\n                    \".\": \"main.js\",\n                    foo: \"foo.js\",\n                },\n            });\n            fixture.write();\n\n            equal(inferExports(), [\n                [\".\", packagePath(\"main.js\")],\n                [\"foo\", packagePath(\"foo.js\")],\n            ]);\n        });\n\n        it(\"Uses export conditions\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                exports: {\n                    \".\": \"main.js\",\n                    a: {\n                        typedoc: \"a.ts\",\n                        default: \"a.js\",\n                    },\n                    b: {\n                        import: \"b.ts\",\n                        default: \"b.js\",\n                    },\n                    c: {\n                        node: \"c.ts\",\n                        default: \"c.js\",\n                    },\n                    d: {\n                        \"not-recognized\": \"d.ts\",\n                        default: \"d.js\",\n                    },\n                },\n            });\n            fixture.write();\n\n            equal(inferExports(), [\n                [\".\", packagePath(\"main.js\")],\n                [\"a\", packagePath(\"a.ts\")],\n                [\"b\", packagePath(\"b.ts\")],\n                [\"c\", packagePath(\"c.ts\")],\n                [\"d\", packagePath(\"d.js\")],\n            ]);\n        });\n\n        it(\"Handles arrays of export conditions\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                exports: {\n                    \".\": [\"main.js\"],\n                    a: [\"does-not-exist.js\", \"exists.js\"],\n                },\n            });\n            fixture.addFile(\"main.js\");\n            fixture.addFile(\"exists.js\");\n            fixture.write();\n\n            equal(inferExports(), [\n                [\".\", packagePath(\"main.js\")],\n                [\"a\", packagePath(\"exists.js\")],\n            ]);\n        });\n\n        it(\"Handles nested export conditions\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                exports: {\n                    a: {\n                        notMatched: {\n                            typedoc: \"nope.js\",\n                        },\n                        typedoc: {\n                            node: \"a.ts\",\n                        },\n                        default: \"a.js\",\n                    },\n                },\n            });\n            fixture.write();\n\n            equal(inferExports(), [[\"a\", packagePath(\"a.ts\")]]);\n        });\n\n        it(\"Handles a single wildcard\", () => {\n            fixture.addJsonFile(\"package.json\", {\n                exports: {\n                    \"a/*.js\": \"src/*.js\",\n                    \"b/*.js\": \"src/*/*.ts\",\n                },\n            });\n            fixture.addFile(\"src/1.js\");\n            fixture.addFile(\"src/2.js\");\n            fixture.addFile(\"src/3/4.js\");\n            fixture.addFile(\"src/5.ts\");\n            fixture.addFile(\"src/6/6.ts\");\n            fixture.write();\n\n            equal(inferExports(), [\n                [\"a/1.js\", packagePath(\"src/1.js\")],\n                [\"a/2.js\", packagePath(\"src/2.js\")],\n                [\"a/3/4.js\", packagePath(\"src/3/4.js\")],\n                [\"b/6.js\", packagePath(\"src/6/6.ts\")],\n            ]);\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/utils/general.test.ts",
    "content": "import { deepStrictEqual as equal, doesNotThrow, throws } from \"assert/strict\";\nimport { assert, assertNever, dedent } from \"#utils\";\n\ndescribe(\"general.ts\", () => {\n    it(\"dedent works on empty string\", () => {\n        equal(dedent(\"\"), \"\");\n    });\n\n    it(\"dedent works with indented text\", () => {\n        equal(\n            dedent(`\n                Text here\n            `),\n            \"Text here\",\n        );\n    });\n\n    it(\"dedent works with multiple lines\", () => {\n        equal(\n            dedent(`\n                Text here\n                    More indented\n            `),\n            \"Text here\\n    More indented\",\n        );\n    });\n\n    it(\"assertNever\", () => {\n        throws(\n            () => assertNever(\"x\" as never),\n            new Error(`Expected handling to cover all possible cases, but it didn't cover: \"x\"`),\n        );\n    });\n\n    it(\"assert\", () => {\n        doesNotThrow(() => assert(true));\n        throws(() => assert(false), new Error(\"Assertion failed\"));\n    });\n});\n"
  },
  {
    "path": "src/test/utils/html.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { createNormalizedUrl, HtmlAttributeParser, ParserState } from \"#node-utils\";\n\ndescribe(\"HtmlAttributeParser\", () => {\n    enum State {\n        BeforeAttributeName = \"BeforeAttributeName\",\n        AfterAttributeName = \"AfterAttributeName\",\n        BeforeAttributeValue = \"BeforeAttributeValue\",\n    }\n\n    function stateStr(state: ParserState) {\n        return {\n            [ParserState.BeforeAttributeName]: State.BeforeAttributeName,\n            [ParserState.AfterAttributeName]: State.AfterAttributeName,\n            [ParserState.BeforeAttributeValue]: State.BeforeAttributeValue,\n            [ParserState.END]: \"<END>\",\n        }[state];\n    }\n\n    function parseWithEnd(text: string) {\n        const parser = new HtmlAttributeParser(text);\n        const data = [];\n        do {\n            parser.step();\n            data.push([\n                stateStr(parser.state),\n                parser.currentAttributeName,\n                parser.currentAttributeValue,\n            ]);\n        } while (parser.state != ParserState.END);\n        return data;\n    }\n\n    function parse(text: string) {\n        const data = parseWithEnd(text);\n        data.pop();\n        return data;\n    }\n\n    function parseAttrsToObject(text: string) {\n        const result: Record<string, string> = {};\n        for (const elem of parseWithEnd(text)) {\n            result[elem[1]] = elem[2];\n        }\n        delete result[\"\"];\n        return result;\n    }\n\n    it(\"Handles self closing tag\", () => {\n        equal(parse(\"  >\"), []);\n\n        equal(parse(\"  />\"), []);\n    });\n\n    it(\"Handles EOF before end of tag\", () => {\n        equal(parse(\" \\t\\f\"), []);\n    });\n\n    it(\"Handles names without values\", () => {\n        equal(parse(\"a b c />\"), [\n            [State.AfterAttributeName, \"a\", \"\"],\n            [State.AfterAttributeName, \"b\", \"\"],\n            [State.AfterAttributeName, \"c\", \"\"],\n        ]);\n    });\n\n    it(\"Handles unquoted value\", () => {\n        equal(parse(\"a=1 b=bbb />\"), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"1\"],\n            [State.BeforeAttributeValue, \"b\", \"\"],\n            [State.BeforeAttributeName, \"b\", \"bbb\"],\n        ]);\n    });\n\n    it(\"Handles single quoted value\", () => {\n        equal(parse(\"a='1' b='b b' />\"), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"1\"],\n            [State.BeforeAttributeValue, \"b\", \"\"],\n            [State.BeforeAttributeName, \"b\", \"b b\"],\n        ]);\n    });\n\n    it(\"Handles double quoted value\", () => {\n        equal(parse('a=\"1\" b=\"b b\" />'), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"1\"],\n            [State.BeforeAttributeValue, \"b\", \"\"],\n            [State.BeforeAttributeName, \"b\", \"b b\"],\n        ]);\n    });\n\n    it(\"Handles named escapes\", () => {\n        equal(parse('a=\"&amp;\" b=\"&amp\" />'), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"&\"],\n            [State.BeforeAttributeValue, \"b\", \"\"],\n            [State.BeforeAttributeName, \"b\", \"&\"],\n        ]);\n    });\n\n    it(\"Handles invalid named escape\", () => {\n        equal(parse('a=\"&ZZBADESCAPE;\" />'), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"&ZZBADESCAPE;\"],\n        ]);\n    });\n\n    it(\"Handles an attribute without a name\", () => {\n        equal(parse(\" =oops >\"), [\n            [State.BeforeAttributeValue, \"\", \"\"],\n            [State.BeforeAttributeName, \"\", \"oops\"],\n        ]);\n    });\n\n    it(\"Handles invalid characters in attribute names\", () => {\n        equal(parse(\" a\\\" a' a< >\"), [\n            [State.AfterAttributeName, 'a\"', \"\"],\n            [State.AfterAttributeName, \"a'\", \"\"],\n            [State.AfterAttributeName, \"a<\", \"\"],\n        ]);\n    });\n\n    it(\"Handles missing attribute value\", () => {\n        equal(parse(\" a= \\t\\n\\f>\"), [[State.BeforeAttributeValue, \"a\", \"\"]]);\n    });\n\n    it(\"Handles a null character in a double quoted attribute value\", () => {\n        equal(parse(' a=\"\\0\" >'), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"\\ufffd\"],\n        ]);\n    });\n\n    it(\"Handles an unterminated double quoted attribute value\", () => {\n        equal(parse(' a=\"x'), [[State.BeforeAttributeValue, \"a\", \"\"]]);\n    });\n\n    it(\"Handles missing attribute name after an attribute \", () => {\n        equal(parse(\" a \\t\\n\\f =>\"), [\n            [State.AfterAttributeName, \"a\", \"\"],\n            [State.BeforeAttributeValue, \"a\", \"\"],\n        ]);\n    });\n\n    it(\"Handles named escapes in single quoted value\", () => {\n        equal(parse(\"a='&amp;' b='&amp' c='&ampoops' />\"), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"&\"],\n            [State.BeforeAttributeValue, \"b\", \"\"],\n            [State.BeforeAttributeName, \"b\", \"&\"],\n            [State.BeforeAttributeValue, \"c\", \"\"],\n            [State.BeforeAttributeName, \"c\", \"&ampoops\"],\n        ]);\n    });\n\n    it(\"Handles a null character in a single quoted attribute value\", () => {\n        equal(parse(\" a='\\0' >\"), [\n            [State.BeforeAttributeValue, \"a\", \"\"],\n            [State.BeforeAttributeName, \"a\", \"\\ufffd\"],\n        ]);\n    });\n\n    it(\"Handles an unterminated single quoted attribute value\", () => {\n        equal(parse(\" a='x\"), [[State.BeforeAttributeValue, \"a\", \"\"]]);\n    });\n\n    it(\"Properly terminates unquoted attributes\", () => {\n        equal(parseAttrsToObject(\" a=a\\t b=b\\n c=c\\f\"), {\n            a: \"a\",\n            b: \"b\",\n            c: \"c\",\n        });\n    });\n\n    it(\"Handles character references in unquoted attributes\", () => {\n        equal(parseAttrsToObject(\" a=&amp;a b=&amp c=&ampoops >\"), {\n            a: \"&a\",\n            b: \"&\",\n            c: \"&ampoops\",\n        });\n    });\n\n    it(\"Handles more unquoted attribute cases\", () => {\n        equal(parseAttrsToObject(\" a=a>\"), {\n            a: \"a\",\n        });\n\n        equal(parseAttrsToObject(\" a=\\0x>\"), {\n            a: \"\\ufffdx\",\n        });\n\n        equal(parseAttrsToObject(\" a=a\\\"'<=`>\"), {\n            a: \"a\\\"'<=`\",\n        });\n\n        equal(parseAttrsToObject(\" a=a\"), {\n            a: \"a\",\n        });\n    });\n\n    it(\"Handles characters after a quoted attribute\", () => {\n        equal(parseAttrsToObject(\" a='a'\\tb='b'\\nc='c'\\fd='d'>\"), {\n            a: \"a\",\n            b: \"b\",\n            c: \"c\",\n            d: \"d\",\n        });\n\n        equal(parseAttrsToObject(\" a='a'/\"), {\n            a: \"a\",\n        });\n\n        equal(parseAttrsToObject(\" a='a'\"), {\n            a: \"a\",\n        });\n\n        equal(parseAttrsToObject(\" a='a'b='b' \"), {\n            a: \"a\",\n            b: \"b\",\n        });\n    });\n\n    it(\"Handles simple numeric character references\", () => {\n        equal(parseAttrsToObject(\"a=&#97; b=&#x5A; c=&#X5a;\"), {\n            a: \"a\",\n            b: \"Z\",\n            c: \"Z\",\n        });\n    });\n\n    it(\"Handles an invalid character reference\", () => {\n        equal(parseAttrsToObject(\"a=&&#97;\"), {\n            a: \"&a\",\n        });\n    });\n\n    it(\"Handles an invalid decimal character reference start\", () => {\n        equal(parseAttrsToObject(\"a=&#;\"), {\n            a: \"&#;\",\n        });\n    });\n\n    it(\"Handles an invalid hex character reference\", () => {\n        equal(parseAttrsToObject(\"a=&#x;\"), {\n            a: \"&#x;\",\n        });\n\n        equal(parseAttrsToObject(\"a=&#x5A>\"), {\n            a: \"Z\",\n        });\n    });\n\n    it(\"Handles an ambiguous ampersand without a trailing alphanumeric\", () => {\n        equal(parseAttrsToObject(\"a=&a\"), {\n            a: \"&a\",\n        });\n    });\n\n    it(\"Handles an invalid decimal character reference end\", () => {\n        equal(parseAttrsToObject(\"a=&#97>\"), {\n            a: \"a\",\n        });\n    });\n\n    it(\"Handles invalid characters in numeric character references\", () => {\n        equal(parseAttrsToObject(\"a='nul:&#0;x'>\"), {\n            a: \"nul:\\ufffdx\",\n        });\n        equal(parseAttrsToObject(\"a='rng:&#x11ffff;x'>\"), {\n            a: \"rng:\\ufffdx\",\n        });\n        equal(parseAttrsToObject(\"a='leading surrogate:&#xd801;x'>\"), {\n            a: \"leading surrogate:\\ufffdx\",\n        });\n        equal(parseAttrsToObject(\"a='trailing surrogate:&#xdc01;x'>\"), {\n            a: \"trailing surrogate:\\ufffdx\",\n        });\n    });\n});\n\ndescribe(\"createNormalizedUrl\", () => {\n    it(\"Permits simple names\", () => {\n        equal(createNormalizedUrl(\"Aa.1.test\"), \"Aa.1.test\");\n    });\n\n    it(\"Permits Chinese characters\", () => {\n        equal(createNormalizedUrl(\"文档\"), \"文档\");\n    });\n\n    it(\"Permits Emoji characters\", () => {\n        equal(createNormalizedUrl(\"🐌 Foo 🪐.md\"), \"🐌_Foo_🪐.md\");\n    });\n\n    it(\"Permits UTF8 characters\", () => {\n        equal(createNormalizedUrl(\"◉ bar⚐.md\"), \"◉_bar⚐.md\");\n    });\n});\n"
  },
  {
    "path": "src/test/utils/languageAliases.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { isSupportedLanguage } from \"../../lib/utils/highlighter.js\";\n\ndescribe(\"Language aliases\", () => {\n    describe(\"Original language aliases\", () => {\n        it(\"js is present\", () => {\n            equal(isSupportedLanguage(\"js\"), true);\n        });\n        it(\"ts is present\", () => {\n            equal(isSupportedLanguage(\"ts\"), true);\n        });\n        it(\"sh is present\", () => {\n            equal(isSupportedLanguage(\"sh\"), true);\n        });\n        it(\"bash is present\", () => {\n            equal(isSupportedLanguage(\"bash\"), true);\n        });\n        it(\"zsh is present\", () => {\n            equal(isSupportedLanguage(\"zsh\"), true);\n        });\n        it(\"text is present\", () => {\n            equal(isSupportedLanguage(\"text\"), true);\n        });\n    });\n\n    // non-exhaustive, just shows that some of the uncovered ones are now covered\n    describe(\"Extended language aliases\", () => {\n        it(\"rb is present\", () => {\n            equal(isSupportedLanguage(\"rb\"), true);\n        });\n        it(\"py is present\", () => {\n            equal(isSupportedLanguage(\"py\"), true);\n        });\n        it(\"jssm is present\", () => {\n            equal(isSupportedLanguage(\"jssm\"), true);\n        });\n    });\n\n    // non-exhaustive, just shows that the basic names are upheld too\n    describe(\"Basic ids\", () => {\n        it(\"ruby is present\", () => {\n            equal(isSupportedLanguage(\"ruby\"), true);\n        });\n        it(\"python is present\", () => {\n            equal(isSupportedLanguage(\"python\"), true);\n        });\n        it(\"javascript is present\", () => {\n            equal(isSupportedLanguage(\"javascript\"), true);\n        });\n        it(\"typescript is present\", () => {\n            equal(isSupportedLanguage(\"typescript\"), true);\n        });\n        it(\"fsl is present\", () => {\n            equal(isSupportedLanguage(\"fsl\"), true);\n        });\n    });\n\n    describe(\"Improper language aliases\", () => {\n        it(\"js2 is not present\", () => {\n            equal(isSupportedLanguage(\"js2\"), false);\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/utils/minimalSourceFile.test.ts",
    "content": "import { deepStrictEqual as equal, throws } from \"assert\";\nimport type { LineAndCharacter } from \"typescript\";\nimport { MinimalSourceFile } from \"#utils\";\n\ndescribe(\"MinimalSourceFile\", () => {\n    it(\"Should do bounds checking\", () => {\n        const sf = new MinimalSourceFile(\"abc\\n123\\n4\\n5\", \"\");\n\n        throws(() => sf.getLineAndCharacterOfPosition(-1));\n        throws(() => sf.getLineAndCharacterOfPosition(1000));\n    });\n\n    it(\"Should support calculating lines\", () => {\n        const sf = new MinimalSourceFile(\"abc\\n123\\n4\\n5\", \"\");\n\n        const check = (s: string, pos: LineAndCharacter) =>\n            equal(sf.getLineAndCharacterOfPosition(sf.text.indexOf(s)), pos);\n\n        check(\"a\", { line: 0, character: 0 });\n        check(\"b\", { line: 0, character: 1 });\n        check(\"\\n\", { line: 0, character: 3 });\n        check(\"1\", { line: 1, character: 0 });\n        check(\"2\", { line: 1, character: 1 });\n        check(\"4\", { line: 2, character: 0 });\n        check(\"5\", { line: 3, character: 0 });\n    });\n\n    it(\"#2605 Should handle multiple consecutive newlines\", () => {\n        const sf = new MinimalSourceFile(\"a\\n\\nb\", \"\");\n\n        equal(sf.getLineAndCharacterOfPosition(0), { line: 0, character: 0 }); // a\n        equal(sf.getLineAndCharacterOfPosition(1), { line: 0, character: 1 }); // \\n\n        equal(sf.getLineAndCharacterOfPosition(2), { line: 1, character: 0 }); // \\n\n        equal(sf.getLineAndCharacterOfPosition(3), { line: 2, character: 0 }); // b\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/declaration.test.ts",
    "content": "import { deepStrictEqual as equal, ok, throws } from \"assert\";\nimport { join, resolve } from \"path\";\nimport {\n    type ArrayDeclarationOption,\n    convert,\n    type DeclarationOption,\n    getDefaultValue,\n    type MapDeclarationOption,\n    type MixedDeclarationOption,\n    type NumberDeclarationOption,\n    type ObjectDeclarationOption,\n    ParameterType,\n    type StringDeclarationOption,\n} from \"../../../lib/utils/options/declaration.js\";\nimport { normalizePath } from \"#node-utils\";\n\nconst emptyHelp = () => \"\";\n\ndescribe(\"Options - conversions\", () => {\n    const optionWithType = (type: ParameterType) =>\n        ({\n            type,\n            defaultValue: undefined,\n            name: \"test\",\n            help: emptyHelp,\n        }) as DeclarationOption;\n\n    it(\"Converts to numbers\", () => {\n        equal(\n            convert(\"123\", optionWithType(ParameterType.Number), \"\"),\n            123,\n        );\n        equal(convert(\"a\", optionWithType(ParameterType.Number), \"\"), 0);\n        equal(convert(NaN, optionWithType(ParameterType.Number), \"\"), 0);\n    });\n\n    it(\"Converts to number if value is the lowest allowed value for a number option\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            minValue: 1,\n            maxValue: 10,\n            defaultValue: 1,\n        };\n        equal(convert(1, declaration, \"\"), 1);\n    });\n\n    it(\"Generates an error if value is too low for a number option\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            minValue: 1,\n            maxValue: 10,\n            defaultValue: 1,\n        };\n        throws(\n            () => convert(0, declaration, \"\"),\n            new Error(\"test must be between 1 and 10\"),\n        );\n    });\n\n    it(\"Generates an error if value is too low for a number option with no max\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            minValue: 1,\n            defaultValue: 1,\n        };\n        throws(\n            () => convert(0, declaration, \"\"),\n            new Error(\"test must be equal to or greater than 1\"),\n        );\n    });\n\n    it(\"Generates an error if value is too high for a number option with no min\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            maxValue: 10,\n            defaultValue: 1,\n        };\n        throws(\n            () => convert(11, declaration, \"\"),\n            new Error(\"test must be less than or equal to 10\"),\n        );\n    });\n\n    it(\"Converts to number if value is the highest allowed value for a number option\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            minValue: 1,\n            maxValue: 10,\n            defaultValue: 1,\n        };\n        equal(convert(10, declaration, \"\"), 10);\n    });\n\n    it(\"Generates an error if value is too high for a number option\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            minValue: 1,\n            maxValue: 10,\n            defaultValue: 1,\n        };\n        throws(\n            () => convert(11, declaration, \"\"),\n            new Error(\"test must be between 1 and 10\"),\n        );\n    });\n\n    it(\"Validates number options\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n            validate: (value: number) => {\n                if (value % 2 !== 0) {\n                    throw new Error(\"test must be even\");\n                }\n            },\n        };\n        equal(convert(0, declaration, \"\"), 0);\n        equal(convert(2, declaration, \"\"), 2);\n        equal(convert(4, declaration, \"\"), 4);\n        throws(\n            () => convert(1, declaration, \"\"),\n            new Error(\"test must be even\"),\n        );\n    });\n\n    it(\"Converts to strings\", () => {\n        equal(\n            convert(\"123\", optionWithType(ParameterType.String), \"\"),\n            \"123\",\n        );\n        equal(\n            convert(123, optionWithType(ParameterType.String), \"\"),\n            \"123\",\n        );\n        equal(\n            convert([\"1\", \"2\"], optionWithType(ParameterType.String), \"\"),\n            \"1,2\",\n        );\n        equal(\n            convert(null, optionWithType(ParameterType.String), \"\"),\n            \"\",\n        );\n        equal(\n            convert(void 0, optionWithType(ParameterType.String), \"\"),\n            \"\",\n        );\n    });\n\n    it(\"Validates string options\", () => {\n        const declaration: StringDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.String,\n            validate: (value: string) => {\n                if (value !== value.toUpperCase()) {\n                    throw new Error(\"test must be upper case\");\n                }\n            },\n        };\n        equal(convert(\"TOASTY\", declaration, \"\"), \"TOASTY\");\n        throws(\n            () => convert(\"toasty\", declaration, \"\"),\n            new Error(\"test must be upper case\"),\n        );\n    });\n\n    it(\"Converts to booleans\", () => {\n        equal(\n            convert(\"a\", optionWithType(ParameterType.Boolean), \"\"),\n            true,\n        );\n        equal(\n            convert([1], optionWithType(ParameterType.Boolean), \"\"),\n            true,\n        );\n        equal(\n            convert(false, optionWithType(ParameterType.Boolean), \"\"),\n            false,\n        );\n    });\n\n    it(\"Converts to arrays\", () => {\n        equal(convert(\"12,3\", optionWithType(ParameterType.Array), \"\"), [\n            \"12,3\",\n        ]);\n        equal(\n            convert([\"12,3\"], optionWithType(ParameterType.Array), \"\"),\n            [\"12,3\"],\n        );\n        throws(\n            () => convert(true, optionWithType(ParameterType.Array), \"\"),\n            new Error(\"The 'test' option must be set to an array of strings\"),\n        );\n\n        equal(\n            convert(\"/,a\", optionWithType(ParameterType.PathArray), \"\"),\n            [normalizePath(resolve(\"/,a\"))],\n        );\n        equal(\n            convert(\n                [\"/foo\"],\n                optionWithType(ParameterType.PathArray),\n                \"\",\n            ),\n            [normalizePath(resolve(\"/foo\"))],\n        );\n        throws(\n            () => convert(true, optionWithType(ParameterType.PathArray), \"\"),\n            new Error(\"The 'test' option must be set to an array of strings\"),\n        );\n\n        equal(\n            convert(\"a,b\", optionWithType(ParameterType.ModuleArray), \"\"),\n            [\"a,b\"],\n        );\n        equal(\n            convert(\n                [\"a,b\"],\n                optionWithType(ParameterType.ModuleArray),\n                \"\",\n            ),\n            [\"a,b\"],\n        );\n        throws(\n            () => convert(true, optionWithType(ParameterType.ModuleArray), \"\"),\n            new Error(\"The 'test' option must be set to an array of strings\"),\n        );\n\n        equal(\n            convert(\"a,b\", optionWithType(ParameterType.PluginArray), \"\"),\n            [\"a,b\"],\n        );\n        equal(\n            convert(\n                [\"a,b\"],\n                optionWithType(ParameterType.PluginArray),\n                \"\",\n            ),\n            [\"a,b\"],\n        );\n        const fn = () => {};\n        equal(\n            convert(\n                [\"a\", fn],\n                optionWithType(ParameterType.PluginArray),\n                \"\",\n            ),\n            [\"a\", fn],\n        );\n        throws(\n            () => convert(true, optionWithType(ParameterType.PluginArray), \"\"),\n            new Error(\"The 'test' option must be set to an array of strings/functions\"),\n        );\n\n        throws(\n            () => convert(true, optionWithType(ParameterType.GlobArray), \"\"),\n            new Error(\"The 'test' option must be set to an array of strings\"),\n        );\n    });\n\n    it(\"ModuleArray is resolved if relative\", () => {\n        equal(\n            convert(\n                [\"./foo\"],\n                optionWithType(ParameterType.ModuleArray),\n                \"\",\n            ),\n            [normalizePath(join(process.cwd(), \"foo\"))],\n        );\n    });\n\n    it(\"PluginArray is resolved if relative\", () => {\n        equal(\n            convert(\n                [\"./foo\"],\n                optionWithType(ParameterType.PluginArray),\n                \"\",\n            ),\n            [normalizePath(join(process.cwd(), \"foo\"))],\n        );\n    });\n\n    it(\"Validates array options\", () => {\n        const declaration: ArrayDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Array,\n            validate: (value: string[]) => {\n                if (value.length === 0) {\n                    throw new Error(\"test must not be empty\");\n                }\n            },\n        };\n        equal(convert([\"1\"], declaration, \"\"), [\"1\"]);\n        equal(convert([\"1\", \"2\"], declaration, \"\"), [\"1\", \"2\"]);\n        throws(\n            () => convert([], declaration, \"\"),\n            new Error(\"test must not be empty\"),\n        );\n    });\n\n    it(\"Converts to mapped types\", () => {\n        const declaration: MapDeclarationOption<number> = {\n            name: \"\",\n            help: emptyHelp,\n            type: ParameterType.Map,\n            map: {\n                a: 1,\n                b: 2,\n            },\n            defaultValue: 1,\n        };\n        equal(convert(\"a\", declaration, \"\"), 1);\n        equal(convert(\"b\", declaration, \"\"), 2);\n        equal(convert(2, declaration, \"\"), 2);\n    });\n\n    it(\"Converts to mapped types with a map\", () => {\n        const declaration: MapDeclarationOption<number> = {\n            name: \"\",\n            help: emptyHelp,\n            type: ParameterType.Map,\n            map: new Map([\n                [\"a\", 1],\n                [\"b\", 2],\n            ]),\n            defaultValue: 1,\n        };\n        equal(convert(\"a\", declaration, \"\"), 1);\n        equal(convert(\"b\", declaration, \"\"), 2);\n        equal(convert(2, declaration, \"\"), 2);\n    });\n\n    it(\"Generates a nice error if value is invalid\", () => {\n        const declaration: MapDeclarationOption<number> = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Map,\n            map: new Map([\n                [\"a\", 1],\n                [\"b\", 2],\n            ]),\n            defaultValue: 1,\n        };\n        throws(\n            () => convert(\"c\", declaration, \"\"),\n            new Error(\"test must be one of a, b\"),\n        );\n    });\n\n    it(\"Correctly handles enum types in the map error\", () => {\n        enum Enum {\n            a,\n            b,\n        }\n        const declaration = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Map,\n            map: Enum,\n            defaultValue: Enum.a,\n        } as const;\n        throws(\n            () => convert(\"c\", declaration, \"\"),\n            new Error(\"test must be one of a, b\"),\n        );\n    });\n\n    it(\"Passes through mixed\", () => {\n        const data = Symbol();\n        equal(\n            convert(data, optionWithType(ParameterType.Mixed), \"\"),\n            data,\n        );\n    });\n\n    it(\"Validates mixed options\", () => {\n        const declaration: MixedDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Mixed,\n            defaultValue: \"default\",\n            validate: (value: unknown) => {\n                if (typeof value === \"number\") {\n                    throw new Error(\"test must not be a number\");\n                }\n            },\n        };\n        equal(convert(\"text\", declaration, \"\"), \"text\");\n        throws(\n            () => convert(1, declaration, \"\"),\n            new Error(\"test must not be a number\"),\n        );\n    });\n    it(\"Passes through object\", () => {\n        const data = {};\n        equal(\n            convert(data, optionWithType(ParameterType.Object), \"\"),\n            data,\n        );\n    });\n\n    it(\"Validates object options\", () => {\n        const declaration: ObjectDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Object,\n            defaultValue: \"default\",\n            validate: (value: unknown) => {\n                if (typeof value !== \"object\" || Array.isArray(value)) {\n                    throw new Error(\"test must be an object\");\n                }\n            },\n        };\n        equal(convert({}, declaration, \"\"), {});\n        throws(\n            () => convert(1, declaration, \"\"),\n            new Error(\"test must be an object\"),\n        );\n    });\n\n    it(\"Converts object options\", () => {\n        const declaration: ObjectDeclarationOption = {\n            name: \"test\",\n            help: emptyHelp,\n            type: ParameterType.Object,\n            defaultValue: { a: 1, b: 2 },\n        };\n        equal(\n            convert({ b: 3 }, declaration, \"\", declaration.defaultValue),\n            {\n                a: 1,\n                b: 3,\n            },\n        );\n    });\n});\n\ndescribe(\"Options - default values\", () => {\n    function getDeclaration(\n        type: ParameterType,\n        defaultValue: unknown,\n    ): DeclarationOption {\n        return {\n            type,\n            defaultValue,\n            name: \"test\",\n            help: emptyHelp,\n        } as DeclarationOption;\n    }\n\n    it(\"String\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.String, void 0)),\n            \"\",\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.String, \"foo\")),\n            \"foo\",\n        );\n    });\n\n    it(\"Path\", () => {\n        equal(getDefaultValue(getDeclaration(ParameterType.Path, void 0)), \"\");\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.Path, \"foo\")),\n            normalizePath(resolve(\"foo\")),\n        );\n    });\n\n    it(\"Number\", () => {\n        equal(getDefaultValue(getDeclaration(ParameterType.Number, void 0)), 0);\n        equal(getDefaultValue(getDeclaration(ParameterType.Number, 123)), 123);\n        ok(\n            Number.isNaN(\n                getDefaultValue(getDeclaration(ParameterType.Number, NaN)),\n            ),\n        );\n    });\n\n    it(\"Boolean\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.Boolean, void 0)),\n            false,\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.Boolean, true)),\n            true,\n        );\n    });\n\n    it(\"Map\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.Map, void 0)),\n            void 0,\n        );\n        const def = {};\n        ok(getDefaultValue(getDeclaration(ParameterType.Map, def)) === def);\n    });\n\n    it(\"Mixed\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.Mixed, void 0)),\n            void 0,\n        );\n        const def = {};\n        ok(getDefaultValue(getDeclaration(ParameterType.Mixed, def)) === def);\n    });\n\n    it(\"Array\", () => {\n        equal(getDefaultValue(getDeclaration(ParameterType.Array, void 0)), []);\n        equal(getDefaultValue(getDeclaration(ParameterType.Array, [\"a\"])), [\n            \"a\",\n        ]);\n    });\n\n    it(\"PathArray\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.PathArray, void 0)),\n            [],\n        );\n        equal(getDefaultValue(getDeclaration(ParameterType.PathArray, [\"a\"])), [\n            normalizePath(resolve(\"a\")),\n        ]);\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.PathArray, [\"/a\"])),\n            [normalizePath(resolve(\"/a\"))],\n        );\n    });\n\n    it(\"ModuleArray\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.ModuleArray, void 0)),\n            [],\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.ModuleArray, [\"a\"])),\n            [\"a\"],\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.ModuleArray, [\"./a\"])),\n            [normalizePath(resolve(\"./a\"))],\n        );\n    });\n\n    it(\"PluginArray\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.PluginArray, void 0)),\n            [],\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.PluginArray, [\"a\"])),\n            [\"a\"],\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.PluginArray, [\"./a\"])),\n            [normalizePath(resolve(\"./a\"))],\n        );\n    });\n\n    it(\"GlobArray\", () => {\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.GlobArray, void 0)),\n            [],\n        );\n        equal(getDefaultValue(getDeclaration(ParameterType.GlobArray, [\"a\"])), [\n            normalizePath(resolve(\"a\")),\n        ]);\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.GlobArray, [\"**a\"])),\n            [\"**a\"],\n        );\n        equal(\n            getDefaultValue(getDeclaration(ParameterType.GlobArray, [\"#!a\"])),\n            [\"#!\" + normalizePath(resolve(\"a\"))],\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/default-options.test.ts",
    "content": "import { deepStrictEqual as equal, doesNotThrow, ok, throws } from \"assert\";\nimport { Options, TYPEDOC_ROOT } from \"../../../lib/utils/index.js\";\nimport { readFileSync } from \"fs\";\nimport { rootPackageOptions } from \"../../../lib/utils/options/declaration.js\";\n\ndescribe(\"Default Options\", () => {\n    const opts = new Options();\n\n    describe(\"Highlighting theme\", () => {\n        it(\"Errors if an invalid theme is provided\", () => {\n            throws(() => opts.setValue(\"lightHighlightTheme\", \"randomTheme\" as never));\n            opts.setValue(\"lightHighlightTheme\", \"github-light\");\n            equal(opts.getValue(\"lightHighlightTheme\"), \"github-light\");\n\n            throws(() => opts.setValue(\"darkHighlightTheme\", \"randomTheme\" as never));\n            opts.setValue(\"darkHighlightTheme\", \"github-light\");\n            equal(opts.getValue(\"darkHighlightTheme\"), \"github-light\");\n        });\n    });\n\n    describe(\"highlightLanguages\", () => {\n        it(\"Supports aliased languages\", () => {\n            opts.setValue(\"highlightLanguages\", [\"bash\"]);\n            equal(opts.getValue(\"highlightLanguages\"), [\"bash\"]);\n        });\n    });\n\n    describe(\"sort\", () => {\n        it(\"Errors if an invalid sort version is provided\", () => {\n            throws(() => opts.setValue(\"sort\", [\"random\", \"alphabetical\"] as never));\n        });\n\n        it(\"Reports which sort option(s) was invalid\", () => {\n            try {\n                opts.setValue(\"sort\", [\n                    \"random\",\n                    \"alphabetical\",\n                    \"foo\",\n                ] as never);\n            } catch (e) {\n                ok(e instanceof Error);\n                ok(e.message.includes(\"random\"));\n                ok(e.message.includes(\"foo\"));\n            }\n        });\n    });\n\n    describe(\"markdownItOptions\", () => {\n        it(\"Errors if given a non-object\", () => {\n            throws(() => opts.setValue(\"markdownItOptions\", null as never));\n            throws(() => opts.setValue(\"markdownItOptions\", \"bad\" as never));\n            throws(() => opts.setValue(\"markdownItOptions\", [] as never));\n        });\n    });\n\n    describe(\"compilerOptions\", () => {\n        it(\"Errors if given a non-object\", () => {\n            throws(() => opts.setValue(\"compilerOptions\", \"bad\"));\n            throws(() => opts.setValue(\"compilerOptions\", null));\n            throws(() => opts.setValue(\"compilerOptions\", []));\n        });\n    });\n\n    describe(\"requiredToBeDocumented\", () => {\n        it(\"Works with valid values\", () => {\n            doesNotThrow(() => opts.setValue(\"requiredToBeDocumented\", [\"Enum\"]));\n        });\n\n        it(\"Throws on invalid values\", () => {\n            throws(() => opts.setValue(\"requiredToBeDocumented\", [\"Enum2\" as never]));\n        });\n    });\n\n    describe(\"searchCategoryBoosts\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"searchCategoryBoosts\", null as never));\n        });\n\n        it(\"Should disallow non-numbers\", () => {\n            throws(() =>\n                opts.setValue(\"searchCategoryBoosts\", {\n                    cat: true as any as number,\n                })\n            );\n        });\n    });\n\n    describe(\"searchGroupBoosts\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"searchGroupBoosts\", null as never));\n        });\n\n        it(\"Should disallow non-numbers\", () => {\n            throws(() =>\n                opts.setValue(\"searchGroupBoosts\", {\n                    Enum: true as any as number,\n                })\n            );\n        });\n\n        it(\"Should allow groups\", () => {\n            doesNotThrow(() => opts.setValue(\"searchGroupBoosts\", { Enum: 5 }));\n        });\n    });\n\n    describe(\"headerLinks\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"navigationLinks\", null as never));\n        });\n\n        it(\"Should disallow non-strings\", () => {\n            throws(() =>\n                opts.setValue(\"navigationLinks\", {\n                    Home: true as any as string,\n                })\n            );\n        });\n    });\n\n    describe(\"sidebarLinks\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"sidebarLinks\", null as never));\n        });\n\n        it(\"Should disallow non-strings\", () => {\n            throws(() =>\n                opts.setValue(\"sidebarLinks\", {\n                    Home: true as any as string,\n                })\n            );\n        });\n    });\n\n    describe(\"locales\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"locales\", null as never));\n        });\n\n        it(\"Should disallow objects containing non-objects\", () => {\n            throws(() => opts.setValue(\"locales\", { test: false } as never));\n        });\n\n        it(\"Should disallow locales containing non-strings\", () => {\n            throws(() => opts.setValue(\"locales\", { test: { key: false } } as never));\n        });\n\n        it(\"Should allow valid locale shapes\", () => {\n            doesNotThrow(() => opts.setValue(\"locales\", { test: { key: \"hi\" } }));\n        });\n    });\n\n    describe(\"packageOptions\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"packageOptions\", null as never));\n        });\n\n        it(\"Should allow objects\", () => {\n            doesNotThrow(() => opts.setValue(\"packageOptions\", { test: false } as never));\n        });\n    });\n\n    describe(\"blockTags\", () => {\n        it(\"Should disallow non-tags\", () => {\n            throws(() => opts.setValue(\"blockTags\", [\"@bad_tag\"]));\n            throws(() => opts.setValue(\"blockTags\", [\"@2bad\"]));\n        });\n\n        it(\"Should allow tags\", () => {\n            doesNotThrow(() => opts.setValue(\"blockTags\", [\"@good\"]));\n            doesNotThrow(() => opts.setValue(\"blockTags\", [\"@good2\"]));\n            doesNotThrow(() => opts.setValue(\"blockTags\", [\"@Good\"]));\n            doesNotThrow(() => opts.setValue(\"blockTags\", [\"@good-tag\"]));\n        });\n    });\n\n    describe(\"excludeNotDocumentedKinds\", () => {\n        it(\"Should disallow invalid kind strings\", () => {\n            throws(() => opts.setValue(\"excludeNotDocumentedKinds\", [\"InvalidKind\"] as never));\n        });\n\n        it(\"Should disallow disallowed kind strings\", () => {\n            throws(() => opts.setValue(\"excludeNotDocumentedKinds\", [\"Project\"] as never));\n        });\n\n        it(\"Should kinds\", () => {\n            doesNotThrow(() => opts.setValue(\"excludeNotDocumentedKinds\", [\"Variable\"]));\n        });\n    });\n\n    describe(\"externalSymbolLinkMappings\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"externalSymbolLinkMappings\", null as never));\n        });\n\n        it(\"Should disallow objects containing non-objects\", () => {\n            throws(() => opts.setValue(\"externalSymbolLinkMappings\", { test: false } as never));\n        });\n\n        it(\"Should disallow mappings containing non-strings\", () => {\n            throws(() => opts.setValue(\"externalSymbolLinkMappings\", { test: { key: false } } as never));\n        });\n\n        it(\"Should allow valid mapping shapes\", () => {\n            doesNotThrow(() => opts.setValue(\"externalSymbolLinkMappings\", { test: { key: \"hi\" } }));\n        });\n    });\n\n    describe(\"outputs\", () => {\n        it(\"Should disallow non-arrays\", () => {\n            throws(() => opts.setValue(\"outputs\", null as never));\n        });\n\n        it(\"Should arrays of invalid shape\", () => {\n            throws(() => opts.setValue(\"outputs\", [{}] as never));\n        });\n\n        it(\"Should allow valid shapes\", () => {\n            doesNotThrow(() => opts.setValue(\"outputs\", [{ name: \"html\", path: \"out\" }]));\n        });\n    });\n\n    describe(\"highlightLanguages\", () => {\n        it(\"Should disallow non-arrays\", () => {\n            throws(() => opts.setValue(\"highlightLanguages\", null as never));\n        });\n\n        it(\"Should disallow arrays containing unknown languages\", () => {\n            throws(() => opts.setValue(\"highlightLanguages\", [\"notASupportedLanguage\"] as never));\n        });\n\n        it(\"Should allow valid languages\", () => {\n            doesNotThrow(() => opts.setValue(\"highlightLanguages\", [\"typescript\"]));\n        });\n    });\n\n    describe(\"markdownItLoader\", () => {\n        it(\"Should disallow non-functions\", () => {\n            throws(() => opts.setValue(\"markdownItLoader\", null as never));\n        });\n\n        it(\"Should allow functions\", () => {\n            doesNotThrow(() => opts.setValue(\"markdownItLoader\", () => {}));\n        });\n    });\n\n    describe(\"favicon\", () => {\n        it(\"Should disallow paths with an unknown extension\", () => {\n            throws(() => opts.setValue(\"favicon\", \"test.txt\"));\n        });\n\n        it(\"Should allow remote paths with an unknown extension\", () => {\n            doesNotThrow(() => opts.setValue(\"favicon\", \"https://example.com/test.txt\"));\n        });\n\n        it(\"Should allow paths with a known extension\", () => {\n            doesNotThrow(() => opts.setValue(\"favicon\", \"test.png\"));\n        });\n    });\n\n    describe(\"hostedBaseurl\", () => {\n        it(\"Should disallow non-http urls\", () => {\n            throws(() => opts.setValue(\"hostedBaseUrl\", \"test\"));\n            throws(() => opts.setValue(\"hostedBaseUrl\", \"ftp://test\"));\n        });\n\n        it(\"Should allow http and https urls\", () => {\n            doesNotThrow(() => opts.setValue(\"hostedBaseUrl\", \"http://example.com/\"));\n            doesNotThrow(() => opts.setValue(\"hostedBaseUrl\", \"https://example.com/\"));\n        });\n    });\n\n    describe(\"visibilityFilters\", () => {\n        it(\"Should disallow non-objects\", () => {\n            throws(() => opts.setValue(\"visibilityFilters\", \"test\" as never));\n        });\n\n        it(\"Should disallow objects with an invalid key\", () => {\n            throws(() => opts.setValue(\"visibilityFilters\", { bad: true } as never));\n        });\n\n        it(\"Should disallow objects with a non-boolean values\", () => {\n            throws(() => opts.setValue(\"visibilityFilters\", { private: \"bad\" } as never));\n        });\n\n        it(\"Should allow objects with a valid shape\", () => {\n            doesNotThrow(() => opts.setValue(\"visibilityFilters\", { private: true }));\n            doesNotThrow(() => opts.setValue(\"visibilityFilters\", { \"@test\": true }));\n        });\n    });\n\n    describe(\"kindSortOrder\", () => {\n        it(\"Should disallow non-kind strings\", () => {\n            throws(() => opts.setValue(\"kindSortOrder\", [\"Bad\"] as never));\n        });\n        it(\"Should allow valid sort orders\", () => {\n            doesNotThrow(() => opts.setValue(\"kindSortOrder\", [\"Accessor\"]));\n        });\n    });\n\n    it(\"Package Options Documentation\", () => {\n        const allOptions = opts\n            .getDeclarations()\n            .map((opt) => opt.name)\n            .sort((a, b) => a.localeCompare(b));\n\n        const linkedOptions: string[] = [];\n        for (\n            const line of readFileSync(\n                `${TYPEDOC_ROOT}/site/options/package-options.md`,\n                \"utf-8\",\n            ).split(\"\\n\")\n        ) {\n            const match = line.match(/\\[`(.*?)`\\]\\(/);\n            if (match) {\n                linkedOptions.push(match[1]);\n            }\n        }\n\n        linkedOptions.sort((a, b) => a.localeCompare(b));\n\n        equal(\n            linkedOptions,\n            allOptions,\n            \"Option added but not documented in package-options.md\",\n        );\n    });\n\n    it(\"Root package option documentation matches\", () => {\n        const rootOptions: string[] = [];\n        for (\n            const line of readFileSync(\n                `${TYPEDOC_ROOT}/site/options/package-options.md`,\n                \"utf-8\",\n            ).split(\"\\n\")\n        ) {\n            const match = line.match(/\\[`(.*?)`\\]\\(.*?\\)\\s*\\| Root/);\n            if (match) {\n                rootOptions.push(match[1]);\n            }\n        }\n\n        equal(\n            rootOptions,\n            rootPackageOptions,\n            \"Documented root options to not match internal list of root options\",\n        );\n    });\n\n    it(\"Option documentation\", () => {\n        const allOptions = opts\n            .getDeclarations()\n            .map((opt) => opt.name)\n            .sort((a, b) => a.localeCompare(b));\n\n        const documentedOptions: string[] = [];\n        for (\n            const file of [\n                \"comments.md\",\n                \"configuration.md\",\n                \"input.md\",\n                \"organization.md\",\n                \"other.md\",\n                \"output.md\",\n                \"validation.md\",\n            ]\n        ) {\n            for (\n                const line of readFileSync(\n                    `${TYPEDOC_ROOT}/site/options/${file}`,\n                    \"utf-8\",\n                ).split(\"\\n\")\n            ) {\n                const match = line.match(/^## (.*)/);\n                if (match) {\n                    documentedOptions.push(match[1]);\n                }\n            }\n        }\n\n        documentedOptions.sort((a, b) => a.localeCompare(b));\n\n        equal(\n            documentedOptions,\n            allOptions,\n            \"Option added but not documented in site/options/\",\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/help.test.ts",
    "content": "import { ok } from \"assert\";\n\nimport { Options, ParameterHint, ParameterType } from \"../../../lib/utils/index.js\";\nimport { getOptionsHelp } from \"../../../lib/utils/options/help.js\";\n\ndescribe(\"Options - help\", () => {\n    const options = new Options();\n    for (\n        const decl of [\n            { name: \"td-option\", help: \"help\", type: ParameterType.String },\n            { name: \"td-option2\", help: \"help\" },\n            { name: \"not displayed\", help: \"\" },\n            {\n                name: \"td\",\n                help: \"help\",\n                hint: ParameterHint.File,\n            },\n        ]\n    ) {\n        options.addDeclaration(decl as never);\n    }\n\n    it(\"Describes TypeDoc options\", () => {\n        const help = getOptionsHelp(options);\n        ok(help.includes(\"td-option\"));\n    });\n\n    it(\"Does not list options without help\", () => {\n        const help = getOptionsHelp(options);\n        ok(!help.includes(\"not displayed\"));\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/options.test.ts",
    "content": "import { Options, ParameterType } from \"../../../lib/utils/index.js\";\nimport { type MapDeclarationOption, type NumberDeclarationOption, Option } from \"../../../lib/utils/index.js\";\nimport { deepStrictEqual as equal, throws } from \"assert\";\nimport type { DeclarationOption, EmitStrategy } from \"../../../lib/utils/options/index.js\";\nimport { LogLevel } from \"#utils\";\nimport { TestLogger } from \"../../TestLogger.js\";\nimport ts from \"typescript\";\n\ndescribe(\"Options\", () => {\n    let options: Options & {\n        addDeclaration(declaration: Readonly<DeclarationOption>): void;\n        getValue(name: string): unknown;\n    };\n\n    beforeEach(() => {\n        options = new Options();\n        options.addDeclaration({\n            name: \"mapped\",\n            type: ParameterType.Map,\n            map: { a: 1 },\n            defaultValue: 2,\n            help: () => \"\",\n        });\n    });\n\n    it(\"Errors on duplicate declarations\", () => {\n        let threw = false;\n        try {\n            options.addDeclaration({\n                name: \"help\",\n                help: () => \"\",\n                type: ParameterType.Boolean,\n            });\n        } catch {\n            threw = true;\n        }\n\n        equal(threw, true);\n    });\n\n    it(\"Does not throw if number declaration has no min and max values\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test-number-declaration\",\n            help: () => \"\",\n            type: ParameterType.Number,\n            defaultValue: 1,\n        };\n        options.addDeclaration(declaration);\n    });\n\n    it(\"Does not throw if default value is out of range for number declaration\", () => {\n        const declaration: NumberDeclarationOption = {\n            name: \"test-number-declaration\",\n            help: () => \"\",\n            type: ParameterType.Number,\n            minValue: 1,\n            maxValue: 10,\n            defaultValue: 0,\n        };\n        options.addDeclaration(declaration);\n    });\n\n    it(\"Does not throw if a map declaration has a default value that is not part of the map of possible values\", () => {\n        const declaration: MapDeclarationOption<number> = {\n            name: \"testMapDeclarationWithForeignDefaultValue\",\n            help: () => \"\",\n            type: ParameterType.Map,\n            map: new Map([\n                [\"a\", 1],\n                [\"b\", 2],\n            ]),\n            defaultValue: 0,\n        };\n        options.addDeclaration(declaration);\n    });\n\n    it(\"Throws on attempt to get an undeclared option\", () => {\n        throws(() => options.getValue(\"does-not-exist\"));\n    });\n\n    it(\"Does not allow fetching compiler options through getValue\", () => {\n        throws(() => options.getValue(\"target\"));\n    });\n\n    it(\"Errors if converting a set value errors\", () => {\n        throws(() => options.setValue(\"mapped\" as any, \"nonsense\" as any));\n    });\n\n    it(\"Errors if setting flags to an invalid value\", () => {\n        throws(() => options.setValue(\"validation\", \"bad\" as never));\n        throws(() => options.setValue(\"validation\", void 0 as never));\n        throws(() => options.setValue(\"validation\", { notExported: \"bad\" } as never));\n    });\n\n    it(\"Errors if setting a flag which does not exist\", () => {\n        throws(() => options.setValue(\"validation\", { doesNotExist: true } as never));\n    });\n\n    it(\"Allows setting flag objects to true/false\", () => {\n        options.setValue(\"validation\", true);\n        equal(options.getValue(\"validation\"), {\n            notExported: true,\n            notDocumented: true,\n            invalidLink: true,\n            invalidPath: true,\n            rewrittenLink: true,\n            unusedMergeModuleWith: true,\n        });\n\n        options.setValue(\"validation\", false);\n        equal(options.getValue(\"validation\"), {\n            notExported: false,\n            notDocumented: false,\n            invalidLink: false,\n            invalidPath: false,\n            rewrittenLink: false,\n            unusedMergeModuleWith: false,\n        });\n    });\n\n    it(\"Resets a flag to the default if set to null\", () => {\n        const options = new Options();\n\n        options.setValue(\"validation\", { notExported: true });\n        options.setValue(\"validation\", { notExported: null! });\n        equal(options.getValue(\"validation\").notExported, true);\n\n        options.setValue(\"validation\", { notExported: false });\n        options.setValue(\"validation\", { notExported: null! });\n        equal(options.getValue(\"validation\").notExported, true);\n    });\n\n    it(\"Handles mapped enums properly\", () => {\n        const options = new Options();\n\n        equal(options.getValue(\"logLevel\"), LogLevel.Info);\n        options.setValue(\"logLevel\", LogLevel.Error);\n        equal(options.getValue(\"logLevel\"), LogLevel.Error);\n        options.setValue(\"logLevel\", \"Verbose\");\n        equal(options.getValue(\"logLevel\"), LogLevel.Verbose);\n    });\n\n    it(\"Supports directly getting values\", () => {\n        equal(options.getRawValues().entryPoints, []);\n    });\n\n    it(\"Supports checking if an option is set\", () => {\n        const options = new Options();\n        equal(options.isSet(\"excludePrivate\"), false);\n        options.setValue(\"excludePrivate\", false);\n        equal(options.isSet(\"excludePrivate\"), true);\n        options.reset();\n        equal(options.isSet(\"excludePrivate\"), false);\n\n        throws(() => options.isSet(\"does not exist\" as never));\n    });\n\n    it(\"Supports resetting values\", () => {\n        const options = new Options();\n\n        options.setValue(\"entryPoints\", [\"x\"]);\n        const oldExcludeTags = options.getValue(\"excludeTags\");\n        options.setValue(\"excludeTags\", [\"@x\"]);\n        options.reset();\n\n        equal(options.getValue(\"entryPoints\"), []);\n        equal(options.getValue(\"excludeTags\"), oldExcludeTags);\n    });\n\n    it(\"Supports resetting a single value\", () => {\n        const options = new Options();\n\n        options.setValue(\"name\", \"test\");\n        const originalExclude = options.getValue(\"excludeTags\");\n        options.setValue(\"excludeTags\", [\"@x\"]);\n        options.reset(\"excludeTags\");\n\n        equal(options.getValue(\"name\"), \"test\");\n        equal(options.getValue(\"excludeTags\"), originalExclude);\n    });\n\n    it(\"Throws if resetting a single value which does not exist\", () => {\n        const options = new Options();\n\n        throws(() => options.reset(\"thisOptionDoesNotExist\" as never));\n    });\n\n    it(\"Handles tsconfig overrides which aren't strings, #3000\", () => {\n        const logger = new TestLogger();\n        const options = new Options();\n\n        options.setValue(\"compilerOptions\", {\n            moduleResolution: \"bundler\",\n        });\n\n        const compilerOptions = options.getCompilerOptions(logger);\n        equal(compilerOptions.moduleResolution, ts.ModuleResolutionKind.Bundler);\n    });\n\n    it(\"Handles tsconfig overrides which are invalid, #3000\", () => {\n        const logger = new TestLogger();\n        const options = new Options();\n\n        options.setValue(\"compilerOptions\", {\n            moduleResolution: \"bad\",\n        });\n\n        const compilerOptions = options.getCompilerOptions(logger);\n        equal(compilerOptions.moduleResolution, undefined);\n\n        logger.expectMessage(\"error: Failed to apply compilerOptions overrides: *\");\n    });\n});\n\ndescribe(\"Option\", () => {\n    class Container {\n        constructor(public options: Options) {}\n\n        @Option(\"emit\")\n        accessor emit!: EmitStrategy;\n    }\n\n    it(\"Supports fetching options\", () => {\n        const options = new Options();\n\n        const container = new Container(options);\n        equal(container.emit, \"docs\");\n    });\n\n    it(\"Updates as option values change\", () => {\n        const options = new Options();\n\n        const container = new Container(options);\n        equal(container.emit, \"docs\");\n\n        options.setValue(\"emit\", \"both\");\n        equal(container.emit, \"both\");\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/readers/arguments.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\n\nimport { createGlobString, normalizePath, Options } from \"../../../../lib/utils/index.js\";\nimport { ArgumentsReader } from \"../../../../lib/utils/options/readers/index.js\";\nimport {\n    type MapDeclarationOption,\n    type NumberDeclarationOption,\n    ParameterType,\n} from \"../../../../lib/utils/options/index.js\";\nimport { join } from \"path\";\nimport { TestLogger } from \"../../../TestLogger.js\";\n\nconst emptyHelp = () => \"\";\n\ndescribe(\"Options - ArgumentsReader\", () => {\n    const logger = new TestLogger();\n    afterEach(() => logger.reset());\n    // Note: We lie about the type of Options here since we want the less strict\n    // behavior for tests. If TypeDoc ever gets a numeric option, then we can\n    // exclusively use the builtin options for tests and this cast can go away.\n    let options: Options & {\n        addDeclaration(\n            declaration: Readonly<NumberDeclarationOption> & {\n                name: \"numOption\";\n            },\n        ): void;\n        addDeclaration(\n            declaration: Readonly<MapDeclarationOption<number>> & {\n                name: \"mapped\";\n            },\n        ): void;\n        getValue(name: \"numOption\"): number;\n        getValue(name: \"mapped\"): number;\n    };\n\n    beforeEach(() => {\n        options = new Options();\n        options.addDeclaration({\n            name: \"numOption\",\n            help: emptyHelp,\n            type: ParameterType.Number,\n        });\n        options.addDeclaration({\n            name: \"mapped\",\n            type: ParameterType.Map,\n            help: emptyHelp,\n            map: { a: 1, b: 2 },\n            defaultValue: 3,\n        });\n    });\n\n    function test(name: string, args: string[], cb: () => void) {\n        it(name, async () => {\n            const reader = new ArgumentsReader(1, args);\n            options.reset();\n            options.addReader(reader);\n            await options.read(logger);\n            cb();\n        });\n    }\n\n    test(\"Puts arguments with no flag into inputFiles\", [\"foo\", \"bar\"], () => {\n        equal(options.getValue(\"entryPoints\"), [\n            createGlobString(normalizePath(process.cwd()), \"foo\"),\n            createGlobString(normalizePath(process.cwd()), \"bar\"),\n        ]);\n    });\n\n    test(\"Works with string options\", [\"--out\", \"outDir\"], () => {\n        equal(options.getValue(\"out\"), normalizePath(join(process.cwd(), \"outDir\")));\n    });\n\n    test(\"Works with number options\", [\"-numOption\", \"123\"], () => {\n        equal(options.getValue(\"numOption\"), 123);\n    });\n\n    test(\"Works with boolean options\", [\"--includeVersion\"], () => {\n        equal(options.getValue(\"includeVersion\"), true);\n    });\n\n    test(\n        \"Allows setting boolean options with a value\",\n        [\"--includeVersion\", \"TrUE\"],\n        () => {\n            equal(options.getValue(\"includeVersion\"), true);\n            equal(options.getValue(\"entryPoints\"), []);\n        },\n    );\n\n    test(\n        \"Allows setting boolean options to false with a value\",\n        [\"--includeVersion\", \"FALse\"],\n        () => {\n            equal(options.getValue(\"includeVersion\"), false);\n            equal(options.getValue(\"entryPoints\"), []);\n        },\n    );\n\n    test(\n        \"Bool options do not improperly consume arguments\",\n        [\"--includeVersion\", \"foo\"],\n        () => {\n            equal(options.getValue(\"includeVersion\"), true);\n            equal(options.getValue(\"entryPoints\"), [\n                createGlobString(normalizePath(process.cwd()), \"foo\"),\n            ]);\n        },\n    );\n\n    test(\"Works with map options\", [\"--mapped\", \"b\"], () => {\n        equal(options.getValue(\"mapped\"), 2);\n    });\n\n    test(\"Works with array options\", [\"--exclude\", \"a\"], () => {\n        equal(options.getValue(\"exclude\"), [createGlobString(normalizePath(process.cwd()), \"a\")]);\n    });\n\n    test(\n        \"Works with array options passed multiple times\",\n        [\"--exclude\", \"a\", \"--exclude\", \"b\"],\n        () => {\n            equal(options.getValue(\"exclude\"), [\n                createGlobString(normalizePath(process.cwd()), \"a\"),\n                createGlobString(normalizePath(process.cwd()), \"b\"),\n            ]);\n        },\n    );\n\n    it(\"Errors if given an unknown option\", async () => {\n        const similarOptions = options.getSimilarOptions(\"badOption\");\n        const reader = new ArgumentsReader(1, [\"--badOption\"]);\n        options.reset();\n        options.addReader(reader);\n        await options.read(logger);\n        logger.expectMessage(\n            `error: Unknown option: --badOption, you may have meant:\\n\\t${\n                similarOptions.join(\n                    \"\\n\\t\",\n                )\n            }`,\n        );\n    });\n\n    it(\"Warns if option is expecting a value but no value is provided\", async () => {\n        const reader = new ArgumentsReader(1, [\"--out\"]);\n        options.reset();\n        options.addReader(reader);\n        const logger = new TestLogger();\n        await options.read(logger);\n        logger.expectMessage(\n            \"warn: --out expected a value, but none was given as an argument\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    test(\n        \"Works with flag values without specifying a value\",\n        [\"--validation.invalidLink\"],\n        () => {\n            equal(logger.hasErrors(), false);\n            equal(logger.hasWarnings(), false);\n            equal(options.getValue(\"validation\"), {\n                notExported: true,\n                notDocumented: false,\n                invalidLink: true,\n                invalidPath: true,\n                rewrittenLink: true,\n                unusedMergeModuleWith: true,\n            });\n        },\n    );\n\n    test(\n        \"Works with flag values with specifying a value\",\n        [\n            \"--validation.invalidLink\",\n            \"true\",\n            \"--validation.notExported\",\n            \"false\",\n        ],\n        () => {\n            equal(logger.hasErrors(), false);\n            equal(logger.hasWarnings(), false);\n            equal(options.getValue(\"validation\"), {\n                notExported: false,\n                notDocumented: false,\n                invalidLink: true,\n                invalidPath: true,\n                rewrittenLink: true,\n                unusedMergeModuleWith: true,\n            });\n        },\n    );\n\n    test(\n        \"Works with flag values without specifying a specific flag\",\n        [\"--validation\"],\n        () => {\n            equal(logger.hasErrors(), false);\n            equal(logger.hasWarnings(), false);\n            equal(options.getValue(\"validation\"), {\n                notExported: true,\n                notDocumented: true,\n                invalidLink: true,\n                invalidPath: true,\n                rewrittenLink: true,\n                unusedMergeModuleWith: true,\n            });\n        },\n    );\n\n    test(\n        \"Works with flag values without specifying a specific flag and setting true\",\n        [\"--validation\", \"true\"],\n        () => {\n            equal(logger.hasErrors(), false);\n            equal(logger.hasWarnings(), false);\n            equal(options.getValue(\"validation\"), {\n                notExported: true,\n                notDocumented: true,\n                invalidLink: true,\n                invalidPath: true,\n                rewrittenLink: true,\n                unusedMergeModuleWith: true,\n            });\n        },\n    );\n\n    test(\n        \"Works with flag values without specifying a specific flag and setting false\",\n        [\"--validation\", \"false\"],\n        () => {\n            equal(logger.hasErrors(), false);\n            equal(logger.hasWarnings(), false);\n            equal(options.getValue(\"validation\"), {\n                notExported: false,\n                notDocumented: false,\n                invalidLink: false,\n                invalidPath: false,\n                rewrittenLink: false,\n                unusedMergeModuleWith: false,\n            });\n        },\n    );\n});\n"
  },
  {
    "path": "src/test/utils/options/readers/package-json.test.ts",
    "content": "import { project } from \"@typestrong/fs-fixture-builder\";\n\nimport { PackageJsonReader } from \"../../../../lib/utils/options/readers/index.js\";\nimport { Options } from \"../../../../lib/utils/index.js\";\nimport { TestLogger } from \"../../../TestLogger.js\";\n\ndescribe(\"Options - PackageJsonReader\", () => {\n    let optsContainer: Options;\n    let testLogger: TestLogger;\n\n    beforeEach(() => {\n        optsContainer = new Options();\n        testLogger = new TestLogger();\n\n        optsContainer.addReader(new PackageJsonReader());\n    });\n\n    it(\"Does not error if no package.json file is found\", async () => {\n        await optsContainer.read(testLogger, \"/does-not-exist\");\n        testLogger.expectNoOtherMessages();\n    });\n\n    function testLogs(\n        testTitle: string,\n        pkgJsonContent: string,\n        test: (logger: TestLogger) => void,\n    ): void {\n        it(testTitle, async () => {\n            const proj = project(testTitle.replace(/[ \"]/g, \"_\"));\n            proj.addFile(\"package.json\", pkgJsonContent);\n            proj.write();\n            after(() => proj.rm());\n\n            await optsContainer.read(testLogger, proj.cwd);\n\n            test(testLogger);\n            testLogger.expectNoOtherMessages();\n        });\n    }\n\n    testLogs(\n        `Does not error if typedocOptions is not present`,\n        `{ \"name\": \"x\" }`,\n        () => {},\n    );\n\n    testLogs(\n        `Errors if the \"typedocOptions\" field is set but does not contain an object`,\n        `{ \"name\": \"x\", \"typedocOptions\": 123 }`,\n        (l) =>\n            l.expectMessage(\n                `error: Failed to parse the \"typedocOptions\" field in */package.json, ensure it exists and contains an object`,\n            ),\n    );\n\n    testLogs(\n        \"Errors if setting any option errors\",\n        `{ \"name\": \"x\", \"typedocOptions\": { \"someOptionThatDoesNotExist\": true } }`,\n        (l) =>\n            l.expectMessage(\n                \"error: Unknown option 'someOptionThatDoesNotExist' You may have meant:*\",\n            ),\n    );\n\n    testLogs(\n        \"Warns if the legacy-packages 'typedoc' key is present\",\n        `{ \"name\": \"x\", \"typedoc\": {} }`,\n        (l) =>\n            l.expectMessage(\n                \"warn: The 'typedoc' key in */package.json was used by the legacy-packages entryPointStrategy and will be ignored\",\n            ),\n    );\n});\n"
  },
  {
    "path": "src/test/utils/options/readers/tsconfig.test.ts",
    "content": "import { basename, join } from \"path\";\nimport { deepStrictEqual as equal } from \"assert\";\n\nimport { normalizePath, Options, TSConfigReader } from \"#node-utils\";\nimport { TestLogger } from \"../../../TestLogger.js\";\nimport { type Project, tempdirProject } from \"@typestrong/fs-fixture-builder\";\nimport { tmpdir } from \"os\";\nimport { fileURLToPath } from \"url\";\n\ndescribe(\"Options - TSConfigReader\", () => {\n    const options = new Options();\n    options.addReader(new TSConfigReader());\n    const logger = new TestLogger();\n\n    async function readWithProject(\n        project: Project,\n        reset = true,\n        noErrors = true,\n    ) {\n        if (reset) {\n            options.reset();\n        }\n        logger.reset();\n        options.setValue(\"tsconfig\", normalizePath(project.cwd));\n        project.addFile(\"temp.ts\", \"export {}\");\n        project.write();\n        await options.read(logger);\n        if (noErrors) {\n            logger.expectNoOtherMessages();\n        }\n    }\n\n    it(\"Errors if the file cannot be found\", async () => {\n        options.reset();\n        logger.reset();\n\n        options.setValue(\n            \"tsconfig\",\n            normalizePath(join(tmpdir(), \"typedoc/does-not-exist.json\")),\n        );\n        await options.read(logger);\n        logger.expectMessage(\"error: *\");\n    });\n\n    function testError(name: string, file: object) {\n        it(name, async () => {\n            using project = tempdirProject();\n            project.addJsonFile(\"tsconfig.json\", file);\n            await readWithProject(project, true, false);\n            equal(logger.hasErrors(), true, \"No error was logged\");\n        });\n    }\n\n    testError(\"Errors if the data is invalid\", {\n        typedocOptions: \"Will cause an error\",\n    });\n\n    testError(\"Errors if any set option errors\", {\n        typedocOptions: {\n            someOptionThatDoesNotExist: true,\n        },\n    });\n\n    testError(\"Errors if tsconfig tries to set options file\", {\n        typedocOptions: {\n            options: \"any\",\n        },\n    });\n\n    testError(\"Errors if tsconfig tries to set tsconfig file\", {\n        typedocOptions: {\n            tsconfig: \"any\",\n        },\n    });\n\n    it(\"Errors if a tsconfig file cannot be parsed\", async () => {\n        using project = tempdirProject();\n        project.addFile(\"tsconfig.json\", '{\"test}');\n        await readWithProject(project, true, false);\n        logger.expectMessage(\"error: *\");\n    });\n\n    it(\"Does not error if the option file cannot be found but was not set.\", async () => {\n        const logger = new TestLogger();\n\n        const options = new (class LyingOptions extends Options {\n            override isSet() {\n                return false;\n            }\n        })();\n\n        options.setValue(\n            \"tsconfig\",\n            normalizePath(join(fileURLToPath(import.meta.url), \"../data/does_not_exist.json\")),\n        );\n        options.addReader(new TSConfigReader());\n        await options.read(logger);\n        equal(logger.hasErrors(), false);\n    });\n\n    it(\"Reads typedocOptions from extended tsconfig files\", async () => {\n        using project = tempdirProject();\n        project.addFile(\"file.ts\", \"export const abc = 123\");\n        project.addJsonFile(\"tsconfig.json\", {\n            extends: [\"./base.tsconfig.json\"],\n            files: [\"./file.ts\"],\n            typedocOptions: { plugin: [\"a\"] },\n        });\n        project.addJsonFile(\"base.tsconfig.json\", {\n            typedocOptions: { name: \"a\", plugin: [\"b\"] },\n        });\n\n        await readWithProject(project);\n        logger.expectNoOtherMessages();\n        equal(options.getValue(\"name\"), \"a\");\n        equal(options.getValue(\"plugin\"), [\"a\"]);\n    });\n\n    async function readTsconfig(tsconfig: object) {\n        using project = tempdirProject();\n        project.addFile(\"file.ts\", \"export const abc = 123\");\n        project.addJsonFile(\"tsconfig.json\", tsconfig);\n\n        await readWithProject(project);\n        logger.expectNoOtherMessages();\n    }\n\n    it(\"Sets files for the program\", async () => {\n        await readTsconfig({\n            files: [\"./file.ts\"],\n        });\n        equal(\n            options.getFileNames().map((f) => basename(f)),\n            [\"file.ts\"],\n        );\n    });\n\n    it(\"Allows stripInternal to set excludeInternal\", async () => {\n        await readTsconfig({\n            compilerOptions: {\n                stripInternal: true,\n            },\n        });\n        equal(options.getValue(\"excludeInternal\"), true);\n    });\n\n    it(\"Does not set excludeInternal by stripInternal if already set\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"tsconfig.json\", {\n            compilerOptions: { stripInternal: true },\n        });\n\n        options.reset();\n        options.setValue(\"excludeInternal\", false);\n        await readWithProject(project, false);\n        equal(options.getValue(\"excludeInternal\"), false);\n    });\n\n    it(\"Correctly handles folder names ending with .json (#1712)\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"tsconfig.json\", {\n            compilerOptions: { strict: true },\n        });\n        await readWithProject(project);\n        equal(options.getCompilerOptions(logger).strict, true);\n    });\n\n    async function testTsdoc(tsdoc: object, cb?: () => void, reset = true) {\n        using project = tempdirProject();\n        project.addFile(\"file.ts\", \"export const abc = 123\");\n        project.addJsonFile(\"tsconfig.json\", {});\n        project.addJsonFile(\"tsdoc.json\", tsdoc);\n\n        await readWithProject(project, reset, false);\n        cb?.();\n        logger.expectNoOtherMessages();\n    }\n\n    it(\"Handles failed tsdoc reads\", async () => {\n        await testTsdoc([], () => {\n            logger.expectMessage(\n                \"error: Failed to read tsdoc.json file at */tsdoc.json\",\n            );\n        });\n    });\n\n    it(\"Handles invalid tsdoc files\", async () => {\n        await testTsdoc(\n            {\n                doesNotMatchSchema: true,\n            },\n            () => {\n                logger.expectMessage(\n                    `error: The file */tsdoc.json is not a valid tsdoc.json file`,\n                );\n            },\n        );\n    });\n\n    it(\"Warns if an option will be overwritten\", async () => {\n        options.reset();\n        options.setValue(\"blockTags\", []);\n        options.setValue(\"modifierTags\", []);\n        await testTsdoc(\n            {},\n            () => {\n                logger.expectMessage(\n                    \"warn: The blockTags, modifierTags defined in typedoc.json \" +\n                        \"will be overwritten by configuration in tsdoc.json\",\n                );\n            },\n            false,\n        );\n    });\n\n    it(\"Reads tsdoc.json\", async () => {\n        await testTsdoc({\n            noStandardTags: true,\n            tagDefinitions: [\n                {\n                    tagName: \"@tag\",\n                    syntaxKind: \"block\",\n                },\n                {\n                    tagName: \"@tag2\",\n                    syntaxKind: \"inline\",\n                },\n                {\n                    tagName: \"@tag3\",\n                    syntaxKind: \"modifier\",\n                },\n            ],\n        });\n\n        equal(options.getValue(\"blockTags\"), [\"@tag\"]);\n        equal(options.getValue(\"inlineTags\"), [\"@tag2\"]);\n        equal(options.getValue(\"modifierTags\"), [\"@tag3\"]);\n    });\n\n    it(\"Handles extends in tsdoc.json\", async () => {\n        using project = tempdirProject();\n        project.addFile(\"file.ts\", \"export const abc = 123\");\n        project.addJsonFile(\"tsconfig.json\", {});\n        project.addJsonFile(\"tsdoc.json\", { extends: [\"./tsdoc2.json\"] });\n        project.addJsonFile(\"tsdoc2.json\", {\n            noStandardTags: true,\n            tagDefinitions: [\n                {\n                    tagName: \"@tag\",\n                    syntaxKind: \"block\",\n                },\n            ],\n        });\n\n        await readWithProject(project);\n        equal(options.getValue(\"blockTags\"), [\"@tag\"]);\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Handles supportForTags in tsdoc.json\", async () => {\n        await testTsdoc({\n            noStandardTags: true,\n            tagDefinitions: [\n                {\n                    tagName: \"@tag\",\n                    syntaxKind: \"block\",\n                },\n                {\n                    tagName: \"@tag2\",\n                    syntaxKind: \"inline\",\n                },\n                {\n                    tagName: \"@tag3\",\n                    syntaxKind: \"modifier\",\n                },\n            ],\n            supportForTags: {\n                \"@tag\": true,\n            },\n        });\n\n        equal(options.getValue(\"blockTags\"), [\"@tag\"]);\n        equal(options.getValue(\"inlineTags\"), []);\n        equal(options.getValue(\"modifierTags\"), []);\n    });\n\n    it(\"Handles circular extends\", async () => {\n        await testTsdoc(\n            {\n                extends: [\"./tsdoc.json\"],\n            },\n            () => {\n                logger.expectMessage(\n                    'error: Circular reference encountered for \"extends\" field of */tsdoc.json',\n                );\n            },\n        );\n    });\n\n    it(\"Handles extends which reference invalid files\", async () => {\n        await testTsdoc(\n            {\n                extends: [\"typedoc/nope\"],\n            },\n            () => {\n                logger.expectMessage(\n                    \"error: Failed to resolve typedoc/nope to a file in */tsdoc.json\",\n                );\n            },\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/readers/typedoc.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { project as fsProject } from \"@typestrong/fs-fixture-builder\";\n\nimport { normalizePath, Options, TypeDocReader } from \"#node-utils\";\nimport { TestLogger } from \"../../../TestLogger.js\";\nimport { join } from \"path\";\n\ndescribe(\"Options - TypeDocReader\", () => {\n    const options = new Options();\n    options.addReader(new TypeDocReader());\n\n    it(\"Supports comments in json\", async () => {\n        const project = fsProject(\"jsonc\");\n        after(() => project.rm());\n\n        project.addFile(\"typedoc.json\", '//comment\\n{\"name\": \"comment\"}');\n        const logger = new TestLogger();\n\n        project.write();\n        options.reset();\n        options.setValue(\"options\", normalizePath(project.cwd));\n        await options.read(logger);\n\n        logger.expectNoOtherMessages();\n        equal(options.getValue(\"name\"), \"comment\");\n    });\n\n    it(\"Supports extends\", async () => {\n        const project = fsProject(\"extends\");\n        project.addJsonFile(\"typedoc.json\", {\n            extends: \"./other.json\",\n            name: \"extends\",\n        });\n        project.addJsonFile(\"other.json\", {\n            gitRevision: \"master\",\n        });\n        const logger = new TestLogger();\n\n        project.write();\n        after(() => project.rm());\n        options.reset();\n        options.setValue(\"options\", normalizePath(project.cwd));\n        await options.read(logger);\n\n        logger.expectNoOtherMessages();\n        equal(options.getValue(\"name\"), \"extends\");\n        equal(options.getValue(\"gitRevision\"), \"master\");\n    });\n\n    it(\"Supports CommonJS files\", async () => {\n        const project = fsProject(\"js\");\n        project.addFile(\"typedoc.cjs\", \"module.exports = { name: 'js' }\");\n        const logger = new TestLogger();\n\n        project.write();\n        options.reset();\n        options.setValue(\"options\", normalizePath(project.cwd));\n        await options.read(logger);\n        project.rm();\n\n        logger.expectNoOtherMessages();\n        equal(options.getValue(\"name\"), \"js\");\n    });\n\n    it(\"Supports ESM files\", async () => {\n        const project = fsProject(\"js\");\n        project.addFile(\"typedoc.mjs\", \"export default { name: 'js' }\");\n        const logger = new TestLogger();\n\n        project.write();\n        after(() => project.rm());\n        options.reset();\n        options.setValue(\"options\", normalizePath(project.cwd));\n        await options.read(logger);\n\n        logger.expectNoOtherMessages();\n        equal(options.getValue(\"name\"), \"js\");\n    });\n\n    it(\"Errors if the file cannot be found\", async () => {\n        options.reset();\n        options.setValue(\"options\", normalizePath(\"./non-existent-file.json\"));\n        const logger = new TestLogger();\n        await options.read(logger);\n        logger.expectMessage(\n            \"error: The options file */non-existent-file.json does not exist\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    function testError(\n        name: string,\n        file: unknown,\n        message: string,\n        json = true,\n    ) {\n        it(name, async () => {\n            const optionsFile = json ? \"typedoc.json\" : \"typedoc.js\";\n            const project = fsProject(name.replace(/ /g, \"_\"));\n            if (typeof file === \"string\") {\n                project.addFile(optionsFile, file);\n            } else {\n                project.addJsonFile(optionsFile, file);\n            }\n\n            options.reset();\n            options.setValue(\"options\", normalizePath(project.cwd));\n            const logger = new TestLogger();\n            project.write();\n            after(() => project.rm());\n            await options.read(logger);\n            logger.expectMessage(message);\n        });\n    }\n\n    testError(\n        \"Errors if the data is invalid\",\n        \"Not valid json {}\",\n        \"error: Failed to parse */typedoc.json, ensure it exists and exports an object\",\n    );\n    testError(\n        \"Errors if the data is not an object in a json file\",\n        123,\n        \"error: Failed to parse */typedoc.json, ensure it exists and exports an object\",\n    );\n    testError(\n        \"Errors if the data is not an object in a js file\",\n        \"module.exports = 123\",\n        \"error: Failed to parse */typedoc.js, ensure it exists and exports an object\",\n        false,\n    );\n    testError(\n        \"Errors if any set option errors\",\n        {\n            someOptionThatDoesNotExist: true,\n        },\n        \"error: Unknown option 'someOptionThatDoesNotExist' You may have meant:*\",\n    );\n    testError(\n        \"Errors if extends results in a loop\",\n        {\n            extends: \"./typedoc.json\",\n        },\n        'error: Circular reference encountered for \"extends\" field of *',\n    );\n    testError(\n        \"Errors if the extended path cannot be found\",\n        {\n            extends: \"typedoc/nope\",\n        },\n        \"error: Failed to resolve typedoc/nope to a file in */typedoc.json\",\n    );\n\n    it(\"Does not error if the option file cannot be found but was not set.\", async () => {\n        const options = new (class LyingOptions extends Options {\n            override isSet() {\n                return false;\n            }\n        })();\n\n        options.addReader(new TypeDocReader());\n        const logger = new TestLogger();\n        await options.read(logger);\n        equal(logger.hasErrors(), false);\n    });\n\n    it(\"Handles ESM config files\", async () => {\n        const project = fsProject(\"esm-config\");\n        project.addFile(\n            \"typedoc.config.mjs\",\n            \"export default { pretty: false }\",\n        );\n        project.write();\n        after(() => project.rm());\n\n        const logger = new TestLogger();\n        const options = new Options();\n        options.setValue(\"options\", normalizePath(join(project.cwd, \"typedoc.config.mjs\")));\n        options.addReader(new TypeDocReader());\n        await options.read(logger);\n        equal(logger.hasErrors(), false);\n    });\n\n    it(\"Handles errors when reading config files\", async () => {\n        const project = fsProject(\"errors\");\n        project.addFile(\"typedoc.config.mjs\", \"throw new Error('hi')\");\n        project.write();\n        after(() => project.rm());\n\n        const logger = new TestLogger();\n        const options = new Options();\n        options.setValue(\"options\", normalizePath(join(project.cwd, \"typedoc.config.mjs\")));\n        options.addReader(new TypeDocReader());\n        await options.read(logger);\n\n        logger.expectMessage(\n            \"error: Failed to parse */typedoc.config.mjs, ensure it exists and exports an object\",\n        );\n        logger.expectMessage(\"error: hi\");\n    });\n\n    it(\"Handles non-Error throws when reading config files\", async () => {\n        const project = fsProject(\"errors2\");\n        project.addFile(\"typedoc.config.cjs\", \"throw 123\");\n        project.write();\n        after(() => project.rm());\n\n        const logger = new TestLogger();\n        const options = new Options();\n        options.setValue(\"options\", normalizePath(join(project.cwd, \"typedoc.config.cjs\")));\n        options.addReader(new TypeDocReader());\n        await options.read(logger);\n\n        logger.expectMessage(\n            \"error: Failed to parse */typedoc.config.cjs, ensure it exists and exports an object\",\n        );\n        logger.expectMessage(\"error: 123\");\n    });\n});\n"
  },
  {
    "path": "src/test/utils/options/tsdoc-defaults.test.ts",
    "content": "import { deepEqual as equal } from \"assert/strict\";\nimport { join } from \"path\";\nimport ts from \"typescript\";\nimport * as defaults from \"../../../lib/utils/options/tsdoc-defaults.js\";\nimport { fileURLToPath } from \"url\";\nimport { TYPEDOC_ROOT } from \"../../../lib/utils/general.js\";\nimport { readFile } from \"../../../lib/utils/fs.js\";\n\ndescribe(\"tsdoc-defaults.ts\", () => {\n    const tsdoc = ts.readConfigFile(\n        join(fileURLToPath(import.meta.url), \"../../../../../tsdoc.json\"),\n        ts.sys.readFile,\n    );\n    const tagDefinitions = tsdoc.config?.tagDefinitions as Array<{\n        tagName: string;\n        syntaxKind: \"block\" | \"modifier\" | \"inline\";\n    }>;\n\n    function tagsByKind(kind: \"block\" | \"modifier\" | \"inline\") {\n        return tagDefinitions\n            .filter((t) => t.syntaxKind === kind)\n            .map((t) => t.tagName)\n            .sort((a, b) => a.localeCompare(b));\n    }\n\n    before(() => {\n        equal(tsdoc.error, undefined);\n    });\n\n    it(\"Should expose the same block tags as the tsdoc.json file\", () => {\n        const tsdocTags = tagsByKind(\"block\");\n\n        const typedocTags = defaults.blockTags\n            .filter((t) => !defaults.tsdocBlockTags.includes(t as never))\n            .sort((a, b) => a.localeCompare(b));\n\n        // @inheritDoc is a special case. We can't specify it in the tsdoc.json\n        // or the official parser blows up, because it thinks that it is only\n        // an inline tag.\n        typedocTags.splice(typedocTags.indexOf(\"@inheritDoc\"), 1);\n\n        equal(tsdocTags, typedocTags);\n    });\n\n    it(\"Should expose the same modifier tags as the tsdoc.json file\", () => {\n        const tsdocTags = tagsByKind(\"modifier\");\n\n        const typedocTags = defaults.modifierTags\n            .filter((t) => !defaults.tsdocModifierTags.includes(t as never))\n            .sort((a, b) => a.localeCompare(b));\n\n        equal(tsdocTags, typedocTags);\n    });\n\n    it(\"Should expose the same inline tags as the tsdoc.json file\", () => {\n        const tsdocTags = tagsByKind(\"inline\");\n\n        const typedocTags = defaults.inlineTags\n            .filter((t) => !defaults.tsdocInlineTags.includes(t as never))\n            .sort((a, b) => a.localeCompare(b));\n\n        equal(tsdocTags, typedocTags);\n    });\n\n    const allDocumentedTags = getDocumentedTags();\n\n    it(\"Should only include block tags which are documented on the website\", () => {\n        const tags: string[] = [...defaults.blockTags].sort();\n        const documentedTags = allDocumentedTags\n            .filter((tag) => tags.includes(tag))\n            .sort();\n        equal(tags, documentedTags);\n    });\n\n    it(\"Should only include modifier tags which are documented on the website\", () => {\n        const tags: string[] = [...defaults.modifierTags].sort();\n        const documentedTags = allDocumentedTags\n            .filter((tag) => tags.includes(tag))\n            .sort();\n        equal(tags, documentedTags);\n    });\n\n    it(\"Should only include inline tags which are documented on the website\", () => {\n        const tags: string[] = [...defaults.inlineTags].sort();\n        const documentedTags = allDocumentedTags\n            .filter((tag) => tags.includes(tag))\n            .sort();\n        equal(tags, documentedTags);\n    });\n});\n\nfunction getDocumentedTags() {\n    const text = readFile(TYPEDOC_ROOT + \"/site/tags.md\");\n    const tags: string[] = [];\n\n    for (const line of text.split(\"\\n\")) {\n        if (line.startsWith(\"- [\")) {\n            tags.push(...Array.from(line.matchAll(/(@\\w+)/g), (m) => m[1]));\n        }\n    }\n\n    return tags;\n}\n"
  },
  {
    "path": "src/test/utils/paths.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { createGlobString, getCommonDirectory, normalizePath, splitGlobToPathAndSpecial } from \"#node-utils\";\nimport type { NormalizedPath } from \"#utils\";\n\ndescribe(\"paths.ts\", () => {\n    describe(\"splitGlobToPathAndSpecial\", () => {\n        it(\"Returns the entire glob as path if there are no special parts\", () => {\n            equal(splitGlobToPathAndSpecial(\"\"), { modifiers: \"\", path: \"\", glob: \"\" });\n            equal(splitGlobToPathAndSpecial(\"src/test.ts\"), { modifiers: \"\", path: \"src/test.ts\", glob: \"\" });\n        });\n\n        it(\"Splits the glob based on stars\", () => {\n            equal(splitGlobToPathAndSpecial(\"src/*.test.ts\"), { modifiers: \"\", path: \"src\", glob: \"*.test.ts\" });\n            equal(splitGlobToPathAndSpecial(\"*.test.ts\"), { modifiers: \"\", path: \"\", glob: \"*.test.ts\" });\n        });\n\n        it(\"Splits the glob based on brackets\", () => {\n            equal(splitGlobToPathAndSpecial(\"src/[ui]/*.test.ts\"), {\n                modifiers: \"\",\n                path: \"src\",\n                glob: \"[ui]/*.test.ts\",\n            });\n        });\n\n        it(\"Handles globs with brace expansion\", () => {\n            equal(splitGlobToPathAndSpecial(\"{a,b}/*.ts\"), { modifiers: \"\", path: \"\", glob: \"{a,b}/*.ts\" });\n        });\n\n        it(\"Handles commented globs\", () => {\n            equal(splitGlobToPathAndSpecial(\"#{a,b}/*.ts\"), { modifiers: \"#\", path: \"\", glob: \"{a,b}/*.ts\" });\n            equal(splitGlobToPathAndSpecial(\"#src/*.ts\"), { modifiers: \"#\", path: \"src\", glob: \"*.ts\" });\n            equal(splitGlobToPathAndSpecial(\"#src/index.ts\"), { modifiers: \"#\", path: \"src/index.ts\", glob: \"\" });\n        });\n\n        it(\"Handles escaped glob parts\", () => {\n            equal(splitGlobToPathAndSpecial(\"src/\\\\[ui\\\\]/*.ts\"), {\n                modifiers: \"\",\n                path: \"src/[ui]\",\n                glob: \"*.ts\",\n            });\n\n            equal(splitGlobToPathAndSpecial(\"src/\\\\[ui]/*.ts\"), {\n                modifiers: \"\",\n                path: \"src/[ui]\",\n                glob: \"*.ts\",\n            });\n        });\n\n        it(\"Handles escaped glob parts with braces\", () => {\n            equal(splitGlobToPathAndSpecial(\"src/{\\\\[ui\\\\],abc}/*.ts\"), {\n                modifiers: \"\",\n                path: \"src\",\n                glob: \"{\\\\[ui\\\\]/*.ts,abc/*.ts}\",\n            });\n        });\n    });\n\n    describe(\"createGlobString\", () => {\n        it(\"Handles global globs\", () => {\n            equal(createGlobString(\"/d/test/typedoc\" as NormalizedPath, \"**/abc/*.ts\"), \"**/abc/*.ts\");\n        });\n\n        it(\"Handles negated global globs\", () => {\n            equal(createGlobString(\"/d/test/typedoc\" as NormalizedPath, \"!**/abc/*.ts\"), \"!**/abc/*.ts\");\n        });\n\n        it(\"Handles commented global globs\", () => {\n            equal(createGlobString(\"/d/test/typedoc\" as NormalizedPath, \"#**/abc/*.ts\"), \"#**/abc/*.ts\");\n        });\n\n        it(\"Handles file paths\", () => {\n            if (process.platform == \"win32\") {\n                equal(\n                    createGlobString(\"C:/test/typedoc\" as NormalizedPath, \"src/index.ts\"),\n                    \"C:/test/typedoc/src/index.ts\",\n                );\n            } else {\n                equal(\n                    createGlobString(\"/test/typedoc\" as NormalizedPath, \"src/index.ts\"),\n                    \"/test/typedoc/src/index.ts\",\n                );\n            }\n        });\n    });\n\n    describe(\"getCommonDirectory\", () => {\n        it(\"Returns the empty string if no files are provided\", () => {\n            equal(getCommonDirectory([]), \"\");\n        });\n\n        it(\"Returns the dirname if only one file is provided\", () => {\n            equal(getCommonDirectory([\"a/b/c.ts\"]), \"a/b\");\n        });\n\n        it(\"Handles duplicates paths appropriately\", () => {\n            const p = \"a/b/c\";\n            equal(getCommonDirectory([p, p]), p);\n        });\n\n        it(\"Gets the path common to all files\", () => {\n            equal(\n                getCommonDirectory([\"/a/b/c\", \"/a/b/c/d/e\", \"/a/b/d\"]),\n                \"/a/b\",\n            );\n        });\n\n        it(\"Does not respect Windows path separator, #2825\", () => {\n            equal(getCommonDirectory([\"/a/b\\\\]/c\", \"/a/b\\\\]/d\"]), \"/a/b\\\\]\");\n        });\n    });\n\n    describe(\"normalizePath\", () => {\n        const winTest = process.platform === \"win32\" ? it : it.skip;\n        const nixTest = process.platform === \"win32\" ? it.skip : it;\n\n        winTest(\"Returns paths with forward slashes\", () => {\n            equal(\n                normalizePath(\"test\\\\test\\\\another/forward\"),\n                \"test/test/another/forward\",\n            );\n        });\n\n        winTest(\"Normalizes drive letters\", () => {\n            equal(normalizePath(\"c:\\\\foo\"), \"C:/foo\");\n            equal(normalizePath(\"D:/foo\"), \"D:/foo\");\n        });\n\n        winTest(\"Checks for unix style paths\", () => {\n            equal(normalizePath(\"/c/users/you\"), \"C:/users/you\");\n        });\n\n        nixTest(\"Returns the original path\", () => {\n            equal(normalizePath(\"/c/users\\\\foo\"), \"/c/users\\\\foo\");\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/utils/plugins.test.ts",
    "content": "import { tempdirProject } from \"@typestrong/fs-fixture-builder\";\nimport { type Application, normalizePath } from \"../../index.js\";\nimport { loadPlugins } from \"../../lib/utils/plugins.js\";\nimport { TestLogger } from \"../TestLogger.js\";\nimport { join, resolve } from \"path\";\nimport { deepStrictEqual as equal } from \"assert/strict\";\n\ndescribe(\"loadPlugins\", () => {\n    let logger: TestLogger;\n    const fakeApp = {} as any as Application;\n    beforeEach(() => {\n        logger = fakeApp.logger = new TestLogger();\n    });\n\n    it(\"Should support loading a CJS plugin with directory target\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"package.json\", {\n            type: \"commonjs\",\n            main: \"index.js\",\n        });\n        project.addFile(\"index.js\", \"exports.load = function load() {}\");\n        project.write();\n\n        const plugin = normalizePath(resolve(project.cwd, \"index.js\"));\n        await loadPlugins(fakeApp, [plugin]);\n        logger.expectMessage(`info: Loaded plugin ${plugin}`);\n    });\n\n    it(\"Should support loading a CJS plugin with full path\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"package.json\", {\n            type: \"commonjs\",\n            main: \"index.js\",\n        });\n        const plugin = normalizePath(\n            project.addFile(\n                \"index.js\",\n                \"exports.load = function load() {}\",\n            ).path,\n        );\n        project.write();\n\n        await loadPlugins(fakeApp, [plugin]);\n        logger.expectMessage(`info: Loaded plugin ${plugin}`);\n    });\n\n    it(\"Should support loading a ESM plugin\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"package.json\", {\n            type: \"module\",\n            main: \"index.js\",\n        });\n        project.addFile(\"index.js\", \"export function load() {}\");\n        project.write();\n\n        const plugin = normalizePath(join(resolve(project.cwd), \"index.js\"));\n        await loadPlugins(fakeApp, [plugin]);\n        logger.expectMessage(`info: Loaded plugin ${plugin}`);\n    });\n\n    it(\"Should support loading a function plugin\", async () => {\n        let called = false as boolean;\n        function testFn() {\n            called = true;\n        }\n        await loadPlugins(fakeApp, [testFn]);\n        logger.expectMessage(`info: Loaded plugin testFn`);\n        equal(called, true);\n    });\n\n    it(\"Should handle errors when requiring plugins\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"package.json\", {\n            type: \"commonjs\",\n            main: \"index.js\",\n        });\n        project.addFile(\"index.js\", \"throw Error('bad')\");\n        project.write();\n\n        const plugin = normalizePath(join(resolve(project.cwd), \"index.js\"));\n        await loadPlugins(fakeApp, [plugin]);\n        logger.expectMessage(`error: The plugin ${plugin} could not be loaded`);\n    });\n\n    it(\"Should handle errors when loading plugins\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"package.json\", {\n            type: \"commonjs\",\n            main: \"index.js\",\n        });\n        project.addFile(\n            \"index.js\",\n            \"exports.load = function load() { throw Error('bad') }\",\n        );\n        project.write();\n\n        const plugin = normalizePath(join(resolve(project.cwd), \"index.js\"));\n        await loadPlugins(fakeApp, [plugin]);\n        logger.expectMessage(`error: The plugin ${plugin} could not be loaded`);\n    });\n\n    it(\"Should handle plugins without a load method\", async () => {\n        using project = tempdirProject();\n        project.addJsonFile(\"package.json\", {\n            type: \"commonjs\",\n            main: \"index.js\",\n        });\n        project.addFile(\"index.js\", \"\");\n        project.write();\n\n        const plugin = normalizePath(join(resolve(project.cwd), \"index.js\"));\n        await loadPlugins(fakeApp, [plugin]);\n        logger.expectMessage(\n            `error: Invalid structure in plugin ${plugin}, no load function found`,\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/utils/sort.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport {\n    DeclarationReflection,\n    DocumentReflection,\n    LiteralType,\n    ProjectReflection,\n    ReflectionFlag,\n    ReflectionKind,\n    ReflectionSymbolId,\n} from \"../../lib/models/index.js\";\nimport { resetReflectionID } from \"../../lib/models/Reflection.js\";\nimport { Options } from \"../../lib/utils/index.js\";\nimport { getSortFunction, type SortStrategy } from \"../../lib/utils/sort.js\";\nimport { FileRegistry } from \"../../lib/models/FileRegistry.js\";\nimport type { NormalizedPath } from \"#utils\";\n\ndescribe(\"Sort\", () => {\n    function sortReflections(\n        arr: Array<DeclarationReflection | DocumentReflection>,\n        strategies: SortStrategy[],\n    ) {\n        const opts = new Options();\n        opts.setValue(\"sort\", strategies);\n        getSortFunction(opts)(arr);\n    }\n\n    it(\"Should sort by name\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.TypeAlias),\n            new DeclarationReflection(\"c\", ReflectionKind.TypeAlias),\n            new DeclarationReflection(\"b\", ReflectionKind.TypeAlias),\n        ];\n\n        sortReflections(arr, [\"alphabetical\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"b\", \"c\"],\n        );\n    });\n\n    it(\"Should sort by enum value ascending\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"b\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"c\", ReflectionKind.EnumMember),\n        ];\n        arr[0].type = new LiteralType(123);\n        arr[1].type = new LiteralType(12);\n        arr[2].type = new LiteralType(3);\n\n        sortReflections(arr, [\"enum-value-ascending\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"c\", \"b\", \"a\"],\n        );\n    });\n\n    it(\"Should not sort enum value ascending if not an enum member\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"c\", ReflectionKind.EnumMember),\n        ];\n        arr[0].type = new LiteralType(123);\n        arr[1].type = new LiteralType(12);\n        arr[2].type = new LiteralType(3);\n\n        sortReflections(arr, [\"enum-value-ascending\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"c\", \"b\"],\n        );\n    });\n\n    it(\"Should sort by enum value descending\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"b\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"c\", ReflectionKind.EnumMember),\n        ];\n        arr[0].type = new LiteralType(123);\n        arr[1].type = new LiteralType(12);\n        arr[2].type = new LiteralType(3);\n\n        sortReflections(arr, [\"enum-value-descending\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"b\", \"c\"],\n        );\n    });\n\n    it(\"Should not sort enum value descending if not an enum member\", () => {\n        const arr = [\n            new DeclarationReflection(\"c\", ReflectionKind.Function),\n            new DeclarationReflection(\"a\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"b\", ReflectionKind.EnumMember),\n        ];\n        arr[0].type = new LiteralType(123);\n        arr[1].type = new LiteralType(-1);\n        arr[2].type = new LiteralType(3);\n\n        sortReflections(arr, [\"enum-value-descending\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"c\", \"b\", \"a\"],\n        );\n    });\n\n    it(\"Should sort by static first\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.Function),\n            new DeclarationReflection(\"c\", ReflectionKind.Function),\n        ];\n        arr[0].setFlag(ReflectionFlag.Static, true);\n        arr[1].setFlag(ReflectionFlag.Static, false);\n        arr[2].setFlag(ReflectionFlag.Static, true);\n\n        sortReflections(arr, [\"static-first\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"c\", \"b\"],\n        );\n    });\n\n    it(\"Should sort by instance first\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.Function),\n            new DeclarationReflection(\"c\", ReflectionKind.Function),\n        ];\n        arr[0].setFlag(ReflectionFlag.Static, true);\n        arr[1].setFlag(ReflectionFlag.Static, false);\n        arr[2].setFlag(ReflectionFlag.Static, true);\n\n        sortReflections(arr, [\"instance-first\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"b\", \"a\", \"c\"],\n        );\n    });\n\n    it(\"Should sort by visibility\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.Function),\n            new DeclarationReflection(\"c\", ReflectionKind.Function),\n            new DeclarationReflection(\"d\", ReflectionKind.Function),\n        ];\n        arr[0].setFlag(ReflectionFlag.Protected, true);\n        arr[1].setFlag(ReflectionFlag.Private, true);\n        arr[2].setFlag(ReflectionFlag.Public, true);\n        // This might not be set. If not set, assumed public.\n        // arr[3].setFlag(ReflectionFlag.Public, true);\n\n        sortReflections(arr, [\"visibility\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"c\", \"d\", \"a\", \"b\"],\n        );\n    });\n\n    it(\"Should sort by required/optional\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Property),\n            new DeclarationReflection(\"b\", ReflectionKind.Property),\n        ];\n        arr[0].setFlag(ReflectionFlag.Optional, true);\n        arr[1].setFlag(ReflectionFlag.Optional, false);\n\n        sortReflections(arr, [\"required-first\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"b\", \"a\"],\n        );\n    });\n\n    it(\"Should sort by kind\", () => {\n        const arr = [\n            new DeclarationReflection(\"15\", ReflectionKind.Reference),\n            new DeclarationReflection(\"2\", ReflectionKind.Module),\n            new DeclarationReflection(\"3\", ReflectionKind.Namespace),\n            new DeclarationReflection(\"4\", ReflectionKind.Enum),\n            new DeclarationReflection(\"5\", ReflectionKind.EnumMember),\n            new DeclarationReflection(\"14\", ReflectionKind.Method),\n            new DeclarationReflection(\"7\", ReflectionKind.Interface),\n            new DeclarationReflection(\"8\", ReflectionKind.TypeAlias),\n            new DeclarationReflection(\"9\", ReflectionKind.Constructor),\n            new DeclarationReflection(\"1\", ReflectionKind.Project),\n            new DeclarationReflection(\"11\", ReflectionKind.Variable),\n            new DeclarationReflection(\"12\", ReflectionKind.Function),\n            new DeclarationReflection(\"13\", ReflectionKind.Accessor),\n            new DeclarationReflection(\"10\", ReflectionKind.Property),\n            new DeclarationReflection(\"6\", ReflectionKind.Class),\n        ];\n\n        sortReflections(arr, [\"kind\"]);\n        equal(\n            arr.map((r) => r.name),\n            Array.from({ length: arr.length }, (_, i) => (i + 1).toString()),\n        );\n    });\n\n    it(\"Should sort by external last\", () => {\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.Function),\n            new DeclarationReflection(\"c\", ReflectionKind.Function),\n        ];\n        arr[0].setFlag(ReflectionFlag.External, true);\n        arr[1].setFlag(ReflectionFlag.External, false);\n        arr[2].setFlag(ReflectionFlag.External, true);\n\n        sortReflections(arr, [\"external-last\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"b\", \"a\", \"c\"],\n        );\n    });\n\n    it(\"Should sort with multiple strategies\", () => {\n        resetReflectionID();\n        const arr = [\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"a\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.Function),\n            new DeclarationReflection(\"b\", ReflectionKind.Function),\n        ];\n        arr[0].setFlag(ReflectionFlag.Optional, true);\n        arr[2].setFlag(ReflectionFlag.Optional, true);\n\n        sortReflections(arr, [\"required-first\", \"alphabetical\"]);\n        equal(\n            arr.map((r) => r.id),\n            [1, 3, 0, 2],\n        );\n    });\n\n    it(\"source-order should do nothing if no symbols are available\", () => {\n        const proj = new ProjectReflection(\"\", new FileRegistry());\n        const arr = [\n            new DeclarationReflection(\"b\", ReflectionKind.Function, proj),\n            new DeclarationReflection(\"a\", ReflectionKind.Function, proj),\n        ];\n\n        sortReflections(arr, [\"source-order\", \"alphabetical\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"b\"],\n        );\n    });\n\n    it(\"source-order should sort by file, then by position in file\", () => {\n        const aId = new ReflectionSymbolId({\n            packageName: \"typedoc\",\n            packagePath: \"a.ts\" as NormalizedPath,\n            qualifiedName: \"a\",\n        });\n        aId.pos = 1;\n        const bId = new ReflectionSymbolId({\n            packageName: \"typedoc\",\n            packagePath: \"a.ts\" as NormalizedPath,\n            qualifiedName: \"b\",\n        });\n        bId.pos = 2;\n        const cId = new ReflectionSymbolId({\n            packageName: \"typedoc\",\n            packagePath: \"b.ts\" as NormalizedPath,\n            qualifiedName: \"c\",\n        });\n        cId.pos = 0;\n\n        const proj = new ProjectReflection(\"\", new FileRegistry());\n        const a = new DeclarationReflection(\"a\", ReflectionKind.Variable, proj);\n        proj.registerSymbolId(a, aId);\n\n        const b = new DeclarationReflection(\"b\", ReflectionKind.Variable, proj);\n        proj.registerSymbolId(b, bId);\n\n        const c = new DeclarationReflection(\"c\", ReflectionKind.Variable, proj);\n        proj.registerSymbolId(c, cId);\n\n        const arr = [c, b, a];\n\n        sortReflections(arr, [\"source-order\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"b\", \"c\"],\n        );\n    });\n\n    it(\"enum-member-source-order should do nothing if not an enum member\", () => {\n        const bId = new ReflectionSymbolId({\n            packageName: \"typedoc\",\n            packagePath: \"a.ts\" as NormalizedPath,\n            qualifiedName: \"b\",\n        });\n        bId.pos = 2;\n        const cId = new ReflectionSymbolId({\n            packageName: \"typedoc\",\n            packagePath: \"a.ts\" as NormalizedPath,\n            qualifiedName: \"c\",\n        });\n        cId.pos = 1;\n\n        const proj = new ProjectReflection(\"\", new FileRegistry());\n        const a = new DeclarationReflection(\"a\", ReflectionKind.Variable, proj);\n\n        const b = new DeclarationReflection(\n            \"b\",\n            ReflectionKind.EnumMember,\n            proj,\n        );\n        proj.registerSymbolId(b, bId);\n\n        const c = new DeclarationReflection(\n            \"c\",\n            ReflectionKind.EnumMember,\n            proj,\n        );\n        proj.registerSymbolId(c, cId);\n\n        const d = new DeclarationReflection(\"d\", ReflectionKind.Variable, proj);\n\n        const arr = [d, c, b, a];\n        sortReflections(arr, [\"enum-member-source-order\", \"alphabetical\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"c\", \"b\", \"d\"],\n        );\n    });\n\n    it(\"Should handle documents-first ordering\", () => {\n        const proj = new ProjectReflection(\"\", new FileRegistry());\n        const a = new DocumentReflection(\"a\", proj, [], {});\n        const b = new DocumentReflection(\"b\", proj, [], {});\n        const c = new DeclarationReflection(\"c\", ReflectionKind.Class, proj);\n\n        const arr = [a, b, c];\n        sortReflections(arr, [\"documents-first\", \"alphabetical\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"a\", \"b\", \"c\"],\n        );\n\n        const arr2 = [c, b, a];\n        sortReflections(arr2, [\"documents-first\", \"alphabetical\"]);\n        equal(\n            arr2.map((r) => r.name),\n            [\"a\", \"b\", \"c\"],\n        );\n    });\n\n    it(\"Should handle documents-last ordering\", () => {\n        const proj = new ProjectReflection(\"\", new FileRegistry());\n        const a = new DocumentReflection(\"a\", proj, [], {});\n        const b = new DocumentReflection(\"b\", proj, [], {});\n        const c = new DeclarationReflection(\"c\", ReflectionKind.Class, proj);\n\n        const arr = [a, b, c];\n        sortReflections(arr, [\"documents-last\", \"alphabetical\"]);\n        equal(\n            arr.map((r) => r.name),\n            [\"c\", \"a\", \"b\"],\n        );\n\n        const arr2 = [a, c, b];\n        sortReflections(arr2, [\"documents-last\", \"alphabetical\"]);\n        equal(\n            arr2.map((r) => r.name),\n            [\"c\", \"a\", \"b\"],\n        );\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/array.test.ts",
    "content": "import { deepStrictEqual as equal, doesNotThrow } from \"assert\";\nimport {\n    binaryFindPartition,\n    insertOrderSorted,\n    insertPrioritySorted,\n    maxElementByScore,\n    removeIfPresent,\n} from \"#utils\";\n\ndescribe(\"Array utils\", () => {\n    describe(\"insertPrioritySorted\", () => {\n        const item1 = { priority: 1 };\n        const item2 = { priority: 2 };\n        const item3 = { priority: 3 };\n        const item4 = { priority: 4 };\n\n        it(\"works with an empty array\", () => {\n            equal(insertPrioritySorted([], item1), [item1]);\n        });\n\n        it(\"inserts at the start\", () => {\n            equal(insertPrioritySorted([item1], item2), [item2, item1]);\n        });\n\n        it(\"inserts in the middle\", () => {\n            equal(insertPrioritySorted([item3, item1], item2), [\n                item3,\n                item2,\n                item1,\n            ]);\n        });\n\n        it(\"inserts at the end\", () => {\n            equal(insertPrioritySorted([item4, item3], item2), [\n                item4,\n                item3,\n                item2,\n            ]);\n        });\n\n        it(\"inserts new items last\", () => {\n            const item0 = { priority: 1, first: false };\n            equal(insertPrioritySorted([item1], item0), [item1, item0]);\n        });\n    });\n\n    describe(\"insertOrderSorted\", () => {\n        const item1 = { order: 1 };\n        const item2 = { order: 2 };\n        const item3 = { order: 3 };\n        const item4 = { order: 4 };\n\n        it(\"works with an empty array\", () => {\n            equal(insertOrderSorted([], item1), [item1]);\n        });\n\n        it(\"inserts at the start\", () => {\n            equal(insertOrderSorted([item2], item1), [item1, item2]);\n        });\n\n        it(\"inserts in the middle\", () => {\n            equal(insertOrderSorted([item1, item3], item2), [\n                item1,\n                item2,\n                item3,\n            ]);\n        });\n\n        it(\"inserts at the end\", () => {\n            equal(insertOrderSorted([item2, item3], item4), [\n                item2,\n                item3,\n                item4,\n            ]);\n        });\n\n        it(\"inserts new items last\", () => {\n            const item0 = { order: 1, last: true };\n            equal(insertOrderSorted([item1], item0), [item1, item0]);\n        });\n    });\n\n    describe(\"binaryFindPartition\", () => {\n        const always = () => true;\n\n        it(\"works with empty array\", () => {\n            equal(binaryFindPartition([], always), -1);\n        });\n\n        it(\"works with one item\", () => {\n            equal(binaryFindPartition([1], always), 0);\n        });\n\n        it(\"works with more items\", () => {\n            equal(\n                binaryFindPartition([1, 2, 3], (n) => n > 2),\n                2,\n            );\n            equal(\n                binaryFindPartition([1, 2, 3, 4, 5, 6, 7], (n) => n > 5),\n                5,\n            );\n        });\n\n        it(\"works with no partition\", () => {\n            equal(\n                binaryFindPartition([1, 2, 3], () => false),\n                -1,\n            );\n        });\n\n        it(\"works with big arrays\", () => {\n            const index = 50168;\n            const arr = Array.from<number>({ length: 1e5 })\n                .fill(0, 0, index)\n                .fill(1, index);\n\n            equal(\n                binaryFindPartition(arr, (v) => v === 1),\n                index,\n            );\n        });\n    });\n\n    describe(\"removeIfPresent\", () => {\n        it(\"Supports a missing array\", () => {\n            doesNotThrow(() => removeIfPresent(undefined, true));\n        });\n\n        it(\"Does not remove items if the item is not in the array\", () => {\n            const arr = [1, 2, 3];\n            removeIfPresent(arr, 4);\n            equal(arr, [1, 2, 3]);\n        });\n\n        it(\"Removes a single item if it is present in the array\", () => {\n            const arr = [1, 2, 1];\n            removeIfPresent(arr, 1);\n            equal(arr, [2, 1]);\n        });\n    });\n\n    describe(\"maxElementByScore\", () => {\n        it(\"Gets the max element\", () => {\n            const arr = [1, 2, 3];\n            const item = maxElementByScore(arr, (x) => x);\n            equal(item, 3);\n        });\n\n        it(\"Prioritizes elements earlier in the array\", () => {\n            const arr = [1, 2, 3];\n            const item = maxElementByScore(arr, () => 1);\n            equal(item, 1);\n        });\n\n        it(\"Returns undefined for an empty array\", () => {\n            const arr: unknown[] = [];\n            const item = maxElementByScore(arr, () => 1);\n            equal(item, undefined);\n        });\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/enum.test.ts",
    "content": "import { deepStrictEqual as equal, ok } from \"assert\";\nimport { ReflectionKind } from \"../../lib/models/index.js\";\nimport { debugFlags, getEnumFlags, getEnumKeys, hasAllFlags, hasAnyFlag, removeFlag } from \"#utils\";\n\ndescribe(\"Enum utils\", () => {\n    it(\"getEnumFlags\", () => {\n        const keys = getEnumFlags(123);\n        equal(keys, [1, 2, 8, 16, 32, 64]);\n    });\n\n    it(\"removeFlag\", () => {\n        equal(removeFlag(3, 2), 1);\n        equal(removeFlag(3, 1), 2);\n        equal(removeFlag(3, 4), 3);\n    });\n\n    it(\"hasAllFlags\", () => {\n        equal(hasAllFlags(3, 1), true);\n        equal(hasAllFlags(3, 1 | 2), true);\n        equal(hasAllFlags(3, 1 | 4), false);\n    });\n\n    it(\"hasAnyFlag\", () => {\n        equal(hasAnyFlag(3, 1), true);\n        equal(hasAnyFlag(3, 1 | 2), true);\n        equal(hasAnyFlag(3, 1 | 4), true);\n        equal(hasAnyFlag(3, 4), false);\n    });\n\n    it(\"debugFlags\", () => {\n        enum Flags {\n            A = 1,\n            B = 2,\n            C = 4,\n        }\n        equal(debugFlags(Flags, Flags.A), [\"A\"]);\n        equal(debugFlags(Flags, Flags.A | Flags.B), [\"A\", \"B\"]);\n        equal(debugFlags(Flags, Flags.A | Flags.C), [\"A\", \"C\"]);\n        equal(debugFlags(Flags, 0), []);\n    });\n\n    it(\"getEnumKeys\", () => {\n        const keys = getEnumKeys(ReflectionKind);\n        ok(keys.includes(\"Project\"));\n        ok(!keys.includes(\"SignatureContainer\"));\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/events.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { EventDispatcher } from \"#utils\";\n\ndescribe(\"EventDispatcher\", () => {\n    it(\"Works in simple cases\", () => {\n        const emitter = new EventDispatcher<{ a: [] }>();\n\n        let calls = 0;\n        emitter.on(\"a\", () => {\n            calls++;\n        });\n        equal(calls, 0);\n\n        emitter.trigger(\"a\");\n        equal(calls, 1);\n        emitter.trigger(\"a\");\n        equal(calls, 2);\n    });\n\n    it(\"Allows removing listeners\", () => {\n        const emitter = new EventDispatcher<{ a: [] }>();\n\n        let calls = 0;\n        const listener = () => {\n            calls++;\n        };\n        emitter.off(\"a\", listener);\n        equal(calls, 0);\n\n        emitter.trigger(\"a\");\n        equal(calls, 0);\n    });\n\n    it(\"Works correctly with missing listeners\", () => {\n        const emitter = new EventDispatcher<{ a: [] }>();\n\n        let calls = 0;\n        const listener = () => {\n            calls++;\n        };\n        emitter.on(\"a\", () => {\n            calls++;\n        });\n        emitter.off(\"a\", listener);\n\n        emitter.trigger(\"a\");\n        equal(calls, 1);\n    });\n\n    it(\"Works if a listener is removed while emitting\", () => {\n        const emitter = new EventDispatcher<{ a: [] }>();\n\n        let calls = 0;\n        emitter.on(\"a\", function rem() {\n            calls++;\n            emitter.off(\"a\", rem);\n        });\n        emitter.on(\"a\", () => {\n            calls++;\n        });\n        equal(calls, 0);\n\n        emitter.trigger(\"a\");\n        equal(calls, 2);\n        emitter.trigger(\"a\");\n        equal(calls, 3);\n    });\n\n    it(\"Calls listeners according to their priority\", () => {\n        const emitter = new EventDispatcher<{ a: [] }>();\n\n        const calls: number[] = [];\n        emitter.on(\"a\", () => calls.push(3), 25);\n        emitter.on(\"a\", () => calls.push(1), 50);\n        emitter.on(\"a\", () => calls.push(2), 50);\n\n        emitter.trigger(\"a\");\n        equal(calls, [1, 2, 3]);\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/hooks.test.ts",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { EventHooks } from \"#utils\";\n\ndescribe(\"EventHooks\", () => {\n    it(\"Works in simple cases\", () => {\n        const emitter = new EventHooks<{ a: [] }, void>();\n\n        let calls = 0;\n        emitter.on(\"a\", () => {\n            calls++;\n        });\n        equal(calls, 0);\n\n        emitter.emit(\"a\");\n        equal(calls, 1);\n        emitter.emit(\"a\");\n        equal(calls, 2);\n    });\n\n    it(\"Works with once\", () => {\n        const emitter = new EventHooks<{ a: [] }, void>();\n\n        let calls = 0;\n        emitter.once(\"a\", () => {\n            calls++;\n        });\n        equal(calls, 0);\n\n        emitter.emit(\"a\");\n        equal(calls, 1);\n        emitter.emit(\"a\");\n        equal(calls, 1);\n    });\n\n    it(\"Allows removing listeners\", () => {\n        const emitter = new EventHooks<{ a: [] }, void>();\n\n        let calls = 0;\n        const listener = () => {\n            calls++;\n        };\n        emitter.once(\"a\", listener);\n        emitter.off(\"a\", listener);\n        equal(calls, 0);\n\n        emitter.emit(\"a\");\n        equal(calls, 0);\n    });\n\n    it(\"Works correctly with missing listeners\", () => {\n        const emitter = new EventHooks<{ a: [] }, void>();\n\n        let calls = 0;\n        const listener = () => {\n            calls++;\n        };\n        emitter.on(\"a\", () => {\n            calls++;\n        });\n        emitter.off(\"a\", listener);\n\n        emitter.emit(\"a\");\n        equal(calls, 1);\n    });\n\n    it(\"Works if a listener is removed while emitting\", () => {\n        const emitter = new EventHooks<{ a: [] }, void>();\n\n        let calls = 0;\n        emitter.on(\"a\", function rem() {\n            calls++;\n            emitter.off(\"a\", rem);\n        });\n        emitter.on(\"a\", () => {\n            calls++;\n        });\n        equal(calls, 0);\n\n        emitter.emit(\"a\");\n        equal(calls, 2);\n        emitter.emit(\"a\");\n        equal(calls, 3);\n    });\n\n    it(\"Collects the results of listeners\", () => {\n        const emitter = new EventHooks<{ a: [] }, number>();\n\n        emitter.on(\"a\", () => 1);\n        emitter.on(\"a\", () => 2);\n\n        equal(emitter.emit(\"a\"), [1, 2]);\n    });\n\n    it(\"Calls listeners according to their order\", () => {\n        const emitter = new EventHooks<{ a: [] }, number>();\n\n        emitter.on(\"a\", () => 1, 100);\n        emitter.on(\"a\", () => 2);\n\n        equal(emitter.emit(\"a\"), [2, 1]);\n    });\n\n    it(\"Has a working momento mechanism\", () => {\n        const emitter = new EventHooks<{ a: [] }, number>();\n\n        emitter.on(\"a\", () => 1);\n        const momento = emitter.saveMomento();\n        emitter.on(\"a\", () => 2);\n\n        equal(emitter.emit(\"a\"), [1, 2]);\n\n        emitter.restoreMomento(momento);\n        equal(emitter.emit(\"a\"), [1]);\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/jsx.test.tsx",
    "content": "import { deepStrictEqual as equal } from \"assert\";\nimport { JSX } from \"#utils\";\nimport { renderElement, renderElementToText } from \"../../lib/utils-common/jsx.js\";\n\ndescribe(\"JSX\", () => {\n    it(\"Handles null/undefined\", () => {\n        equal(renderElement(null), ``);\n        equal(renderElement(undefined), ``);\n    });\n\n    it(\"Works with basic case\", () => {\n        const element = (\n            <details data-a=\"foo\" open>\n                Text\n            </details>\n        );\n        equal(renderElement(element), '<details data-a=\"foo\" open>Text</details>');\n    });\n\n    it(\"Escapes string content\", () => {\n        equal(renderElement(<div>&lt;&gt;</div>), \"<div>&lt;&gt;</div>\");\n    });\n\n    it(\"Renders to the empty string if no component is provided\", () => {\n        equal(renderElement(null), \"\");\n        equal(renderElement(void 0), \"\");\n    });\n\n    it(\"Supports component functions\", () => {\n        const Component = (props: { text: string }) => <span>{props.text}</span>;\n\n        equal(renderElement(<Component text=\"hi!\" />), \"<span>hi!</span>\");\n    });\n\n    it(\"Recognizes void elements\", () => {\n        equal(renderElement(<div id=\"main\" />), '<div id=\"main\"></div>');\n    });\n\n    it(\"Does not render null or undefined attributes\", () => {\n        equal(renderElement(<div data-foo={null} />), \"<div></div>\");\n        equal(renderElement(<div data-foo={void 0} />), \"<div></div>\");\n    });\n\n    it(\"Handles false boolean attributes\", () => {\n        equal(renderElement(<details open={false} />), \"<details></details>\");\n    });\n\n    it(\"Supports children\", () => {\n        const Component = (props: { text: string }) => <span>{props.text}</span>;\n\n        const element = (\n            <div>\n                {null}\n                {undefined}\n                {[\"a\", \"b\"]}\n                <Component text=\"hi\" />\n            </div>\n        );\n\n        equal(renderElement(element), \"<div>ab<span>hi</span></div>\");\n    });\n\n    it(\"Supports fragments\", () => {\n        equal(\n            renderElement(\n                <>\n                    <div>A</div>\n                    <div>B</div>\n                </>,\n            ),\n            \"<div>A</div><div>B</div>\",\n        );\n    });\n\n    it(\"Supports <Raw /> for injecting HTML\", () => {\n        equal(renderElement(<JSX.Raw html=\"<strong>foo</strong>\" />), \"<strong>foo</strong>\");\n\n        // This is should never be used in common usage, but it shouldn't break\n        equal(JSX.Raw({ html: \"\" }), null);\n    });\n\n    it(\"Supports SVG elements\", () => {\n        equal(\n            renderElement(\n                <svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M 10,30\" />\n                </svg>,\n            ),\n            `<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M 10,30\"></path>\n            </svg>`.replace(/^\\s*|\\r?\\n/gm, \"\"),\n        );\n    });\n\n    it(\"Properly escapes quotes in html attributes\", () => {\n        const quot = `test\"quote`;\n        equal(renderElement(<div data-foo={quot} />), `<div data-foo=\"test&quot;quote\"></div>`);\n    });\n\n    it(\"Handles non-string attributes\", () => {\n        equal(renderElement(<div data-foo={123} />), `<div data-foo=\"123\"></div>`);\n    });\n\n    it(\"Handles void elements\", () => {\n        equal(renderElement(<br />), `<br/>`);\n    });\n\n    it(\"Handles boolean children\", () => {\n        equal(renderElement(<span>{true}{false}</span>), `<span></span>`);\n    });\n\n    it(\"Handles zero\", () => {\n        equal(renderElement(<span>{0}</span>), `<span>0</span>`);\n    });\n});\n\ndescribe(\"JSX.renderElementToText\", () => {\n    it(\"Handles null/undefined\", () => {\n        equal(renderElementToText(null), ``);\n        equal(renderElementToText(undefined), ``);\n    });\n\n    it(\"Handles zero\", () => {\n        equal(renderElementToText(<span>{0}</span>), `0`);\n    });\n\n    it(\"Handles boolean children\", () => {\n        equal(renderElementToText(<span>{true}{false}</span>), ``);\n    });\n\n    it(\"Handles Raw elements\", () => {\n        equal(renderElementToText(<JSX.Raw html=\"<span>\" />), `<span>`);\n    });\n\n    it(\"Handles components\", () => {\n        function Component() {\n            return <span>hi</span>;\n        }\n        equal(renderElementToText(<Component />), `hi`);\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/map.test.ts",
    "content": "import { deepStrictEqual as equal, ok } from \"assert\";\nimport { DefaultMap, StableKeyMap } from \"#utils\";\n\ndescribe(\"DefaultMap\", () => {\n    it(\"Creates entries if they do not exist\", () => {\n        const map = new DefaultMap<string, number>(() => 123);\n\n        equal(map.get(\"a\"), 123);\n        map.set(\"b\", 5);\n        equal(map.get(\"b\"), 5);\n        equal(map.getNoInsert(\"c\"), undefined);\n    });\n});\n\ndescribe(\"StableKeyMap\", () => {\n    interface StableKeyed {\n        getStableKey(): string;\n    }\n    const a = {\n        id: 1,\n        getStableKey() {\n            return \"a\";\n        },\n    };\n    const a2 = {\n        id: 2,\n        getStableKey() {\n            return \"a\";\n        },\n    };\n\n    it(\"Inserts objects via a stable key\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n\n        equal(map.size, 0);\n        map.set(a, 1);\n        equal(map.size, 1);\n        equal(map.get(a), 1);\n        equal(map.get(a2), 1);\n    });\n\n    it(\"Supports clear()\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        map.clear();\n        equal(map.size, 0);\n    });\n\n    it(\"Supports delete()\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        equal(map.delete(a2), true);\n        equal(map.size, 0);\n    });\n\n    it(\"Supports forEach()\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        let called = false;\n        map.forEach((value, key, map2) => {\n            called = true;\n            equal(value, 1);\n            ok(key === a);\n            ok(map === map2);\n        });\n        ok(called);\n    });\n\n    it(\"Supports entries()\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        let called = false;\n        for (const [key, value] of map.entries()) {\n            called = true;\n            equal(value, 1);\n            ok(key === a);\n        }\n        ok(called);\n    });\n\n    it(\"Supports keys()\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        let called = false;\n        for (const key of map.keys()) {\n            called = true;\n            ok(key === a);\n        }\n        ok(called);\n    });\n\n    it(\"Supports values()\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        let called = false;\n        for (const value of map.values()) {\n            called = true;\n            equal(value, 1);\n        }\n        ok(called);\n    });\n\n    it(\"Supports [Symbol.iterator]\", () => {\n        const map = new StableKeyMap<StableKeyed, number>();\n        map.set(a, 1);\n        let called = false;\n        for (const [key, value] of map) {\n            called = true;\n            equal(value, 1);\n            ok(key === a);\n        }\n        ok(called);\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/path.test.ts",
    "content": "import { type NormalizedPath, NormalizedPathUtils } from \"#utils\";\nimport { deepStrictEqual as equal } from \"assert/strict\";\n\nconst p = (p: string) => p as NormalizedPath;\n\ndescribe(\"NormalizedPathUtils - Posix\", () => {\n    it(\"dirname\", () => {\n        equal(NormalizedPathUtils.dirname(p(\"/home/typedoc/typedoc/package.json\")), \"/home/typedoc/typedoc\");\n\n        equal(NormalizedPathUtils.dirname(p(\"/home/typedoc/typedoc/\")), \"/home/typedoc\");\n\n        equal(NormalizedPathUtils.dirname(p(\"/\")), \"/\");\n        equal(NormalizedPathUtils.dirname(p(\"\")), \".\");\n    });\n\n    it(\"basename\", () => {\n        equal(NormalizedPathUtils.basename(p(\"/home/typedoc/typedoc/package.json\")), \"package.json\");\n        equal(NormalizedPathUtils.basename(p(\"package\")), \"package\");\n        equal(NormalizedPathUtils.basename(p(\"/home/\")), \"home\");\n        equal(NormalizedPathUtils.basename(p(\"\")), \"\");\n        equal(NormalizedPathUtils.basename(p(\"/home/typedoc\")), \"typedoc\");\n    });\n\n    it(\"relative\", () => {\n        equal(NormalizedPathUtils.relative(p(\"/home/typedoc\"), p(\"/home/typedoc\")), \"\");\n        equal(NormalizedPathUtils.relative(p(\"/home/typedoc/\"), p(\"/home/typedoc/src/index.ts\")), \"src/index.ts\");\n        equal(NormalizedPathUtils.relative(p(\"/home/typedoc\"), p(\"/home/typedoc/src/index.ts\")), \"src/index.ts\");\n        equal(\n            NormalizedPathUtils.relative(p(\"/home/typedoc/src2/\"), p(\"/home/typedoc/src/index.ts\")),\n            \"../src/index.ts\",\n        );\n        equal(\n            NormalizedPathUtils.relative(p(\"/home/typedoc/src2\"), p(\"/home/typedoc/src/index.ts\")),\n            \"../src/index.ts\",\n        );\n\n        equal(NormalizedPathUtils.relative(p(\"/e\"), p(\"/\")), \"../\");\n        equal(NormalizedPathUtils.relative(p(\"/a/b/c\"), p(\"/a\")), \"../..\");\n    });\n\n    it(\"normalize\", () => {\n        equal(NormalizedPathUtils.normalize(p(\"/foo\")), \"/foo\");\n        equal(NormalizedPathUtils.normalize(p(\"/foo/../bar\")), \"/bar\");\n        equal(NormalizedPathUtils.normalize(p(\"/foo/../bar/../baz\")), \"/baz\");\n        equal(NormalizedPathUtils.normalize(p(\"../../foo/../bar\")), \"../../bar\");\n    });\n\n    it(\"resolve\", () => {\n        equal(\n            NormalizedPathUtils.resolve(p(\"/home/gerrit/typedoc\"), p(\"/home/gerrit/typedoc/src/index.ts\")),\n            \"/home/gerrit/typedoc/src/index.ts\",\n        );\n\n        equal(\n            NormalizedPathUtils.resolve(p(\"/home/gerrit/typedoc\"), p(\"src/index.ts\")),\n            \"/home/gerrit/typedoc/src/index.ts\",\n        );\n\n        equal(\n            NormalizedPathUtils.resolve(p(\"/home/gerrit/typedoc\"), p(\"../bob/src/index.ts\")),\n            \"/home/gerrit/bob/src/index.ts\",\n        );\n    });\n\n    it(\"isAbsolute\", () => {\n        equal(NormalizedPathUtils.isAbsolute(p(\"test.json\")), false);\n        equal(NormalizedPathUtils.isAbsolute(p(\"/test.json\")), true);\n    });\n\n    it(\"splitFilename\", () => {\n        equal(NormalizedPathUtils.splitFilename(p(\"package.json\")), { name: \"package\", ext: \".json\" });\n        equal(NormalizedPathUtils.splitFilename(p(\"package\")), { name: \"package\", ext: \"\" });\n        equal(NormalizedPathUtils.splitFilename(p(\".bashrc\")), { name: \".bashrc\", ext: \"\" });\n    });\n});\n\ndescribe(\"NormalizedPathUtils - Windows\", () => {\n    it(\"dirname\", () => {\n        equal(NormalizedPathUtils.dirname(p(\"C:/home/typedoc/typedoc/package.json\")), \"C:/home/typedoc/typedoc\");\n\n        equal(NormalizedPathUtils.dirname(p(\"C:/home/typedoc/typedoc/\")), \"C:/home/typedoc\");\n\n        equal(NormalizedPathUtils.dirname(p(\"C:/\")), \"C:/\");\n        equal(NormalizedPathUtils.dirname(p(\"\")), \".\");\n    });\n\n    it(\"basename\", () => {\n        equal(NormalizedPathUtils.basename(p(\"C:/home/typedoc/typedoc/package.json\")), \"package.json\");\n        equal(NormalizedPathUtils.basename(p(\"package\")), \"package\");\n        equal(NormalizedPathUtils.basename(p(\"C:/home/\")), \"home\");\n        equal(NormalizedPathUtils.basename(p(\"\")), \"\");\n        equal(NormalizedPathUtils.basename(p(\"C:/home/typedoc\")), \"typedoc\");\n    });\n\n    it(\"relative\", () => {\n        equal(NormalizedPathUtils.relative(p(\"C:/home/typedoc\"), p(\"C:/home/typedoc\")), \"\");\n        equal(NormalizedPathUtils.relative(p(\"C:/home/typedoc/\"), p(\"C:/home/typedoc/src/index.ts\")), \"src/index.ts\");\n        equal(NormalizedPathUtils.relative(p(\"C:/home/typedoc\"), p(\"C:/home/typedoc/src/index.ts\")), \"src/index.ts\");\n        equal(\n            NormalizedPathUtils.relative(p(\"C:/home/typedoc/src2/\"), p(\"C:/home/typedoc/src/index.ts\")),\n            \"../src/index.ts\",\n        );\n        equal(\n            NormalizedPathUtils.relative(p(\"C:/home/typedoc/src2\"), p(\"C:/home/typedoc/src/index.ts\")),\n            \"../src/index.ts\",\n        );\n\n        equal(NormalizedPathUtils.relative(p(\"C:/e\"), p(\"C:/\")), \"../\");\n        equal(NormalizedPathUtils.relative(p(\"C:/a/b/c\"), p(\"C:/a\")), \"../..\");\n    });\n\n    it(\"normalize\", () => {\n        equal(NormalizedPathUtils.normalize(p(\"C:/foo\")), \"C:/foo\");\n        equal(NormalizedPathUtils.normalize(p(\"C:/foo/../bar\")), \"C:/bar\");\n        equal(NormalizedPathUtils.normalize(p(\"C:/foo/../bar/../baz\")), \"C:/baz\");\n        equal(NormalizedPathUtils.normalize(p(\"../../foo/../bar\")), \"../../bar\");\n        equal(NormalizedPathUtils.normalize(p(\"C:/../../foo/../bar\")), \"C:/bar\");\n    });\n\n    it(\"resolve\", () => {\n        equal(\n            NormalizedPathUtils.resolve(p(\"C:/home/gerrit/typedoc\"), p(\"C:/home/gerrit/typedoc/src/index.ts\")),\n            \"C:/home/gerrit/typedoc/src/index.ts\",\n        );\n\n        equal(\n            NormalizedPathUtils.resolve(p(\"C:/home/gerrit/typedoc\"), p(\"src/index.ts\")),\n            \"C:/home/gerrit/typedoc/src/index.ts\",\n        );\n\n        equal(\n            NormalizedPathUtils.resolve(p(\"C:/home/gerrit/typedoc\"), p(\"../bob/src/index.ts\")),\n            \"C:/home/gerrit/bob/src/index.ts\",\n        );\n    });\n\n    it(\"isAbsolute\", () => {\n        equal(NormalizedPathUtils.isAbsolute(p(\"test.json\")), false);\n        equal(NormalizedPathUtils.isAbsolute(p(\"C:/test.json\")), true);\n    });\n});\n"
  },
  {
    "path": "src/test/utils-common/validation.test.ts",
    "content": "import { ok } from \"assert\";\nimport { Validation } from \"#utils\";\n\ndescribe(\"Validation Utils\", () => {\n    it(\"Should be able to validate optional values\", () => {\n        ok(Validation.validate(Validation.optional(String), null));\n        ok(Validation.validate(Validation.optional(String), undefined));\n        ok(Validation.validate(Validation.optional(String), \"\"));\n    });\n\n    it(\"Should be able to validate a boolean\", () => {\n        ok(Validation.validate(Boolean, false));\n        ok(!Validation.validate(Boolean, 123));\n        ok(!Validation.validate(Boolean, \"\"));\n    });\n\n    it(\"Should be able to validate a number\", () => {\n        ok(!Validation.validate(Number, false));\n        ok(Validation.validate(Number, 123));\n        ok(!Validation.validate(Number, \"\"));\n    });\n\n    it(\"Should be able to validate a string\", () => {\n        ok(!Validation.validate(String, false));\n        ok(!Validation.validate(String, 123));\n        ok(Validation.validate(String, \"\"));\n    });\n\n    it(\"Should be able to validate an array\", () => {\n        ok(Validation.validate([Array, String], []));\n        ok(Validation.validate([Array, String], [\"a\"]));\n        ok(!Validation.validate([Array, String], [\"a\", 1]));\n    });\n\n    it(\"Should be able to validate with a custom function\", () => {\n        ok(Validation.validate(Validation.isTagString, \"@foo\"));\n        ok(!Validation.validate(Validation.isTagString, true));\n    });\n\n    it(\"Should be able to validate a set of literals\", () => {\n        ok(Validation.validate([\"a\", \"b\", \"c\"] as const, \"a\"));\n        ok(Validation.validate([\"a\", \"b\", \"c\"] as const, \"c\"));\n        ok(!Validation.validate([\"a\", \"b\", \"c\"] as const, \"d\"));\n    });\n\n    it(\"Should be able to validate an object\", () => {\n        const schema = {\n            x: String,\n            y: Validation.optional(Number),\n        };\n\n        ok(Validation.validate(schema, { x: \"\" }));\n        ok(Validation.validate(schema, { x: \"\", y: 0 }));\n        ok(Validation.validate(schema, { x: \"\", y: 0, z: 123 }));\n        ok(!Validation.validate(schema, { y: 123 }));\n        ok(!Validation.validate(schema, null));\n        ok(!Validation.validate(schema, true));\n    });\n\n    it(\"Should support not checking for excess properties (default)\", () => {\n        const schema = {\n            x: String,\n            [Validation.additionalProperties]: true,\n        };\n\n        ok(Validation.validate(schema, { x: \"\" }));\n        ok(Validation.validate(schema, { x: \"\", y: \"\" }));\n    });\n\n    it(\"Should support checking for excess properties\", () => {\n        const schema = {\n            x: String,\n            [Validation.additionalProperties]: false,\n        };\n\n        ok(Validation.validate(schema, { x: \"\" }));\n        ok(!Validation.validate(schema, { x: \"\", y: \"\" }));\n    });\n});\n"
  },
  {
    "path": "src/test/utils.ts",
    "content": "import { ok } from \"assert\";\nimport {\n    Comment,\n    DeclarationReflection,\n    type ProjectReflection,\n    Reflection,\n    ReflectionKind,\n    type SignatureReflection,\n    TraverseProperty,\n} from \"../index.js\";\nimport { filterMap } from \"#utils\";\nimport { equal } from \"assert/strict\";\nimport type { SomeReflection } from \"../lib/models/variant.js\";\n\nexport function query(\n    project: ProjectReflection,\n    name: string,\n): DeclarationReflection {\n    let refl: SomeReflection | undefined = project;\n    const parts = name.split(\".\");\n\n    for (let i = 0; i < parts.length; ++i) {\n        if (!refl) break;\n        if (refl.isReference()) {\n            refl = refl.getTargetReflectionDeep() as SomeReflection;\n        }\n\n        if (refl.isDocument()) {\n            throw new Error(\"Found document\");\n        }\n\n        if (refl.isProject()) {\n            refl = refl.getChildByName([parts[i]]) as\n                | SomeReflection\n                | undefined;\n            continue;\n        }\n\n        if (refl.type?.type === \"reflection\") {\n            refl = refl.type.declaration.getChildByName([parts[i]]) as\n                | SomeReflection\n                | undefined;\n            continue;\n        }\n\n        refl = refl.getChildByName([parts[i]]) as SomeReflection | undefined;\n    }\n\n    ok(\n        refl instanceof DeclarationReflection,\n        `Failed to find ${name}\\n${project.toStringHierarchy()}`,\n    );\n    return refl;\n}\n\nexport function querySig(\n    project: ProjectReflection,\n    name: string,\n    index = 0,\n): SignatureReflection {\n    const decl = query(project, name);\n    ok(\n        (decl.signatures?.length ?? 0) > index,\n        `Reflection \"${name}\" does not contain signature`,\n    );\n    return decl.signatures![index];\n}\n\nexport function getComment(project: ProjectReflection, name: string) {\n    return Comment.combineDisplayParts(query(project, name).comment?.summary);\n}\n\nexport function getSigComment(\n    project: ProjectReflection,\n    name: string,\n    index = 0,\n) {\n    return Comment.combineDisplayParts(\n        querySig(project, name, index).comment?.summary,\n    );\n}\n\nexport function getLinks(refl: Reflection): Array<{\n    display: string;\n    target: undefined | string | [ReflectionKind, string];\n}> {\n    ok(refl.comment);\n    return filterMap(refl.comment.summary, (p) => {\n        if (p.kind === \"inline-tag\" && p.tag === \"@link\") {\n            if (typeof p.target === \"string\") {\n                return { display: p.tsLinkText || p.text, target: p.target };\n            }\n            if (p.target instanceof Reflection) {\n                return {\n                    display: p.tsLinkText || p.target.name,\n                    target: [p.target.kind, p.target.getFullName()],\n                };\n            }\n            return {\n                display: p.tsLinkText || p.text,\n                target: p.target?.getStableKey(),\n            };\n        }\n    });\n}\n\nexport function equalKind(refl: Reflection, kind: ReflectionKind) {\n    equal(\n        refl.kind,\n        kind,\n        `Expected ${ReflectionKind[kind]} but got ${ReflectionKind[refl.kind]} for ${refl.getFullName()}`,\n    );\n}\n\ninterface ReflectionTree {\n    [name: string]: ReflectionTree | string;\n}\n\nexport function reflToTree(refl: Reflection) {\n    const result: ReflectionTree = {};\n\n    const seen = new Map<string, ReflectionKind>();\n\n    refl.traverse((refl, prop) => {\n        if (prop == TraverseProperty.Children) {\n            // Intentionally using `in` here rather than hasOwnProperty to avoid\n            // accidentally conflicting with a builtin property.\n            if (seen.has(refl.name) || refl.name in result) {\n                // If this name shows up twice, move the first instance from the name\n                // without a type to a name with the type.\n                if (seen.has(refl.name) && refl.name in result) {\n                    result[`${ReflectionKind[seen.get(refl.name)!]}:${refl.name}`] = result[refl.name];\n                    delete result[refl.name];\n                }\n\n                result[`${ReflectionKind[refl.kind]}:${refl.name}`] = reflToTree(refl);\n            } else {\n                result[refl.name] = reflToTree(refl);\n                seen.set(refl.name, refl.kind);\n            }\n        }\n        return true;\n    });\n\n    return Object.keys(result).length ? result : ReflectionKind[refl.kind];\n}\n"
  },
  {
    "path": "src/test/validation.test.ts",
    "content": "import { ok } from \"assert\";\nimport { join } from \"path\";\nimport { validateDocumentation } from \"../lib/validation/documentation.js\";\nimport { validateExports } from \"../lib/validation/exports.js\";\nimport { getConverter2App, getConverter2Program, getConverter2Project } from \"./programs.js\";\nimport { TestLogger } from \"./TestLogger.js\";\nimport { fileURLToPath } from \"url\";\nimport { validateMergeModuleWith } from \"../lib/validation/unusedMergeModuleWith.js\";\n\nfunction convertValidationFile(...files: [string, ...string[]]) {\n    return getConverter2Project(files, \"validation\");\n}\n\ndescribe(\"validateExports\", () => {\n    function expectWarning(\n        typeName: string,\n        file: string,\n        referencingName: string,\n        intentionallyNotExported: readonly string[] = [],\n    ) {\n        const project = convertValidationFile(file);\n\n        const logger = new TestLogger();\n        validateExports(project, logger, intentionallyNotExported);\n\n        logger.expectMessage(\n            `warn: ${typeName}, defined in */${file}, is referenced by ${referencingName} but not included in the documentation`,\n        );\n    }\n\n    function expectNoWarning(\n        file: string,\n        intentionallyNotExported: readonly string[] = [],\n    ) {\n        const app = getConverter2App();\n        const program = getConverter2Program();\n        const sourceFile = program.getSourceFile(\n            join(fileURLToPath(import.meta.url), \"../converter2/validation\", file),\n        );\n\n        ok(sourceFile, \"Specified source file does not exist.\");\n\n        const project = app.converter.convert([\n            {\n                displayName: \"validation\",\n                program,\n                sourceFile,\n            },\n        ]);\n\n        const logger = new TestLogger();\n\n        validateExports(project, logger, intentionallyNotExported);\n        logger.expectNoOtherMessages();\n    }\n\n    it(\"Should warn if a variable type is missing\", () => {\n        expectWarning(\"Foo\", \"variable.ts\", \"foo\");\n    });\n\n    it(\"Should warn if a type parameter clause is missing\", () => {\n        expectWarning(\"Foo\", \"typeParameter.ts\", \"Bar.T\");\n    });\n\n    it(\"Should warn if an index signature type is missing\", () => {\n        expectWarning(\"Bar\", \"indexSignature.ts\", \"Foo.__index\");\n    });\n\n    it(\"Should warn within object types\", () => {\n        expectWarning(\"Foo\", \"object.ts\", \"x.__type.foo\");\n    });\n\n    it(\"Should warn if a get signature type is missing\", () => {\n        expectWarning(\"Bar\", \"getSignature.ts\", \"Foo.foo\");\n    });\n\n    it(\"Should warn if a set signature type is missing\", () => {\n        expectWarning(\"Bar\", \"setSignature.ts\", \"Foo.foo._value\");\n    });\n\n    it(\"Should warn if an implemented type is missing\", () => {\n        expectWarning(\"Bar\", \"implemented.ts\", \"Foo\");\n    });\n\n    it(\"Should warn if a parameter type is missing\", () => {\n        expectWarning(\"Bar\", \"parameter.ts\", \"Foo.x\");\n    });\n\n    it(\"Should warn if a return type is missing\", () => {\n        expectWarning(\"Bar\", \"return.ts\", \"foo\");\n    });\n\n    it(\"Should allow filtering warnings by file name\", () => {\n        expectNoWarning(\"variable.ts\", [\"variable.ts:Foo\"]);\n        expectNoWarning(\"variable.ts\", [\"validation/variable.ts:Foo\"]);\n        expectNoWarning(\"variable.ts\", [\"Foo\"]);\n    });\n\n    it(\"Should not apply warnings filtered by file name to other files\", () => {\n        expectWarning(\"Foo\", \"variable.ts\", \"foo\", [\"notVariable.ts:Foo\"]);\n    });\n\n    it(\"Should not produce warnings for types originating in node_modules\", () => {\n        expectNoWarning(\"externalType.ts\");\n    });\n\n    it(\"Should not warn if namespaced name is given to intentionallyNotExported\", () => {\n        expectNoWarning(\"namespace.ts\", [\"Bar.Baz\"]);\n    });\n\n    it(\"Should warn if intentionallyNotExported contains unused values\", () => {\n        const app = getConverter2App();\n        const program = getConverter2Program();\n        const sourceFile = program.getSourceFile(\n            join(\n                fileURLToPath(import.meta.url),\n                \"../converter2/validation/variable.ts\",\n            ),\n        );\n\n        ok(sourceFile, \"Specified source file does not exist.\");\n\n        const project = app.converter.convert([\n            {\n                displayName: \"validation\",\n                program,\n                sourceFile,\n            },\n        ]);\n\n        const logger = new TestLogger();\n        validateExports(project, logger, [\"notDefined\", \"Foo\"]);\n        logger.expectMessage(\n            \"warn: The following symbols were marked as intentionally not exported, but were either not referenced in the documentation, or were exported:\\n\\tnotDefined\",\n        );\n        logger.expectNoOtherMessages();\n    });\n});\n\ndescribe(\"validateDocumentation\", () => {\n    it(\"Should correctly handle functions\", () => {\n        const project = convertValidationFile(\"function.ts\");\n        const logger = new TestLogger();\n        validateDocumentation(project, logger, [\"Function\"], [], [\"typedoc\"]);\n\n        logger.expectMessage(\n            \"warn: bar (CallSignature), defined in */function.ts, does not have any documentation\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should correctly handle accessors\", () => {\n        const project = convertValidationFile(\"getSignature.ts\");\n        const logger = new TestLogger();\n        validateDocumentation(project, logger, [\"Accessor\"], [], [\"typedoc\"]);\n\n        logger.expectMessage(\n            \"warn: Foo.foo (GetSignature), defined in */getSignature.ts, does not have any documentation\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should correctly handle constructors\", () => {\n        const project = convertValidationFile(\"class.ts\");\n        const logger = new TestLogger();\n        validateDocumentation(project, logger, [\"Constructor\"], [], [\"typedoc\"]);\n\n        logger.expectMessage(\n            \"warn: Foo.constructor (ConstructorSignature), defined in */class.ts, does not have any documentation\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should correctly handle interfaces\", () => {\n        const project = convertValidationFile(\"interface.ts\");\n        const logger = new TestLogger();\n        validateDocumentation(project, logger, [\"Method\"], [], [\"typedoc\"]);\n\n        logger.expectMessage(\n            \"warn: Foo.method (CallSignature), defined in */interface.ts, does not have any documentation\",\n        );\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"Should correctly handle callback parameters\", () => {\n        const project = convertValidationFile(\"callbackParameters.ts\");\n        const logger = new TestLogger();\n        validateDocumentation(project, logger, [\"Parameter\", \"Property\"], [], [\"typedoc\"]);\n\n        logger.expectNoOtherMessages();\n    });\n\n    it(\"#2863 supports intentionallyNotDocumented\", () => {\n        const project = convertValidationFile(\"intentionallyNotDocumented.ts\");\n\n        const logger = new TestLogger();\n        validateDocumentation(\n            project,\n            logger,\n            [\"Property\"],\n            [\"Foo.notDoc\", \"Foo.doesNotExist\"],\n            [\"typedoc\"],\n        );\n\n        logger.expectMessage(\n            \"warn: Foo.notDoc2 * does not have any documentation\",\n        );\n        logger.expectMessage(\"warn: The following qualified*Foo.doesNotExist\");\n        logger.expectNoOtherMessages();\n    });\n});\n\ndescribe(\"validateMergeModuleWith\", () => {\n    it(\"Should warn if the project has a @mergeModuleWith tag\", () => {\n        const project = convertValidationFile(\"unusedMergeModuleWith.ts\");\n\n        const logger = new TestLogger();\n        validateMergeModuleWith(project, logger);\n\n        logger.expectMessage(\n            `warn: <project> has a @mergeModuleWith tag which could not be resolved`,\n        );\n    });\n\n    it(\"Should warn if the project's module has a @mergeModuleWith tag\", () => {\n        const project = convertValidationFile(\"unusedMergeModuleWith.ts\", \"return.ts\");\n\n        const logger = new TestLogger();\n        validateMergeModuleWith(project, logger);\n\n        logger.expectMessage(\n            `warn: unusedMergeModuleWith has a @mergeModuleWith tag which could not be resolved`,\n        );\n    });\n});\n"
  },
  {
    "path": "static/style.css",
    "content": "@layer typedoc {\n    :root {\n        --dim-toolbar-contents-height: 2.5rem;\n        --dim-toolbar-border-bottom-width: 1px;\n        --dim-header-height: calc(\n            var(--dim-toolbar-border-bottom-width) +\n                var(--dim-toolbar-contents-height)\n        );\n\n        /* 0rem For mobile; unit is required for calculation in `calc` */\n        --dim-container-main-margin-y: 0rem;\n\n        --dim-footer-height: 3.5rem;\n\n        --modal-animation-duration: 0.2s;\n    }\n\n    :root {\n        /* Light */\n        --light-color-background: #f2f4f8;\n        --light-color-background-secondary: #eff0f1;\n        /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */\n        --light-color-background-active: #d6d8da;\n        --light-color-background-warning: #e6e600;\n        --light-color-warning-text: #222;\n        --light-color-accent: #c5c7c9;\n        --light-color-active-menu-item: var(--light-color-background-active);\n        --light-color-text: #222;\n        --light-color-contrast-text: #000;\n        --light-color-text-aside: #5e5e5e;\n\n        --light-color-icon-background: var(--light-color-background);\n        --light-color-icon-text: var(--light-color-text);\n\n        --light-color-comment-tag-text: var(--light-color-text);\n        --light-color-comment-tag: var(--light-color-background);\n\n        --light-color-link: #1f70c2;\n        --light-color-focus-outline: #3584e4;\n\n        --light-color-ts-keyword: #056bd6;\n        --light-color-ts-project: #b111c9;\n        --light-color-ts-module: var(--light-color-ts-project);\n        --light-color-ts-namespace: var(--light-color-ts-project);\n        --light-color-ts-enum: #7e6f15;\n        --light-color-ts-enum-member: var(--light-color-ts-enum);\n        --light-color-ts-variable: #4760ec;\n        --light-color-ts-function: #572be7;\n        --light-color-ts-class: #1f70c2;\n        --light-color-ts-interface: #108024;\n        --light-color-ts-constructor: var(--light-color-ts-class);\n        --light-color-ts-property: #9f5f30;\n        --light-color-ts-method: #be3989;\n        --light-color-ts-reference: #ff4d82;\n        --light-color-ts-call-signature: var(--light-color-ts-method);\n        --light-color-ts-index-signature: var(--light-color-ts-property);\n        --light-color-ts-constructor-signature: var(\n            --light-color-ts-constructor\n        );\n        --light-color-ts-parameter: var(--light-color-ts-variable);\n        /* type literal not included as links will never be generated to it */\n        --light-color-ts-type-parameter: #a55c0e;\n        --light-color-ts-accessor: #c73c3c;\n        --light-color-ts-get-signature: var(--light-color-ts-accessor);\n        --light-color-ts-set-signature: var(--light-color-ts-accessor);\n        --light-color-ts-type-alias: #d51270;\n        /* reference not included as links will be colored with the kind that it points to */\n        --light-color-document: #000000;\n\n        --light-color-alert-note: #0969d9;\n        --light-color-alert-tip: #1a7f37;\n        --light-color-alert-important: #8250df;\n        --light-color-alert-warning: #9a6700;\n        --light-color-alert-caution: #cf222e;\n\n        --light-external-icon: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='10' height='10'><path fill-opacity='0' stroke='%23000' stroke-width='10' d='m43,35H5v60h60V57M45,5v10l10,10-30,30 20,20 30-30 10,10h10V5z'/></svg>\");\n        --light-color-scheme: light;\n    }\n\n    :root {\n        /* Dark */\n        --dark-color-background: #2b2e33;\n        --dark-color-background-secondary: #1e2024;\n        /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */\n        --dark-color-background-active: #5d5d6a;\n        --dark-color-background-warning: #bebe00;\n        --dark-color-warning-text: #222;\n        --dark-color-accent: #9096a2;\n        --dark-color-active-menu-item: var(--dark-color-background-active);\n        --dark-color-text: #f5f5f5;\n        --dark-color-contrast-text: #ffffff;\n        --dark-color-text-aside: #dddddd;\n\n        --dark-color-icon-background: var(--dark-color-background-secondary);\n        --dark-color-icon-text: var(--dark-color-text);\n\n        --dark-color-comment-tag-text: var(--dark-color-text);\n        --dark-color-comment-tag: var(--dark-color-background);\n\n        --dark-color-link: #00aff4;\n        --dark-color-focus-outline: #4c97f2;\n\n        --dark-color-ts-keyword: #3399ff;\n        --dark-color-ts-project: #e358ff;\n        --dark-color-ts-module: var(--dark-color-ts-project);\n        --dark-color-ts-namespace: var(--dark-color-ts-project);\n        --dark-color-ts-enum: #f4d93e;\n        --dark-color-ts-enum-member: var(--dark-color-ts-enum);\n        --dark-color-ts-variable: #798dff;\n        --dark-color-ts-function: #a280ff;\n        --dark-color-ts-class: #8ac4ff;\n        --dark-color-ts-interface: #6cff87;\n        --dark-color-ts-constructor: var(--dark-color-ts-class);\n        --dark-color-ts-property: #ff984d;\n        --dark-color-ts-method: #ff4db8;\n        --dark-color-ts-reference: #ff4d82;\n        --dark-color-ts-call-signature: var(--dark-color-ts-method);\n        --dark-color-ts-index-signature: var(--dark-color-ts-property);\n        --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor);\n        --dark-color-ts-parameter: var(--dark-color-ts-variable);\n        /* type literal not included as links will never be generated to it */\n        --dark-color-ts-type-parameter: #e07d13;\n        --dark-color-ts-accessor: #ff6060;\n        --dark-color-ts-get-signature: var(--dark-color-ts-accessor);\n        --dark-color-ts-set-signature: var(--dark-color-ts-accessor);\n        --dark-color-ts-type-alias: #ff6492;\n        /* reference not included as links will be colored with the kind that it points to */\n        --dark-color-document: #ffffff;\n\n        --dark-color-alert-note: #0969d9;\n        --dark-color-alert-tip: #1a7f37;\n        --dark-color-alert-important: #8250df;\n        --dark-color-alert-warning: #9a6700;\n        --dark-color-alert-caution: #cf222e;\n\n        --dark-external-icon: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='10' height='10'><path fill-opacity='0' stroke='%23fff' stroke-width='10' d='m43,35H5v60h60V57M45,5v10l10,10-30,30 20,20 30-30 10,10h10V5z'/></svg>\");\n        --dark-color-scheme: dark;\n    }\n\n    @media (prefers-color-scheme: light) {\n        :root {\n            --color-background: var(--light-color-background);\n            --color-background-secondary: var(\n                --light-color-background-secondary\n            );\n            --color-background-active: var(--light-color-background-active);\n            --color-background-warning: var(--light-color-background-warning);\n            --color-warning-text: var(--light-color-warning-text);\n            --color-accent: var(--light-color-accent);\n            --color-active-menu-item: var(--light-color-active-menu-item);\n            --color-text: var(--light-color-text);\n            --color-contrast-text: var(--light-color-contrast-text);\n            --color-text-aside: var(--light-color-text-aside);\n\n            --color-icon-background: var(--light-color-icon-background);\n            --color-icon-text: var(--light-color-icon-text);\n\n            --color-comment-tag-text: var(--light-color-text);\n            --color-comment-tag: var(--light-color-background);\n\n            --color-link: var(--light-color-link);\n            --color-focus-outline: var(--light-color-focus-outline);\n\n            --color-ts-keyword: var(--light-color-ts-keyword);\n            --color-ts-project: var(--light-color-ts-project);\n            --color-ts-module: var(--light-color-ts-module);\n            --color-ts-namespace: var(--light-color-ts-namespace);\n            --color-ts-enum: var(--light-color-ts-enum);\n            --color-ts-enum-member: var(--light-color-ts-enum-member);\n            --color-ts-variable: var(--light-color-ts-variable);\n            --color-ts-function: var(--light-color-ts-function);\n            --color-ts-class: var(--light-color-ts-class);\n            --color-ts-interface: var(--light-color-ts-interface);\n            --color-ts-constructor: var(--light-color-ts-constructor);\n            --color-ts-property: var(--light-color-ts-property);\n            --color-ts-method: var(--light-color-ts-method);\n            --color-ts-reference: var(--light-color-ts-reference);\n            --color-ts-call-signature: var(--light-color-ts-call-signature);\n            --color-ts-index-signature: var(--light-color-ts-index-signature);\n            --color-ts-constructor-signature: var(\n                --light-color-ts-constructor-signature\n            );\n            --color-ts-parameter: var(--light-color-ts-parameter);\n            --color-ts-type-parameter: var(--light-color-ts-type-parameter);\n            --color-ts-accessor: var(--light-color-ts-accessor);\n            --color-ts-get-signature: var(--light-color-ts-get-signature);\n            --color-ts-set-signature: var(--light-color-ts-set-signature);\n            --color-ts-type-alias: var(--light-color-ts-type-alias);\n            --color-document: var(--light-color-document);\n\n            --color-alert-note: var(--light-color-alert-note);\n            --color-alert-tip: var(--light-color-alert-tip);\n            --color-alert-important: var(--light-color-alert-important);\n            --color-alert-warning: var(--light-color-alert-warning);\n            --color-alert-caution: var(--light-color-alert-caution);\n\n            --external-icon: var(--light-external-icon);\n            --color-scheme: var(--light-color-scheme);\n        }\n    }\n\n    @media (prefers-color-scheme: dark) {\n        :root {\n            --color-background: var(--dark-color-background);\n            --color-background-secondary: var(\n                --dark-color-background-secondary\n            );\n            --color-background-active: var(--dark-color-background-active);\n            --color-background-warning: var(--dark-color-background-warning);\n            --color-warning-text: var(--dark-color-warning-text);\n            --color-accent: var(--dark-color-accent);\n            --color-active-menu-item: var(--dark-color-active-menu-item);\n            --color-text: var(--dark-color-text);\n            --color-contrast-text: var(--dark-color-contrast-text);\n            --color-text-aside: var(--dark-color-text-aside);\n\n            --color-icon-background: var(--dark-color-icon-background);\n            --color-icon-text: var(--dark-color-icon-text);\n\n            --color-comment-tag-text: var(--dark-color-text);\n            --color-comment-tag: var(--dark-color-background);\n\n            --color-link: var(--dark-color-link);\n            --color-focus-outline: var(--dark-color-focus-outline);\n\n            --color-ts-keyword: var(--dark-color-ts-keyword);\n            --color-ts-project: var(--dark-color-ts-project);\n            --color-ts-module: var(--dark-color-ts-module);\n            --color-ts-namespace: var(--dark-color-ts-namespace);\n            --color-ts-enum: var(--dark-color-ts-enum);\n            --color-ts-enum-member: var(--dark-color-ts-enum-member);\n            --color-ts-variable: var(--dark-color-ts-variable);\n            --color-ts-function: var(--dark-color-ts-function);\n            --color-ts-class: var(--dark-color-ts-class);\n            --color-ts-interface: var(--dark-color-ts-interface);\n            --color-ts-constructor: var(--dark-color-ts-constructor);\n            --color-ts-property: var(--dark-color-ts-property);\n            --color-ts-method: var(--dark-color-ts-method);\n            --color-ts-reference: var(--dark-color-ts-reference);\n            --color-ts-call-signature: var(--dark-color-ts-call-signature);\n            --color-ts-index-signature: var(--dark-color-ts-index-signature);\n            --color-ts-constructor-signature: var(\n                --dark-color-ts-constructor-signature\n            );\n            --color-ts-parameter: var(--dark-color-ts-parameter);\n            --color-ts-type-parameter: var(--dark-color-ts-type-parameter);\n            --color-ts-accessor: var(--dark-color-ts-accessor);\n            --color-ts-get-signature: var(--dark-color-ts-get-signature);\n            --color-ts-set-signature: var(--dark-color-ts-set-signature);\n            --color-ts-type-alias: var(--dark-color-ts-type-alias);\n            --color-document: var(--dark-color-document);\n\n            --color-alert-note: var(--dark-color-alert-note);\n            --color-alert-tip: var(--dark-color-alert-tip);\n            --color-alert-important: var(--dark-color-alert-important);\n            --color-alert-warning: var(--dark-color-alert-warning);\n            --color-alert-caution: var(--dark-color-alert-caution);\n\n            --external-icon: var(--dark-external-icon);\n            --color-scheme: var(--dark-color-scheme);\n        }\n    }\n\n    :root[data-theme=\"light\"] {\n        --color-background: var(--light-color-background);\n        --color-background-secondary: var(--light-color-background-secondary);\n        --color-background-active: var(--light-color-background-active);\n        --color-background-warning: var(--light-color-background-warning);\n        --color-warning-text: var(--light-color-warning-text);\n        --color-icon-background: var(--light-color-icon-background);\n        --color-accent: var(--light-color-accent);\n        --color-active-menu-item: var(--light-color-active-menu-item);\n        --color-text: var(--light-color-text);\n        --color-contrast-text: var(--light-color-contrast-text);\n        --color-text-aside: var(--light-color-text-aside);\n        --color-icon-text: var(--light-color-icon-text);\n\n        --color-comment-tag-text: var(--light-color-text);\n        --color-comment-tag: var(--light-color-background);\n\n        --color-link: var(--light-color-link);\n        --color-focus-outline: var(--light-color-focus-outline);\n\n        --color-ts-keyword: var(--light-color-ts-keyword);\n        --color-ts-project: var(--light-color-ts-project);\n        --color-ts-module: var(--light-color-ts-module);\n        --color-ts-namespace: var(--light-color-ts-namespace);\n        --color-ts-enum: var(--light-color-ts-enum);\n        --color-ts-enum-member: var(--light-color-ts-enum-member);\n        --color-ts-variable: var(--light-color-ts-variable);\n        --color-ts-function: var(--light-color-ts-function);\n        --color-ts-class: var(--light-color-ts-class);\n        --color-ts-interface: var(--light-color-ts-interface);\n        --color-ts-constructor: var(--light-color-ts-constructor);\n        --color-ts-property: var(--light-color-ts-property);\n        --color-ts-method: var(--light-color-ts-method);\n        --color-ts-reference: var(--light-color-ts-reference);\n        --color-ts-call-signature: var(--light-color-ts-call-signature);\n        --color-ts-index-signature: var(--light-color-ts-index-signature);\n        --color-ts-constructor-signature: var(\n            --light-color-ts-constructor-signature\n        );\n        --color-ts-parameter: var(--light-color-ts-parameter);\n        --color-ts-type-parameter: var(--light-color-ts-type-parameter);\n        --color-ts-accessor: var(--light-color-ts-accessor);\n        --color-ts-get-signature: var(--light-color-ts-get-signature);\n        --color-ts-set-signature: var(--light-color-ts-set-signature);\n        --color-ts-type-alias: var(--light-color-ts-type-alias);\n        --color-document: var(--light-color-document);\n\n        --color-note: var(--light-color-note);\n        --color-tip: var(--light-color-tip);\n        --color-important: var(--light-color-important);\n        --color-warning: var(--light-color-warning);\n        --color-caution: var(--light-color-caution);\n\n        --external-icon: var(--light-external-icon);\n        --color-scheme: var(--light-color-scheme);\n    }\n\n    :root[data-theme=\"dark\"] {\n        --color-background: var(--dark-color-background);\n        --color-background-secondary: var(--dark-color-background-secondary);\n        --color-background-active: var(--dark-color-background-active);\n        --color-background-warning: var(--dark-color-background-warning);\n        --color-warning-text: var(--dark-color-warning-text);\n        --color-icon-background: var(--dark-color-icon-background);\n        --color-accent: var(--dark-color-accent);\n        --color-active-menu-item: var(--dark-color-active-menu-item);\n        --color-text: var(--dark-color-text);\n        --color-contrast-text: var(--dark-color-contrast-text);\n        --color-text-aside: var(--dark-color-text-aside);\n        --color-icon-text: var(--dark-color-icon-text);\n\n        --color-comment-tag-text: var(--dark-color-text);\n        --color-comment-tag: var(--dark-color-background);\n\n        --color-link: var(--dark-color-link);\n        --color-focus-outline: var(--dark-color-focus-outline);\n\n        --color-ts-keyword: var(--dark-color-ts-keyword);\n        --color-ts-project: var(--dark-color-ts-project);\n        --color-ts-module: var(--dark-color-ts-module);\n        --color-ts-namespace: var(--dark-color-ts-namespace);\n        --color-ts-enum: var(--dark-color-ts-enum);\n        --color-ts-enum-member: var(--dark-color-ts-enum-member);\n        --color-ts-variable: var(--dark-color-ts-variable);\n        --color-ts-function: var(--dark-color-ts-function);\n        --color-ts-class: var(--dark-color-ts-class);\n        --color-ts-interface: var(--dark-color-ts-interface);\n        --color-ts-constructor: var(--dark-color-ts-constructor);\n        --color-ts-property: var(--dark-color-ts-property);\n        --color-ts-method: var(--dark-color-ts-method);\n        --color-ts-reference: var(--dark-color-ts-reference);\n        --color-ts-call-signature: var(--dark-color-ts-call-signature);\n        --color-ts-index-signature: var(--dark-color-ts-index-signature);\n        --color-ts-constructor-signature: var(\n            --dark-color-ts-constructor-signature\n        );\n        --color-ts-parameter: var(--dark-color-ts-parameter);\n        --color-ts-type-parameter: var(--dark-color-ts-type-parameter);\n        --color-ts-accessor: var(--dark-color-ts-accessor);\n        --color-ts-get-signature: var(--dark-color-ts-get-signature);\n        --color-ts-set-signature: var(--dark-color-ts-set-signature);\n        --color-ts-type-alias: var(--dark-color-ts-type-alias);\n        --color-document: var(--dark-color-document);\n\n        --color-note: var(--dark-color-note);\n        --color-tip: var(--dark-color-tip);\n        --color-important: var(--dark-color-important);\n        --color-warning: var(--dark-color-warning);\n        --color-caution: var(--dark-color-caution);\n\n        --external-icon: var(--dark-external-icon);\n        --color-scheme: var(--dark-color-scheme);\n    }\n\n    html {\n        color-scheme: var(--color-scheme);\n        @media (prefers-reduced-motion: no-preference) {\n            scroll-behavior: smooth;\n        }\n    }\n\n    *:focus-visible,\n    .tsd-accordion-summary:focus-visible svg {\n        outline: 2px solid var(--color-focus-outline);\n    }\n\n    .always-visible,\n    .always-visible .tsd-signatures {\n        display: inherit !important;\n    }\n\n    h1,\n    h2,\n    h3,\n    h4,\n    h5,\n    h6 {\n        line-height: 1.2;\n    }\n\n    h1 {\n        font-size: 1.875rem;\n        margin: 0.67rem 0;\n    }\n\n    h2 {\n        font-size: 1.5rem;\n        margin: 0.83rem 0;\n    }\n\n    h3 {\n        font-size: 1.25rem;\n        margin: 1rem 0;\n    }\n\n    h4 {\n        font-size: 1.05rem;\n        margin: 1.33rem 0;\n    }\n\n    h5 {\n        font-size: 1rem;\n        margin: 1.5rem 0;\n    }\n\n    h6 {\n        font-size: 0.875rem;\n        margin: 2.33rem 0;\n    }\n\n    dl,\n    menu,\n    ol,\n    ul {\n        margin: 1em 0;\n    }\n\n    dd {\n        margin: 0 0 0 34px;\n    }\n\n    .container {\n        max-width: 1700px;\n        padding: 0 2rem;\n    }\n\n    /* Footer */\n    footer {\n        border-top: 1px solid var(--color-accent);\n        padding-top: 1rem;\n        padding-bottom: 1rem;\n        max-height: var(--dim-footer-height);\n    }\n    footer > p {\n        margin: 0 1em;\n    }\n\n    .container-main {\n        margin: var(--dim-container-main-margin-y) auto;\n        /* toolbar, footer, margin */\n        min-height: calc(\n            100svh - var(--dim-header-height) - var(--dim-footer-height) -\n                2 * var(--dim-container-main-margin-y)\n        );\n    }\n\n    @keyframes fade-in {\n        from {\n            opacity: 0;\n        }\n        to {\n            opacity: 1;\n        }\n    }\n    @keyframes fade-out {\n        from {\n            opacity: 1;\n            visibility: visible;\n        }\n        to {\n            opacity: 0;\n        }\n    }\n    @keyframes pop-in-from-right {\n        from {\n            transform: translate(100%, 0);\n        }\n        to {\n            transform: translate(0, 0);\n        }\n    }\n    @keyframes pop-out-to-right {\n        from {\n            transform: translate(0, 0);\n            visibility: visible;\n        }\n        to {\n            transform: translate(100%, 0);\n        }\n    }\n    body {\n        background: var(--color-background);\n        font-family:\n            -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\",\n            Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n        font-size: 16px;\n        color: var(--color-text);\n        margin: 0;\n    }\n\n    a {\n        color: var(--color-link);\n        text-decoration: none;\n    }\n    a:hover {\n        text-decoration: underline;\n    }\n    a.external[target=\"_blank\"] {\n        background-image: var(--external-icon);\n        background-position: top 3px right;\n        background-repeat: no-repeat;\n        padding-right: 13px;\n    }\n    a.tsd-anchor-link {\n        color: var(--color-text);\n    }\n    :target {\n        scroll-margin-block: calc(var(--dim-header-height) + 0.5rem);\n    }\n\n    code,\n    pre {\n        font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n        padding: 0.2em;\n        margin: 0;\n        font-size: 0.875rem;\n        border-radius: 0.8em;\n    }\n\n    pre {\n        position: relative;\n        white-space: pre-wrap;\n        word-wrap: break-word;\n        padding: 10px;\n        border: 1px solid var(--color-accent);\n        margin-bottom: 8px;\n    }\n    pre code {\n        padding: 0;\n        font-size: 100%;\n    }\n    pre > button {\n        position: absolute;\n        top: 10px;\n        right: 10px;\n        opacity: 0;\n        transition: opacity 0.1s;\n        box-sizing: border-box;\n    }\n    pre:hover > button,\n    pre > button.visible,\n    pre > button:focus-visible {\n        opacity: 1;\n    }\n\n    blockquote {\n        margin: 1em 0;\n        padding-left: 1em;\n        border-left: 4px solid gray;\n    }\n\n    img {\n        max-width: 100%;\n    }\n\n    * {\n        scrollbar-width: thin;\n        scrollbar-color: var(--color-accent) var(--color-icon-background);\n    }\n\n    *::-webkit-scrollbar {\n        width: 0.75rem;\n    }\n\n    *::-webkit-scrollbar-track {\n        background: var(--color-icon-background);\n    }\n\n    *::-webkit-scrollbar-thumb {\n        background-color: var(--color-accent);\n        border-radius: 999rem;\n        border: 0.25rem solid var(--color-icon-background);\n    }\n\n    dialog {\n        border: none;\n        outline: none;\n        padding: 0;\n        background-color: var(--color-background);\n    }\n    dialog::backdrop {\n        display: none;\n    }\n    #tsd-overlay {\n        background-color: rgba(0, 0, 0, 0.5);\n        position: fixed;\n        z-index: 9999;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        animation: fade-in var(--modal-animation-duration) forwards;\n    }\n    #tsd-overlay.closing {\n        animation-name: fade-out;\n    }\n\n    .tsd-typography {\n        line-height: 1.333em;\n    }\n    .tsd-typography ul {\n        list-style: square;\n        padding: 0 0 0 20px;\n        margin: 0;\n    }\n    .tsd-typography .tsd-index-panel h3,\n    .tsd-index-panel .tsd-typography h3,\n    .tsd-typography h4,\n    .tsd-typography h5,\n    .tsd-typography h6 {\n        font-size: 1em;\n    }\n    .tsd-typography h5,\n    .tsd-typography h6 {\n        font-weight: normal;\n    }\n    .tsd-typography p,\n    .tsd-typography ul,\n    .tsd-typography ol {\n        margin: 1em 0;\n    }\n    .tsd-typography table {\n        border-collapse: collapse;\n        border: none;\n    }\n    .tsd-typography td,\n    .tsd-typography th {\n        padding: 6px 13px;\n        border: 1px solid var(--color-accent);\n    }\n    .tsd-typography thead,\n    .tsd-typography tr:nth-child(even) {\n        background-color: var(--color-background-secondary);\n    }\n\n    .tsd-alert {\n        padding: 8px 16px;\n        margin-bottom: 16px;\n        border-left: 0.25em solid var(--alert-color);\n    }\n    .tsd-alert blockquote > :last-child,\n    .tsd-alert > :last-child {\n        margin-bottom: 0;\n    }\n    .tsd-alert-title {\n        color: var(--alert-color);\n        display: inline-flex;\n        align-items: center;\n    }\n    .tsd-alert-title span {\n        margin-left: 4px;\n    }\n\n    .tsd-alert-note {\n        --alert-color: var(--color-alert-note);\n    }\n    .tsd-alert-tip {\n        --alert-color: var(--color-alert-tip);\n    }\n    .tsd-alert-important {\n        --alert-color: var(--color-alert-important);\n    }\n    .tsd-alert-warning {\n        --alert-color: var(--color-alert-warning);\n    }\n    .tsd-alert-caution {\n        --alert-color: var(--color-alert-caution);\n    }\n\n    .tsd-breadcrumb {\n        margin: 0;\n        margin-top: 1rem;\n        padding: 0;\n        color: var(--color-text-aside);\n    }\n    .tsd-breadcrumb a {\n        color: var(--color-text-aside);\n        text-decoration: none;\n    }\n    .tsd-breadcrumb a:hover {\n        text-decoration: underline;\n    }\n    .tsd-breadcrumb li {\n        display: inline;\n    }\n    .tsd-breadcrumb li:after {\n        content: \" / \";\n    }\n\n    .tsd-comment-tags {\n        display: flex;\n        flex-direction: column;\n    }\n    dl.tsd-comment-tag-group {\n        display: flex;\n        align-items: center;\n        overflow: hidden;\n        margin: 0.5em 0;\n    }\n    dl.tsd-comment-tag-group dt {\n        display: flex;\n        margin-right: 0.5em;\n        font-size: 0.875em;\n        font-weight: normal;\n    }\n    dl.tsd-comment-tag-group dd {\n        margin: 0;\n    }\n    code.tsd-tag {\n        padding: 0.25em 0.4em;\n        border: 0.1em solid var(--color-accent);\n        margin-right: 0.25em;\n        font-size: 70%;\n    }\n    h1 code.tsd-tag:first-of-type {\n        margin-left: 0.25em;\n    }\n\n    dl.tsd-comment-tag-group dd:before,\n    dl.tsd-comment-tag-group dd:after {\n        content: \" \";\n    }\n    dl.tsd-comment-tag-group dd pre,\n    dl.tsd-comment-tag-group dd:after {\n        clear: both;\n    }\n    dl.tsd-comment-tag-group p {\n        margin: 0;\n    }\n\n    .tsd-panel.tsd-comment .lead {\n        font-size: 1.1em;\n        line-height: 1.333em;\n        margin-bottom: 2em;\n    }\n    .tsd-panel.tsd-comment .lead:last-child {\n        margin-bottom: 0;\n    }\n\n    .tsd-filter-visibility h4 {\n        font-size: 1rem;\n        padding-top: 0.75rem;\n        padding-bottom: 0.5rem;\n        margin: 0;\n    }\n    .tsd-filter-item:not(:last-child) {\n        margin-bottom: 0.5rem;\n    }\n    .tsd-filter-input {\n        display: flex;\n        width: -moz-fit-content;\n        width: fit-content;\n        align-items: center;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        user-select: none;\n        cursor: pointer;\n    }\n    .tsd-filter-input input[type=\"checkbox\"] {\n        cursor: pointer;\n        position: absolute;\n        width: 1.5em;\n        height: 1.5em;\n        opacity: 0;\n    }\n    .tsd-filter-input input[type=\"checkbox\"]:disabled {\n        pointer-events: none;\n    }\n    .tsd-filter-input svg {\n        cursor: pointer;\n        width: 1.5em;\n        height: 1.5em;\n        margin-right: 0.5em;\n        border-radius: 0.33em;\n        /* Leaving this at full opacity breaks event listeners on Firefox.\n        Don't remove unless you know what you're doing. */\n        opacity: 0.99;\n    }\n    .tsd-filter-input input[type=\"checkbox\"]:focus-visible + svg {\n        outline: 2px solid var(--color-focus-outline);\n    }\n    .tsd-checkbox-background {\n        fill: var(--color-accent);\n    }\n    input[type=\"checkbox\"]:checked ~ svg .tsd-checkbox-checkmark {\n        stroke: var(--color-text);\n    }\n    .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background {\n        fill: var(--color-background);\n        stroke: var(--color-accent);\n        stroke-width: 0.25rem;\n    }\n    .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark {\n        stroke: var(--color-accent);\n    }\n\n    .settings-label {\n        font-weight: bold;\n        text-transform: uppercase;\n        display: inline-block;\n    }\n\n    .tsd-filter-visibility .settings-label {\n        margin: 0.75rem 0 0.5rem 0;\n    }\n\n    .tsd-theme-toggle .settings-label {\n        margin: 0.75rem 0.75rem 0 0;\n    }\n\n    .tsd-hierarchy h4 label:hover span {\n        text-decoration: underline;\n    }\n\n    .tsd-hierarchy {\n        list-style: square;\n        margin: 0;\n    }\n    .tsd-hierarchy-target {\n        font-weight: bold;\n    }\n    .tsd-hierarchy-toggle {\n        color: var(--color-link);\n        cursor: pointer;\n    }\n\n    .tsd-full-hierarchy:not(:last-child) {\n        margin-bottom: 1em;\n        padding-bottom: 1em;\n        border-bottom: 1px solid var(--color-accent);\n    }\n    .tsd-full-hierarchy,\n    .tsd-full-hierarchy ul {\n        list-style: none;\n        margin: 0;\n        padding: 0;\n    }\n    .tsd-full-hierarchy ul {\n        padding-left: 1.5rem;\n    }\n    .tsd-full-hierarchy a {\n        padding: 0.25rem 0 !important;\n        font-size: 1rem;\n        display: inline-flex;\n        align-items: center;\n        color: var(--color-text);\n    }\n    .tsd-full-hierarchy svg[data-dropdown] {\n        cursor: pointer;\n    }\n    .tsd-full-hierarchy svg[data-dropdown=\"false\"] {\n        transform: rotate(-90deg);\n    }\n    .tsd-full-hierarchy svg[data-dropdown=\"false\"] ~ ul {\n        display: none;\n    }\n\n    .tsd-panel-group.tsd-index-group {\n        margin-bottom: 0;\n    }\n    .tsd-index-panel .tsd-index-list {\n        list-style: none;\n        line-height: 1.333em;\n        margin: 0;\n        padding: 0.25rem 0 0 0;\n        overflow: hidden;\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        column-gap: 1rem;\n        grid-template-rows: auto;\n    }\n    @media (max-width: 1024px) {\n        .tsd-index-panel .tsd-index-list {\n            grid-template-columns: repeat(2, 1fr);\n        }\n    }\n    @media (max-width: 768px) {\n        .tsd-index-panel .tsd-index-list {\n            grid-template-columns: repeat(1, 1fr);\n        }\n    }\n    .tsd-index-panel .tsd-index-list li {\n        -webkit-page-break-inside: avoid;\n        -moz-page-break-inside: avoid;\n        -ms-page-break-inside: avoid;\n        -o-page-break-inside: avoid;\n        page-break-inside: avoid;\n    }\n\n    .tsd-flag {\n        display: inline-block;\n        padding: 0.25em 0.4em;\n        border-radius: 4px;\n        color: var(--color-comment-tag-text);\n        background-color: var(--color-comment-tag);\n        text-indent: 0;\n        font-size: 75%;\n        line-height: 1;\n        font-weight: normal;\n    }\n\n    .tsd-anchor {\n        position: relative;\n        top: -100px;\n    }\n\n    .tsd-member {\n        position: relative;\n    }\n    .tsd-member .tsd-anchor + h3 {\n        display: flex;\n        align-items: center;\n        margin-top: 0;\n        margin-bottom: 0;\n        border-bottom: none;\n    }\n\n    .tsd-navigation.settings {\n        margin: 0;\n        margin-bottom: 1rem;\n    }\n    .tsd-navigation > a,\n    .tsd-navigation .tsd-accordion-summary {\n        width: calc(100% - 0.25rem);\n        display: flex;\n        align-items: center;\n    }\n    .tsd-navigation a,\n    .tsd-navigation summary > span,\n    .tsd-page-navigation a {\n        display: flex;\n        width: calc(100% - 0.25rem);\n        align-items: center;\n        padding: 0.25rem;\n        color: var(--color-text);\n        text-decoration: none;\n        box-sizing: border-box;\n    }\n    .tsd-navigation a.current,\n    .tsd-page-navigation a.current {\n        background: var(--color-active-menu-item);\n        color: var(--color-contrast-text);\n    }\n    .tsd-navigation a:hover,\n    .tsd-page-navigation a:hover {\n        text-decoration: underline;\n    }\n    .tsd-navigation ul,\n    .tsd-page-navigation ul {\n        margin-top: 0;\n        margin-bottom: 0;\n        padding: 0;\n        list-style: none;\n    }\n    .tsd-navigation li,\n    .tsd-page-navigation li {\n        padding: 0;\n        max-width: 100%;\n    }\n    .tsd-navigation .tsd-nav-link {\n        display: none;\n    }\n    .tsd-nested-navigation {\n        margin-left: 3rem;\n    }\n    .tsd-nested-navigation > li > details {\n        margin-left: -1.5rem;\n    }\n    .tsd-small-nested-navigation {\n        margin-left: 1.5rem;\n    }\n    .tsd-small-nested-navigation > li > details {\n        margin-left: -1.5rem;\n    }\n\n    .tsd-page-navigation-section > summary {\n        padding: 0.25rem;\n    }\n    .tsd-page-navigation-section > summary > svg {\n        margin-right: 0.25rem;\n    }\n    .tsd-page-navigation-section > div {\n        margin-left: 30px;\n    }\n    .tsd-page-navigation ul {\n        padding-left: 1.75rem;\n    }\n\n    #tsd-sidebar-links a {\n        margin-top: 0;\n        margin-bottom: 0.5rem;\n        line-height: 1.25rem;\n    }\n    #tsd-sidebar-links a:last-of-type {\n        margin-bottom: 0;\n    }\n\n    a.tsd-index-link {\n        padding: 0.25rem 0 !important;\n        font-size: 1rem;\n        line-height: 1.25rem;\n        display: inline-flex;\n        align-items: center;\n        color: var(--color-text);\n    }\n    .tsd-accordion-summary {\n        list-style-type: none; /* hide marker on non-safari */\n        outline: none; /* broken on safari, so just hide it */\n        display: flex;\n        align-items: center;\n        gap: 0.25rem;\n        box-sizing: border-box;\n    }\n    .tsd-accordion-summary::-webkit-details-marker {\n        display: none; /* hide marker on safari */\n    }\n    .tsd-accordion-summary,\n    .tsd-accordion-summary a {\n        -moz-user-select: none;\n        -webkit-user-select: none;\n        -ms-user-select: none;\n        user-select: none;\n\n        cursor: pointer;\n    }\n    .tsd-accordion-summary a {\n        width: calc(100% - 1.5rem);\n    }\n    .tsd-accordion-summary > * {\n        margin-top: 0;\n        margin-bottom: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n    }\n    /*\n     * We need to be careful to target the arrow indicating whether the accordion\n     * is open, but not any other SVGs included in the details element.\n     */\n    .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child {\n        transform: rotate(-90deg);\n    }\n    .tsd-index-content > :not(:first-child) {\n        margin-top: 0.75rem;\n    }\n    .tsd-index-summary {\n        margin-top: 1.5rem;\n        margin-bottom: 0.75rem;\n        display: flex;\n        align-content: center;\n    }\n\n    .tsd-no-select {\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        user-select: none;\n    }\n    .tsd-kind-icon {\n        margin-right: 0.5rem;\n        width: 1.25rem;\n        height: 1.25rem;\n        min-width: 1.25rem;\n        min-height: 1.25rem;\n    }\n    .tsd-signature > .tsd-kind-icon {\n        margin-right: 0.8rem;\n    }\n\n    .tsd-panel {\n        margin-bottom: 2.5rem;\n    }\n    .tsd-panel.tsd-member {\n        margin-bottom: 4rem;\n    }\n    .tsd-panel:empty {\n        display: none;\n    }\n    .tsd-panel > h1,\n    .tsd-panel > h2,\n    .tsd-panel > h3 {\n        margin: 1.5rem -1.5rem 0.75rem -1.5rem;\n        padding: 0 1.5rem 0.75rem 1.5rem;\n    }\n    .tsd-panel > h1.tsd-before-signature,\n    .tsd-panel > h2.tsd-before-signature,\n    .tsd-panel > h3.tsd-before-signature {\n        margin-bottom: 0;\n        border-bottom: none;\n    }\n\n    .tsd-panel-group {\n        margin: 2rem 0;\n    }\n    .tsd-panel-group.tsd-index-group {\n        margin: 2rem 0;\n    }\n    .tsd-panel-group.tsd-index-group details {\n        margin: 2rem 0;\n    }\n    .tsd-panel-group > .tsd-accordion-summary {\n        margin-bottom: 1rem;\n    }\n\n    #tsd-search[open] {\n        animation: fade-in var(--modal-animation-duration) ease-out forwards;\n    }\n    #tsd-search[open].closing {\n        animation-name: fade-out;\n    }\n\n    /* Avoid setting `display` on closed dialog */\n    #tsd-search[open] {\n        display: flex;\n        flex-direction: column;\n        padding: 1rem;\n        width: 32rem;\n        max-width: 90vw;\n        max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh);\n        /* Anchor dialog to top */\n        margin-top: 10vh;\n        border-radius: 6px;\n        will-change: max-height;\n    }\n    #tsd-search-input {\n        box-sizing: border-box;\n        width: 100%;\n        padding: 0 0.625rem; /* 10px */\n        outline: 0;\n        border: 2px solid var(--color-accent);\n        background-color: transparent;\n        color: var(--color-text);\n        border-radius: 4px;\n        height: 2.5rem;\n        flex: 0 0 auto;\n        font-size: 0.875rem;\n        transition: border-color 0.2s, background-color 0.2s;\n    }\n    #tsd-search-input:focus-visible {\n        background-color: var(--color-background-active);\n        border-color: transparent;\n        color: var(--color-contrast-text);\n    }\n    #tsd-search-input::placeholder {\n        color: inherit;\n        opacity: 0.8;\n    }\n    #tsd-search-results {\n        margin: 0;\n        padding: 0;\n        list-style: none;\n        flex: 1 1 auto;\n        display: flex;\n        flex-direction: column;\n        overflow-y: auto;\n    }\n    #tsd-search-results:not(:empty) {\n        margin-top: 0.5rem;\n    }\n    #tsd-search-results > li {\n        background-color: var(--color-background);\n        line-height: 1.5;\n        box-sizing: border-box;\n        border-radius: 4px;\n    }\n    #tsd-search-results > li:nth-child(even) {\n        background-color: var(--color-background-secondary);\n    }\n    #tsd-search-results > li:is(:hover, [aria-selected=\"true\"]) {\n        background-color: var(--color-background-active);\n        color: var(--color-contrast-text);\n    }\n    /* It's important that this takes full size of parent `li`, to capture a click on `li` */\n    #tsd-search-results > li > a {\n        display: flex;\n        align-items: center;\n        padding: 0.5rem 0.25rem;\n        box-sizing: border-box;\n        width: 100%;\n    }\n    #tsd-search-results > li > a > .text {\n        flex: 1 1 auto;\n        min-width: 0;\n        overflow-wrap: anywhere;\n    }\n    #tsd-search-results > li > a .parent {\n        color: var(--color-text-aside);\n    }\n    #tsd-search-results > li > a mark {\n        color: inherit;\n        background-color: inherit;\n        font-weight: bold;\n    }\n    #tsd-search-status {\n        flex: 1;\n        display: grid;\n        place-content: center;\n        text-align: center;\n        overflow-wrap: anywhere;\n    }\n    #tsd-search-status:not(:empty) {\n        min-height: 6rem;\n    }\n\n    .tsd-signature {\n        margin: 0 0 1rem 0;\n        padding: 1rem 0.5rem;\n        border: 1px solid var(--color-accent);\n        font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n        font-size: 14px;\n        overflow-x: auto;\n    }\n\n    .tsd-signature-keyword {\n        color: var(--color-ts-keyword);\n        font-weight: normal;\n    }\n\n    .tsd-signature-symbol {\n        color: var(--color-text-aside);\n        font-weight: normal;\n    }\n\n    .tsd-signature-type {\n        font-style: italic;\n        font-weight: normal;\n    }\n\n    .tsd-signatures {\n        padding: 0;\n        margin: 0 0 1em 0;\n        list-style-type: none;\n    }\n    .tsd-signatures .tsd-signature {\n        margin: 0;\n        border-color: var(--color-accent);\n        border-width: 1px 0;\n        transition: background-color 0.1s;\n    }\n    .tsd-signatures .tsd-index-signature:not(:last-child) {\n        margin-bottom: 1em;\n    }\n    .tsd-signatures .tsd-index-signature .tsd-signature {\n        border-width: 1px;\n    }\n    .tsd-description .tsd-signatures .tsd-signature {\n        border-width: 1px;\n    }\n\n    ul.tsd-parameter-list,\n    ul.tsd-type-parameter-list {\n        list-style: square;\n        margin: 0;\n        padding-left: 20px;\n    }\n    ul.tsd-parameter-list > li.tsd-parameter-signature,\n    ul.tsd-type-parameter-list > li.tsd-parameter-signature {\n        list-style: none;\n        margin-left: -20px;\n    }\n    ul.tsd-parameter-list h5,\n    ul.tsd-type-parameter-list h5 {\n        font-size: 16px;\n        margin: 1em 0 0.5em 0;\n    }\n    .tsd-sources {\n        margin-top: 1rem;\n        font-size: 0.875em;\n    }\n    .tsd-sources a {\n        color: var(--color-text-aside);\n        text-decoration: underline;\n    }\n    .tsd-sources ul {\n        list-style: none;\n        padding: 0;\n    }\n\n    .tsd-page-toolbar {\n        position: sticky;\n        z-index: 1;\n        top: 0;\n        left: 0;\n        width: 100%;\n        color: var(--color-text);\n        background: var(--color-background-secondary);\n        border-bottom: var(--dim-toolbar-border-bottom-width)\n            var(--color-accent) solid;\n        transition: transform 0.3s ease-in-out;\n    }\n    .tsd-page-toolbar a {\n        color: var(--color-text);\n    }\n    .tsd-toolbar-contents {\n        display: flex;\n        align-items: center;\n        height: var(--dim-toolbar-contents-height);\n        margin: 0 auto;\n    }\n    .tsd-toolbar-contents > .title {\n        font-weight: bold;\n        margin-right: auto;\n    }\n    #tsd-toolbar-links {\n        display: flex;\n        align-items: center;\n        gap: 1.5rem;\n        margin-right: 1rem;\n    }\n\n    .tsd-widget {\n        box-sizing: border-box;\n        display: inline-block;\n        opacity: 0.8;\n        height: 2.5rem;\n        width: 2.5rem;\n        transition: opacity 0.1s, background-color 0.1s;\n        text-align: center;\n        cursor: pointer;\n        border: none;\n        background-color: transparent;\n    }\n    .tsd-widget:hover {\n        opacity: 0.9;\n    }\n    .tsd-widget:active {\n        opacity: 1;\n        background-color: var(--color-accent);\n    }\n    #tsd-toolbar-menu-trigger {\n        display: none;\n    }\n\n    .tsd-member-summary-name {\n        display: inline-flex;\n        align-items: center;\n        padding: 0.25rem;\n        text-decoration: none;\n    }\n\n    .tsd-anchor-icon {\n        display: inline-flex;\n        align-items: center;\n        margin-left: 0.5rem;\n        color: var(--color-text);\n        vertical-align: middle;\n    }\n\n    .tsd-anchor-icon svg {\n        width: 1em;\n        height: 1em;\n        visibility: hidden;\n    }\n\n    .tsd-member-summary-name:hover > .tsd-anchor-icon svg,\n    .tsd-anchor-link:hover > .tsd-anchor-icon svg,\n    .tsd-anchor-icon:focus-visible svg {\n        visibility: visible;\n    }\n\n    .deprecated {\n        text-decoration: line-through !important;\n    }\n\n    .warning {\n        padding: 1rem;\n        color: var(--color-warning-text);\n        background: var(--color-background-warning);\n    }\n\n    .tsd-kind-project {\n        color: var(--color-ts-project);\n    }\n    .tsd-kind-module {\n        color: var(--color-ts-module);\n    }\n    .tsd-kind-namespace {\n        color: var(--color-ts-namespace);\n    }\n    .tsd-kind-enum {\n        color: var(--color-ts-enum);\n    }\n    .tsd-kind-enum-member {\n        color: var(--color-ts-enum-member);\n    }\n    .tsd-kind-variable {\n        color: var(--color-ts-variable);\n    }\n    .tsd-kind-function {\n        color: var(--color-ts-function);\n    }\n    .tsd-kind-class {\n        color: var(--color-ts-class);\n    }\n    .tsd-kind-interface {\n        color: var(--color-ts-interface);\n    }\n    .tsd-kind-constructor {\n        color: var(--color-ts-constructor);\n    }\n    .tsd-kind-property {\n        color: var(--color-ts-property);\n    }\n    .tsd-kind-method {\n        color: var(--color-ts-method);\n    }\n    .tsd-kind-reference {\n        color: var(--color-ts-reference);\n    }\n    .tsd-kind-call-signature {\n        color: var(--color-ts-call-signature);\n    }\n    .tsd-kind-index-signature {\n        color: var(--color-ts-index-signature);\n    }\n    .tsd-kind-constructor-signature {\n        color: var(--color-ts-constructor-signature);\n    }\n    .tsd-kind-parameter {\n        color: var(--color-ts-parameter);\n    }\n    .tsd-kind-type-parameter {\n        color: var(--color-ts-type-parameter);\n    }\n    .tsd-kind-accessor {\n        color: var(--color-ts-accessor);\n    }\n    .tsd-kind-get-signature {\n        color: var(--color-ts-get-signature);\n    }\n    .tsd-kind-set-signature {\n        color: var(--color-ts-set-signature);\n    }\n    .tsd-kind-type-alias {\n        color: var(--color-ts-type-alias);\n    }\n\n    /* if we have a kind icon, don't color the text by kind */\n    .tsd-kind-icon ~ span {\n        color: var(--color-text);\n    }\n\n    /* mobile */\n    @media (max-width: 769px) {\n        #tsd-toolbar-menu-trigger {\n            display: inline-block;\n            /* temporary fix to vertically align, for compatibility */\n            line-height: 2.5;\n        }\n        #tsd-toolbar-links {\n            display: none;\n        }\n\n        .container-main {\n            display: flex;\n        }\n        .col-content {\n            float: none;\n            max-width: 100%;\n            width: 100%;\n        }\n        .col-sidebar {\n            position: fixed !important;\n            overflow-y: auto;\n            -webkit-overflow-scrolling: touch;\n            z-index: 1024;\n            top: 0 !important;\n            bottom: 0 !important;\n            left: auto !important;\n            right: 0 !important;\n            padding: 1.5rem 1.5rem 0 0;\n            width: 75vw;\n            visibility: hidden;\n            background-color: var(--color-background);\n            transform: translate(100%, 0);\n        }\n        .col-sidebar > *:last-child {\n            padding-bottom: 20px;\n        }\n        .overlay {\n            content: \"\";\n            display: block;\n            position: fixed;\n            z-index: 1023;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background-color: rgba(0, 0, 0, 0.75);\n            visibility: hidden;\n        }\n\n        .to-has-menu .overlay {\n            animation: fade-in 0.4s;\n        }\n\n        .to-has-menu .col-sidebar {\n            animation: pop-in-from-right 0.4s;\n        }\n\n        .from-has-menu .overlay {\n            animation: fade-out 0.4s;\n        }\n\n        .from-has-menu .col-sidebar {\n            animation: pop-out-to-right 0.4s;\n        }\n\n        .has-menu body {\n            overflow: hidden;\n        }\n        .has-menu .overlay {\n            visibility: visible;\n        }\n        .has-menu .col-sidebar {\n            visibility: visible;\n            transform: translate(0, 0);\n            display: flex;\n            flex-direction: column;\n            gap: 1.5rem;\n            max-height: 100vh;\n            padding: 1rem 2rem;\n        }\n        .has-menu .tsd-navigation {\n            max-height: 100%;\n        }\n        .tsd-navigation .tsd-nav-link {\n            display: flex;\n        }\n    }\n\n    /* one sidebar */\n    @media (min-width: 770px) {\n        .container-main {\n            display: grid;\n            grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);\n            grid-template-areas: \"sidebar content\";\n            --dim-container-main-margin-y: 2rem;\n        }\n\n        .tsd-breadcrumb {\n            margin-top: 0;\n        }\n\n        .col-sidebar {\n            grid-area: sidebar;\n        }\n        .col-content {\n            grid-area: content;\n            padding: 0 1rem;\n        }\n    }\n    @media (min-width: 770px) and (max-width: 1399px) {\n        .col-sidebar {\n            max-height: calc(\n                100vh - var(--dim-header-height) - var(--dim-footer-height) -\n                    2 * var(--dim-container-main-margin-y)\n            );\n            overflow: auto;\n            position: sticky;\n            top: calc(\n                var(--dim-header-height) + var(--dim-container-main-margin-y)\n            );\n        }\n        .site-menu {\n            margin-top: 1rem;\n        }\n    }\n\n    /* two sidebars */\n    @media (min-width: 1200px) {\n        .container-main {\n            grid-template-columns:\n                minmax(0, 1fr) minmax(0, 2.5fr) minmax(\n                    0,\n                    20rem\n                );\n            grid-template-areas: \"sidebar content toc\";\n        }\n\n        .col-sidebar {\n            display: contents;\n        }\n\n        .page-menu {\n            grid-area: toc;\n            padding-left: 1rem;\n        }\n        .site-menu {\n            grid-area: sidebar;\n        }\n\n        .site-menu {\n            margin-top: 0rem;\n        }\n\n        .page-menu,\n        .site-menu {\n            max-height: calc(\n                100vh - var(--dim-header-height) - var(--dim-footer-height) -\n                    2 * var(--dim-container-main-margin-y)\n            );\n            overflow: auto;\n            position: sticky;\n            top: calc(\n                var(--dim-header-height) + var(--dim-container-main-margin-y)\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"module\": \"Node16\",\n        \"lib\": [\"es2023\"],\n        \"target\": \"es2022\",\n\n        // Add our `ts` internal types\n        \"typeRoots\": [\"node_modules/@types\", \"src/lib/types\"],\n        \"types\": [\"node\", \"lunr\", \"mocha\"],\n        // Speed up dev compilation time\n        \"incremental\": true,\n        \"tsBuildInfoFile\": \"dist/.tsbuildinfo\",\n        \"skipLibCheck\": false,\n\n        \"strict\": true,\n        \"alwaysStrict\": true,\n        // For tests\n        \"resolveJsonModule\": true,\n        // Linting\n        \"noUnusedLocals\": true,\n        \"noUnusedParameters\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"noUncheckedSideEffectImports\": true,\n        // Library\n        \"preserveConstEnums\": true,\n        \"declaration\": true,\n        \"sourceMap\": true,\n        \"declarationMap\": true,\n        \"noImplicitOverride\": true,\n        \"noPropertyAccessFromIndexSignature\": true,\n        // Output\n        \"outDir\": \"dist/\",\n        \"rootDir\": \"src/\",\n        \"newLine\": \"LF\",\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"JSX.createElement\",\n        \"jsxFragmentFactory\": \"JSX.Fragment\",\n        \"verbatimModuleSyntax\": true,\n        \"isolatedModules\": true\n    },\n    \"include\": [\"src\"],\n    \"exclude\": [\n        \"src/lib/output/themes/default/assets\",\n        \"src/test/converter\",\n        \"src/test/converter2\",\n        \"src/test/renderer/specs\",\n        \"src/test/.dot\",\n        \"src/test/module\",\n        \"src/test/packages\",\n        \"src/test/slow/entry-points\",\n        \"src/test/renderer/testProject\"\n    ]\n}\n"
  },
  {
    "path": "tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    // If updating this, also update tsdoc-defaults.ts\n    \"noStandardTags\": false,\n    \"tagDefinitions\": [\n        {\n            \"tagName\": \"@author\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@module\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@mergeModuleWith\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@type\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@typedef\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@callback\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@prop\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@property\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        // Don't include @inheritDoc, because the @microsoft/tsdoc-config parser blows up\n        // if the standard @inheritDoc inline tag is also defined here.\n        {\n            \"tagName\": \"@group\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@groupDescription\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@disableGroups\",\n            \"syntaxKind\": \"modifier\",\n            \"allowMultiple\": false\n        },\n        {\n            \"tagName\": \"@category\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@categoryDescription\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@hidden\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@ignore\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@class\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@abstract\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@document\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@default\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@extends\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@augments\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            // TSDoc defines @returns, we also recognize @return for JSDoc compat\n            \"tagName\": \"@return\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@yields\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@enum\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@event\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@expand\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@preventExpand\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@expandType\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@inline\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@preventInline\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@inlineType\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@primaryExport\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@template\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@this\",\n            \"syntaxKind\": \"block\",\n            \"allowMultiple\": false\n        },\n        {\n            \"tagName\": \"@linkcode\",\n            \"syntaxKind\": \"inline\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@linkplain\",\n            \"syntaxKind\": \"inline\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@include\",\n            \"syntaxKind\": \"inline\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@includeCode\",\n            \"syntaxKind\": \"inline\",\n            \"allowMultiple\": true\n        },\n        {\n            \"tagName\": \"@private\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@protected\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@satisfies\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@since\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@license\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@import\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@overload\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@namespace\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@interface\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@function\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@showCategories\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@hideCategories\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@showGroups\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@hideGroups\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@hideconstructor\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@summary\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@useDeclaredType\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@sortStrategy\",\n            \"syntaxKind\": \"block\"\n        }\n    ]\n}\n"
  }
]