chore: migrate oxlint & oxfmt (#15464)

#### PR Dependency Tree


* **PR #15464** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Replaced the project’s formatting and linting workflow with Oxfmt and
Oxlint.
* Added shared formatting and linting configuration, editor integration,
and updated automated checks.
* Updated generated files, scripts, and lint guidance to use the new
tooling.

* **Style**
* Reformatted templates, source code, examples, and configuration files
for consistent readability.
  * No user-facing functionality or rendering behavior changed.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-08-10 23:51:28 +08:00
committed by GitHub
parent 749c83cd8e
commit 0c7b20dc18
292 changed files with 3372 additions and 2866 deletions
+1 -1
View File
@@ -32,10 +32,10 @@
"jsonc-parser": "^3.3.1",
"lodash-es": "^4.17.23",
"mime-types": "^3.0.0",
"oxfmt": "0.63.0",
"postcss": "^8.5.18",
"postcss-loader": "^8.2.1",
"postcss-selector-parser": "^7.1.0",
"prettier": "^3.7.4",
"source-map-loader": "^5.0.0",
"style-loader": "^4.0.0",
"swc-loader": "^0.2.6",
+17 -20
View File
@@ -7,7 +7,7 @@ import {
yarnList,
} from '@affine-tools/utils/workspace';
import { applyEdits, modify } from 'jsonc-parser';
import { type BuiltInParserName, format } from 'prettier';
import { format, type FormatConfig } from 'oxfmt';
import { Command } from './command';
@@ -22,20 +22,15 @@ export class InitCommand extends Command {
async generateWorkspaceFiles() {
this.workspace = new Workspace(yarnList());
const filesToGenerate: [
Path,
(prev: string) => string,
BuiltInParserName?,
][] = [
[this.workspace.join('tsconfig.json'), this.genProjectTsConfig, 'json'],
const filesToGenerate: [Path, (prev: string) => string][] = [
[this.workspace.join('tsconfig.json'), this.genProjectTsConfig],
[
this.workspace
.getPackage('@affine-tools/utils')
.join('src/workspace.gen.ts'),
this.genWorkspaceInfo,
'typescript',
],
[this.workspace.join('.oxlintrc.json'), this.genOxlintConfig, 'json'],
[this.workspace.join('.oxlintrc.json'), this.genOxlintConfig],
...this.workspace.packages
.filter(p => p.isTsProject)
.map(
@@ -43,27 +38,29 @@ export class InitCommand extends Command {
[
p.join('tsconfig.json'),
this.genPackageTsConfig.bind(this, p),
'json',
] as any
] satisfies [Path, (prev: string) => string]
),
];
for (const [path, content, formatter] of filesToGenerate) {
for (const [path, content] of filesToGenerate) {
this.logger.info(`Generating: ${path}`);
const previous = readFileSync(path.value, 'utf-8');
let file = content(previous);
if (formatter) {
file = await this.format(file, formatter);
}
const file = await this.format(content(previous), path.value);
writeFileSync(path.value, file);
}
}
format(content: string, parser: BuiltInParserName) {
async format(content: string, fileName: string) {
const config = JSON.parse(
readFileSync(this.workspace.join('.prettierrc').value, 'utf-8')
);
return format(content, { parser, ...config });
readFileSync(this.workspace.join('.oxfmtrc.json').value, 'utf-8')
) as FormatConfig;
const result = await format(fileName, content, config);
if (result.errors.length) {
throw new Error(
result.errors.map(error => error.codeframe ?? error.message).join('\n')
);
}
return result.code;
}
genOxlintConfig = () => {
+1 -1
View File
@@ -101,7 +101,7 @@
'MutationObserver',
];
// oxlint-disable-next-line @typescript-eslint/prefer-for-of
// oxlint-disable-next-line typescript/prefer-for-of
for (let i = 0; i < globals.length; i++) {
if (!(globals[i] in globalThis)) {
showGlobalErrorPage();
+1 -1
View File
@@ -17,7 +17,7 @@
"@types/node": "^22.0.0",
"chalk": "^5.3.0",
"lodash-es": "^4.17.23",
"prettier": "^3.7.4",
"oxfmt": "0.63.0",
"typescript": "^5.9.3"
}
}
+11 -6
View File
@@ -1,17 +1,22 @@
import { readFileSync } from 'node:fs';
import { once } from 'lodash-es';
import { type BuiltInParserName, format } from 'prettier';
import { format, type FormatConfig } from 'oxfmt';
import { ProjectRoot } from './path';
const readConfig = once(() => {
const path = ProjectRoot.join('.prettierrc').value;
const config = JSON.parse(readFileSync(path, 'utf-8'));
const path = ProjectRoot.join('.oxfmtrc.json').value;
const config = JSON.parse(readFileSync(path, 'utf-8')) as FormatConfig;
return config;
});
export function prettier(content: string, parser: BuiltInParserName) {
const config = readConfig();
return format(content, { parser, ...config });
export async function formatCode(content: string, fileName: string) {
const result = await format(fileName, content, readConfig());
if (result.errors.length) {
throw new Error(
result.errors.map(error => error.codeframe ?? error.message).join('\n')
);
}
return result.code;
}