{"id":46801974,"url":"https://github.com/homer0/jsdoc-ts-utils","last_synced_at":"2026-03-10T06:02:38.163Z","repository":{"id":38172667,"uuid":"279513779","full_name":"homer0/jsdoc-ts-utils","owner":"homer0","description":"A plugin with utilities to make your TypeScript-like docs JSDoc valid","archived":false,"fork":false,"pushed_at":"2025-12-07T05:46:05.000Z","size":2079,"stargazers_count":13,"open_issues_count":0,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-25T23:15:03.610Z","etag":null,"topics":["hacktoberfest","jsdoc","jsdoc-plugin","typescript"],"latest_commit_sha":null,"homepage":"https://homer0.github.io/jsdoc-ts-utils","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/homer0.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-07-14T07:26:37.000Z","updated_at":"2025-12-07T05:46:09.000Z","dependencies_parsed_at":"2024-06-18T17:34:36.082Z","dependency_job_id":"825fcb2b-e73d-45bc-b63e-c7ab83a68953","html_url":"https://github.com/homer0/jsdoc-ts-utils","commit_stats":{"total_commits":101,"total_committers":6,"mean_commits":"16.833333333333332","dds":0.5346534653465347,"last_synced_commit":"b845330bc4d9dc7dafafa456d3c231575830b79d"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/homer0/jsdoc-ts-utils","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homer0%2Fjsdoc-ts-utils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homer0%2Fjsdoc-ts-utils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homer0%2Fjsdoc-ts-utils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homer0%2Fjsdoc-ts-utils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/homer0","download_url":"https://codeload.github.com/homer0/jsdoc-ts-utils/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homer0%2Fjsdoc-ts-utils/sbom","scorecard":{"id":468248,"data":{"date":"2025-08-11","repo":{"name":"github.com/homer0/jsdoc-ts-utils","commit":"b845330bc4d9dc7dafafa456d3c231575830b79d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/12 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/homer0/jsdoc-ts-utils/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/homer0/jsdoc-ts-utils/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/homer0/jsdoc-ts-utils/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/homer0/jsdoc-ts-utils/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/homer0/jsdoc-ts-utils/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/homer0/jsdoc-ts-utils/test.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .husky/post-merge:4","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   2 out of   3 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T13:04:53.946Z","repository_id":38172667,"created_at":"2025-08-19T13:04:53.946Z","updated_at":"2025-08-19T13:04:53.946Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29736257,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T02:24:00.660Z","status":"ssl_error","status_checked_at":"2026-02-23T02:22:56.087Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest","jsdoc","jsdoc-plugin","typescript"],"created_at":"2026-03-10T06:02:37.487Z","updated_at":"2026-03-10T06:02:38.144Z","avatar_url":"https://github.com/homer0.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JSDoc TypeScript utils\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/homer0/jsdoc-ts-utils/test.yml?branch=main\u0026style=flat-square)](https://github.com/homer0/jsdoc-ts-utils/actions/workflows/test.yml?query=branch%3Amain)\n[![Coveralls GitHub](https://img.shields.io/coveralls/github/homer0/jsdoc-ts-utils.svg?style=flat-square)](https://coveralls.io/github/homer0/jsdoc-ts-utils?branch=main)\n![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/npm/jsdoc-ts-utils?style=flat-square)\n\nA plugin with utilities to make your TypeScript-like docs JSDoc valid\n\n## Introduction\n\nThis plugin allows you to take advantage of the [TypeScript](https://www.typescriptlang.org) language server on modern IDEs/editors to generate [intelligent code completion](https://en.wikipedia.org/wiki/Intelligent_code_completion) using your [JSDoc](https://jsdoc.app) comments, and at the same time, be able to generate a documentation site with JSDoc CLI.\n\nThe reason this plugin exists is that JSDoc comments as specified by its _convention_ are not 100% compatible with TypeScript, and they don't cover all the cases; sometimes, writing something that is JSDoc valid can end up killing the code completion, and other times, writing something for the code completion can cause invalid code for the JSDoc CLI.\n\nThe plugin counts with a few features you can use to write code valid for TypeScript that will also be valid for the JSDoc CLI.\n\nThere are also a few features that are designed to make the code compatible with the [ESLint plugin for JSDoc](https://npmjs.com/package/eslint-plugin-jsdoc), highly recommended if you are getting serious with JSDoc.\n\n## Configuration\n\nThe first thing you need to do after installing the package, is to add it to the `plugins` array on your JSDoc configuration:\n\n```js\n{\n  // ...\n  \"plugins\": [\n    \"jsdoc-ts-utils\",\n    // ...\n  ]\n}\n```\n\n\u003e It's important do add it first as it makes modifications to the code in order to make it valid. If a plugin that requires the code to be valid gets executed first, you may end up with unexpected errors.\n\nSince JSDoc doesn't allow to add configuration options on the `plugins` list, if you need to change the settings, you'll need to create a `tsUtils` object:\n\n```js\n{\n  // ...\n  \"plugins\": [\n    \"jsdoc-ts-utils\",\n    // ...\n  ],\n  \"tsUtils\": {\n    \"typedefImports\": true,\n    \"typeOfTypes\": true,\n    \"extendTypes\": true,\n    \"modulesOnMemberOf\": true,\n    \"modulesTypesShortName\": true,\n    \"parentTag\": true,\n    \"removeTaggedBlocks\": true,\n    \"removeTags\": true,\n    \"typeScriptUtilityTypes\": true,\n    \"tagsReplacement\": {}\n  }\n}\n```\n\n| Option | Default | Description |\n| ------ | ------- | ----------- |\n| `typedefImports` | `true` | Whether or not to enable the feature that removes `typedef` statements that use `import`. |\n| `typeOfTypes` | `true` | Whether or not to enable the feature that replaces `{typeof T}` with `{Class.\u003cT\u003e}`. |\n| `extendTypes` | `true` | Whether or not to enable the feature that allows intersections to be reformatted. |\n| `modulesOnMemberOf` | `true` | Whether or not to enable the feature that fixes modules' paths on `memberof` so they can use dot notation. |\n| `modulesTypesShortName` | `true` | Whether or not to register modules types without the module path too. |\n| `parentTag` | `true` | Whether or not to transform all `parent` tags into `memberof`. |\n| `removeTaggedBlocks` | `true` | Whether or not to remove all blocks that have a `@jsdoc-remove` tag. |\n| `removeTags` | `true` | Whether or not to remove all tags that follow a `@jsdoc-remove-next-tag` tag. |\n| `typeScriptUtilityTypes` | `true` | Whether or not to add the external utility types from TypeScript. |\n| `tagsReplacement` | `null` | A dictionary of tags to replace, they keys are the tags being used and the values the tag that should be used. |\n\n## Features\n\n### Import type definitions\n\n```js\n/**\n * @typedef {import('./daughters').Rosario} Rosario\n */\n```\n\nThis syntax can be used to import a type from another file without having to import a variable that you won't be using. It not only allows you to import the type of an existing object, but also a type defined with `@typedef`.\n\nThe feature will detect the block and replace it with empty lines (so it doesn't mess up the lines of other definitions on the generated site).\n\nIn case you want to import the type but show it as an external on the site, because it's the type of an installed library and you want to reference it or something, you could use the following syntax:\n\n```js\n/**\n * @typedef {import('family/daughters').Pilar} Pilar\n * @external Pilar\n * @see https://npmjs.com/package/family\n */\n```\n\nThe feature will only replace the line for the `@typedef` and leave the rest.\n\nThis is enabled by default but you can disable it with the `typedefImports` option.\n\n### Use `typeof` as a type\n\n```js\n/**\n * @typedef {typeof Rosario} ClassRosario\n */\n```\n\nOne of the most \"complicated\" things you'll find when typing with JSDoc is how to type class constructors. Let's say a function receives a parameter that is not an instance of the class but its constructor, the `@param` can't be the type of the class: you won't get the autocomplete if you call `new` on it.\n\nUsing the previous feature you can define a `@typedef` with an `import` to the file and the brackets syntax (`import('...')['MyClass']`) to get the constructor reference... but what if you are on the same file as the class? that's when you use `{typeof MyClass}`.\n\nThe `typeof Class` inside a type is not valid JSDoc, so this feature will transform it in order to use the convention `Class.\u003cMyClass\u003e`:\n\n```js\n/**\n * @typedef {Class.\u003cRosario\u003e} ClassRosario\n */\n```\n\nThis is enabled by default but you can disable it with the `typeOfTypes` option.\n\n### Extending existing types\n\n```js\n/**\n * @typedef {Object} Entity\n * @property {string} shape ...\n * @property {string} name  ...\n */\n\n/**\n * @typedef {Entity \u0026 PersonProperties} Person\n */\n\n/**\n * @typedef {Object} PersonProperties\n * @property {number} age    ...\n * @property {number} height ...\n * @augments Person\n */\n```\n\nYou can extend an existing type by defining a new one with the new attributes/properties and another one that intersect it with the original.\n\nThe feature will find the one with the intersection, look if there's a type that `augments`/`extends` it, remove the intersection, move the attributes/properties to its own definition and remove the extra definition:\n\n```js\n/**\n * @typedef {Object} Entity\n * @property {string} shape ...\n * @property {string} name  ...\n */\n\n/**\n * @typedef {Entity} Person\n * @property {number} age    ...\n * @property {number} height ...\n */\n```\n\nIf the feature can't find a type the `augments`/`extends` the intersection, it will simply transform it into a union.\n\n\u003e **Note:** You should always define the attributes/properties type after the intersection type, so when the feature removes it, it won't mess up the lines of other definitions on the generated site.\n\nThis is enabled by default but you can disable it with the `extendTypes` option.\n\n### Modules' paths on @memberof\n\n```js\n/**\n * @typedef {Object} Entity\n * @property {string} shape ...\n * @property {string} name  ...\n * @memberof module.services.utils\n */\n```\n\nThis is meant to solve issues with the ESLint plugin: If the plugin is configured for TypeScript, you can't use the `module:` prefix on `@memberof`, as the parser doesn't support it.\n\nAdding modules to definitions is something really useful to group parts of your project on the generated site, so this feature allows you to use dot notation: `module.[path]` instead of `module:[path]` and it will automatically transform it before the JSDoc CLI reads it.\n\nThis is enabled by default but you can disable it with the `modulesOnMemberOf` option.\n\n### Modules' types short names\n\n```js\n/**\n * @typedef {Object} Entity\n * @property {string} shape ...\n * @property {string} name  ...\n * @memberof module.services.utils\n */\n\n/**\n * @param {Entity} entity\n * ...\n */\n```\n\nWhen you add `@memberof` to a type definition, you cannot longer reference the type by its name alone, you have to use the `module:[path].[type]` format for the JSDoc CLI to properly link it... not great.\n\nThis features intercepts the creation of the links for types on the generated site and if the type has the `module:` prefix, it will also register it without the prefix as an alias.\n\nSomething similar happens with externals; when you want to reference an external, you need to use `external:[type]`... yes, the feature takes care of that too.\n\nThis is enabled by default but you can disable it with the `modulesTypesShortName` option.\n\n### @parent tag\n\n```js\n/**\n * @typedef {Object} Entity\n * @property {string} shape ...\n * @property {string} name  ...\n * @parent module:services/utils\n */\n```\n\nIf you use special characters on your modules names, like `/`, then `modulesOnMemberOf` won't be enough to help you: the parser the ESLint plugin uses for TypeScript only allows dot notation.\n\nThis feature is simply an alias for `@memberof`: you put whatever you want in the `@parent` tag, and before generating the site, it will be converted to `@memberof`.\n\n\u003e If you are taking advantage of this feature and using the ESLint plugin, you should add `parent` to the `definedTags` option of the `jsdoc/check-tag-names` rule.\n\nThis is enabled by default but you can disable it with the `parentTag` option.\n\n### Remove blocks\n\n```js\n/**\n * @typedef {JQuery.AjaxSettings['success']} JQueryOnSuccess\n * @jsdoc-remove\n */\n```\n\nSometimes you have types that could make the site generation fail, and you can't fix them with any of the other features this plugin provides. For those cases, you can use the `@jsdoc-remove` tag to completely remove the block before it even gets processed by the JSDoc CLI.\n\nThis is enabled by default but you can disable it with the `removeTaggedBlocks` option.\n\n### Remove tags\n\n```js\n/**\n * @jsdoc-remove-next-tag\n * @typedef {JQuery.AjaxSettings['success']} JQueryOnSuccess\n * @external JQueryOnSuccess\n * @see {@link http://api.jquery.com/jQuery.ajax/#success}\n */\n```\n\nWhile the `jsdoc-remove` tag may be util to get rid of those blocks that breaks the site generation, sometime you just want to remove one single tag, as separating in multiple blocks may make the code hard to read. For those cases, you can use the `@jsdoc-remove-next-tag` tag, and it will only remove the next tag.\n\nYou can even use it multiple times in a single block:\n\n```js\n/**\n * @jsdoc-remove-next-tag\n * @typedef {JQuery.AjaxSettings['success']} JQueryOnSuccess\n * @external JQueryOnSuccess\n * @see {@link http://api.jquery.com/jQuery.ajax/#success}\n * @jsdoc-remove-next-tag\n * @typedef {JQuery.AjaxSettings['error']} JQueryOnError\n * @external JQueryOnError\n * @see {@link http://api.jquery.com/jQuery.ajax/#error}\n */\n```\n\nThis is enabled by default but you can disable it with the `removeTags` option.\n\n### TypeScript utility types\n\n```js\n/**\n * @typedef {Object} Entity\n * @property {string} shape ...\n * @property {string} name  ...\n */\n\n/**\n * @param {Partial\u003cEntity\u003e} entity\n * ...\n */\n```\n\nTypeScript already comes with a set of [utility types](https://www.typescriptlang.org/docs/handbook/utility-types.html) that you can use on your code and that the code completion will understand.\n\nThis feature basically takes those types and define them as `@external`s, so they can have links on the generated site.\n\nThis is enabled by default but you can disable it with the `typeScriptUtilityTypes` option.\n\n### Tags replacement\n\n```js\n/**\n * @parametro {string} name\n * @parametro {number} age\n * @retorno {Entity}\n */\n```\n\nThis feature doesn't have a specific use case, it was built for the `@parent` tag and I decided to expose as maybe someone would have the need for it.\n\nThe feature allows you to replace tags before generating the site. You define a \"replacement dictionary\" on the plugin configuration:\n\n```js\n{\n  // ...\n  \"plugins\": [\n    \"jsdoc-ts-utils\",\n    // ...\n  ],\n  \"tsUtils\": {\n    \"tagsReplacement\": {\n      \"parametro\": \"param\",\n      \"retorno\": \"returns\"\n    }\n  }\n}\n```\n\nAnd before generating the site, the feature will replace the tags from the keys with the ones from the values.\n\nNo modification to the `tagsReplacement` option will affect the `@parent` tag feature, they use different instances.\n\n## Development\n\n### Scripts\n\n| Task       | Description                          |\n|------------|--------------------------------------|\n| `docs`     | Generates the project documentation. |\n| `lint`     | Lints the staged files.              |\n| `lint:all` | Lints the entire project code.       |\n| `test`     | Runs the project unit tests.         |\n| `todo`     | Lists all the pending to-do's.       |\n\n### Repository hooks\n\nI use [`husky`](https://npmjs.com/package/husky) to automatically install the repository hooks so the code will be tested and linted before any commit, and the dependencies updated after every merge.\n\n#### Commits convention\n\nI use [conventional commits](https://www.conventionalcommits.org) with [`commitlint`](https://commitlint.js.org) in order to support semantic releases. The one that sets it up is actually husky, that installs a script that runs `commitlint` on the `git commit` command.\n\nThe configuration is on the `commitlint` property of the `package.json`.\n\n### Releases\n\nI use [`semantic-release`](https://npmjs.com/package/semantic-release) and a GitHub action to automatically release on NPM everything that gets merged to main.\n\nThe configuration for `semantic-release` is on `./releaserc` and the workflow for the release is on `./.github/workflow/release.yml`.\n\n### Testing\n\nI use [Jest](https://facebook.github.io/jest/) to test the project.\n\nThe configuration file is on `./.jestrc.js`, the tests are on `./tests` and the script that runs it is on `./utils/scripts/test`.\n\n### Linting \u0026\u0026 Formatting\n\nI use [ESlint](https://eslint.org) with [my own custom configuration](https://npmjs.com/package/@homer0/eslint-plugin) to validate all the JS code. The configuration file for the project code is on `./eslint.config.mjs`. The script that runs it is on `./utils/scripts/lint-all`.\n\nFor formatting I use [Prettier](https://prettier.io) with [my custom configuration](https://npmjs.com/package/@homer0/prettier-config). The configuration file for the project code is on `./.prettierrc.mjs`.\n\n### Documentation\n\nI use [JSDoc](https://jsdoc.app) to generate an HTML documentation site for the project.\n\nThe configuration file is on `./.jsdoc.js` and the script that runs it is on `./utils/scripts/docs`.\n\n### To-Dos\n\nI use `@todo` comments to write all the pending improvements and fixes, and [Leasot](https://npmjs.com/package/leasot) to generate a report.\n\nThe script that runs it is on `./utils/scripts/todo`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhomer0%2Fjsdoc-ts-utils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhomer0%2Fjsdoc-ts-utils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhomer0%2Fjsdoc-ts-utils/lists"}