@solidjs/start 1.1.7 → 2.0.0-alpha.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 (185) hide show
  1. package/README.md +88 -8
  2. package/dist/client/StartClient.d.ts +0 -1
  3. package/dist/client/StartClient.jsx +2 -4
  4. package/dist/client/index.d.ts +2 -3
  5. package/dist/client/index.jsx +2 -4
  6. package/dist/client/mount.js +10 -2
  7. package/dist/client/spa/index.d.ts +1 -2
  8. package/dist/client/spa/index.jsx +1 -2
  9. package/dist/config/constants.d.ts +16 -0
  10. package/dist/config/constants.js +16 -0
  11. package/dist/config/dev-server.d.ts +2 -0
  12. package/dist/config/dev-server.js +108 -0
  13. package/dist/config/fs-router.d.ts +37 -0
  14. package/dist/config/fs-router.js +153 -0
  15. package/dist/config/fs-routes/fs-watcher.d.ts +3 -0
  16. package/dist/config/fs-routes/fs-watcher.js +49 -0
  17. package/dist/config/fs-routes/index.d.ts +7 -0
  18. package/dist/config/fs-routes/index.js +109 -0
  19. package/dist/config/fs-routes/router.d.ts +37 -0
  20. package/dist/config/fs-routes/router.js +136 -0
  21. package/dist/config/fs-routes/tree-shake.d.ts +2 -0
  22. package/dist/config/fs-routes/tree-shake.js +357 -0
  23. package/dist/config/index.d.ts +10 -0
  24. package/dist/config/index.js +217 -0
  25. package/dist/config/lazy.d.ts +3 -0
  26. package/dist/config/lazy.js +82 -0
  27. package/dist/config/manifest.d.ts +3 -0
  28. package/dist/config/manifest.js +74 -0
  29. package/dist/config/utils.d.ts +4 -0
  30. package/dist/config/utils.js +6 -0
  31. package/dist/config/vite-utils.d.ts +16 -0
  32. package/dist/config/vite-utils.js +81 -0
  33. package/dist/http/index.d.ts +84 -0
  34. package/dist/http/index.js +131 -0
  35. package/dist/index.d.ts +6 -5
  36. package/dist/index.jsx +5 -5
  37. package/dist/middleware/index.d.ts +6 -6
  38. package/dist/middleware/index.js +39 -0
  39. package/dist/{router/FileRoutes.js → router.jsx} +5 -6
  40. package/dist/server/StartServer.d.ts +3 -3
  41. package/dist/server/StartServer.jsx +9 -63
  42. package/dist/server/assets/index.d.ts +2 -0
  43. package/dist/server/assets/index.js +52 -0
  44. package/dist/server/assets/render.d.ts +19 -0
  45. package/dist/server/{renderAsset.jsx → assets/render.jsx} +1 -1
  46. package/dist/server/collect-styles.d.ts +3 -0
  47. package/dist/server/collect-styles.js +69 -0
  48. package/dist/server/fetchEvent.d.ts +4 -3
  49. package/dist/server/fetchEvent.js +12 -74
  50. package/dist/server/fetchEvent.spec.d.ts +1 -0
  51. package/dist/server/fetchEvent.spec.js +65 -0
  52. package/dist/server/handler.d.ts +6 -12
  53. package/dist/server/handler.js +180 -95
  54. package/dist/server/index.d.ts +8 -6
  55. package/dist/server/index.jsx +14 -6
  56. package/dist/server/manifest/client-manifest.d.ts +9 -0
  57. package/dist/server/manifest/client-manifest.js +6 -0
  58. package/dist/server/manifest/dev-client-manifest.d.ts +4 -0
  59. package/dist/server/manifest/dev-client-manifest.js +24 -0
  60. package/dist/server/manifest/dev-ssr-manifest.d.ts +5 -0
  61. package/dist/server/manifest/dev-ssr-manifest.js +23 -0
  62. package/dist/server/manifest/prod-client-manifest.d.ts +5 -0
  63. package/dist/server/manifest/prod-client-manifest.js +26 -0
  64. package/dist/server/manifest/prod-ssr-manifest.d.ts +6 -0
  65. package/dist/server/manifest/prod-ssr-manifest.js +90 -0
  66. package/dist/server/manifest/ssr-manifest.d.ts +4 -0
  67. package/dist/server/manifest/ssr-manifest.js +6 -0
  68. package/dist/{router → server}/routes.d.ts +6 -10
  69. package/dist/{router → server}/routes.js +35 -27
  70. package/dist/{runtime → server}/server-fns-runtime.d.ts +1 -1
  71. package/dist/{runtime → server}/server-fns-runtime.js +7 -6
  72. package/dist/server/server-functions-handler.d.ts +2 -0
  73. package/dist/{runtime/server-handler.js → server/server-functions-handler.js} +76 -103
  74. package/dist/server/server-runtime.d.ts +3 -0
  75. package/dist/{runtime → server}/server-runtime.js +9 -16
  76. package/dist/server/spa/StartServer.d.ts +1 -1
  77. package/dist/server/spa/StartServer.jsx +7 -9
  78. package/dist/server/spa/handler.d.ts +3 -3
  79. package/dist/server/spa/handler.js +9 -11
  80. package/dist/server/spa/index.d.ts +4 -3
  81. package/dist/server/spa/index.jsx +4 -3
  82. package/dist/server/types.d.ts +7 -9
  83. package/dist/server/util.d.ts +2 -0
  84. package/dist/server/util.js +8 -0
  85. package/dist/shared/ErrorBoundary.jsx +2 -2
  86. package/dist/shared/HttpHeader.jsx +4 -2
  87. package/dist/shared/{HttpStatusCode.jsx → HttpStatusCode.js} +3 -1
  88. package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +2 -2
  89. package/dist/shared/dev-overlay/DevOverlayDialog.jsx +75 -66
  90. package/dist/shared/dev-overlay/createStackFrame.js +3 -3
  91. package/dist/shared/dev-overlay/index.jsx +5 -8
  92. package/dist/shared/lazy.d.ts +3 -0
  93. package/dist/shared/lazy.js +40 -0
  94. package/dist/shared/serverFunction.d.ts +1 -1
  95. package/package.json +47 -65
  96. package/scripts/build.js +15 -0
  97. package/scripts/validate-imports.js +316 -0
  98. package/src/client/StartClient.tsx +34 -0
  99. package/src/client/index.tsx +2 -0
  100. package/src/client/mount.ts +114 -0
  101. package/src/client/spa/index.tsx +9 -0
  102. package/src/config/constants.ts +19 -0
  103. package/src/config/dev-server.ts +149 -0
  104. package/src/config/fs-router.ts +177 -0
  105. package/src/config/fs-routes/fs-watcher.ts +81 -0
  106. package/src/config/fs-routes/index.ts +138 -0
  107. package/src/config/fs-routes/router.ts +169 -0
  108. package/src/config/fs-routes/tree-shake.ts +392 -0
  109. package/src/config/index.ts +236 -0
  110. package/src/config/lazy.ts +100 -0
  111. package/src/config/manifest.ts +84 -0
  112. package/src/config/utils.ts +5 -0
  113. package/src/config/vite-utils.ts +113 -0
  114. package/src/env.d.ts +35 -0
  115. package/src/http/index.ts +253 -0
  116. package/src/index.tsx +19 -0
  117. package/src/internal.d.ts +14 -0
  118. package/src/middleware/index.ts +82 -0
  119. package/src/router.tsx +36 -0
  120. package/src/server/StartServer.tsx +62 -0
  121. package/src/server/assets/index.ts +70 -0
  122. package/src/server/assets/render.tsx +42 -0
  123. package/src/server/collect-styles.ts +94 -0
  124. package/src/server/fetchEvent.spec.ts +89 -0
  125. package/src/server/fetchEvent.ts +36 -0
  126. package/src/server/handler.ts +250 -0
  127. package/src/server/index.tsx +16 -0
  128. package/src/server/manifest/client-manifest.ts +8 -0
  129. package/src/server/manifest/dev-client-manifest.ts +19 -0
  130. package/src/server/manifest/dev-ssr-manifest.ts +21 -0
  131. package/src/server/manifest/prod-client-manifest.ts +18 -0
  132. package/src/server/manifest/prod-ssr-manifest.ts +125 -0
  133. package/src/server/manifest/ssr-manifest.ts +8 -0
  134. package/src/server/routes.ts +138 -0
  135. package/src/server/server-fns-runtime.ts +31 -0
  136. package/src/server/server-functions-handler.ts +364 -0
  137. package/src/server/server-runtime.ts +240 -0
  138. package/src/server/spa/StartServer.tsx +40 -0
  139. package/src/server/spa/handler.ts +29 -0
  140. package/src/server/spa/index.tsx +5 -0
  141. package/src/server/types.ts +82 -0
  142. package/src/server/util.ts +12 -0
  143. package/src/shared/ErrorBoundary.tsx +52 -0
  144. package/src/shared/GET.ts +8 -0
  145. package/src/shared/HttpHeader.tsx +42 -0
  146. package/src/shared/HttpStatusCode.ts +27 -0
  147. package/src/shared/clientOnly.ts +44 -0
  148. package/src/shared/dev-overlay/CodeView.tsx +95 -0
  149. package/src/shared/dev-overlay/DevOverlayDialog.tsx +316 -0
  150. package/src/shared/dev-overlay/createStackFrame.ts +77 -0
  151. package/src/shared/dev-overlay/download.ts +6 -0
  152. package/src/shared/dev-overlay/env.d.ts +4 -0
  153. package/src/shared/dev-overlay/get-source-map.ts +35 -0
  154. package/src/shared/dev-overlay/icons.tsx +288 -0
  155. package/src/shared/dev-overlay/index.tsx +63 -0
  156. package/src/shared/dev-overlay/styles.css +292 -0
  157. package/src/shared/lazy.ts +51 -0
  158. package/src/shared/serverFunction.ts +10 -0
  159. package/src/virtual.d.ts +27 -0
  160. package/tsconfig.json +23 -0
  161. package/vitest.config.ts +9 -0
  162. package/config/fs-router.js +0 -142
  163. package/config/index.d.ts +0 -39
  164. package/config/index.js +0 -303
  165. package/config/server-components.js +0 -106
  166. package/dist/client/islands.d.ts +0 -7
  167. package/dist/client/islands.jsx +0 -10
  168. package/dist/middleware/index.jsx +0 -35
  169. package/dist/router/index.d.ts +0 -1
  170. package/dist/router/index.jsx +0 -2
  171. package/dist/router/lazyRoute.d.ts +0 -6
  172. package/dist/router/lazyRoute.js +0 -53
  173. package/dist/runtime/server-handler.d.ts +0 -2
  174. package/dist/runtime/server-runtime.d.ts +0 -3
  175. package/dist/server/islands/index.d.ts +0 -19
  176. package/dist/server/islands/index.jsx +0 -62
  177. package/dist/server/islands/utils.d.ts +0 -1
  178. package/dist/server/islands/utils.jsx +0 -85
  179. package/dist/server/pageEvent.d.ts +0 -2
  180. package/dist/server/pageEvent.js +0 -56
  181. package/dist/server/renderAsset.d.ts +0 -2
  182. package/env.d.ts +0 -26
  183. /package/dist/{router/FileRoutes.d.ts → router.d.ts} +0 -0
  184. /package/dist/shared/{clientOnly.jsx → clientOnly.js} +0 -0
  185. /package/dist/shared/{serverFunction.jsx → serverFunction.js} +0 -0
@@ -1,22 +1,20 @@
1
- import { createBaseHandler } from "../handler";
1
+ import { createBaseHandler } from "../handler.js";
2
+ import { getSsrManifest } from "../manifest/ssr-manifest.js";
2
3
  /**
3
4
  *
4
5
  * Read more: https://docs.solidjs.com/solid-start/reference/server/create-handler
5
6
  */
6
- export function createHandler(fn, options, routerLoad) {
7
- return createBaseHandler(fn, createPageEvent, options, routerLoad);
7
+ export function createHandler(fn, options) {
8
+ return createBaseHandler(createPageEvent, fn, options);
8
9
  }
9
- export async function createPageEvent(ctx) {
10
- const clientManifest = import.meta.env.MANIFEST["client"];
10
+ async function createPageEvent(ctx) {
11
+ const manifest = getSsrManifest("ssr");
11
12
  const pageEvent = Object.assign(ctx, {
12
- manifest: await clientManifest.json(),
13
- assets: [...(await clientManifest.inputs[clientManifest.handler].assets())],
13
+ manifest: "json" in manifest ? await manifest.json() : {},
14
+ assets: await manifest.getAssets(import.meta.env.START_CLIENT_ENTRY),
14
15
  routes: [],
15
16
  complete: false,
16
- // prevUrl: "",
17
- // mutation: false,
18
- // $type: FETCH_EVENT,
19
- $islands: new Set()
17
+ $islands: new Set(),
20
18
  });
21
19
  return pageEvent;
22
20
  }
@@ -1,3 +1,4 @@
1
- export * from "../types";
2
- export { StartServer } from "./StartServer";
3
- export { createHandler } from "./handler";
1
+ export { default as lazy } from "../../shared/lazy.ts";
2
+ export * from "../types.ts";
3
+ export { StartServer } from "./StartServer.tsx";
4
+ export { createHandler } from "./handler.ts";
@@ -1,4 +1,5 @@
1
1
  // @refresh skip
2
- export * from "../types";
3
- export { StartServer } from "./StartServer";
4
- export { createHandler } from "./handler";
2
+ export { default as lazy } from "../../shared/lazy.js";
3
+ export * from "../types.js";
4
+ export { StartServer } from "./StartServer.jsx";
5
+ export { createHandler } from "./handler.js";
@@ -1,8 +1,8 @@
1
+ import type { H3Event } from "h3";
1
2
  import type { JSX } from "solid-js";
2
- import { RequestEvent } from "solid-js/web";
3
- import { HTTPEvent } from "vinxi/http";
3
+ import type { RequestEvent } from "solid-js/web";
4
4
  export type DocumentComponentProps = {
5
- assets: JSX.Element;
5
+ assets?: JSX.Element;
6
6
  scripts: JSX.Element;
7
7
  children?: JSX.Element;
8
8
  };
@@ -50,23 +50,21 @@ export interface FetchEvent {
50
50
  response: ResponseStub;
51
51
  clientAddress?: string;
52
52
  locals: App.RequestEventLocals;
53
- nativeEvent: HTTPEvent;
53
+ nativeEvent: H3Event;
54
54
  }
55
55
  export interface PageEvent extends RequestEvent {
56
- manifest: any;
57
- assets: any;
56
+ assets: any[];
58
57
  routes: any[];
59
58
  $islands: Set<string>;
60
59
  complete: boolean;
60
+ nonce?: string;
61
61
  }
62
62
  export interface APIEvent extends FetchEvent {
63
63
  params: {
64
64
  [key: string]: string;
65
65
  };
66
66
  }
67
- export interface APIHandler {
68
- (event: APIEvent): Promise<any>;
69
- }
67
+ export type APIHandler = (event: APIEvent) => Promise<any>;
70
68
  export interface ServerFunctionMeta {
71
69
  id: string;
72
70
  }
@@ -0,0 +1,2 @@
1
+ import type { ResponseStub } from "./types.ts";
2
+ export declare function getExpectedRedirectStatus(response: ResponseStub): number;
@@ -0,0 +1,8 @@
1
+ // according to https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages
2
+ const validRedirectStatuses = new Set([301, 302, 303, 307, 308]);
3
+ export function getExpectedRedirectStatus(response) {
4
+ if (response.status && validRedirectStatuses.has(response.status)) {
5
+ return response.status;
6
+ }
7
+ return 302;
8
+ }
@@ -1,8 +1,8 @@
1
1
  // @refresh skip
2
2
  import { ErrorBoundary as DefaultErrorBoundary, catchError } from "solid-js";
3
3
  import { isServer } from "solid-js/web";
4
- import { HttpStatusCode } from "./HttpStatusCode";
5
- import { DevOverlay } from "./dev-overlay";
4
+ import { HttpStatusCode } from "./HttpStatusCode.js";
5
+ import { DevOverlay } from "./dev-overlay/index.jsx";
6
6
  export const ErrorBoundary = import.meta.env.DEV && import.meta.env.START_DEV_OVERLAY
7
7
  ? (props) => <DevOverlay>{props.children}</DevOverlay>
8
8
  : (props) => {
@@ -1,6 +1,7 @@
1
1
  // @refresh skip
2
2
  import { onCleanup } from "solid-js";
3
3
  import { getRequestEvent, isServer } from "solid-js/web";
4
+ import { appendHeader, setHeader } from "../http/index.js";
4
5
  /**
5
6
  *
6
7
  * Read more: https://docs.solidjs.com/solid-start/reference/server/http-header
@@ -9,10 +10,11 @@ export const HttpHeader = isServer
9
10
  ? (props) => {
10
11
  const event = getRequestEvent();
11
12
  if (props.append)
12
- event.response.headers.append(props.name, props.value);
13
+ appendHeader(props.name, props.value);
13
14
  else
14
- event.response.headers.set(props.name, props.value);
15
+ setHeader(props.name, props.value);
15
16
  onCleanup(() => {
17
+ // @ts-expect-error
16
18
  if (event.nativeEvent.handled || event.complete)
17
19
  return;
18
20
  const value = event.response.headers.get(props.name);
@@ -10,7 +10,9 @@ export const HttpStatusCode = isServer
10
10
  const event = getRequestEvent();
11
11
  event.response.status = props.code;
12
12
  event.response.statusText = props.text;
13
- onCleanup(() => !event.nativeEvent.handled && !event.complete && (event.response.status = 200));
13
+ onCleanup(() =>
14
+ // !event.nativeEvent.handled &&
15
+ !event.complete && (event.response.status = 200));
14
16
  return null;
15
17
  }
16
18
  : (_props) => null;
@@ -1,5 +1,5 @@
1
- import type { JSX } from 'solid-js';
2
- import './styles.css';
1
+ import type { JSX } from "solid-js";
2
+ import "./styles.css";
3
3
  export declare function classNames(...classes: (string | boolean | undefined)[]): string;
4
4
  interface DevOverlayDialogProps {
5
5
  errors: any[];
@@ -1,17 +1,18 @@
1
1
  // @refresh skip
2
- import ErrorStackParser from 'error-stack-parser';
3
- import * as htmlToImage from 'html-to-image';
4
- import { ErrorBoundary, For, Show, Suspense, createMemo, createSignal } from 'solid-js';
5
- import { Portal } from 'solid-js/web';
6
- import { Dialog, DialogOverlay, DialogPanel, Select, SelectOption } from 'terracotta';
7
- import info from '../../../package.json';
8
- import { CodeView } from './CodeView';
9
- import { createStackFrame } from './createStackFrame';
10
- import download from './download';
11
- import { ArrowLeftIcon, ArrowRightIcon, CameraIcon, DiscordIcon, GithubIcon, RefreshIcon, SolidStartIcon, ViewCompiledIcon, ViewOriginalIcon } from './icons';
12
- import './styles.css';
2
+ import ErrorStackParser from "error-stack-parser";
3
+ import * as htmlToImage from "html-to-image";
4
+ import { ErrorBoundary, For, Show, Suspense, createMemo, createSignal } from "solid-js";
5
+ import { Portal } from "solid-js/web";
6
+ // @ts-ignore - terracotta module resolution issue with NodeNext
7
+ import { Dialog, DialogOverlay, DialogPanel, Select, SelectOption } from "terracotta";
8
+ import info from "../../../package.json" with { type: "json" };
9
+ import { CodeView } from "./CodeView.jsx";
10
+ import { createStackFrame } from "./createStackFrame.js";
11
+ import download from "./download.js";
12
+ import { ArrowLeftIcon, ArrowRightIcon, CameraIcon, DiscordIcon, GithubIcon, RefreshIcon, SolidStartIcon, ViewCompiledIcon, ViewOriginalIcon } from "./icons.jsx";
13
+ import "./styles.css";
13
14
  export function classNames(...classes) {
14
- return classes.filter(Boolean).join(' ');
15
+ return classes.filter(Boolean).join(" ");
15
16
  }
16
17
  function ErrorInfo(props) {
17
18
  const error = createMemo(() => {
@@ -31,8 +32,8 @@ function ErrorInfo(props) {
31
32
  }
32
33
  function getFileName(source) {
33
34
  try {
34
- const path = source.startsWith('/') ? new URL(source, 'file://') : new URL(source);
35
- const paths = path.pathname.split('/');
35
+ const path = source.startsWith("/") ? new URL(source, "file://") : new URL(source);
36
+ const paths = path.pathname.split("/");
36
37
  return paths[paths.length - 1];
37
38
  }
38
39
  catch (error) {
@@ -40,71 +41,77 @@ function getFileName(source) {
40
41
  }
41
42
  }
42
43
  function getFilePath(source) {
43
- const line = source.line ? `:${source.line}` : '';
44
- const column = source.column ? `:${source.column}` : '';
44
+ const line = source.line ? `:${source.line}` : "";
45
+ const column = source.column ? `:${source.column}` : "";
45
46
  return `${getFileName(source.source)}${line}${column}`;
46
47
  }
47
48
  function CodeFallback() {
48
- return <div class="dev-overlay-stack-frames-code-fallback">
49
- <span>Source not available.</span>
50
- </div>;
49
+ return (<div class="dev-overlay-stack-frames-code-fallback">
50
+ <span>Source not available.</span>
51
+ </div>);
51
52
  }
52
53
  function StackFramesContent(props) {
53
54
  const stackframes = ErrorStackParser.parse(props.error);
54
55
  const [selectedFrame, setSelectedFrame] = createSignal(stackframes[0]);
55
56
  return (<div class="dev-overlay-stack-frames-content">
56
- <div class="dev-overlay-stack-frames-code">
57
- <ErrorBoundary fallback={null}>
58
- {(() => {
57
+ <div class="dev-overlay-stack-frames-code">
58
+ <ErrorBoundary fallback={null}>
59
+ {(() => {
59
60
  const data = createStackFrame(selectedFrame(), () => props.isCompiled);
60
61
  return (<Suspense fallback={<CodeFallback />}>
61
- <Show when={data()} keyed fallback={<CodeFallback />}>
62
- {(source) => (<>
63
- <span class="dev-overlay-stack-frames-code-source">{source.source}</span>
64
- <div class="dev-overlay-stack-frames-code-container">
65
- <CodeView fileName={source.source} line={source.line} content={source.content}/>
66
- </div>
67
- </>)}
68
- </Show>
69
- </Suspense>);
62
+ <Show when={data()} keyed fallback={<CodeFallback />}>
63
+ {source => (<>
64
+ <span class="dev-overlay-stack-frames-code-source">{source.source}</span>
65
+ <div class="dev-overlay-stack-frames-code-container">
66
+ <CodeView fileName={source.source} line={source.line} content={source.content}/>
67
+ </div>
68
+ </>)}
69
+ </Show>
70
+ </Suspense>);
70
71
  })()}
71
- </ErrorBoundary>
72
- </div>
73
- <Select class="dev-overlay-stack-frames" value={selectedFrame()} onChange={setSelectedFrame}>
74
- <For each={stackframes}>
75
- {(current) => (<ErrorBoundary fallback={(<div class="dev-overlay-stack-frame">
76
- <span class="dev-overlay-stack-frame-function">{current.functionName ?? '<anonymous>'}</span>
77
- <span class="dev-overlay-stack-frame-file">{getFilePath({
72
+ </ErrorBoundary>
73
+ </div>
74
+ <Select class="dev-overlay-stack-frames" value={selectedFrame()} onChange={setSelectedFrame}>
75
+ <For each={stackframes}>
76
+ {current => (<ErrorBoundary fallback={<div class="dev-overlay-stack-frame">
77
+ <span class="dev-overlay-stack-frame-function">
78
+ {current.functionName ?? "<anonymous>"}
79
+ </span>
80
+ <span class="dev-overlay-stack-frame-file">
81
+ {getFilePath({
78
82
  source: current.getFileName(),
79
- content: '',
83
+ content: "",
80
84
  line: current.getLineNumber(),
81
85
  column: current.getColumnNumber(),
82
- name: current.getFunctionName(),
83
- })}</span>
84
- </div>)}>
86
+ name: current.getFunctionName()
87
+ })}
88
+ </span>
89
+ </div>}>
85
90
  {(() => {
86
91
  const data = createStackFrame(current, () => props.isCompiled);
87
92
  return (<Suspense>
88
93
  <Show when={data()} keyed>
89
- {(source) => (<SelectOption class="dev-overlay-stack-frame" value={current}>
90
- <span class="dev-overlay-stack-frame-function">{source.name ?? '<anonymous>'}</span>
94
+ {source => (<SelectOption class="dev-overlay-stack-frame" value={current}>
95
+ <span class="dev-overlay-stack-frame-function">
96
+ {source.name ?? "<anonymous>"}
97
+ </span>
91
98
  <span class="dev-overlay-stack-frame-file">{getFilePath(source)}</span>
92
99
  </SelectOption>)}
93
100
  </Show>
94
101
  </Suspense>);
95
102
  })()}
96
103
  </ErrorBoundary>)}
97
- </For>
98
- </Select>
99
- </div>);
104
+ </For>
105
+ </Select>
106
+ </div>);
100
107
  }
101
108
  function StackFrames(props) {
102
109
  return (<Show when={props.error instanceof Error && props.error} keyed>
103
- {(current) => (<StackFramesContent error={current} isCompiled={props.isCompiled}/>)}
110
+ {current => <StackFramesContent error={current} isCompiled={props.isCompiled}/>}
104
111
  </Show>);
105
112
  }
106
- const ISSUE_THREAD = 'https://github.com/solidjs/solid-start/issues/new';
107
- const DISCORD_INVITE = 'https://discord.com/invite/solidjs';
113
+ const ISSUE_THREAD = "https://github.com/solidjs/solid-start/issues/new";
114
+ const DISCORD_INVITE = "https://discord.com/invite/solidjs";
108
115
  export default function DevOverlayDialog(props) {
109
116
  const [currentPage, setCurrentPage] = createSignal(1);
110
117
  const [isCompiled, setIsCompiled] = createSignal(false);
@@ -113,7 +120,7 @@ export default function DevOverlayDialog(props) {
113
120
  return Math.min(currentPage(), length());
114
121
  });
115
122
  function goPrev() {
116
- setCurrentPage((c) => {
123
+ setCurrentPage(c => {
117
124
  if (c > 1) {
118
125
  return c - 1;
119
126
  }
@@ -121,7 +128,7 @@ export default function DevOverlayDialog(props) {
121
128
  });
122
129
  }
123
130
  function goNext() {
124
- setCurrentPage((c) => {
131
+ setCurrentPage(c => {
125
132
  if (c < length()) {
126
133
  return c + 1;
127
134
  }
@@ -129,31 +136,33 @@ export default function DevOverlayDialog(props) {
129
136
  });
130
137
  }
131
138
  function toggleIsCompiled() {
132
- setIsCompiled((c) => !c);
139
+ setIsCompiled(c => !c);
133
140
  }
134
141
  const [panel, setPanel] = createSignal();
135
142
  function downloadScreenshot() {
136
143
  const current = panel();
137
144
  if (current) {
138
- htmlToImage.toPng(current, {
145
+ htmlToImage
146
+ .toPng(current, {
139
147
  style: {
140
- transform: 'scale(0.75)',
141
- },
142
- }).then((url) => {
143
- download(url, 'start-screenshot.png');
148
+ transform: "scale(0.75)"
149
+ }
150
+ })
151
+ .then(url => {
152
+ download(url, "start-screenshot.png");
144
153
  });
145
154
  }
146
155
  }
147
156
  function redirectToGithub() {
148
157
  const url = new URL(ISSUE_THREAD);
149
- url.searchParams.append('labels', 'bug');
150
- url.searchParams.append('labels', 'needs+triage');
151
- url.searchParams.append('template', 'bug.yml');
152
- url.searchParams.append('title', `[Bug?]:` + props.errors[truncated() - 1].toString());
153
- window.open(url, '_blank').focus();
158
+ url.searchParams.append("labels", "bug");
159
+ url.searchParams.append("labels", "needs+triage");
160
+ url.searchParams.append("template", "bug.yml");
161
+ url.searchParams.append("title", `[Bug?]:` + props.errors[truncated() - 1].toString());
162
+ window.open(url, "_blank").focus();
154
163
  }
155
164
  function redirectToDiscord() {
156
- window.open(DISCORD_INVITE, '_blank').focus();
165
+ window.open(DISCORD_INVITE, "_blank").focus();
157
166
  }
158
167
  return (<Portal>
159
168
  <Dialog class="dev-overlay" isOpen>
@@ -194,7 +203,7 @@ export default function DevOverlayDialog(props) {
194
203
  <CameraIcon title="Capture Error Overlay"/>
195
204
  </button>
196
205
  <button class="dev-overlay-button" onClick={toggleIsCompiled} type="button">
197
- <Show when={isCompiled()} fallback={(<ViewOriginalIcon title="View Original Source"/>)}>
206
+ <Show when={isCompiled()} fallback={<ViewOriginalIcon title="View Original Source"/>}>
198
207
  <ViewCompiledIcon title="View Compiled Source"/>
199
208
  </Show>
200
209
  </button>
@@ -204,7 +213,7 @@ export default function DevOverlayDialog(props) {
204
213
  </div>
205
214
  </div>
206
215
  <Show when={props.errors[truncated() - 1]} keyed>
207
- {(current) => (<div class="dev-overlay-content">
216
+ {current => (<div class="dev-overlay-content">
208
217
  <ErrorInfo error={current}/>
209
218
  <StackFrames error={current} isCompiled={isCompiled()}/>
210
219
  </div>)}
@@ -1,8 +1,8 @@
1
1
  import { createMemo, createResource } from "solid-js";
2
- import getSourceMap from "./get-source-map";
2
+ import getSourceMap from "./get-source-map.js";
3
3
  function getActualFileSource(path) {
4
- if (path.startsWith('file://')) {
5
- return '/_build/@fs' + path.substring('file://'.length);
4
+ if (path.startsWith("file://")) {
5
+ return "/_build/@fs" + path.substring("file://".length);
6
6
  }
7
7
  return path;
8
8
  }
@@ -1,13 +1,10 @@
1
1
  // @refresh skip
2
2
  import { ErrorBoundary, Show, createEffect, createSignal, onCleanup, resetErrorBoundaries } from "solid-js";
3
- import { HttpStatusCode } from "../HttpStatusCode";
4
- import clientOnly from "../clientOnly";
5
- const DevOverlayDialog =
6
- /* #__PURE__ */ process.env.NODE_ENV === "production"
7
- ? () => {
8
- return <></>;
9
- }
10
- : /* #__PURE__ */ clientOnly(() => import("./DevOverlayDialog"), { lazy: true });
3
+ import { HttpStatusCode } from "../HttpStatusCode.js";
4
+ import clientOnly from "../clientOnly.js";
5
+ const DevOverlayDialog = import.meta.env.PROD
6
+ ? () => <></>
7
+ : clientOnly(() => import("./DevOverlayDialog"), { lazy: true });
11
8
  export function DevOverlay(props) {
12
9
  const [errors, setErrors] = createSignal([]);
13
10
  function resetError() {
@@ -0,0 +1,3 @@
1
+ import { lazy as solidLazy } from "solid-js";
2
+ declare const lazy: typeof solidLazy;
3
+ export default lazy;
@@ -0,0 +1,40 @@
1
+ import { lazy as solidLazy } from "solid-js";
2
+ import { getRequestEvent, isServer } from "solid-js/web";
3
+ import { getManifest } from "solid-start:get-manifest";
4
+ import { useAssets } from "../server/assets/index.js";
5
+ const assetsById = {};
6
+ const getAssets = async (id) => {
7
+ if (assetsById[id])
8
+ return assetsById[id];
9
+ const manifest = getManifest(import.meta.env.SSR && import.meta.env.DEV ? "ssr" : "client");
10
+ const assets = await manifest.getAssets(id);
11
+ if (import.meta.env.PROD)
12
+ assetsById[id] = assets;
13
+ return assets;
14
+ };
15
+ const withAssets = function (fn) {
16
+ const wrapper = async () => {
17
+ const mod = await fn();
18
+ // This id$$ export is generated by the lazy vite plugin
19
+ const id = mod.id$$;
20
+ if (!id)
21
+ return mod;
22
+ if (!mod.default) {
23
+ console.error(`Module ${id} does not export default`);
24
+ return { default: () => [] };
25
+ }
26
+ const assets = await getAssets(id);
27
+ if (!assets.length)
28
+ return mod;
29
+ return {
30
+ default: (props) => {
31
+ const { nonce } = getRequestEvent();
32
+ useAssets(assets, nonce);
33
+ return mod.default(props);
34
+ }
35
+ };
36
+ };
37
+ return wrapper;
38
+ };
39
+ const lazy = !isServer ? solidLazy : (fn) => solidLazy(withAssets(fn));
40
+ export default lazy;
@@ -1,4 +1,4 @@
1
- import type { ServerFunctionMeta } from "../server/types";
1
+ import type { ServerFunctionMeta } from "../server/types.ts";
2
2
  /**
3
3
  *
4
4
  * Read more: https://docs.solidjs.com/solid-start/reference/server/get-server-function-meta
package/package.json CHANGED
@@ -1,84 +1,66 @@
1
1
  {
2
2
  "name": "@solidjs/start",
3
- "version": "1.1.7",
3
+ "version": "2.0.0-alpha.0",
4
4
  "type": "module",
5
- "author": "Ryan Carniato",
6
- "license": "MIT",
7
- "homepage": "https://start.solidjs.com/",
8
- "bugs": "https://github.com/solidjs/solid-start/issues",
9
- "repository": {
10
- "type": "git",
11
- "url": "https://github.com/solidjs/solid-start.git",
12
- "directory": "packages/start"
13
- },
14
- "publishConfig": {
15
- "access": "public"
16
- },
17
- "files": [
18
- "config",
19
- "dist",
20
- "env.d.ts"
21
- ],
22
- "types": "./dist/index.d.ts",
23
5
  "exports": {
24
6
  ".": "./dist/index.jsx",
25
- "./config": "./config/index.js",
26
- "./middleware": "./dist/middleware/index.jsx",
27
- "./router": "./dist/router/index.jsx",
7
+ "./config": "./dist/config/index.js",
28
8
  "./server": "./dist/server/index.jsx",
29
- "./server/spa": "./dist/server/spa/index.jsx",
30
9
  "./client": "./dist/client/index.jsx",
31
- "./client/islands": "./dist/client/islands.jsx",
10
+ "./router": "./dist/router.jsx",
11
+ "./server/spa": "./dist/server/spa/index.jsx",
32
12
  "./client/spa": "./dist/client/spa/index.jsx",
33
- "./env": {
34
- "types": "./env.d.ts",
35
- "import": null
36
- }
37
- },
38
- "typesVersions": {
39
- "*": {
40
- ".": [
41
- "./dist/index.d.ts"
42
- ],
43
- "middleware": [
44
- "./dist/middleware/index.d.ts"
45
- ],
46
- "router": [
47
- "./dist/router/index.d.ts"
48
- ],
49
- "server": [
50
- "./dist/server/index.d.ts"
51
- ],
52
- "client": [
53
- "./dist/client/index.d.ts"
54
- ]
55
- }
13
+ "./middleware": "./dist/middleware/index.js",
14
+ "./http": "./dist/http/index.js"
56
15
  },
57
- "devDependencies": {
58
- "solid-js": "^1.9.5",
59
- "vinxi": "^0.5.7"
16
+ "publishConfig": {
17
+ "access": "public"
60
18
  },
61
19
  "dependencies": {
62
- "@tanstack/server-functions-plugin": "1.121.21",
63
- "@vinxi/plugin-directives": "^0.5.0",
64
- "@vinxi/server-components": "^0.5.0",
65
- "defu": "^6.1.2",
20
+ "@babel/core": "^7.28.3",
21
+ "@babel/traverse": "^7.28.3",
22
+ "@babel/types": "^7.28.5",
23
+ "@solidjs/meta": "^0.29.4",
24
+ "@tanstack/server-functions-plugin": "1.134.5",
25
+ "@types/babel__traverse": "^7.28.0",
26
+ "@types/micromatch": "^4.0.9",
27
+ "cookie-es": "^2.0.0",
28
+ "defu": "^6.1.4",
66
29
  "error-stack-parser": "^2.1.4",
67
- "html-to-image": "^1.11.11",
68
- "radix3": "^1.1.0",
69
- "seroval": "^1.0.2",
70
- "seroval-plugins": "^1.0.2",
30
+ "es-module-lexer": "^1.7.0",
31
+ "esbuild": "^0.25.3",
32
+ "fast-glob": "^3.3.3",
33
+ "h3": "npm:h3@2.0.1-rc.4",
34
+ "html-to-image": "^1.11.13",
35
+ "micromatch": "^4.0.8",
36
+ "path-to-regexp": "^8.2.0",
37
+ "pathe": "^2.0.3",
38
+ "radix3": "^1.1.2",
39
+ "seroval": "^1.3.2",
40
+ "seroval-plugins": "^1.2.1",
71
41
  "shiki": "^1.26.1",
72
- "source-map-js": "^1.0.2",
73
- "terracotta": "^1.0.4",
74
- "tinyglobby": "^0.2.2",
75
- "vite-plugin-solid": "^2.11.1"
42
+ "solid-js": "^1.9.9",
43
+ "source-map-js": "^1.2.1",
44
+ "srvx": "^0.9.1",
45
+ "terracotta": "^1.0.6",
46
+ "vite-plugin-solid": "^2.11.9"
47
+ },
48
+ "engines": {
49
+ "node": ">=22"
50
+ },
51
+ "devDependencies": {
52
+ "@types/babel__core": "^7.20.5",
53
+ "vite": "^7.1.10",
54
+ "vitest": "^4.0.10"
76
55
  },
77
56
  "peerDependencies": {
78
- "vinxi": "^0.5.7"
57
+ "vite": "^7"
79
58
  },
80
59
  "scripts": {
81
- "typecheck": "tsc --noEmit",
82
- "build": "node build && pnpm tsc"
60
+ "build": "pnpm validate-imports && tsc && node scripts/build.js",
61
+ "dev": "tsc --watch",
62
+ "test": "vitest",
63
+ "test:ci": "vitest run",
64
+ "validate-imports": "node scripts/validate-imports.js"
83
65
  }
84
66
  }
@@ -0,0 +1,15 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import glob from "fast-glob";
4
+
5
+ const files = await glob("**/*.{js,css}", { cwd: `${process.cwd()}/src` });
6
+
7
+ await Promise.all(
8
+ files.map(file =>
9
+ fs.cp(
10
+ path.join(import.meta.dirname, "../src", file),
11
+ path.join(import.meta.dirname, "../dist", file),
12
+ { recursive: true }
13
+ )
14
+ )
15
+ );