Skip to content

Latest commit

 

History

History
97 lines (68 loc) · 4.24 KB

File metadata and controls

97 lines (68 loc) · 4.24 KB

data-path

Type-safe object property paths in TypeScript — build, compare, and manipulate with lambda expressions. Zero dependencies.

npm version CI Bundle size TypeScript License: MIT

Documentation: https://sergeyshmakov.github.io/data-path/


Before / after

// Before — string literals, invisible to the compiler
register("users.0.profile.firstName");
table.getColumn("contact.email");
set(state => ({ ...state, settings: { ...state.settings, theme } }));
// After — typed, IDE-autocompleted, refactor-safe
register(path((u: FormData) => u.users[0].profile.firstName).$);
table.getColumn(emailPath.$);
set(state => themePath.set(state, theme));

What it is

A zero-dependency TypeScript library that captures object property paths via proxy-based lambdas. Build a path once — use it as a string, read and write data through it, compose paths together, or match one against another.

  • Typed root to leaf — renaming a property breaks the path at compile time
  • Safe get, immutable set, read-modify-write update
  • Template paths (each, deep) for bulk operations across collections and trees
  • Path algebra: merge, subtract, slice, to
  • Runtime indices and closure variables work natively inside lambdas

Install

npm install data-path

Requirements: Node >=20, TypeScript >=5.0

Quick start

import { path } from "data-path";

type User = { profile: { firstName: string; lastName: string }; tags: string[] };

const firstNamePath = path((u: User) => u.profile.firstName);

firstNamePath.$                        // "profile.firstName"
firstNamePath.get(user)                // "Alice" | undefined
firstNamePath.set(user, "Bob")         // returns a new User — original unchanged
firstNamePath.fn                       // stable (u: User) => string | undefined

Works well with

Package How it helps
React Hook Form Type-safe field names for register, watch, setValue
TanStack Form Typed field names with runtime index support
TanStack Table Typed column accessors — no manual id strings
Zustand Immutable nested state updates without Immer
Zod Map ZodError.issues paths to specific form fields
React useState Structural clones for deeply nested state

Guides

AI tooling

This package is available in Context7 and documented in a Cubic wiki. An Agent Skills-compatible skill is included:

npx ctx7 skills install /sergeyshmakov/data-path data-path

Contributing

See CONTRIBUTING.md.

License

MIT License