@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 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
- // atleast until we sort which server options are good to use
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?: InlineConfig["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 && instance) {
143
- // forward headers
144
- if (result.headers)
145
- mergeResponseHeaders(h3Event, result.headers);
146
- // forward non-redirect statuses
147
- if (result.status && (result.status < 300 || result.status >= 400))
148
- setResponseStatus(h3Event, result.status);
149
- if (result.customBody) {
150
- result = await result.customBody();
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
- const isError = result instanceof Error;
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
  };
@@ -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.error ? new Error(param.result) : param.result,
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;
@@ -1,9 +1,8 @@
1
+ // @refresh skip
1
2
  /**
2
3
  *
3
4
  * Read more: https://docs.solidjs.com/solid-start/reference/server/get
4
5
  */
5
6
  export function GET(fn) {
6
- return (...args) => {
7
- return fn.GET(...args);
8
- };
7
+ return fn.GET;
9
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidjs/start",
3
- "version": "1.0.1",
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.11",
59
+ "vinxi": "^0.3.12",
60
60
  "typescript": "^5.4.2"
61
61
  },
62
62
  "dependencies": {