From d93233852f345930275d68197de14e89891b66ed Mon Sep 17 00:00:00 2001 From: Shinigami Date: Thu, 18 Apr 2024 08:56:40 +0200 Subject: [PATCH] refactor(deps): inline decamelize dependency (#1099) --- package.json | 1 - pnpm-lock.yaml | 9 --------- src/utils/createSchemalize.ts | 5 +++-- src/utils/decamelize.ts | 36 +++++++++++++++++++++++++++++++++++ src/utils/index.ts | 1 + test/utils/decamelize.spec.ts | 30 +++++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 src/utils/decamelize.ts create mode 100644 test/utils/decamelize.spec.ts diff --git a/package.json b/package.json index 4a02a478..7c26d990 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,6 @@ "url": "https://github.com/salsita/node-pg-migrate.git" }, "dependencies": { - "decamelize": "^5.0.0", "mkdirp": "~1.0.0", "yargs": "~17.7.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfe13d50..c1e996de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,9 +13,6 @@ importers: .: dependencies: - decamelize: - specifier: ^5.0.0 - version: 5.0.1 mkdirp: specifier: ~1.0.0 version: 1.0.4 @@ -1015,10 +1012,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decamelize@5.0.1: - resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} - engines: {node: '>=10'} - decompress-response@3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} @@ -3638,8 +3631,6 @@ snapshots: decamelize@1.2.0: {} - decamelize@5.0.1: {} - decompress-response@3.3.0: dependencies: mimic-response: 1.0.1 diff --git a/src/utils/createSchemalize.ts b/src/utils/createSchemalize.ts index 3aa725aa..6fd8884b 100644 --- a/src/utils/createSchemalize.ts +++ b/src/utils/createSchemalize.ts @@ -1,6 +1,7 @@ -import decamelize from 'decamelize'; -import { identity, quote } from '.'; import type { Name } from '../operations/generalTypes'; +import { decamelize } from './decamelize'; +import { identity } from './identity'; +import { quote } from './quote'; /** @deprecated Use createSchemalize(options) instead. */ export function createSchemalize( diff --git a/src/utils/decamelize.ts b/src/utils/decamelize.ts new file mode 100644 index 00000000..043d6bb8 --- /dev/null +++ b/src/utils/decamelize.ts @@ -0,0 +1,36 @@ +// Simplified copy of https://github.com/sindresorhus/decamelize/blob/5deb8c5b88c3dbc93ef0d68faa0fc45cf98cad9d/index.js +const REPLACEMENT = '$1_$2'; + +/** + * Convert a string into a decamelize lowercased one. + * + * @example + * unicornsAndRainbows → unicorns_and_rainbows + * myURLString → my_url_string + * + * @param text The string to decamelize. + * @returns The decamelized string. + */ +export function decamelize(text: string): string { + // Checking the second character is done later on. Therefore process shorter strings here. + if (text.length < 2) { + return text.toLowerCase(); + } + + // Split lowercase sequences followed by uppercase character. + // `dataForUSACounties` → `data_For_USACounties` + // `myURLstring → `my_URLstring` + const decamelized = text.replace( + /([\p{Lowercase_Letter}\d])(\p{Uppercase_Letter})/gu, + REPLACEMENT + ); + + // Split multiple uppercase characters followed by one or more lowercase characters. + // `my_URLstring` → `my_ur_lstring` + return decamelized + .replace( + /(\p{Uppercase_Letter})(\p{Uppercase_Letter}\p{Lowercase_Letter}+)/gu, + REPLACEMENT + ) + .toLowerCase(); +} diff --git a/src/utils/index.ts b/src/utils/index.ts index c9a9b95d..2b285922 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,6 @@ export { createSchemalize } from './createSchemalize'; export { createTransformer } from './createTransformer'; +export { decamelize } from './decamelize'; export { escapeValue } from './escapeValue'; export { formatLines } from './formatLines'; export { formatParams } from './formatParams'; diff --git a/test/utils/decamelize.spec.ts b/test/utils/decamelize.spec.ts new file mode 100644 index 00000000..0f8f9aa2 --- /dev/null +++ b/test/utils/decamelize.spec.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from 'vitest'; +import { decamelize } from '../../src/utils'; + +describe('utils', () => { + describe('decamelize', () => { + it.each([ + ['', ''], + ['A', 'a'], + ['A B', 'a b'], + ['a2b', 'a2b'], + ['A2B', 'a2_b'], + ['_A2B', '_a2_b'], + ['myURLstring', 'my_ur_lstring'], + ['unicornsAndRainbows', 'unicorns_and_rainbows'], + ['UNICORNS AND RAINBOWS', 'unicorns and rainbows'], + ['unicorns-and-rainbows', 'unicorns-and-rainbows'], + ['thisIsATest', 'this_is_a_test'], + ['myURLString', 'my_url_string'], + ['URLString', 'url_string'], + ['StringURL', 'string_url'], + ['testGUILabel', 'test_gui_label'], + ['CAPLOCKED1', 'caplocked1'], + ['my_URL_string', 'my_url_string'], + ])('should handle string %s', (input, expected) => { + const actual = decamelize(input); + + expect(actual).toBe(expected); + }); + }); +});