~~ quoteProps: asNeeded ~~
== should preserve quotes when necessary ==
const objectLiteral = {
    "foo bar": true,
    "foo\nbar": true,
    "1foo": true,
    "💩": true,
    "a💩": true,
    "c\d": true,
    "1": true,
    "1foo"() {},
    get "2foo"() {},
    set "2foo"(v) {},
    async "3foo"() {},
    other: 1,
};
class Class {
    "1foo"() {}
    get "1foo"() {}
    set "1foo"() {}
    async "3foo"() {}
    "4foo": string;
    "1" = true;
    other = 1;
}
interface Interface {
    "1foo": string;
    "2foo"(): string;
    get "3foo"(): string;
    set "3foo"(v: string);
    other: number;
}
type Type = {
    "1foo": string;
    "2foo"(): string;
    get "3foo"(): string;
    set "3foo"(v: string);
    other: number;
};

[expect]
const objectLiteral = {
    "foo bar": true,
    "foo\nbar": true,
    "1foo": true,
    "💩": true,
    "a💩": true,
    cd: true,
    "1": true,
    "1foo"() {},
    get "2foo"() {},
    set "2foo"(v) {},
    async "3foo"() {},
    other: 1,
};
class Class {
    "1foo"() {}
    get "1foo"() {}
    set "1foo"() {}
    async "3foo"() {}
    "4foo": string;
    "1" = true;
    other = 1;
}
interface Interface {
    "1foo": string;
    "2foo"(): string;
    get "3foo"(): string;
    set "3foo"(v: string);
    other: number;
}
type Type = {
    "1foo": string;
    "2foo"(): string;
    get "3foo"(): string;
    set "3foo"(v: string);
    other: number;
};

== should remove quotes when unnecessary ==
const objectLiteral = {
    "foo": true,
    "$": true,
    "_": true,
    "_1": true,
    'foo': true,
    '$': true,
    '_': true,
    '_1': true,
    'é': true,
    "foo"() {},
    get "foo2"() {},
    set "foo2"(v) {},
    async "foo3"() {},
    "test": "literal",
    "2notThis": false,
};
class Class {
    "foo"() {}
    get "foo2"() {}
    set "foo2"() {}
    async "foo3"() {}
    "foo4": string;
    "test": "literal" = "literal";
    "2notThis" = false;
}
interface Interface {
    "foo": string;
    "foo2"(): string;
    get "foo3"(): string;
    set "foo3"(v: string);
    "foo4": "literal";
    "2notThis": false;
}
type Type = {
    "foo": string;
    "foo2"(): string;
    get "foo3"(): string;
    set "foo3"(v: string);
    "foo4": "literal";
    "2notThis": false;
};

[expect]
const objectLiteral = {
    foo: true,
    $: true,
    _: true,
    _1: true,
    foo: true,
    $: true,
    _: true,
    _1: true,
    é: true,
    foo() {},
    get foo2() {},
    set foo2(v) {},
    async foo3() {},
    test: "literal",
    "2notThis": false,
};
class Class {
    foo() {}
    get foo2() {}
    set foo2() {}
    async foo3() {}
    "foo4": string;
    "test": "literal" = "literal";
    "2notThis" = false;
}
interface Interface {
    foo: string;
    foo2(): string;
    get foo3(): string;
    set foo3(v: string);
    foo4: "literal";
    "2notThis": false;
}
type Type = {
    foo: string;
    foo2(): string;
    get foo3(): string;
    set foo3(v: string);
    foo4: "literal";
    "2notThis": false;
};

== should keep quotes around class properties due to --strictPropertyInitialization ==
class Test {
    "prop" = true;
}

[expect]
class Test {
    "prop" = true;
}
