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.
67 lines
2.6 KiB
TypeScript
67 lines
2.6 KiB
TypeScript
import { expect } from 'chai';
|
|
|
|
import { parseCommaSeparatedKeyValue, parseFeatures } from '../lib/browser/parse-features-string';
|
|
|
|
describe('feature-string parsing', () => {
|
|
it('is indifferent to whitespace around keys and values', () => {
|
|
const checkParse = (string: string, parsed: Record<string, string | boolean>) => {
|
|
const features = parseCommaSeparatedKeyValue(string);
|
|
expect(features).to.deep.equal(parsed);
|
|
};
|
|
checkParse('a=yes,c=d', { a: true, c: 'd' });
|
|
checkParse('a=yes ,c=d', { a: true, c: 'd' });
|
|
checkParse('a=yes, c=d', { a: true, c: 'd' });
|
|
checkParse('a=yes , c=d', { a: true, c: 'd' });
|
|
checkParse(' a=yes , c=d', { a: true, c: 'd' });
|
|
checkParse(' a= yes , c=d', { a: true, c: 'd' });
|
|
checkParse(' a = yes , c=d', { a: true, c: 'd' });
|
|
checkParse(' a = yes , c =d', { a: true, c: 'd' });
|
|
checkParse(' a = yes , c = d', { a: true, c: 'd' });
|
|
checkParse(' a = yes , c = d ', { a: true, c: 'd' });
|
|
});
|
|
|
|
describe('parseFeatures allowlist', () => {
|
|
it('passes through allowlisted presentational options', () => {
|
|
const { options } = parseFeatures(
|
|
'width=400,height=300,show=no,frame=no,title=hi,backgroundColor=#fff,left=10,top=20'
|
|
);
|
|
expect(options).to.deep.equal({
|
|
width: 400,
|
|
height: 300,
|
|
show: false,
|
|
frame: false,
|
|
title: 'hi',
|
|
backgroundColor: '#fff',
|
|
left: 10,
|
|
top: 20,
|
|
x: 10,
|
|
y: 20
|
|
});
|
|
});
|
|
|
|
it('drops non-allowlisted options that would be unsafe to pass to BrowserWindow', () => {
|
|
const { options } = parseFeatures('icon=/etc/passwd,width=400');
|
|
expect(options).to.deep.equal({ width: 400 });
|
|
expect(options).to.not.have.property('icon');
|
|
});
|
|
|
|
it('drops non-allowlisted options even when paired with UNC paths', () => {
|
|
const { options } = parseFeatures('icon=\\\\attacker.example\\share\\x.png,show=no');
|
|
expect(options).to.deep.equal({ show: false });
|
|
expect(options).to.not.have.property('icon');
|
|
});
|
|
|
|
it('drops unknown options', () => {
|
|
const { options } = parseFeatures('something-unknown=foo,width=400');
|
|
expect(options).to.deep.equal({ width: 400 });
|
|
expect(options).to.not.have.property('something-unknown');
|
|
});
|
|
|
|
it('still extracts allowlisted webPreferences', () => {
|
|
const { options, webPreferences } = parseFeatures('icon=/etc/passwd,nodeIntegration=no,width=400');
|
|
expect(options).to.deep.equal({ width: 400 });
|
|
expect(webPreferences).to.deep.equal({ nodeIntegration: false });
|
|
});
|
|
});
|
|
});
|