mirror of
https://github.com/electron/electron.git
synced 2026-05-02 03:00:22 -04:00
* build: add oxfmt for code formatting and import sorting
Adds oxfmt as a devDependency alongside oxlint and wires it into the
lint pipeline. The .oxfmtrc.json config matches Electron's current JS
style (single quotes, semicolons, 2-space indent, trailing commas off,
printWidth 100) and configures sortImports with custom groups that
mirror the import/order pathGroups previously enforced by ESLint:
@electron/internal, @electron/*, and {electron,electron/**} each get
their own ordered group ahead of external modules.
- `yarn lint:fmt` runs `oxfmt --check` over JS/TS sources and is
chained into `yarn lint` so CI enforces it automatically.
- `yarn format` runs `oxfmt --write` for local fix-up.
- lint-staged invokes `oxfmt --write` on staged .js/.ts/.mjs/.cjs
files before oxlint, so formatting is applied at commit time.
The next commit applies the formatter to the existing codebase so the
check actually passes.
* chore: apply oxfmt formatting to JS and TS sources
Runs `yarn format` across lib/, spec/, script/, build/, default_app/,
and npm/ to bring the codebase in line with the .oxfmtrc.json settings
added in the previous commit. This is a pure formatting pass: import
statements are sorted into the groups defined by the config, method
chains longer than printWidth are broken, single-quoted strings
containing apostrophes are switched to double quotes, and a handful of
single-statement `if` bodies are re-wrapped and get braces added by
`oxlint --fix` to satisfy the `curly: multi-line` rule.
No behavior changes.
83 lines
2.6 KiB
JavaScript
83 lines
2.6 KiB
JavaScript
const chalk = require('chalk');
|
|
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
|
|
const check = process.argv.includes('--check');
|
|
|
|
function findAllHeaders(basePath) {
|
|
const allFiles = fs.readdirSync(basePath);
|
|
allFiles.sort();
|
|
const toReturn = [];
|
|
for (const file of allFiles) {
|
|
const absPath = path.resolve(basePath, file);
|
|
if (fs.statSync(absPath).isDirectory()) {
|
|
toReturn.push(...findAllHeaders(absPath));
|
|
} else {
|
|
toReturn.push(absPath);
|
|
}
|
|
}
|
|
return toReturn;
|
|
}
|
|
|
|
const diff = (array1, array2) => {
|
|
const set1 = new Set(array1);
|
|
const set2 = new Set(array2);
|
|
|
|
const added = array1.filter((item) => !set2.has(item));
|
|
const removed = array2.filter((item) => !set1.has(item));
|
|
|
|
console.log(chalk.white.bgGreen.bold('Files Added:'));
|
|
added.forEach((item) => console.log(chalk.green.bold(`+ ${item}`)));
|
|
|
|
console.log(chalk.white.bgRed.bold('Files Removed:'));
|
|
removed.forEach((item) => console.log(chalk.red.bold(`- ${item}`)));
|
|
};
|
|
|
|
const parseHeaders = (name, content) => {
|
|
const pattern = new RegExp(`${name}_headers\\s*=\\s*\\[(.*?)\\]`, 's');
|
|
const headers = content.match(pattern);
|
|
if (!headers) return [];
|
|
return headers[1]
|
|
.split(',')
|
|
.map((item) => item.trim().replace(/"/g, ''))
|
|
.filter((item) => item.length > 0);
|
|
};
|
|
|
|
for (const folder of ['libc++', 'libc++abi']) {
|
|
const prettyName = folder.replace(/\+/g, 'x');
|
|
|
|
const libcxxIncludeDir = path.resolve(__dirname, '..', '..', 'third_party', folder, 'src', 'include');
|
|
const gclientPath = `third_party/${folder}/src/include`;
|
|
|
|
const headers = findAllHeaders(libcxxIncludeDir).map((absPath) =>
|
|
path.relative(path.resolve(__dirname, '../..', gclientPath), absPath).replaceAll('\\', '/')
|
|
);
|
|
|
|
const newHeaders = headers.map((f) => `//${path.posix.join(gclientPath, f)}`);
|
|
const content = `${prettyName}_headers = [
|
|
${newHeaders.map((h) => `"${h}"`).join(',\n ')},
|
|
]
|
|
|
|
${prettyName}_licenses = [ "//third_party/${folder}/src/LICENSE.TXT" ]
|
|
`;
|
|
|
|
const file = `filenames.${prettyName}.gni`;
|
|
const filenamesPath = path.resolve(__dirname, '..', file);
|
|
|
|
if (check) {
|
|
const currentContent = fs.readFileSync(filenamesPath, 'utf8');
|
|
if (currentContent !== content) {
|
|
const currentHeaders = parseHeaders(prettyName, currentContent);
|
|
|
|
console.error(chalk.bold(`${file} contents are not up to date:\n`));
|
|
diff(currentHeaders, newHeaders);
|
|
console.error(chalk.bold(`\nRun node script/gen-libc++-filenames.js to regenerate ${file}`));
|
|
process.exit(1);
|
|
}
|
|
} else {
|
|
console.log(filenamesPath);
|
|
fs.writeFileSync(filenamesPath, content);
|
|
}
|
|
}
|