diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 32cd1792d0c6..520d7e071c80 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: yarn diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 584c74669453..c1f1b901feb0 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: yarn @@ -38,7 +38,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: yarn @@ -58,7 +58,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: yarn @@ -84,7 +84,7 @@ jobs: - uses: actions/checkout@v5 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: yarn diff --git a/package.json b/package.json index 3de148cd413c..8a191d76f306 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,10 @@ "fetch": "run-p fetch:*", "fetch:readmes": "node src/utilities/fetch-package-readmes.mjs", "fetch:supporters": "node src/utilities/fetch-supporters.mjs", + "fetch:governance": "node src/utilities/fetch-governance.mjs", "fetch-all": "run-s fetch-repos fetch", "prebuild": "npm run clean", - "build": "run-s fetch-repos fetch content && webpack --config webpack.prod.mjs --config-node-env production && run-s printable content && webpack --config webpack.ssg.mjs --config-node-env production --env ssg", + "build": "run-s fetch-repos fetch:governance fetch content && webpack --config webpack.prod.mjs --config-node-env production && run-s printable content && webpack --config webpack.ssg.mjs --config-node-env production --env ssg", "postbuild": "npm run sitemap", "build-test": "npm run build && http-server --port 4200 dist/", "serve-dist": "http-server --port 4200 dist/", @@ -48,7 +49,7 @@ "lint:markdown": "npm run lint-markdown '**/*.{md,mdx}'", "lint-markdown": "markdownlint --config ./.markdownlint.json", "lint:prose": "vale --config='.vale.ini' src/content", - "lint:links": "hyperlink -c 8 --root dist -r dist/index.html --canonicalroot https://webpack.js.org/ --internal --skip /plugins/extract-text-webpack-plugin/ --skip /printable --skip https:// --skip http:// --skip sw.js --skip /vendor > internal-links.tap; cat internal-links.tap | tap-spot", + "lint:links": "hyperlink -c 8 --root dist -r dist/index.html --canonicalroot https://webpack.js.org/ --internal --skip /plugins/extract-text-webpack-plugin/ --skip /printable --skip /contribute/Governance --skip https:// --skip http:// --skip sw.js --skip /vendor > internal-links.tap; cat internal-links.tap | tap-spot", "sitemap": "cd dist && sitemap-static --ignore-file=../sitemap-ignore.json --pretty --prefix=https://webpack.js.org/ > sitemap.xml", "serve": "npm run build && sirv start ./dist --port 4000", "preprintable": "npm run clean-printable", diff --git a/src/utilities/content-tree-enhancers.mjs b/src/utilities/content-tree-enhancers.mjs index 47ac93f68f75..9209d104b375 100644 --- a/src/utilities/content-tree-enhancers.mjs +++ b/src/utilities/content-tree-enhancers.mjs @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import frontMatter from 'front-matter'; -import {remark} from 'remark'; +import { remark } from 'remark'; import slug from '../../src/remark-plugins/remark-slug/index.mjs'; import extractAnchors from 'remark-extract-anchors'; import remarkHtml from 'remark-html'; diff --git a/src/utilities/fetch-governance.mjs b/src/utilities/fetch-governance.mjs new file mode 100644 index 000000000000..fd1af365f9cf --- /dev/null +++ b/src/utilities/fetch-governance.mjs @@ -0,0 +1,104 @@ +import path from 'path'; +import { mkdirp } from 'mkdirp'; +import { writeFile } from 'fs/promises'; +import { fileURLToPath } from 'url'; +import api from './githubAPI.mjs'; +import yamlHeadmatter from './yaml-headmatter.mjs'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const owner = 'webpack'; +const repo = 'governance'; + +// Output directly under /contribute (no Governance subfolder) +const outputDir = path.resolve(__dirname, '../content/contribute'); + +// Generate readable title from filename +function generateTitle(filename) { + if (filename === 'README.md') return 'Governance Overview'; + return filename + .replace('.md', '') + .replace(/_/g, ' ') + .replace(/-/g, ' ') + .toLowerCase() + .replace(/\b\w/g, (c) => c.toUpperCase()); +} + +// Fix internal markdown links (.md → /) +function fixMarkdownLinks(content) { + return content.replace(/(\]\([A-Z0-9_-]+)\.md(\))/gi, '$1/$2'); +} + +async function fetchGovernanceDocs() { + console.log('Fetching governance markdown files from webpack/governance...'); + + await mkdirp(outputDir); + + try { + // Get markdown files from governance repo + const { data: files } = await api.repos.getContent({ + owner, + repo, + path: '', + }); + + const markdownFiles = files.filter((file) => file.name.endsWith('.md')); + + for (const file of markdownFiles) { + const filename = file.name; + + // Create Capitalized prefixed filenames + const baseName = filename + .replace('.md', '') + .replace(/_/g, '-') + .toLowerCase(); + + const destFile = + filename === 'README.md' + ? 'Governance-Overview.mdx' + : `Governance-${baseName}.mdx`; + + // Fetch content from GitHub and fix markdown links + const response = await fetch(file.download_url); + let content = await response.text(); + content = fixMarkdownLinks(content); + + // Generate title and sorting order + const title = generateTitle(filename); + const sortOrder = + { + 'README.md': 0, + 'CHARTER.md': 1, + 'MEMBER_EXPECTATIONS.md': 2, + 'MODERATION_POLICY.md': 3, + 'WORKING_GROUPS.md': 4, + }[filename] ?? 10; + + // Build YAML frontmatter + const fm = { + title, + group: 'Contribute', + sort: sortOrder, + source: `https://github.com/${owner}/${repo}/blob/main/${filename}`, + edit: `https://github.com/${owner}/${repo}/edit/main/${filename}`, + }; + + const frontmatter = yamlHeadmatter(fm); + + // Write .mdx file + const destPath = path.join(outputDir, destFile); + await writeFile(destPath, frontmatter + content, 'utf8'); + console.log(`Synced: ${filename} → ${destFile}`); + } + + console.log( + '\nGovernance content generated successfully with Capitalized prefix!' + ); + } catch (error) { + console.error('Error fetching governance files:', error.message); + process.exitCode = 1; + } +} + +fetchGovernanceDocs();