chore: watch for messages changes in dev generate script

pull/15950/head
paoloricciuti 4 months ago
parent 42e7e8168d
commit 9b1b9417ae

@ -136,7 +136,7 @@
], ],
"scripts": { "scripts": {
"build": "node scripts/process-messages && rollup -c && pnpm generate:types && node scripts/check-treeshakeability.js", "build": "node scripts/process-messages && rollup -c && pnpm generate:types && node scripts/check-treeshakeability.js",
"dev": "node scripts/process-messages && rollup -cw", "dev": "node scripts/process-messages -w & rollup -cw",
"check": "tsc --project tsconfig.runtime.json && tsc && cd ./tests/types && tsc", "check": "tsc --project tsconfig.runtime.json && tsc && cd ./tests/types && tsc",
"check:watch": "tsc --watch", "check:watch": "tsc --watch",
"generate:version": "node ./scripts/generate-version.js", "generate:version": "node ./scripts/generate-version.js",

@ -4,15 +4,27 @@ import * as acorn from 'acorn';
import { walk } from 'zimmerframe'; import { walk } from 'zimmerframe';
import * as esrap from 'esrap'; import * as esrap from 'esrap';
/** @type {Record<string, Record<string, { messages: string[], details: string | null }>>} */
const messages = {};
const seen = new Set();
const DIR = '../../documentation/docs/98-reference/.generated'; const DIR = '../../documentation/docs/98-reference/.generated';
fs.rmSync(DIR, { force: true, recursive: true });
fs.mkdirSync(DIR);
for (const category of fs.readdirSync('messages')) { // eslint-disable-next-line n/prefer-global/process
const [, , watch_flag] = process.argv;
const watch = watch_flag === '-w';
/**
* @type {((value?: any) => void) | undefined}
*/
let resolve_writing_promise;
async function run() {
/** @type {Record<string, Record<string, { messages: string[], details: string | null }>>} */
const messages = {};
const seen = new Set();
fs.rmSync(DIR, { force: true, recursive: true });
fs.mkdirSync(DIR);
for (const category of fs.readdirSync('messages')) {
if (category.startsWith('.')) continue; if (category.startsWith('.')) continue;
messages[category] = {}; messages[category] = {};
@ -54,10 +66,19 @@ for (const category of fs.readdirSync('messages')) {
} }
sorted.sort((a, b) => (a.code < b.code ? -1 : 1)); sorted.sort((a, b) => (a.code < b.code ? -1 : 1));
const writing_promise = watch
? new Promise((resolve) => {
resolve_writing_promise = resolve;
})
: Promise.resolve();
fs.writeFileSync( fs.writeFileSync(
`messages/${category}/${file}`, `messages/${category}/${file}`,
sorted.map((x) => x._.trim()).join('\n\n') + '\n' sorted.map((x) => x._.trim()).join('\n\n') + '\n'
); );
await writing_promise;
} }
fs.writeFileSync( fs.writeFileSync(
@ -65,7 +86,10 @@ for (const category of fs.readdirSync('messages')) {
'<!-- This file is generated by scripts/process-messages/index.js. Do not edit! -->\n\n' + '<!-- This file is generated by scripts/process-messages/index.js. Do not edit! -->\n\n' +
Object.entries(messages[category]) Object.entries(messages[category])
.map(([code, { messages, details }]) => { .map(([code, { messages, details }]) => {
const chunks = [`### ${code}`, ...messages.map((message) => '```\n' + message + '\n```')]; const chunks = [
`### ${code}`,
...messages.map((message) => '```\n' + message + '\n```')
];
if (details) { if (details) {
chunks.push(details); chunks.push(details);
@ -77,13 +101,13 @@ for (const category of fs.readdirSync('messages')) {
.join('\n\n') + .join('\n\n') +
'\n' '\n'
); );
} }
/** /**
* @param {string} name * @param {string} name
* @param {string} dest * @param {string} dest
*/ */
function transform(name, dest) { function transform(name, dest) {
const source = fs const source = fs
.readFileSync(new URL(`./templates/${name}.js`, import.meta.url), 'utf-8') .readFileSync(new URL(`./templates/${name}.js`, import.meta.url), 'utf-8')
.replace(/\r\n/g, '\n'); .replace(/\r\n/g, '\n');
@ -397,13 +421,29 @@ function transform(name, dest) {
module.code, module.code,
'utf-8' 'utf-8'
); );
}
transform('compile-errors', 'src/compiler/errors.js');
transform('compile-warnings', 'src/compiler/warnings.js');
transform('client-warnings', 'src/internal/client/warnings.js');
transform('client-errors', 'src/internal/client/errors.js');
transform('server-errors', 'src/internal/server/errors.js');
transform('shared-errors', 'src/internal/shared/errors.js');
transform('shared-warnings', 'src/internal/shared/warnings.js');
} }
transform('compile-errors', 'src/compiler/errors.js'); if (watch) {
transform('compile-warnings', 'src/compiler/warnings.js'); fs.watch('messages', { recursive: true }, () => {
if (resolve_writing_promise) {
resolve_writing_promise();
resolve_writing_promise = undefined;
return;
}
// eslint-disable-next-line no-console
console.log('Regenerating messages...');
run();
});
}
transform('client-warnings', 'src/internal/client/warnings.js'); await run();
transform('client-errors', 'src/internal/client/errors.js');
transform('server-errors', 'src/internal/server/errors.js');
transform('shared-errors', 'src/internal/shared/errors.js');
transform('shared-warnings', 'src/internal/shared/warnings.js');

Loading…
Cancel
Save