From e933dfbff2c7210faa419164878be4b6717bf668 Mon Sep 17 00:00:00 2001 From: Wouter Heirstrate <56075460+WHeirstrate@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:01:32 +0200 Subject: [PATCH 1/2] feat(pascal-case): add pascalCase as alias to camelCase and fix camelCase helper split logic (#450) Co-authored-by: Wouter Heirstrate --- .../javascript/utils/introduction/index.md | 4 +++ .../utils/string/camelCaseToSentence/index.md | 2 +- .../string/pascalCaseToSentence/index.md | 15 ++++++++++ .../pascalCaseToSentence/ng-doc.page.ts | 11 ++++++++ .../camel-case-to-sentence.util.md | 4 +-- .../camel-case-to-sentence.util.spec.ts | 8 ++++++ .../camel-case-to-sentence.util.ts | 17 +++++++---- .../pascal-case-to-sentence.util.md | 13 +++++++++ .../pascal-case-to-sentence.util.spec.ts | 28 +++++++++++++++++++ .../pascal-case-to-sentence.util.ts | 16 +++++++++++ 10 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/index.md create mode 100644 apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/ng-doc.page.ts create mode 100644 libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.md create mode 100644 libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.spec.ts create mode 100644 libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.ts diff --git a/apps/docs/src/app/pages/docs/javascript/utils/introduction/index.md b/apps/docs/src/app/pages/docs/javascript/utils/introduction/index.md index 8f62de08..64e8bde7 100644 --- a/apps/docs/src/app/pages/docs/javascript/utils/introduction/index.md +++ b/apps/docs/src/app/pages/docs/javascript/utils/introduction/index.md @@ -30,6 +30,10 @@ Converts a camelCase string to a human-readable sentence. Replace all special characters to their normal counterparts. +### `*pascalCaseToSentencePage` + +Converts a PascalCase string to a human-readable sentence. + ### `*replaceHtmlWhitespacePage` Returns the filtered html as a string that has replaced the non-breakable whitespaces with regular spaces. diff --git a/apps/docs/src/app/pages/docs/javascript/utils/string/camelCaseToSentence/index.md b/apps/docs/src/app/pages/docs/javascript/utils/string/camelCaseToSentence/index.md index 2fb3aaa0..3052a7cd 100644 --- a/apps/docs/src/app/pages/docs/javascript/utils/string/camelCaseToSentence/index.md +++ b/apps/docs/src/app/pages/docs/javascript/utils/string/camelCaseToSentence/index.md @@ -9,7 +9,7 @@ The camelCaseToSentence helper converts a camelCase string to a human-readable s ```typescript import { camelCaseToSentence } from '@studiohyperdrive/utils'; -const result = camelCaseToSentence('SubscribeForMore'); +const result = camelCaseToSentence('subscribeForMore'); // result = 'Subscribe for more' ``` diff --git a/apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/index.md b/apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/index.md new file mode 100644 index 00000000..0e703222 --- /dev/null +++ b/apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/index.md @@ -0,0 +1,15 @@ +--- +keyword: pascalCaseToSentencePage +--- + +The pascalCaseToSentence helper converts a PascalCase string to a human-readable sentence. + +## How to use + +```typescript +import { pascalCaseToSentence } from '@studiohyperdrive/utils'; + +const result = pascalCaseToSentence('SubscribeForMore'); + +// result = 'Subscribe for more' +``` diff --git a/apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/ng-doc.page.ts b/apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/ng-doc.page.ts new file mode 100644 index 00000000..c513a9cc --- /dev/null +++ b/apps/docs/src/app/pages/docs/javascript/utils/string/pascalCaseToSentence/ng-doc.page.ts @@ -0,0 +1,11 @@ +import { NgDocPage } from '@ng-doc/core'; +import { StringCategory } from '../../../../../../categories/javascript'; + +const pascalCaseToSentencePage: NgDocPage = { + title: `pascalCaseToSentence`, + mdFile: './index.md', + category: StringCategory, + order: 0, +}; + +export default pascalCaseToSentencePage; diff --git a/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.md b/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.md index d7dc899d..b662efa9 100644 --- a/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.md +++ b/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.md @@ -1,13 +1,13 @@ # camelCaseToSentence -The camelCaseToSentence helper converts a camelCase string to a human-readable sentence. +The camelCaseToSentence helper converts a camelCase string to a human-readable sentence. The first letter will be uppercase, while the rest of the string will be lowercase. ## How to use ```typescript import { camelCaseToSentence } from '@studiohyperdrive/utils'; -const result = camelCaseToSentence('SubscribeForMore'); +const result = camelCaseToSentence('subscribeForMore'); // result = 'Subscribe for more' ``` diff --git a/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.spec.ts b/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.spec.ts index 6b1c0d49..480dd55c 100644 --- a/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.spec.ts +++ b/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.spec.ts @@ -3,6 +3,14 @@ import { camelCaseToSentence } from './camel-case-to-sentence.util'; /* eslint-disable @typescript-eslint/no-explicit-any */ describe('camelCaseToSentence', () => { it('should convert a camelCase string to a sentence', () => { + expect(camelCaseToSentence('subscribeForMore')).toEqual('Subscribe for more'); + expect(camelCaseToSentence('string')).toEqual('String'); + expect(camelCaseToSentence('someExtraLongDescription')).toEqual( + 'Some extra long description' + ); + }); + + it('should also convert a PascalCase string to a sentence', () => { expect(camelCaseToSentence('SubscribeForMore')).toEqual('Subscribe for more'); }); diff --git a/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.ts b/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.ts index c123de7a..679e107f 100644 --- a/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.ts +++ b/libs/javascript/utils/src/lib/string/camel-case-to-sentence/camel-case-to-sentence.util.ts @@ -1,9 +1,14 @@ /** - * Converts a camelCase string to a human-readable sentence + * Converts a camelCase string to a human-readable sentence. * * @param value - The provided value + * + * @example + * camelCaseToSentence('awesomeUtils') // 'Awesome utils' + * + * @returns A human-readable sentence derived from the camelCase string. The first + * letter will be uppercase, while the rest of the string will be lowercase. */ - export const camelCaseToSentence = (value: string): string => { // Iben: Early exit if no (string) value was provided if (!value || typeof value !== 'string') { @@ -13,10 +18,12 @@ export const camelCaseToSentence = (value: string): string => { return ( value // Iben: Split by uppercase - .match(/[A-Z][a-z]+/g) - // Iben: Lowercase all but the first word + .split(/(?=[A-Z])/) + // Iben: Lowercase all but the first letter of the first word .map((value, index) => { - return index === 0 ? value : value.toLowerCase(); + return index === 0 + ? value[0].toUpperCase() + value.slice(1).toLowerCase() + : value.toLowerCase(); }) // Iben: Join back to a string .join(' ') diff --git a/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.md b/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.md new file mode 100644 index 00000000..9e9f7fff --- /dev/null +++ b/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.md @@ -0,0 +1,13 @@ +# camelCaseToSentence + +The pascalCaseToSentence helper converts a PascalCase string to a human-readable sentence. The first letter will be uppercase, while the rest of the string will be lowercase. + +## How to use + +```typescript +import { pascalCaseToSentence } from '@studiohyperdrive/utils'; + +const result = pascalCaseToSentence('SubscribeForMore'); + +// result = 'Subscribe for more' +``` diff --git a/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.spec.ts b/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.spec.ts new file mode 100644 index 00000000..3c11d905 --- /dev/null +++ b/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.spec.ts @@ -0,0 +1,28 @@ +import { pascalCaseToSentence } from './pascal-case-to-sentence.util'; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +describe('pascalCaseToSentence', () => { + it('should convert a PascalCase string to a sentence', () => { + expect(pascalCaseToSentence('SubscribeForMore')).toEqual('Subscribe for more'); + expect(pascalCaseToSentence('String')).toEqual('String'); + expect(pascalCaseToSentence('SomeExtraLongDescription')).toEqual( + 'Some extra long description' + ); + }); + + it('should also convert a camelCase string to a sentence', () => { + expect(pascalCaseToSentence('subscribeForMore')).toEqual('Subscribe for more'); + }); + + it('should return an empty string if no value was provided', () => { + expect(pascalCaseToSentence(null)).toEqual(''); + expect(pascalCaseToSentence(undefined)).toEqual(''); + }); + + it('should return an empty string if no string value was provided', () => { + expect(pascalCaseToSentence(true as any)).toEqual(''); + expect(pascalCaseToSentence({ hello: 'world' } as any)).toEqual(''); + expect(pascalCaseToSentence(0 as any)).toEqual(''); + expect(pascalCaseToSentence([1] as any)).toEqual(''); + }); +}); diff --git a/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.ts b/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.ts new file mode 100644 index 00000000..7351f59e --- /dev/null +++ b/libs/javascript/utils/src/lib/string/pascal-case-to-sentence/pascal-case-to-sentence.util.ts @@ -0,0 +1,16 @@ +import { camelCaseToSentence } from '../camel-case-to-sentence/camel-case-to-sentence.util'; + +/** + * Converts a PascalCase string to a human-readable sentence. + * + * *This is an alias for {@link camelCaseToSentence}.* + * + * @param value - The provided value + * + * @example + * pascalCaseToSentence('AwesomeUtils') // 'Awesome utils' + * + * @returns A human-readable sentence derived from the PascalCase string. The first + * letter will be uppercase, while the rest of the string will be lowercase. + */ +export const pascalCaseToSentence = camelCaseToSentence; From ff7ac64d00e33c387a35ab9d461230e554a7cbb7 Mon Sep 17 00:00:00 2001 From: Wouter Heirstrate <56075460+WHeirstrate@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:02:14 +0200 Subject: [PATCH 2/2] build(js-utils):v2.0.2 (#451) Co-authored-by: Wouter Heirstrate --- libs/javascript/utils/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/javascript/utils/package.json b/libs/javascript/utils/package.json index f9e97fcf..a60b772a 100644 --- a/libs/javascript/utils/package.json +++ b/libs/javascript/utils/package.json @@ -1,6 +1,6 @@ { "name": "@studiohyperdrive/utils", - "version": "2.0.1", + "version": "2.0.2", "description": "A package containing common Javascript utils.", "keywords": [ "file", @@ -12,6 +12,7 @@ "merge", "search-recursively", "camel-case-to-sentence", + "pascal-case-to-sentence", "normalize-string", "replace-whitespace", "search-string",