Safe parsing for primitives — numbers, booleans, dates, JSON from unknown strings
npm install @philiprehberger/safe-parseSafe parsing for primitives — numbers, booleans, dates, JSON from unknown strings
npm install @philiprehberger/safe-parse
import { parseNumber, parseInteger, parseFloat } from "@philiprehberger/safe-parse";
parseNumber("42"); // 42
parseNumber("abc"); // undefined
parseNumber("Infinity"); // undefined
parseInteger("3.14"); // undefined
parseInteger("10"); // 10
parseFloat("3.14159", { precision: 2 }); // 3.14
import { parseBoolean } from "@philiprehberger/safe-parse";
parseBoolean("true"); // true
parseBoolean("yes"); // true
parseBoolean("0"); // false
parseBoolean("off"); // false
parseBoolean("maybe"); // undefined
import { parseDate } from "@philiprehberger/safe-parse";
parseDate("2026-01-15"); // Date object
parseDate("not a date"); // undefined
import { parseJSON } from "@philiprehberger/safe-parse";
parseJSON('{"key": "value"}'); // { key: "value" }
parseJSON("invalid json"); // undefined
import { parseURL } from "@philiprehberger/safe-parse";
parseURL("https://example.com"); // URL instance
parseURL("ftp://example.com"); // undefined (default protocols allow only http/https)
parseURL("ftp://example.com", { protocols: ["ftp:"] }); // URL instance
parseURL("/foo", { base: "https://example.com" }); // URL → https://example.com/foo
parseURL("javascript:alert(1)", { protocols: null }); // URL — pass null to allow any protocol
import { coerce } from "@philiprehberger/safe-parse";
const query = { page: "3", active: "true", since: "2026-01-01", tags: "a,b,c" };
const parsed = coerce(query, {
page: "number",
active: "boolean",
since: "date",
tags: "string[]",
});
// { page: 3, active: true, since: Date, tags: ["a", "b", "c"] }
import { parseNumberOrDefault, parseBooleanOrDefault } from "@philiprehberger/safe-parse";
parseNumberOrDefault("abc", 0); // 0
parseBooleanOrDefault("yes", false); // true
| Function | Input | Output |
|---|---|---|
parseNumber(input) | unknown | number | undefined |
parseInteger(input) | unknown | number | undefined |
parseFloat(input, options?) | unknown | number | undefined |
parseBoolean(input) | unknown | boolean | undefined |
parseDate(input) | unknown | Date | undefined |
parseJSON<T>(input) | unknown | T | undefined |
parseURL(input, options?) | unknown | URL | undefined |
parseArray(input, separator?) | unknown | string[] | undefined |
coerce(input, schema) | Record<string, unknown> | CoerceResult<S> |
parseNumberOrDefault(input, fallback) | unknown, number | number |
parseBooleanOrDefault(input, fallback) | unknown, boolean | boolean |
parseDateOrDefault(input, fallback) | unknown, Date | Date |
parseJSONOrDefault<T>(input, fallback) | unknown, T | T |
ParseURLOptions| Option | Type | Default | Description |
|---|---|---|---|
protocols | readonly string[] | null | ['http:', 'https:'] | Allowed protocols. null allows any. |
base | string | URL | undefined | Base URL used to resolve relative inputs. |
npm install
npm run build
npm test
If you find this project useful: