gitxp 0.0.1
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/.output/nitro.json +17 -0
- package/.output/public/assets/index-BGHvBNtP.js +11 -0
- package/.output/public/assets/routes-DuE8S6pX.js +60 -0
- package/.output/public/assets/styles-D5xbQNYu.css +1 -0
- package/.output/server/_chunks/ssr-renderer.mjs +26 -0
- package/.output/server/_libs/@floating-ui/core+[...].mjs +671 -0
- package/.output/server/_libs/@floating-ui/dom+[...].mjs +649 -0
- package/.output/server/_libs/@floating-ui/react-dom+[...].mjs +856 -0
- package/.output/server/_libs/@radix-ui/react-arrow+[...].mjs +258 -0
- package/.output/server/_libs/@radix-ui/react-dialog+[...].mjs +1862 -0
- package/.output/server/_libs/@radix-ui/react-popper+[...].mjs +320 -0
- package/.output/server/_libs/@radix-ui/react-tooltip+[...].mjs +534 -0
- package/.output/server/_libs/@tanstack/db+[...].mjs +14680 -0
- package/.output/server/_libs/@tanstack/react-router+[...].mjs +14563 -0
- package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +126 -0
- package/.output/server/_libs/@tanstack/router-core+[...].mjs +3636 -0
- package/.output/server/_libs/class-variance-authority+clsx.mjs +69 -0
- package/.output/server/_libs/cmdk.mjs +504 -0
- package/.output/server/_libs/h3+rou3+srvx.mjs +1361 -0
- package/.output/server/_libs/h3-v2.mjs +285 -0
- package/.output/server/_libs/lucide-react.mjs +158 -0
- package/.output/server/_libs/radix-ui__primitive.mjs +44 -0
- package/.output/server/_libs/radix-ui__react-context.mjs +108 -0
- package/.output/server/_libs/tailwind-merge.mjs +3380 -0
- package/.output/server/_libs/tanstack__history.mjs +384 -0
- package/.output/server/_libs/tanstack__query-core.mjs +2225 -0
- package/.output/server/_libs/tanstack__react-db.mjs +242 -0
- package/.output/server/_libs/tanstack__react-query.mjs +140 -0
- package/.output/server/_libs/ufo.mjs +64 -0
- package/.output/server/_runtime.mjs +35 -0
- package/.output/server/_ssr/empty-plugin-adapters-D9UWiqvJ.mjs +5 -0
- package/.output/server/_ssr/events-BNrmOvgU.mjs +13 -0
- package/.output/server/_ssr/notifications-DUoENv6E.mjs +514 -0
- package/.output/server/_ssr/router-DsUHD4bT.mjs +179 -0
- package/.output/server/_ssr/routes-DIFfr242.mjs +982 -0
- package/.output/server/_ssr/ssr.mjs +1854 -0
- package/.output/server/_ssr/start-5Z2QO8AU.mjs +4 -0
- package/.output/server/_tanstack-start-manifest_v-CrD0YpZr.mjs +20 -0
- package/.output/server/index.mjs +310 -0
- package/.output/server/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/tslib/tslib.js +484 -0
- package/.output/server/package.json +9 -0
- package/LICENSE +21 -0
- package/README.md +325 -0
- package/bin/gitxp.js +85 -0
- package/package.json +92 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
//#region node_modules/@tanstack/history/dist/esm/index.js
|
|
2
|
+
var stateIndexKey = "__TSR_index";
|
|
3
|
+
var popStateEvent = "popstate";
|
|
4
|
+
var beforeUnloadEvent = "beforeunload";
|
|
5
|
+
function createHistory(opts) {
|
|
6
|
+
let location = opts.getLocation();
|
|
7
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
8
|
+
const notify = (action) => {
|
|
9
|
+
location = opts.getLocation();
|
|
10
|
+
subscribers.forEach((subscriber) => subscriber({
|
|
11
|
+
location,
|
|
12
|
+
action
|
|
13
|
+
}));
|
|
14
|
+
};
|
|
15
|
+
const handleIndexChange = (action) => {
|
|
16
|
+
if (opts.notifyOnIndexChange ?? true) notify(action);
|
|
17
|
+
else location = opts.getLocation();
|
|
18
|
+
};
|
|
19
|
+
const tryNavigation = async ({ task, navigateOpts, ...actionInfo }) => {
|
|
20
|
+
if (navigateOpts?.ignoreBlocker ?? false) {
|
|
21
|
+
task();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const blockers = opts.getBlockers?.() ?? [];
|
|
25
|
+
const isPushOrReplace = actionInfo.type === "PUSH" || actionInfo.type === "REPLACE";
|
|
26
|
+
if (typeof document !== "undefined" && blockers.length && isPushOrReplace) for (const blocker of blockers) {
|
|
27
|
+
const nextLocation = parseHref(actionInfo.path, actionInfo.state);
|
|
28
|
+
if (await blocker.blockerFn({
|
|
29
|
+
currentLocation: location,
|
|
30
|
+
nextLocation,
|
|
31
|
+
action: actionInfo.type
|
|
32
|
+
})) {
|
|
33
|
+
opts.onBlocked?.();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
task();
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
get location() {
|
|
41
|
+
return location;
|
|
42
|
+
},
|
|
43
|
+
get length() {
|
|
44
|
+
return opts.getLength();
|
|
45
|
+
},
|
|
46
|
+
subscribers,
|
|
47
|
+
subscribe: (cb) => {
|
|
48
|
+
subscribers.add(cb);
|
|
49
|
+
return () => {
|
|
50
|
+
subscribers.delete(cb);
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
push: (path, state, navigateOpts) => {
|
|
54
|
+
const currentIndex = location.state[stateIndexKey];
|
|
55
|
+
state = assignKeyAndIndex(currentIndex + 1, state);
|
|
56
|
+
tryNavigation({
|
|
57
|
+
task: () => {
|
|
58
|
+
opts.pushState(path, state);
|
|
59
|
+
notify({ type: "PUSH" });
|
|
60
|
+
},
|
|
61
|
+
navigateOpts,
|
|
62
|
+
type: "PUSH",
|
|
63
|
+
path,
|
|
64
|
+
state
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
replace: (path, state, navigateOpts) => {
|
|
68
|
+
const currentIndex = location.state[stateIndexKey];
|
|
69
|
+
state = assignKeyAndIndex(currentIndex, state);
|
|
70
|
+
tryNavigation({
|
|
71
|
+
task: () => {
|
|
72
|
+
opts.replaceState(path, state);
|
|
73
|
+
notify({ type: "REPLACE" });
|
|
74
|
+
},
|
|
75
|
+
navigateOpts,
|
|
76
|
+
type: "REPLACE",
|
|
77
|
+
path,
|
|
78
|
+
state
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
go: (index, navigateOpts) => {
|
|
82
|
+
tryNavigation({
|
|
83
|
+
task: () => {
|
|
84
|
+
opts.go(index);
|
|
85
|
+
handleIndexChange({
|
|
86
|
+
type: "GO",
|
|
87
|
+
index
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
navigateOpts,
|
|
91
|
+
type: "GO"
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
back: (navigateOpts) => {
|
|
95
|
+
tryNavigation({
|
|
96
|
+
task: () => {
|
|
97
|
+
opts.back(navigateOpts?.ignoreBlocker ?? false);
|
|
98
|
+
handleIndexChange({ type: "BACK" });
|
|
99
|
+
},
|
|
100
|
+
navigateOpts,
|
|
101
|
+
type: "BACK"
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
forward: (navigateOpts) => {
|
|
105
|
+
tryNavigation({
|
|
106
|
+
task: () => {
|
|
107
|
+
opts.forward(navigateOpts?.ignoreBlocker ?? false);
|
|
108
|
+
handleIndexChange({ type: "FORWARD" });
|
|
109
|
+
},
|
|
110
|
+
navigateOpts,
|
|
111
|
+
type: "FORWARD"
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
canGoBack: () => location.state[stateIndexKey] !== 0,
|
|
115
|
+
createHref: (str) => opts.createHref(str),
|
|
116
|
+
block: (blocker) => {
|
|
117
|
+
if (!opts.setBlockers) return () => {};
|
|
118
|
+
const blockers = opts.getBlockers?.() ?? [];
|
|
119
|
+
opts.setBlockers([...blockers, blocker]);
|
|
120
|
+
return () => {
|
|
121
|
+
const blockers = opts.getBlockers?.() ?? [];
|
|
122
|
+
opts.setBlockers?.(blockers.filter((b) => b !== blocker));
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
flush: () => opts.flush?.(),
|
|
126
|
+
destroy: () => opts.destroy?.(),
|
|
127
|
+
notify
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function assignKeyAndIndex(index, state) {
|
|
131
|
+
if (!state) state = {};
|
|
132
|
+
const key = createRandomKey();
|
|
133
|
+
return {
|
|
134
|
+
...state,
|
|
135
|
+
key,
|
|
136
|
+
__TSR_key: key,
|
|
137
|
+
[stateIndexKey]: index
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Creates a history object that can be used to interact with the browser's
|
|
142
|
+
* navigation. This is a lightweight API wrapping the browser's native methods.
|
|
143
|
+
* It is designed to work with TanStack Router, but could be used as a standalone API as well.
|
|
144
|
+
* IMPORTANT: This API implements history throttling via a microtask to prevent
|
|
145
|
+
* excessive calls to the history API. In some browsers, calling history.pushState or
|
|
146
|
+
* history.replaceState in quick succession can cause the browser to ignore subsequent
|
|
147
|
+
* calls. This API smooths out those differences and ensures that your application
|
|
148
|
+
* state will *eventually* match the browser state. In most cases, this is not a problem,
|
|
149
|
+
* but if you need to ensure that the browser state is up to date, you can use the
|
|
150
|
+
* `history.flush` method to immediately flush all pending state changes to the browser URL.
|
|
151
|
+
* @param opts
|
|
152
|
+
* @param opts.getHref A function that returns the current href (path + search + hash)
|
|
153
|
+
* @param opts.createHref A function that takes a path and returns a href (path + search + hash)
|
|
154
|
+
* @returns A history instance
|
|
155
|
+
*/
|
|
156
|
+
function createBrowserHistory(opts) {
|
|
157
|
+
const win = opts?.window ?? (typeof document !== "undefined" ? window : void 0);
|
|
158
|
+
const originalPushState = win.history.pushState;
|
|
159
|
+
const originalReplaceState = win.history.replaceState;
|
|
160
|
+
let blockers = [];
|
|
161
|
+
const _getBlockers = () => blockers;
|
|
162
|
+
const _setBlockers = (newBlockers) => blockers = newBlockers;
|
|
163
|
+
const createHref = opts?.createHref ?? ((path) => path);
|
|
164
|
+
const parseLocation = opts?.parseLocation ?? (() => parseHref(`${win.location.pathname}${win.location.search}${win.location.hash}`, win.history.state));
|
|
165
|
+
if (!win.history.state?.__TSR_key && !win.history.state?.key) {
|
|
166
|
+
const addedKey = createRandomKey();
|
|
167
|
+
win.history.replaceState({
|
|
168
|
+
[stateIndexKey]: 0,
|
|
169
|
+
key: addedKey,
|
|
170
|
+
__TSR_key: addedKey
|
|
171
|
+
}, "");
|
|
172
|
+
}
|
|
173
|
+
let currentLocation = parseLocation();
|
|
174
|
+
let rollbackLocation;
|
|
175
|
+
let nextPopIsGo = false;
|
|
176
|
+
let ignoreNextPop = false;
|
|
177
|
+
let skipBlockerNextPop = false;
|
|
178
|
+
let ignoreNextBeforeUnload = false;
|
|
179
|
+
const getLocation = () => currentLocation;
|
|
180
|
+
let next;
|
|
181
|
+
const flush = () => {
|
|
182
|
+
if (!next) return;
|
|
183
|
+
history._ignoreSubscribers = true;
|
|
184
|
+
(next[2] ? win.history.pushState : win.history.replaceState)(next[1], "", next[0]);
|
|
185
|
+
history._ignoreSubscribers = false;
|
|
186
|
+
next = void 0;
|
|
187
|
+
rollbackLocation = void 0;
|
|
188
|
+
};
|
|
189
|
+
const queueHistoryAction = (isPush, destHref, state) => {
|
|
190
|
+
const href = createHref(destHref);
|
|
191
|
+
const hasPendingAction = !!next;
|
|
192
|
+
if (!hasPendingAction) rollbackLocation = currentLocation;
|
|
193
|
+
currentLocation = parseHref(destHref, state);
|
|
194
|
+
next = [
|
|
195
|
+
href,
|
|
196
|
+
state,
|
|
197
|
+
next?.[2] || isPush
|
|
198
|
+
];
|
|
199
|
+
if (!hasPendingAction) queueMicrotask(() => flush());
|
|
200
|
+
};
|
|
201
|
+
const onPushPop = (type) => {
|
|
202
|
+
currentLocation = parseLocation();
|
|
203
|
+
history.notify({ type });
|
|
204
|
+
};
|
|
205
|
+
const onPushPopEvent = async () => {
|
|
206
|
+
if (ignoreNextPop) {
|
|
207
|
+
ignoreNextPop = false;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const nextLocation = parseLocation();
|
|
211
|
+
const delta = nextLocation.state[stateIndexKey] - currentLocation.state[stateIndexKey];
|
|
212
|
+
const isForward = delta === 1;
|
|
213
|
+
const isBack = delta === -1;
|
|
214
|
+
const isGo = !isForward && !isBack || nextPopIsGo;
|
|
215
|
+
nextPopIsGo = false;
|
|
216
|
+
const action = isGo ? "GO" : isBack ? "BACK" : "FORWARD";
|
|
217
|
+
const notify = isGo ? {
|
|
218
|
+
type: "GO",
|
|
219
|
+
index: delta
|
|
220
|
+
} : { type: isBack ? "BACK" : "FORWARD" };
|
|
221
|
+
if (skipBlockerNextPop) skipBlockerNextPop = false;
|
|
222
|
+
else {
|
|
223
|
+
const blockers = _getBlockers();
|
|
224
|
+
if (typeof document !== "undefined" && blockers.length) {
|
|
225
|
+
for (const blocker of blockers) if (await blocker.blockerFn({
|
|
226
|
+
currentLocation,
|
|
227
|
+
nextLocation,
|
|
228
|
+
action
|
|
229
|
+
})) {
|
|
230
|
+
ignoreNextPop = true;
|
|
231
|
+
win.history.go(1);
|
|
232
|
+
history.notify(notify);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
currentLocation = parseLocation();
|
|
238
|
+
history.notify(notify);
|
|
239
|
+
};
|
|
240
|
+
const onBeforeUnload = (e) => {
|
|
241
|
+
if (ignoreNextBeforeUnload) {
|
|
242
|
+
ignoreNextBeforeUnload = false;
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
let shouldBlock = false;
|
|
246
|
+
const blockers = _getBlockers();
|
|
247
|
+
if (typeof document !== "undefined" && blockers.length) for (const blocker of blockers) {
|
|
248
|
+
const shouldHaveBeforeUnload = blocker.enableBeforeUnload ?? true;
|
|
249
|
+
if (shouldHaveBeforeUnload === true) {
|
|
250
|
+
shouldBlock = true;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
if (typeof shouldHaveBeforeUnload === "function" && shouldHaveBeforeUnload() === true) {
|
|
254
|
+
shouldBlock = true;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (shouldBlock) {
|
|
259
|
+
e.preventDefault();
|
|
260
|
+
return e.returnValue = "";
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
const history = createHistory({
|
|
264
|
+
getLocation,
|
|
265
|
+
getLength: () => win.history.length,
|
|
266
|
+
pushState: (href, state) => queueHistoryAction(true, href, state),
|
|
267
|
+
replaceState: (href, state) => queueHistoryAction(false, href, state),
|
|
268
|
+
back: (ignoreBlocker) => {
|
|
269
|
+
if (ignoreBlocker) skipBlockerNextPop = true;
|
|
270
|
+
ignoreNextBeforeUnload = true;
|
|
271
|
+
return win.history.back();
|
|
272
|
+
},
|
|
273
|
+
forward: (ignoreBlocker) => {
|
|
274
|
+
if (ignoreBlocker) skipBlockerNextPop = true;
|
|
275
|
+
ignoreNextBeforeUnload = true;
|
|
276
|
+
win.history.forward();
|
|
277
|
+
},
|
|
278
|
+
go: (n) => {
|
|
279
|
+
nextPopIsGo = true;
|
|
280
|
+
win.history.go(n);
|
|
281
|
+
},
|
|
282
|
+
createHref: (href) => createHref(href),
|
|
283
|
+
flush,
|
|
284
|
+
destroy: () => {
|
|
285
|
+
win.history.pushState = originalPushState;
|
|
286
|
+
win.history.replaceState = originalReplaceState;
|
|
287
|
+
win.removeEventListener(beforeUnloadEvent, onBeforeUnload, { capture: true });
|
|
288
|
+
win.removeEventListener(popStateEvent, onPushPopEvent);
|
|
289
|
+
},
|
|
290
|
+
onBlocked: () => {
|
|
291
|
+
if (rollbackLocation && currentLocation !== rollbackLocation) currentLocation = rollbackLocation;
|
|
292
|
+
},
|
|
293
|
+
getBlockers: _getBlockers,
|
|
294
|
+
setBlockers: _setBlockers,
|
|
295
|
+
notifyOnIndexChange: false
|
|
296
|
+
});
|
|
297
|
+
win.addEventListener(beforeUnloadEvent, onBeforeUnload, { capture: true });
|
|
298
|
+
win.addEventListener(popStateEvent, onPushPopEvent);
|
|
299
|
+
win.history.pushState = function(...args) {
|
|
300
|
+
const res = originalPushState.apply(win.history, args);
|
|
301
|
+
if (!history._ignoreSubscribers) onPushPop("PUSH");
|
|
302
|
+
return res;
|
|
303
|
+
};
|
|
304
|
+
win.history.replaceState = function(...args) {
|
|
305
|
+
const res = originalReplaceState.apply(win.history, args);
|
|
306
|
+
if (!history._ignoreSubscribers) onPushPop("REPLACE");
|
|
307
|
+
return res;
|
|
308
|
+
};
|
|
309
|
+
return history;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Create an in-memory history implementation.
|
|
313
|
+
* Ideal for server rendering, tests, and non-DOM environments.
|
|
314
|
+
* @link https://tanstack.com/router/latest/docs/framework/react/guide/history-types
|
|
315
|
+
*/
|
|
316
|
+
function createMemoryHistory(opts = { initialEntries: ["/"] }) {
|
|
317
|
+
const entries = opts.initialEntries;
|
|
318
|
+
let index = opts.initialIndex ? Math.min(Math.max(opts.initialIndex, 0), entries.length - 1) : entries.length - 1;
|
|
319
|
+
const states = entries.map((_entry, index) => assignKeyAndIndex(index, void 0));
|
|
320
|
+
const getLocation = () => parseHref(entries[index], states[index]);
|
|
321
|
+
let blockers = [];
|
|
322
|
+
const _getBlockers = () => blockers;
|
|
323
|
+
const _setBlockers = (newBlockers) => blockers = newBlockers;
|
|
324
|
+
return createHistory({
|
|
325
|
+
getLocation,
|
|
326
|
+
getLength: () => entries.length,
|
|
327
|
+
pushState: (path, state) => {
|
|
328
|
+
if (index < entries.length - 1) {
|
|
329
|
+
entries.splice(index + 1);
|
|
330
|
+
states.splice(index + 1);
|
|
331
|
+
}
|
|
332
|
+
states.push(state);
|
|
333
|
+
entries.push(path);
|
|
334
|
+
index = Math.max(entries.length - 1, 0);
|
|
335
|
+
},
|
|
336
|
+
replaceState: (path, state) => {
|
|
337
|
+
states[index] = state;
|
|
338
|
+
entries[index] = path;
|
|
339
|
+
},
|
|
340
|
+
back: () => {
|
|
341
|
+
index = Math.max(index - 1, 0);
|
|
342
|
+
},
|
|
343
|
+
forward: () => {
|
|
344
|
+
index = Math.min(index + 1, entries.length - 1);
|
|
345
|
+
},
|
|
346
|
+
go: (n) => {
|
|
347
|
+
index = Math.min(Math.max(index + n, 0), entries.length - 1);
|
|
348
|
+
},
|
|
349
|
+
createHref: (path) => path,
|
|
350
|
+
getBlockers: _getBlockers,
|
|
351
|
+
setBlockers: _setBlockers
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Sanitize a path to prevent open redirect vulnerabilities.
|
|
356
|
+
* Removes control characters and collapses leading double slashes.
|
|
357
|
+
*/
|
|
358
|
+
function sanitizePath(path) {
|
|
359
|
+
let sanitized = path.replace(/[\x00-\x1f\x7f]/g, "");
|
|
360
|
+
if (sanitized.startsWith("//")) sanitized = "/" + sanitized.replace(/^\/+/, "");
|
|
361
|
+
return sanitized;
|
|
362
|
+
}
|
|
363
|
+
function parseHref(href, state) {
|
|
364
|
+
const sanitizedHref = sanitizePath(href);
|
|
365
|
+
const hashIndex = sanitizedHref.indexOf("#");
|
|
366
|
+
const searchIndex = sanitizedHref.indexOf("?");
|
|
367
|
+
const addedKey = createRandomKey();
|
|
368
|
+
return {
|
|
369
|
+
href: sanitizedHref,
|
|
370
|
+
pathname: sanitizedHref.substring(0, hashIndex > 0 ? searchIndex > 0 ? Math.min(hashIndex, searchIndex) : hashIndex : searchIndex > 0 ? searchIndex : sanitizedHref.length),
|
|
371
|
+
hash: hashIndex > -1 ? sanitizedHref.substring(hashIndex) : "",
|
|
372
|
+
search: searchIndex > -1 ? sanitizedHref.slice(searchIndex, hashIndex === -1 ? void 0 : hashIndex) : "",
|
|
373
|
+
state: state || {
|
|
374
|
+
[stateIndexKey]: 0,
|
|
375
|
+
key: addedKey,
|
|
376
|
+
__TSR_key: addedKey
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
function createRandomKey() {
|
|
381
|
+
return (Math.random() + 1).toString(36).substring(7);
|
|
382
|
+
}
|
|
383
|
+
//#endregion
|
|
384
|
+
export { createMemoryHistory as n, parseHref as r, createBrowserHistory as t };
|