unified-infer-git-meta
unified plugin to infer file metadata from Git of a document.
Contents
What is this?
This package is a unified plugin to infer when content was first published, last modified, and who contributed to it, from Git.
unified is a project that transforms content with abstract syntax trees (ASTs). vfile is the virtual file interface used in unified. This is a unified plugin that extracts metadata from Git and exposes it on the vfile.
When should I use this?
This plugin is particularly useful in combination with rehype-meta
. When both are used together, output such as the following is generated:
<meta name="copyright" content="© 2019 Jane">
<meta name="author" content="Jane">
<!-- … -->
<meta property="article:published_time" content="2019-12-02T10:00:00.000Z">
<meta property="article:modified_time" content="2019-12-03T19:13:00.000Z">
The downside is that Git might be sparesely cloned when building a website, meaning that only the last commit is available, which means that this plugin cannot find all data.
Install
This package is ESM only. In Node.js (version 16+), install with npm:
npm install unified-infer-git-meta
In Deno with esm.sh
:
import unifiedInferGitMeta from 'https://esm.sh/unified-infer-git-meta@2'
In browsers with esm.sh
:
<script type="module">
import unifiedInferGitMeta from 'https://esm.sh/unified-infer-git-meta@2?bundle'
</script>
Use
Say our module example.js
looks as follows:
import rehypeDocument from 'rehype-document'
import rehypeFormat from 'rehype-format'
import rehypeMeta from 'rehype-meta'
import rehypeStringify from 'rehype-stringify'
import remarkParse from 'remark-parse'
import remarkRehype from 'remark-rehype'
import {read} from 'to-vfile'
import {unified} from 'unified'
import unifiedInferGitMeta from 'unified-infer-git-meta'
const file = await unified()
.use(remarkParse)
.use(unifiedInferGitMeta)
.use(remarkRehype)
.use(rehypeDocument)
.use(rehypeMeta, {
// Published and modified are only added if these two are also defined:
og: true,
type: 'article'
})
.use(rehypeFormat)
.use(rehypeStringify)
.process(await read('readme.md'))
console.log(file.data)
console.log(String(file))
…now running node example.js
yields:
{
meta: {
author: 'Titus Wormer',
modified: new Date('2023-08-24T10:13:50.000Z'),
published: new Date('2021-09-09T11:22:32.000Z')
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>readme</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="Titus Wormer">
<meta property="og:type" content="article">
<meta property="article:published_time" content="2021-09-09T11:22:32.000Z">
<meta property="article:modified_time" content="2023-08-24T10:13:50.000Z">
</head>
…
API
This package exports no identifiers. The default export is unifiedInferGitMeta
.
unified().use(unifiedInferGitMeta, options?)
Plugin to infer some meta
from Git.
This plugin sets file.data.meta.published
to the date a file was first committed, file.data.meta.modified
to the date a file was last committed, and file.data.meta.author
to an abbreviated list of top authors of the file.
Parameters
options
(Options
, optional) — configuration
Returns
Transform (Transformer
).
Format
Format function (TypeScript type).
Parameters
authors
(Iterable<string>
) — list of authors
Returns
Formatted authors (string
).
Options
Configuration (TypeScript type).
Fields
authorRest
(string
, default:'others'
) — text to use to label more authors when abbreviatingformat
(Format
, default:format
ofIntl.ListFormat(locales)
) — alternative format function to use; if the authors had to be abbreviated, the last author is instead replaced byauthorRest
; setlimit: -1
to receive all author nameslimit
(number
, default:3
) — max number of authors to include; set to-1
to not limit authorslocales
(Array<string>
orstring
, default:'en'
) — locale(s) to use to join authors and sort their names
Types
This package is fully typed with TypeScript. It exports the additional types Format
and Options
.
It also registers the file.data.meta
fields with vfile
. If you’re working with the file, make sure to import this plugin somewhere in your types, as that registers the new fields on the file.
/**
* @typedef {import('unified-infer-git-meta')}
*/
import {VFile} from 'vfile'
const file = new VFile()
console.log(file.data.meta.published) //=> TS now knows that this is a `Date?`.
Compatibility
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, unified-infer-git-meta@^2
, compatible with Node.js 16.
Related
rehype-meta
— add metadata to the head of a documentrehype-infer-title-meta
— infer file metadata from the title of a documentrehype-infer-description-meta
— infer file metadata from the description of a documentrehype-infer-reading-time-meta
— infer file metadata from the reading time of a document
Contribute
See contributing.md
in unifiedjs/.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.