diff --git a/docusaurus.config.js b/docusaurus.config.js index 2872b4008..4ae4dc09f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -329,6 +329,7 @@ const config = { }, }; }, + [require.resolve('./src/plugins/git-commit-info'), {}], ], }; diff --git a/package-lock.json b/package-lock.json index b1c409e87..5d117f498 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@node-rs/jieba": "^1.10.3", "@svgr/webpack": "^6.3.1", "autoprefixer": "^10.4.14", + "caniuse-lite": "^1.0.30001726", "classnames": "^2.2.6", "clsx": "^1.1.1", "file-loader": "^6.2.0", @@ -1847,25 +1848,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/caniuse-lite": { - "version": "1.0.30001546", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", - "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, "node_modules/@babel/plugin-transform-runtime/node_modules/core-js-compat": { "version": "3.33.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", @@ -5664,9 +5646,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001514", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", - "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "funding": [ { "type": "opencollective", @@ -5680,7 +5662,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "1.1.0", diff --git a/package.json b/package.json index 555f01ab1..a6115c65c 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@node-rs/jieba": "^1.10.3", "@svgr/webpack": "^6.3.1", "autoprefixer": "^10.4.14", + "caniuse-lite": "^1.0.30001726", "classnames": "^2.2.6", "clsx": "^1.1.1", "file-loader": "^6.2.0", diff --git a/src/plugins/git-commit-info/index.js b/src/plugins/git-commit-info/index.js new file mode 100644 index 000000000..0180740ae --- /dev/null +++ b/src/plugins/git-commit-info/index.js @@ -0,0 +1,32 @@ +const { exec } = require('child_process'); + +function getLastCommitHashAsync(filePath) { + return new Promise((resolve) => { + exec(`git log -n 1 --pretty=format:%h -- "${filePath}"`, { encoding: 'utf8' }, (err, stdout) => { + if (err) return resolve(null); + resolve(stdout.trim()); + }); + }); +} + +console.log('[git-commit-info] Plugin loaded'); + +module.exports = function (context, options) { + return { + name: 'docusaurus-plugin-git-commit-info', + async extendMarkdownPageData(mdData) { + console.log('[git-commit-info] mdData:', mdData); + console.log('[git-commit-info] filePath:', mdData.filePath); + if (mdData.filePath) { + const commitHash = await getLastCommitHashAsync(mdData.filePath); + console.log('[git-commit-info] commitHash for', mdData.filePath, ':', commitHash); + if (commitHash) { + mdData.frontMatter.lastUpdatedCommit = commitHash; + mdData.metadata = mdData.metadata || {}; + mdData.metadata.lastUpdatedCommit = commitHash; + } + } + return mdData; + }, + }; +}; \ No newline at end of file diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js new file mode 100644 index 000000000..bc85e32ac --- /dev/null +++ b/src/theme/DocItem/index.js @@ -0,0 +1,27 @@ +import React from 'react'; +import OriginalDocItem from '@theme-original/DocItem'; +import { useDoc } from '@docusaurus/theme-common'; + +export default function DocItem(props) { + const { metadata } = useDoc(); + const commit = metadata?.lastUpdatedCommit; + + return ( + <> + + {commit && ( +
+ Last updated commit: {commit} +
+ )} + + ); +} \ No newline at end of file