Skip to content

Commit

Permalink
fix: qwik-city dev mode (#3856)
Browse files Browse the repository at this point in the history
  • Loading branch information
manucorporat committed Apr 20, 2023
1 parent e6e5ab7 commit 2baa85e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import type { Render, RenderToStringResult } from '@builder.io/qwik/server';
import type { QRL, _deserializeData, _serializeData } from '@builder.io/qwik';
import { getQwikCityServerData } from './response-page';
import { RedirectMessage } from './redirect-handler';
import { isDev } from '@builder.io/qwik/build';

export const resolveRequestHandlers = (
serverPlugins: RouteModule[] | undefined,
Expand Down Expand Up @@ -155,6 +154,7 @@ export function actionsMiddleware(routeLoaders: LoaderInternal[], routeActions:
}
const { method } = requestEv;
const loaders = getRequestLoaders(requestEv);
const isDev = getRequestMode(requestEv) === 'dev';
const qwikSerializer = requestEv[RequestEvQwikSerializer];
if (isDev && method === 'GET') {
if (requestEv.query.has(QACTION_KEY)) {
Expand Down Expand Up @@ -183,7 +183,9 @@ export function actionsMiddleware(routeLoaders: LoaderInternal[], routeActions:
loaders[selectedAction] = requestEv.fail(result.status ?? 500, result.error);
} else {
const actionResolved = await action.__qrl(result.data as JSONObject, requestEv);
verifySerializable(qwikSerializer, actionResolved, action.__qrl);
if (isDev) {
verifySerializable(qwikSerializer, actionResolved, action.__qrl);
}
loaders[selectedAction] = actionResolved;
}
}
Expand Down Expand Up @@ -213,7 +215,9 @@ export function actionsMiddleware(routeLoaders: LoaderInternal[], routeActions:
if (typeof loaderResolved === 'function') {
loaders[loaderId] = loaderResolved();
} else {
verifySerializable(qwikSerializer, loaderResolved, loader.__qrl);
if (isDev) {
verifySerializable(qwikSerializer, loaderResolved, loader.__qrl);
}
loaders[loaderId] = loaderResolved;
}
return loaderResolved;
Expand Down Expand Up @@ -258,6 +262,7 @@ async function pureServerFunction(ev: RequestEvent) {
ev.request.headers.get('Content-Type') === 'application/qwik-json'
) {
ev.exit();
const isDev = getRequestMode(ev) === 'dev';
const qwikSerializer = (ev as RequestEventInternal)[RequestEvQwikSerializer];
const data = await ev.parseBody();
if (Array.isArray(data)) {
Expand All @@ -275,7 +280,9 @@ async function pureServerFunction(ev: RequestEvent) {
ev.headers.set('Content-Type', 'text/event-stream');
const stream = ev.getWritableStream().getWriter();
for await (const item of result) {
verifySerializable(qwikSerializer, item, qrl);
if (isDev) {
verifySerializable(qwikSerializer, item, qrl);
}
ev.headers.set('Content-Type', 'application/qwik-json');
const message = await qwikSerializer._serializeData(item, true);
stream.write(encoder.encode(`event: qwik\ndata: ${message}\n\n`));
Expand Down Expand Up @@ -316,15 +323,13 @@ function fixTrailingSlash(ev: RequestEvent) {
}

export function verifySerializable(qwikSerializer: QwikSerializer, data: any, qrl: QRL) {
if (isDev) {
try {
qwikSerializer._verifySerializable(data, undefined);
} catch (e: any) {
if (e instanceof Error && qrl.dev) {
(e as any).loc = qrl.dev;
}
throw e;
try {
qwikSerializer._verifySerializable(data, undefined);
} catch (e: any) {
if (e instanceof Error && qrl.dev) {
(e as any).loc = qrl.dev;
}
throw e;
}
}

Expand All @@ -346,17 +351,21 @@ export function getPathname(url: URL, trailingSlash: boolean | undefined) {

export const encoder = /*#__PURE__*/ new TextEncoder();

export function securityMiddleware({ url, request, error }: RequestEvent) {
let inputOrigin = request.headers.get('origin');
let origin = url.origin;
export function securityMiddleware(requestEv: RequestEvent) {
const isDev = getRequestMode(requestEv) === 'dev';
let inputOrigin = requestEv.request.headers.get('origin');
let origin = requestEv.url.origin;
if (isDev) {
// In development, we compare the host instead of the origin.
inputOrigin = inputOrigin ? new URL(inputOrigin).host : null;
origin = url.host;
origin = requestEv.url.host;
}
const forbidden = inputOrigin !== origin;
if (forbidden) {
throw error(403, `Cross-site ${request.method} form submissions are forbidden`);
throw requestEv.error(
403,
`Cross-site ${requestEv.request.method} form submissions are forbidden`
);
}
}
export function renderQwikMiddleware(render: Render) {
Expand Down
6 changes: 4 additions & 2 deletions scripts/qwik-city.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,6 @@ async function buildVite(config: BuildConfig, inputDir: string, outputDir: strin
'node-fetch',
'undici',
'typescript',
'@builder.io/qwik',
'@builder.io/qwik/optimizer',
];

const swRegisterPath = join(inputDir, 'runtime', 'src', 'sw-register.ts');
Expand All @@ -208,6 +206,10 @@ async function buildVite(config: BuildConfig, inputDir: string, outputDir: strin
target: nodeTarget,
format: 'esm',
external,
alias: {
'@builder.io/qwik': 'noop',
'@builder.io/qwik/optimizer': 'noop',
},
watch: watcher(config),
plugins: [serviceWorkerRegisterBuild(swRegisterCode)],
});
Expand Down

0 comments on commit 2baa85e

Please sign in to comment.