diff --git a/.gitignore b/.gitignore index e9e5d20..bb9eace 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ types *.log* *.env* .idea +.history diff --git a/src/proxy/_utils.ts b/src/proxy/_utils.ts index 0132b5b..c65c800 100644 --- a/src/proxy/_utils.ts +++ b/src/proxy/_utils.ts @@ -88,7 +88,7 @@ export function literalToAst(value: any, seen = new Set()): ASTNode { Object.entries(value).map(([key, value]) => { return b.property( "init", - b.identifier(key), + /^[$A-Z_a-z][\w$]*$/g.test(key) ? b.identifier(key) : b.literal(key), literalToAst(value, seen) as any ) as any; }) diff --git a/test/object.test.ts b/test/object.test.ts index 915843b..7abc09b 100644 --- a/test/object.test.ts +++ b/test/object.test.ts @@ -135,4 +135,96 @@ export default { };" `); }); + + it("object keys camelCase style", () => { + const mod = parseModule(`export default defineAppConfig({ + test: { + foo: 1, + } + })`); + + const config = + mod.exports.default.$type === "function-call" + ? mod.exports.default.$args[0] + : mod.exports.default; + + const obj1 = { kebabCase: 1 }; + + deepMergeObject(config, obj1); + + expect(generate(mod)).toMatchInlineSnapshot(` + "export default defineAppConfig({ + test: { + foo: 1, + }, + + kebabCase: 1, + });" + `); + + const obj2 = { kebabCaseParent: { kebabCaseChild: 1 } }; + + deepMergeObject(config, obj2); + + expect(generate(mod)).toMatchInlineSnapshot(` + "export default defineAppConfig({ + test: { + foo: 1, + }, + + kebabCase: 1, + + kebabCaseParent: { + kebabCaseChild: 1, + }, + });" + `); + }); + + it("object keys kebab-case style", () => { + const mod = parseModule(`export default defineAppConfig({ + test: { + foo: 1, + } + })`); + + const config = + mod.exports.default.$type === "function-call" + ? mod.exports.default.$args[0] + : mod.exports.default; + + const obj1 = { "kebab-case": 1 }; + + deepMergeObject(config, obj1); + + // Valid + expect(generate(mod)).toMatchInlineSnapshot(` + "export default defineAppConfig({ + test: { + foo: 1, + }, + + \\"kebab-case\\": 1, + });" + `); + + const obj2 = { "kebab-case-parent": { "kebab-case-child": 1 } }; + + deepMergeObject(config, obj2); + + // TODO: Should be valid + expect(generate(mod)).toMatchInlineSnapshot(` + "export default defineAppConfig({ + test: { + foo: 1, + }, + + \\"kebab-case\\": 1, + + \\"kebab-case-parent\\": { + \\"kebab-case-child\\": 1, + }, + });" + `); + }); });