mirror of
https://github.com/oven-sh/bun
synced 2026-02-10 02:48:50 +00:00
## Summary - Adds `Bun.JSON5.parse()` and `Bun.JSON5.stringify()` as built-in APIs - Adds `.json5` file support in the module resolver and bundler - Parser uses a scanner/parser split architecture with a labeled switch pattern (like the YAML parser) — the scanner produces typed tokens, the parser never touches source bytes directly - 430+ tests covering the official JSON5 test suite, escape sequences, numbers, comments, whitespace (including all Unicode whitespace types), unquoted/reserved-word keys, unicode identifiers, deeply nested structures, garbage input, error messages, and stringify behavior <img width="659" height="610" alt="Screenshot 2026-01-25 at 12 19 57 AM" src="https://github.com/user-attachments/assets/e300125a-f197-4cad-90ed-e867b6232a01" /> ## Test plan - [x] `bun bd test test/js/bun/json5/json5.test.ts` — 317 tests - [x] `bun bd test test/js/bun/json5/json5-test-suite.test.ts` — 113 tests from the official JSON5 test suite - [x] `bun bd test test/js/bun/resolve/json5/json5.test.js` — .json5 module resolution closes #3175 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
64 lines
1.3 KiB
JavaScript
64 lines
1.3 KiB
JavaScript
import { expect, it } from "bun:test";
|
|
import emptyJson5 from "./json5-empty.json5";
|
|
import json5FromCustomTypeAttribute from "./json5-fixture.json5.txt" with { type: "json5" };
|
|
|
|
const expectedJson5Fixture = {
|
|
framework: "next",
|
|
bundle: {
|
|
packages: {
|
|
"@emotion/react": true,
|
|
},
|
|
},
|
|
array: [
|
|
{
|
|
entry_one: "one",
|
|
entry_two: "two",
|
|
},
|
|
{
|
|
entry_one: "three",
|
|
nested: [
|
|
{
|
|
entry_one: "four",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
dev: {
|
|
one: {
|
|
two: {
|
|
three: 4,
|
|
},
|
|
},
|
|
foo: 123,
|
|
"foo.bar": "baz",
|
|
},
|
|
};
|
|
|
|
const expectedSmallFixture = {
|
|
framework: "next",
|
|
bundle: {
|
|
packages: {
|
|
"@emotion/react": true,
|
|
},
|
|
},
|
|
};
|
|
|
|
it("via dynamic import", async () => {
|
|
const json5 = (await import("./json5-fixture.json5")).default;
|
|
expect(json5).toEqual(expectedJson5Fixture);
|
|
});
|
|
|
|
it("via import type json5", () => {
|
|
expect(json5FromCustomTypeAttribute).toEqual(expectedSmallFixture);
|
|
});
|
|
|
|
it("via dynamic import with type attribute", async () => {
|
|
delete require.cache[require.resolve("./json5-fixture.json5.txt")];
|
|
const json5 = (await import("./json5-fixture.json5.txt", { with: { type: "json5" } })).default;
|
|
expect(json5).toEqual(expectedSmallFixture);
|
|
});
|
|
|
|
it("null value via import statement", () => {
|
|
expect(emptyJson5).toBe(null);
|
|
});
|