The ultimate text case transformation library for JavaScript and TypeScript. Convert text between
camelCase
,PascalCase
,snake_case
,kebab-case
,CONSTANT_CASE
,Title Case
,Sentence case
,dot.case
,path/case
,Header-Case
, and many more formats with comprehensive TypeScript support.
- 21 case transformation functions covering all common text formatting needs
- Type-safe with comprehensive TypeScript definitions
- Zero dependencies - lightweight and fast
- Tree-shakeable - import only what you need
- Universal - works in browsers, Node.js, and serverless environments
- Comprehensive testing - 100% test coverage with extensive edge cases
- Professional documentation - detailed examples and API references
- Modern tooling - ES modules, CommonJS, and UMD support
- Monorepo architecture - individual packages for optimal bundle size
# npm
npm install text-case
# yarn
yarn add text-case
# pnpm
pnpm add text-case
# bun
bun add text-case
# Install only what you need
npm install text-camel-case text-kebab-case text-snake-case
import {
camelCase, // userProfileData
pascalCase, // UserProfileData
kebabCase, // user-profile-data
snakeCase, // user_profile_data
titleCase, // User Profile Data
sentenceCase, // User profile data
constantCase, // USER_PROFILE_DATA
dotCase, // user.profile.data
pathCase, // user/profile/data
headerCase, // User-Profile-Data
capitalCase, // User Profile Data
noCase, // user profile data
upperCase, // USER PROFILE DATA
lowerCase, // user profile data
upperCaseFirst, // User profile data
lowerCaseFirst, // user Profile Data
swapCase, // uSER pROFILE dATA
isUpperCase, // Boolean check
isLowerCase, // Boolean check
} from "text-case";
// Transform any text format
const input = "user_profile_data";
console.log(camelCase(input)); // "userProfileData"
console.log(pascalCase(input)); // "UserProfileData"
console.log(kebabCase(input)); // "user-profile-data"
console.log(titleCase(input)); // "User Profile Data"
Package | Output Example | Use Cases | Size | NPM |
---|---|---|---|---|
text-camel-case |
userProfileData |
JavaScript variables, object properties | ~450B | |
text-pascal-case |
UserProfileData |
Class names, components, types | ~400B | |
text-snake-case |
user_profile_data |
Database columns, Python variables | ~300B | |
text-kebab-case |
user-profile-data |
CSS classes, URLs, HTML attributes | ~350B | |
text-title-case |
User Profile Data |
Headers, titles, proper nouns | ~350B | |
text-sentence-case |
User profile data |
Sentences, descriptions | ~320B |
Package | Output Example | Use Cases | Size | NPM |
---|---|---|---|---|
text-constant-case |
USER_PROFILE_DATA |
Environment variables, constants | ~380B | |
text-dot-case |
user.profile.data |
Object paths, file names | ~280B | |
text-path-case |
user/profile/data |
File paths, URLs | ~300B | |
text-header-case |
User-Profile-Data |
HTTP headers, train-case | ~340B | |
text-capital-case |
User Profile Data |
Business titles, formal text | ~330B | |
text-no-case |
user profile data |
Search queries, plain text | ~280B | |
text-param-case |
user-profile-data |
URL parameters, kebab-case alias | ~350B |
Package | Output Example | Use Cases | Size | NPM |
---|---|---|---|---|
text-upper-case |
USER PROFILE DATA |
Constants, emphasis | ~120B | |
text-lower-case |
user profile data |
Normalization, search | ~120B | |
text-upper-case-first |
User profile data |
Sentences, proper formatting | ~130B | |
text-lower-case-first |
user Profile Data |
camelCase conversion | ~130B | |
text-swap-case |
uSER pROFILE dATA |
Creative text, obfuscation | ~140B |
Package | Output Example | Use Cases | Size | NPM |
---|---|---|---|---|
text-is-upper-case |
true/false |
Input validation, conditionals | ~100B | |
text-is-lower-case |
true/false |
Input validation, conditionals | ~100B |
All transformation functions accept an optional second parameter for customization:
import { camelCase, snakeCase } from "text-case";
// Custom word splitting
camelCase("XMLHttpRequest", {
splitRegexp: /([a-z])([A-Z])/g,
}); // "xmlHttpRequest"
// Custom character stripping
snakeCase("[email protected]", {
stripRegexp: /[@.]/g,
}); // "hello_world_com"
// Custom transformations
camelCase("api-v2-endpoint", {
transform: (word, index) => {
if (word === "api") return "API";
if (word === "v2") return "V2";
return word;
},
}); // "APIV2Endpoint"
Full TypeScript support with comprehensive type definitions:
import { camelCase, PascalCase, Options } from "text-case";
// Type-safe options
const options: Options = {
splitRegexp: /([a-z])([A-Z])/g,
stripRegexp: /[^a-zA-Z0-9]/g,
transform: (word: string, index: number, words: string[]) =>
word.toLowerCase(),
};
// Type inference
const result: string = camelCase("hello-world", options);
// Generic type support for consistent transformations
function transformKeys<T extends Record<string, any>>(
obj: T,
transformer: (key: string) => string,
): Record<string, T[keyof T]> {
return Object.fromEntries(
Object.entries(obj).map(([key, value]) => [transformer(key), value]),
);
}
const data = { user_name: "John", email_address: "[email protected]" };
const camelData = transformKeys(data, camelCase);
// { userName: "John", emailAddress: "john@example.com" }
import { camelCase, snakeCase, kebabCase } from "text-case";
// Convert database columns to JavaScript
const dbUser = {
first_name: "John",
last_name: "Doe",
email_address: "[email protected]",
};
const jsUser = Object.fromEntries(
Object.entries(dbUser).map(([key, value]) => [camelCase(key), value]),
);
// { firstName: "John", lastName: "Doe", emailAddress: "john@example.com" }
// Generate API endpoints
const createEndpoint = (resource, action) =>
`/api/${kebabCase(resource)}/${kebabCase(action)}`;
createEndpoint("UserProfile", "GetById"); // "/api/user-profile/get-by-id"
import { pascalCase, camelCase } from "text-case";
// Component generation
const createComponent = (name) => `
import React from 'react';
interface ${pascalCase(name)}Props {
${camelCase(name)}Data?: any;
}
export const ${pascalCase(name)}: React.FC<${pascalCase(name)}Props> = ({ ${camelCase(name)}Data }) => {
return <div>{/* ${pascalCase(name)} component */}</div>;
};
`;
console.log(createComponent("user_profile_card"));
import { camelCase } from "text-case";
// Convert CSS properties
const cssToJS = (cssText) => {
return cssText.replace(
/([a-z])-([a-z])/g,
(match, p1, p2) => p1 + p2.toUpperCase(),
);
};
const styles = {
backgroundColor: "#fff", // from background-color
fontSize: "16px", // from font-size
marginTop: "10px", // from margin-top
};
import { constantCase, camelCase } from "text-case";
// Environment variables to config object
const envToConfig = (envVars) => {
return Object.fromEntries(
Object.entries(envVars)
.filter(([key]) => key.startsWith("APP_"))
.map(([key, value]) => [camelCase(key.replace("APP_", "")), value]),
);
};
const env = {
APP_DATABASE_URL: "postgres://...",
APP_API_SECRET_KEY: "secret123",
APP_MAX_FILE_SIZE: "10MB",
};
const config = envToConfig(env);
// { databaseUrl: "postgres://...", apiSecretKey: "secret123", maxFileSize: "10MB" }
import express from "express";
import { kebabCase } from "text-case";
const app = express();
// Auto-generate kebab-case routes
const createRoute = (name, handler) => {
app.get(`/${kebabCase(name)}`, handler);
};
createRoute("getUserProfile", (req, res) => res.json({ profile: {} }));
// Creates route: GET /get-user-profile
// pages/[...slug].js
import { pathCase } from "text-case";
export async function getStaticPaths() {
const pages = ["About Us", "Contact Form", "Privacy Policy"];
return {
paths: pages.map((page) => ({
params: { slug: pathCase(page).split("/") },
})),
fallback: false,
};
}
import { pascalCase } from "text-case";
// Dynamic component registration
const components = ["UserCard", "ProductList", "CheckoutForm"];
components.forEach((name) => {
app.component(pascalCase(name), () => import(`./components/${name}.vue`));
});
Each package includes comprehensive test suites with:
- Basic transformations - Standard use cases
- Edge cases - Empty strings, special characters, unicode
- Complex inputs - Mixed cases, numbers, symbols
- Performance tests - Large string handling
- Error handling - Null/undefined inputs
- Real-world scenarios - Practical examples
# Run all tests
pnpm test
# Run tests for specific package
pnpm --filter text-camel-case test
# Run tests with coverage
pnpm test --coverage
# Run tests in watch mode
pnpm test --watch
Package | Minified | Gzipped | Tree-shakeable |
---|---|---|---|
text-case (all) |
~8KB | ~3KB | β |
Individual packages | 100B-450B | 50B-250B | β |
Import only what you need for optimal bundle size:
// β Imports entire library (~8KB)
import { camelCase } from "text-case";
// β
Imports only camelCase (~450B)
import { camelCase } from "text-camel-case";
- Modern browsers: ES2015+ (Chrome 51+, Firefox 54+, Safari 10+)
- Node.js: 12+
- TypeScript: 4.0+
- Bundle formats: UMD, ESM, CommonJS
interface Options {
// RegExp to split input into words
splitRegexp?: RegExp;
// RegExp to strip unwanted characters
stripRegexp?: RegExp;
// Custom word transformation function
transform?: (word: string, index: number, words: string[]) => string;
// Custom split function (alternative to splitRegexp)
split?: (value: string) => string[];
// Delimiter between words (for spaced formats)
delimiter?: string;
}
// Split on camelCase and PascalCase boundaries
const camelSplit = { splitRegexp: /([a-z])([A-Z])/g };
// Preserve numbers as separate words
const numberSplit = { splitRegexp: /([a-zA-Z])(\d)/g };
// Strip special characters
const stripSpecial = { stripRegexp: /[^a-zA-Z0-9]/g };
// Custom acronym handling
const acronymTransform = {
transform: (word) => {
const acronyms = ["API", "URL", "HTTP", "JSON", "XML"];
return acronyms.includes(word.toUpperCase()) ? word.toUpperCase() : word;
},
};
We welcome contributions! Please see our Contributing Guide for details.
# Clone the repository
git clone https://github.com/idimetrix/text-case.git
cd text-case
# Install dependencies
pnpm install
# Build all packages
pnpm build
# Run tests
pnpm test
# Type check
pnpm typecheck
# Lint code
pnpm lint
npx lerna version patch --yes --force-publish=*
npx lerna publish from-package --yes
packages/
βββ camel-case/ # camelCase transformation
βββ pascal-case/ # PascalCase transformation
βββ snake-case/ # snake_case transformation
βββ kebab-case/ # kebab-case transformation
βββ title-case/ # Title Case transformation
βββ sentence-case/ # Sentence case transformation
βββ constant-case/ # CONSTANT_CASE transformation
βββ dot-case/ # dot.case transformation
βββ path-case/ # path/case transformation
βββ header-case/ # Header-Case transformation
βββ capital-case/ # Capital Case transformation
βββ no-case/ # no case transformation
βββ param-case/ # param-case transformation
βββ upper-case/ # UPPER CASE transformation
βββ lower-case/ # lower case transformation
βββ upper-case-first/ # Upper case first transformation
βββ lower-case-first/ # lower case first transformation
βββ swap-case/ # sWaP cAsE transformation
βββ is-upper-case/ # UPPER CASE validation
βββ is-lower-case/ # lower case validation
- π§ Email: [email protected]
- π Issues: GitHub Issues
- π¬ Discussions: GitHub Discussions
- π Documentation: Individual package READMEs
- change-case - The original inspiration
- lodash - Utility library with some case functions
- just - Functional programming utilities
- π― Focused: Specialized in text case transformations
- π¦ Modular: Use only what you need
- π Reliable: Extensively tested and battle-tested
- β‘ Fast: Optimized for performance
- π‘οΈ Type-safe: Full TypeScript support
- π Well-documented: Comprehensive guides and examples
- π Consistent: Uniform API across all packages
- π Modern: Built with modern JavaScript standards
Made with β€οΈ by Dmitry Selikhov