From 7ad6d979cc20494afc1ac2daf194199dd529a56f Mon Sep 17 00:00:00 2001 From: Pedro Cattori Date: Sun, 21 Apr 2024 12:27:15 -0400 Subject: [PATCH] opt-in type inference for single-fetch --- .changeset/young-eagles-grab.md | 15 ++++++ packages/remix-react/future/single-fetch.d.ts | 51 +++++++++++++++++++ packages/remix-react/rollup.config.js | 1 + 3 files changed, 67 insertions(+) create mode 100644 .changeset/young-eagles-grab.md create mode 100644 packages/remix-react/future/single-fetch.d.ts diff --git a/.changeset/young-eagles-grab.md b/.changeset/young-eagles-grab.md new file mode 100644 index 00000000000..a925ff755cf --- /dev/null +++ b/.changeset/young-eagles-grab.md @@ -0,0 +1,15 @@ +--- +"@remix-run/react": patch +--- + +Opt-in types for single-fetch + +In your `tsconfig.json`: + +```json +{ + "include": [ + "./node_modules/@remix-run/react/future/single-fetch.d.ts" + ] +} +``` diff --git a/packages/remix-react/future/single-fetch.d.ts b/packages/remix-react/future/single-fetch.d.ts new file mode 100644 index 00000000000..65b3f4adca5 --- /dev/null +++ b/packages/remix-react/future/single-fetch.d.ts @@ -0,0 +1,51 @@ +import type { AppLoadContext } from "@remix-run/server-runtime"; + +type Serializable = + | undefined + | null + | boolean + | string + | symbol + | number + | Array + | { [key: PropertyKey]: Serializable } + | bigint + | Date + | URL + | RegExp + | Error + | Map + | Set + | Promise; + +type Params = { + readonly [key in Key]: string | undefined; +}; + +type ResponseStub = { + status?: number; + headers: Headers; +}; + +type DataFunction = ( + args: { + request: Request; + params: Params; + context: AppLoadContext; + response: ResponseStub; + }, + handlerCtx?: unknown +) => Serializable; + +type Loader = DataFunction & { hydrate?: boolean }; +type Action = DataFunction; + +declare module "@remix-run/react" { + export function useLoaderData(): T extends Loader + ? Awaited> + : never; + + export function useActionData(): T extends Action + ? Awaited> + : never; +} diff --git a/packages/remix-react/rollup.config.js b/packages/remix-react/rollup.config.js index 5ad9ecd1c06..20d9673a71f 100644 --- a/packages/remix-react/rollup.config.js +++ b/packages/remix-react/rollup.config.js @@ -51,6 +51,7 @@ module.exports = function rollup() { { src: "LICENSE.md", dest: [outputDir, sourceDir] }, { src: `${sourceDir}/package.json`, dest: outputDir }, { src: `${sourceDir}/README.md`, dest: outputDir }, + { src: `${sourceDir}/future`, dest: outputDir }, ], }), copyToPlaygrounds(),