JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 107985
  • Score
    100M100P100Q154974F
  • License MIT

Convert text between `camelCase`, `PascalCase`, `Capital Case`, `Header-Case`, `Title Case`, `path/case`, `snake_case`, `param-case`, `dot.case`, `CONSTANT_CASE`, `lower case`, `lOWER CASE FIRST`, `UPPER CASE`, `Upper case first` and other

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

    NPM version NPM downloads Bundle size License: MIT TypeScript Build Status codecov

    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

    # npm
    npm install text-case
    
    # yarn
    yarn add text-case
    
    # pnpm
    pnpm add text-case
    
    # bun
    bun add text-case

    Individual 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 npm
    text-pascal-case UserProfileData Class names, components, types ~400B npm
    text-snake-case user_profile_data Database columns, Python variables ~300B npm
    text-kebab-case user-profile-data CSS classes, URLs, HTML attributes ~350B npm
    text-title-case User Profile Data Headers, titles, proper nouns ~350B npm
    text-sentence-case User profile data Sentences, descriptions ~320B npm

    Specialized Formats

    Package Output Example Use Cases Size NPM
    text-constant-case USER_PROFILE_DATA Environment variables, constants ~380B npm
    text-dot-case user.profile.data Object paths, file names ~280B npm
    text-path-case user/profile/data File paths, URLs ~300B npm
    text-header-case User-Profile-Data HTTP headers, train-case ~340B npm
    text-capital-case User Profile Data Business titles, formal text ~330B npm
    text-no-case user profile data Search queries, plain text ~280B npm
    text-param-case user-profile-data URL parameters, kebab-case alias ~350B npm

    Character Transformations

    Package Output Example Use Cases Size NPM
    text-upper-case USER PROFILE DATA Constants, emphasis ~120B npm
    text-lower-case user profile data Normalization, search ~120B npm
    text-upper-case-first User profile data Sentences, proper formatting ~130B npm
    text-lower-case-first user Profile Data camelCase conversion ~130B npm
    text-swap-case uSER pROFILE dATA Creative text, obfuscation ~140B npm

    Validation Utilities

    Package Output Example Use Cases Size NPM
    text-is-upper-case true/false Input validation, conditionals ~100B npm
    text-is-lower-case true/false Input validation, conditionals ~100B npm

    ๐Ÿ› ๏ธ 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-profile

    Next.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 lint

    Package 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

    MIT ยฉ Dmitry Selikhov

    ๐Ÿ†˜ Support

    • 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