
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
Convert text between `camelCase`, `PascalCase`, `Capital Case`, `Header-Case`, `Title Case`, `path/case`, `snake_case`, `param-case`, `kebab-case`, `dot.case`, `CONSTANT_CASE`, `lower case`, `lOWER CASE FIRST`, `UPPER CASE`, `Upper case first` and other
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.
# npm
npm install text-case
# yarn
yarn add text-case
# pnpm
pnpm add text-case
# bun
bun add text-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
paramCase, // user-profile-data (alias for kebab-case)
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"
| Function | Output Example | Description |
|---|---|---|
camelCase() | userProfileData | First word lowercase, subsequent words capitalized |
pascalCase() | UserProfileData | All words capitalized, no separators |
snakeCase() | user_profile_data | Lowercase words separated by underscores |
kebabCase() | user-profile-data | Lowercase words separated by hyphens |
titleCase() | User Profile Data | All words capitalized, separated by spaces |
sentenceCase() | User profile data | First word capitalized, rest lowercase |
| Function | Output Example | Description |
|---|---|---|
constantCase() | USER_PROFILE_DATA | Uppercase words separated by underscores |
dotCase() | user.profile.data | Lowercase words separated by dots |
pathCase() | user/profile/data | Lowercase words separated by forward slashes |
headerCase() | User-Profile-Data | Capitalized words separated by hyphens |
capitalCase() | User Profile Data | All words capitalized, separated by spaces |
noCase() | user profile data | Lowercase words separated by spaces |
paramCase() | user-profile-data | Alias for kebab-case |
| Function | Output Example | Description |
|---|---|---|
upperCase() | USER PROFILE DATA | All characters uppercase |
lowerCase() | user profile data | All characters lowercase |
upperCaseFirst() | User profile data | First character uppercase |
lowerCaseFirst() | user Profile Data | First character lowercase |
swapCase() | uSER pROFILE dATA | Swap case of all characters |
| Function | Output Example | Description |
|---|---|---|
isUpperCase() | true/false | Check if string is uppercase |
isLowerCase() | true/false | Check if string is lowercase |
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"
Full TypeScript support with comprehensive type definitions:
import { camelCase, 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);
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"
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 { 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" }
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;
},
};
This package is optimized for minimal bundle size:
For even smaller bundles, consider using individual packages:
// ❌ Imports entire library (~8KB)
import { camelCase } from "text-case";
// ✅ Imports only camelCase (~450B)
import { camelCase } from "text-camel-case";
# Run tests
pnpm test
# Run tests in watch mode
pnpm test --watch
# Run tests with coverage
pnpm test --coverage
For optimal bundle size, you can install individual packages:
text-camel-case - camelCase transformationtext-pascal-case - PascalCase transformationtext-snake-case - snake_case transformationtext-kebab-case - kebab-case transformationtext-title-case - Title Case transformationtext-sentence-case - Sentence case transformationtext-constant-case - CONSTANT_CASE transformationtext-dot-case - dot.case transformationtext-path-case - path/case transformationtext-header-case - Header-Case transformationtext-capital-case - Capital Case transformationtext-no-case - no case transformationtext-param-case - param-case transformationtext-upper-case - UPPER CASE transformationtext-lower-case - lower case transformationtext-upper-case-first - Upper case first transformationtext-lower-case-first - lower case first transformationtext-swap-case - sWaP cAsE transformationtext-is-upper-case - UPPER CASE validationtext-is-lower-case - lower case validationgit checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)Made with ❤️ by Dmitry Selikhov
FAQs
Convert text between `camelCase`, `PascalCase`, `Capital Case`, `Header-Case`, `Title Case`, `path/case`, `snake_case`, `param-case`, `kebab-case`, `dot.case`, `CONSTANT_CASE`, `lower case`, `lOWER CASE FIRST`, `UPPER CASE`, `Upper case first` and other
The npm package text-case receives a total of 48,711 weekly downloads. As such, text-case popularity was classified as popular.
We found that text-case demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.