@solidjs/start 2.0.0-alpha.2 → 2.0.0-beta.0

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.
Files changed (114) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/config/constants.d.ts +3 -3
  3. package/dist/config/constants.js +1 -1
  4. package/dist/config/dev-server.js +9 -1
  5. package/dist/config/env.d.ts +19 -0
  6. package/dist/config/env.js +81 -0
  7. package/dist/config/fs-routes/fs-watcher.js +32 -28
  8. package/dist/config/fs-routes/index.js +2 -2
  9. package/dist/config/fs-routes/router.d.ts +8 -3
  10. package/dist/config/fs-routes/router.js +26 -13
  11. package/dist/config/fs-routes/tree-shake.js +0 -43
  12. package/dist/config/index.d.ts +16 -1
  13. package/dist/config/index.js +31 -31
  14. package/dist/config/lazy.js +4 -2
  15. package/dist/config/manifest.js +41 -7
  16. package/dist/config/vite-utils.d.ts +1 -1
  17. package/dist/directives/bubble-function-declaration.d.ts +3 -0
  18. package/dist/directives/bubble-function-declaration.js +23 -0
  19. package/dist/directives/compile.d.ts +9 -0
  20. package/dist/directives/compile.js +40 -0
  21. package/dist/directives/generate-unique-name.d.ts +3 -0
  22. package/dist/directives/generate-unique-name.js +16 -0
  23. package/dist/directives/get-descriptive-name.d.ts +2 -0
  24. package/dist/directives/get-descriptive-name.js +37 -0
  25. package/dist/directives/get-import-identifier.d.ts +4 -0
  26. package/dist/directives/get-import-identifier.js +19 -0
  27. package/dist/directives/get-root-statement-path.d.ts +2 -0
  28. package/dist/directives/get-root-statement-path.js +12 -0
  29. package/dist/directives/index.d.ts +14 -0
  30. package/dist/directives/index.js +170 -0
  31. package/dist/directives/is-statement-top-level.d.ts +3 -0
  32. package/dist/directives/is-statement-top-level.js +9 -0
  33. package/dist/directives/paths.d.ts +9 -0
  34. package/dist/directives/paths.js +36 -0
  35. package/dist/directives/plugin.d.ts +21 -0
  36. package/dist/directives/plugin.js +302 -0
  37. package/dist/directives/remove-unused-variables.d.ts +3 -0
  38. package/dist/directives/remove-unused-variables.js +66 -0
  39. package/dist/directives/types.d.ts +10 -0
  40. package/dist/directives/xxhash32.d.ts +6 -0
  41. package/dist/directives/xxhash32.js +193 -0
  42. package/dist/{server/server-runtime.d.ts → fns/client.d.ts} +1 -1
  43. package/dist/fns/client.js +106 -0
  44. package/dist/fns/handler.d.ts +5 -0
  45. package/dist/{server/server-functions-handler.js → fns/handler.js} +55 -96
  46. package/dist/fns/registration.d.ts +2 -0
  47. package/dist/fns/registration.js +12 -0
  48. package/dist/fns/serialization.d.ts +6 -0
  49. package/dist/fns/serialization.js +208 -0
  50. package/dist/fns/server.d.ts +7 -0
  51. package/dist/{server/server-fns-runtime.js → fns/server.js} +7 -1
  52. package/dist/fns/shared.d.ts +17 -0
  53. package/dist/fns/shared.js +105 -0
  54. package/dist/http/index.d.ts +1 -1
  55. package/dist/middleware/index.d.ts +17 -0
  56. package/dist/middleware/index.js +15 -0
  57. package/dist/server/handler.d.ts +61 -3
  58. package/dist/server/handler.js +18 -16
  59. package/dist/server/spa/handler.d.ts +30 -1
  60. package/dist/server/types.d.ts +1 -1
  61. package/dist/shared/dev-overlay/CodeView.jsx +4 -4
  62. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +34 -34
  63. package/dist/shared/dev-overlay/index.jsx +2 -2
  64. package/dist/shared/dev-overlay/styles.css +40 -40
  65. package/dist/utils/debounce.d.ts +4 -0
  66. package/dist/utils/debounce.js +10 -0
  67. package/package.json +28 -21
  68. package/src/config/constants.ts +3 -3
  69. package/src/config/env.ts +105 -0
  70. package/src/config/fs-routes/fs-watcher.ts +38 -49
  71. package/src/config/fs-routes/index.ts +2 -2
  72. package/src/config/fs-routes/router.ts +29 -13
  73. package/src/config/fs-routes/tree-shake.ts +1 -48
  74. package/src/config/index.ts +45 -41
  75. package/src/config/lazy.ts +3 -2
  76. package/src/config/manifest.ts +45 -10
  77. package/src/config/vite-utils.ts +1 -1
  78. package/src/directives/bubble-function-declaration.ts +33 -0
  79. package/src/directives/compile.ts +54 -0
  80. package/src/directives/generate-unique-name.ts +22 -0
  81. package/src/directives/get-descriptive-name.ts +39 -0
  82. package/src/directives/get-import-identifier.ts +34 -0
  83. package/src/directives/get-root-statement-path.ts +14 -0
  84. package/src/directives/index.ts +233 -0
  85. package/src/directives/is-statement-top-level.ts +13 -0
  86. package/src/directives/paths.ts +63 -0
  87. package/src/directives/plugin.ts +389 -0
  88. package/src/directives/remove-unused-variables.ts +70 -0
  89. package/src/directives/types.ts +12 -0
  90. package/src/directives/xxhash32.ts +214 -0
  91. package/src/env.d.ts +1 -1
  92. package/src/fns/client.ts +141 -0
  93. package/src/fns/handler.spec.ts +85 -0
  94. package/src/{server/server-functions-handler.ts → fns/handler.ts} +65 -117
  95. package/src/fns/registration.ts +19 -0
  96. package/src/fns/serialization.ts +250 -0
  97. package/src/{server/server-fns-runtime.ts → fns/server.ts} +17 -2
  98. package/src/fns/shared.ts +116 -0
  99. package/src/middleware/index.ts +17 -0
  100. package/src/server/handler.ts +19 -17
  101. package/src/server/types.ts +1 -1
  102. package/src/shared/dev-overlay/CodeView.tsx +5 -7
  103. package/src/shared/dev-overlay/DevOverlayDialog.tsx +34 -34
  104. package/src/shared/dev-overlay/get-source-map.ts +1 -1
  105. package/src/shared/dev-overlay/index.tsx +4 -4
  106. package/src/shared/dev-overlay/styles.css +40 -40
  107. package/src/utils/debounce.ts +10 -0
  108. package/tsconfig.json +1 -0
  109. package/dist/server/fetchEvent.spec.js +0 -65
  110. package/dist/server/server-fns-runtime.d.ts +0 -1
  111. package/dist/server/server-functions-handler.d.ts +0 -2
  112. package/dist/server/server-runtime.js +0 -194
  113. package/src/server/server-runtime.ts +0 -240
  114. /package/dist/{server/fetchEvent.spec.d.ts → directives/types.js} +0 -0
@@ -0,0 +1,105 @@
1
+ import { deserializeJSONStream, deserializeJSStream } from "./serialization.js";
2
+ export const BODY_FORMAT_KEY = "X-Start-Type";
3
+ export const BODY_FORMAL_FILE = "__START__";
4
+ export var BodyFormat;
5
+ (function (BodyFormat) {
6
+ BodyFormat["Seroval"] = "0";
7
+ BodyFormat["String"] = "1";
8
+ BodyFormat["FormData"] = "2";
9
+ BodyFormat["URLSearchParams"] = "3";
10
+ BodyFormat["Blob"] = "4";
11
+ BodyFormat["File"] = "5";
12
+ BodyFormat["ArrayBuffer"] = "6";
13
+ BodyFormat["Uint8Array"] = "7";
14
+ })(BodyFormat || (BodyFormat = {}));
15
+ export function getHeadersAndBody(body) {
16
+ switch (true) {
17
+ case typeof body === "string":
18
+ return {
19
+ headers: {
20
+ "Content-Type": "text/plain",
21
+ [BODY_FORMAT_KEY]: BodyFormat.String,
22
+ },
23
+ body,
24
+ };
25
+ case body instanceof FormData:
26
+ return {
27
+ headers: {
28
+ [BODY_FORMAT_KEY]: BodyFormat.FormData,
29
+ },
30
+ body,
31
+ };
32
+ case body instanceof URLSearchParams:
33
+ return {
34
+ headers: {
35
+ "Content-Type": "application/x-www-form-urlencoded",
36
+ [BODY_FORMAT_KEY]: BodyFormat.URLSearchParams,
37
+ },
38
+ body,
39
+ };
40
+ case body instanceof File: {
41
+ const formData = new FormData();
42
+ formData.append(BODY_FORMAL_FILE, body, body.name);
43
+ return {
44
+ headers: {
45
+ [BODY_FORMAT_KEY]: BodyFormat.File,
46
+ },
47
+ body: formData,
48
+ };
49
+ }
50
+ case body instanceof Blob:
51
+ return {
52
+ headers: {
53
+ [BODY_FORMAT_KEY]: BodyFormat.Blob,
54
+ },
55
+ body,
56
+ };
57
+ case body instanceof ArrayBuffer:
58
+ return {
59
+ headers: {
60
+ [BODY_FORMAT_KEY]: BodyFormat.ArrayBuffer,
61
+ },
62
+ body,
63
+ };
64
+ case body instanceof Uint8Array:
65
+ return {
66
+ headers: {
67
+ [BODY_FORMAT_KEY]: BodyFormat.Uint8Array,
68
+ },
69
+ body: new Uint8Array(body),
70
+ };
71
+ default:
72
+ return undefined;
73
+ }
74
+ }
75
+ export async function extractBody(instance, client, source) {
76
+ const contentType = source.headers.get("content-type");
77
+ const startType = source.headers.get(BODY_FORMAT_KEY);
78
+ const clone = source.clone();
79
+ switch (true) {
80
+ case startType === BodyFormat.Seroval:
81
+ if (client && import.meta.env.SEROVAL_MODE === "js") {
82
+ return await deserializeJSStream(instance, clone);
83
+ }
84
+ return await deserializeJSONStream(clone);
85
+ case startType === BodyFormat.String:
86
+ return await clone.text();
87
+ case startType === BodyFormat.File: {
88
+ const formData = await clone.formData();
89
+ return formData.get(BODY_FORMAL_FILE);
90
+ }
91
+ case startType === BodyFormat.FormData:
92
+ case contentType?.startsWith("multipart/form-data"):
93
+ return await clone.formData();
94
+ case startType === BodyFormat.URLSearchParams:
95
+ case contentType?.startsWith("application/x-www-form-urlencoded"):
96
+ return new URLSearchParams(await clone.text());
97
+ case startType === BodyFormat.Blob:
98
+ return await clone.blob();
99
+ case startType === BodyFormat.ArrayBuffer:
100
+ return await clone.arrayBuffer();
101
+ case startType === BodyFormat.Uint8Array:
102
+ return new Uint8Array(await clone.arrayBuffer());
103
+ }
104
+ return undefined;
105
+ }
@@ -70,7 +70,7 @@ export declare const setHeaders: (values: Record<string, string>) => void;
70
70
  export declare const getHeader: WrapFunction<typeof h3.getRequestHeader>;
71
71
  export declare const getHeaders: WrapFunction<typeof h3.getRequestHeaders>;
72
72
  export declare const getRequestFingerprint: WrapFunction<typeof h3.getRequestFingerprint>;
73
- export declare const getRequestWebStream: () => ReadableStream<Uint8Array<ArrayBufferLike>> | null;
73
+ export declare const getRequestWebStream: () => ReadableStream<Uint8Array<ArrayBuffer>> | null;
74
74
  export declare const readFormData: () => Promise<FormData>;
75
75
  type WrappedReadValidatedBody = <T extends HTTPEvent, TEventInput = InferEventInput<"body", H3Event, T>>(...args: Tail<Parameters<typeof h3.readValidatedBody<T, H3Event, TEventInput>>>) => ReturnType<typeof h3.readValidatedBody<T, H3Event, TEventInput>>;
76
76
  export declare const readValidatedBody: PrependOverload<typeof h3.readValidatedBody, WrappedReadValidatedBody>;
@@ -13,9 +13,26 @@ export type ResponseMiddleware = (event: FetchEvent, response: ResponseMiddlewar
13
13
  * Creates middleware for handling requests and responses.
14
14
  *
15
15
  * @see https://docs.solidjs.com/solid-start/reference/server/create-middleware
16
+ /**
17
+ * Creates request/response middlewares via H3.
18
+ *
19
+ * Accepts an array of H3 {@link Middleware}
20
+ *
21
+ * @tip To run your middleware before response, `await next()` in your function block.
22
+ *@example
23
+ * const middleware = createMiddleware([
24
+ * async (event, next) => {
25
+ * const resp = await next();
26
+ * if (resp instanceof Response) return resp;
27
+ * return new Response("Not found", { status: 404 });
28
+ * },
29
+ * ]);
30
+ *
16
31
  */
17
32
  export declare function createMiddleware(args: {
33
+ /** @deprecated Use H3 `Middleware` */
18
34
  onRequest?: RequestMiddleware | RequestMiddleware[] | undefined;
35
+ /** @deprecated Use H3 `Middleware` */
19
36
  onBeforeResponse?: ResponseMiddleware | ResponseMiddleware[] | undefined;
20
37
  } | Middleware[]): Middleware[];
21
38
  export {};
@@ -23,6 +23,21 @@ function wrapResponseMiddleware(onBeforeResponse) {
23
23
  * Creates middleware for handling requests and responses.
24
24
  *
25
25
  * @see https://docs.solidjs.com/solid-start/reference/server/create-middleware
26
+ /**
27
+ * Creates request/response middlewares via H3.
28
+ *
29
+ * Accepts an array of H3 {@link Middleware}
30
+ *
31
+ * @tip To run your middleware before response, `await next()` in your function block.
32
+ *@example
33
+ * const middleware = createMiddleware([
34
+ * async (event, next) => {
35
+ * const resp = await next();
36
+ * if (resp instanceof Response) return resp;
37
+ * return new Response("Not found", { status: 404 });
38
+ * },
39
+ * ]);
40
+ *
26
41
  */
27
42
  export function createMiddleware(args) {
28
43
  if (Array.isArray(args))
@@ -1,6 +1,64 @@
1
- import { H3 } from "h3";
1
+ import { type H3Event } from "h3/generic";
2
2
  import type { JSX } from "solid-js";
3
3
  import type { FetchEvent, HandlerOptions, PageEvent } from "./types.ts";
4
- export declare function createBaseHandler(createPageEvent: (e: FetchEvent) => Promise<PageEvent>, fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>)): H3;
5
- export declare function createHandler(fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>)): H3;
4
+ export declare function createBaseHandler(createPageEvent: (e: FetchEvent) => Promise<PageEvent>, fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>)): {
5
+ "~rou3": import("h3").RouterContext;
6
+ request(request: import("srvx").ServerRequest | URL | string, options?: RequestInit, context?: import("h3").H3EventContext): Response | Promise<Response>;
7
+ use(route: string, handler: import("h3").Middleware, opts?: import("h3").MiddlewareOptions): /*elided*/ any;
8
+ use(handler: import("h3").Middleware, opts?: import("h3").MiddlewareOptions): /*elided*/ any;
9
+ on(method: import("h3").HTTPMethod | Lowercase<import("h3").HTTPMethod> | "", route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
10
+ register(plugin: import("h3").H3Plugin): /*elided*/ any;
11
+ mount(base: string, input: import("srvx").FetchHandler | {
12
+ fetch: import("srvx").FetchHandler;
13
+ } | /*elided*/ any): /*elided*/ any;
14
+ all(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
15
+ get(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
16
+ post(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
17
+ put(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
18
+ delete(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
19
+ patch(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
20
+ head(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
21
+ options(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
22
+ connect(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
23
+ trace(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
24
+ readonly config: import("h3").H3Config;
25
+ "~middleware": import("h3").Middleware[];
26
+ "~routes": import("h3").H3Route[];
27
+ fetch(_request: import("srvx").ServerRequest): Response | Promise<Response>;
28
+ handler(event: H3Event): unknown | Promise<unknown>;
29
+ "~request"(request: import("srvx").ServerRequest, context?: import("h3").H3EventContext): Response | Promise<Response>;
30
+ "~findRoute"(_event: H3Event): import("h3").MatchedRoute<import("h3").H3Route> | void;
31
+ "~getMiddleware"(event: H3Event, route: import("h3").MatchedRoute<import("h3").H3Route> | undefined): import("h3").Middleware[];
32
+ "~addRoute"(_route: import("h3").H3Route): void;
33
+ };
34
+ export declare function createHandler(fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise<HandlerOptions>)): {
35
+ "~rou3": import("h3").RouterContext;
36
+ request(request: import("srvx").ServerRequest | URL | string, options?: RequestInit, context?: import("h3").H3EventContext): Response | Promise<Response>;
37
+ use(route: string, handler: import("h3").Middleware, opts?: import("h3").MiddlewareOptions): /*elided*/ any;
38
+ use(handler: import("h3").Middleware, opts?: import("h3").MiddlewareOptions): /*elided*/ any;
39
+ on(method: import("h3").HTTPMethod | Lowercase<import("h3").HTTPMethod> | "", route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
40
+ register(plugin: import("h3").H3Plugin): /*elided*/ any;
41
+ mount(base: string, input: import("srvx").FetchHandler | {
42
+ fetch: import("srvx").FetchHandler;
43
+ } | /*elided*/ any): /*elided*/ any;
44
+ all(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
45
+ get(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
46
+ post(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
47
+ put(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
48
+ delete(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
49
+ patch(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
50
+ head(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
51
+ options(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
52
+ connect(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
53
+ trace(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
54
+ readonly config: import("h3").H3Config;
55
+ "~middleware": import("h3").Middleware[];
56
+ "~routes": import("h3").H3Route[];
57
+ fetch(_request: import("srvx").ServerRequest): Response | Promise<Response>;
58
+ handler(event: H3Event): unknown | Promise<unknown>;
59
+ "~request"(request: import("srvx").ServerRequest, context?: import("h3").H3EventContext): Response | Promise<Response>;
60
+ "~findRoute"(_event: H3Event): import("h3").MatchedRoute<import("h3").H3Route> | void;
61
+ "~getMiddleware"(event: H3Event, route: import("h3").MatchedRoute<import("h3").H3Route> | undefined): import("h3").Middleware[];
62
+ "~addRoute"(_route: import("h3").H3Route): void;
63
+ };
6
64
  export declare function createPageEvent(ctx: FetchEvent): Promise<PageEvent>;
@@ -1,12 +1,12 @@
1
1
  import middleware from "solid-start:middleware";
2
- import { defineHandler, getCookie, H3, redirect, setCookie } from "h3";
2
+ import { defineHandler, getCookie, H3, redirect, setCookie } from "h3/generic";
3
3
  import { sharedConfig } from "solid-js";
4
4
  import { getRequestEvent, renderToStream, renderToString } from "solid-js/web";
5
5
  import { createRoutes } from "../router.jsx";
6
6
  import { decorateHandler, decorateMiddleware } from "./fetchEvent.js";
7
7
  import { getSsrManifest } from "./manifest/ssr-manifest.js";
8
8
  import { matchAPIRoute } from "./routes.js";
9
- import { handleServerFunction } from "./server-functions-handler.js";
9
+ import { handleServerFunction } from "../fns/handler.js";
10
10
  import { getExpectedRedirectStatus } from "./util.js";
11
11
  const SERVER_FN_BASE = "/_server";
12
12
  export function createBaseHandler(createPageEvent, fn, options = {}) {
@@ -28,20 +28,22 @@ export function createBaseHandler(createPageEvent, fn, options = {}) {
28
28
  if (match) {
29
29
  const mod = await match.handler.import();
30
30
  const fn = event.request.method === "HEAD" ? mod["HEAD"] || mod["GET"] : mod[event.request.method];
31
- event.params = match.params || {};
32
- // @ts-expect-error
33
- sharedConfig.context = { event };
34
- const res = await fn(event);
35
- if (res !== undefined) {
36
- if (res instanceof Response)
37
- return produceResponseWithEventHeaders(res);
38
- return res;
31
+ if (typeof fn === "function") {
32
+ event.params = match.params || {};
33
+ // @ts-expect-error
34
+ sharedConfig.context = { event };
35
+ const res = await fn(event);
36
+ if (res !== undefined) {
37
+ if (res instanceof Response)
38
+ return produceResponseWithEventHeaders(res);
39
+ return res;
40
+ }
41
+ if (event.request.method !== "GET") {
42
+ throw new Error(`API handler for ${event.request.method} "${event.request.url}" did not return a response.`);
43
+ }
44
+ if (!match.isPage)
45
+ return;
39
46
  }
40
- if (event.request.method !== "GET") {
41
- throw new Error(`API handler for ${event.request.method} "${event.request.url}" did not return a response.`);
42
- }
43
- if (!match.isPage)
44
- return;
45
47
  }
46
48
  const context = await createPageEvent(event);
47
49
  const resolvedOptions = typeof options === "function" ? await options(context) : { ...options };
@@ -178,7 +180,7 @@ function handleStreamCompleteRedirect(context) {
178
180
  return ({ write }) => {
179
181
  context.complete = true;
180
182
  const to = context.response && context.response.headers.get("Location");
181
- to && write(`<script>window.location="${to}"</script>`);
183
+ to && write(`<script>window.location=${JSON.stringify(to).replace(/</g, "\\u003c")}</script>`);
182
184
  };
183
185
  }
184
186
  function produceResponseWithEventHeaders(res) {
@@ -4,4 +4,33 @@ import type { HandlerOptions, PageEvent } from "../types.ts";
4
4
  *
5
5
  * Read more: https://docs.solidjs.com/solid-start/reference/server/create-handler
6
6
  */
7
- export declare function createHandler(fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions)): import("h3").H3;
7
+ export declare function createHandler(fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions)): {
8
+ "~rou3": import("h3").RouterContext;
9
+ request(request: import("srvx").ServerRequest | URL | string, options?: RequestInit, context?: import("h3").H3EventContext): Response | Promise<Response>;
10
+ use(route: string, handler: import("h3").Middleware, opts?: import("h3").MiddlewareOptions): /*elided*/ any;
11
+ use(handler: import("h3").Middleware, opts?: import("h3").MiddlewareOptions): /*elided*/ any;
12
+ on(method: import("h3").HTTPMethod | Lowercase<import("h3").HTTPMethod> | "", route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
13
+ register(plugin: import("h3").H3Plugin): /*elided*/ any;
14
+ mount(base: string, input: import("srvx").FetchHandler | {
15
+ fetch: import("srvx").FetchHandler;
16
+ } | /*elided*/ any): /*elided*/ any;
17
+ all(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
18
+ get(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
19
+ post(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
20
+ put(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
21
+ delete(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
22
+ patch(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
23
+ head(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
24
+ options(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
25
+ connect(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
26
+ trace(route: string, handler: import("h3").HTTPHandler, opts?: import("h3").RouteOptions): /*elided*/ any;
27
+ readonly config: import("h3").H3Config;
28
+ "~middleware": import("h3").Middleware[];
29
+ "~routes": import("h3").H3Route[];
30
+ fetch(_request: import("srvx").ServerRequest): Response | Promise<Response>;
31
+ handler(event: import("h3").H3Event): unknown | Promise<unknown>;
32
+ "~request"(request: import("srvx").ServerRequest, context?: import("h3").H3EventContext): Response | Promise<Response>;
33
+ "~findRoute"(_event: import("h3").H3Event): import("h3").MatchedRoute<import("h3").H3Route> | void;
34
+ "~getMiddleware"(event: import("h3").H3Event, route: import("h3").MatchedRoute<import("h3").H3Route> | undefined): import("h3").Middleware[];
35
+ "~addRoute"(_route: import("h3").H3Route): void;
36
+ };
@@ -64,7 +64,7 @@ export interface APIEvent extends FetchEvent {
64
64
  [key: string]: string;
65
65
  };
66
66
  }
67
- export type APIHandler = (event: APIEvent) => Promise<any>;
67
+ export type APIHandler = (event: APIEvent) => any;
68
68
  export interface ServerFunctionMeta {
69
69
  id: string;
70
70
  }
@@ -1,13 +1,13 @@
1
1
  // @refresh skip
2
2
  import { getSingletonHighlighter } from "shiki";
3
3
  import { loadWasm } from "shiki/engine/oniguruma";
4
- import { createEffect, createResource } from "solid-js";
5
- import url from "shiki/onig.wasm?url";
6
4
  import langJS from "shiki/langs/javascript.mjs";
7
5
  import langJSX from "shiki/langs/jsx.mjs";
8
6
  import langTSX from "shiki/langs/tsx.mjs";
9
7
  import langTS from "shiki/langs/typescript.mjs";
8
+ import url from "shiki/onig.wasm?url";
10
9
  import darkPlus from "shiki/themes/dark-plus.mjs";
10
+ import { createEffect, createResource } from "solid-js";
11
11
  let HIGHLIGHTER;
12
12
  async function loadHighlighter() {
13
13
  if (!HIGHLIGHTER) {
@@ -51,12 +51,12 @@ export function CodeView(props) {
51
51
  for (let i = 0, len = lines.length; i < len; i++) {
52
52
  const el = lines[i];
53
53
  if (props.line - minLine() - 1 === i) {
54
- el.classList.add("dev-overlay-error-line");
54
+ el.dataset.startDevOverlayErrorLine = '';
55
55
  }
56
56
  }
57
57
  }
58
58
  });
59
- return (<div ref={ref} class="dev-overlay-code-view" style={{
59
+ return (<div ref={ref} data-start-dev-overlay-code-view style={{
60
60
  "--dev-overlay-code-view-start": minLine() + 1,
61
61
  }}/>);
62
62
  }
@@ -1,7 +1,7 @@
1
1
  // @refresh skip
2
2
  import ErrorStackParser from "error-stack-parser";
3
3
  import * as htmlToImage from "html-to-image";
4
- import { ErrorBoundary, For, Show, Suspense, createMemo, createSignal } from "solid-js";
4
+ import { createMemo, createSignal, ErrorBoundary, For, Show, Suspense } from "solid-js";
5
5
  import { Portal } from "solid-js/web";
6
6
  // @ts-ignore - terracotta module resolution issue with NodeNext
7
7
  import { Dialog, DialogOverlay, DialogPanel, Select, SelectOption } from "terracotta";
@@ -25,9 +25,9 @@ function ErrorInfo(props) {
25
25
  }
26
26
  return { message: e.toString() };
27
27
  });
28
- return (<span class="dev-overlay-error-info">
29
- <span class="dev-overlay-error-info-name">{error().name}</span>
30
- <span class="dev-overlay-error-info-message">{error().message}</span>
28
+ return (<span data-start-dev-overlay-error-info>
29
+ <span data-start-dev-overlay-error-info-name>{error().name}</span>
30
+ <span data-start-dev-overlay-error-info-message>{error().message}</span>
31
31
  </span>);
32
32
  }
33
33
  function getFileName(source) {
@@ -46,23 +46,23 @@ function getFilePath(source) {
46
46
  return `${getFileName(source.source)}${line}${column}`;
47
47
  }
48
48
  function CodeFallback() {
49
- return (<div class="dev-overlay-stack-frames-code-fallback">
49
+ return (<div data-start-dev-overlay-stack-frames-code-fallback>
50
50
  <span>Source not available.</span>
51
51
  </div>);
52
52
  }
53
53
  function StackFramesContent(props) {
54
54
  const stackframes = ErrorStackParser.parse(props.error);
55
55
  const [selectedFrame, setSelectedFrame] = createSignal(stackframes[0]);
56
- return (<div class="dev-overlay-stack-frames-content">
57
- <div class="dev-overlay-stack-frames-code">
56
+ return (<div data-start-dev-overlay-stack-frames-content>
57
+ <div data-start-dev-overlay-stack-frames-code>
58
58
  <ErrorBoundary fallback={null}>
59
59
  {(() => {
60
60
  const data = createStackFrame(selectedFrame(), () => props.isCompiled);
61
61
  return (<Suspense fallback={<CodeFallback />}>
62
62
  <Show when={data()} keyed fallback={<CodeFallback />}>
63
63
  {source => (<>
64
- <span class="dev-overlay-stack-frames-code-source">{source.source}</span>
65
- <div class="dev-overlay-stack-frames-code-container">
64
+ <span data-start-dev-overlay-stack-frames-code-source>{source.source}</span>
65
+ <div data-start-dev-overlay-stack-frames-code-container>
66
66
  <CodeView fileName={source.source} line={source.line} content={source.content}/>
67
67
  </div>
68
68
  </>)}
@@ -71,13 +71,13 @@ function StackFramesContent(props) {
71
71
  })()}
72
72
  </ErrorBoundary>
73
73
  </div>
74
- <Select class="dev-overlay-stack-frames" value={selectedFrame()} onChange={setSelectedFrame}>
74
+ <Select data-start-dev-overlay-stack-frames value={selectedFrame()} onChange={setSelectedFrame}>
75
75
  <For each={stackframes}>
76
- {current => (<ErrorBoundary fallback={<div class="dev-overlay-stack-frame">
77
- <span class="dev-overlay-stack-frame-function">
76
+ {current => (<ErrorBoundary fallback={<div data-start-dev-overlay-stack-frame>
77
+ <span data-start-dev-overlay-stack-frame-function>
78
78
  {current.functionName ?? "<anonymous>"}
79
79
  </span>
80
- <span class="dev-overlay-stack-frame-file">
80
+ <span data-start-dev-overlay-stack-frame-file>
81
81
  {getFilePath({
82
82
  source: current.getFileName(),
83
83
  content: "",
@@ -91,11 +91,11 @@ function StackFramesContent(props) {
91
91
  const data = createStackFrame(current, () => props.isCompiled);
92
92
  return (<Suspense>
93
93
  <Show when={data()} keyed>
94
- {source => (<SelectOption class="dev-overlay-stack-frame" value={current}>
95
- <span class="dev-overlay-stack-frame-function">
94
+ {source => (<SelectOption data-start-dev-overlay-stack-frame value={current}>
95
+ <span data-start-dev-overlay-stack-frame-function>
96
96
  {source.name ?? "<anonymous>"}
97
97
  </span>
98
- <span class="dev-overlay-stack-frame-file">{getFilePath(source)}</span>
98
+ <span data-start-dev-overlay-stack-frame-file>{getFilePath(source)}</span>
99
99
  </SelectOption>)}
100
100
  </Show>
101
101
  </Suspense>);
@@ -165,55 +165,55 @@ export default function DevOverlayDialog(props) {
165
165
  window.open(DISCORD_INVITE, "_blank").focus();
166
166
  }
167
167
  return (<Portal>
168
- <Dialog class="dev-overlay" isOpen>
168
+ <Dialog data-start-dev-overlay isOpen>
169
169
  <div>
170
- <DialogOverlay class="dev-overlay-background"/>
171
- <DialogPanel ref={setPanel} class="dev-overlay-panel-container">
172
- <div class="dev-overlay-panel">
173
- <div class="dev-overlay-navbar">
174
- <div class="dev-overlay-navbar-left">
175
- <div class="dev-overlay-version">
170
+ <DialogOverlay data-start-dev-overlay-background/>
171
+ <DialogPanel ref={setPanel} data-start-dev-overlay-panel-container>
172
+ <div data-start-dev-overlay-panel>
173
+ <div data-start-dev-overlay-navbar>
174
+ <div data-start-dev-overlay-navbar-left>
175
+ <div data-start-dev-overlay-version>
176
176
  <div>
177
177
  <SolidStartIcon title="Solid Start Version"/>
178
178
  </div>
179
179
  <span>{info.version}</span>
180
180
  </div>
181
181
  <Show when={props.errors.length > 1}>
182
- <div class="dev-overlay-pagination">
183
- <button class="dev-overlay-button" onClick={goPrev} type="button">
182
+ <div data-start-dev-overlay-pagination>
183
+ <button data-start-dev-overlay-button onClick={goPrev} type="button">
184
184
  <ArrowLeftIcon title="Go Previous"/>
185
185
  </button>
186
- <div class="dev-overlay-page-counter">
186
+ <div data-start-dev-overlay-page-counter>
187
187
  {`${truncated()} of ${props.errors.length}`}
188
188
  </div>
189
- <button class="dev-overlay-button" onClick={goNext} type="button">
189
+ <button data-start-dev-overlay-button onClick={goNext} type="button">
190
190
  <ArrowRightIcon title="Go Next"/>
191
191
  </button>
192
192
  </div>
193
193
  </Show>
194
194
  </div>
195
- <div class="dev-overlay-controls">
196
- <button class="dev-overlay-button" onClick={redirectToGithub} type="button">
195
+ <div data-start-dev-overlay-controls>
196
+ <button data-start-dev-overlay-button onClick={redirectToGithub} type="button">
197
197
  <GithubIcon title="Create an issue thread on Github"/>
198
198
  </button>
199
- <button class="dev-overlay-button" onClick={redirectToDiscord} type="button">
199
+ <button data-start-dev-overlay-button onClick={redirectToDiscord} type="button">
200
200
  <DiscordIcon title="Join our Discord Channel"/>
201
201
  </button>
202
- <button class="dev-overlay-button" onClick={downloadScreenshot} type="button">
202
+ <button data-start-dev-overlay-button onClick={downloadScreenshot} type="button">
203
203
  <CameraIcon title="Capture Error Overlay"/>
204
204
  </button>
205
- <button class="dev-overlay-button" onClick={toggleIsCompiled} type="button">
205
+ <button data-start-dev-overlay-button onClick={toggleIsCompiled} type="button">
206
206
  <Show when={isCompiled()} fallback={<ViewOriginalIcon title="View Original Source"/>}>
207
207
  <ViewCompiledIcon title="View Compiled Source"/>
208
208
  </Show>
209
209
  </button>
210
- <button class="dev-overlay-button" onClick={props.resetError} type="button">
210
+ <button data-start-dev-overlay-button onClick={props.resetError} type="button">
211
211
  <RefreshIcon title="Reset Error"/>
212
212
  </button>
213
213
  </div>
214
214
  </div>
215
215
  <Show when={props.errors[truncated() - 1]} keyed>
216
- {current => (<div class="dev-overlay-content">
216
+ {current => (<div data-start-dev-overlay-content>
217
217
  <ErrorInfo error={current}/>
218
218
  <StackFrames error={current} isCompiled={isCompiled()}/>
219
219
  </div>)}
@@ -1,7 +1,7 @@
1
1
  // @refresh skip
2
- import { ErrorBoundary, Show, createEffect, createSignal, onCleanup, resetErrorBoundaries, } from "solid-js";
3
- import { HttpStatusCode } from "../HttpStatusCode.js";
2
+ import { createEffect, createSignal, ErrorBoundary, onCleanup, resetErrorBoundaries, Show, } from "solid-js";
4
3
  import clientOnly from "../clientOnly.js";
4
+ import { HttpStatusCode } from "../HttpStatusCode.js";
5
5
  const DevOverlayDialog = import.meta.env.PROD
6
6
  ? () => <></>
7
7
  : clientOnly(() => import("./DevOverlayDialog"), { lazy: true });