{"id":13395169,"url":"https://github.com/syntax-tree/unist","last_synced_at":"2025-10-14T18:41:27.475Z","repository":{"id":35731034,"uuid":"40009598","full_name":"syntax-tree/unist","owner":"syntax-tree","description":"Universal Syntax Tree used by @unifiedjs","archived":false,"fork":false,"pushed_at":"2024-10-04T11:47:11.000Z","size":140,"stargazers_count":953,"open_issues_count":0,"forks_count":22,"subscribers_count":21,"default_branch":"main","last_synced_at":"2025-10-08T03:39:20.922Z","etag":null,"topics":["ast","cst","hast","mdast","nlcst","remarks","syntax-tree","unist","unist-files","unist-nodes","unist-utilities","xast"],"latest_commit_sha":null,"homepage":"https://unifiedjs.com","language":null,"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/syntax-tree.png","metadata":{"files":{"readme":"readme.md","changelog":null,"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},"funding":{"github":"unifiedjs","open_collective":"unified"}},"created_at":"2015-07-31T14:39:07.000Z","updated_at":"2025-10-06T07:34:29.000Z","dependencies_parsed_at":"2024-01-17T16:08:01.507Z","dependency_job_id":"42d2413c-8262-445c-9fc3-0c421e707448","html_url":"https://github.com/syntax-tree/unist","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/syntax-tree/unist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syntax-tree%2Funist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syntax-tree%2Funist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syntax-tree%2Funist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syntax-tree%2Funist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/syntax-tree","download_url":"https://codeload.github.com/syntax-tree/unist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syntax-tree%2Funist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279020361,"owners_count":26086866,"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-14T02:00:06.444Z","response_time":60,"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","cst","hast","mdast","nlcst","remarks","syntax-tree","unist","unist-files","unist-nodes","unist-utilities","xast"],"created_at":"2024-07-30T17:01:44.910Z","updated_at":"2025-10-14T18:41:27.458Z","avatar_url":"https://github.com/syntax-tree.png","language":null,"readme":"# ![unist][logo]\n\n**Uni**versal **S**yntax **T**ree.\n\n***\n\n**unist** is a specification for syntax trees.\nIt has a big [ecosystem of utilities][list-of-utilities] in JavaScript for\nworking with these trees.\nIt’s implemented by several other specifications.\n\nThis document may not be released.\nSee [releases][] for released documents.\nThe latest released version is [`3.0.0`][release].\n\n## Contents\n\n* [Intro](#intro)\n  * [Syntax tree](#syntax-tree)\n  * [Where this specification fits](#where-this-specification-fits)\n* [Types](#types)\n* [Nodes](#nodes)\n  * [`Node`](#node)\n  * [`Parent`](#parent)\n  * [`Literal`](#literal)\n* [Glossary](#glossary)\n* [Tree traversal](#tree-traversal)\n* [Utilities](#utilities)\n  * [List of utilities](#list-of-utilities)\n* [References](#references)\n* [Contribute](#contribute)\n* [Acknowledgments](#acknowledgments)\n* [License](#license)\n\n## Intro\n\nThis document defines a general-purpose format for syntax trees.\nDevelopment of unist started in July 2015.\nThis specification is written in a [Web IDL][webidl]-like grammar.\n\n### Syntax tree\n\nSyntax trees are representations of source code or even natural language.\nThese trees are abstractions that make it possible to analyze, transform, and\ngenerate code.\n\nSyntax trees [come in two flavors][abstract-vs-concrete-trees]:\n\n* **concrete syntax trees**: structures that represent every detail (such as\n  white-space in white-space insensitive languages)\n* **abstract syntax trees**: structures that only represent details relating\n  to the syntactic structure of code (such as ignoring whether a double or\n  single quote was used in languages that support both, such as JavaScript).\n\nThis specification can express both abstract and concrete syntax trees.\n\n### Where this specification fits\n\nunist is not intended to be self-sufficient.\nInstead, it is expected that other specifications implement unist and extend it\nto express language specific nodes.\nFor example, see projects such as **[hast][]** (for HTML), **[nlcst][]** (for\nnatural language), **[mdast][]** (for Markdown), and **[xast][]** (for XML).\n\nunist relates to [JSON][] in that compliant syntax trees can be expressed\ncompletely in JSON.\nHowever, unist is not limited to JSON and can be expressed in other data\nformats, such as [XML][].\n\nunist relates to [JavaScript][] in that it has a rich [ecosystem of\nutilities][list-of-utilities] for working with compliant syntax trees in\nJavaScript.\nThe five most used utilities combined are downloaded thirty million times each\nmonth.\nHowever, unist is not limited to JavaScript and can be used in other programming\nlanguages.\n\nunist relates to the [unified][], [remark][], [rehype][], and [retext][]\nprojects in that unist syntax trees are used throughout their ecosystems.\n\nunist relates to the [vfile][] project in that it accepts unist nodes for its\nmessage store, and that vfile can be a source *[file][term-file]* of a syntax\ntree.\n\n## Types\n\nIf you are using TypeScript, you can use the unist types by installing them\nwith npm:\n\n```sh\nnpm install @types/unist\n```\n\n## Nodes\n\nSyntactic units in unist syntax trees are called nodes, and implement the\n**[Node][dfn-node]** interface.\n\n### `Node`\n\n```idl\ninterface Node {\n  type: string\n  data: Data?\n  position: Position?\n}\n```\n\nThe `type` field is a non-empty string representing the variant of a node.\nThis field can be used to determine the *[type][term-type]* a node implements.\n\nThe `data` field represents information from the ecosystem.\nThe value of the `data` field implements the **[Data][dfn-data]** interface.\n\nThe `position` field represents the location of a node in a source document.\nThe value of the `position` field implements the **[Position][dfn-position]**\ninterface.\nThe `position` field must not be present if a node is\n*[generated][term-generated]*.\n\nSpecifications implementing unist are encouraged to define more fields.\nEcosystems can define fields on **[Data][dfn-data]**.\n\nAny value in unist **must** be expressible in JSON values: `string`, `number`,\n`object`, `array`, `true`, `false`, or `null`.\nThis means that the syntax tree should be able to be converted to and from JSON\nand produce the same tree.\nFor example, in JavaScript, a tree can be passed through\n`JSON.parse(JSON.stringify(tree))` and result in the same tree.\n\n#### `Position`\n\n```idl\ninterface Position {\n  start: Point\n  end: Point\n}\n```\n\n**Position** represents the location of a node in a source *[file][term-file]*.\n\nThe `start` field of **Position** represents the place of the first character of\nthe parsed source region.\nThe `end` field of **Position** represents the place of the first character\nafter the parsed source region, whether it exists or not.\nThe value of the `start` and `end` fields implement the **[Point][dfn-point]**\ninterface.\n\nIf the syntactic unit represented by a node is not present in the source\n*[file][term-file]* at the time of parsing, the node is said to be\n*[generated][term-generated]* and it must not have positional information.\n\nFor example, if the following value was represented as unist:\n\n```markdown\nalpha\nbravo\n```\n\n…the first word (`alpha`) would start at line `1`, column `1`, offset `0`, and\nend at line `1`, column `6`, offset `5`.\nThe line feed would start at line `1`, column `6`, offset `5`, and end at line\n`2`, column `1`, offset `6`.\nThe last word (`bravo`) would start at line `2`, column `1`, offset `6`, and end\nat line `2`, column `6`, offset `11`.\n\n#### `Point`\n\n```idl\ninterface Point {\n  line: number \u003e= 1\n  column: number \u003e= 1\n  offset: number \u003e= 0?\n}\n```\n\n**Point** represents one place in a source *[file][term-file]*.\n\nThe `line` field (1-indexed integer) represents a line in a source file.\nThe `column` field (1-indexed integer) represents a column in a source file.\nThe `offset` field (0-indexed integer) represents a character in a source file.\n\nThe term character means a (UTF-16) code unit which is defined in the\n[Web IDL][webidl] specification.\n\n#### `Data`\n\n```idl\ninterface Data { }\n```\n\n**Data** represents information associated by the ecosystem with the node.\n\nThis space is guaranteed to never be specified by unist or specifications\nimplementing unist.\n\n### `Parent`\n\n```idl\ninterface Parent \u003c: Node {\n  children: [Node]\n}\n```\n\nNodes containing other nodes (said to be *[children][term-child]*) extend the\nabstract interface **Parent** (**[Node][dfn-node]**).\n\nThe `children` field is a list representing the children of a node.\n\n### `Literal`\n\n```idl\ninterface Literal \u003c: Node {\n  value: any\n}\n```\n\nNodes containing a value extend the abstract interface **Literal**\n(**[Node][dfn-node]**).\n\nThe `value` field can contain any value.\n\n## Glossary\n\n###### Tree\n\nA **tree** is a node and all of its *[descendants][term-descendant]* (if any).\n\n###### Child\n\nNode X is **child** of node Y, if Y’s `children` include X.\n\n###### Parent\n\nNode X is **parent** of node Y, if Y is a *[child][term-child]* of X.\n\n###### Index\n\nThe **index** of a *[child][term-child]* is its number of preceding\n*[siblings][term-sibling]*, or `0` if it has none.\n\n###### Sibling\n\nNode X is a **sibling** of node Y, if X and Y have the same\n*[parent][term-parent]* (if any).\n\nThe **previous sibling** of a *[child][term-child]* is its **sibling** at its\n*[index][term-index]* minus 1.\n\nThe **next sibling** of a *[child][term-child]* is its **sibling** at its\n*[index][term-index]* plus 1.\n\n###### Root\n\nThe **root** of a node is itself, if without *[parent][term-parent]*, or the\n**root** of its *[parent][term-parent]*.\n\nThe **root** of a *[tree][term-tree]* is any node in that *[tree][term-tree]*\nwithout *[parent][term-parent]*.\n\n###### Descendant\n\nNode X is **descendant** of node Y, if X is a *[child][term-child]* of Y, or if\nX is a *[child][term-child]* of node Z that is a **descendant** of Y.\n\nAn **inclusive descendant** is a node or one of its **descendants**.\n\n###### Ancestor\n\nNode X is an **ancestor** of node Y, if Y is a *[descendant][term-descendant]*\nof X.\n\nAn **inclusive ancestor** is a node or one of its **ancestors**.\n\n###### Head\n\nThe **head** of a node is its first *[child][term-child]* (if any).\n\n###### Tail\n\nThe **tail** of a node is its last *[child][term-child]* (if any).\n\n###### Leaf\n\nA **leaf** is a node with no *[children][term-child]*.\n\n###### Branch\n\nA **branch** is a node with one or more *[children][term-child]*.\n\n###### Generated\n\nA node is **generated** if it does not have *[positional\ninformation][term-positional-info]*.\n\n###### Type\n\nThe **type** of a node is the value of its `type` field.\n\n###### Positional information\n\nThe **positional information** of a node is the value of its `position` field.\n\n###### File\n\nA **file** is a source document that represents the original file that was\nparsed to produce the syntax tree.\n*[Positional information][term-positional-info]* represents the place of a node\nin this file.\nFiles are provided by the host environment and not defined by unist.\n\nFor example, see projects such as **[vfile][]**.\n\n###### Preorder\n\nIn **preorder** (**NLR**) is [depth-first][traversal-depth] [tree\ntraversal][traversal] that performs the following steps for each node *N*:\n\n1. **N**: visit *N* itself\n2. **L**: traverse *[head][term-head]* (then its *next sibling*, recursively\n   moving forward until reaching *tail*)\n3. **R**: traverse *[tail][term-tail]*\n\n###### Postorder\n\nIn **postorder** (**LRN**) is [depth-first][traversal-depth] [tree\ntraversal][traversal] that performs the following steps for each node *N*:\n\n1. **L**: traverse *[head][term-head]* (then its *next sibling*, recursively\n   moving forward until reaching *tail*)\n2. **R**: traverse *[tail][term-tail]*\n3. **N**: visit *N* itself\n\n###### Enter\n\n**Enter** is a step right before other steps performed on a given node *N* when\n**[traversing][traversal]** a tree.\n\nFor example, when performing *preorder* traversal, **enter** is the first step\ntaken, right before visiting *N* itself.\n\n###### Exit\n\n**Exit** is a step right after other steps performed on a given node *N* when\n**[traversing][traversal]** a tree.\n\nFor example, when performing *preorder* traversal, **exit** is the last step\ntaken, right after traversing the *[tail][term-tail]* of *N*.\n\n## Tree traversal\n\n**Tree traversal** is a common task when working with a *[tree][term-tree]* to\nsearch it.\nTree traversal is typically either *breadth-first* or *depth-first*.\n\nIn the following examples, we’ll work with this tree:\n\n```mermaid\ngraph TD\n    A--\u003eB--\u003eC\n        B--\u003eD\n        B--\u003eE\n    A--\u003eF--\u003eG\n```\n\n###### Breadth-first traversal\n\n**Breadth-first traversal** is visiting a node and all its\n*[siblings][term-sibling]* to broaden the search at that level, before\ntraversing *[children][term-child]*.\n\nFor the syntax tree defined in the diagram, a breadth-first traversal first\nsearches the root of the tree (**A**), then its children (**B** and **F**), then\ntheir children (**C**, **D**, **E**, and **G**).\n\n###### Depth-first traversal\n\nAlternatively, and more commonly, **depth-first traversal** is used.\nThe search is first deepened, by traversing *[children][term-child]*, before\ntraversing *[siblings][term-sibling]*.\n\nFor the syntax tree defined in the diagram, a depth-first traversal first\nsearches the root of the tree (**A**), then one of its children (**B** or\n**F**), then their children (**C**, **D**, and **E**, or **G**).\n\nFor a given node *N* with *[children][term-child]*, a **depth-first traversal**\nperforms three steps, simplified to only binary trees (every node has\n*[head][term-head]* and *[tail][term-tail]*, but no other children):\n\n* **N**: visit *N* itself\n* **L**: traverse *[head][term-head]*\n* **R**: traverse *[tail][term-tail]*\n\nThese steps can be done in any order, but for non-binary trees, **L** and **R**\noccur together.\nIf **L** is done before **R**, the traversal is called *left-to-right*\ntraversal, otherwise it is called *right-to-left* traversal.\nIn the case of non-binary trees, the other children between *head* and *tail*\nare processed in that order as well, so for *left-to-right* traversal, first\n*head* is traversed (**L**), then its *next sibling* is traversed, etcetera,\nuntil finally *tail* (**R**) is traversed.\n\nBecause **L** and **R** occur together for non-binary trees, we can produce four\ntypes of orders: NLR, NRL, LRN, RLN.\n\nNLR and LRN (the two *left-to-right* traversal options) are most commonly used\nand respectively named *[preorder][term-preorder]* and\n*[postorder][term-postorder]*.\n\nFor the syntax tree defined in the diagram, *preorder* and *postorder* traversal\nthus first search the root of the tree (**A**), then its head (**B**), then its\nchildren from left-to-right (**C**, **D**, and then **E**).\nAfter all *[descendants][term-descendant]* of **B** are traversed, its next\nsibling (**F**) is traversed and then finally its only child (**G**).\n\n## Utilities\n\n**Utilities** are functions that work with nodes.\n\nThere are several projects that deal with nodes from specifications implementing\nunist:\n\n* [hast utilities](https://github.com/syntax-tree/hast#list-of-utilities)\n* [mdast utilities](https://github.com/syntax-tree/mdast#list-of-utilities)\n* [nlcst utilities](https://github.com/syntax-tree/nlcst#list-of-utilities)\n* [xast utilities](https://github.com/syntax-tree/xast#list-of-utilities)\n\n### List of utilities\n\n* [`unist-util-ancestor`](https://github.com/gorango/unist-util-ancestor)\n  — get the common ancestor of one or more nodes\n* [`unist-util-assert`](https://github.com/syntax-tree/unist-util-assert)\n  — assert nodes\n* [`unist-util-filter`](https://github.com/syntax-tree/unist-util-filter)\n  — create a new tree with all nodes that pass the given function\n* [`unist-util-find`](https://github.com/blahah/unist-util-find)\n  — find a node by condition\n* [`unist-util-find-after`](https://github.com/syntax-tree/unist-util-find-after)\n  — find a node after another node\n* [`unist-util-find-all-after`](https://github.com/syntax-tree/unist-util-find-all-after)\n  — find nodes after another node or index\n* [`unist-util-find-all-before`](https://github.com/syntax-tree/unist-util-find-all-before)\n  — find nodes before another node or index\n* [`unist-util-find-all-between`](https://github.com/mrzmmr/unist-util-find-all-between)\n  — find nodes between two nodes or positions\n* [`unist-util-find-before`](https://github.com/syntax-tree/unist-util-find-before)\n  — find a node before another node\n* [`unist-util-flat-filter`](https://github.com/unicorn-utterances/unist-util-flat-filter)\n  — flat map version of `unist-util-filter`\n* [`unist-util-flatmap`](https://gitlab.com/staltz/unist-util-flatmap)\n  — create a new tree by expanding a node into many\n* [`unist-util-generated`](https://github.com/syntax-tree/unist-util-generated)\n  — check if a node is generated\n* [`unist-util-index`](https://github.com/syntax-tree/unist-util-index)\n  — index nodes by property or computed key\n* [`unist-util-inspect`](https://github.com/syntax-tree/unist-util-inspect)\n  — node inspector\n* [`unist-util-is`](https://github.com/syntax-tree/unist-util-is)\n  — check if a node passes a test\n* [`unist-util-map`](https://github.com/syntax-tree/unist-util-map)\n  — create a new tree by mapping nodes\n* [`unist-util-modify-children`](https://github.com/syntax-tree/unist-util-modify-children)\n  — modify direct children of a parent\n* [`unist-util-parents`](https://github.com/syntax-tree/unist-util-parents)\n  — `parent` references on nodes\n* [`unist-util-position`](https://github.com/syntax-tree/unist-util-position)\n  — get positional info of nodes\n* [`unist-util-reduce`](https://github.com/GenerousLabs/unist-util-reduce)\n  — recursively reduce a tree\n* [`unist-util-remove`](https://github.com/syntax-tree/unist-util-remove)\n  — remove nodes from trees\n* [`unist-util-remove-position`](https://github.com/syntax-tree/unist-util-remove-position)\n  — remove positional info from trees\n* [`unist-util-replace-all-between`](https://github.com/unicorn-utterances/unist-util-replace-all-between)\n  — replace nodes between two nodes or positions\n* [`unist-util-select`](https://github.com/syntax-tree/unist-util-select)\n  — select nodes with CSS-like selectors\n* [`unist-util-size`](https://github.com/syntax-tree/unist-util-size)\n  — calculate the number of nodes in a tree\n* [`unist-util-source`](https://github.com/syntax-tree/unist-util-source)\n  — get the source of a value (node or position) in a file\n* [`unist-util-stringify-position`](https://github.com/syntax-tree/unist-util-stringify-position)\n  — stringify a node, position, or point\n* [`unist-util-visit`](https://github.com/syntax-tree/unist-util-visit)\n  — recursively walk over nodes\n* [`unist-util-visit-parents`](https://github.com/syntax-tree/unist-util-visit-parents)\n  — recursively walk over nodes, with a stack of parents\n* [`unist-util-visit-children`](https://github.com/syntax-tree/unist-util-visit-children)\n  — visit direct children of a parent\n* [`unist-util-visit-all-after`](https://github.com/mrzmmr/unist-util-visit-all-after)\n  — visit nodes after another node\n* [`unist-builder`](https://github.com/syntax-tree/unist-builder)\n  — helper for creating trees\n\n## References\n\n* **JavaScript**:\n  [ECMAScript Language Specification][javascript].\n  Ecma International.\n* **JSON**:\n  [The JavaScript Object Notation (JSON) Data Interchange Format][json],\n  T. Bray.\n  IETF.\n* **XML**:\n  [Extensible Markup Language][xml],\n  T. Bray, J. Paoli, C. Sperberg-McQueen, E. Maler, F. Yergeau.\n  W3C.\n* **Web IDL**:\n  [Web IDL][webidl],\n  C. McCormack.\n  W3C.\n\n## Contribute\n\nSee [`contributing.md`][contributing] in [`syntax-tree/.github`][health] for\nways to get started.\nSee [`support.md`][support] for ways to get help.\n\nA curated list of awesome syntax-tree, unist, hast, xast, mdast, and nlcst\nresources can be found in [awesome syntax-tree][awesome].\n\nThis project has a [code of conduct][coc].\nBy interacting with this repository, organization, or community you agree to\nabide by its terms.\n\n## Acknowledgments\n\nThe initial release of this project was authored by\n**[@wooorm](https://github.com/wooorm)**.\n\nSpecial thanks to **[@eush77](https://github.com/eush77)** for their work,\nideas, and incredibly valuable feedback!\nThanks to **[@anandthakker](https://github.com/anandthakker)**,\n**[@anko](https://github.com/anko)**,\n**[@arobase-che](https://github.com/arobase-che)**,\n**[@azu](https://github.com/azu)**,\n**[@BarryThePenguin](https://github.com/BarryThePenguin)**,\n**[@ben-eb](https://github.com/ben-eb)**,\n**[@blahah](https://github.com/blahah)**,\n**[@blakeembrey](https://github.com/blakeembrey)**,\n**[@brainkim](https://github.com/brainkim)**,\n**[@ChristianMurphy](https://github.com/ChristianMurphy)**,\n**[@davidtheclark](https://github.com/davidtheclark)**,\n**[@denysdovhan](https://github.com/denysdovhan)**,\n**[@derhuerst](https://github.com/derhuerst)**,\n**[@dozoisch](https://github.com/dozoisch)**,\n**[@fazouane-marouane](https://github.com/fazouane-marouane)**,\n**[@gibson042](https://github.com/gibson042)**,\n**[@hrajchert](https://github.com/hrajchert)**,\n**[@ikatyang](https://github.com/ikatyang)**,\n**[@inklesspen](https://github.com/inklesspen)**,\n**[@izumin5210](https://github.com/izumin5210)**,\n**[@jasonLaster](https://github.com/jasonLaster)**,\n**[@JDvorak](https://github.com/JDvorak)**,\n**[@jlevy](https://github.com/jlevy)**,\n**[@justjake](https://github.com/justjake)**,\n**[@kmck](https://github.com/kmck)**,\n**[@kt3k](https://github.com/kt3k)**,\n**[@KyleAMathews](https://github.com/KyleAMathews)**,\n**[@luca3m](https://github.com/luca3m)**,\n**[@mattdesl](https://github.com/mattdesl)**,\n**[@muraken720](https://github.com/muraken720)**,\n**[@mrzmmr](https://github.com/mrzmmr)**,\n**[@nwtn](https://github.com/nwtn)**,\n**[@rhysd](https://github.com/rhysd)**,\n**[@Rokt33r](https://github.com/Rokt33r)**,\n**[@Sarah-Seo](https://github.com/Sarah-Seo)**,\n**[@sethvincent](https://github.com/sethvincent)**,\n**[@shawnbot](https://github.com/shawnbot)**,\n**[@simov](https://github.com/simov)**,\n**[@staltz](https://github.com/staltz)**,\n**[@TitanSnow](https://github.com/TitanSnow)**,\n**[@tmcw](https://github.com/tmcw)**,\nand\n**[@vhf](https://github.com/vhf)**,\nfor contributing to unist and related projects!\n\n## License\n\n[CC-BY-4.0][license] © [Titus Wormer][author]\n\n\u003c!-- Definitions --\u003e\n\n[health]: https://github.com/syntax-tree/.github\n\n[contributing]: https://github.com/syntax-tree/.github/blob/main/contributing.md\n\n[support]: https://github.com/syntax-tree/.github/blob/main/support.md\n\n[coc]: https://github.com/syntax-tree/.github/blob/main/code-of-conduct.md\n\n[awesome]: https://github.com/syntax-tree/awesome-syntax-tree\n\n[logo]: https://raw.githubusercontent.com/syntax-tree/unist/367da2e/logo.svg?sanitize=true\n\n[releases]: https://github.com/syntax-tree/unist/releases\n\n[license]: https://creativecommons.org/licenses/by/4.0/\n\n[author]: https://wooorm.com\n\n[release]: https://github.com/syntax-tree/unist/releases/tag/3.0.0\n\n[abstract-vs-concrete-trees]: https://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees/\n\n[dfn-node]: #node\n\n[dfn-position]: #position\n\n[dfn-point]: #point\n\n[dfn-data]: #data\n\n[term-tree]: #tree\n\n[term-preorder]: #preorder\n\n[term-postorder]: #postorder\n\n[term-child]: #child\n\n[term-parent]: #parent-1\n\n[term-index]: #index\n\n[term-sibling]: #sibling\n\n[term-descendant]: #descendant\n\n[term-head]: #head\n\n[term-tail]: #tail\n\n[term-generated]: #generated\n\n[term-type]: #type\n\n[term-positional-info]: #positional-information\n\n[term-file]: #file\n\n[traversal]: #tree-traversal\n\n[traversal-depth]: #depth-first-traversal\n\n[list-of-utilities]: #list-of-utilities\n\n[webidl]: https://webidl.spec.whatwg.org\n\n[json]: https://datatracker.ietf.org/doc/html/rfc7159\n\n[xml]: https://www.w3.org/TR/xml/\n\n[javascript]: https://262.ecma-international.org/9.0/\n\n[hast]: https://github.com/syntax-tree/hast\n\n[xast]: https://github.com/syntax-tree/xast\n\n[nlcst]: https://github.com/syntax-tree/nlcst\n\n[mdast]: https://github.com/syntax-tree/mdast\n\n[unified]: https://github.com/unifiedjs/unified\n\n[remark]: https://github.com/remarkjs/remark\n\n[rehype]: https://github.com/rehypejs/rehype\n\n[retext]: https://github.com/retextjs/retext\n\n[vfile]: https://github.com/vfile/vfile\n","funding_links":["https://github.com/sponsors/unifiedjs","https://opencollective.com/unified"],"categories":["Others","Uncategorized","Related projects","others","unist utilities"],"sub_categories":["Uncategorized"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsyntax-tree%2Funist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsyntax-tree%2Funist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsyntax-tree%2Funist/lists"}