Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
mdast-util-gfm
Advanced tools
mdast extension to parse and serialize GFM (GitHub Flavored Markdown)
The `mdast-util-gfm` package is a utility for working with GitHub Flavored Markdown (GFM) in the MDAST (Markdown Abstract Syntax Tree) format. It provides functions to parse and transform GFM-specific syntax such as tables, strikethroughs, task lists, and autolinks.
Tables
This feature allows you to parse and transform GitHub Flavored Markdown tables into an MDAST tree structure.
const { fromMarkdown, toMarkdown } = require('mdast-util-gfm');
const markdown = '| Header1 | Header2 |
| ------- | ------- |
| Cell1 | Cell2 |';
const tree = fromMarkdown(markdown);
console.log(tree);
Strikethrough
This feature allows you to parse and transform strikethrough text in GitHub Flavored Markdown into an MDAST tree structure.
const { fromMarkdown, toMarkdown } = require('mdast-util-gfm');
const markdown = 'This is ~~strikethrough~~ text.';
const tree = fromMarkdown(markdown);
console.log(tree);
Task Lists
This feature allows you to parse and transform task lists in GitHub Flavored Markdown into an MDAST tree structure.
const { fromMarkdown, toMarkdown } = require('mdast-util-gfm');
const markdown = '- [x] Task 1
- [ ] Task 2';
const tree = fromMarkdown(markdown);
console.log(tree);
Autolinks
This feature allows you to parse and transform autolinks in GitHub Flavored Markdown into an MDAST tree structure.
const { fromMarkdown, toMarkdown } = require('mdast-util-gfm');
const markdown = 'Visit https://example.com for more info.';
const tree = fromMarkdown(markdown);
console.log(tree);
The `remark-gfm` package is a plugin for the `remark` ecosystem that adds support for GitHub Flavored Markdown. It provides similar functionality to `mdast-util-gfm` but is designed to be used within the `remark` processor.
The `markdown-it` package is a Markdown parser that supports GitHub Flavored Markdown out of the box. It is a more general-purpose parser compared to `mdast-util-gfm`, which is specifically designed for working with MDAST.
The `marked` package is a fast Markdown parser and compiler that supports GitHub Flavored Markdown. It is similar to `markdown-it` in that it is a general-purpose parser, but it is known for its speed and performance.
mdast extensions to parse and serialize GFM (autolink literals, footnotes, strikethrough, tables, tasklists).
This package contains two extensions that add support for GFM syntax in
markdown to mdast: autolink literals (www.x.com
), footnotes ([^1]
),
strikethrough (~~stuff~~
), tables (| cell |…
), and tasklists (* [x]
).
These extensions plug into
mdast-util-from-markdown
(to support parsing
GFM in markdown into a syntax tree) and
mdast-util-to-markdown
(to support serializing
GFM in syntax trees to markdown).
This project is useful when you want to support the same features that GitHub
does in files in a repo, Gists, and several other places.
Users frequently believe that some of these extensions, specifically autolink
literals and tables, are part of normal markdown, so using mdast-util-gfm
will
help match your implementation to their understanding of markdown.
There are several edge cases where GitHub’s implementation works in unexpected
ways or even different than described in their spec, so writing in GFM is not
always the best choice.
You can use these extensions when you are working with
mdast-util-from-markdown
and mdast-util-to-markdown
already.
When working with mdast-util-from-markdown
, you must combine this package
with micromark-extension-gfm
.
Instead of this package, you can also use the extensions separately:
mdast-util-gfm-autolink-literal
— support GFM autolink literalsmdast-util-gfm-footnote
— support GFM footnotesmdast-util-gfm-strikethrough
— support GFM strikethroughmdast-util-gfm-table
— support GFM tablesmdast-util-gfm-task-list-item
— support GFM tasklistsA different utility, mdast-util-frontmatter
, adds
support for frontmatter.
GitHub supports YAML frontmatter for files in repos and Gists but they don’t
treat it as part of GFM.
All these packages are used in remark-gfm
, which
focusses on making it easier to transform content by abstracting these
internals away.
This utility does not handle how markdown is turned to HTML.
That’s done by mdast-util-to-hast
.
If your content is not in English, you should configure that utility.
This package is ESM only. In Node.js (version 16+), install with npm:
npm install mdast-util-gfm
In Deno with esm.sh
:
import {gfmFromMarkdown, gfmToMarkdown} from 'https://esm.sh/mdast-util-gfm@3'
In browsers with esm.sh
:
<script type="module">
import {gfmFromMarkdown, gfmToMarkdown} from 'https://esm.sh/mdast-util-gfm@3?bundle'
</script>
Say our document example.md
contains:
# GFM
## Autolink literals
www.example.com, https://example.com, and contact@example.com.
## Footnote
A note[^1]
[^1]: Big note.
## Strikethrough
~one~ or ~~two~~ tildes.
## Table
| a | b | c | d |
| - | :- | -: | :-: |
## Tasklist
* [ ] to do
* [x] done
…and our module example.js
looks as follows:
import fs from 'node:fs/promises'
import {gfm} from 'micromark-extension-gfm'
import {fromMarkdown} from 'mdast-util-from-markdown'
import {gfmFromMarkdown, gfmToMarkdown} from 'mdast-util-gfm'
import {toMarkdown} from 'mdast-util-to-markdown'
const doc = await fs.readFile('example.md')
const tree = fromMarkdown(doc, {
extensions: [gfm()],
mdastExtensions: [gfmFromMarkdown()]
})
console.log(tree)
const out = toMarkdown(tree, {extensions: [gfmToMarkdown()]})
console.log(out)
…now running node example.js
yields (positional info removed for brevity):
{
type: 'root',
children: [
{type: 'heading', depth: 1, children: [{type: 'text', value: 'GFM'}]},
{
type: 'heading',
depth: 2,
children: [{type: 'text', value: 'Autolink literals'}]
},
{
type: 'paragraph',
children: [
{
type: 'link',
title: null,
url: 'http://www.example.com',
children: [{type: 'text', value: 'www.example.com'}]
},
{type: 'text', value: ', '},
{
type: 'link',
title: null,
url: 'https://example.com',
children: [{type: 'text', value: 'https://example.com'}]
},
{type: 'text', value: ', and '},
{
type: 'link',
title: null,
url: 'mailto:contact@example.com',
children: [{type: 'text', value: 'contact@example.com'}]
},
{type: 'text', value: '.'}
]
},
{type: 'heading', depth: 2, children: [{type: 'text', value: 'Footnote'}]},
{
type: 'paragraph',
children: [
{type: 'text', value: 'A note'},
{type: 'footnoteReference', identifier: '1', label: '1'}
]
},
{
type: 'footnoteDefinition',
identifier: '1',
label: '1',
children: [
{type: 'paragraph', children: [{type: 'text', value: 'Big note.'}]}
]
},
{
type: 'heading',
depth: 2,
children: [{type: 'text', value: 'Strikethrough'}]
},
{
type: 'paragraph',
children: [
{
type: 'delete',
children: [{type: 'text', value: 'one'}]
},
{type: 'text', value: ' or '},
{
type: 'delete',
children: [{type: 'text', value: 'two'}]
},
{type: 'text', value: ' tildes.'}
]
},
{type: 'heading', depth: 2, children: [{type: 'text', value: 'Table'}]},
{
type: 'table',
align: [null, 'left', 'right', 'center'],
children: [
{
type: 'tableRow',
children: [
{type: 'tableCell', children: [{type: 'text', value: 'a'}]},
{type: 'tableCell', children: [{type: 'text', value: 'b'}]},
{type: 'tableCell', children: [{type: 'text', value: 'c'}]},
{type: 'tableCell', children: [{type: 'text', value: 'd'}]}
]
}
]
},
{type: 'heading', depth: 2, children: [{type: 'text', value: 'Tasklist'}]},
{
type: 'list',
ordered: false,
start: null,
spread: false,
children: [
{
type: 'listItem',
spread: false,
checked: false,
children: [
{type: 'paragraph', children: [{type: 'text', value: 'to do'}]}
]
},
{
type: 'listItem',
spread: false,
checked: true,
children: [
{type: 'paragraph', children: [{type: 'text', value: 'done'}]}
]
}
]
}
]
}
# GFM
## Autolink literals
[www.example.com](http://www.example.com), <https://example.com>, and <contact@example.com>.
## Footnote
A note[^1]
[^1]: Big note.
## Strikethrough
~~one~~ or ~~two~~ tildes.
## Table
| a | b | c | d |
| - | :- | -: | :-: |
## Tasklist
* [ ] to do
* [x] done
This package exports the identifiers gfmFromMarkdown
and gfmToMarkdown
.
There is no default export.
gfmFromMarkdown()
Create an extension for mdast-util-from-markdown
to enable GFM (autolink literals, footnotes, strikethrough, tables, tasklists).
Extension for mdast-util-from-markdown
to enable GFM
(Array<FromMarkdownExtension>
).
gfmToMarkdown(options?)
Create an extension for mdast-util-to-markdown
to enable GFM (autolink literals, footnotes, strikethrough, tables, tasklists).
options
(Options
)
— configurationExtension for mdast-util-to-markdown
to enable GFM
(Array<ToMarkdownExtension>
).
Options
Configuration (TypeScript type).
tableCellPadding
(boolean
, default: true
)
— whether to add a space of padding between delimiters and cellstablePipeAlign
(boolean
, default: true
)
— whether to align the delimitersstringLength
(((value: string) => number)
, default: s => s.length
)
— function to detect the length of table cell content, used when aligning
the delimiters between cellsThis utility does not handle how markdown is turned to HTML.
That’s done by mdast-util-to-hast
.
See Syntax in micromark-extension-gfm
.
This utility combines several mdast utilities. See their readmes for the node types supported in the tree:
mdast-util-gfm-autolink-literal
— GFM autolink literalsmdast-util-gfm-footnote
— GFM footnotesmdast-util-gfm-strikethrough
— GFM strikethroughmdast-util-gfm-table
— GFM tablesmdast-util-gfm-task-list-item
— GFM tasklistsThis package is fully typed with TypeScript.
It exports the additional type Options
.
The Delete
, FootnoteDefinition
, FootnoteReference
, Table
, TableRow
,
and TableCell
types of the mdast nodes are exposed from @types/mdast
.
Projects maintained by the unified collective are compatible with maintained versions of Node.js.
When we cut a new major release, we drop support for unmaintained versions of
Node.
This means we try to keep the current release line, mdast-util-gfm@^3
,
compatible with Node.js 16.
remark-gfm
— remark plugin to support GFMmicromark-extension-gfm
— micromark extension to parse GFMSee contributing.md
in syntax-tree/.github
for
ways to get started.
See support.md
for ways to get help.
This project has a code of conduct. By interacting with this repository, organization, or community you agree to abide by its terms.
FAQs
mdast extension to parse and serialize GFM (GitHub Flavored Markdown)
The npm package mdast-util-gfm receives a total of 3,391,615 weekly downloads. As such, mdast-util-gfm popularity was classified as popular.
We found that mdast-util-gfm demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.