From 2d96275a67c33b082a0eb2240f265cee117c3470 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sat, 5 Jul 2025 00:23:47 +0300 Subject: [PATCH 01/16] feat: parseAsTuple (#1036) --- packages/nuqs/src/parsers.test.ts | 32 ++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/nuqs/src/parsers.test.ts b/packages/nuqs/src/parsers.test.ts index 9ee8ab14e..20bb2d3c1 100644 --- a/packages/nuqs/src/parsers.test.ts +++ b/packages/nuqs/src/parsers.test.ts @@ -17,7 +17,8 @@ import { parseAsString, parseAsStringEnum, parseAsStringLiteral, - parseAsTimestamp + parseAsTimestamp, + parseAsTuple } from './parsers' import { isParserBijective, @@ -300,6 +301,25 @@ describe('parsers', () => { isParserBijective(parser, 'not-an-array', ['a', 'b']) ).toThrow() }) + it.only('parseAsTuple', () => { + const parser = parseAsTuple([parseAsInteger, parseAsString, parseAsBoolean]) + expect(parser.parse('1,a,false,will-ignore')).toStrictEqual([1, 'a', false]) + expect(parser.parse('not-a-number,a,true')).toBeNull() + expect(parser.parse('1,a')).toBeNull() + // @ts-expect-error - Tuple length is less than 2 + expect(() => parseAsTuple([parseAsInteger])).toThrow() + expect(parser.serialize([1, 'a', true])).toBe('1,a,true') + // @ts-expect-error - Tuple length mismatch + expect(() => parser.serialize([1, 'a'])).toThrow() + expect(testParseThenSerialize(parser, '1,a,true')).toBe(true) + expect(testSerializeThenParse(parser, [1, 'a', true] as const)).toBe(true) + expect(isParserBijective(parser, '1,a,true', [1, 'a', true] as const)).toBe( + true + ) + expect(() => + isParserBijective(parser, 'not-a-tuple', [1, 'a', true] as const) + ).toThrow() + }) describe('parseAsNativeArrayOf', () => { it('serializes', () => { @@ -374,4 +394,14 @@ describe('parsers/equality', () => { expect(eq([], ['foo'])).toBe(false) expect(eq(['foo'], ['bar'])).toBe(false) }) + it.only('parseAsTuple', () => { + const eq = parseAsTuple([parseAsInteger, parseAsBoolean]).eq! + expect(eq([1, true], [1, true])).toBe(true) + expect(eq([1, true], [1, false])).toBe(false) + expect(eq([1, true], [2, true])).toBe(false) + // @ts-expect-error - Tuple length mismatch + expect(eq([1, true], [1])).toBe(false) + // @ts-expect-error - Tuple length mismatch + expect(eq([1], [1])).toBe(false) + }) }) From 1fea0c1b1c9e8a8adb18512df005d81893fc30e6 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sat, 25 Oct 2025 14:36:02 +0300 Subject: [PATCH 02/16] feat: add registry package with parseAsTuple item --- packages/nuqs/package.json | 8 +- packages/nuqs/src/lib/index.ts | 1 + packages/nuqs/tsdown.config.ts | 3 +- packages/registry/.gitignore | 1 + packages/registry/package.json | 11 + packages/registry/parsers/parseAsTuple.ts | 74 +++++++ packages/registry/registry.json | 21 ++ packages/registry/tsconfig.json | 37 ++++ pnpm-lock.yaml | 240 +++++++++++++++++++++- 9 files changed, 393 insertions(+), 3 deletions(-) create mode 100644 packages/nuqs/src/lib/index.ts create mode 100644 packages/registry/.gitignore create mode 100644 packages/registry/package.json create mode 100644 packages/registry/parsers/parseAsTuple.ts create mode 100644 packages/registry/registry.json create mode 100644 packages/registry/tsconfig.json diff --git a/packages/nuqs/package.json b/packages/nuqs/package.json index 5f8d0f931..2b38a13a1 100644 --- a/packages/nuqs/package.json +++ b/packages/nuqs/package.json @@ -48,7 +48,8 @@ "adapters/react-router/v7.d.ts", "adapters/tanstack-router.d.ts", "adapters/custom.d.ts", - "adapters/testing.d.ts" + "adapters/testing.d.ts", + "lib/index.d.ts" ], "type": "module", "sideEffects": false, @@ -125,6 +126,11 @@ "types": "./dist/adapters/testing.d.ts", "import": "./dist/adapters/testing.js", "default": "./dist/adapters/testing.js" + }, + "./lib": { + "types": "./dist/lib.d.ts", + "import": "./dist/lib.js", + "default": "./dist/lib.js" } }, "scripts": { diff --git a/packages/nuqs/src/lib/index.ts b/packages/nuqs/src/lib/index.ts new file mode 100644 index 000000000..721dad157 --- /dev/null +++ b/packages/nuqs/src/lib/index.ts @@ -0,0 +1 @@ +export * from './safe-parse' diff --git a/packages/nuqs/tsdown.config.ts b/packages/nuqs/tsdown.config.ts index 3490ba574..5c85c95bc 100644 --- a/packages/nuqs/tsdown.config.ts +++ b/packages/nuqs/tsdown.config.ts @@ -32,7 +32,8 @@ const entrypoints = { 'adapters/react-router/v7': 'src/adapters/react-router/v7.ts', 'adapters/tanstack-router': 'src/adapters/tanstack-router.ts', 'adapters/custom': 'src/adapters/custom.ts', - 'adapters/testing': 'src/adapters/testing.ts' + 'adapters/testing': 'src/adapters/testing.ts', + lib: 'src/lib/index.ts' }, server: { server: 'src/index.server.ts', diff --git a/packages/registry/.gitignore b/packages/registry/.gitignore new file mode 100644 index 000000000..a0cac096e --- /dev/null +++ b/packages/registry/.gitignore @@ -0,0 +1 @@ +public/r/ \ No newline at end of file diff --git a/packages/registry/package.json b/packages/registry/package.json new file mode 100644 index 000000000..9093c6812 --- /dev/null +++ b/packages/registry/package.json @@ -0,0 +1,11 @@ +{ + "name": "registry", + "description": "Shadcn CLI registry for community parsers & utilities", + "scripts": { + "build": "shadcn build" + }, + "dependencies": { + "shadcn": "^3.3.1", + "nuqs": "workspace:*" + } +} diff --git a/packages/registry/parsers/parseAsTuple.ts b/packages/registry/parsers/parseAsTuple.ts new file mode 100644 index 000000000..78299fcff --- /dev/null +++ b/packages/registry/parsers/parseAsTuple.ts @@ -0,0 +1,74 @@ +import { createParser, type SingleParserBuilder } from 'nuqs' +import { safeParse } from 'nuqs/lib' + +type ParserTuple = { + [K in keyof T]: SingleParserBuilder +} & { length: 2 | 3 | 4 | 5 | 6 | 7 | 8 } + +/** + * Parse a comma-separated tuple with type-safe positions. + * Items are URI-encoded for safety, so they may not look nice in the URL. + * allowed tuple length is 2-8. + * + * @param itemParsers Tuple of parsers for each position in the tuple + * @param separator The character to use to separate items (default ',') + */ +export function parseAsTuple( + itemParsers: ParserTuple, + separator = ',' +): SingleParserBuilder { + const encodedSeparator = encodeURIComponent(separator) + if (itemParsers.length < 2 || itemParsers.length > 8) { + throw new Error( + `Tuple length must be between 2 and 8, got ${itemParsers.length}` + ) + } + return createParser({ + parse: query => { + if (query === '') { + return null + } + const parts = query.split(separator) + if (parts.length < itemParsers.length) { + return null + } + // iterating by parsers instead of parts, any additional parts are ignored. + const result = itemParsers.map( + (parser, index) => + safeParse( + parser.parse, + parts[index]!.replaceAll(encodedSeparator, separator), + `[${index}]` + ) as T[number] | null + ) + return result.some(x => x === null) ? null : (result as T) + }, + serialize: (values: T) => { + if (values.length !== itemParsers.length) { + throw new Error( + `Tuple length mismatch: expected ${itemParsers.length}, got ${values.length}` + ) + } + return values + .map((value, index) => { + const parser = itemParsers[index]! + const str = parser.serialize ? parser.serialize(value) : String(value) + return str.replaceAll(separator, encodedSeparator) + }) + .join(separator) + }, + eq(a: T, b: T) { + if (a === b) { + return true + } + if (a.length !== b.length || a.length !== itemParsers.length) { + return false + } + return a.every((value, index) => { + const parser = itemParsers[index]! + const itemEq = parser.eq ?? ((x, y) => x === y) + return itemEq(value, b[index]) + }) + } + }) +} diff --git a/packages/registry/registry.json b/packages/registry/registry.json new file mode 100644 index 000000000..d24e6db4b --- /dev/null +++ b/packages/registry/registry.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "nuqs", + "homepage": "https://nuqs.dev", + "items": [ + { + "name": "parseAsTuple", + "type": "registry:file", + "title": "parseAsTuple", + "description": "Parse query string as a tuple of values.", + "dependencies": ["nuqs"], + "files": [ + { + "path": "parsers/parseAsTuple.ts", + "type": "registry:file", + "target": "~/components/parsers/parseAsTuple.ts" + } + ] + } + ] +} diff --git a/packages/registry/tsconfig.json b/packages/registry/tsconfig.json new file mode 100644 index 000000000..2ad913fe7 --- /dev/null +++ b/packages/registry/tsconfig.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "jsx": "react", + // Type checking + "strict": true, + "noUncheckedIndexedAccess": true, + "alwaysStrict": false, // Don't emit "use strict" to avoid conflicts with "use client" + // Modules + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + // Language & Environment + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + // Emit + "noEmit": true, + "declaration": true, + "declarationMap": true, + "verbatimModuleSyntax": true, + "isolatedDeclarations": true, + "moduleDetection": "force", + + "downlevelIteration": true, + // Interop + "isolatedModules": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + // Misc + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "incremental": true, + "tsBuildInfoFile": ".tsbuildinfo" + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ebf1c437..eae00c372 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -765,6 +765,15 @@ importers: specifier: ^4.1.5 version: 4.1.5 + packages/registry: + dependencies: + nuqs: + specifier: workspace:* + version: link:../nuqs + shadcn: + specifier: ^3.3.1 + version: 3.3.1(@types/node@24.3.0)(typescript@5.9.2) + packages/res: {} packages/scripts: @@ -973,6 +982,12 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1869,10 +1884,23 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@1.0.0': + resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} + engines: {node: '>=18'} + '@inquirer/ansi@1.0.1': resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==} engines: {node: '>=18'} + '@inquirer/confirm@5.1.18': + resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/confirm@5.1.19': resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} engines: {node: '>=18'} @@ -1882,6 +1910,15 @@ packages: '@types/node': optional: true + '@inquirer/core@10.2.2': + resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/core@10.3.0': resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==} engines: {node: '>=18'} @@ -1891,10 +1928,23 @@ packages: '@types/node': optional: true + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + '@inquirer/figures@1.0.14': resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} engines: {node: '>=18'} + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/type@3.0.9': resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==} engines: {node: '>=18'} @@ -1965,10 +2015,18 @@ packages: '@mjackson/node-fetch-server@0.7.0': resolution: {integrity: sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==} + '@modelcontextprotocol/sdk@1.18.2': + resolution: {integrity: sha512-beedclIvFcCnPrYgHsylqiYJVJ/CI47Vyc4tY8no1/Li/O8U4BTlJfy6ZwxkYwx+Mx10nrgwSVrA7VBbhh4slg==} + engines: {node: '>=18'} + '@modelcontextprotocol/sdk@1.20.1': resolution: {integrity: sha512-j/P+yuxXfgxb+mW7OEoRCM3G47zCTDqUPivJo/VzpjbG8I9csTXtOprCf5FfOfHK4whOJny0aHuBEON+kS7CCA==} engines: {node: '>=18'} + '@mswjs/interceptors@0.39.7': + resolution: {integrity: sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==} + engines: {node: '>=18'} + '@mswjs/interceptors@0.40.0': resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} @@ -4285,6 +4343,10 @@ packages: resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} hasBin: true + baseline-browser-mapping@2.8.9: + resolution: {integrity: sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==} + hasBin: true + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -4337,6 +4399,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + browserslist@4.26.3: resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -4390,6 +4457,9 @@ packages: caniuse-lite@1.0.30001736: resolution: {integrity: sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==} + caniuse-lite@1.0.30001745: + resolution: {integrity: sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==} + caniuse-lite@1.0.30001751: resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} @@ -5008,6 +5078,9 @@ packages: electron-to-chromium@1.5.207: resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} + electron-to-chromium@1.5.227: + resolution: {integrity: sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==} + electron-to-chromium@1.5.237: resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} @@ -6893,6 +6966,16 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.11.3: + resolution: {integrity: sha512-878imp8jxIpfzuzxYfX0qqTq1IFQz/1/RBHs/PyirSjzi+xKM/RRfIpIqHSCWjH0GxidrjhgiiXC+DWXNDvT9w==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + msw@2.11.6: resolution: {integrity: sha512-MCYMykvmiYScyUm7I6y0VCxpNq1rgd5v7kG8ks5dKtvmxRUUPjribX6mUoUNBbM5/3PhUyoelEWiKXGOz84c+w==} engines: {node: '>=18'} @@ -6996,6 +7079,9 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.25: resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} @@ -8200,6 +8286,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shadcn@3.3.1: + resolution: {integrity: sha512-sgai5gahy/TiyTiqJEwIFpAuPhmkpt7sGVdRfcmNH53Yc3yI57+zFVmIaqbTST0jP/7tSqZuI0aSllXL2HIw5w==} + hasBin: true + shadcn@3.4.2: resolution: {integrity: sha512-afa1UIHC9UzWX2NMHHwaZf6GfT5VGkTDen77RtyUBMfJ5i6ZQuzXOFTE1bFHTaWwftb8wQnMiG8kXdEu3Kx9IQ==} hasBin: true @@ -9511,7 +9601,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.3 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -9672,6 +9762,14 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + '@colors/colors@1.5.0': optional: true @@ -10311,8 +10409,17 @@ snapshots: '@img/sharp-win32-x64@0.34.3': optional: true + '@inquirer/ansi@1.0.0': {} + '@inquirer/ansi@1.0.1': {} + '@inquirer/confirm@5.1.18(@types/node@24.3.0)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.3.0) + '@inquirer/type': 3.0.8(@types/node@24.3.0) + optionalDependencies: + '@types/node': 24.3.0 + '@inquirer/confirm@5.1.19(@types/node@24.3.0)': dependencies: '@inquirer/core': 10.3.0(@types/node@24.3.0) @@ -10320,6 +10427,19 @@ snapshots: optionalDependencies: '@types/node': 24.3.0 + '@inquirer/core@10.2.2(@types/node@24.3.0)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.3.0) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.3.0 + '@inquirer/core@10.3.0(@types/node@24.3.0)': dependencies: '@inquirer/ansi': 1.0.1 @@ -10333,8 +10453,14 @@ snapshots: optionalDependencies: '@types/node': 24.3.0 + '@inquirer/figures@1.0.13': {} + '@inquirer/figures@1.0.14': {} + '@inquirer/type@3.0.8(@types/node@24.3.0)': + optionalDependencies: + '@types/node': 24.3.0 + '@inquirer/type@3.0.9(@types/node@24.3.0)': optionalDependencies: '@types/node': 24.3.0 @@ -10457,6 +10583,23 @@ snapshots: '@mjackson/node-fetch-server@0.7.0': {} + '@modelcontextprotocol/sdk@1.18.2': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@modelcontextprotocol/sdk@1.20.1': dependencies: ajv: 6.12.6 @@ -10474,6 +10617,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@mswjs/interceptors@0.39.7': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@mswjs/interceptors@0.40.0': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -13205,6 +13357,8 @@ snapshots: baseline-browser-mapping@2.8.18: {} + baseline-browser-mapping@2.8.9: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -13281,6 +13435,14 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.3) + browserslist@4.26.2: + dependencies: + baseline-browser-mapping: 2.8.9 + caniuse-lite: 1.0.30001745 + electron-to-chromium: 1.5.227 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) + browserslist@4.26.3: dependencies: baseline-browser-mapping: 2.8.18 @@ -13342,6 +13504,8 @@ snapshots: caniuse-lite@1.0.30001736: {} + caniuse-lite@1.0.30001745: {} + caniuse-lite@1.0.30001751: {} caseless@0.12.0: {} @@ -13925,6 +14089,8 @@ snapshots: electron-to-chromium@1.5.207: {} + electron-to-chromium@1.5.227: {} + electron-to-chromium@1.5.237: {} emoji-regex@10.6.0: {} @@ -16422,6 +16588,32 @@ snapshots: ms@2.1.3: {} + msw@2.11.3(@types/node@24.3.0)(typescript@5.9.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@inquirer/confirm': 5.1.18(@types/node@24.3.0) + '@mswjs/interceptors': 0.39.7 + '@open-draft/deferred-promise': 2.2.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.11.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.7.0 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 4.41.0 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@types/node' + msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2): dependencies: '@inquirer/confirm': 5.1.19(@types/node@24.3.0) @@ -16576,6 +16768,8 @@ snapshots: node-releases@2.0.19: {} + node-releases@2.0.21: {} + node-releases@2.0.25: {} normalize-package-data@5.0.0: @@ -17825,6 +18019,44 @@ snapshots: setprototypeof@1.2.0: {} + shadcn@3.3.1(@types/node@24.3.0)(typescript@5.9.2): + dependencies: + '@antfu/ni': 25.0.0 + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@dotenvx/dotenvx': 1.51.0 + '@modelcontextprotocol/sdk': 1.18.2 + browserslist: 4.26.2 + commander: 14.0.1 + cosmiconfig: 9.0.0(typescript@5.9.2) + dedent: 1.6.0 + deepmerge: 4.3.1 + diff: 8.0.2 + execa: 9.6.0 + fast-glob: 3.3.3 + fs-extra: 11.3.1 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + msw: 2.11.3(@types/node@24.3.0)(typescript@5.9.2) + node-fetch: 3.3.2 + ora: 8.2.0 + postcss: 8.5.6 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - typescript + shadcn@3.4.2(@types/node@24.3.0)(typescript@5.9.2): dependencies: '@antfu/ni': 25.0.0 @@ -18697,6 +18929,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.26.2): + dependencies: + browserslist: 4.26.2 + escalade: 3.2.0 + picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: browserslist: 4.26.3 From 0743e8cc120ad88136c53d5d2a0fa55c56e6d67a Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sat, 25 Oct 2025 15:01:55 +0300 Subject: [PATCH 03/16] feat: remove parseAsTuple from parsers.test.ts --- packages/nuqs/src/parsers.test.ts | 32 +------------------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/packages/nuqs/src/parsers.test.ts b/packages/nuqs/src/parsers.test.ts index 20bb2d3c1..9ee8ab14e 100644 --- a/packages/nuqs/src/parsers.test.ts +++ b/packages/nuqs/src/parsers.test.ts @@ -17,8 +17,7 @@ import { parseAsString, parseAsStringEnum, parseAsStringLiteral, - parseAsTimestamp, - parseAsTuple + parseAsTimestamp } from './parsers' import { isParserBijective, @@ -301,25 +300,6 @@ describe('parsers', () => { isParserBijective(parser, 'not-an-array', ['a', 'b']) ).toThrow() }) - it.only('parseAsTuple', () => { - const parser = parseAsTuple([parseAsInteger, parseAsString, parseAsBoolean]) - expect(parser.parse('1,a,false,will-ignore')).toStrictEqual([1, 'a', false]) - expect(parser.parse('not-a-number,a,true')).toBeNull() - expect(parser.parse('1,a')).toBeNull() - // @ts-expect-error - Tuple length is less than 2 - expect(() => parseAsTuple([parseAsInteger])).toThrow() - expect(parser.serialize([1, 'a', true])).toBe('1,a,true') - // @ts-expect-error - Tuple length mismatch - expect(() => parser.serialize([1, 'a'])).toThrow() - expect(testParseThenSerialize(parser, '1,a,true')).toBe(true) - expect(testSerializeThenParse(parser, [1, 'a', true] as const)).toBe(true) - expect(isParserBijective(parser, '1,a,true', [1, 'a', true] as const)).toBe( - true - ) - expect(() => - isParserBijective(parser, 'not-a-tuple', [1, 'a', true] as const) - ).toThrow() - }) describe('parseAsNativeArrayOf', () => { it('serializes', () => { @@ -394,14 +374,4 @@ describe('parsers/equality', () => { expect(eq([], ['foo'])).toBe(false) expect(eq(['foo'], ['bar'])).toBe(false) }) - it.only('parseAsTuple', () => { - const eq = parseAsTuple([parseAsInteger, parseAsBoolean]).eq! - expect(eq([1, true], [1, true])).toBe(true) - expect(eq([1, true], [1, false])).toBe(false) - expect(eq([1, true], [2, true])).toBe(false) - // @ts-expect-error - Tuple length mismatch - expect(eq([1, true], [1])).toBe(false) - // @ts-expect-error - Tuple length mismatch - expect(eq([1], [1])).toBe(false) - }) }) From 0818109667e7c6f32768077d5d1515f0e2d8d616 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sat, 25 Oct 2025 15:06:19 +0300 Subject: [PATCH 04/16] doc: add README to registry --- packages/registry/README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 packages/registry/README.md diff --git a/packages/registry/README.md b/packages/registry/README.md new file mode 100644 index 000000000..06b73ffea --- /dev/null +++ b/packages/registry/README.md @@ -0,0 +1,31 @@ +# registry + +A shadcn/ui compatible registry for community parsers and utilities for the [nuqs](https://nuqs.dev) library. + +## Development + +```bash +# Install dependencies +pnpm install + +# Build the registry +pnpm build + +# Run the registry (using serve or any other static file server) +serve public -p 3000 + +``` + +Usage example in any npm package: + +```bash +pnpm dlx shadcn@latest add http://localhost:3000/r/parseAsTuple.json +``` + +## Learn More + +To learn more about nuqs and shadcn/ui registries, take a look at the following resources: + +- [nuqs Documentation](https://nuqs.dev) - learn about nuqs features and API +- [shadcn/ui Registry Documentation](https://ui.shadcn.com/docs/registry) - learn about shadcn/ui registries +- [nuqs GitHub Repository](https://github.com/47ng/nuqs) - source code and issues From 53c8d9944cabb3b52d954c0301a3d7d3697a189b Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 26 Oct 2025 13:58:21 +0300 Subject: [PATCH 05/16] doc(registry): add usage example for parseAsTuple parser --- packages/registry/parsers/parseAsTuple.usage.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 packages/registry/parsers/parseAsTuple.usage.md diff --git a/packages/registry/parsers/parseAsTuple.usage.md b/packages/registry/parsers/parseAsTuple.usage.md new file mode 100644 index 000000000..0156684ec --- /dev/null +++ b/packages/registry/parsers/parseAsTuple.usage.md @@ -0,0 +1,14 @@ +## Tuples + +The `parseAsTuple` parser allows you to parse fixed-length tuples with **any type** for each position. + +```ts +import { parseAsInteger } from 'nuqs' +import { parseAsTuple } from '~/components/parsers/parseAsTuple' + +// Coordinates tuple (x, y) +parseAsTuple([parseAsInteger, parseAsInteger]) + +// Optionally, customise the separator +parseAsTuple([parseAsInteger, parseAsInteger], ';') +``` From ab207907ee2d4f2325ad4ee863f587305af24f07 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 26 Oct 2025 13:59:07 +0300 Subject: [PATCH 06/16] test(registry): update shadcn to 3.4.2, add vitest for testing, and implement parseAsTuple tests --- packages/registry/package.json | 10 +- .../registry/parsers/parseAsTuple.test.ts | 41 ++++ packages/registry/vitest.config.ts | 11 + pnpm-lock.yaml | 200 +----------------- turbo.json | 3 + 5 files changed, 72 insertions(+), 193 deletions(-) create mode 100644 packages/registry/parsers/parseAsTuple.test.ts create mode 100644 packages/registry/vitest.config.ts diff --git a/packages/registry/package.json b/packages/registry/package.json index 9093c6812..002fcad95 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -2,10 +2,16 @@ "name": "registry", "description": "Shadcn CLI registry for community parsers & utilities", "scripts": { - "build": "shadcn build" + "build": "shadcn build", + "test": "pnpm run --stream '/^test:/'", + "test:unit": "vitest run --typecheck" }, "dependencies": { - "shadcn": "^3.3.1", + "shadcn": "^3.4.2", "nuqs": "workspace:*" + }, + "devDependencies": { + "vitest": "^3.2.4", + "typescript": "^5.9.2" } } diff --git a/packages/registry/parsers/parseAsTuple.test.ts b/packages/registry/parsers/parseAsTuple.test.ts new file mode 100644 index 000000000..1380ae531 --- /dev/null +++ b/packages/registry/parsers/parseAsTuple.test.ts @@ -0,0 +1,41 @@ +import { parseAsBoolean, parseAsInteger, parseAsString } from 'nuqs' +import { + isParserBijective, + testParseThenSerialize, + testSerializeThenParse +} from 'nuqs/testing' +import { describe, expect, it } from 'vitest' +import { parseAsTuple } from './parseAsTuple' + +describe('parseAsTuple', () => { + it('parses and serializes tuples correctly', () => { + const parser = parseAsTuple([parseAsInteger, parseAsString, parseAsBoolean]) + expect(parser.parse('1,a,false,will-ignore')).toStrictEqual([1, 'a', false]) + expect(parser.parse('not-a-number,a,true')).toBeNull() + expect(parser.parse('1,a')).toBeNull() + // @ts-expect-error - Tuple length is less than 2 + expect(() => parseAsTuple([parseAsInteger])).toThrow() + expect(parser.serialize([1, 'a', true])).toBe('1,a,true') + // @ts-expect-error - Tuple length mismatch + expect(() => parser.serialize([1, 'a'])).toThrow() + expect(testParseThenSerialize(parser, '1,a,true')).toBe(true) + expect(testSerializeThenParse(parser, [1, 'a', true] as const)).toBe(true) + expect(isParserBijective(parser, '1,a,true', [1, 'a', true] as const)).toBe( + true + ) + expect(() => + isParserBijective(parser, 'not-a-tuple', [1, 'a', true] as const) + ).toThrow() + }) + + it('equality comparison works correctly', () => { + const eq = parseAsTuple([parseAsInteger, parseAsBoolean]).eq! + expect(eq([1, true], [1, true])).toBe(true) + expect(eq([1, true], [1, false])).toBe(false) + expect(eq([1, true], [2, true])).toBe(false) + // @ts-expect-error - Tuple length mismatch + expect(eq([1, true], [1])).toBe(false) + // @ts-expect-error - Tuple length mismatch + expect(eq([1], [1])).toBe(false) + }) +}) diff --git a/packages/registry/vitest.config.ts b/packages/registry/vitest.config.ts new file mode 100644 index 000000000..6e0d39b6a --- /dev/null +++ b/packages/registry/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig, type ViteUserConfig } from 'vitest/config' + +const config: ViteUserConfig = defineConfig({ + test: { + typecheck: { + tsconfig: './tsconfig.json' + } + } +}) + +export default config diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eae00c372..1ab39b763 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -771,8 +771,15 @@ importers: specifier: workspace:* version: link:../nuqs shadcn: - specifier: ^3.3.1 - version: 3.3.1(@types/node@24.3.0)(typescript@5.9.2) + specifier: ^3.4.2 + version: 3.4.2(@types/node@24.3.0)(typescript@5.9.2) + devDependencies: + typescript: + specifier: ^5.9.2 + version: 5.9.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) packages/res: {} @@ -982,12 +989,6 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@bundled-es-modules/cookie@2.0.1': - resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} - - '@bundled-es-modules/statuses@1.0.1': - resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1884,23 +1885,10 @@ packages: cpu: [x64] os: [win32] - '@inquirer/ansi@1.0.0': - resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} - engines: {node: '>=18'} - '@inquirer/ansi@1.0.1': resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==} engines: {node: '>=18'} - '@inquirer/confirm@5.1.18': - resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/confirm@5.1.19': resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} engines: {node: '>=18'} @@ -1910,15 +1898,6 @@ packages: '@types/node': optional: true - '@inquirer/core@10.2.2': - resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/core@10.3.0': resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==} engines: {node: '>=18'} @@ -1928,23 +1907,10 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.13': - resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} - engines: {node: '>=18'} - '@inquirer/figures@1.0.14': resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} engines: {node: '>=18'} - '@inquirer/type@3.0.8': - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/type@3.0.9': resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==} engines: {node: '>=18'} @@ -2015,18 +1981,10 @@ packages: '@mjackson/node-fetch-server@0.7.0': resolution: {integrity: sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==} - '@modelcontextprotocol/sdk@1.18.2': - resolution: {integrity: sha512-beedclIvFcCnPrYgHsylqiYJVJ/CI47Vyc4tY8no1/Li/O8U4BTlJfy6ZwxkYwx+Mx10nrgwSVrA7VBbhh4slg==} - engines: {node: '>=18'} - '@modelcontextprotocol/sdk@1.20.1': resolution: {integrity: sha512-j/P+yuxXfgxb+mW7OEoRCM3G47zCTDqUPivJo/VzpjbG8I9csTXtOprCf5FfOfHK4whOJny0aHuBEON+kS7CCA==} engines: {node: '>=18'} - '@mswjs/interceptors@0.39.7': - resolution: {integrity: sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==} - engines: {node: '>=18'} - '@mswjs/interceptors@0.40.0': resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} @@ -6966,16 +6924,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.11.3: - resolution: {integrity: sha512-878imp8jxIpfzuzxYfX0qqTq1IFQz/1/RBHs/PyirSjzi+xKM/RRfIpIqHSCWjH0GxidrjhgiiXC+DWXNDvT9w==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.8.x' - peerDependenciesMeta: - typescript: - optional: true - msw@2.11.6: resolution: {integrity: sha512-MCYMykvmiYScyUm7I6y0VCxpNq1rgd5v7kG8ks5dKtvmxRUUPjribX6mUoUNBbM5/3PhUyoelEWiKXGOz84c+w==} engines: {node: '>=18'} @@ -8286,10 +8234,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@3.3.1: - resolution: {integrity: sha512-sgai5gahy/TiyTiqJEwIFpAuPhmkpt7sGVdRfcmNH53Yc3yI57+zFVmIaqbTST0jP/7tSqZuI0aSllXL2HIw5w==} - hasBin: true - shadcn@3.4.2: resolution: {integrity: sha512-afa1UIHC9UzWX2NMHHwaZf6GfT5VGkTDen77RtyUBMfJ5i6ZQuzXOFTE1bFHTaWwftb8wQnMiG8kXdEu3Kx9IQ==} hasBin: true @@ -9762,14 +9706,6 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@bundled-es-modules/cookie@2.0.1': - dependencies: - cookie: 0.7.2 - - '@bundled-es-modules/statuses@1.0.1': - dependencies: - statuses: 2.0.1 - '@colors/colors@1.5.0': optional: true @@ -10409,17 +10345,8 @@ snapshots: '@img/sharp-win32-x64@0.34.3': optional: true - '@inquirer/ansi@1.0.0': {} - '@inquirer/ansi@1.0.1': {} - '@inquirer/confirm@5.1.18(@types/node@24.3.0)': - dependencies: - '@inquirer/core': 10.2.2(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - optionalDependencies: - '@types/node': 24.3.0 - '@inquirer/confirm@5.1.19(@types/node@24.3.0)': dependencies: '@inquirer/core': 10.3.0(@types/node@24.3.0) @@ -10427,19 +10354,6 @@ snapshots: optionalDependencies: '@types/node': 24.3.0 - '@inquirer/core@10.2.2(@types/node@24.3.0)': - dependencies: - '@inquirer/ansi': 1.0.0 - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.3.0 - '@inquirer/core@10.3.0(@types/node@24.3.0)': dependencies: '@inquirer/ansi': 1.0.1 @@ -10453,14 +10367,8 @@ snapshots: optionalDependencies: '@types/node': 24.3.0 - '@inquirer/figures@1.0.13': {} - '@inquirer/figures@1.0.14': {} - '@inquirer/type@3.0.8(@types/node@24.3.0)': - optionalDependencies: - '@types/node': 24.3.0 - '@inquirer/type@3.0.9(@types/node@24.3.0)': optionalDependencies: '@types/node': 24.3.0 @@ -10583,23 +10491,6 @@ snapshots: '@mjackson/node-fetch-server@0.7.0': {} - '@modelcontextprotocol/sdk@1.18.2': - dependencies: - ajv: 6.12.6 - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.1 - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) - transitivePeerDependencies: - - supports-color - '@modelcontextprotocol/sdk@1.20.1': dependencies: ajv: 6.12.6 @@ -10617,15 +10508,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@mswjs/interceptors@0.39.7': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - '@mswjs/interceptors@0.40.0': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -16588,32 +16470,6 @@ snapshots: ms@2.1.3: {} - msw@2.11.3(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - '@bundled-es-modules/cookie': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@inquirer/confirm': 5.1.18(@types/node@24.3.0) - '@mswjs/interceptors': 0.39.7 - '@open-draft/deferred-promise': 2.2.0 - '@types/cookie': 0.6.0 - '@types/statuses': 2.0.6 - graphql: 16.11.0 - headers-polyfill: 4.0.3 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - rettime: 0.7.0 - strict-event-emitter: 0.5.1 - tough-cookie: 6.0.0 - type-fest: 4.41.0 - until-async: 3.0.2 - yargs: 17.7.2 - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - '@types/node' - msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2): dependencies: '@inquirer/confirm': 5.1.19(@types/node@24.3.0) @@ -18019,44 +17875,6 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@3.3.1(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - '@antfu/ni': 25.0.0 - '@babel/core': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) - '@dotenvx/dotenvx': 1.51.0 - '@modelcontextprotocol/sdk': 1.18.2 - browserslist: 4.26.2 - commander: 14.0.1 - cosmiconfig: 9.0.0(typescript@5.9.2) - dedent: 1.6.0 - deepmerge: 4.3.1 - diff: 8.0.2 - execa: 9.6.0 - fast-glob: 3.3.3 - fs-extra: 11.3.1 - fuzzysort: 3.1.0 - https-proxy-agent: 7.0.6 - kleur: 4.1.5 - msw: 2.11.3(@types/node@24.3.0)(typescript@5.9.2) - node-fetch: 3.3.2 - ora: 8.2.0 - postcss: 8.5.6 - prompts: 2.4.2 - recast: 0.23.11 - stringify-object: 5.0.0 - ts-morph: 26.0.0 - tsconfig-paths: 4.2.0 - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - typescript - shadcn@3.4.2(@types/node@24.3.0)(typescript@5.9.2): dependencies: '@antfu/ni': 25.0.0 diff --git a/turbo.json b/turbo.json index fc8202062..48c725199 100644 --- a/turbo.json +++ b/turbo.json @@ -69,6 +69,9 @@ "outputs": ["dist/**", "coverage/**"], "dependsOn": ["build"] }, + "registry#test": { + "dependsOn": ["^build"] + }, "docs#test": { "dependsOn": ["^build"] }, From 09a0eee31babe2a906f138d50f48fdb0841504af Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 26 Oct 2025 14:14:54 +0300 Subject: [PATCH 07/16] feat(registry): move safe-parse util to registry package, restructure files --- packages/nuqs/package.json | 8 +------- packages/nuqs/tsdown.config.ts | 3 +-- packages/registry/lib/nuqs-safe-parse.ts | 18 ++++++++++++++++++ .../{ => lib}/parsers/parseAsTuple.test.ts | 0 .../registry/{ => lib}/parsers/parseAsTuple.ts | 4 ++-- .../{ => lib}/parsers/parseAsTuple.usage.md | 0 6 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 packages/registry/lib/nuqs-safe-parse.ts rename packages/registry/{ => lib}/parsers/parseAsTuple.test.ts (100%) rename packages/registry/{ => lib}/parsers/parseAsTuple.ts (96%) rename packages/registry/{ => lib}/parsers/parseAsTuple.usage.md (100%) diff --git a/packages/nuqs/package.json b/packages/nuqs/package.json index 2b38a13a1..5f8d0f931 100644 --- a/packages/nuqs/package.json +++ b/packages/nuqs/package.json @@ -48,8 +48,7 @@ "adapters/react-router/v7.d.ts", "adapters/tanstack-router.d.ts", "adapters/custom.d.ts", - "adapters/testing.d.ts", - "lib/index.d.ts" + "adapters/testing.d.ts" ], "type": "module", "sideEffects": false, @@ -126,11 +125,6 @@ "types": "./dist/adapters/testing.d.ts", "import": "./dist/adapters/testing.js", "default": "./dist/adapters/testing.js" - }, - "./lib": { - "types": "./dist/lib.d.ts", - "import": "./dist/lib.js", - "default": "./dist/lib.js" } }, "scripts": { diff --git a/packages/nuqs/tsdown.config.ts b/packages/nuqs/tsdown.config.ts index 5c85c95bc..3490ba574 100644 --- a/packages/nuqs/tsdown.config.ts +++ b/packages/nuqs/tsdown.config.ts @@ -32,8 +32,7 @@ const entrypoints = { 'adapters/react-router/v7': 'src/adapters/react-router/v7.ts', 'adapters/tanstack-router': 'src/adapters/tanstack-router.ts', 'adapters/custom': 'src/adapters/custom.ts', - 'adapters/testing': 'src/adapters/testing.ts', - lib: 'src/lib/index.ts' + 'adapters/testing': 'src/adapters/testing.ts' }, server: { server: 'src/index.server.ts', diff --git a/packages/registry/lib/nuqs-safe-parse.ts b/packages/registry/lib/nuqs-safe-parse.ts new file mode 100644 index 000000000..d78856091 --- /dev/null +++ b/packages/registry/lib/nuqs-safe-parse.ts @@ -0,0 +1,18 @@ +export function nuqsSafeParse( + parser: (arg: I) => R, + value: I, + key?: string +): R | null { + try { + return parser(value) + } catch (error) { + console.error( + '[nuqs] Error while parsing value `%s`: %O' + + (key ? ' (for key `%s`)' : ''), + value, + error, + key + ) + return null + } +} diff --git a/packages/registry/parsers/parseAsTuple.test.ts b/packages/registry/lib/parsers/parseAsTuple.test.ts similarity index 100% rename from packages/registry/parsers/parseAsTuple.test.ts rename to packages/registry/lib/parsers/parseAsTuple.test.ts diff --git a/packages/registry/parsers/parseAsTuple.ts b/packages/registry/lib/parsers/parseAsTuple.ts similarity index 96% rename from packages/registry/parsers/parseAsTuple.ts rename to packages/registry/lib/parsers/parseAsTuple.ts index 78299fcff..4c678dfe0 100644 --- a/packages/registry/parsers/parseAsTuple.ts +++ b/packages/registry/lib/parsers/parseAsTuple.ts @@ -1,5 +1,5 @@ import { createParser, type SingleParserBuilder } from 'nuqs' -import { safeParse } from 'nuqs/lib' +import { nuqsSafeParse } from '../nuqs-safe-parse' type ParserTuple = { [K in keyof T]: SingleParserBuilder @@ -35,7 +35,7 @@ export function parseAsTuple( // iterating by parsers instead of parts, any additional parts are ignored. const result = itemParsers.map( (parser, index) => - safeParse( + nuqsSafeParse( parser.parse, parts[index]!.replaceAll(encodedSeparator, separator), `[${index}]` diff --git a/packages/registry/parsers/parseAsTuple.usage.md b/packages/registry/lib/parsers/parseAsTuple.usage.md similarity index 100% rename from packages/registry/parsers/parseAsTuple.usage.md rename to packages/registry/lib/parsers/parseAsTuple.usage.md From 0bb04a222f454a401bce44250717bc5cca222e00 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 26 Oct 2025 14:19:42 +0300 Subject: [PATCH 08/16] chore(registry): reorder dependencies and devDependencies in package.json --- packages/registry/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/registry/package.json b/packages/registry/package.json index 002fcad95..cfa4fb4e6 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -7,11 +7,11 @@ "test:unit": "vitest run --typecheck" }, "dependencies": { - "shadcn": "^3.4.2", - "nuqs": "workspace:*" + "nuqs": "workspace:*", + "shadcn": "^3.4.2" }, "devDependencies": { - "vitest": "^3.2.4", - "typescript": "^5.9.2" + "typescript": "^5.9.2", + "vitest": "^3.2.4" } } From f76b99d93d56906f70a882e62d78319c80dc5dd9 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Mon, 27 Oct 2025 21:00:20 +0300 Subject: [PATCH 09/16] feat(registry): use nuqs/lib export --- packages/nuqs/package.json | 8 +++++++- packages/nuqs/tsdown.config.ts | 3 ++- packages/registry/lib/nuqs-safe-parse.ts | 18 ------------------ .../{lib => }/parsers/parseAsTuple.test.ts | 0 .../registry/{lib => }/parsers/parseAsTuple.ts | 4 ++-- .../{lib => }/parsers/parseAsTuple.usage.md | 0 packages/registry/registry.json | 2 +- 7 files changed, 12 insertions(+), 23 deletions(-) delete mode 100644 packages/registry/lib/nuqs-safe-parse.ts rename packages/registry/{lib => }/parsers/parseAsTuple.test.ts (100%) rename packages/registry/{lib => }/parsers/parseAsTuple.ts (96%) rename packages/registry/{lib => }/parsers/parseAsTuple.usage.md (100%) diff --git a/packages/nuqs/package.json b/packages/nuqs/package.json index 5f8d0f931..2b38a13a1 100644 --- a/packages/nuqs/package.json +++ b/packages/nuqs/package.json @@ -48,7 +48,8 @@ "adapters/react-router/v7.d.ts", "adapters/tanstack-router.d.ts", "adapters/custom.d.ts", - "adapters/testing.d.ts" + "adapters/testing.d.ts", + "lib/index.d.ts" ], "type": "module", "sideEffects": false, @@ -125,6 +126,11 @@ "types": "./dist/adapters/testing.d.ts", "import": "./dist/adapters/testing.js", "default": "./dist/adapters/testing.js" + }, + "./lib": { + "types": "./dist/lib.d.ts", + "import": "./dist/lib.js", + "default": "./dist/lib.js" } }, "scripts": { diff --git a/packages/nuqs/tsdown.config.ts b/packages/nuqs/tsdown.config.ts index 3490ba574..5c85c95bc 100644 --- a/packages/nuqs/tsdown.config.ts +++ b/packages/nuqs/tsdown.config.ts @@ -32,7 +32,8 @@ const entrypoints = { 'adapters/react-router/v7': 'src/adapters/react-router/v7.ts', 'adapters/tanstack-router': 'src/adapters/tanstack-router.ts', 'adapters/custom': 'src/adapters/custom.ts', - 'adapters/testing': 'src/adapters/testing.ts' + 'adapters/testing': 'src/adapters/testing.ts', + lib: 'src/lib/index.ts' }, server: { server: 'src/index.server.ts', diff --git a/packages/registry/lib/nuqs-safe-parse.ts b/packages/registry/lib/nuqs-safe-parse.ts deleted file mode 100644 index d78856091..000000000 --- a/packages/registry/lib/nuqs-safe-parse.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function nuqsSafeParse( - parser: (arg: I) => R, - value: I, - key?: string -): R | null { - try { - return parser(value) - } catch (error) { - console.error( - '[nuqs] Error while parsing value `%s`: %O' + - (key ? ' (for key `%s`)' : ''), - value, - error, - key - ) - return null - } -} diff --git a/packages/registry/lib/parsers/parseAsTuple.test.ts b/packages/registry/parsers/parseAsTuple.test.ts similarity index 100% rename from packages/registry/lib/parsers/parseAsTuple.test.ts rename to packages/registry/parsers/parseAsTuple.test.ts diff --git a/packages/registry/lib/parsers/parseAsTuple.ts b/packages/registry/parsers/parseAsTuple.ts similarity index 96% rename from packages/registry/lib/parsers/parseAsTuple.ts rename to packages/registry/parsers/parseAsTuple.ts index 4c678dfe0..78299fcff 100644 --- a/packages/registry/lib/parsers/parseAsTuple.ts +++ b/packages/registry/parsers/parseAsTuple.ts @@ -1,5 +1,5 @@ import { createParser, type SingleParserBuilder } from 'nuqs' -import { nuqsSafeParse } from '../nuqs-safe-parse' +import { safeParse } from 'nuqs/lib' type ParserTuple = { [K in keyof T]: SingleParserBuilder @@ -35,7 +35,7 @@ export function parseAsTuple( // iterating by parsers instead of parts, any additional parts are ignored. const result = itemParsers.map( (parser, index) => - nuqsSafeParse( + safeParse( parser.parse, parts[index]!.replaceAll(encodedSeparator, separator), `[${index}]` diff --git a/packages/registry/lib/parsers/parseAsTuple.usage.md b/packages/registry/parsers/parseAsTuple.usage.md similarity index 100% rename from packages/registry/lib/parsers/parseAsTuple.usage.md rename to packages/registry/parsers/parseAsTuple.usage.md diff --git a/packages/registry/registry.json b/packages/registry/registry.json index d24e6db4b..c1488af16 100644 --- a/packages/registry/registry.json +++ b/packages/registry/registry.json @@ -13,7 +13,7 @@ { "path": "parsers/parseAsTuple.ts", "type": "registry:file", - "target": "~/components/parsers/parseAsTuple.ts" + "target": "~/lib/parsers/parseAsTuple.ts" } ] } From f35ba1bf25db16e8ce6c0457e3efae930aea7638 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Mon, 27 Oct 2025 21:47:02 +0300 Subject: [PATCH 10/16] feat(registry): update docs to use registry package --- packages/docs/package.json | 2 +- packages/docs/registry.json | 21 -- .../app/registry/_usage/parse-as-tuple.md} | 2 - packages/registry/README.md | 9 +- .../{docs/src => registry}/lib/typed-links.ts | 0 packages/registry/package.json | 2 +- ...AsTuple.test.ts => parse-as-tuple.test.ts} | 2 +- .../{parseAsTuple.ts => parse-as-tuple.ts} | 0 packages/registry/registry.json | 24 ++- packages/registry/tsconfig.json | 1 - pnpm-lock.yaml | 183 +++++++++--------- 11 files changed, 115 insertions(+), 131 deletions(-) delete mode 100644 packages/docs/registry.json rename packages/{registry/parsers/parseAsTuple.usage.md => docs/src/app/registry/_usage/parse-as-tuple.md} (97%) rename packages/{docs/src => registry}/lib/typed-links.ts (100%) rename packages/registry/parsers/{parseAsTuple.test.ts => parse-as-tuple.test.ts} (97%) rename packages/registry/parsers/{parseAsTuple.ts => parse-as-tuple.ts} (100%) diff --git a/packages/docs/package.json b/packages/docs/package.json index 8b2a1320b..6d9da936a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -17,7 +17,7 @@ "dev": "next dev --turbo", "build": "pnpm run build:registry && pnpm run build:next", "build:next": "next build", - "build:registry": "shadcn build", + "build:registry": "shadcn build --cwd ../registry --output ../docs/public/r", "start": "next start", "postinstall": "fumadocs-mdx", "test": "tsc" diff --git a/packages/docs/registry.json b/packages/docs/registry.json deleted file mode 100644 index fe1a64580..000000000 --- a/packages/docs/registry.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry.json", - "name": "nuqs", - "homepage": "https://nuqs.dev", - "items": [ - { - "type": "registry:item", - "name": "next-typed-links", - "title": "Typed Links for Next.js", - "description": "Type-safe linking for Next.js (using typedRoutes + nuqs)", - "dependencies": ["next@>=15.5.0", "nuqs"], - "files": [ - { - "type": "registry:file", - "path": "src/lib/typed-links.ts", - "target": "~/src/lib/typed-links.ts" - } - ] - } - ] -} diff --git a/packages/registry/parsers/parseAsTuple.usage.md b/packages/docs/src/app/registry/_usage/parse-as-tuple.md similarity index 97% rename from packages/registry/parsers/parseAsTuple.usage.md rename to packages/docs/src/app/registry/_usage/parse-as-tuple.md index 0156684ec..6a78b5904 100644 --- a/packages/registry/parsers/parseAsTuple.usage.md +++ b/packages/docs/src/app/registry/_usage/parse-as-tuple.md @@ -1,5 +1,3 @@ -## Tuples - The `parseAsTuple` parser allows you to parse fixed-length tuples with **any type** for each position. ```ts diff --git a/packages/registry/README.md b/packages/registry/README.md index 06b73ffea..32e47d2eb 100644 --- a/packages/registry/README.md +++ b/packages/registry/README.md @@ -9,17 +9,16 @@ A shadcn/ui compatible registry for community parsers and utilities for the [nuq pnpm install # Build the registry -pnpm build - -# Run the registry (using serve or any other static file server) -serve public -p 3000 +cd ../docs && pnpm build:registry +# Run the docs server +cd ../docs && pnpm dev ``` Usage example in any npm package: ```bash -pnpm dlx shadcn@latest add http://localhost:3000/r/parseAsTuple.json +pnpm dlx shadcn@latest add http://localhost:3000/r/parse-as-tuple.json ``` ## Learn More diff --git a/packages/docs/src/lib/typed-links.ts b/packages/registry/lib/typed-links.ts similarity index 100% rename from packages/docs/src/lib/typed-links.ts rename to packages/registry/lib/typed-links.ts diff --git a/packages/registry/package.json b/packages/registry/package.json index cfa4fb4e6..991389837 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -2,11 +2,11 @@ "name": "registry", "description": "Shadcn CLI registry for community parsers & utilities", "scripts": { - "build": "shadcn build", "test": "pnpm run --stream '/^test:/'", "test:unit": "vitest run --typecheck" }, "dependencies": { + "next": "15.5.0", "nuqs": "workspace:*", "shadcn": "^3.4.2" }, diff --git a/packages/registry/parsers/parseAsTuple.test.ts b/packages/registry/parsers/parse-as-tuple.test.ts similarity index 97% rename from packages/registry/parsers/parseAsTuple.test.ts rename to packages/registry/parsers/parse-as-tuple.test.ts index 1380ae531..4c5f4a9f9 100644 --- a/packages/registry/parsers/parseAsTuple.test.ts +++ b/packages/registry/parsers/parse-as-tuple.test.ts @@ -5,7 +5,7 @@ import { testSerializeThenParse } from 'nuqs/testing' import { describe, expect, it } from 'vitest' -import { parseAsTuple } from './parseAsTuple' +import { parseAsTuple } from './parse-as-tuple' describe('parseAsTuple', () => { it('parses and serializes tuples correctly', () => { diff --git a/packages/registry/parsers/parseAsTuple.ts b/packages/registry/parsers/parse-as-tuple.ts similarity index 100% rename from packages/registry/parsers/parseAsTuple.ts rename to packages/registry/parsers/parse-as-tuple.ts diff --git a/packages/registry/registry.json b/packages/registry/registry.json index c1488af16..f5c61d91a 100644 --- a/packages/registry/registry.json +++ b/packages/registry/registry.json @@ -4,16 +4,30 @@ "homepage": "https://nuqs.dev", "items": [ { - "name": "parseAsTuple", - "type": "registry:file", - "title": "parseAsTuple", + "name": "parse-as-tuple", + "type": "registry:item", + "title": "Tuples", "description": "Parse query string as a tuple of values.", "dependencies": ["nuqs"], "files": [ { - "path": "parsers/parseAsTuple.ts", + "path": "parsers/parse-as-tuple.ts", "type": "registry:file", - "target": "~/lib/parsers/parseAsTuple.ts" + "target": "~/src/lib/parsers/parse-as-tuple.ts" + } + ] + }, + { + "type": "registry:item", + "name": "next-typed-links", + "title": "Typed Links for Next.js", + "description": "Type-safe linking for Next.js (using typedRoutes + nuqs)", + "dependencies": ["next@>=15.5.0", "nuqs"], + "files": [ + { + "type": "registry:file", + "path": "lib/typed-links.ts", + "target": "~/src/lib/typed-links.ts" } ] } diff --git a/packages/registry/tsconfig.json b/packages/registry/tsconfig.json index 2ad913fe7..f5b521155 100644 --- a/packages/registry/tsconfig.json +++ b/packages/registry/tsconfig.json @@ -18,7 +18,6 @@ "declaration": true, "declarationMap": true, "verbatimModuleSyntax": true, - "isolatedDeclarations": true, "moduleDetection": "force", "downlevelIteration": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ab39b763..afde58741 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,7 +116,7 @@ importers: version: 1.2.8(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@sentry/nextjs': specifier: ^8.55.0 - version: 8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.101.3) + version: 8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.101.3) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.1.12) @@ -137,19 +137,19 @@ importers: version: 3.17.8 fumadocs-core: specifier: ^15.6.12 - version: 15.6.12(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + version: 15.6.12(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) fumadocs-mdx: specifier: ^11.7.5 - version: 11.7.5(acorn@8.15.0)(fumadocs-core@15.6.12(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0))(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.1.11(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)) + version: 11.7.5(acorn@8.15.0)(fumadocs-core@15.6.12(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0))(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.1.11(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)) fumadocs-ui: specifier: ^15.6.12 - version: 15.6.12(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.12) + version: 15.6.12(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.12) lucide-react: specifier: ^0.540.0 version: 0.540.0(react@19.2.0) next: specifier: 15.5.0 - version: 15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) nuqs: specifier: workspace:* version: link:../nuqs @@ -767,6 +767,9 @@ importers: packages/registry: dependencies: + next: + specifier: 15.5.0 + version: 15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) nuqs: specifier: workspace:* version: link:../nuqs @@ -1114,9 +1117,6 @@ packages: '@emnapi/core@1.6.0': resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/runtime@1.6.0': resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} @@ -3054,85 +3054,85 @@ packages: '@remix-run/web-stream@1.1.0': resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} - '@rolldown/binding-android-arm64@1.0.0-beta.44': - resolution: {integrity: sha512-g9ejDOehJFhxC1DIXQuZQ9bKv4lRDioOTL42cJjFjqKPl1L7DVb9QQQE1FxokGEIMr6FezLipxwnzOXWe7DNPg==} + '@rolldown/binding-android-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.44': - resolution: {integrity: sha512-PxAW1PXLPmCzfhfKIS53kwpjLGTUdIfX4Ht+l9mj05C3lYCGaGowcNsYi2rdxWH24vSTmeK+ajDNRmmmrK0M7g==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.44': - resolution: {integrity: sha512-/CtQqs1oO9uSb5Ju60rZvsdjE7Pzn8EK2ISAdl2jedjMzeD/4neNyCbwyJOAPzU+GIQTZVyrFZJX+t7HXR1R/g==} + '@rolldown/binding-darwin-x64@1.0.0-beta.45': + resolution: {integrity: sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.44': - resolution: {integrity: sha512-V5Q5W9c4+2GJ4QabmjmVV6alY97zhC/MZBaLkDtHwGy3qwzbM4DYgXUbun/0a8AH5hGhuU27tUIlYz6ZBlvgOA==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': + resolution: {integrity: sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44': - resolution: {integrity: sha512-X6adjkHeFqKsTU0FXdNN9HY4LDozPqIfHcnXovE5RkYLWIjMWuc489mIZ6iyhrMbCqMUla9IOsh5dvXSGT9o9A==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': + resolution: {integrity: sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44': - resolution: {integrity: sha512-kRRKGZI4DXWa6ANFr3dLA85aSVkwPdgXaRjfanwY84tfc3LncDiIjyWCb042e3ckPzYhHSZ3LmisO+cdOIYL6Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': + resolution: {integrity: sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.44': - resolution: {integrity: sha512-hMtiN9xX1NhxXBa2U3Up4XkVcsVp2h73yYtMDY59z9CDLEZLrik9RVLhBL5QtoX4zZKJ8HZKJtWuGYvtmkCbIQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': + resolution: {integrity: sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.44': - resolution: {integrity: sha512-rd1LzbpXQuR8MTG43JB9VyXDjG7ogSJbIkBpZEHJ8oMKzL6j47kQT5BpIXrg3b5UVygW9QCI2fpFdMocT5Kudg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': + resolution: {integrity: sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.44': - resolution: {integrity: sha512-qI2IiPqmPRW25exXkuQr3TlweCDc05YvvbSDRPCuPsWkwb70dTiSoXn8iFxT4PWqTi71wWHg1Wyta9PlVhX5VA==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': + resolution: {integrity: sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.44': - resolution: {integrity: sha512-+vHvEc1pL5iJRFlldLC8mjm6P4Qciyfh2bh5ZI6yxDQKbYhCHRKNURaKz1mFcwxhVL5YMYsLyaqM3qizVif9MQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.44': - resolution: {integrity: sha512-XSgLxRrtFj6RpTeMYmmQDAwHjKseYGKUn5LPiIdW4Cq+f5SBSStL2ToBDxkbdxKPEbCZptnLPQ/nfKcAxrC8Xg==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': + resolution: {integrity: sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44': - resolution: {integrity: sha512-cF1LJdDIX02cJrFrX3wwQ6IzFM7I74BYeKFkzdcIA4QZ0+2WA7/NsKIgjvrunupepWb1Y6PFWdRlHSaz5AW1Wg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44': - resolution: {integrity: sha512-5uaJonDafhHiMn+iEh7qUp3QQ4Gihv3lEOxKfN8Vwadpy0e+5o28DWI42DpJ9YBYMrVy4JOWJ/3etB/sptpUwA==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.44': - resolution: {integrity: sha512-vsqhWAFJkkmgfBN/lkLCWTXF1PuPhMjfnAyru48KvF7mVh2+K7WkKYHezF3Fjz4X/mPScOcIv+g6cf6wnI6eWg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3140,8 +3140,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.32': resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} - '@rolldown/pluginutils@1.0.0-beta.44': - resolution: {integrity: sha512-g6eW7Zwnr2c5RADIoqziHoVs6b3W5QTQ4+qbpfjbkMJ9x+8Og211VW/oot2dj9dVwaK/UyC6Yo+02gV+wWQVNg==} + '@rolldown/pluginutils@1.0.0-beta.45': + resolution: {integrity: sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==} '@rollup/plugin-commonjs@28.0.1': resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} @@ -8102,8 +8102,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.44: - resolution: {integrity: sha512-gcqgyCi3g93Fhr49PKvymE8PoaGS0sf6ajQrsYaQ8o5de6aUEbD6rJZiJbhOfpcqOnycgsAsUNPYri1h25NgsQ==} + rolldown@1.0.0-beta.45: + resolution: {integrity: sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -9894,11 +9894,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.6.0': dependencies: tslib: 2.8.1 @@ -10333,7 +10328,7 @@ snapshots: '@img/sharp-wasm32@0.34.3': dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.6.0 optional: true '@img/sharp-win32-arm64@0.34.3': @@ -11821,53 +11816,53 @@ snapshots: dependencies: web-streams-polyfill: 3.3.3 - '@rolldown/binding-android-arm64@1.0.0-beta.44': + '@rolldown/binding-android-arm64@1.0.0-beta.45': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.44': + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.44': + '@rolldown/binding-darwin-x64@1.0.0-beta.45': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.44': + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.44': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.44': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.44': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.44': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.44': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.44': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': optional: true '@rolldown/pluginutils@1.0.0-beta.32': {} - '@rolldown/pluginutils@1.0.0-beta.44': {} + '@rolldown/pluginutils@1.0.0-beta.45': {} '@rollup/plugin-commonjs@28.0.1(rollup@3.29.5)': dependencies: @@ -12112,7 +12107,7 @@ snapshots: '@sentry/core@8.55.0': {} - '@sentry/nextjs@8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.101.3)': + '@sentry/nextjs@8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.101.3)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.36.0 @@ -12125,7 +12120,7 @@ snapshots: '@sentry/vercel-edge': 8.55.0 '@sentry/webpack-plugin': 2.22.7(webpack@5.101.3) chalk: 3.0.0 - next: 15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.11 @@ -14624,7 +14619,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@15.6.12(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0): + fumadocs-core@15.6.12(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0): dependencies: '@formatjs/intl-localematcher': 0.6.1 '@orama/orama': 3.1.11 @@ -14645,21 +14640,21 @@ snapshots: unist-util-visit: 5.0.0 optionalDependencies: '@types/react': 19.2.0 - next: 15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) react-router: 7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@11.7.5(acorn@8.15.0)(fumadocs-core@15.6.12(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0))(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.1.11(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)): + fumadocs-mdx@11.7.5(acorn@8.15.0)(fumadocs-core@15.6.12(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0))(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.1.11(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)): dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.9 estree-util-value-to-estree: 3.4.0 - fumadocs-core: 15.6.12(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + fumadocs-core: 15.6.12(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) js-yaml: 4.1.0 lru-cache: 11.1.0 picocolors: 1.1.1 @@ -14668,14 +14663,14 @@ snapshots: unist-util-visit: 5.0.0 zod: 4.1.5 optionalDependencies: - next: 15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 vite: 7.1.11(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) transitivePeerDependencies: - acorn - supports-color - fumadocs-ui@15.6.12(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.12): + fumadocs-ui@15.6.12(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.12): dependencies: '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14688,7 +14683,7 @@ snapshots: '@radix-ui/react-slot': 1.2.3(@types/react@19.2.0)(react@19.2.0) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) class-variance-authority: 0.7.1 - fumadocs-core: 15.6.12(@types/react@19.2.0)(next@15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + fumadocs-core: 15.6.12(@types/react@19.2.0)(next@15.5.0(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react-router@7.8.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) postcss-selector-parser: 7.1.0 @@ -14699,7 +14694,7 @@ snapshots: tailwind-merge: 3.3.1 optionalDependencies: '@types/react': 19.2.0 - next: 15.5.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tailwindcss: 4.1.12 transitivePeerDependencies: - '@mixedbread/sdk' @@ -16530,7 +16525,7 @@ snapshots: dependencies: '@next/env': 15.5.0 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001736 + caniuse-lite: 1.0.30001751 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -16554,7 +16549,7 @@ snapshots: dependencies: '@next/env': 15.5.0 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001736 + caniuse-lite: 1.0.30001751 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -16579,7 +16574,7 @@ snapshots: dependencies: '@next/env': 15.5.0 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001736 + caniuse-lite: 1.0.30001751 postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -17625,7 +17620,7 @@ snapshots: rfdc@1.4.1: {} - rolldown-plugin-dts@0.15.7(rolldown@1.0.0-beta.44)(typescript@5.9.2): + rolldown-plugin-dts@0.15.7(rolldown@1.0.0-beta.45)(typescript@5.9.2): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.3 @@ -17635,32 +17630,32 @@ snapshots: debug: 4.4.1(supports-color@8.1.1) dts-resolver: 2.1.1 get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.44 + rolldown: 1.0.0-beta.45 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.44: + rolldown@1.0.0-beta.45: dependencies: '@oxc-project/types': 0.95.0 - '@rolldown/pluginutils': 1.0.0-beta.44 + '@rolldown/pluginutils': 1.0.0-beta.45 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.44 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.44 - '@rolldown/binding-darwin-x64': 1.0.0-beta.44 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.44 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.44 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.44 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.44 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.44 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.44 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.44 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.44 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.44 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.44 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.44 + '@rolldown/binding-android-arm64': 1.0.0-beta.45 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.45 + '@rolldown/binding-darwin-x64': 1.0.0-beta.45 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.45 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.45 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.45 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.45 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.45 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.45 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.45 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.45 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.45 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.45 rollup@3.29.5: optionalDependencies: @@ -18506,8 +18501,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.44 - rolldown-plugin-dts: 0.15.7(rolldown@1.0.0-beta.44)(typescript@5.9.2) + rolldown: 1.0.0-beta.45 + rolldown-plugin-dts: 0.15.7(rolldown@1.0.0-beta.45)(typescript@5.9.2) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14 From 88dad2b82afdff0b939ccbd2d373da650b2d6c71 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Mon, 27 Oct 2025 21:56:08 +0300 Subject: [PATCH 11/16] test: add safeParse function export to API test --- packages/nuqs/src/api.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/nuqs/src/api.test.ts b/packages/nuqs/src/api.test.ts index c17f6e61f..443691a01 100644 --- a/packages/nuqs/src/api.test.ts +++ b/packages/nuqs/src/api.test.ts @@ -73,6 +73,9 @@ const exports = ` "NuqsTestingAdapter": "function", "withNuqsTestingAdapter": "function", }, + "./lib": { + "safeParse": "function", + }, "./server": { "createLoader": "function", "createMultiParser": "function", From fc7d16f9873413e99ed6abeaa5e88087e2a88b6f Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Wed, 29 Oct 2025 07:56:48 +0300 Subject: [PATCH 12/16] doc: update parse-as-tuple example to use correct import path --- packages/docs/src/app/registry/_usage/parse-as-tuple.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/app/registry/_usage/parse-as-tuple.md b/packages/docs/src/app/registry/_usage/parse-as-tuple.md index 6a78b5904..d0e640fca 100644 --- a/packages/docs/src/app/registry/_usage/parse-as-tuple.md +++ b/packages/docs/src/app/registry/_usage/parse-as-tuple.md @@ -1,8 +1,8 @@ The `parseAsTuple` parser allows you to parse fixed-length tuples with **any type** for each position. ```ts +import { parseAsTuple } from '@/lib/parsers/parse-as-tuple' import { parseAsInteger } from 'nuqs' -import { parseAsTuple } from '~/components/parsers/parseAsTuple' // Coordinates tuple (x, y) parseAsTuple([parseAsInteger, parseAsInteger]) From 98841c48d7741dda89be3292595224cc31cb1862 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sat, 6 Dec 2025 22:17:56 +0300 Subject: [PATCH 13/16] doc(registry): update assemble script to use items from registry package --- packages/docs/package.json | 1 + .../{registry => docs/src}/lib/typed-links.ts | 0 packages/docs/src/registry/assemble.ts | 9 +- packages/registry/items/parse-as-tuple.json | 14 + .../src => }/registry/items/parse-as-tuple.md | 0 .../{parsers => items}/parse-as-tuple.test.ts | 0 .../{parsers => items}/parse-as-tuple.ts | 0 packages/registry/package.json | 11 +- pnpm-lock.yaml | 395 ++---------------- 9 files changed, 64 insertions(+), 366 deletions(-) rename packages/{registry => docs/src}/lib/typed-links.ts (100%) create mode 100644 packages/registry/items/parse-as-tuple.json rename packages/{docs/src => }/registry/items/parse-as-tuple.md (100%) rename packages/registry/{parsers => items}/parse-as-tuple.test.ts (100%) rename packages/registry/{parsers => items}/parse-as-tuple.ts (100%) diff --git a/packages/docs/package.json b/packages/docs/package.json index 5c29c1a20..57c44beef 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -58,6 +58,7 @@ "react": "catalog:react19", "react-dom": "catalog:react19", "recharts": "3.3.0", + "registry": "workspace:*", "remark-smartypants": "^3.0.2", "res": "workspace:*", "server-only": "^0.0.1", diff --git a/packages/registry/lib/typed-links.ts b/packages/docs/src/lib/typed-links.ts similarity index 100% rename from packages/registry/lib/typed-links.ts rename to packages/docs/src/lib/typed-links.ts diff --git a/packages/docs/src/registry/assemble.ts b/packages/docs/src/registry/assemble.ts index 0044395e0..47276f7d0 100755 --- a/packages/docs/src/registry/assemble.ts +++ b/packages/docs/src/registry/assemble.ts @@ -16,12 +16,17 @@ import { // Paths const __dirname = fileURLToPath(new URL('.', import.meta.url)) const packageRoot = resolve(__dirname, '../../') -const itemsDir = resolve(__dirname, './items') +const docsItemsDir = resolve(__dirname, './items') +const registryItemsDir = resolve(packageRoot, 'node_modules/registry/items') const remoteDir = resolve(__dirname, './remote') const registryJson = resolve(packageRoot, 'registry.json') async function loadItems() { - const itemFiles = await Array.fromAsync(glob(`${itemsDir}/*.json`)) + const [localFiles, registryFiles] = await Promise.all([ + Array.fromAsync(glob(`${docsItemsDir}/*.json`)), + Array.fromAsync(glob(`${registryItemsDir}/*.json`)) + ]) + const itemFiles = [...localFiles, ...registryFiles] return await Promise.all( itemFiles.map(async filePath => { const item = await loadItem(filePath) diff --git a/packages/registry/items/parse-as-tuple.json b/packages/registry/items/parse-as-tuple.json new file mode 100644 index 000000000..a8836f689 --- /dev/null +++ b/packages/registry/items/parse-as-tuple.json @@ -0,0 +1,14 @@ +{ + "name": "parse-as-tuple", + "type": "registry:item", + "title": "Tuples", + "description": "Parse query string as a tuple of values.", + "dependencies": ["nuqs"], + "files": [ + { + "path": "node_modules/registry/items/parse-as-tuple.ts", + "type": "registry:file", + "target": "~/src/lib/parsers/parse-as-tuple.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/parse-as-tuple.md b/packages/registry/items/parse-as-tuple.md similarity index 100% rename from packages/docs/src/registry/items/parse-as-tuple.md rename to packages/registry/items/parse-as-tuple.md diff --git a/packages/registry/parsers/parse-as-tuple.test.ts b/packages/registry/items/parse-as-tuple.test.ts similarity index 100% rename from packages/registry/parsers/parse-as-tuple.test.ts rename to packages/registry/items/parse-as-tuple.test.ts diff --git a/packages/registry/parsers/parse-as-tuple.ts b/packages/registry/items/parse-as-tuple.ts similarity index 100% rename from packages/registry/parsers/parse-as-tuple.ts rename to packages/registry/items/parse-as-tuple.ts diff --git a/packages/registry/package.json b/packages/registry/package.json index 991389837..1de0aad4c 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -1,17 +1,24 @@ { "name": "registry", "description": "Shadcn CLI registry for community parsers & utilities", + "type": "module", + "exports": { + "./items/*": "./items/*" + }, + "files": [ + "items" + ], "scripts": { "test": "pnpm run --stream '/^test:/'", "test:unit": "vitest run --typecheck" }, "dependencies": { - "next": "15.5.0", + "next": "16.0.7", "nuqs": "workspace:*", "shadcn": "^3.4.2" }, "devDependencies": { "typescript": "^5.9.2", - "vitest": "^3.2.4" + "vitest": "^4.0.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e8241183..c7969af26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,7 +62,7 @@ importers: dependencies: '@databuddy/sdk': specifier: ^2.2.12 - version: 2.2.12(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(react@19.2.1) + version: 2.2.12(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.2.7)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(react@19.2.1) '@faker-js/faker': specifier: ^10.1.0 version: 10.1.0 @@ -116,7 +116,7 @@ importers: version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@sentry/nextjs': specifier: ^10.27.0 - version: 10.27.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(webpack@5.101.3) + version: 10.27.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(webpack@5.101.3) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.1.12) @@ -137,19 +137,19 @@ importers: version: 3.17.8 fumadocs-core: specifier: ^16.0.4 - version: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) fumadocs-mdx: specifier: ^13.0.2 - version: 13.0.2(fumadocs-core@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)) + version: 13.0.2(fumadocs-core@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)) fumadocs-ui: specifier: ^16.0.4 - version: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.12) + version: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.12) lucide-react: specifier: ^0.548.0 version: 0.548.0(react@19.2.1) next: specifier: 16.0.7 - version: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) nuqs: specifier: workspace:* version: link:../nuqs @@ -162,6 +162,9 @@ importers: recharts: specifier: 3.3.0 version: 3.3.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react-is@18.3.1)(react@19.2.1)(redux@5.0.1) + registry: + specifier: workspace:* + version: link:../registry remark-smartypants: specifier: ^3.0.2 version: 3.0.2 @@ -230,7 +233,7 @@ importers: dependencies: next: specifier: 16.0.7 - version: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) nuqs: specifier: workspace:* version: link:../../nuqs @@ -788,7 +791,7 @@ importers: version: 27.0.1(postcss@8.5.6) next: specifier: 16.0.7 - version: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: specifier: catalog:react19 version: 19.2.1 @@ -823,8 +826,8 @@ importers: packages/registry: dependencies: next: - specifier: 15.5.0 - version: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.0.7 + version: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) nuqs: specifier: workspace:* version: link:../nuqs @@ -836,8 +839,8 @@ importers: specifier: ^5.9.2 version: 5.9.2 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) + specifier: ^4.0.1 + version: 4.0.1(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) packages/res: {} @@ -2136,102 +2139,51 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@next/env@15.5.0': - resolution: {integrity: sha512-sDaprBAfzCQiOgo2pO+LhnV0Wt2wBgartjrr+dpcTORYVnnXD0gwhHhiiyIih9hQbq+JnbqH4odgcFWhqCGidw==} - '@next/env@16.0.7': resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/swc-darwin-arm64@15.5.0': - resolution: {integrity: sha512-v7Jj9iqC6enxIRBIScD/o0lH7QKvSxq2LM8UTyqJi+S2w2QzhMYjven4vgu/RzgsdtdbpkyCxBTzHl/gN5rTRg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@16.0.7': resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.0': - resolution: {integrity: sha512-s2Nk6ec+pmYmAb/utawuURy7uvyYKDk+TRE5aqLRsdnj3AhwC9IKUBmhfnLmY/+P+DnwqpeXEFIKe9tlG0p6CA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@16.0.7': resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.0': - resolution: {integrity: sha512-mGlPJMZReU4yP5fSHjOxiTYvZmwPSWn/eF/dcg21pwfmiUCKS1amFvf1F1RkLHPIMPfocxLViNWFvkvDB14Isg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-gnu@16.0.7': resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.0': - resolution: {integrity: sha512-biWqIOE17OW/6S34t1X8K/3vb1+svp5ji5QQT/IKR+VfM3B7GvlCwmz5XtlEan2ukOUf9tj2vJJBffaGH4fGRw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-musl@16.0.7': resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.0': - resolution: {integrity: sha512-zPisT+obYypM/l6EZ0yRkK3LEuoZqHaSoYKj+5jiD9ESHwdr6QhnabnNxYkdy34uCigNlWIaCbjFmQ8FY5AlxA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-gnu@16.0.7': resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.0': - resolution: {integrity: sha512-+t3+7GoU9IYmk+N+FHKBNFdahaReoAktdOpXHFIPOU1ixxtdge26NgQEEkJkCw2dHT9UwwK5zw4mAsURw4E8jA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-musl@16.0.7': resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.0': - resolution: {integrity: sha512-d8MrXKh0A+c9DLiy1BUFwtg3Hu90Lucj3k6iKTUdPOv42Ve2UiIG8HYi3UAb8kFVluXxEfdpCoPPCSODk5fDcw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-arm64-msvc@16.0.7': resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.0': - resolution: {integrity: sha512-Fe1tGHxOWEyQjmygWkkXSwhFcTJuimrNu52JEuwItrKJVV4iRjbWp9I7zZjwqtiNnQmxoEvoisn8wueFLrNpvQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@next/swc-win32-x64-msvc@16.0.7': resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} engines: {node: '>= 10'} @@ -4300,23 +4252,9 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/expect@4.0.1': resolution: {integrity: sha512-KtvGLN/IWoZfg68JF2q/zbDEo+UJTWnc7suYJ8RF+ZTBeBcBz4NIOJDxO4Q3bEY9GsOYhgy5cOevcVPFh4+V7g==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/mocker@4.0.1': resolution: {integrity: sha512-fwmvg8YvwSAE41Hyhul7dL4UzPhG+k2VaZCcL+aHagLx4qlNQgKYTw7coF4YdjAxSBBt0b408gQFYMX1Qeqweg==} peerDependencies: @@ -4328,33 +4266,18 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.0.1': resolution: {integrity: sha512-6nq3JY/zQ91+oX1vd4fajiVNyA/HMhaF9cOw5P9cQi6ML7PRi7ilVaQ77PulF+4kvUKr9bcLm9GoAtwlVFbGzw==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/runner@4.0.1': resolution: {integrity: sha512-nxUoWmw7ZX2OiSNwolJeSOOzrrR/o79wRTwP7HhiW/lDFwQHtWMj9snMhrdvccFqanvI8897E81eXjgDbrRvqA==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/snapshot@4.0.1': resolution: {integrity: sha512-CvfsEWutEIN/Z9ScXYup7YwlPeK9JICrV7FN9p3pVytsyh+aCHAH0PUi//YlTiQ7T8qYxJYpUrAwZL9XqmZ5ZA==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@4.0.1': resolution: {integrity: sha512-Hj0/TBQ2EN72wDpfKiUf63mRCkE0ZiSGXGeDDvW9T3LBKVVApItd0GyQLDBIe03kWbyK9gOTEbJVVWthcLFzCg==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@4.0.1': resolution: {integrity: sha512-uRrACgpIz5sxuT87ml7xhh7EdKtW8k0N9oSFVBPl8gHB/JfLObLe9dXO6ZrsNN55FzciGIRqIEILgTQvg1eNHw==} @@ -4595,10 +4518,6 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - ast-kit@2.1.3: resolution: {integrity: sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==} engines: {node: '>=20.19.0'} @@ -4789,10 +4708,6 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} - chai@6.2.0: resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} engines: {node: '>=18'} @@ -4825,10 +4740,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - check-more-types@2.24.0: resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} engines: {node: '>= 0.8.0'} @@ -5285,10 +5196,6 @@ packages: babel-plugin-macros: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -6814,9 +6721,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -7388,27 +7292,6 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.5.0: - resolution: {integrity: sha512-N1lp9Hatw3a9XLt0307lGB4uTKsXDhyOKQo7uYMzX4i0nF/c27grcGXkLdb7VcT8QPYLBa8ouIyEoUQJ2OyeNQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - next@16.0.7: resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} engines: {node: '>=20.9.0'} @@ -7828,10 +7711,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pause-stream@0.0.11: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} @@ -8937,9 +8816,6 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} @@ -9101,22 +8977,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - tinyrainbow@3.0.3: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} - tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -9677,34 +9541,6 @@ packages: vitest-package-exports@0.1.1: resolution: {integrity: sha512-rXgU5noxaaMA5VJXgVPhXRzPiQ1WFmWwgo8dQFPg9j/yFM028scO0IAylFHVI8XMRevhozEt1usa6RQYQY26lg==} - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@4.0.1: resolution: {integrity: sha512-4rwTfUNF0MExMZBiNirkzZpeyUZGOs3JD76N2qHNP9i6w6/bff7MRv2I9yFJKd1ICxzn2igpra+E4t9o2EfQhw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -10489,9 +10325,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@databuddy/sdk@2.2.12(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(react@19.2.1)': + '@databuddy/sdk@2.2.12(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.2.7)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(react@19.2.1)': dependencies: - jotai: 2.15.2(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.1) + jotai: 2.15.2(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.1) optionalDependencies: msw: 2.11.6(@types/node@24.3.0)(typescript@5.9.2) react: 19.2.1 @@ -11155,55 +10991,29 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@15.5.0': {} - '@next/env@16.0.7': {} - '@next/swc-darwin-arm64@15.5.0': - optional: true - '@next/swc-darwin-arm64@16.0.7': optional: true - '@next/swc-darwin-x64@15.5.0': - optional: true - '@next/swc-darwin-x64@16.0.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.0': - optional: true - '@next/swc-linux-arm64-gnu@16.0.7': optional: true - '@next/swc-linux-arm64-musl@15.5.0': - optional: true - '@next/swc-linux-arm64-musl@16.0.7': optional: true - '@next/swc-linux-x64-gnu@15.5.0': - optional: true - '@next/swc-linux-x64-gnu@16.0.7': optional: true - '@next/swc-linux-x64-musl@15.5.0': - optional: true - '@next/swc-linux-x64-musl@16.0.7': optional: true - '@next/swc-win32-arm64-msvc@15.5.0': - optional: true - '@next/swc-win32-arm64-msvc@16.0.7': optional: true - '@next/swc-win32-x64-msvc@15.5.0': - optional: true - '@next/swc-win32-x64-msvc@16.0.7': optional: true @@ -12786,7 +12596,7 @@ snapshots: '@sentry/core@10.27.0': {} - '@sentry/nextjs@10.27.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(webpack@5.101.3)': + '@sentry/nextjs@10.27.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(webpack@5.101.3)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.38.0 @@ -12799,7 +12609,7 @@ snapshots: '@sentry/react': 10.27.0(react@19.2.1) '@sentry/vercel-edge': 10.27.0 '@sentry/webpack-plugin': 4.6.1(webpack@5.101.3) - next: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) resolve: 1.22.8 rollup: 4.53.3 stacktrace-parser: 0.1.11 @@ -13634,14 +13444,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 - '@vitest/expect@4.0.1': dependencies: '@standard-schema/spec': 1.0.0 @@ -13651,15 +13453,6 @@ snapshots: chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.19 - optionalDependencies: - msw: 2.11.6(@types/node@24.3.0)(typescript@5.9.2) - vite: 7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) - '@vitest/mocker@4.0.1(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.1 @@ -13669,49 +13462,23 @@ snapshots: msw: 2.11.6(@types/node@24.3.0)(typescript@5.9.2) vite: 7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) - '@vitest/pretty-format@3.2.4': - dependencies: - tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.1': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': - dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/runner@4.0.1': dependencies: '@vitest/utils': 4.0.1 pathe: 2.0.3 - '@vitest/snapshot@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.19 - pathe: 2.0.3 - '@vitest/snapshot@4.0.1': dependencies: '@vitest/pretty-format': 4.0.1 magic-string: 0.30.19 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 - '@vitest/spy@4.0.1': {} - '@vitest/utils@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - '@vitest/utils@4.0.1': dependencies: '@vitest/pretty-format': 4.0.1 @@ -13959,8 +13726,6 @@ snapshots: assert-plus@1.0.0: {} - assertion-error@2.0.1: {} - ast-kit@2.1.3: dependencies: '@babel/parser': 7.28.5 @@ -14186,14 +13951,6 @@ snapshots: ccount@2.0.1: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 - chai@6.2.0: {} chalk@2.4.2: @@ -14219,8 +13976,6 @@ snapshots: character-reference-invalid@2.0.1: {} - check-error@2.1.1: {} - check-more-types@2.24.0: {} chokidar@3.6.0: @@ -14665,8 +14420,6 @@ snapshots: dedent@1.6.0: {} - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deep-object-diff@1.1.9: {} @@ -15424,7 +15177,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): + fumadocs-core@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): dependencies: '@formatjs/intl-localematcher': 0.6.2 '@orama/orama': 3.1.16 @@ -15447,21 +15200,21 @@ snapshots: '@tanstack/react-router': 1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@types/react': 19.2.7 lucide-react: 0.548.0(react@19.2.1) - next: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) react-router: 7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) transitivePeerDependencies: - supports-color - fumadocs-mdx@13.0.2(fumadocs-core@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)): + fumadocs-mdx@13.0.2(fumadocs-core@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.11 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + fumadocs-core: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) js-yaml: 4.1.0 lru-cache: 11.2.2 mdast-util-to-markdown: 2.1.2 @@ -15475,13 +15228,13 @@ snapshots: unist-util-visit: 5.0.0 zod: 4.1.12 optionalDependencies: - next: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 vite: 7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) transitivePeerDependencies: - supports-color - fumadocs-ui@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.12): + fumadocs-ui@16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.12): dependencies: '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -15494,7 +15247,7 @@ snapshots: '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) class-variance-authority: 0.7.1 - fumadocs-core: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + fumadocs-core: 16.0.4(@tanstack/react-router@1.131.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@types/react@19.2.7)(lucide-react@0.548.0(react@19.2.1))(next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react-router@7.8.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) postcss-selector-parser: 7.1.0 @@ -15505,7 +15258,7 @@ snapshots: tailwind-merge: 3.3.1 optionalDependencies: '@types/react': 19.2.7 - next: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) tailwindcss: 4.1.12 transitivePeerDependencies: - '@mixedbread/sdk' @@ -16130,9 +15883,9 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - jotai@2.15.2(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.1): + jotai@2.15.2(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.1): optionalDependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/template': 7.27.2 '@types/react': 19.2.7 react: 19.2.1 @@ -16363,8 +16116,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.2.1: {} - lru-cache@10.4.3: {} lru-cache@11.2.2: {} @@ -17362,32 +17113,7 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): - dependencies: - '@next/env': 15.5.0 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001751 - postcss: 8.4.31 - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) - optionalDependencies: - '@next/swc-darwin-arm64': 15.5.0 - '@next/swc-darwin-x64': 15.5.0 - '@next/swc-linux-arm64-gnu': 15.5.0 - '@next/swc-linux-arm64-musl': 15.5.0 - '@next/swc-linux-x64-gnu': 15.5.0 - '@next/swc-linux-x64-musl': 15.5.0 - '@next/swc-win32-arm64-msvc': 15.5.0 - '@next/swc-win32-x64-msvc': 15.5.0 - '@opentelemetry/api': 1.9.0 - babel-plugin-react-compiler: 1.0.0 - sharp: 0.34.4 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.0.7(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@next/env': 16.0.7 '@swc/helpers': 0.5.15 @@ -17395,7 +17121,7 @@ snapshots: postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.1) optionalDependencies: '@next/swc-darwin-arm64': 16.0.7 '@next/swc-darwin-x64': 16.0.7 @@ -17747,8 +17473,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pause-stream@0.0.11: dependencies: through: 2.3.8 @@ -19139,10 +18863,6 @@ snapshots: strip-json-comments@2.0.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 @@ -19155,12 +18875,12 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.1): + styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.1): dependencies: client-only: 0.0.1 react: 19.2.1 optionalDependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 styled-jsx@5.1.6(react@19.1.1): dependencies: @@ -19308,14 +19028,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - tinyrainbow@3.0.3: {} - tinyspy@4.0.4: {} - tldts-core@6.1.86: {} tldts-core@7.0.17: {} @@ -19885,49 +19599,6 @@ snapshots: find-up-simple: 1.0.1 pathe: 2.0.3 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(vite@7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.2.2 - magic-string: 0.30.19 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.3.0 - jsdom: 27.0.1(postcss@8.5.6) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@4.0.1(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.11.6(@types/node@24.3.0)(typescript@5.9.2))(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.1 From 7a096e4b4a521aab31db57e46c31949c2c09f28d Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 7 Dec 2025 15:34:25 +0300 Subject: [PATCH 14/16] fix(registry): update readUsage function to also lookup usage file from registry package --- packages/docs/src/registry/read.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/docs/src/registry/read.ts b/packages/docs/src/registry/read.ts index 104db7569..7acf2d6bb 100644 --- a/packages/docs/src/registry/read.ts +++ b/packages/docs/src/registry/read.ts @@ -31,12 +31,20 @@ export async function readRegistryItem(name: string) { } export async function readUsage(name: string) { - try { - const fileName = resolve(process.cwd(), `src/registry/items/${name}.md`) - return await readFile(fileName, 'utf-8') - } catch { - return null + const paths = [ + resolve(process.cwd(), `src/registry/items/${name}.md`), + resolve(process.cwd(), `node_modules/registry/items/${name}.md`) + ] + + for (const filePath of paths) { + try { + return await readFile(filePath, 'utf-8') + } catch { + continue + } } + + return null } export const registryItemCategories = [ From 821e583958d3373456d92935091a0dbfac79ba20 Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 7 Dec 2025 15:47:17 +0300 Subject: [PATCH 15/16] doc(registry): update parseAsTuple usage to show more useful usecases --- packages/registry/items/parse-as-tuple.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/registry/items/parse-as-tuple.md b/packages/registry/items/parse-as-tuple.md index d0e640fca..9db51d9d4 100644 --- a/packages/registry/items/parse-as-tuple.md +++ b/packages/registry/items/parse-as-tuple.md @@ -2,11 +2,11 @@ The `parseAsTuple` parser allows you to parse fixed-length tuples with **any typ ```ts import { parseAsTuple } from '@/lib/parsers/parse-as-tuple' -import { parseAsInteger } from 'nuqs' +import { parseAsString, parseAsStringLiteral } from 'nuqs' -// Coordinates tuple (x, y) -parseAsTuple([parseAsInteger, parseAsInteger]) +// Sorting tuple (key: string, direction: 'asc' | 'desc') +parseAsTuple([parseAsString, parseAsStringLiteral(['asc', 'desc'])]) // Optionally, customise the separator -parseAsTuple([parseAsInteger, parseAsInteger], ';') +parseAsTuple([parseAsString, parseAsString], ';') ``` From cf615d08101be8d75301732bcfdc0f173fc2d67d Mon Sep 17 00:00:00 2001 From: Islam Naasani Date: Sun, 7 Dec 2025 16:13:56 +0300 Subject: [PATCH 16/16] doc(registry): improve comment syntax in parseAsTuple example --- packages/registry/items/parse-as-tuple.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/registry/items/parse-as-tuple.md b/packages/registry/items/parse-as-tuple.md index 9db51d9d4..26a7f1598 100644 --- a/packages/registry/items/parse-as-tuple.md +++ b/packages/registry/items/parse-as-tuple.md @@ -4,7 +4,7 @@ The `parseAsTuple` parser allows you to parse fixed-length tuples with **any typ import { parseAsTuple } from '@/lib/parsers/parse-as-tuple' import { parseAsString, parseAsStringLiteral } from 'nuqs' -// Sorting tuple (key: string, direction: 'asc' | 'desc') +// Sorting tuple [key: string, direction: 'asc' | 'desc'] parseAsTuple([parseAsString, parseAsStringLiteral(['asc', 'desc'])]) // Optionally, customise the separator