Skip to content

Commit

Permalink
fix(object): handle nested keys kebab-case style (#71)
Browse files Browse the repository at this point in the history
Co-authored-by: Anthony Fu <[email protected]>
  • Loading branch information
larbish and antfu authored Jul 27, 2023
1 parent d9ef2eb commit 68ab627
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 1 deletion.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ types
*.log*
*.env*
.idea
.history
2 changes: 1 addition & 1 deletion src/proxy/_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
})
Expand Down
92 changes: 92 additions & 0 deletions test/object.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
});"
`);
});
});

0 comments on commit 68ab627

Please sign in to comment.