diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts index 40eaffd8a1..c1a2ead186 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts @@ -11,6 +11,7 @@ export * from './string/generate-umbraco-alias.function.js'; export * from './string/increment-string.function.js'; export * from './string/split-string-to-array.js'; export * from './type/diff.type.js'; +export * from './to-camel-case/to-camel-case.js'; declare global { interface Window { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/to-camel-case/to-camel-case.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/to-camel-case/to-camel-case.test.ts new file mode 100644 index 0000000000..4b68bff738 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/to-camel-case/to-camel-case.test.ts @@ -0,0 +1,72 @@ +import { expect } from '@open-wc/testing'; +import { toCamelCase } from './to-camel-case.js'; + +describe('to-camel-case', () => { + /* All tests have been run against the the lodash camelCase function, + to ensure that the toCamelCase function behaves the same way as the lodash camelCase function. */ + it('converts string to camelCase', () => { + expect(toCamelCase('to-camel-case')).to.equal('toCamelCase'); + expect(toCamelCase('b2b_registration_request')).to.equal('b2BRegistrationRequest'); + expect(toCamelCase('b2b_registration_b2b_request')).to.equal('b2BRegistrationB2BRequest'); + expect(toCamelCase('foo')).to.equal('foo'); + expect(toCamelCase('IDs')).to.equal('iDs'); + expect(toCamelCase('FooIDs')).to.equal('fooIDs'); + expect(toCamelCase('foo-bar')).to.equal('fooBar'); + expect(toCamelCase('foo-bar-baz')).to.equal('fooBarBaz'); + expect(toCamelCase('foo--bar')).to.equal('fooBar'); + expect(toCamelCase('--foo-bar')).to.equal('fooBar'); + expect(toCamelCase('FOO-BAR')).to.equal('fooBar'); + expect(toCamelCase('-foo-bar-')).to.equal('fooBar'); + expect(toCamelCase('--foo--bar--')).to.equal('fooBar'); + expect(toCamelCase('foo.bar')).to.equal('fooBar'); + expect(toCamelCase('foo..bar')).to.equal('fooBar'); + expect(toCamelCase('..foo..bar..')).to.equal('fooBar'); + expect(toCamelCase('foo_bar')).to.equal('fooBar'); + expect(toCamelCase('__foo__bar__')).to.equal('fooBar'); + expect(toCamelCase('foo bar')).to.equal('fooBar'); + expect(toCamelCase(' foo bar ')).to.equal('fooBar'); + expect(toCamelCase('fooBar')).to.equal('fooBar'); + expect(toCamelCase('fooBar-baz')).to.equal('fooBarBaz'); + expect(toCamelCase('fooBarBaz-bazzy')).to.equal('fooBarBazBazzy'); + expect(toCamelCase('FBBazzy')).to.equal('fbBazzy'); + expect(toCamelCase('F')).to.equal('f'); + expect(toCamelCase('Foo')).to.equal('foo'); + expect(toCamelCase('FOO')).to.equal('foo'); + expect(toCamelCase('FooBar')).to.equal('fooBar'); + expect(toCamelCase('Foo')).to.equal('foo'); + expect(toCamelCase('FOO')).to.equal('foo'); + expect(toCamelCase('XMLHttpRequest')).to.equal('xmlHttpRequest'); + expect(toCamelCase('AjaxXMLHttpRequest')).to.equal('ajaxXmlHttpRequest'); + expect(toCamelCase('Ajax-XMLHttpRequest')).to.equal('ajaxXmlHttpRequest'); + expect(toCamelCase('mGridCol6')).to.equal('mGridCol6'); + expect(toCamelCase('Hello1World')).to.equal('hello1World'); + expect(toCamelCase('Hello11World')).to.equal('hello11World'); + expect(toCamelCase('hello1world')).to.equal('hello1World'); + expect(toCamelCase('Hello1World11foo')).to.equal('hello1World11Foo'); + expect(toCamelCase('Hello1')).to.equal('hello1'); + expect(toCamelCase('hello1')).to.equal('hello1'); + expect(toCamelCase('1Hello')).to.equal('1Hello'); + expect(toCamelCase('1hello')).to.equal('1Hello'); + expect(toCamelCase('1hello')).to.equal('1Hello'); + expect(toCamelCase('h2w')).to.equal('h2W'); + }); + + it('ignores special characters', () => { + expect(toCamelCase('-')).to.equal(''); + expect(toCamelCase(' - ')).to.equal(''); + expect(toCamelCase('--')).to.equal(''); + expect(toCamelCase('')).to.equal(''); + expect(toCamelCase(' ')).to.equal(''); + expect(toCamelCase('_')).to.equal(''); + expect(toCamelCase('.')).to.equal(''); + expect(toCamelCase('..')).to.equal(''); + expect(toCamelCase(' ')).to.equal(''); + expect(toCamelCase('__')).to.equal(''); + expect(toCamelCase('--__--_--_')).to.equal(''); + expect(toCamelCase('A::a')).to.equal('aA'); + expect(toCamelCase('foo bar?')).to.equal('fooBar'); + expect(toCamelCase('foo bar!')).to.equal('fooBar'); + expect(toCamelCase('foo bar$')).to.equal('fooBar'); + expect(toCamelCase('foo bar#')).to.equal('fooBar'); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/to-camel-case/to-camel-case.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/to-camel-case/to-camel-case.ts new file mode 100644 index 0000000000..ed09da840c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/to-camel-case/to-camel-case.ts @@ -0,0 +1,7 @@ +export const toCamelCase = (str: string) => { + const s = str + .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) + ?.map((x: string) => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) + .join(''); + return (s && s.slice(0, 1).toLowerCase() + s.slice(1)) || ''; +};