diff --git a/index.d.ts b/index.d.ts index 8548302..7c7e59d 100644 --- a/index.d.ts +++ b/index.d.ts @@ -13,6 +13,13 @@ declare namespace camelcaseKeys { @default [] */ readonly exclude?: ReadonlyArray; + + /** + Uppercase the first character as in `bye-bye` → `ByeBye`. + + @default false + */ + readonly pascalCase?: boolean; } } @@ -36,6 +43,9 @@ camelcaseKeys([{'foo-bar': true}, {'bar-foo': false}]); camelcaseKeys({'foo-bar': true, nested: {unicorn_rainbow: true}}, {deep: true}); //=> {fooBar: true, nested: {unicornRainbow: true}} +// Convert object keys to pascal case +camelcaseKeys({'foo-bar': true, nested: {unicorn_rainbow: true}}, {deep: true, pascalCase: true}); +//=> {FooBar: true, Nested: {UnicornRainbow: true}} import minimist = require('minimist'); diff --git a/index.js b/index.js index b0536da..2e5f7d5 100644 --- a/index.js +++ b/index.js @@ -9,17 +9,18 @@ const cache = new QuickLru({maxSize: 100000}); const camelCaseConvert = (input, options) => { options = { deep: false, + pascalCase: false, ...options }; - const {exclude} = options; + const {exclude, pascalCase} = options; return mapObj(input, (key, value) => { if (!(exclude && has(exclude, key))) { if (cache.has(key)) { key = cache.get(key); } else { - const ret = camelCase(key); + const ret = camelCase(key, {pascalCase}); if (key.length < 100) { // Prevent abuse cache.set(key, ret); diff --git a/index.test-d.ts b/index.test-d.ts index 5d652ed..6b3005d 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -6,6 +6,9 @@ expectType<{[key: string]: unknown}>(camelcaseKeys({'foo-bar': true})); expectType<{[key: string]: unknown}>( camelcaseKeys({'foo-bar': true}, {deep: true}) ); +expectType<{[key: string]: unknown}>( + camelcaseKeys({'foo-bar': true}, {deep: true, pascalCase: true}) +); expectType<{[key: string]: unknown}>( camelcaseKeys({'foo-bar': true}, {exclude: ['foo', /bar/]}) ); diff --git a/readme.md b/readme.md index f98162c..378b9e8 100644 --- a/readme.md +++ b/readme.md @@ -25,6 +25,10 @@ camelcaseKeys([{'foo-bar': true}, {'bar-foo': false}]); camelcaseKeys({'foo-bar': true, nested: {unicorn_rainbow: true}}, {deep: true}); //=> {fooBar: true, nested: {unicornRainbow: true}} + +// Convert object keys to pascal case +camelcaseKeys({'foo-bar': true, nested: {unicorn_rainbow: true}}, {deep: true, pascalCase: true}); +//=> {FooBar: true, Nested: {UnicornRainbow: true}} ``` ```js @@ -66,6 +70,13 @@ Default: `false` Recurse nested objects and objects in arrays. +##### pascalCase + +Type: `boolean`
+Default: `false` + +Uppercase the first character as in `bye-bye` → `ByeBye`. + ## Related diff --git a/test.js b/test.js index 4c9d74f..b2a2bf0 100644 --- a/test.js +++ b/test.js @@ -18,6 +18,18 @@ test('deep option', t => { ); }); +test('pascalCase option only', t => { + t.true(camelcaseKeys({'new-foo-bar': true}, {pascalCase: true}).NewFooBar); +}); + +test('pascalCase and deep options', t => { + t.deepEqual( + // eslint-disable-next-line camelcase + camelcaseKeys({p_foo_bar: true, p_obj: {p_two: false, p_arr: [{p_three_four: true}]}}, {deep: true, pascalCase: true}), + {PFooBar: true, PObj: {PTwo: false, PArr: [{PThreeFour: true}]}} + ); +}); + test('handles nested arrays', t => { t.deepEqual( // eslint-disable-next-line camelcase