This library contains functions and types to convert strings, tuple members and property names from one case to another.
While there are plenty of other packages that does the same at runtime, this library is built for full type support.
Useful for converting known models for interacting with external APIs.
The main export of interest is changeCase
. It's parameters are the value which to change, the optional source case, and the target case. If no source case is provided, the library will try and detect it. changeCase
works for strings, tuple/array-values, and object keys, in that order. Use changeArrayCase
, changeStringCase
, or changeKeysCase
to specify the target, if needed.
The library also exports types correlating to the functions mentioned above (such as ChangeCase<Value, ToCase, FromCase>
etc.), as well as for detecting cases, case names as constants and as literal string types grouped into unions, etc.
Last but not least are the functional variants of the case changing functions: caseChanger
, stringCaseChanger
, arrayCaseChanger
and keysCaseChanger
. These can be useful for instance when using transform
with Zod schemas (z.object({ FOO_BAR: z.string() }).transform(caseChanger("camelCase"))
).
Node/NPM
Setup:
npm install change-case-ts
Code:
import { changeCase } from "change-case-ts";
Deno/JSR
Setup:
deno add jsr:change-case-ts
Code:
import { changeCase } from "change-case-ts";
Node/NPM
import { changeCase } from "change-case-ts";
const stringLiteral = changeCase("howAboutThemApples", "SCREAMING-KEBAB-CASE");
stringLiteral satisfies "HOW-ABOUT-THEM-APPLES";
Deno/JSR
import { changeCase } from "change-case-ts";
const stringLiteral = changeCase("howAboutThemApples", "SCREAMING-KEBAB-CASE");
stringLiteral satisfies "HOW-ABOUT-THEM-APPLES";
Node/NPM
import { changeCase } from "change-case-ts";
const objectKeys = changeCase(
{
some_number: 123,
an_array: [
{
with_a_prop: true,
},
],
},
"camelCase",
);
objectKeys satisfies {
someNumber: 123;
anArray: [{
withAProp: true;
}];
};
Deno/JSR
import { changeCase } from "change-case-ts";
const objectKeys = changeCase(
{
some_number: 123,
an_array: [
{
with_a_prop: true,
},
],
},
"camelCase",
);
objectKeys satisfies {
someNumber: 123;
anArray: [{
withAProp: true;
}];
};
Node/NPM
import { changeCase } from "change-case-ts";
const tuples = changeCase(["foo-bar", "baz", 123], "PascalCase");
tuples satisfies ["FooBar", "Baz", 123];
Deno/JSR
import { changeCase } from "change-case-ts";
const tuples = changeCase(["foo-bar", "baz", 123], "PascalCase");
tuples satisfies ["FooBar", "Baz", 123];
Node/NPM
// We can't use `changeCase` in this example, as it will try and change any string literal values within the given array instead of the keys in the object items, so we specifically use `changeKeysCase` instead to remove the ambiguity.
import { changeKeysCase } from "change-case-ts";
type Response = Array<{ foo_bar: string }>;
const response: Response = await fetch(
"https://www.example.com",
).then((res) => res.json());
const result = changeKeysCase(response, "camelCase");
result satisfies Array<{ fooBar: string }>;
Deno/JSR
// We can't use `changeCase` in this example, as it will try and change any string literal values within the given array instead of the keys in the object items, so we specifically use `changeKeysCase` instead to remove the ambiguity.
import { changeKeysCase } from "change-case-ts";
type Response = Array<{ foo_bar: string }>;
const response: Response = await fetch(
"https://www.example.com",
).then((res) => res.json());
const result = changeKeysCase(response, "camelCase");
result satisfies Array<{ fooBar: string }>;
Node/NPM
Setup:
npm install --save-dev @types/node
npm install dotenv zod change-case-ts
echo "MY_ENV_VAR='Hello, world!'" >> .env
Code:
import "dotenv/config";
import { caseChanger } from "change-case-ts";
import z from "zod";
const envSchema = z.object({
MY_ENV_VAR: z.string(),
});
const camelCaseEnvSchema = envSchema.transform(
caseChanger("camelCase"),
);
const env = camelCaseEnvSchema.parse(process.env);
env satisfies {
myEnvVar: string;
};
console.log(env.myEnvVar);
Deno/JSR
Setup:
deno add npm:zod jsr:@std/dotenv jsr:change-case-ts
echo "MY_ENV_VAR='Hello, world!'" >> .env
Code:
import "@std/dotenv/load";
import { caseChanger } from "change-case-ts";
import z from "zod";
const envSchema = z.object({
MY_ENV_VAR: z.string(),
});
const camelCaseEnvSchema = envSchema.transform(
caseChanger("camelCase"),
);
const env = camelCaseEnvSchema.parse(Deno.env.toObject());
env satisfies {
myEnvVar: string;
};
console.log(env.myEnvVar);
The following cases are currently supported:
- Non-delimited cases:
lowercase
UPPERCASE
- Capitalization-delimited cases:
camelCase
PascalCase
- Symbol-delimited cases:
snake_case
-
UPPER_SNAKE_CASE
(a.k.a.SCREAMING_SNAKE_CASE
andCONSTANT_CASE
) kebab-case
-
UPPER-KEBAB-CASE
(a.k.a.SCREAMING-KEBAB-CASE
)
Missing a case? File an issue on GitHub