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.
196 lines
5.4 KiB
JavaScript
196 lines
5.4 KiB
JavaScript
const TerserPlugin = require('terser-webpack-plugin');
|
|
const webpack = require('webpack');
|
|
const WrapperPlugin = require('wrapper-webpack-plugin');
|
|
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
|
|
const electronRoot = path.resolve(__dirname, '../..');
|
|
|
|
class AccessDependenciesPlugin {
|
|
apply(compiler) {
|
|
compiler.hooks.compilation.tap('AccessDependenciesPlugin', (compilation) => {
|
|
compilation.hooks.finishModules.tap('AccessDependenciesPlugin', (modules) => {
|
|
const filePaths = modules
|
|
.map((m) => m.resource)
|
|
.filter((p) => p)
|
|
.map((p) => path.relative(electronRoot, p));
|
|
console.info(JSON.stringify(filePaths));
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = ({
|
|
alwaysHasNode,
|
|
loadElectronFromAlternateTarget,
|
|
targetDeletesNodeGlobals,
|
|
target,
|
|
wrapInitWithProfilingTimeout,
|
|
wrapInitWithTryCatch
|
|
}) => {
|
|
let entry = path.resolve(electronRoot, 'lib', target, 'init.ts');
|
|
if (!fs.existsSync(entry)) {
|
|
entry = path.resolve(electronRoot, 'lib', target, 'init.js');
|
|
}
|
|
|
|
const electronAPIFile = path.resolve(
|
|
electronRoot,
|
|
'lib',
|
|
loadElectronFromAlternateTarget || target,
|
|
'api',
|
|
'exports',
|
|
'electron.ts'
|
|
);
|
|
|
|
return (env = {}, argv = {}) => {
|
|
const onlyPrintingGraph = !!env.PRINT_WEBPACK_GRAPH;
|
|
const outputFilename = argv['output-filename'] || `${target}.bundle.js`;
|
|
|
|
const defines = {
|
|
BUILDFLAG: onlyPrintingGraph ? '(a => a)' : ''
|
|
};
|
|
|
|
if (env.buildflags) {
|
|
const flagFile = fs.readFileSync(env.buildflags, 'utf8');
|
|
for (const line of flagFile.split(/(\r\n|\r|\n)/g)) {
|
|
const flagMatch = line.match(/#define BUILDFLAG_INTERNAL_(.+?)\(\) \(([01])\)/);
|
|
if (flagMatch) {
|
|
const [, flagName, flagValue] = flagMatch;
|
|
defines[flagName] = JSON.stringify(Boolean(parseInt(flagValue, 10)));
|
|
}
|
|
}
|
|
}
|
|
|
|
const ignoredModules = [];
|
|
|
|
const plugins = [];
|
|
|
|
if (onlyPrintingGraph) {
|
|
plugins.push(new AccessDependenciesPlugin());
|
|
}
|
|
|
|
if (targetDeletesNodeGlobals) {
|
|
plugins.push(
|
|
new webpack.ProvidePlugin({
|
|
Buffer: ['@electron/internal/common/webpack-provider', 'Buffer'],
|
|
global: ['@electron/internal/common/webpack-provider', '_global'],
|
|
process: ['@electron/internal/common/webpack-provider', 'process']
|
|
})
|
|
);
|
|
}
|
|
|
|
// Webpack 5 no longer polyfills process or Buffer.
|
|
if (!alwaysHasNode) {
|
|
plugins.push(
|
|
new webpack.ProvidePlugin({
|
|
Buffer: ['buffer', 'Buffer'],
|
|
process: 'process/browser'
|
|
})
|
|
);
|
|
}
|
|
|
|
plugins.push(
|
|
new webpack.ProvidePlugin({
|
|
Promise: ['@electron/internal/common/webpack-globals-provider', 'Promise']
|
|
})
|
|
);
|
|
|
|
plugins.push(new webpack.DefinePlugin(defines));
|
|
|
|
if (wrapInitWithProfilingTimeout) {
|
|
plugins.push(
|
|
new WrapperPlugin({
|
|
header: 'function ___electron_webpack_init__() {',
|
|
footer: `
|
|
};
|
|
if ((globalThis.process || binding.process).argv.includes("--profile-electron-init")) {
|
|
setTimeout(___electron_webpack_init__, 0);
|
|
} else {
|
|
___electron_webpack_init__();
|
|
}`
|
|
})
|
|
);
|
|
}
|
|
|
|
if (wrapInitWithTryCatch) {
|
|
plugins.push(
|
|
new WrapperPlugin({
|
|
header: 'try {',
|
|
footer: `
|
|
} catch (err) {
|
|
console.error('Electron ${outputFilename} script failed to run');
|
|
console.error(err);
|
|
}`
|
|
})
|
|
);
|
|
}
|
|
|
|
return {
|
|
mode: 'development',
|
|
devtool: false,
|
|
entry,
|
|
target: alwaysHasNode ? 'node' : 'web',
|
|
output: {
|
|
filename: outputFilename
|
|
},
|
|
resolve: {
|
|
alias: {
|
|
'@electron/internal': path.resolve(electronRoot, 'lib'),
|
|
electron$: electronAPIFile,
|
|
'electron/main$': electronAPIFile,
|
|
'electron/renderer$': electronAPIFile,
|
|
'electron/common$': electronAPIFile,
|
|
'electron/utility$': electronAPIFile,
|
|
// Force timers to resolve to our own shim that doesn't use window.postMessage
|
|
timers: path.resolve(electronRoot, 'lib', 'common', 'timers-shim.ts')
|
|
},
|
|
extensions: ['.ts', '.js'],
|
|
fallback: {
|
|
// We provide our own "timers" import above, any usage of setImmediate inside
|
|
// one of our renderer bundles should import it from the 'timers' package
|
|
setImmediate: false
|
|
}
|
|
},
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: (moduleName) => !onlyPrintingGraph && ignoredModules.includes(moduleName),
|
|
loader: 'null-loader'
|
|
},
|
|
{
|
|
test: /\.ts$/,
|
|
loader: 'ts-loader',
|
|
options: {
|
|
configFile: path.resolve(electronRoot, 'tsconfig.electron.json'),
|
|
transpileOnly: onlyPrintingGraph,
|
|
ignoreDiagnostics: [
|
|
// File '{0}' is not under 'rootDir' '{1}'.
|
|
6059,
|
|
// Private field '{0}' must be declared in an enclosing class.
|
|
1111
|
|
]
|
|
}
|
|
}
|
|
]
|
|
},
|
|
node: {
|
|
__dirname: false,
|
|
__filename: false
|
|
},
|
|
optimization: {
|
|
minimize: env.mode === 'production',
|
|
minimizer: [
|
|
new TerserPlugin({
|
|
terserOptions: {
|
|
keep_classnames: true,
|
|
keep_fnames: true
|
|
}
|
|
})
|
|
]
|
|
},
|
|
plugins
|
|
};
|
|
};
|
|
};
|