Skip to content

sergeyshmakov/data-path

Repository files navigation

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

About

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

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors