Skip to content

Haberkamp/ts-redacted

Repository files navigation

ts-redacted

Created by

NPM License

Overview

Working with sensitive values like API keys, passwords, or tokens in TypeScript can be risky. Accidentally logging or serializing these values can expose them in production.

const apiKey = "sk_live_1234567890";
console.log(apiKey); // Oops! Secret exposed in logs
JSON.stringify({ key: apiKey }); // Oops! Secret in JSON output
const apiKey = Redacted.make("sk_live_1234567890");
console.log(apiKey); // "<redacted>"
JSON.stringify({ key: apiKey }); // {"key":"<redacted>"}

// Access the actual value only when explicitly needed
const actualKey = Redacted.value(apiKey);

Author

Hey, I'm Nils. In my spare time I write about things I learned or I create open source packages, that help me (and hopefully you) to build better apps.

Installation

You can install this package with any package manager you like.

pnpm add ts-redacted

Usage

Creating Redacted Values

import { Redacted } from "ts-redacted";

const secret = Redacted.make("my-secret-api-key");
const password = Redacted.make(process.env.PASSWORD);
const token = Redacted.make({ accessToken: "abc123", refreshToken: "xyz789" });

Extracting Values

const secret = Redacted.make("my-secret-api-key");

// Extract the actual value
const actualValue = Redacted.value(secret); // "my-secret-api-key"

Safe Serialization

const secret = Redacted.make("my-secret-api-key");

// toString() returns "<redacted>"
secret.toString(); // "<redacted>"
String(secret); // "<redacted>"

// toJSON() returns "<redacted>"
secret.toJSON(); // "<redacted>"
JSON.stringify({ key: secret }); // '{"key":"<redacted>"}'

Type Safety

import { Redacted, Value } from "ts-redacted";

// Type inference works correctly
const secret = Redacted.make("my-secret-api-key");
type SecretType = Value<typeof secret>; // string

const token = Redacted.make(42);
type TokenType = Value<typeof token>; // number

// Extract with correct types
const actualSecret: string = Redacted.value(secret);
const actualToken: number = Redacted.value(token);

Supported Value Types

The Redacted class works with any value type:

Redacted.make("string");
Redacted.make(42);
Redacted.make(true);
Redacted.make(null);
Redacted.make(undefined);
Redacted.make({ key: "value" });
Redacted.make([1, 2, 3]);

Feedback and Contributing

I highly appreciate your feedback! Please create an issue, if you've found any bugs or want to request a feature.

About

Prevent secret values getting leaked in logs or API responses

Resources

License

Stars

Watchers

Forks

Contributors