From bc4eafd5a675015d74b369bbae431a242ec078a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 5 Aug 2024 11:02:17 +0200 Subject: [PATCH 1/4] feat: Add Deno.Serve type --- cli/tsc/dts/lib.deno.ns.d.ts | 6 ++++++ tests/specs/serve/type_check/__test__.jsonc | 6 ++++++ tests/specs/serve/type_check/main.out | 5 +++++ tests/specs/serve/type_check/main.ts | 4 ++++ tests/specs/serve/type_check2/__test__.jsonc | 6 ++++++ tests/specs/serve/type_check2/main.out | 5 +++++ tests/specs/serve/type_check2/main.ts | 6 ++++++ 7 files changed, 38 insertions(+) create mode 100644 tests/specs/serve/type_check/__test__.jsonc create mode 100644 tests/specs/serve/type_check/main.out create mode 100644 tests/specs/serve/type_check/main.ts create mode 100644 tests/specs/serve/type_check2/__test__.jsonc create mode 100644 tests/specs/serve/type_check2/main.out create mode 100644 tests/specs/serve/type_check2/main.ts diff --git a/cli/tsc/dts/lib.deno.ns.d.ts b/cli/tsc/dts/lib.deno.ns.d.ts index cbf86eec66a231..fb07cbde949873 100644 --- a/cli/tsc/dts/lib.deno.ns.d.ts +++ b/cli/tsc/dts/lib.deno.ns.d.ts @@ -6256,6 +6256,12 @@ declare namespace Deno { info: ServeHandlerInfo, ) => Response | Promise; + export interface Serve { + fetch: ( + request: Request, + ) => Response | Promise; + } + /** Options which can be set when calling {@linkcode Deno.serve}. * * @category HTTP Server diff --git a/tests/specs/serve/type_check/__test__.jsonc b/tests/specs/serve/type_check/__test__.jsonc new file mode 100644 index 00000000000000..813eafc12f91f3 --- /dev/null +++ b/tests/specs/serve/type_check/__test__.jsonc @@ -0,0 +1,6 @@ +{ + "args": "serve --check --port 12345 main.ts", + "output": "main.out", + "tempDir": true, + "exitCode": 1 +} diff --git a/tests/specs/serve/type_check/main.out b/tests/specs/serve/type_check/main.out new file mode 100644 index 00000000000000..8f9e594a2240e8 --- /dev/null +++ b/tests/specs/serve/type_check/main.out @@ -0,0 +1,5 @@ +Check [WILDCARD] +error: TS2353 [ERROR]: Object literal may only specify known properties, and 'bad' does not exist in type 'Serve'. + bad() { + ~~~ + at [WILDCARD]main.ts:2:3 diff --git a/tests/specs/serve/type_check/main.ts b/tests/specs/serve/type_check/main.ts new file mode 100644 index 00000000000000..fddc19a5f29699 --- /dev/null +++ b/tests/specs/serve/type_check/main.ts @@ -0,0 +1,4 @@ +export default { + bad() { + }, +} satisfies Deno.Serve; diff --git a/tests/specs/serve/type_check2/__test__.jsonc b/tests/specs/serve/type_check2/__test__.jsonc new file mode 100644 index 00000000000000..813eafc12f91f3 --- /dev/null +++ b/tests/specs/serve/type_check2/__test__.jsonc @@ -0,0 +1,6 @@ +{ + "args": "serve --check --port 12345 main.ts", + "output": "main.out", + "tempDir": true, + "exitCode": 1 +} diff --git a/tests/specs/serve/type_check2/main.out b/tests/specs/serve/type_check2/main.out new file mode 100644 index 00000000000000..259acb85b797a7 --- /dev/null +++ b/tests/specs/serve/type_check2/main.out @@ -0,0 +1,5 @@ +Check [WILDCARD] +error: TS2339 [ERROR]: Property 'doesnt_exist' does not exist on type 'Request'. + console.log(request.doesnt_exist); + ~~~~~~~~~~~~ + at [WILDCARD]main.ts:3:25 diff --git a/tests/specs/serve/type_check2/main.ts b/tests/specs/serve/type_check2/main.ts new file mode 100644 index 00000000000000..678b829630fc5f --- /dev/null +++ b/tests/specs/serve/type_check2/main.ts @@ -0,0 +1,6 @@ +export default { + fetch(request) { + console.log(request.doesnt_exist); + return new Response("Hello world!"); + }, +} satisfies Deno.Serve; From 8e0fcb3e608f5eac5a4d490b6553faab716dc9f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 5 Aug 2024 11:55:49 +0200 Subject: [PATCH 2/4] rename to ServeDefaultExport --- cli/tsc/dts/lib.deno.ns.d.ts | 2 +- tests/specs/serve/type_check/main.out | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/tsc/dts/lib.deno.ns.d.ts b/cli/tsc/dts/lib.deno.ns.d.ts index fb07cbde949873..4fddf1852ecf35 100644 --- a/cli/tsc/dts/lib.deno.ns.d.ts +++ b/cli/tsc/dts/lib.deno.ns.d.ts @@ -6256,7 +6256,7 @@ declare namespace Deno { info: ServeHandlerInfo, ) => Response | Promise; - export interface Serve { + export interface ServeDefaultExport { fetch: ( request: Request, ) => Response | Promise; diff --git a/tests/specs/serve/type_check/main.out b/tests/specs/serve/type_check/main.out index 8f9e594a2240e8..4613ef265c7889 100644 --- a/tests/specs/serve/type_check/main.out +++ b/tests/specs/serve/type_check/main.out @@ -1,5 +1,5 @@ Check [WILDCARD] -error: TS2353 [ERROR]: Object literal may only specify known properties, and 'bad' does not exist in type 'Serve'. +error: TS2353 [ERROR]: Object literal may only specify known properties, and 'bad' does not exist in type 'ServeDefaultExport'. bad() { ~~~ at [WILDCARD]main.ts:2:3 From 1d64f3f978210e2419776f50b061add6fe65a52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 5 Aug 2024 13:49:08 +0200 Subject: [PATCH 3/4] add jsdoc --- cli/tsc/dts/lib.deno.ns.d.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cli/tsc/dts/lib.deno.ns.d.ts b/cli/tsc/dts/lib.deno.ns.d.ts index 4fddf1852ecf35..084dc1b76a87e5 100644 --- a/cli/tsc/dts/lib.deno.ns.d.ts +++ b/cli/tsc/dts/lib.deno.ns.d.ts @@ -6256,7 +6256,30 @@ declare namespace Deno { info: ServeHandlerInfo, ) => Response | Promise; + /** Interface that module run with `deno serve` subcommand must conform to. + * + * To ensure your code is type-checked properly, make sure to add `satisfies Deno.ServeDefaultExport` + * to the `export default { ... }` like so: + * + * ```ts + * export default { + * fetch(req) { + * return new Response("Hello world"); + * } + * } satisfies Deno.ServeDefaultExport; + * ``` + * + * @category HTTP Server + */ export interface ServeDefaultExport { + /** A handler for HTTP requests. Consumes a request and returns a response. + * + * If a handler throws, the server calling the handler will assume the impact + * of the error is isolated to the individual request. It will catch the error + * and if necessary will close the underlying connection. + * + * @category HTTP Server + */ fetch: ( request: Request, ) => Response | Promise; From 95b3e59919ccb4b3f241839acdfc3b6406663664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 5 Aug 2024 14:06:36 +0200 Subject: [PATCH 4/4] fix --- tests/specs/serve/type_check/main.ts | 2 +- tests/specs/serve/type_check2/main.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/specs/serve/type_check/main.ts b/tests/specs/serve/type_check/main.ts index fddc19a5f29699..10ba18337854e6 100644 --- a/tests/specs/serve/type_check/main.ts +++ b/tests/specs/serve/type_check/main.ts @@ -1,4 +1,4 @@ export default { bad() { }, -} satisfies Deno.Serve; +} satisfies Deno.ServeDefaultExport; diff --git a/tests/specs/serve/type_check2/main.ts b/tests/specs/serve/type_check2/main.ts index 678b829630fc5f..41cbf30ec56e48 100644 --- a/tests/specs/serve/type_check2/main.ts +++ b/tests/specs/serve/type_check2/main.ts @@ -3,4 +3,4 @@ export default { console.log(request.doesnt_exist); return new Response("Hello world!"); }, -} satisfies Deno.Serve; +} satisfies Deno.ServeDefaultExport;