From 4f7167595ee8aa534a2d6a23dbcb27a8de0125ca Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 1 Dec 2020 02:58:09 +0300 Subject: [PATCH] feat: add jsonNetCamelCase as case util --- .../extensions/src/lib/utils/case.util.ts | 37 +++++++++++++++++++ .../extensions/src/tests/case.util.spec.ts | 18 +++++++++ 2 files changed, 55 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/case.util.ts create mode 100644 npm/ng-packs/packages/theme-shared/extensions/src/tests/case.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/case.util.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/case.util.ts new file mode 100644 index 0000000000..5833b82de2 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/case.util.ts @@ -0,0 +1,37 @@ +// https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Utilities/StringUtils.cs#L155 +export function jsonNetCamelCase(str: string) { + if (!str || !isUpperCase(str[0])) return str; + + const chars = str.split(''); + const { length } = chars; + + for (let i = 0; i < length; i++) { + if (i === 1 && !isUpperCase(chars[i])) break; + + const hasNext = i + 1 < length; + + if (i > 0 && hasNext && !isUpperCase(chars[i + 1])) { + if (isSeparator(chars[i + 1])) { + chars[i] = toLowerCase(chars[i]); + } + + break; + } + + chars[i] = toLowerCase(chars[i]); + } + + return chars.join(''); +} + +function isSeparator(str = '') { + return /[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]+/.test(str); +} + +function isUpperCase(str = '') { + return /[A-Z]+/.test(str); +} + +function toLowerCase(str = '') { + return str.toLowerCase(); +} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/case.util.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/case.util.spec.ts new file mode 100644 index 0000000000..db9f7b1de8 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/case.util.spec.ts @@ -0,0 +1,18 @@ +import { jsonNetCamelCase } from '../lib/utils/case.util'; + +describe('Case Utils', () => { + describe('#jsonNetCamelCase', () => { + test.each` + input | output + ${'Primary'} | ${'primary'} + ${'PrimaryRole'} | ${'primaryRole'} + ${'Primary Role'} | ${'primary Role'} + ${'PrimaryRole_Text'} | ${'primaryRole_Text'} + ${'ISBN'} | ${'isbn'} + ${''} | ${''} + ${'iMDB'} | ${'iMDB'} + `('should return $output when input is $input', ({ input, output }) => { + expect(jsonNetCamelCase(input)).toBe(output); + }); + }); +});