diff --git a/package.json b/package.json index 42eb94098d..103ecb2426 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "eslint", "jest --testRegex='^(?!.*.integ.spec.js$).*.spec.js$' --findRelatedTests --passWithNoTests" ], + ".USAGE.md": "scripts/usage-to-readme.js --git-add", "./CHANGELOG.unreleased.md": "sh -c scripts/gen-deps-list.js --" }, "private": true, diff --git a/scripts/normalize-packages.js b/scripts/normalize-packages.js index 0fdda947fd..5181e2a85d 100755 --- a/scripts/normalize-packages.js +++ b/scripts/normalize-packages.js @@ -5,7 +5,9 @@ const isEmpty = require('lodash/isEmpty') const sortedObject = require('sorted-object') const { dirname, join, relative } = require('path') -const { getPackages, noop, readFile, symlink, writeFile, unlink } = require('./utils') + +const usageToReadme = require('./usage-to-readme.js') +const { getPackages, noop, symlink, writeFile, unlink } = require('./utils') const BABEL_ESLINTRC_PATH = join(__dirname, 'babel-eslintrc.js') const NPMIGNORE_PATH = join(__dirname, 'npmignore') @@ -27,10 +29,6 @@ const deleteProperties = (object, property, properties) => { deleteIfEmpty(object, property) } -const generateReadme = require('handlebars').compile( - require('fs').readFileSync(join(__dirname, 'README.md.tpl'), 'utf8') -) - const forceRelativeSymlink = async (target, path) => { await unlink(path).catch(noop) return symlink(relative(dirname(path), target), path) @@ -128,21 +126,11 @@ require('exec-promise')(() => return Promise.all([ forceRelativeSymlink(NPMIGNORE_PATH, `${dir}/.npmignore`), - readFile(`${dir}/.USAGE.md`, 'utf8') - .then(content => - writeFile( - `${dir}/README.md`, - generateReadme({ - pkg, - usage: content.trim(), - }) - ) - ) - .catch(error => { - if (error.code !== 'ENOENT') { - console.error('Error while handling README', error) - } - }), + usageToReadme(`${dir}/.USAGE.md`).catch(error => { + if (error.code !== 'ENOENT') { + console.error('Error while handling README', error) + } + }), useBabel ? forceRelativeSymlink(BABEL_ESLINTRC_PATH, `${dir}/.eslintrc.js`) : unlink(`${dir}/.eslintrc.js`), writeFile(`${dir}/package.json`, JSON.stringify(pkg, null, 2) + '\n'), useBabel || unlink(`${dir}/.babelrc.js`), diff --git a/scripts/usage-to-readme.js b/scripts/usage-to-readme.js new file mode 100755 index 0000000000..1b734ec9e2 --- /dev/null +++ b/scripts/usage-to-readme.js @@ -0,0 +1,46 @@ +#!/usr/bin/env node + +'use strict' + +const { compile } = require('handlebars') +const { dirname, join } = require('node:path') +const { readFile, writeFile } = require('node:fs/promises') +const { execFile } = require('node:child_process') + +const generateReadme = readFile(join(__dirname, 'README.md.tpl'), 'utf8').then(compile) + +async function usageToReadme(...args) { + const gitAdd = args[0] === '--git-add' + if (gitAdd) { + args.shift() + } + + const usagePath = args[0] + const dir = dirname(usagePath) + + const [usage, pkg] = await Promise.all([ + readFile(usagePath, 'utf8'), + readFile(join(dir, 'package.json')).then(JSON.parse), + ]) + + const readmePath = join(dir, 'README.md') + await writeFile(readmePath, (await generateReadme)({ pkg, usage: usage.trim() })) + + if (gitAdd) { + await new Promise((resolve, reject) => { + execFile('git', ['add', '--', readmePath]) + .on('error', reject) + .on('exit', code => { + if (code !== 0) { + reject(new Error('command exited with non-zero status code: ' + code)) + } + }) + }) + } +} + +if (module.parent !== null) { + module.exports = usageToReadme +} else { + usageToReadme(...process.argv.slice(2)) +}