@solidjs/start 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/index.d.ts +7 -2
- package/dist/middleware/index.d.ts +1 -1
- package/dist/runtime/server-handler.js +51 -39
- package/dist/server/fetchEvent.js +1 -1
- package/dist/server/pageEvent.js +3 -1
- package/dist/server/renderAsset.jsx +2 -1
- package/dist/shared/GET.js +2 -3
- package/package.json +2 -2
package/config/index.d.ts
CHANGED
|
@@ -3,9 +3,14 @@ import type { CustomizableConfig } from "vinxi/dist/types/lib/vite-dev";
|
|
|
3
3
|
import { InlineConfig } from "vite";
|
|
4
4
|
import type { Options } from "vite-plugin-solid";
|
|
5
5
|
|
|
6
|
-
//
|
|
6
|
+
// should probably be maintained by Vinxi
|
|
7
|
+
type VinxiViteServerOptions = Omit<
|
|
8
|
+
InlineConfig["server"],
|
|
9
|
+
"port" | "strictPort" | "host" | "middlewareMode" | "open"
|
|
10
|
+
>;
|
|
11
|
+
|
|
7
12
|
type ViteCustomizableConfig = CustomizableConfig & {
|
|
8
|
-
server?:
|
|
13
|
+
server?: VinxiViteServerOptions;
|
|
9
14
|
};
|
|
10
15
|
|
|
11
16
|
type SolidStartInlineConfig = {
|
|
@@ -2,7 +2,7 @@ import type { FetchEvent } from "../server/types";
|
|
|
2
2
|
/** Function responsible for receiving an observable [operation]{@link Operation} and returning a [result]{@link OperationResult}. */
|
|
3
3
|
export type MiddlewareFn = (event: FetchEvent) => Promise<unknown> | unknown;
|
|
4
4
|
/** This composes an array of Exchanges into a single ExchangeIO function */
|
|
5
|
-
export type RequestMiddleware = (event: FetchEvent) => Response | Promise<Response> | void | Promise<void>;
|
|
5
|
+
export type RequestMiddleware = (event: FetchEvent) => Response | Promise<Response> | void | Promise<void> | Promise<void | Response>;
|
|
6
6
|
type EventHandlerResponse<T = any> = T | Promise<T>;
|
|
7
7
|
type ResponseMiddlewareResponseParam = {
|
|
8
8
|
body?: Awaited<EventHandlerResponse>;
|
|
@@ -8,8 +8,8 @@ import { provideRequestEvent } from "solid-js/web/storage";
|
|
|
8
8
|
import { eventHandler, setHeader, setResponseStatus } from "vinxi/http";
|
|
9
9
|
import invariant from "vinxi/lib/invariant";
|
|
10
10
|
import { cloneEvent, getFetchEvent, mergeResponseHeaders } from "../server/fetchEvent";
|
|
11
|
-
import { createPageEvent } from "../server/pageEvent";
|
|
12
11
|
import { getExpectedRedirectStatus } from "../server/handler";
|
|
12
|
+
import { createPageEvent } from "../server/pageEvent";
|
|
13
13
|
function createChunk(data) {
|
|
14
14
|
const encodeData = new TextEncoder().encode(data);
|
|
15
15
|
const bytes = encodeData.length;
|
|
@@ -139,45 +139,26 @@ async function handleServerFunction(h3Event) {
|
|
|
139
139
|
result = await handleSingleFlight(event, result);
|
|
140
140
|
}
|
|
141
141
|
// handle responses
|
|
142
|
-
if (result instanceof Response
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
result
|
|
142
|
+
if (result instanceof Response) {
|
|
143
|
+
if (result.headers && result.headers.has("X-Content-Raw"))
|
|
144
|
+
return result;
|
|
145
|
+
if (instance) {
|
|
146
|
+
// forward headers
|
|
147
|
+
if (result.headers)
|
|
148
|
+
mergeResponseHeaders(h3Event, result.headers);
|
|
149
|
+
// forward non-redirect statuses
|
|
150
|
+
if (result.status && (result.status < 300 || result.status >= 400))
|
|
151
|
+
setResponseStatus(h3Event, result.status);
|
|
152
|
+
if (result.customBody) {
|
|
153
|
+
result = await result.customBody();
|
|
154
|
+
}
|
|
155
|
+
else if (result.body == undefined)
|
|
156
|
+
result = null;
|
|
151
157
|
}
|
|
152
|
-
else if (result.body == undefined)
|
|
153
|
-
result = null;
|
|
154
158
|
}
|
|
155
159
|
// handle no JS success case
|
|
156
|
-
if (!instance)
|
|
157
|
-
|
|
158
|
-
let redirectUrl = new URL(request.headers.get("referer")).toString();
|
|
159
|
-
let statusCode = 302;
|
|
160
|
-
if (result instanceof Response && result.headers.has("Location")) {
|
|
161
|
-
redirectUrl = new URL(result.headers.get("Location"), new URL(request.url).origin + import.meta.env.SERVER_BASE_URL).toString();
|
|
162
|
-
statusCode = getExpectedRedirectStatus(result);
|
|
163
|
-
}
|
|
164
|
-
return new Response(null, {
|
|
165
|
-
status: statusCode,
|
|
166
|
-
headers: {
|
|
167
|
-
Location: redirectUrl,
|
|
168
|
-
...(result
|
|
169
|
-
? {
|
|
170
|
-
"Set-Cookie": `flash=${JSON.stringify({
|
|
171
|
-
url: url.pathname + encodeURIComponent(url.search),
|
|
172
|
-
result: isError ? result.message : result,
|
|
173
|
-
error: isError,
|
|
174
|
-
input: [...parsed.slice(0, -1), [...parsed[parsed.length - 1].entries()]]
|
|
175
|
-
})}; Secure; HttpOnly;`
|
|
176
|
-
}
|
|
177
|
-
: {})
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
160
|
+
if (!instance)
|
|
161
|
+
return handleNoJS(result, request, parsed);
|
|
181
162
|
setHeader(h3Event, "content-type", "text/javascript");
|
|
182
163
|
return serializeToStream(instance, result);
|
|
183
164
|
}
|
|
@@ -197,10 +178,14 @@ async function handleServerFunction(h3Event) {
|
|
|
197
178
|
}
|
|
198
179
|
else if (x.body == undefined)
|
|
199
180
|
x = null;
|
|
181
|
+
setHeader(h3Event, "X-Error", "true");
|
|
200
182
|
}
|
|
201
|
-
else {
|
|
183
|
+
else if (instance) {
|
|
202
184
|
const error = x instanceof Error ? x.message : typeof x === "string" ? x : "true";
|
|
203
|
-
setHeader(h3Event, "X-Error", error);
|
|
185
|
+
setHeader(h3Event, "X-Error", error.replace(/[\r\n]+/g, ""));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
x = handleNoJS(x, request, parsed, true);
|
|
204
189
|
}
|
|
205
190
|
if (instance) {
|
|
206
191
|
setHeader(h3Event, "content-type", "text/javascript");
|
|
@@ -209,6 +194,33 @@ async function handleServerFunction(h3Event) {
|
|
|
209
194
|
return x;
|
|
210
195
|
}
|
|
211
196
|
}
|
|
197
|
+
function handleNoJS(result, request, parsed, thrown) {
|
|
198
|
+
const url = new URL(request.url);
|
|
199
|
+
const isError = result instanceof Error;
|
|
200
|
+
let redirectUrl = new URL(request.headers.get("referer")).toString();
|
|
201
|
+
let statusCode = 302;
|
|
202
|
+
if (result instanceof Response && result.headers.has("Location")) {
|
|
203
|
+
redirectUrl = new URL(result.headers.get("Location"), url.origin + import.meta.env.SERVER_BASE_URL).toString();
|
|
204
|
+
statusCode = getExpectedRedirectStatus(result);
|
|
205
|
+
}
|
|
206
|
+
return new Response(null, {
|
|
207
|
+
status: statusCode,
|
|
208
|
+
headers: {
|
|
209
|
+
Location: redirectUrl,
|
|
210
|
+
...(result
|
|
211
|
+
? {
|
|
212
|
+
"Set-Cookie": `flash=${JSON.stringify({
|
|
213
|
+
url: url.pathname + encodeURIComponent(url.search),
|
|
214
|
+
result: isError ? result.message : result,
|
|
215
|
+
thrown: thrown,
|
|
216
|
+
error: isError,
|
|
217
|
+
input: [...parsed.slice(0, -1), [...parsed[parsed.length - 1].entries()]]
|
|
218
|
+
})}; Secure; HttpOnly;`
|
|
219
|
+
}
|
|
220
|
+
: {})
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
212
224
|
let App;
|
|
213
225
|
async function handleSingleFlight(sourceEvent, result) {
|
|
214
226
|
let revalidate;
|
|
@@ -81,7 +81,7 @@ function createResponseStub(event) {
|
|
|
81
81
|
return getResponseStatusText(event);
|
|
82
82
|
},
|
|
83
83
|
set statusText(v) {
|
|
84
|
-
setResponseStatus(event, getResponseStatus(), v);
|
|
84
|
+
setResponseStatus(event, getResponseStatus(event), v);
|
|
85
85
|
},
|
|
86
86
|
headers: new HeaderProxy(event)
|
|
87
87
|
};
|
package/dist/server/pageEvent.js
CHANGED
|
@@ -9,11 +9,13 @@ function initFromFlash(ctx) {
|
|
|
9
9
|
return;
|
|
10
10
|
const input = [...param.input.slice(0, -1), new Map(param.input[param.input.length - 1])];
|
|
11
11
|
setCookie(ctx.nativeEvent, "flash", "", { maxAge: 0 });
|
|
12
|
+
const result = param.error ? new Error(param.result) : param.result;
|
|
12
13
|
return {
|
|
13
14
|
input,
|
|
14
15
|
url: param.url,
|
|
15
16
|
pending: false,
|
|
16
|
-
result: param.
|
|
17
|
+
result: param.thrown ? undefined : result,
|
|
18
|
+
error: param.thrown ? result : undefined,
|
|
17
19
|
};
|
|
18
20
|
}
|
|
19
21
|
export async function createPageEvent(ctx) {
|
|
@@ -5,7 +5,8 @@ const assetMap = {
|
|
|
5
5
|
return props.attrs.src ? (<script {...props.attrs} id={props.key}>
|
|
6
6
|
{" "}
|
|
7
7
|
</script>) : null;
|
|
8
|
-
}
|
|
8
|
+
},
|
|
9
|
+
noscript: (props) => (<noscript {...props.attrs}>{props.children}</noscript>),
|
|
9
10
|
};
|
|
10
11
|
export function renderAsset(asset, nonce) {
|
|
11
12
|
let { tag, attrs: { key, ...attrs } = { key: undefined }, children } = asset;
|
package/dist/shared/GET.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidjs/start",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"author": "Ryan Carniato",
|
|
6
6
|
"license": "MIT",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"solid-js": "^1.8.17",
|
|
59
|
-
"vinxi": "^0.3.
|
|
59
|
+
"vinxi": "^0.3.12",
|
|
60
60
|
"typescript": "^5.4.2"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|