diff --git a/apps/oxfmt/src/core/config.rs b/apps/oxfmt/src/core/config.rs index 77c9792d4a515..dac0062ca6ee3 100644 --- a/apps/oxfmt/src/core/config.rs +++ b/apps/oxfmt/src/core/config.rs @@ -64,7 +64,7 @@ pub enum ResolvedOptions { #[cfg(feature = "napi")] ExternalFormatterPackageJson { external_options: Value, - sort_package_json: bool, + sort_package_json: Option, insert_final_newline: bool, }, } @@ -194,7 +194,7 @@ impl ConfigResolver { .expect("`build_and_validate()` must be called before `resolve()`") }; - let insert_final_newline = oxfmt_options.insert_final_newline; + let OxfmtOptions { sort_package_json, insert_final_newline, .. } = oxfmt_options; match strategy { FormatFileStrategy::OxcFormatter { .. } => ResolvedOptions::OxcFormatter { @@ -214,7 +214,7 @@ impl ConfigResolver { FormatFileStrategy::ExternalFormatterPackageJson { .. } => { ResolvedOptions::ExternalFormatterPackageJson { external_options, - sort_package_json: oxfmt_options.sort_package_json.is_some(), + sort_package_json, insert_final_newline, } } diff --git a/apps/oxfmt/src/core/format.rs b/apps/oxfmt/src/core/format.rs index 36f7cab529a88..05185ef0d2220 100644 --- a/apps/oxfmt/src/core/format.rs +++ b/apps/oxfmt/src/core/format.rs @@ -92,7 +92,7 @@ impl SourceFormatter { path, parser_name, external_options, - sort_package_json, + sort_package_json.as_ref(), ), insert_final_newline, ), @@ -221,12 +221,11 @@ impl SourceFormatter { path: &Path, parser_name: &str, external_options: Value, - sort_package_json: bool, + sort_options: Option<&sort_package_json::SortOptions>, ) -> Result { - let source_text: Cow<'_, str> = if sort_package_json { - let options = sort_package_json::SortOptions { sort_scripts: false, pretty: false }; + let source_text: Cow<'_, str> = if let Some(options) = sort_options { Cow::Owned( - sort_package_json::sort_package_json_with_options(source_text, &options).map_err( + sort_package_json::sort_package_json_with_options(source_text, options).map_err( |err| { OxcDiagnostic::error(format!( "Failed to sort package.json: {}\n{err}", diff --git a/apps/oxfmt/test/__snapshots__/sort_package_json.test.ts.snap b/apps/oxfmt/test/__snapshots__/sort_package_json.test.ts.snap new file mode 100644 index 0000000000000..46a07866dd855 --- /dev/null +++ b/apps/oxfmt/test/__snapshots__/sort_package_json.test.ts.snap @@ -0,0 +1,127 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`sort_package_json > should not sort package.json when disabled 1`] = ` +"--- FILE ----------- +package.json +--- BEFORE --------- +{ + "scripts": { + "test": "vitest", + "build": "tsc", + "dev": "vite" + }, + "name": "fixture", + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + }, + "version": "1.0.0", + "dependencies": { + "react": "18.0.0" + } +} + +--- AFTER ---------- +{ + "scripts": { + "test": "vitest", + "build": "tsc", + "dev": "vite" + }, + "name": "fixture", + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + }, + "version": "1.0.0", + "dependencies": { + "react": "18.0.0" + } +} + +--------------------" +`; + +exports[`sort_package_json > should sort package.json by default 1`] = ` +"--- FILE ----------- +package.json +--- BEFORE --------- +{ + "scripts": { + "test": "vitest", + "build": "tsc", + "dev": "vite" + }, + "name": "fixture", + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + }, + "version": "1.0.0", + "dependencies": { + "react": "18.0.0" + } +} + +--- AFTER ---------- +{ + "name": "fixture", + "version": "1.0.0", + "scripts": { + "test": "vitest", + "build": "tsc", + "dev": "vite" + }, + "dependencies": { + "react": "18.0.0" + }, + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + } +} + +--------------------" +`; + +exports[`sort_package_json > should sort scripts when sortScripts is enabled 1`] = ` +"--- FILE ----------- +package.json +--- BEFORE --------- +{ + "scripts": { + "test": "vitest", + "build": "tsc", + "dev": "vite" + }, + "name": "fixture", + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + }, + "version": "1.0.0", + "dependencies": { + "react": "18.0.0" + } +} + +--- AFTER ---------- +{ + "name": "fixture", + "version": "1.0.0", + "scripts": { + "build": "tsc", + "dev": "vite", + "test": "vitest" + }, + "dependencies": { + "react": "18.0.0" + }, + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + } +} + +--------------------" +`; diff --git a/apps/oxfmt/test/fixtures/sort_package_json/disabled.json b/apps/oxfmt/test/fixtures/sort_package_json/disabled.json new file mode 100644 index 0000000000000..cc572db9324a1 --- /dev/null +++ b/apps/oxfmt/test/fixtures/sort_package_json/disabled.json @@ -0,0 +1,3 @@ +{ + "experimentalSortPackageJson": false +} diff --git a/apps/oxfmt/test/fixtures/sort_package_json/package.json b/apps/oxfmt/test/fixtures/sort_package_json/package.json new file mode 100644 index 0000000000000..46c02fc11f53c --- /dev/null +++ b/apps/oxfmt/test/fixtures/sort_package_json/package.json @@ -0,0 +1,16 @@ +{ + "scripts": { + "test": "vitest", + "build": "tsc", + "dev": "vite" + }, + "name": "fixture", + "devDependencies": { + "typescript": "5.0.0", + "vitest": "1.0.0" + }, + "version": "1.0.0", + "dependencies": { + "react": "18.0.0" + } +} diff --git a/apps/oxfmt/test/fixtures/sort_package_json/sort_scripts.json b/apps/oxfmt/test/fixtures/sort_package_json/sort_scripts.json new file mode 100644 index 0000000000000..db5c60534b71a --- /dev/null +++ b/apps/oxfmt/test/fixtures/sort_package_json/sort_scripts.json @@ -0,0 +1,5 @@ +{ + "experimentalSortPackageJson": { + "sortScripts": true + } +} diff --git a/apps/oxfmt/test/sort_package_json.test.ts b/apps/oxfmt/test/sort_package_json.test.ts new file mode 100644 index 0000000000000..4d3a5d8e944ae --- /dev/null +++ b/apps/oxfmt/test/sort_package_json.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from "vitest"; +import { join } from "node:path"; +import { runWriteModeAndSnapshot } from "./utils"; + +const fixtureDir = join(__dirname, "fixtures", "sort_package_json"); + +describe("sort_package_json", () => { + it("should sort package.json by default", async () => { + const snapshot = await runWriteModeAndSnapshot(fixtureDir, ["package.json"]); + expect(snapshot).toMatchSnapshot(); + }); + + it("should not sort package.json when disabled", async () => { + const snapshot = await runWriteModeAndSnapshot( + fixtureDir, + ["package.json"], + ["-c", "disabled.json"], + ); + expect(snapshot).toMatchSnapshot(); + }); + + it("should sort scripts when sortScripts is enabled", async () => { + const snapshot = await runWriteModeAndSnapshot( + fixtureDir, + ["package.json"], + ["-c", "sort_scripts.json"], + ); + expect(snapshot).toMatchSnapshot(); + }); +});