Package Exports
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (text-case) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Text Case
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.
๐ Features
- 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
๐ฆ Installation
All packages (recommended)
# npm
npm install text-case
# yarn
yarn add text-case
# pnpm
pnpm add text-case
# bun
bun add text-caseIndividual packages
# Install only what you need
npm install text-camel-case text-kebab-case text-snake-case๐ฏ Quick Start
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"๐ Available Packages
Core Transformations
| 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 |
Specialized Formats
| 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 |
Character Transformations
| 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 |
Validation Utilities
| 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 |
๐ ๏ธ Advanced Usage
Custom Options
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("hello@world.com", {
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"TypeScript Support
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: "john@example.com" };
const camelData = transformKeys(data, camelCase);
// { userName: "John", emailAddress: "john@example.com" }Real-World Examples
API Development
import { camelCase, snakeCase, kebabCase } from "text-case";
// Convert database columns to JavaScript
const dbUser = {
first_name: "John",
last_name: "Doe",
email_address: "john@example.com",
};
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"React Development
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"));CSS-in-JS
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
};Configuration Management
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" }๐๏ธ Framework Integration
Express.js
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-profileNext.js
// 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,
};
}Vue.js
import { pascalCase } from "text-case";
// Dynamic component registration
const components = ["UserCard", "ProductList", "CheckoutForm"];
components.forEach((name) => {
app.component(pascalCase(name), () => import(`./components/${name}.vue`));
});๐งช Testing
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
Running Tests
# 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๐ Bundle Size Comparison
| 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";๐ Browser Support
- Modern browsers: ES2015+ (Chrome 51+, Firefox 54+, Safari 10+)
- Node.js: 12+
- TypeScript: 4.0+
- Bundle formats: UMD, ESM, CommonJS
๐ API Reference
Options Interface
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;
}Common Patterns
// 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;
},
};๐ค Contributing
We welcome contributions! Please see our Contributing Guide for details.
Development Setup
# 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 lintPackage Structure
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๐ License
๐ Support
- ๐ง Email: selikhov.dmitrey@gmail.com
- ๐ Issues: GitHub Issues
- ๐ฌ Discussions: GitHub Discussions
- ๐ Documentation: Individual package READMEs
๐ Related Projects
- change-case - The original inspiration
- lodash - Utility library with some case functions
- just - Functional programming utilities
๐ Why Choose Text Case?
- ๐ฏ 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