Skip to content

Commit 6299b37

Browse files
feat(qwik-city): AWS adapter middleware (#5732)
Co-authored-by: Miško Hevery <[email protected]>
1 parent 164807b commit 6299b37

File tree

12 files changed

+354
-123
lines changed

12 files changed

+354
-123
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"id": "qwik-city-middleware-aws-lambda",
3+
"package": "@builder.io/qwik-city/middleware/aws-lambda",
4+
"members": [
5+
{
6+
"name": "createQwikCity",
7+
"id": "createqwikcity",
8+
"hierarchy": [
9+
{
10+
"name": "createQwikCity",
11+
"id": "createqwikcity"
12+
}
13+
],
14+
"kind": "Function",
15+
"content": "```typescript\nexport declare function createQwikCity(opts: AwsOpt): {\n fixPath: (pathT: string) => string;\n router: (req: import(\"http\").IncomingMessage | import(\"http2\").Http2ServerRequest, res: import(\"http\").ServerResponse<import(\"http\").IncomingMessage>, next: import(\"@builder.io/qwik-city/middleware/node\").NodeRequestNextFunction) => Promise<void>;\n staticFile: (req: import(\"http\").IncomingMessage | import(\"http2\").Http2ServerRequest, res: import(\"http\").ServerResponse<import(\"http\").IncomingMessage>, next: (e?: any) => void) => Promise<void>;\n notFound: (req: import(\"http\").IncomingMessage | import(\"http2\").Http2ServerRequest, res: import(\"http\").ServerResponse<import(\"http\").IncomingMessage>, next: (e: any) => void) => Promise<void>;\n handle: (req: any, res: any) => void;\n};\n```\n\n\n| Parameter | Type | Description |\n| --- | --- | --- |\n| opts | AwsOpt | |\n\n**Returns:**\n\n{ fixPath: (pathT: string) =&gt; string; router: (req: import(\"http\").IncomingMessage \\| import(\"http2\").Http2ServerRequest, res: import(\"http\").ServerResponse&lt;import(\"http\").IncomingMessage&gt;, next: import(\"@builder.io/qwik-city/middleware/node\").NodeRequestNextFunction) =&gt; Promise&lt;void&gt;; staticFile: (req: import(\"http\").IncomingMessage \\| import(\"http2\").Http2ServerRequest, res: import(\"http\").ServerResponse&lt;import(\"http\").IncomingMessage&gt;, next: (e?: any) =&gt; void) =&gt; Promise&lt;void&gt;; notFound: (req: import(\"http\").IncomingMessage \\| import(\"http2\").Http2ServerRequest, res: import(\"http\").ServerResponse&lt;import(\"http\").IncomingMessage&gt;, next: (e: any) =&gt; void) =&gt; Promise&lt;void&gt;; handle: (req: any, res: any) =&gt; void; }",
16+
"editUrl": "https://github.com/BuilderIO/qwik/tree/main/packages/qwik-city/middleware/aws-lambda/index.ts",
17+
"mdFile": "qwik-city.createqwikcity.md"
18+
},
19+
{
20+
"name": "PlatformAwsLambda",
21+
"id": "platformawslambda",
22+
"hierarchy": [
23+
{
24+
"name": "PlatformAwsLambda",
25+
"id": "platformawslambda"
26+
}
27+
],
28+
"kind": "Interface",
29+
"content": "```typescript\nexport interface PlatformAwsLambda extends Object \n```\n**Extends:** Object",
30+
"editUrl": "https://github.com/BuilderIO/qwik/tree/main/packages/qwik-city/middleware/aws-lambda/index.ts",
31+
"mdFile": "qwik-city.platformawslambda.md"
32+
},
33+
{
34+
"name": "QwikCityAwsLambdaOptions",
35+
"id": "qwikcityawslambdaoptions",
36+
"hierarchy": [
37+
{
38+
"name": "QwikCityAwsLambdaOptions",
39+
"id": "qwikcityawslambdaoptions"
40+
}
41+
],
42+
"kind": "Interface",
43+
"content": "```typescript\nexport interface QwikCityAwsLambdaOptions extends ServerRenderOptions \n```\n**Extends:** ServerRenderOptions",
44+
"editUrl": "https://github.com/BuilderIO/qwik/tree/main/packages/qwik-city/middleware/aws-lambda/index.ts",
45+
"mdFile": "qwik-city.qwikcityawslambdaoptions.md"
46+
}
47+
]
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
---
2+
title: \@builder.io/qwik-city/middleware/aws-lambda API Reference
3+
---
4+
5+
# [API](/api) &rsaquo; @builder.io/qwik-city/middleware/aws-lambda
6+
7+
## createQwikCity
8+
9+
```typescript
10+
export declare function createQwikCity(opts: AwsOpt): {
11+
fixPath: (pathT: string) => string;
12+
router: (
13+
req: import("http").IncomingMessage | import("http2").Http2ServerRequest,
14+
res: import("http").ServerResponse<import("http").IncomingMessage>,
15+
next: import("@builder.io/qwik-city/middleware/node").NodeRequestNextFunction,
16+
) => Promise<void>;
17+
staticFile: (
18+
req: import("http").IncomingMessage | import("http2").Http2ServerRequest,
19+
res: import("http").ServerResponse<import("http").IncomingMessage>,
20+
next: (e?: any) => void,
21+
) => Promise<void>;
22+
notFound: (
23+
req: import("http").IncomingMessage | import("http2").Http2ServerRequest,
24+
res: import("http").ServerResponse<import("http").IncomingMessage>,
25+
next: (e: any) => void,
26+
) => Promise<void>;
27+
handle: (req: any, res: any) => void;
28+
};
29+
```
30+
31+
| Parameter | Type | Description |
32+
| --------- | ------ | ----------- |
33+
| opts | AwsOpt | |
34+
35+
**Returns:**
36+
37+
{ fixPath: (pathT: string) =&gt; string; router: (req: import("http").IncomingMessage \| import("http2").Http2ServerRequest, res: import("http").ServerResponse&lt;import("http").IncomingMessage&gt;, next: import("@builder.io/qwik-city/middleware/node").NodeRequestNextFunction) =&gt; Promise&lt;void&gt;; staticFile: (req: import("http").IncomingMessage \| import("http2").Http2ServerRequest, res: import("http").ServerResponse&lt;import("http").IncomingMessage&gt;, next: (e?: any) =&gt; void) =&gt; Promise&lt;void&gt;; notFound: (req: import("http").IncomingMessage \| import("http2").Http2ServerRequest, res: import("http").ServerResponse&lt;import("http").IncomingMessage&gt;, next: (e: any) =&gt; void) =&gt; Promise&lt;void&gt;; handle: (req: any, res: any) =&gt; void; }
38+
39+
[Edit this section](https://github.com/BuilderIO/qwik/tree/main/packages/qwik-city/middleware/aws-lambda/index.ts)
40+
41+
## PlatformAwsLambda
42+
43+
```typescript
44+
export interface PlatformAwsLambda extends Object
45+
```
46+
47+
**Extends:** Object
48+
49+
[Edit this section](https://github.com/BuilderIO/qwik/tree/main/packages/qwik-city/middleware/aws-lambda/index.ts)
50+
51+
## QwikCityAwsLambdaOptions
52+
53+
```typescript
54+
export interface QwikCityAwsLambdaOptions extends ServerRenderOptions
55+
```
56+
57+
**Extends:** ServerRenderOptions
58+
59+
[Edit this section](https://github.com/BuilderIO/qwik/tree/main/packages/qwik-city/middleware/aws-lambda/index.ts)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3+
"extends": "../../api-extractor.json",
4+
"mainEntryPointFilePath": "<projectFolder>/dist-dev/dts-out/packages/qwik-city/middleware/aws-lambda/index.d.ts",
5+
"apiReport": {
6+
"enabled": true,
7+
"reportFileName": "api.md",
8+
"reportFolder": "<projectFolder>/packages/qwik-city/middleware/aws-lambda/",
9+
"reportTempFolder": "<projectFolder>/dist-dev/api-extractor/qwik-city/middleware/aws-lambda"
10+
},
11+
"dtsRollup": {
12+
"enabled": true,
13+
"untrimmedFilePath": "<projectFolder>/packages/qwik-city/lib/middleware/aws-lambda/index.d.ts"
14+
},
15+
"docModel": {
16+
"enabled": true,
17+
"apiJsonFilePath": "<projectFolder>/dist-dev/api/qwik-city/middleware/aws-lambda/docs.api.json"
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
## API Report File for "@builder.io/qwik-city"
2+
3+
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4+
5+
```ts
6+
7+
/// <reference types="node" />
8+
9+
import type { EnvGetter } from '@builder.io/qwik-city/middleware/request-handler';
10+
import { Http2ServerRequest } from 'http2';
11+
import { IncomingMessage } from 'http';
12+
import { NodeRequestNextFunction } from '@builder.io/qwik-city/middleware/node';
13+
import type { QwikIntrinsicElements } from '@builder.io/qwik';
14+
import type { QwikManifest } from '@builder.io/qwik/optimizer';
15+
import type { RequestHandler } from '@builder.io/qwik-city/middleware/request-handler';
16+
import type { ResolvedManifest } from '@builder.io/qwik/optimizer';
17+
import type { ResolveSyncValue } from '@builder.io/qwik-city/middleware/request-handler';
18+
import type { ServerRenderOptions } from '@builder.io/qwik-city/middleware/request-handler';
19+
import { ServerResponse } from 'http';
20+
import type { SnapshotResult } from '@builder.io/qwik';
21+
import type { StreamWriter } from '@builder.io/qwik';
22+
import type { SymbolMapperFn } from '@builder.io/qwik/optimizer';
23+
24+
// Warning: (ae-forgotten-export) The symbol "AwsOpt" needs to be exported by the entry point index.d.ts
25+
//
26+
// @public (undocumented)
27+
export function createQwikCity(opts: AwsOpt): {
28+
fixPath: (pathT: string) => string;
29+
router: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse<IncomingMessage>, next: NodeRequestNextFunction) => Promise<void>;
30+
staticFile: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse<IncomingMessage>, next: (e?: any) => void) => Promise<void>;
31+
notFound: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse<IncomingMessage>, next: (e: any) => void) => Promise<void>;
32+
handle: (req: any, res: any) => void;
33+
};
34+
35+
// @public (undocumented)
36+
export interface PlatformAwsLambda extends Object {
37+
}
38+
39+
// @public (undocumented)
40+
export interface QwikCityAwsLambdaOptions extends ServerRenderOptions {
41+
}
42+
43+
// (No @packageDocumentation comment for this package)
44+
45+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { createQwikCity as createQwikCityNode } from '@builder.io/qwik-city/middleware/node';
2+
import type { ServerRenderOptions } from '@builder.io/qwik-city/middleware/request-handler';
3+
import type { QwikCityPlan } from 'packages/qwik-city/runtime/src/types';
4+
import type { QwikManifest, Render } from 'packages/qwik/src/server/types';
5+
6+
interface AwsOpt {
7+
render: Render;
8+
manifest: QwikManifest;
9+
qwikCityPlan: QwikCityPlan;
10+
}
11+
12+
/** @public */
13+
export function createQwikCity(opts: AwsOpt) {
14+
try {
15+
const { router, staticFile, notFound } = createQwikCityNode({
16+
render: opts.render,
17+
qwikCityPlan: opts.qwikCityPlan,
18+
manifest: opts.manifest,
19+
static: {
20+
cacheControl: 'public, max-age=31557600',
21+
},
22+
getOrigin(req) {
23+
if (process.env.IS_OFFLINE) {
24+
return `http://${req.headers.host}`;
25+
}
26+
return null;
27+
},
28+
});
29+
30+
const fixPath = (pathT: string) => {
31+
if (opts.qwikCityPlan.trailingSlash) {
32+
const url = new URL(pathT, 'http://aws-qwik.local');
33+
if (url.pathname.includes('.', url.pathname.lastIndexOf('/'))) {
34+
return pathT;
35+
}
36+
if (!url.pathname.endsWith('/')) {
37+
return url.pathname + '/' + url.search;
38+
}
39+
}
40+
return pathT;
41+
};
42+
43+
const handle = (req: any, res: any) => {
44+
req.url = fixPath(req.url);
45+
staticFile(req, res, () => {
46+
router(req, res, () => {
47+
notFound(req, res, () => {});
48+
});
49+
});
50+
};
51+
52+
return { fixPath, router, staticFile, notFound, handle };
53+
} catch (err: any) {
54+
throw new Error(err.message);
55+
}
56+
}
57+
58+
/** @public */
59+
export interface QwikCityAwsLambdaOptions extends ServerRenderOptions {}
60+
61+
/** @public */
62+
export interface PlatformAwsLambda extends Object {}

packages/qwik-city/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@
9595
"./middleware/azure-swa": {
9696
"import": "./lib/middleware/azure-swa/index.mjs"
9797
},
98+
"./middleware/aws-lambda": {
99+
"import": "./lib/middleware/aws-lambda/index.mjs"
100+
},
98101
"./middleware/cloudflare-pages": {
99102
"import": "./lib/middleware/cloudflare-pages/index.mjs"
100103
},

0 commit comments

Comments
 (0)