
Security News
npm Tooling Bug Incorrectly Marks One-Character Packages as Security Holders
npm confirmed a tooling bug incorrectly marked several one-character packages as security holders and said it was working on a rollback.
type-safe-paths
Advanced tools
TypeSafePaths is a TypeScript library that provides a type-safe way to manage URL paths and their parameters in a web application. It leverages the power of Zod for schema validation, ensuring that both path parameters and search parameters conform to spe
TypeSafePaths is a TypeScript library that provides a type-safe way to manage URL paths and their parameters in a web application. It leverages the power of Zod for schema validation, ensuring that both path parameters and search parameters conform to specified schemas.
npm install type-safe-paths
First, create an instance of TypeSafePaths and define your paths with the required schemas.
import z from "zod"
import { TypeSafePaths, createPathHelpers } from "type-safe-paths"
// Create a new instance of TypeSafePaths with a metadata schema
const paths = new TypeSafePaths({
metadataSchema: z.object({
allowedPermissions: z.array(z.enum(["user", "admin"])),
mustBeLoggedIn: z.boolean(),
}),
})
// Add the first path with metadata and search parameters
.add("/posts/details/:postId", {
metadata: {
allowedPermissions: ["admin"],
mustBeLoggedIn: true,
},
searchParams: z.object({
query: z.string().optional(),
}),
})
// Add a nested path with different metadata and search parameters
.add("/posts/details/:postId/:commentId", {
metadata: {
allowedPermissions: ["user"],
mustBeLoggedIn: false,
},
searchParams: z.object({
query: z.string().default("hello world"),
optional: z.string().default("the parsing worked"),
}),
})
Use createPathHelpers to generate helper functions for building, matching, and parsing paths.
const {
buildPath,
matchPath,
parseSearchParamsForPath,
extractParamsFromPathName,
} = createPathHelpers(paths)
Construct a URL from a defined path and its parameters.
// Build a URL for the path "/posts/details/:postId/:commentId"
const url = buildPath("/posts/details/:postId/:commentId", {
params: {
postId: "123",
commentId: "456",
},
searchParams: {
query: "example query",
},
})
console.log(url)
// Output: /posts/details/123/456?query="example+query"
You can use the buildPath function with Next.js component for type-safe routing.
import Link from 'next/link';
import { buildPath } from 'type-safe-paths';
const postId = "123";
const commentId = "456";
const url = buildPath("/posts/details/:postId/:commentId", {
params: { postId, commentId },
searchParams: { query: "example query" },
});
const MyComponent = () => (
<Link href={url}>
<a>Go to Comment</a>
</Link>
);
export default MyComponent;
Match a URL against the defined paths and extract metadata.
// Match a URL against the registered paths
const matchResult = matchPath("/posts/details/123/456?query=example+query")
if (matchResult) {
console.log(matchResult.path)
// Output: /posts/details/:postId/:commentId
console.log(matchResult.metadata)
// Output: { allowedPermissions: ["user"], testing: "hello world" }
} else {
console.log("No matching path found.")
}
Parse and validate search parameters from a URL.
// Create a URLSearchParams instance with some query parameters
const searchParams = new URLSearchParams()
searchParams.set("query", "example query")
// Parse and validate the search parameters for the specified path
const parsedParams = parseSearchParamsForPath(
searchParams,
"/posts/details/:postId/:commentId"
)
console.log(parsedParams)
// Output: { query: "example query", optional: "the parsing worked" }
Extract path parameters from a URL based on a defined path.
// Extract path parameters from a URL based on the specified path template
const params = extractParamsFromPathName(
"/posts/details/123/456?query=example+query",
"/posts/details/:postId/:commentId"
)
console.log(params)
// Output: { postId: "123", commentId: "456" }
Use inferPathProps to infer the types of path parameters and search parameters for a given path. This ensures that your components receive the correct types, enhancing type safety and reducing errors.
import { inferPathProps } from "type-safe-paths";
// Infer types for the path "/posts/details/:postId/:commentId"
type PathProps = inferPathProps<typeof paths, "/posts/details/:postId/:commentId">;
// Example component using inferred types
export default async function MyPage({ params, searchParams }: PathProps) {
// params and searchParams will have the correct types based on the defined schema
console.log(params.postId); // string
console.log(params.commentId); // string
console.log(searchParams.query); // string
console.log(searchParams.optional); // string
// Your component logic here
...
}
This approach ensures that params and searchParams in your component have the correct types as specified in the path definition, making your code more robust and maintainable.
You can create a type-safe link component using the inferLinkComponentProps utility function. This ensures that the link component receives the correct props based on the defined paths.
import Link from 'next/link'
import { TypeSafePaths, createPathHelpers, inferLinkComponentProps } from 'type-safe-paths'
import { forwardRef } from 'react'
// Create a new instance of TypeSafePaths
const paths = new TypeSafePaths({
// Your path definitions here
...
})
// Create a type-safe link component
const TypeSafeLink = forwardRef<
HTMLAnchorElement,
inferLinkComponentProps<typeof paths, typeof Link>
>((props, ref) => {
const { getHrefFromLinkComponentProps } = createPathHelpers(paths)
return (
<Link {...props} href={getHrefFromLinkComponentProps(props)} ref={ref} />
)
})
In this example, we create a TypeSafeLink component using forwardRef. The component receives props of type inferLinkComponentProps<typeof myPaths, typeof Link>, which infers the correct props based on the defined paths in myPaths.
Inside the component, we use the getHrefFromLinkComponentProps function from createPathHelpers to generate the href prop for the Link component based on the provided props.
Now you can use the TypeSafeLink component in your application, and it will ensure that the props you pass to it match the defined paths and their parameters.
<TypeSafeLink
href={{
pathname: "/posts/details/:postId/:commentId",
params: { postId: "123", commentId: "456" },
searchParams: { query: "example query" },
}}
>
Go to Comment
</TypeSafeLink>
The TypeSafeLink component will provide type safety and autocomplete suggestions for the path and params props based on your defined paths.
TypeSafePathsconstructor(args?: { metadataSchema?: TMetadataSchema })Creates an instance of TypeSafePaths with optional metadata schema.
add<TPath extends string, TSearchParams extends z.AnyZodObject | undefined>(path: TPath, opts: { searchParams?: TSearchParams, metadata: z.input<TMetadataSchema> })Adds a path to the registry with optional search parameters and metadata.
createPathHelpers(registry: TypeSafePaths)buildPath<TKey extends keyof TRegistry["$registry"]>(k: TKey, opts: { params: { [k in TRegistry["$registry"][TKey]["params"]]: string }, searchParams?: z.input<TRegistry["$registry"][TKey]["searchParams"]> })Builds a URL from a defined path and its parameters.
matchPath(pathname: string)Matches a URL against the defined paths and extracts metadata.
extractParamsFromPathName<TPath extends keyof TRegistry["$registry"]>(pathname: string, path: TPath)Extracts path parameters from a URL.
parseSearchParamsForPath<TPath extends keyof TRegistry["$registry"]>(searchParams: URLSearchParams, path: TPath)Parses and validates search parameters from a URL.
inferPathPropsinferPathProps<TRegistry extends TypeSafePaths<any, any>, TPath extends keyof TRegistry["$registry"]>Infers the types of path parameters and search parameters for a given path.
inferLinkComponentPropsinferLinkComponentProps<TRegistry extends TypeSafePaths<any, any>, TLinkComponent extends React.ComponentType<any>>Infers the props for a type-safe link component based on the defined paths and the underlying link component.
MIT
Contributions are welcome! Please open an issue or submit a pull request on GitHub.
This library was inspired by the need for a type-safe way to manage URL paths and parameters in modern web applications, leveraging the power of Zod for schema validation.
Feel free to reach out if you have any questions or need further assistance!
FAQs
TypeSafePaths is a TypeScript library that provides a type-safe way to manage URL paths and their parameters in a web application. It leverages the power of Zod for schema validation, ensuring that both path parameters and search parameters conform to spe
We found that type-safe-paths demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
npm confirmed a tooling bug incorrectly marked several one-character packages as security holders and said it was working on a rollback.

Research
/Security News
Newer packages in this compromise use native extensions and .pth loaders to execute JavaScript stealers in developer environments.

Research
Socket found 37 malicious PyPI wheels that abuse Python startup hooks to launch a Bun-powered credential stealer tied to Mini Shai-Hulud/Miasma.