diff --git a/.changeset/sharp-starfishes-compete.md b/.changeset/sharp-starfishes-compete.md new file mode 100644 index 0000000000000..e3e3f6cb4c40e --- /dev/null +++ b/.changeset/sharp-starfishes-compete.md @@ -0,0 +1,11 @@ +--- +'astro': major +--- + +The adapter API now offers a simpler signature for rendering. The `render()` method on App now accepts an `options` object. + +```diff +- app.render(request, undefined, locals) ++ app.render(request, { locals }) +``` +The current signature is deprecated but will continue to function until next major version. diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index 23ecba8371ed6..c11f5ca1a17ca 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -145,7 +145,25 @@ export class App { return routeData; } - async render(request: Request, routeData?: RouteData, locals?: object): Promise { + async render(request: Request, options?: { routeData?: RouteData, locals?: object }): Promise + async render(request: Request, routeData?: RouteData, locals?: object): Promise + async render(request: Request, ...rest: any[]): Promise { + let routeData: RouteData | undefined; + let locals: object | undefined; + if (rest.length === 2) { + routeData = rest[0]; + locals = rest[1]; + } + else if (rest.length === 1) { + const [ options ] = rest; + if (options && 'routeData' in options) { + routeData = options.routeData; + } + if (options && 'locals' in options) { + locals = options.locals; + } + } + // Handle requests with duplicate slashes gracefully by cloning with a cleaned-up request URL if (request.url !== collapseDuplicateSlashes(request.url)) { request = new Request(collapseDuplicateSlashes(request.url), request); diff --git a/packages/astro/src/core/app/node.ts b/packages/astro/src/core/app/node.ts index 1df931eca22e6..8aac15c9d319d 100644 --- a/packages/astro/src/core/app/node.ts +++ b/packages/astro/src/core/app/node.ts @@ -116,11 +116,28 @@ export class NodeApp extends App { } return super.match(req, opts); } - render(req: NodeIncomingMessage | Request, routeData?: RouteData, locals?: object) { + render(request: NodeIncomingMessage | Request, options?: { routeData?: RouteData, locals?: object }): Promise + render(request: NodeIncomingMessage | Request, routeData?: RouteData, locals?: object): Promise + render(req: NodeIncomingMessage | Request, ...rest: any[]) { + let routeData: RouteData | undefined; + let locals: object | undefined; + if (rest.length === 2) { + routeData = rest[0]; + locals = rest[1]; + } + else if (rest.length === 1) { + const [ options ] = rest; + if (options && 'routeData' in options) { + routeData = options.routeData; + } + if (options && 'locals' in options) { + locals = options.locals; + } + } if (!(req instanceof Request)) { req = createRequestFromNodeRequest(req); } - return super.render(req, routeData, locals); + return super.render(req, { routeData, locals }); } }