{"id":17921799,"url":"https://github.com/3axap4ehko/xast","last_synced_at":"2026-03-11T14:37:42.614Z","repository":{"id":58038683,"uuid":"529694533","full_name":"3axap4eHko/xast","owner":"3axap4eHko","description":"Extensible Abstract Syntax Tree parser","archived":false,"fork":false,"pushed_at":"2025-10-01T00:12:06.000Z","size":14089,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-10-01T02:34:16.004Z","etag":null,"topics":["ast","parser","syntax-tree"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/3axap4eHko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2022-08-27T20:52:20.000Z","updated_at":"2025-10-01T00:12:08.000Z","dependencies_parsed_at":"2023-10-15T00:18:39.824Z","dependency_job_id":"c161f02c-f8eb-4a6e-9f3b-8a7a3c85ae28","html_url":"https://github.com/3axap4eHko/xast","commit_stats":{"total_commits":175,"total_committers":2,"mean_commits":87.5,"dds":0.02857142857142858,"last_synced_commit":"6e920970250e4df60a55f0dbab149d5af26bdde8"},"previous_names":[],"tags_count":397,"template":false,"template_full_name":null,"purl":"pkg:github/3axap4eHko/xast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3axap4eHko%2Fxast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3axap4eHko%2Fxast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3axap4eHko%2Fxast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3axap4eHko%2Fxast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/3axap4eHko","download_url":"https://codeload.github.com/3axap4eHko/xast/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3axap4eHko%2Fxast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278703574,"owners_count":26031205,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ast","parser","syntax-tree"],"created_at":"2024-10-28T20:36:12.396Z","updated_at":"2025-10-07T00:58:17.507Z","avatar_url":"https://github.com/3axap4eHko.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# XAST\n\n0-deps configurable Abstract Syntax Tree parser\n\n[![Build Status][github-image]][github-url]\n[![NPM version][npm-image]][npm-url]\n[![Downloads][downloads-image]][npm-url]\n[![Coverage Status][codecov-image]][codecov-url]\n[![Maintainability][codeclimate-image]][codeclimate-url]\n[![Snyk][snyk-image]][snyk-url]\n\n## Table of Contents\n\n  - [Features](#features)\n  - [Browser Support](#browser-support)\n  - [Installing](#installing)\n  - [Examples](#examples)\n  - [License](#license)\n\n## Features\n\n- Configurable Lexer with predefined tokenizers\n- Flexible Parser with modulized AST node parsers\n- TypeScript support\n- Supports NodeJS and Browser\n\n## Support\n\n![NodeJS][nodejs-image] | ![Chrome][chrome-image] | ![Firefox][firefox-image] | ![Safari][safari-image] | ![Opera][opera-image] | ![Edge][edge-image] |\n--- | --- | --- | --- | --- | --- |\nLTS ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ |\n\n[nodejs-image]: https://raw.github.com/alrra/browser-logos/main/src/node.js/node.js_48x48.png\n[chrome-image]: https://raw.github.com/alrra/browser-logos/main/src/chrome/chrome_48x48.png\n[firefox-image]: https://raw.github.com/alrra/browser-logos/main/src/firefox/firefox_48x48.png\n[safari-image]: https://raw.github.com/alrra/browser-logos/main/src/safari/safari_48x48.png\n[opera-image]: https://raw.github.com/alrra/browser-logos/main/src/opera/opera_48x48.png\n[edge-image]: https://raw.github.com/alrra/browser-logos/main/src/edge/edge_48x48.png\n\n## Installing\n\nUsing yarn:\n\n```bash\n$ yarn add xast\n```\n\nUsing npm:\n\n```bash\n$ npm install xast\n```\n\n## Example\n\nCreate an enum parser in file `enum.ts`\n```typescript\nimport {\n  Parser,\n  parsers,\n  TokenKind,\n  NodeParser,\n  Node,\n} from 'xast';\n\nexport interface EnumValueNode extends Node {\n  readonly kind: 'ENUM_VALUE';\n  readonly value: parsers.NameNode;\n}\n\nexport const enumValueParser: NodeParser\u003cEnumValueNode\u003e = {\n  kind: 'ENUM_VALUE',\n  parse(parser: Parser): EnumValueNode | undefined {\n    const start = parser.lexer.token;\n    const value = parser.expectParse(parsers.nameParser);\n\n    return parser.node\u003cEnumValueNode\u003e(start, {\n      kind: 'ENUM_VALUE',\n      value,\n    });\n  }\n}\n\nconst KEYWORD = 'enum';\n\nexport interface EnumNode extends Node {\n  readonly kind: 'ENUM';\n  readonly name: parsers.NameNode;\n  readonly values: EnumValueNode[];\n}\n\nexport const enumParser: NodeParser\u003cEnumNode\u003e = {\n  kind: 'ENUM',\n  trigger: {\n    kind: TokenKind.NAME,\n    keyword: KEYWORD,\n  },\n  parse(parser: Parser): EnumNode | undefined {\n    const start = parser.lexer.token;\n    parser.expectKeyword(KEYWORD);\n    const name = parser.expectParse(parsers.nameParser);\n    parser.expectToken(TokenKind.BRACE_L);\n    const values = parser.delimitedMany(TokenKind.COMMA, enumValueParser);\n    parser.expectToken(TokenKind.BRACE_R);\n    parser.expectToken(TokenKind.SEMICOLON);\n\n    return parser.node\u003cEnumNode\u003e(start, {\n      kind: 'ENUM',\n      name,\n      values,\n    });\n  }\n}\n```\n\nParser usage example\n```typescript\nimport {\n  Lexer,\n  addDefaultTokenizers,\n  Parser,\n  parsers\n} from 'xast';\n\nimport { enumParser } from './enum.ts';\n\nconst schema = `enum Test { A, B, C };`;\nconst lexer = new Lexer(schema);\naddDefaultTokenizers(lexer);\n\nconst parser = new Parser(lexer);\nparser.add(enumParser);\nconsole.log(parser.parseSchema());\n```\n\nResults to the following AST\n```json\n{\n  \"kind\": \"SCHEMA\",\n  \"definitions\": [\n    {\n      \"kind\": \"ENUM\",\n      \"name\": {\n        \"kind\": \"NAME\",\n        \"value\": \"Test\"\n      },\n      \"values\": [\n        {\n          \"kind\": \"ENUM_VALUE\",\n          \"value\": {\n            \"kind\": \"NAME\",\n            \"value\": \"A\"\n          }\n        },\n        {\n          \"kind\": \"ENUM_VALUE\",\n          \"value\": {\n            \"kind\": \"NAME\",\n            \"value\": \"B\"\n          }\n        },\n        {\n          \"kind\": \"ENUM_VALUE\",\n          \"value\": {\n            \"kind\": \"NAME\",\n            \"value\": \"C\"\n          }\n        }\n      ]\n    }\n  ]\n}\n```\n\n\n## License\n\nLicense [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)\nCopyright (c) 2023-present Ivan Zakharchanka\n\n[npm-url]: https://www.npmjs.com/package/xast\n[downloads-image]: https://img.shields.io/npm/dw/xast.svg?cacheSeconds=300\n[npm-image]: https://img.shields.io/npm/v/xast.svg?cacheSeconds=300\n[github-url]: https://github.com/3axap4eHko/xast/actions/workflows/cicd.yml\n[github-image]: https://github.com/3axap4eHko/xast/actions/workflows/cicd.yml/badge.svg\n[codecov-url]: https://codecov.io/gh/3axap4eHko/xast\n[codecov-image]: https://codecov.io/gh/3axap4eHko/xast/branch/master/graph/badge.svg?token=DPHqdADIWj\n[codeclimate-url]: https://codeclimate.com/github/3axap4eHko/xast/maintainability\n[codeclimate-image]: https://api.codeclimate.com/v1/badges/2d7b95f08c26581147c3/maintainability\n[snyk-url]: https://snyk.io/test/npm/xast/latest\n[snyk-image]: https://img.shields.io/snyk/vulnerabilities/github/3axap4eHko/xast.svg?maxAge=43200\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3axap4ehko%2Fxast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F3axap4ehko%2Fxast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3axap4ehko%2Fxast/lists"}