@storybook/tanstack-react 0.0.0-pr-34403-sha-14169208 → 10.4.0-alpha.17
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/dist/_browser-chunks/{chunk-SXO3DKIN.js → chunk-73EPJ7AY.js} +62 -58
- package/dist/export-mocks/start.d.ts +94 -4
- package/dist/export-mocks/start.js +285 -7
- package/dist/index.js +1 -1
- package/dist/node/index.js +6 -7
- package/dist/preset.js +105 -9461
- package/dist/preview.d.ts +2 -1
- package/dist/preview.js +3 -1
- package/package.json +7 -18
- package/template/cli/ts/Page.stories.ts +3 -2
- package/template/cli/ts/Page.tsx +42 -116
- package/dist/_node-chunks/chunk-CUC3UGKZ.js +0 -38
- package/dist/export-mocks/start-server.d.ts +0 -95
- package/dist/export-mocks/start-server.js +0 -291
|
@@ -7,6 +7,7 @@ var preview_exports = {};
|
|
|
7
7
|
__export(preview_exports, {
|
|
8
8
|
applyDecorators: () => applyDecorators,
|
|
9
9
|
loaders: () => loaders,
|
|
10
|
+
optimizeDeps: () => optimizeDeps,
|
|
10
11
|
parameters: () => parameters
|
|
11
12
|
});
|
|
12
13
|
import { applyDecorators as reactApplyDecorators } from "@storybook/react/entry-preview-docs";
|
|
@@ -18,9 +19,7 @@ import {
|
|
|
18
19
|
createRootRoute,
|
|
19
20
|
createRoute as createRoute2,
|
|
20
21
|
createRouter,
|
|
21
|
-
Route,
|
|
22
22
|
RouterProvider,
|
|
23
|
-
RootRoute as RootRoute2,
|
|
24
23
|
interpolatePath,
|
|
25
24
|
defaultStringifySearch
|
|
26
25
|
} from "@tanstack/react-router";
|
|
@@ -99,13 +98,58 @@ function resolveStoryLeaf(tree, { path, boundRouteId }) {
|
|
|
99
98
|
return firstChild || root;
|
|
100
99
|
}
|
|
101
100
|
|
|
101
|
+
// src/routing/utils.ts
|
|
102
|
+
import { Route, RootRoute as RootRoute2 } from "@tanstack/react-router";
|
|
103
|
+
function isRoute(value) {
|
|
104
|
+
return value instanceof Route || value instanceof RootRoute2;
|
|
105
|
+
}
|
|
106
|
+
|
|
102
107
|
// src/routing/decorator.tsx
|
|
103
108
|
var StoryContext = React.createContext({ Story: () => null }), StoryFromContext = () => {
|
|
104
109
|
let { Story } = React.useContext(StoryContext);
|
|
105
110
|
return React.createElement(Story, null);
|
|
106
|
-
};
|
|
107
|
-
function
|
|
108
|
-
|
|
111
|
+
}, tanstackRouteDecorator = (Story, context) => React.createElement(TanStackRouterStory, { Story, context });
|
|
112
|
+
function TanStackRouterStory({ Story, context }) {
|
|
113
|
+
let routerContext = context.parameters.tanstack?.router?.useRouterContext?.({
|
|
114
|
+
storyContext: context
|
|
115
|
+
}), router = React.useMemo(
|
|
116
|
+
() => createStoryRouter({ Story: StoryFromContext, context, routerContext }),
|
|
117
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
118
|
+
[context.id]
|
|
119
|
+
), providerContext = React.useMemo(
|
|
120
|
+
() => ({
|
|
121
|
+
...context.parameters.tanstack?.router?.context,
|
|
122
|
+
...routerContext
|
|
123
|
+
}),
|
|
124
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
125
|
+
[context.id, routerContext]
|
|
126
|
+
);
|
|
127
|
+
return React.createElement(StoryContext.Provider, { value: { Story } }, React.createElement(RouterProvider, { router, context: providerContext }));
|
|
128
|
+
}
|
|
129
|
+
function createStoryRouter({
|
|
130
|
+
Story,
|
|
131
|
+
context,
|
|
132
|
+
routerContext
|
|
133
|
+
}) {
|
|
134
|
+
let routerParameters = context.parameters.tanstack?.router ?? {}, { tree, leaf } = resolveTree(Story, context), routeTree = tree.root, inferredPath = routerParameters?.path || leaf.fullPath || routeTree.children?.[0]?.fullPath || "/", resolvedPath = interpolatePath({
|
|
135
|
+
path: inferredPath,
|
|
136
|
+
params: routerParameters?.params ?? {}
|
|
137
|
+
}).interpolatedPath, search = routerParameters?.query ? defaultStringifySearch(routerParameters.query) : "";
|
|
138
|
+
search && (resolvedPath += search);
|
|
139
|
+
let history = createMemoryHistory({
|
|
140
|
+
initialEntries: [resolvedPath]
|
|
141
|
+
});
|
|
142
|
+
return history.replace(resolvedPath), createRouter({
|
|
143
|
+
routeTree,
|
|
144
|
+
history,
|
|
145
|
+
defaultNotFoundComponent(props) {
|
|
146
|
+
return React.createElement("div", null, "Route not found: ", props.routeId);
|
|
147
|
+
},
|
|
148
|
+
defaultErrorComponent({ error }) {
|
|
149
|
+
return React.createElement("div", null, "Story did something wrong : ", String(error));
|
|
150
|
+
},
|
|
151
|
+
context: routerContext
|
|
152
|
+
});
|
|
109
153
|
}
|
|
110
154
|
function injectStoryComponent(leaf, Story, overrides, leafId) {
|
|
111
155
|
let userOverride = overrides?.[leafId];
|
|
@@ -141,55 +185,9 @@ function resolveTree(Story, context) {
|
|
|
141
185
|
leaf: syntheticChild
|
|
142
186
|
};
|
|
143
187
|
}
|
|
144
|
-
function createStoryRouter({
|
|
145
|
-
Story,
|
|
146
|
-
context,
|
|
147
|
-
routerContext
|
|
148
|
-
}) {
|
|
149
|
-
let routerParameters = context.parameters.tanstack?.router ?? {}, { tree, leaf } = resolveTree(Story, context), routeTree = tree.root, inferredPath = routerParameters?.path || leaf.fullPath || routeTree.children?.[0]?.fullPath || "/", resolvedPath = interpolatePath({
|
|
150
|
-
path: inferredPath,
|
|
151
|
-
params: routerParameters?.params ?? {}
|
|
152
|
-
}).interpolatedPath, search = routerParameters?.query ? defaultStringifySearch(routerParameters.query) : "";
|
|
153
|
-
search && (resolvedPath += search);
|
|
154
|
-
let history = createMemoryHistory({
|
|
155
|
-
initialEntries: [resolvedPath]
|
|
156
|
-
});
|
|
157
|
-
return history.replace(resolvedPath), createRouter({
|
|
158
|
-
routeTree,
|
|
159
|
-
history,
|
|
160
|
-
defaultNotFoundComponent(props) {
|
|
161
|
-
return React.createElement("div", null, "Route not found: ", props.routeId);
|
|
162
|
-
},
|
|
163
|
-
defaultErrorComponent({ error }) {
|
|
164
|
-
return React.createElement("div", null, "Story did something wrong : ", String(error));
|
|
165
|
-
},
|
|
166
|
-
context: routerContext
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
var tanstackRouteDecorator = (Story, context) => React.createElement(TanStackRouterStory, { Story, context });
|
|
170
|
-
function TanStackRouterStory({ Story, context }) {
|
|
171
|
-
let routerContext = context.parameters.tanstack?.router?.useRouterContext?.({
|
|
172
|
-
storyContext: context
|
|
173
|
-
}), router = React.useMemo(
|
|
174
|
-
() => createStoryRouter({ Story: StoryFromContext, context, routerContext }),
|
|
175
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
176
|
-
[context.id]
|
|
177
|
-
), providerContext = React.useMemo(
|
|
178
|
-
() => ({
|
|
179
|
-
...context.parameters.tanstack?.router?.context,
|
|
180
|
-
...routerContext
|
|
181
|
-
}),
|
|
182
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
183
|
-
[context.id, routerContext]
|
|
184
|
-
);
|
|
185
|
-
return React.createElement(StoryContext.Provider, { value: { Story } }, React.createElement(RouterProvider, { router, context: providerContext }));
|
|
186
|
-
}
|
|
187
188
|
|
|
188
189
|
// src/routing/loader.ts
|
|
189
|
-
import {
|
|
190
|
-
function isRoute2(value) {
|
|
191
|
-
return value instanceof Route2 || value instanceof RootRoute3;
|
|
192
|
-
}
|
|
190
|
+
import { RootRoute as RootRoute3 } from "@tanstack/react-router";
|
|
193
191
|
function getComponentFromRoute(route) {
|
|
194
192
|
if (route.options?.component)
|
|
195
193
|
return route.options.component;
|
|
@@ -197,30 +195,36 @@ function getComponentFromRoute(route) {
|
|
|
197
195
|
return route.children?.[0]?.options?.component;
|
|
198
196
|
}
|
|
199
197
|
var routeComponentLoader = (context) => {
|
|
200
|
-
let
|
|
201
|
-
if (
|
|
198
|
+
let routerParameters = context.parameters.tanstack?.router ?? {}, parameterRoute = isRoute(routerParameters.route) ? routerParameters.route : void 0;
|
|
199
|
+
if (parameterRoute) {
|
|
202
200
|
if (!context.component) {
|
|
203
|
-
let component = getComponentFromRoute(
|
|
204
|
-
component &&
|
|
201
|
+
let component = getComponentFromRoute(parameterRoute);
|
|
202
|
+
component && !context.component && (context.component = component);
|
|
205
203
|
}
|
|
206
|
-
context.route || (context.route =
|
|
204
|
+
context.route || (context.route = parameterRoute);
|
|
207
205
|
}
|
|
208
206
|
};
|
|
209
207
|
|
|
210
208
|
// src/preview.tsx
|
|
211
209
|
var loaders = [routeComponentLoader], applyDecorators = (storyFn, allDecorators) => (
|
|
212
210
|
// reorder decorators so `jsxDecorator` is innermost, and `tanstackRouteDecorator` is just outside it
|
|
211
|
+
// There is an issue if `tanstackRouteDecorator` is innermost. All stories crashes due to a bug with the jsxDecorator.
|
|
213
212
|
reactApplyDecorators(storyFn, [
|
|
214
213
|
tanstackRouteDecorator,
|
|
215
214
|
...allDecorators
|
|
216
215
|
])
|
|
217
216
|
), parameters = {
|
|
218
217
|
tanstack: {}
|
|
219
|
-
}
|
|
218
|
+
}, optimizeDeps = [
|
|
219
|
+
"@tanstack/react-devtools",
|
|
220
|
+
"@tanstack/react-query-devtools",
|
|
221
|
+
"@tanstack/react-router-devtools"
|
|
222
|
+
];
|
|
220
223
|
|
|
221
224
|
export {
|
|
222
225
|
loaders,
|
|
223
226
|
applyDecorators,
|
|
224
227
|
parameters,
|
|
228
|
+
optimizeDeps,
|
|
225
229
|
preview_exports
|
|
226
230
|
};
|
|
@@ -3,6 +3,99 @@ import { createServerFn as createServerFn$1 } from '@tanstack/start-client-core'
|
|
|
3
3
|
export * from '@tanstack/start-client-core';
|
|
4
4
|
export * from '@tanstack/react-start';
|
|
5
5
|
|
|
6
|
+
type RequestOptions<TRegister = unknown> = {
|
|
7
|
+
context?: TRegister extends {
|
|
8
|
+
server: {
|
|
9
|
+
requestContext: infer TRequestContext;
|
|
10
|
+
};
|
|
11
|
+
} ? TRequestContext : unknown;
|
|
12
|
+
};
|
|
13
|
+
type MockRequestExecutor<TRegister = unknown> = (request: Request, opts?: RequestOptions<TRegister>) => Promise<unknown> | unknown;
|
|
14
|
+
type HandlerContext = {
|
|
15
|
+
request: Request;
|
|
16
|
+
responseHeaders: Headers;
|
|
17
|
+
router?: unknown;
|
|
18
|
+
context?: unknown;
|
|
19
|
+
requestContext?: unknown;
|
|
20
|
+
};
|
|
21
|
+
type HandlerCallback<TRouter = unknown> = (context: HandlerContext & {
|
|
22
|
+
router?: TRouter;
|
|
23
|
+
}) => Promise<unknown> | unknown;
|
|
24
|
+
type SessionConfig = Record<string, unknown>;
|
|
25
|
+
type MockSession<TSessionData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
26
|
+
data: Partial<TSessionData>;
|
|
27
|
+
update: (update?: Partial<TSessionData> | ((prev: Partial<TSessionData>) => Partial<TSessionData>)) => Promise<MockSession<TSessionData>>;
|
|
28
|
+
save: () => Promise<void>;
|
|
29
|
+
clear: () => Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
declare const HEADERS: {
|
|
32
|
+
readonly TSS_SHELL: "X-TSS_SHELL";
|
|
33
|
+
};
|
|
34
|
+
declare const VIRTUAL_MODULES: {
|
|
35
|
+
readonly startManifest: "tanstack-start-manifest:v";
|
|
36
|
+
readonly injectedHeadScripts: "tanstack-start-injected-head-scripts:v";
|
|
37
|
+
readonly serverFnResolver: "#tanstack-start-server-fn-resolver";
|
|
38
|
+
};
|
|
39
|
+
declare function StartServer(): null;
|
|
40
|
+
declare const defineHandlerCallback: <TRouter = unknown>(handler: HandlerCallback<TRouter>) => HandlerCallback<TRouter>;
|
|
41
|
+
declare const defaultStreamHandler: () => Promise<Response>;
|
|
42
|
+
declare const defaultRenderHandler: () => Promise<Response>;
|
|
43
|
+
declare const requestHandler: <TRegister = unknown>(handler: MockRequestExecutor<TRegister>) => (request: Request, requestOpts?: RequestOptions<TRegister>) => Promise<Response>;
|
|
44
|
+
declare const createRequestHandler: <TRegister = unknown>(handler: MockRequestExecutor<TRegister>) => (request: Request, requestOpts?: RequestOptions<TRegister> | undefined) => Promise<Response>;
|
|
45
|
+
declare const createStartHandler: <TRegister = unknown>(cbOrOptions: HandlerCallback | {
|
|
46
|
+
handler?: HandlerCallback;
|
|
47
|
+
}) => (request: Request, requestOpts?: RequestOptions<TRegister> | undefined) => Promise<Response>;
|
|
48
|
+
declare const attachRouterServerSsrUtils: <TRouter>(router: TRouter) => TRouter;
|
|
49
|
+
declare const transformReadableStreamWithRouter: <TReadableStream>(stream: TReadableStream) => TReadableStream;
|
|
50
|
+
declare const transformPipeableStreamWithRouter: <TPipeableStream>(stream: TPipeableStream) => TPipeableStream;
|
|
51
|
+
declare const getRequest: () => Request;
|
|
52
|
+
declare const getRequestHeaders: () => Headers;
|
|
53
|
+
declare const getRequestHeader: (name: string) => string | undefined;
|
|
54
|
+
declare const getRequestIP: (opts?: {
|
|
55
|
+
xForwardedFor?: boolean;
|
|
56
|
+
}) => string | undefined;
|
|
57
|
+
declare const getRequestHost: (opts?: {
|
|
58
|
+
xForwardedHost?: boolean;
|
|
59
|
+
}) => string;
|
|
60
|
+
declare const getRequestUrl: (opts?: {
|
|
61
|
+
xForwardedHost?: boolean;
|
|
62
|
+
xForwardedProto?: boolean;
|
|
63
|
+
}) => URL;
|
|
64
|
+
declare const getRequestProtocol: (opts?: {
|
|
65
|
+
xForwardedProto?: boolean;
|
|
66
|
+
}) => string;
|
|
67
|
+
declare const setResponseHeaders: (headers: HeadersInit) => void;
|
|
68
|
+
declare const getResponseHeaders: () => Headers;
|
|
69
|
+
declare const getResponseHeader: (name: string) => string | undefined;
|
|
70
|
+
declare const setResponseHeader: (name: string, value: string | Array<string>) => void;
|
|
71
|
+
declare const removeResponseHeader: (name: string) => void;
|
|
72
|
+
declare const clearResponseHeaders: (headerNames?: Array<string>) => void;
|
|
73
|
+
declare const getResponseStatus: () => number;
|
|
74
|
+
declare const setResponseStatus: (code?: number, text?: string) => void;
|
|
75
|
+
declare const getCookies: () => {
|
|
76
|
+
[k: string]: string;
|
|
77
|
+
};
|
|
78
|
+
declare const getCookie: (name: string) => string | undefined;
|
|
79
|
+
declare const setCookie: (name: string, value: string, options?: Record<string, unknown>) => void;
|
|
80
|
+
declare const deleteCookie: (name: string, options?: Record<string, unknown>) => void;
|
|
81
|
+
declare const useSession: <TSessionData extends Record<string, unknown> = Record<string, unknown>>(_config: SessionConfig) => Promise<MockSession<TSessionData>>;
|
|
82
|
+
declare const getSession: <TSessionData extends Record<string, unknown> = Record<string, unknown>>(_config: SessionConfig) => Promise<MockSession<TSessionData>>;
|
|
83
|
+
declare const updateSession: <TSessionData extends Record<string, unknown> = Record<string, unknown>>(_config: SessionConfig, update?: Partial<TSessionData> | ((prev: Partial<TSessionData>) => Partial<TSessionData>)) => Promise<MockSession<TSessionData>>;
|
|
84
|
+
declare const sealSession: (_config: SessionConfig) => Promise<string>;
|
|
85
|
+
declare const unsealSession: (_config: SessionConfig, sealed: string) => Promise<any>;
|
|
86
|
+
declare const clearSession: (_config: Partial<SessionConfig>) => Promise<void>;
|
|
87
|
+
declare const getResponse: () => {
|
|
88
|
+
status: number | undefined;
|
|
89
|
+
statusText: string | undefined;
|
|
90
|
+
readonly headers: Headers;
|
|
91
|
+
};
|
|
92
|
+
declare const getValidatedQuery: (schema: {
|
|
93
|
+
parse?: (value: Record<string, string>) => unknown;
|
|
94
|
+
safeParse?: (value: Record<string, string>) => unknown;
|
|
95
|
+
["~standard"]?: {
|
|
96
|
+
validate?: (value: Record<string, string>) => Promise<unknown> | unknown;
|
|
97
|
+
};
|
|
98
|
+
}) => Promise<unknown>;
|
|
6
99
|
declare function useServerFn<T extends (...args: Array<any>) => Promise<any>>(serverFn: T): (...args: Parameters<T>) => ReturnType<T>;
|
|
7
100
|
declare const createServerFn: typeof createServerFn$1;
|
|
8
101
|
declare const Link: ({ to, children, ...props }: {
|
|
@@ -17,9 +110,6 @@ declare const Navigate: ({ to }: {
|
|
|
17
110
|
}) => null;
|
|
18
111
|
declare const notFound: () => never;
|
|
19
112
|
declare const createStart: () => {};
|
|
20
|
-
declare const setCookie: (name: string, value: string) => void;
|
|
21
|
-
declare const getCookie: (name: string) => string | undefined;
|
|
22
|
-
declare const deleteCookie: (name: string) => void;
|
|
23
113
|
declare const clearCookieStore: () => void;
|
|
24
114
|
declare const fetchHandler: () => Promise<Response>;
|
|
25
115
|
|
|
@@ -27,4 +117,4 @@ declare const _default: {
|
|
|
27
117
|
fetch: () => Promise<Response>;
|
|
28
118
|
};
|
|
29
119
|
|
|
30
|
-
export { Link, Navigate, clearCookieStore, createServerFn, createStart, _default as default, deleteCookie, fetchHandler as fetch, getCookie, notFound, setCookie, useServerFn };
|
|
120
|
+
export { HEADERS, Link, Navigate, StartServer, VIRTUAL_MODULES, attachRouterServerSsrUtils, clearCookieStore, clearResponseHeaders, clearSession, createRequestHandler, createServerFn, createStart, createStartHandler, _default as default, defaultRenderHandler, defaultStreamHandler, defineHandlerCallback, deleteCookie, fetchHandler as fetch, getCookie, getCookies, getRequest, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestProtocol, getRequestUrl, getResponse, getResponseHeader, getResponseHeaders, getResponseStatus, getSession, getValidatedQuery, notFound, removeResponseHeader, requestHandler, sealSession, setCookie, setResponseHeader, setResponseHeaders, setResponseStatus, transformPipeableStreamWithRouter, transformReadableStreamWithRouter, unsealSession, updateSession, useServerFn, useSession };
|
|
@@ -8,6 +8,252 @@ import React from "react";
|
|
|
8
8
|
import { fn } from "storybook/test";
|
|
9
9
|
export * from "@tanstack/start-client-core";
|
|
10
10
|
export * from "@tanstack/react-start";
|
|
11
|
+
var START_SERVER_STATE_SYMBOL = Symbol.for("storybook.tanstack-react.start-server.state"), browserGlobals = globalThis, HEADERS = {
|
|
12
|
+
TSS_SHELL: "X-TSS_SHELL"
|
|
13
|
+
}, VIRTUAL_MODULES = {
|
|
14
|
+
startManifest: "tanstack-start-manifest:v",
|
|
15
|
+
injectedHeadScripts: "tanstack-start-injected-head-scripts:v",
|
|
16
|
+
serverFnResolver: "#tanstack-start-server-fn-resolver"
|
|
17
|
+
};
|
|
18
|
+
function createNamedMock(name, implementation) {
|
|
19
|
+
return fn(implementation).mockName(`@tanstack/react-start/server::${name}`);
|
|
20
|
+
}
|
|
21
|
+
function createDefaultRequest() {
|
|
22
|
+
return new Request("http://localhost/");
|
|
23
|
+
}
|
|
24
|
+
function parseCookieHeader(cookieHeader) {
|
|
25
|
+
let cookies = /* @__PURE__ */ new Map();
|
|
26
|
+
if (!cookieHeader)
|
|
27
|
+
return cookies;
|
|
28
|
+
for (let segment of cookieHeader.split(";")) {
|
|
29
|
+
let [rawName, ...rawValue] = segment.trim().split("=");
|
|
30
|
+
rawName && cookies.set(rawName, decodeURIComponent(rawValue.join("=")));
|
|
31
|
+
}
|
|
32
|
+
return cookies;
|
|
33
|
+
}
|
|
34
|
+
function serializeCookie(name, value, options) {
|
|
35
|
+
let parts = [`${name}=${encodeURIComponent(value)}`];
|
|
36
|
+
return typeof options?.path == "string" && parts.push(`Path=${options.path}`), typeof options?.domain == "string" && parts.push(`Domain=${options.domain}`), typeof options?.maxAge == "number" && parts.push(`Max-Age=${options.maxAge}`), options?.expires instanceof Date && parts.push(`Expires=${options.expires.toUTCString()}`), options?.httpOnly && parts.push("HttpOnly"), options?.secure && parts.push("Secure"), typeof options?.sameSite == "string" && parts.push(`SameSite=${options.sameSite}`), parts.join("; ");
|
|
37
|
+
}
|
|
38
|
+
function createMockState(request = createDefaultRequest()) {
|
|
39
|
+
return {
|
|
40
|
+
request,
|
|
41
|
+
responseHeaders: new Headers(),
|
|
42
|
+
responseStatus: void 0,
|
|
43
|
+
cookies: parseCookieHeader(request.headers.get("cookie")),
|
|
44
|
+
sessionData: {}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function getState() {
|
|
48
|
+
let existingState = browserGlobals[START_SERVER_STATE_SYMBOL];
|
|
49
|
+
if (existingState)
|
|
50
|
+
return existingState;
|
|
51
|
+
let nextState = createMockState();
|
|
52
|
+
return browserGlobals[START_SERVER_STATE_SYMBOL] = nextState, nextState;
|
|
53
|
+
}
|
|
54
|
+
async function withRequestState(request, run) {
|
|
55
|
+
let previousState = browserGlobals[START_SERVER_STATE_SYMBOL];
|
|
56
|
+
browserGlobals[START_SERVER_STATE_SYMBOL] = createMockState(request);
|
|
57
|
+
try {
|
|
58
|
+
return await run();
|
|
59
|
+
} finally {
|
|
60
|
+
previousState ? browserGlobals[START_SERVER_STATE_SYMBOL] = previousState : delete browserGlobals[START_SERVER_STATE_SYMBOL];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function mergeResponseState(response) {
|
|
64
|
+
let state = getState(), headers = new Headers(response.headers);
|
|
65
|
+
return state.responseHeaders.forEach((value, key) => {
|
|
66
|
+
if (key.toLowerCase() === "set-cookie") {
|
|
67
|
+
headers.append(key, value);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
headers.set(key, value);
|
|
71
|
+
}), new Response(response.body, {
|
|
72
|
+
status: state.responseStatus?.code ?? response.status,
|
|
73
|
+
statusText: state.responseStatus?.text ?? response.statusText,
|
|
74
|
+
headers
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function toResponse(result) {
|
|
78
|
+
return result instanceof Response ? mergeResponseState(result) : result == null ? mergeResponseState(new Response(null)) : mergeResponseState(typeof result == "string" ? new Response(result) : new Response(JSON.stringify(result), {
|
|
79
|
+
headers: { "content-type": "application/json" }
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
function getSessionRecord() {
|
|
83
|
+
let state = getState();
|
|
84
|
+
return {
|
|
85
|
+
data: state.sessionData,
|
|
86
|
+
update: async (update) => {
|
|
87
|
+
let nextValue = typeof update == "function" ? update(state.sessionData) : update;
|
|
88
|
+
return state.sessionData = {
|
|
89
|
+
...state.sessionData,
|
|
90
|
+
...nextValue
|
|
91
|
+
}, getSessionRecord();
|
|
92
|
+
},
|
|
93
|
+
save: async () => {
|
|
94
|
+
},
|
|
95
|
+
clear: async () => {
|
|
96
|
+
state.sessionData = {};
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function StartServer() {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
var defineHandlerCallback = createNamedMock(
|
|
104
|
+
"defineHandlerCallback",
|
|
105
|
+
(handler) => handler
|
|
106
|
+
), defaultStreamHandler = createNamedMock(
|
|
107
|
+
"defaultStreamHandler",
|
|
108
|
+
async () => new Response("Storybook Mock", { status: 200 })
|
|
109
|
+
), defaultRenderHandler = createNamedMock(
|
|
110
|
+
"defaultRenderHandler",
|
|
111
|
+
async () => new Response("Storybook Mock", { status: 200 })
|
|
112
|
+
), requestHandler = createNamedMock(
|
|
113
|
+
"requestHandler",
|
|
114
|
+
(handler) => async (request, requestOpts) => withRequestState(request, async () => toResponse(await handler(request, requestOpts)))
|
|
115
|
+
), createRequestHandler = createNamedMock(
|
|
116
|
+
"createRequestHandler",
|
|
117
|
+
(handler) => requestHandler(handler)
|
|
118
|
+
), createStartHandler = createNamedMock(
|
|
119
|
+
"createStartHandler",
|
|
120
|
+
(cbOrOptions) => {
|
|
121
|
+
let handler = typeof cbOrOptions == "function" ? cbOrOptions : cbOrOptions?.handler;
|
|
122
|
+
return requestHandler(async (request, requestOpts) => handler ? handler({
|
|
123
|
+
request,
|
|
124
|
+
responseHeaders: getState().responseHeaders,
|
|
125
|
+
router: browserGlobals.__TSR_ROUTER__,
|
|
126
|
+
context: requestOpts?.context,
|
|
127
|
+
requestContext: requestOpts?.context
|
|
128
|
+
}) : new Response("Storybook Mock", { status: 200 }));
|
|
129
|
+
}
|
|
130
|
+
), attachRouterServerSsrUtils = createNamedMock(
|
|
131
|
+
"attachRouterServerSsrUtils",
|
|
132
|
+
(router) => router
|
|
133
|
+
), transformReadableStreamWithRouter = createNamedMock(
|
|
134
|
+
"transformReadableStreamWithRouter",
|
|
135
|
+
(stream) => stream
|
|
136
|
+
), transformPipeableStreamWithRouter = createNamedMock(
|
|
137
|
+
"transformPipeableStreamWithRouter",
|
|
138
|
+
(stream) => stream
|
|
139
|
+
), getRequest = createNamedMock("getRequest", () => getState().request), getRequestHeaders = createNamedMock(
|
|
140
|
+
"getRequestHeaders",
|
|
141
|
+
() => getState().request.headers
|
|
142
|
+
), getRequestHeader = createNamedMock("getRequestHeader", (name) => getState().request.headers.get(name) ?? void 0), getRequestIP = createNamedMock(
|
|
143
|
+
"getRequestIP",
|
|
144
|
+
(opts) => {
|
|
145
|
+
if (opts?.xForwardedFor)
|
|
146
|
+
return getRequestHeader("x-forwarded-for")?.split(",")[0]?.trim();
|
|
147
|
+
}
|
|
148
|
+
), getRequestHost = createNamedMock(
|
|
149
|
+
"getRequestHost",
|
|
150
|
+
(opts) => (opts?.xForwardedHost ? getRequestHeader("x-forwarded-host") : getRequestHeader("host")) ?? new URL(getState().request.url).host ?? "localhost"
|
|
151
|
+
), getRequestUrl = createNamedMock(
|
|
152
|
+
"getRequestUrl",
|
|
153
|
+
(opts) => {
|
|
154
|
+
let url = new URL(getState().request.url), forwardedHost = opts?.xForwardedHost ? getRequestHeader("x-forwarded-host") : void 0, forwardedProto = opts?.xForwardedProto === !1 ? void 0 : getRequestHeader("x-forwarded-proto");
|
|
155
|
+
return forwardedHost && (url.host = forwardedHost), forwardedProto && (url.protocol = `${forwardedProto}:`), url;
|
|
156
|
+
}
|
|
157
|
+
), getRequestProtocol = createNamedMock(
|
|
158
|
+
"getRequestProtocol",
|
|
159
|
+
(opts) => {
|
|
160
|
+
let forwardedProto = opts?.xForwardedProto === !1 ? void 0 : getRequestHeader("x-forwarded-proto");
|
|
161
|
+
return forwardedProto || getRequestUrl().protocol.replace(/:$/, "") || "http";
|
|
162
|
+
}
|
|
163
|
+
), setResponseHeaders = createNamedMock("setResponseHeaders", (headers) => {
|
|
164
|
+
getState().responseHeaders = new Headers(headers);
|
|
165
|
+
}), getResponseHeaders = createNamedMock(
|
|
166
|
+
"getResponseHeaders",
|
|
167
|
+
() => getState().responseHeaders
|
|
168
|
+
), getResponseHeader = createNamedMock("getResponseHeader", (name) => getState().responseHeaders.get(name) ?? void 0), setResponseHeader = createNamedMock(
|
|
169
|
+
"setResponseHeader",
|
|
170
|
+
(name, value) => {
|
|
171
|
+
let headers = getState().responseHeaders;
|
|
172
|
+
if (headers.delete(name), Array.isArray(value)) {
|
|
173
|
+
value.forEach((entry) => headers.append(name, entry));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
headers.set(name, value);
|
|
177
|
+
}
|
|
178
|
+
), removeResponseHeader = createNamedMock("removeResponseHeader", (name) => {
|
|
179
|
+
getState().responseHeaders.delete(name);
|
|
180
|
+
}), clearResponseHeaders = createNamedMock(
|
|
181
|
+
"clearResponseHeaders",
|
|
182
|
+
(headerNames) => {
|
|
183
|
+
if (!headerNames?.length) {
|
|
184
|
+
getState().responseHeaders = new Headers();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
headerNames.forEach((name) => getState().responseHeaders.delete(name));
|
|
188
|
+
}
|
|
189
|
+
), getResponseStatus = createNamedMock("getResponseStatus", () => getState().responseStatus?.code ?? 200), setResponseStatus = createNamedMock(
|
|
190
|
+
"setResponseStatus",
|
|
191
|
+
(code, text) => {
|
|
192
|
+
getState().responseStatus = {
|
|
193
|
+
code,
|
|
194
|
+
text
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
), getCookies = createNamedMock("getCookies", () => Object.fromEntries(getState().cookies)), getCookie = createNamedMock("getCookie", (name) => getState().cookies.get(name)), setCookie = createNamedMock(
|
|
198
|
+
"setCookie",
|
|
199
|
+
(name, value, options) => {
|
|
200
|
+
let state = getState();
|
|
201
|
+
state.cookies.set(name, value), state.responseHeaders.append("set-cookie", serializeCookie(name, value, options));
|
|
202
|
+
}
|
|
203
|
+
), deleteCookie = createNamedMock(
|
|
204
|
+
"deleteCookie",
|
|
205
|
+
(name, options) => {
|
|
206
|
+
let state = getState();
|
|
207
|
+
state.cookies.delete(name), state.responseHeaders.append(
|
|
208
|
+
"set-cookie",
|
|
209
|
+
serializeCookie(name, "", {
|
|
210
|
+
...options,
|
|
211
|
+
maxAge: 0
|
|
212
|
+
})
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
), useSession = createNamedMock(
|
|
216
|
+
"useSession",
|
|
217
|
+
async (_config) => getSessionRecord()
|
|
218
|
+
), getSession = createNamedMock(
|
|
219
|
+
"getSession",
|
|
220
|
+
async (_config) => getSessionRecord()
|
|
221
|
+
), updateSession = createNamedMock(
|
|
222
|
+
"updateSession",
|
|
223
|
+
async (_config, update) => getSessionRecord().update(update)
|
|
224
|
+
), sealSession = createNamedMock("sealSession", async (_config) => JSON.stringify(getState().sessionData)), unsealSession = createNamedMock(
|
|
225
|
+
"unsealSession",
|
|
226
|
+
async (_config, sealed) => {
|
|
227
|
+
try {
|
|
228
|
+
return JSON.parse(sealed);
|
|
229
|
+
} catch {
|
|
230
|
+
return {};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
), clearSession = createNamedMock(
|
|
234
|
+
"clearSession",
|
|
235
|
+
async (_config) => {
|
|
236
|
+
getState().sessionData = {};
|
|
237
|
+
}
|
|
238
|
+
), getResponse = createNamedMock("getResponse", () => ({
|
|
239
|
+
status: getState().responseStatus?.code,
|
|
240
|
+
statusText: getState().responseStatus?.text,
|
|
241
|
+
get headers() {
|
|
242
|
+
return getState().responseHeaders;
|
|
243
|
+
}
|
|
244
|
+
})), getValidatedQuery = createNamedMock(
|
|
245
|
+
"getValidatedQuery",
|
|
246
|
+
async (schema) => {
|
|
247
|
+
let query = Object.fromEntries(getRequestUrl().searchParams.entries());
|
|
248
|
+
if (typeof schema?.parse == "function")
|
|
249
|
+
return schema.parse(query);
|
|
250
|
+
if (typeof schema?.safeParse == "function") {
|
|
251
|
+
let result = await schema.safeParse(query);
|
|
252
|
+
return result && typeof result == "object" && "data" in result ? result.data : result;
|
|
253
|
+
}
|
|
254
|
+
return typeof schema?.["~standard"]?.validate == "function" ? schema["~standard"].validate(query) : query;
|
|
255
|
+
}
|
|
256
|
+
);
|
|
11
257
|
function useServerFn(serverFn) {
|
|
12
258
|
return React.useCallback(
|
|
13
259
|
(...args) => serverFn(...args),
|
|
@@ -32,25 +278,57 @@ var createServerFn = (options) => {
|
|
|
32
278
|
onNavigate({ to });
|
|
33
279
|
}, [to]), null), notFound = () => {
|
|
34
280
|
throw new Error("Not found");
|
|
35
|
-
}, createStart = () => ({}),
|
|
36
|
-
|
|
37
|
-
}, getCookie = (name) => cookieStore.get(name), deleteCookie = (name) => {
|
|
38
|
-
cookieStore.delete(name);
|
|
39
|
-
}, clearCookieStore = () => {
|
|
40
|
-
cookieStore.clear();
|
|
281
|
+
}, createStart = () => ({}), clientCookieStore = /* @__PURE__ */ new Map(), clearCookieStore = () => {
|
|
282
|
+
clientCookieStore.clear();
|
|
41
283
|
}, fetchHandler = async () => new Response("Storybook Mock", { status: 200 });
|
|
42
284
|
var start_default = { fetch: fetchHandler };
|
|
43
285
|
export {
|
|
286
|
+
HEADERS,
|
|
44
287
|
Link,
|
|
45
288
|
Navigate,
|
|
289
|
+
StartServer,
|
|
290
|
+
VIRTUAL_MODULES,
|
|
291
|
+
attachRouterServerSsrUtils,
|
|
46
292
|
clearCookieStore,
|
|
293
|
+
clearResponseHeaders,
|
|
294
|
+
clearSession,
|
|
295
|
+
createRequestHandler,
|
|
47
296
|
createServerFn,
|
|
48
297
|
createStart,
|
|
298
|
+
createStartHandler,
|
|
49
299
|
start_default as default,
|
|
300
|
+
defaultRenderHandler,
|
|
301
|
+
defaultStreamHandler,
|
|
302
|
+
defineHandlerCallback,
|
|
50
303
|
deleteCookie,
|
|
51
304
|
fetchHandler as fetch,
|
|
52
305
|
getCookie,
|
|
306
|
+
getCookies,
|
|
307
|
+
getRequest,
|
|
308
|
+
getRequestHeader,
|
|
309
|
+
getRequestHeaders,
|
|
310
|
+
getRequestHost,
|
|
311
|
+
getRequestIP,
|
|
312
|
+
getRequestProtocol,
|
|
313
|
+
getRequestUrl,
|
|
314
|
+
getResponse,
|
|
315
|
+
getResponseHeader,
|
|
316
|
+
getResponseHeaders,
|
|
317
|
+
getResponseStatus,
|
|
318
|
+
getSession,
|
|
319
|
+
getValidatedQuery,
|
|
53
320
|
notFound,
|
|
321
|
+
removeResponseHeader,
|
|
322
|
+
requestHandler,
|
|
323
|
+
sealSession,
|
|
54
324
|
setCookie,
|
|
55
|
-
|
|
325
|
+
setResponseHeader,
|
|
326
|
+
setResponseHeaders,
|
|
327
|
+
setResponseStatus,
|
|
328
|
+
transformPipeableStreamWithRouter,
|
|
329
|
+
transformReadableStreamWithRouter,
|
|
330
|
+
unsealSession,
|
|
331
|
+
updateSession,
|
|
332
|
+
useServerFn,
|
|
333
|
+
useSession
|
|
56
334
|
};
|
package/dist/index.js
CHANGED
package/dist/node/index.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import CJS_COMPAT_NODE_URL_fmhd7e5wemi from 'node:url';
|
|
2
|
+
import CJS_COMPAT_NODE_PATH_fmhd7e5wemi from 'node:path';
|
|
3
|
+
import CJS_COMPAT_NODE_MODULE_fmhd7e5wemi from "node:module";
|
|
4
4
|
|
|
5
|
-
var __filename =
|
|
6
|
-
var __dirname =
|
|
7
|
-
var require =
|
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_fmhd7e5wemi.fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_fmhd7e5wemi.dirname(__filename);
|
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_fmhd7e5wemi.createRequire(import.meta.url);
|
|
8
8
|
|
|
9
9
|
// ------------------------------------------------------------
|
|
10
10
|
// end of CJS compatibility banner, injected by Storybook's esbuild configuration
|
|
11
11
|
// ------------------------------------------------------------
|
|
12
|
-
import "../_node-chunks/chunk-CUC3UGKZ.js";
|
|
13
12
|
|
|
14
13
|
// src/node/index.ts
|
|
15
14
|
function defineMain(config) {
|