Agent Skills: path-to-regexp v6 → v8 Migration

Migrate @data-client/rest path strings from path-to-regexp v6 to v8 syntax. Use when upgrading path-to-regexp, updating RestEndpoint.path or resource path strings, or when seeing errors about unexpected ?, +, (, or ) in paths.

UncategorizedID: reactive/data-client/path-to-regexp-v8-migration

Repository

reactiveLicense: Apache-2.0
2,02999

Install this agent skill to your local

pnpm dlx add-skill https://github.com/reactive/data-client/tree/HEAD/.cursor/skills/path-to-regexp-v8-migration

Skill Files

Browse the full folder contents for path-to-regexp-v8-migration.

Download Skill

Loading file tree…

.cursor/skills/path-to-regexp-v8-migration/SKILL.md

Skill Metadata

Name
path-to-regexp-v8-migration
Description
Migrate @data-client/rest path strings from path-to-regexp v6 to v8 syntax. Use when upgrading path-to-regexp, updating RestEndpoint.path or resource path strings, or when seeing errors about unexpected ?, +, (, or ) in paths.

path-to-regexp v6 → v8 Migration

Applies to path in RestEndpoint, resource(), and any string passed to path-to-regexp.

Reference: path-to-regexp README errors section

Migration Rules

Optional parameters

? suffix removed. Wrap the optional segment (including its prefix) in {}.

/:id?           →  {/:id}
/users/:id?     →  /users{/:id}
/files/:name?   →  /files{/:name}

Repeating parameters

+ (one-or-more) and * (zero-or-more) suffixes removed. Use *name wildcard syntax.

/:path+         →  /*path
/:path*         →  {/*path}

Quoted parameter names

Parameter names must be valid JS identifiers. Names with special characters need double quotes.

/:with-dash     →  /:"with-dash"
/:my.param      →  /:"my.param"

Escaping special characters

Characters including {}()[]+?!:*\\ must be escaped with \\ when used as literals (see path-to-regexp errors). A literal ? in the path (e.g. before fixed query text like ?per_page=50) must stay as \\? in the source string — removing the backslash causes Unexpected ? at compile() time.

/(literal)      →  /\\(literal\\)
/[bracket]      →  /\\[bracket\\]
/a+b            →  /a\\+b               (+ is special unless escaped)
/resource?p=1   →  /resource\\?p=1      (? starts a modifier unless escaped)

Optional path params no longer use a trailing ? on :name — use {/:name} instead (see above); that is different from a literal ? in the URL.

Custom regex removed

Inline regex like /:id(\d+) is no longer supported. Remove regex patterns.

/:id(\d+)       →  /:id

Combined Examples

Optional with prefix:

/:attr1?{-:attr2}?{-:attr3}?   →  {/:attr1}{-:attr2}{-:attr3}

Query params embedded in path (prefer grouped params; do not drop \\ before a literal ? unless you rewrite to this form):

/search\\?q=:q?&page=:page?    →  /search?{q=:q}{&page=:page}

Where to Find Paths

Search patterns for locating v6 paths in a codebase:

  • path: properties in RestEndpoint, resource(), .extend() calls
  • Docs under docs/rest/api/
  • Type tests in typescript-tests/
  • Blog posts and changelogs with code examples

Type System

pathTypes.ts infers TypeScript parameter types from path strings:

  • :name and *name → required parameter
  • {/:name} and {/*name} → optional parameter (trailing } signals optionality)
  • :"quoted"CleanKey strips quotes for the property name
  • \\: / \\* / \\} → escaped, not treated as parameters