{"id":13742245,"url":"https://github.com/asyncapi/parser-js","last_synced_at":"2026-01-30T17:03:33.987Z","repository":{"id":37752441,"uuid":"176187501","full_name":"asyncapi/parser-js","owner":"asyncapi","description":"AsyncAPI parser for Javascript (browser-compatible too).","archived":false,"fork":false,"pushed_at":"2025-12-23T11:56:40.000Z","size":87404,"stargazers_count":137,"open_issues_count":14,"forks_count":114,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-12-25T01:37:57.369Z","etag":null,"topics":["get-global-docs-autoupdate","get-global-node-release-workflows","get-global-releaserc","hacktoberfest","javascript","json-schema","nodejs","parser"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/asyncapi.png","metadata":{"funding":{"github":"asyncapi","patreon":null,"open_collective":"asyncapi","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null},"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-03-18T02:05:47.000Z","updated_at":"2025-12-23T11:56:45.000Z","dependencies_parsed_at":"2023-10-11T14:20:58.388Z","dependency_job_id":"f7cfa61f-78d0-49c3-b43e-92cdb7560a8d","html_url":"https://github.com/asyncapi/parser-js","commit_stats":{"total_commits":633,"total_committers":41,"mean_commits":"15.439024390243903","dds":0.5734597156398105,"last_synced_commit":"dd8c9e87dfcb2ebe547d324bc78dea0f7e4a60ed"},"previous_names":[],"tags_count":203,"template":false,"template_full_name":null,"purl":"pkg:github/asyncapi/parser-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asyncapi%2Fparser-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asyncapi%2Fparser-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asyncapi%2Fparser-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asyncapi%2Fparser-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asyncapi","download_url":"https://codeload.github.com/asyncapi/parser-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asyncapi%2Fparser-js/sbom","scorecard":{"id":214033,"data":{"date":"2025-08-11","repo":{"name":"github.com/asyncapi/parser-js","commit":"527cd3e0d97956bfeb19e421bf6b6f08c435404a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.5,"checks":[{"name":"Code-Review","score":9,"reason":"Found 27/28 approved changesets -- score normalized to 9","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":1,"reason":"1 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 1","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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/add-good-first-issue-labels.yml:1","Warn: no topLevel permission defined: .github/workflows/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml:1","Warn: no topLevel permission defined: .github/workflows/automerge-for-humans-merging.yml:1","Warn: no topLevel permission defined: .github/workflows/automerge-for-humans-remove-ready-to-merge-label-on-edit.yml:1","Warn: no topLevel permission defined: .github/workflows/automerge-orphans.yml:1","Warn: no topLevel permission defined: .github/workflows/automerge.yml:1","Warn: no topLevel permission defined: .github/workflows/autoupdate.yml:1","Warn: no topLevel permission defined: .github/workflows/bounty-program-commands.yml:1","Warn: no topLevel permission defined: .github/workflows/bump.yml:1","Warn: no topLevel permission defined: .github/workflows/help-command.yml:1","Warn: no topLevel permission defined: .github/workflows/if-nodejs-pr-testing.yml:1","Warn: no topLevel permission defined: .github/workflows/if-nodejs-release.yml:1","Warn: no topLevel permission defined: .github/workflows/if-nodejs-version-bump.yml:1","Warn: no topLevel permission defined: .github/workflows/issues-prs-notifications.yml:1","Warn: no topLevel permission defined: .github/workflows/lint-pr-title.yml:1","Warn: no topLevel permission defined: .github/workflows/notify-tsc-members-mention.yml:1","Warn: no topLevel permission defined: .github/workflows/please-take-a-look-command.yml:1","Warn: no topLevel permission defined: .github/workflows/release-announcements.yml:1","Warn: no topLevel permission defined: .github/workflows/release-with-changesets.yml:1","Warn: no topLevel permission defined: .github/workflows/stale-issues-prs.yml:1","Warn: no topLevel permission defined: .github/workflows/update-docs-on-docs-commits.yml:1","Warn: no topLevel permission defined: .github/workflows/update-maintainers-trigger.yaml:1","Warn: no topLevel permission defined: .github/workflows/update-pr.yml:1","Warn: no topLevel permission defined: .github/workflows/welcome-first-time-contrib.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":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/add-good-first-issue-labels.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/add-good-first-issue-labels.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-for-humans-add-ready-to-merge-or-do-not-merge-label.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-for-humans-merging.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-for-humans-merging.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-for-humans-merging.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-for-humans-merging.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-for-humans-remove-ready-to-merge-label-on-edit.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-for-humans-remove-ready-to-merge-label-on-edit.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-orphans.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-orphans.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge-orphans.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-orphans.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/automerge-orphans.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-orphans.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/automerge-orphans.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge-orphans.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automerge.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/automerge.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/autoupdate.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/autoupdate.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/bounty-program-commands.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/bounty-program-commands.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/bounty-program-commands.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/bounty-program-commands.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/bounty-program-commands.yml:104: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/bounty-program-commands.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/bump.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/bump.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/help-command.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/help-command.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/help-command.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/help-command.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-pr-testing.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-pr-testing.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-pr-testing.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-pr-testing.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-pr-testing.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-pr-testing.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:99: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:128: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-release.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-version-bump.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-version-bump.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-version-bump.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-version-bump.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/if-nodejs-version-bump.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-version-bump.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/if-nodejs-version-bump.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/if-nodejs-version-bump.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-prs-notifications.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/issues-prs-notifications.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-prs-notifications.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/issues-prs-notifications.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-prs-notifications.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/issues-prs-notifications.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-prs-notifications.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/issues-prs-notifications.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-prs-notifications.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/issues-prs-notifications.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/issues-prs-notifications.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/issues-prs-notifications.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:82: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:91: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:109: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:127: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:136: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:141: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:154: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:170: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:172: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:181: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:186: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:199: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:215: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:217: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:226: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:231: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:244: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:260: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:262: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:271: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:276: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:289: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/notify-tsc-members-mention.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/please-take-a-look-command.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/please-take-a-look-command.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-announcements.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-announcements.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-announcements.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-announcements.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-announcements.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-announcements.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-announcements.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-announcements.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-announcements.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-announcements.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:90: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-with-changesets.yml:130: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/release-with-changesets.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/transfer-issue.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/transfer-issue.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/transfer-issue.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/transfer-issue.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-docs-on-docs-commits.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/update-docs-on-docs-commits.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-docs-on-docs-commits.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/update-docs-on-docs-commits.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-docs-on-docs-commits.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/update-docs-on-docs-commits.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-pr.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/update-pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-pr.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/update-pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/welcome-first-time-contrib.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/asyncapi/parser-js/welcome-first-time-contrib.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/if-nodejs-pr-testing.yml:67","Warn: npmCommand not pinned by hash: .github/workflows/if-nodejs-release.yml:65","Warn: npmCommand not pinned by hash: .github/workflows/if-nodejs-release.yml:113","Warn: npmCommand not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:62","Warn: npmCommand not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:107","Warn: npmCommand not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:152","Warn: npmCommand not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:197","Warn: npmCommand not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:242","Warn: npmCommand not pinned by hash: .github/workflows/notify-tsc-members-mention.yml:287","Warn: npmCommand not pinned by hash: .github/workflows/release-with-changesets.yml:56","Warn: npmCommand not pinned by hash: .github/workflows/release-with-changesets.yml:109","Info:   1 out of  58 GitHub-owned GitHubAction dependencies pinned","Info:  12 out of  48 third-party GitHubAction dependencies pinned","Info:   7 out of  18 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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/if-nodejs-release.yml:82"],"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":"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/asyncapi/.github/SECURITY.md:1","Info: Found linked content: github.com/asyncapi/.github/SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: github.com/asyncapi/.github/SECURITY.md:1"],"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":"SAST","score":9,"reason":"SAST tool is not run on all commits -- score normalized to 9","details":["Warn: 28 commits out of 30 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":"21 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-7r3h-m5j6-3q42","Warn: Project is vulnerable to: GHSA-h452-7996-h45h","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-pppg-cpfq-h7wr","Warn: Project is vulnerable to: GHSA-hw8r-x6gr-5gjp","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"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-17T01:18:44.006Z","repository_id":37752441,"created_at":"2025-08-17T01:18:44.006Z","updated_at":"2025-08-17T01:18:44.006Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28915942,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T16:37:38.804Z","status":"ssl_error","status_checked_at":"2026-01-30T16:37:37.878Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["get-global-docs-autoupdate","get-global-node-release-workflows","get-global-releaserc","hacktoberfest","javascript","json-schema","nodejs","parser"],"created_at":"2024-08-03T05:00:25.307Z","updated_at":"2026-01-30T17:03:33.949Z","avatar_url":"https://github.com/asyncapi.png","language":"TypeScript","readme":"[![AsyncAPI JavaScript Parser](./assets/logo.png)](https://www.asyncapi.com)\n\nThis is a Monorepo managed using [Turborepo](https://turbo.build/) and contains the following package:\n\n1. [Parser-js](packages/parser): Use this package to validate and parse AsyncAPI documents —either YAML or JSON— in your Node.js or browser application.\n2. [Multi-Parser](packages/multi-parser): This tool allows the parsing of AsyncAPI documents producing a desired interface based on a given Parser-API version. Useful if your tool needs to support several AsyncAPI Spec versions.\n\nValidation is powered by [Spectral](https://github.com/stoplightio/spectral).  \nUpdated bundle for the browser is always attached to the GitHub Release.\n\n![npm](https://img.shields.io/npm/v/@asyncapi/parser?style=for-the-badge) ![npm](https://img.shields.io/npm/dt/@asyncapi/parser?style=for-the-badge)\n\n\u003e **Warning**\n\u003e This package doesn't support AsyncAPI 1.x anymore. We recommend to upgrade to the latest AsyncAPI version using the [AsyncAPI converter](https://github.com/asyncapi/converter-js). If you need to convert documents on the fly, you may use the [Node.js](https://github.com/asyncapi/converter-js) or [Go](https://github.com/asyncapi/converter-go) converters.\n\n\u003e **Warning**\n\u003e This package has rewrote the Model API (old one) to [Intent API](https://github.com/asyncapi/parser-api). If you still need to use the old API, read the [Convert to the old API](#convert-to-the-old-api) section.\n\n\u003e **Note**\n\u003e Read the [migration guide from v2 to v3](./docs/migrations/v2-to-v3.md).\n\n\u003c!-- toc is generated with GitHub Actions do not remove toc markers --\u003e\n\n\u003c!-- toc --\u003e\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Examples](#examples)\n  - [Example with parsing](#example-with-parsing)\n  - [Example with validation](#example-with-validation)\n  - [Example using Avro schemas](#example-using-avro-schemas)\n  - [Example using OpenAPI schemas](#example-using-openapi-schemas)\n  - [Example using RAML data types](#example-using-raml-data-types)\n  - [Example with performing actions on HTTP source](#example-with-performing-actions-on-http-source)\n  - [Example with performing actions on file source](#example-with-performing-actions-on-file-source)\n  - [Example with stringify and unstringify parsed document](#example-with-stringify-and-unstringify-parsed-document)\n- [API documentation](#api-documentation)\n- [Spectral rulesets](#spectral-rulesets)\n- [Using in the browser/SPA applications](#using-in-the-browserspa-applications)\n- [Custom schema parsers](#custom-schema-parsers)\n  - [Official supported custom schema parsers](#official-supported-custom-schema-parsers)\n- [Custom extensions](#custom-extensions)\n- [Circular references](#circular-references)\n- [Stringify](#stringify)\n- [Convert to the old API](#convert-to-the-old-api)\n- [Notes](#notes)\n  - [Using with Webpack](#using-with-webpack)\n  - [Testing with [Jest](https://jestjs.io/)](#testing-with-jesthttpsjestjsio)\n- [Develop](#develop)\n- [Contributing](#contributing)\n- [Contributors](#contributors)\n\n\u003c!-- tocstop --\u003e\n\n## Installation\n\n```bash\nnpm install @asyncapi/parser\nyarn add @asyncapi/parser\n```\n\nThe parser by default supports AsyncAPI Schema Format and JSON Schema Format for schemas. For additional formats, check [Custom schema parsers](#custom-schema-parsers) section.\n\n## Usage\n\nThe package exposes the main class `Parser`, which has two main functions:\n\n- `validate()` - function that validates the passed AsyncAPI document. Returns array of all possible errors against the validation conditions.\n- `parse()` - function that validates the passed AsyncAPI document, and then if it's valid, parses the input. It returns an object that contains:\n  - `document` object, which is an parsed AsyncAPI document with [`AsyncAPIDocumentInterface`](./packages/parser/src/models/asyncapi.ts) API. If the schema is invalid against the validation conditions, the field has `undefined` value.\n  - `diagnostics` array that contains all possible errors against the validation conditions.\n- `registerSchemaParser()` - function that registers custom schema parsers. For more info, please check [Custom schema parsers](#custom-schema-parsers) section.\n\nNatively `Parser` class does not contain methods that operate on the source (AsyncAPI document) from a file or URL. However, the package exposes utils that make this possible:\n\n```ts\nimport { fromURL, fromFile } from \"@asyncapi/parser\";\n```\n\nCheck out the [examples](#examples) of using the above mentioned functionalities.\n\n## Examples\n\n### Example with parsing\n\n```ts\nimport { Parser } from \"@asyncapi/parser\";\nconst parser = new Parser();\nconst { document } = await parser.parse(`\n  asyncapi: '2.4.0'\n  info:\n    title: Example AsyncAPI specification\n    version: '0.1.0'\n  channels:\n    example-channel:\n      subscribe:\n        message:\n          payload:\n            type: object\n            properties:\n              exampleField:\n                type: string\n              exampleNumber:\n                type: number\n              exampleDate:\n                type: string\n                format: date-time\n`);\n\nif (document) {\n  // =\u003e Example AsyncAPI specification\n  console.log(document.info().title());\n}\n```\n\n### Example with validation\n\n```ts\nimport { Parser } from \"@asyncapi/parser\";\n\nconst parser = new Parser();\n\n// One of the diagnostics will contain an error regarding an unsupported version of AsyncAPI (2.1.37)\nconst diagnostics = await parser.validate(`\n  asyncapi: '2.1.37'\n  info:\n    title: Example AsyncAPI specification\n    version: '0.1.0'\n  channels:\n    example-channel:\n      subscribe:\n        message:\n          payload:\n            type: object\n            properties:\n              exampleField:\n                type: string\n              exampleNumber:\n                type: number\n              exampleDate:\n                type: string\n                format: date-time\n`);\n```\n\n### [Example using Avro schemas](#custom-schema-parsers)\n\nHead over to [asyncapi/avro-schema-parser](https://www.github.com/asyncapi/avro-schema-parser) for more information.\n\n### [Example using OpenAPI schemas](#custom-schema-parsers)\n\nHead over to [asyncapi/openapi-schema-parser](https://www.github.com/asyncapi/openapi-schema-parser) for more information.\n\n### [Example using RAML data types](#custom-schema-parsers)\n\nHead over to [asyncapi/raml-dt-schema-parser](https://www.github.com/asyncapi/raml-dt-schema-parser) for more information.\n\n### Example with performing actions on HTTP source\n\n```ts\nimport { Parser, fromURL } from \"@asyncapi/parser\";\n\nconst parser = new Parser();\n\nconst { document, diagnostics } = await fromURL(\n  parser,\n  \"https://example.com/\",\n).parse();\n```\n\n### Example with performing actions on file source\n\n```ts\nimport { Parser, fromFile } from \"@asyncapi/parser\";\n\nconst parser = new Parser();\n\nconst { document, diagnostics } = await fromFile(\n  parser,\n  \"./asyncapi.yaml\",\n).parse();\n```\n\n### [Example with stringify and unstringify parsed document](#stringify)\n\n```ts\nimport { Parser, stringify, unstringify } from \"@asyncapi/parser\";\n\nconst parser = new Parser();\n\nconst { document } = await parser.parse(`\n  asyncapi: '2.4.0'\n  info:\n    title: Example AsyncAPI specification\n    version: '0.1.0'\n  channels:\n    example-channel:\n      subscribe:\n        message:\n          payload:\n            type: object\n            properties:\n              exampleField:\n                type: string\n              exampleNumber:\n                type: number\n              exampleDate:\n                type: string\n                format: date-time\n`);\n\nif (document) {\n  // stringify function returns string type\n  const stringifiedDocument = stringify(document);\n  // unstringify function returns new AsyncAPIDocument instance\n  const unstringifiedDocument = unstringify(stringifiedDocument);\n}\n```\n\n## API documentation\n\nParser-JS API implements a global API definition for all AsyncAPI parser implementations known as the [Parser-API](https://github.com/asyncapi/parser-api). This API is designed having in mind developer experience and resiliency to breaking changes.\n\nThe following table shows a compatibility matrix between this parser, and the [Parser-API](https://github.com/asyncapi/parser-api), as well as the AsyncAPI spec version supported by each release of this parser.\n\n| Parser-JS | Parser-API                                                            | Spec 2.x | Spec 3.x |\n| --------- | --------------------------------------------------------------------- | -------- | -------- |\n| 2.x       | [1.x](https://github.com/asyncapi/parser-api/blob/v1.0.0/docs/v1.md)  | ✓        |          |\n| 3.x       | [3.x](https://github.com/asyncapi/parser-api/blob/v3.0.0/docs/api.md) | ✓        | ✓        |\n\n- `✓` Fully supported version.\n- `-` The AsyncAPI Spec version has features the Parser-JS can't use but the rest are fully supported.\n- Empty means not supported version.\n\nAdditionally to all the methods declared in the [Parser-API](https://github.com/asyncapi/parser-api), this parser might introduce some helper functions like:\n\n- `json()` which returns the JSON object of the given object. It is possible to pass as an argument the name of a field in an object and retrieve corresponding value.\n- `jsonPath()` which returns the JSON Path of the given object.\n- `meta()` which returns the metadata of a given object, like a parsed AsyncAPI Document.\n\n## Spectral rulesets\n\n[Spectral](https://github.com/stoplightio/spectral) powers the validation of AsyncAPI documents within ParserJS.\nThe default [built-in rulesets](src/ruleset) are:\n\n- Core ruleset:\n  - Basic and global validation. Apply to all AsyncAPI Spec versions (with some exceptions).\n- Recommended ruleset:\n  - These are good practices. They won't create validation errors but warnings.\n- Specific rulesets per each AsyncAPI Spec version:\n  - Contain particular rulesets that apply only to documents of a particular Spec version:\n    - Core rulesets: Rules that generate validation errors if not fulfilled by a particular Spec version.\n    - Recommended rulesets: Best practices for a particular Spec version\n\nIt is possible to use your rulesets/rules or overwrite existing ones, passing the `ruleset` option to the Parser instance:\n\n```ts\nimport { Parser, stringify, unstringify } from \"@asyncapi/parser\";\nconst parser = new Parser({\n  ruleset: {\n    extends: [],\n    rules: {\n      \"asyncapi-defaultContentType\": \"off\",\n      \"asyncapi-termsOfService\": {\n        description:\n          'Info \"termsOfService\" should be present and non-empty string.',\n        recommended: true,\n        given: \"$\",\n        then: {\n          field: \"info.termsOfService\",\n          function: \"truthy\",\n        },\n      },\n    },\n  },\n});\n// The returned diagnostics object will include `asyncapi-termsOfService` diagnostic with `warning` (`recommended: true`) severity because `$.info.termsOfService` is not defined in the following AsyncAPI document.\n// On the other hand, since we turned it off, we won't see the diagnostics related to the `defaultContentType` field.\nconst diagnostics = await parser.validate(`\n  asyncapi: '2.0.0'\n  info:\n    title: Example AsyncAPI specification\n    version: '0.1.0'\n  channels: {}\n`);\n```\n\n[ParserJS has some built-in Spectral rulesets](./docs/ruleset) that validate AsyncAPI documents and inform on good practices.\n\n## Using in the browser/SPA applications\n\nThe package contains a built-in version of the parser. To use it, you need to import the parser into the HTML file as below:\n\n```html\n\u003cscript src=\"https://unpkg.com/@asyncapi/parser@latest/browser/index.js\"\u003e\u003c/script\u003e\n\n\u003cscript\u003e\n  const parser = new window.AsyncAPIParser();\n  const { document, diagnostics } = parser.parse(...);\n\u003c/script\u003e\n```\n\nOr, if you want to use the parser in a JS SPA-type application where you have a predefined bundler configuration that is difficult to change (e.g. you use [`create-react-app`](https://github.com/facebook/create-react-app)) then you can import the parser as below:\n\n```js\nimport Parser from '@asyncapi/parser/browser';\n\nconst parser = new Parser();\nconst { document, diagnostics } = parser.parse(...);\n```\n\n\u003e **Note**\n\u003e Using the above code, we import the entire bundled parser into application. This may result in a duplicate code in the final application bundle, only if the application uses the same dependencies what the parser. If, on the other hand, you want to have the smallest bundle as possible, we recommend using the following import and properly configure bundler.\n\nOtherwise, if your application is bundled via bundlers like `webpack` and you can configure it, you can import the parser like a regular package:\n\n```js\nimport { Parser } from '@asyncapi/parser';\n\nconst parser = new Parser();\nconst { document, diagnostics } = parser.parse(...);\n```\n\n\u003e **Note**\n\u003e The package uses some native NodeJS modules underneath. If you are building a front-end application you can find more information about the correct configuration for Webpack [here](#webpack).\n\nIn case you just want to check out the latest `bundle.js` without installing the package, we publish one on each GitHub release. You can find it under [this link to the latest release](https://github.com/asyncapi/parser-js/releases/latest/download/bundle.js).\n\n## Custom schema parsers\n\nAsyncAPI doesn't enforce one schema format. The payload of the messages can be described with OpenAPI (3.0.0), Avro, etc. This parser by default parses only [AsyncAPI Schema Format](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) (superset of JSON Schema Format). We can extend it by creating a custom parser and registering it within the parser:\n\n1. Create custom parser module that exports three functions:\n\n   - `validate` - function that validates (its syntax) used schema.\n   - `parse` - function that parses the given schema to the [AsyncAPI Schema Format](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject).\n   - `getMimeTypes` - function that returns the list of mime types that will be used as the `schemaFormat` property to determine the mime type of a given schema.\n\n   Example:\n\n   ```ts\n   export default {\n     validate(input) { ... },\n     parse(input) { ... },\n     getMimeTypes() {\n       return [\n         'application/vnd.custom.type;version=1.0.0',\n         'application/vnd.custom.type+json;version=1.0.0',\n       ]\n     }\n   }\n   ```\n\n2. Before parsing/validating an AsyncAPI document with a parser, register the additional custom schema parser:\n\n   ```ts\n   import { Parser } from \"@asyncapi/parser\";\n   import myCustomSchemaParser from \"./my-custom-schema-parser\";\n\n   const parser = new Parser();\n   parser.registerSchemaParser(myCustomSchemaParser);\n   ```\n\n### Official supported custom schema parsers\n\nIn AsyncAPI Initiative we support below custom schema parsers. To install them, run below comamnds:\n\n- [Avro schema](https://www.github.com/asyncapi/avro-schema-parser):\n\n  ```bash\n  npm install @asyncapi/avro-schema-parser\n  yarn add @asyncapi/avro-schema-parser\n  ```\n\n- [OpenAPI (3.0.0) Schema Object](https://www.github.com/asyncapi/openapi-schema-parser):\n\n  ```bash\n  npm install @asyncapi/openapi-schema-parser\n  yarn add @asyncapi/openapi-schema-parser\n  ```\n\n- [RAML data type](https://www.github.com/asyncapi/raml-dt-schema-parser):\n\n  ```bash\n  npm install @asyncapi/raml-dt-schema-parser\n  yarn add @asyncapi/raml-dt-schema-parser\n  ```\n\n  \u003e **Note**\n  \u003e That custom parser works only in the NodeJS environment. Do not use it in browser applications!\n\n## Custom extensions\n\nThe parser uses custom extensions to define additional information about the spec. Each has a different purpose but all of them are there to make it much easier to work with the AsyncAPI document. These extensions are prefixed with `x-parser-`. The following extensions are used:\n\n- `x-parser-spec-parsed` is used to specify if the AsyncAPI document is already parsed by the parser. Property `x-parser-spec-parsed` is added to the root of the document with the `true` value.\n- `x-parser-api-version` is used to specify which version of the [Parser-API](https://github.com/asyncapi/parser-api) the parsed AsyncAPI document uses. Property `x-parser-api-version` is added to the root of the document with the `1` value if the parsed document uses [Parser-API](https://github.com/asyncapi/parser-api) in the `v1` version or `0` if document uses old `parser-js` API.\n- `x-parser-message-name` is used to specify the name of the message if it is not provided. For messages without names, the parser generates anonymous names. Property `x-parser-message-name` is added to a message object with a value that follows this pattern: `\u003canonymous-message-${number}\u003e`. This value is returned by `message.id()` (`message.uid()` in the [old API](#convert-to-the-old-api)) when regular `name` property is not present.\n- `x-parser-original-payload` holds the original payload of the message. You can use different formats for payloads with the AsyncAPI documents and the parser converts them to. For example, it converts payload described with Avro schema to AsyncAPI schema. The original payload is preserved in the extension.\n- [`x-parser-circular`](#circular-references).\n\nIn addition, the [`convertToOldAPI()` function](#convert-to-the-old-api) which converts new API to an old one adds additional extensions:\n\n- `x-parser-message-parsed` is used to specify if the message is already parsed by the message parser. Property `x-parser-message-parsed` is added to the message object with the `true` value.\n- `x-parser-schema-id` is used to specify the ID of the schema if it is not provided. For schemas without IDs, the parser generates anonymous names. Property `x-parser-schema-id` is added to every object of a schema with a value that follows this pattern: `\u003canonymous-schema-${number}\u003e`. This value is returned by `schema.uid()` when regular `$id` property is not present.\n- `x-parser-original-traits` is where traits are stored after they are applied on the AsyncAPI document. The reason is because the original `traits` property is removed.\n- `x-parser-original-schema-format` holds information about the original schema format of the payload. You can use different schema formats with the AsyncAPI documents and the parser converts them to AsyncAPI schema. This is why different schema format is set, and the original one is preserved in the extension.\n\n\u003e **Warning**\n\u003e All extensions added by the parser (including all properties) should be retrieved using special functions. Names of extensions and their location may change, and their eventual changes will not be announced.\n\n## Circular references\n\nParser dereferences all circular references by default. In addition, to simplify interactions with the parser, the following is added:\n\n- `x-parser-circular` property is added to the root of the AsyncAPI document to indicate that the document contains circular references. In old API the Parser exposes `hasCircular()` function to check if given AsyncAPI document has circular references.\n- `isCircular()` function is added to the [Schema Model](./packages/parser/src/models/schema.ts) to determine if a given schema is circular with respect to previously occurring schemas in the JSON tree.\n\n## Stringify\n\nConverting a parsed document to a string may be necessary when saving the parsed document to a database, or similar situations where you need to parse the document just once and then reuse it, for optimisation cases.\n\nFor that, the Parser supports the ability to stringify a parsed AsyncAPI document through the `stringify` function exposed by package. This method differs from the native `JSON.stringify(...json)` implementation, in that every reference that occurs (at least twice throughout the document) is converted into a [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) path with a `$ref:` prefix:\n\n```json\n{\n  \"foo\": \"$ref:$.some.path.to.the.bar\"\n}\n```\n\nTo parse a stringified document into an AsyncAPIDocument instance, you must use the `unstringify` function (also exposed by package). It isn't compatible with the native `JSON.parse()` method. It replaces the given references pointed by the [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) path, with an `$ref:` prefix to the original objects.\n\nA few advantages of this solution:\n\n- The string remains as small as possible due to the use of [JSON Pointers](https://datatracker.ietf.org/doc/html/rfc6901).\n- All references (also circular) are preserved.\n\nCheck [example](#example-with-stringify-and-unstringify-parsed-document).\n\n## Convert to the old API\n\nVersion `2.0.0` of package introduced a lot of breaking changes, including changing the API of the returned parsed document (parser uses [New API](https://github.com/asyncapi/parser-api)). Due to the fact that a large part of the AsyncAPI tooling ecosystem uses a Parser with the old API and rewriting the tool for the new one can be time-consuming and difficult, the package exposes the `convertToOldAPI()` function to convert new API to old one:\n\n```js\nimport { Parser, convertToOldAPI } from '@asyncapi/parser';\n\nconst parser = new Parser();\nconst { document } = parser.parse(...);\nconst oldAsyncAPIDocument = convertToOldAPI(document);\n```\n\n\u003e **Warning**\n\u003e The old api will be supported only for a certain period of time. The target date for turning off support of the old API is around the end of January 2023.\n\n## Notes\n\n### Using with Webpack\n\nVersions `\u003c5` of Webpack should handle bundling without problems. Due to the fact that Webpack 5 no longer does fallbacks to native NodeJS modules by default we need to install `buffer` package and add fallbacks:\n\n```js\n{\n  resolve: {\n    fallback: {\n      \"fs\": false,\n      \"path\": false,\n      \"util\": false,\n      \"buffer\": require.resolve(\"buffer/\"),\n    }\n  }\n}\n```\n\n### Testing with [Jest](https://jestjs.io/)\n\nUsing a Parser in an application that is tested using [Jest](https://jestjs.io/), there will probably an error like:\n\n```bash\nCannot find module 'nimma/legacy' from 'node_modules/@stoplight/spectral-core/dist/runner/runner.js\n```\n\nIt's a problem with Jest, which cannot understand [NodeJS's package exports](https://nodejs.org/api/packages.html). To fix that, should be [enabled ESM support in Jest](https://jestjs.io/docs/ecmascript-modules) or set an appropriate Jest's `moduleNameMapper` config:\n\n```js\nmoduleNameMapper: {\n  '^nimma/legacy$': '\u003crootDir\u003e/node_modules/nimma/dist/legacy/cjs/index.js',\n  '^nimma/(.*)': '\u003crootDir\u003e/node_modules/nimma/dist/cjs/$1',\n},\n```\n\n## Develop\n\n1. Make sure you are using Node.js 16 or higher and npm 8 or higher\n2. Write code and tests.\n3. Make sure all tests pass `npm test`\n\nFor Windows environments, some tests might still fail randomly during local development even when you made no changes to the tests. The reason for this from file endings are different than expected and this comes from Git defaulting to an unexpected file ending. If you encounter this issue you can run the following commands to set Git to use the expected one:\n\n```\ngit config --global core.autocrlf false\ngit config --global core.eol lf\n```\n\n4. Make sure code is well formatted and secure `npm run lint`\n\n## Contributing\n\nRead [CONTRIBUTING](https://github.com/asyncapi/.github/blob/master/CONTRIBUTING.md) guide.\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"http://www.fmvilas.com/\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/242119?v=4?s=100\" width=\"100px;\" alt=\"Fran Méndez\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFran Méndez\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#question-fmvilas\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/issues?q=author%3Afmvilas\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=fmvilas\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=fmvilas\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#ideas-fmvilas\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#maintenance-fmvilas\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"#plugin-fmvilas\" title=\"Plugin/utility libraries\"\u003e🔌\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/pulls?q=is%3Apr+reviewed-by%3Afmvilas\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=fmvilas\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://resume.github.io/?derberg\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/6995927?v=4?s=100\" width=\"100px;\" alt=\"Lukasz Gornicki\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLukasz Gornicki\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#question-derberg\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/issues?q=author%3Aderberg\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=derberg\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=derberg\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#ideas-derberg\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#maintenance-derberg\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/pulls?q=is%3Apr+reviewed-by%3Aderberg\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=derberg\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/jonaslagoni\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/13396189?v=4?s=100\" width=\"100px;\" alt=\"Jonas Lagoni\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJonas Lagoni\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#question-jonaslagoni\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/issues?q=author%3Ajonaslagoni\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=jonaslagoni\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-jonaslagoni\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/pulls?q=is%3Apr+reviewed-by%3Ajonaslagoni\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/magicmatatjahu\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/20404945?v=4?s=100\" width=\"100px;\" alt=\"Maciej Urbańczyk\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMaciej Urbańczyk\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/issues?q=author%3Amagicmatatjahu\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=magicmatatjahu\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/pulls?q=is%3Apr+reviewed-by%3Amagicmatatjahu\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://www.inmensia.com/\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/6494060?v=4?s=100\" width=\"100px;\" alt=\"Juan Mellado\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJuan Mellado\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=jcmellado\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://www.jamescrowley.net/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/509533?v=4?s=100\" width=\"100px;\" alt=\"James Crowley\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJames Crowley\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=jamescrowley\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/rmelian\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/4565267?v=4?s=100\" width=\"100px;\" alt=\"raisel melian\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eraisel melian\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=rmelian\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/DanielChuDC\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/52316624?v=4?s=100\" width=\"100px;\" alt=\"danielchu\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003edanielchu\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#infra-DanielChuDC\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=DanielChuDC\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://www.linkedin.com/in/jbreitenbaumer/\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/683438?v=4?s=100\" width=\"100px;\" alt=\"Jürgen B.\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJürgen B.\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=juergenbr\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/aeworxet\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/16149591?v=4?s=100\" width=\"100px;\" alt=\"Viacheslav Turovskyi\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eViacheslav Turovskyi\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=aeworxet\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=aeworxet\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/KhudaDad414\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/32505158?v=4?s=100\" width=\"100px;\" alt=\"Khuda Dad Nomani\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKhuda Dad Nomani\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=KhudaDad414\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/issues?q=author%3AKhudaDad414\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=KhudaDad414\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/aayushmau5\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/54525741?v=4?s=100\" width=\"100px;\" alt=\"Aayush Kumar Sahu\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAayush Kumar Sahu\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=aayushmau5\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/JQrdan\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/25624685?v=4?s=100\" width=\"100px;\" alt=\"Jordan Tucker\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJordan Tucker\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=JQrdan\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=JQrdan\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/vishesh13byte\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/66796715?v=4?s=100\" width=\"100px;\" alt=\"vishesh13byte\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003evishesh13byte\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=vishesh13byte\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://iamdevelopergirl.github.io/Website-With-Animations/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/16351809?v=4?s=100\" width=\"100px;\" alt=\"Elakya\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eElakya\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=iamdevelopergirl\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://schwank.cc\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/8232196?v=4?s=100\" width=\"100px;\" alt=\"Dominik Schwank\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDominik Schwank\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/issues?q=author%3Adschwank\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=dschwank\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/Ruchip16\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/72685035?v=4?s=100\" width=\"100px;\" alt=\"Ruchi Pakhle\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRuchi Pakhle\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/asyncapi/parser-js/commits?author=Ruchip16\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"25%\"\u003e\u003ca href=\"https://github.com/hainenber\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/41283691?v=4?s=100\" width=\"100px;\" alt=\"Đỗ Trọng Hải\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eĐỗ Trọng Hải\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#security-hainenber\" title=\"Security\"\u003e🛡️\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","funding_links":["https://github.com/sponsors/asyncapi","https://opencollective.com/asyncapi"],"categories":["Custom Validation Needs","TypeScript","nodejs"],"sub_categories":["Libraries"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasyncapi%2Fparser-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasyncapi%2Fparser-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasyncapi%2Fparser-js/lists"}