@squadbase/vantage 0.6.2-dev1.31accb1 → 0.6.2-dev1.42c4e48
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/add-4GHF2TX2.js +6 -0
- package/dist/add-4GHF2TX2.js.map +1 -0
- package/dist/{build-TVKFIVFQ.js → build-MFWRPYKW.js} +7 -7
- package/dist/{build-TVKFIVFQ.js.map → build-MFWRPYKW.js.map} +1 -1
- package/dist/{check-3KHZXZMQ.js → check-ZBIH422T.js} +5 -5
- package/dist/{check-3KHZXZMQ.js.map → check-ZBIH422T.js.map} +1 -1
- package/dist/{chunk-P7W4LR3Z.js → chunk-7DZGJQ3P.js} +3 -3
- package/dist/{chunk-P7W4LR3Z.js.map → chunk-7DZGJQ3P.js.map} +1 -1
- package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
- package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
- package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
- package/dist/chunk-GNXCX4WE.js.map +1 -0
- package/dist/chunk-IBGOCWJB.js +1716 -0
- package/dist/chunk-IBGOCWJB.js.map +1 -0
- package/dist/{chunk-LMUACBMA.js → chunk-QEWCYW3I.js} +43 -8
- package/dist/chunk-QEWCYW3I.js.map +1 -0
- package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
- package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
- package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
- package/dist/chunk-V3LF7BE7.js.map +1 -0
- package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
- package/dist/chunk-XQUSGIDG.js.map +1 -0
- package/dist/cli.js +12 -11
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +32 -3
- package/dist/client/index.js +205 -12
- package/dist/client/index.js.map +1 -1
- package/dist/{dev-GDKATCC7.js → dev-DCTOHQ6W.js} +8 -8
- package/dist/dev-DCTOHQ6W.js.map +1 -0
- package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
- package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
- package/dist/{doctor-WQXPXP6K.js → doctor-5E2VEZPK.js} +5 -5
- package/dist/{doctor-WQXPXP6K.js.map → doctor-5E2VEZPK.js.map} +1 -1
- package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
- package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
- package/dist/query/index.d.ts +0 -11
- package/dist/query/index.js +2 -2
- package/dist/{routes-MWBWWOJ2.js → routes-3SGAFDMC.js} +4 -4
- package/dist/{routes-MWBWWOJ2.js.map → routes-3SGAFDMC.js.map} +1 -1
- package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
- package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
- package/dist/table/index.js +2 -2
- package/dist/{upgrade-HCANX4GQ.js → upgrade-DBBE6GIR.js} +6 -6
- package/dist/{upgrade-HCANX4GQ.js.map → upgrade-DBBE6GIR.js.map} +1 -1
- package/dist/vite/index.d.ts +10 -0
- package/dist/vite/index.js +3 -3
- package/docs/ja/changelog.md +5 -0
- package/package.json +8 -2
- package/theme.css +11 -0
- package/dist/add-DY4AXANK.js +0 -6
- package/dist/add-DY4AXANK.js.map +0 -1
- package/dist/chunk-DTDVSFRY.js.map +0 -1
- package/dist/chunk-LMUACBMA.js.map +0 -1
- package/dist/chunk-PVTHHV7X.js.map +0 -1
- package/dist/chunk-QI3XQKHS.js.map +0 -1
- package/dist/chunk-VA776YE5.js +0 -316
- package/dist/chunk-VA776YE5.js.map +0 -1
- package/dist/dev-GDKATCC7.js.map +0 -1
package/dist/chunk-VA776YE5.js
DELETED
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import { generateArtifacts } from './chunk-LMUACBMA.js';
|
|
2
|
-
import { scanProject, resolvePageRoot } from './chunk-ZVANIULZ.js';
|
|
3
|
-
import { corsMiddleware, matchApiRoute, dispatchApi, sortApiRoutes } from './chunk-46QI6GFC.js';
|
|
4
|
-
import { VANTAGE_DIR, NON_ROUTE_DIRS, FILE_PAGE_EXTENSIONS, PAGE_EXTENSIONS } from './chunk-C2CX6GLX.js';
|
|
5
|
-
import fs from 'fs';
|
|
6
|
-
import path from 'path';
|
|
7
|
-
import react from '@vitejs/plugin-react';
|
|
8
|
-
import tailwindcss from '@tailwindcss/vite';
|
|
9
|
-
import { Hono } from 'hono';
|
|
10
|
-
import { getRequestListener } from '@hono/node-server';
|
|
11
|
-
|
|
12
|
-
// @squadbase/vantage — generated build. Do not edit.
|
|
13
|
-
function createApiDevMiddleware(opts) {
|
|
14
|
-
const { server, getModel, getEnv } = opts;
|
|
15
|
-
const buildRoutes = () => sortApiRoutes(
|
|
16
|
-
getModel().apis.map((a) => ({
|
|
17
|
-
routePath: a.routePath,
|
|
18
|
-
segments: a.segments,
|
|
19
|
-
hasCatchall: a.segments.some((s) => s.kind === "catchall"),
|
|
20
|
-
staticCount: a.segments.filter((s) => s.kind === "static").length,
|
|
21
|
-
load: () => server.ssrLoadModule(a.absFile)
|
|
22
|
-
}))
|
|
23
|
-
);
|
|
24
|
-
const app = new Hono();
|
|
25
|
-
const cors = corsMiddleware(getEnv());
|
|
26
|
-
if (cors) {
|
|
27
|
-
app.use("/api", cors);
|
|
28
|
-
app.use("/api/*", cors);
|
|
29
|
-
}
|
|
30
|
-
const handle = async (c) => {
|
|
31
|
-
const url = new URL(c.req.url);
|
|
32
|
-
const match = matchApiRoute(buildRoutes(), url.pathname);
|
|
33
|
-
if (!match) {
|
|
34
|
-
return Response.json({ error: "Not Found", path: url.pathname }, { status: 404 });
|
|
35
|
-
}
|
|
36
|
-
let mod;
|
|
37
|
-
try {
|
|
38
|
-
mod = await match.route.load();
|
|
39
|
-
} catch (err) {
|
|
40
|
-
if (err instanceof Error) server.ssrFixStacktrace(err);
|
|
41
|
-
throw err;
|
|
42
|
-
}
|
|
43
|
-
return dispatchApi(mod, c.req.raw, match.params, getEnv());
|
|
44
|
-
};
|
|
45
|
-
app.all("/api", handle);
|
|
46
|
-
app.all("/api/*", handle);
|
|
47
|
-
const listener = getRequestListener(app.fetch);
|
|
48
|
-
return (req, res, next) => {
|
|
49
|
-
const url = req.url ?? "/";
|
|
50
|
-
const path2 = url.split("?")[0];
|
|
51
|
-
if (path2 === "/api" || path2.startsWith("/api/")) {
|
|
52
|
-
Promise.resolve(listener(req, res)).catch((err) => {
|
|
53
|
-
console.error("[vantage] API middleware failure:", err);
|
|
54
|
-
if (!res.headersSent) {
|
|
55
|
-
res.statusCode = 500;
|
|
56
|
-
res.setHeader("content-type", "application/json");
|
|
57
|
-
res.end(JSON.stringify({ error: "Internal Server Error" }));
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
} else {
|
|
61
|
-
next();
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// src/vite/index.ts
|
|
67
|
-
var DEDUPE = ["react", "react-dom", "@tanstack/react-router", "@tanstack/react-query"];
|
|
68
|
-
var RUNTIME_DEPS = [
|
|
69
|
-
"react",
|
|
70
|
-
"react-dom",
|
|
71
|
-
"react-dom/client",
|
|
72
|
-
"react/jsx-runtime",
|
|
73
|
-
"@tanstack/react-router",
|
|
74
|
-
"@tanstack/react-query"
|
|
75
|
-
];
|
|
76
|
-
var KIT_DEPS = [
|
|
77
|
-
"@tanstack/react-table",
|
|
78
|
-
"class-variance-authority",
|
|
79
|
-
"clsx",
|
|
80
|
-
"cmdk",
|
|
81
|
-
"date-fns",
|
|
82
|
-
"date-fns/locale",
|
|
83
|
-
"echarts",
|
|
84
|
-
"lucide-react",
|
|
85
|
-
"react-day-picker",
|
|
86
|
-
"tailwind-merge",
|
|
87
|
-
"@base-ui/react/accordion",
|
|
88
|
-
"@base-ui/react/button",
|
|
89
|
-
"@base-ui/react/checkbox",
|
|
90
|
-
"@base-ui/react/collapsible",
|
|
91
|
-
"@base-ui/react/dialog",
|
|
92
|
-
"@base-ui/react/input",
|
|
93
|
-
"@base-ui/react/menu",
|
|
94
|
-
"@base-ui/react/merge-props",
|
|
95
|
-
"@base-ui/react/popover",
|
|
96
|
-
"@base-ui/react/progress",
|
|
97
|
-
"@base-ui/react/scroll-area",
|
|
98
|
-
"@base-ui/react/select",
|
|
99
|
-
"@base-ui/react/separator",
|
|
100
|
-
"@base-ui/react/slider",
|
|
101
|
-
"@base-ui/react/switch",
|
|
102
|
-
"@base-ui/react/tabs",
|
|
103
|
-
"@base-ui/react/toggle",
|
|
104
|
-
"@base-ui/react/toggle-group",
|
|
105
|
-
"@base-ui/react/tooltip",
|
|
106
|
-
"@base-ui/react/use-render"
|
|
107
|
-
];
|
|
108
|
-
function packageName(spec) {
|
|
109
|
-
const parts = spec.split("/");
|
|
110
|
-
return spec.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
|
|
111
|
-
}
|
|
112
|
-
function hasPackage(fromDir, pkg) {
|
|
113
|
-
let dir = fromDir;
|
|
114
|
-
for (; ; ) {
|
|
115
|
-
if (fs.existsSync(path.join(dir, "node_modules", pkg))) return true;
|
|
116
|
-
const parent = path.dirname(dir);
|
|
117
|
-
if (parent === dir) return false;
|
|
118
|
-
dir = parent;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function optimizeInclude(root, extra) {
|
|
122
|
-
return [...RUNTIME_DEPS, ...KIT_DEPS, ...extra].filter(
|
|
123
|
-
(spec) => hasPackage(root, packageName(spec))
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
var FILE_PAGE_DEPS = ["papaparse", "read-excel-file/browser"];
|
|
127
|
-
var SLIDE_EXPORT_DEPS = ["html-to-image", "fflate"];
|
|
128
|
-
function conditionalDeps(model) {
|
|
129
|
-
return [
|
|
130
|
-
...model.pages.some((p) => p.kind === "file") ? FILE_PAGE_DEPS : [],
|
|
131
|
-
...model.pages.some((p) => p.variant === "slide") ? SLIDE_EXPORT_DEPS : []
|
|
132
|
-
];
|
|
133
|
-
}
|
|
134
|
-
function underPageRoot(pageRoot, file) {
|
|
135
|
-
const rel = path.relative(pageRoot, file);
|
|
136
|
-
if (rel.startsWith("..")) return false;
|
|
137
|
-
const segments = rel.split(path.sep);
|
|
138
|
-
return !segments.some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith(".") && s !== "..");
|
|
139
|
-
}
|
|
140
|
-
function isPageModuleFile(pageRoot, file) {
|
|
141
|
-
return underPageRoot(pageRoot, file) && PAGE_EXTENSIONS.some((ext) => file.endsWith(ext));
|
|
142
|
-
}
|
|
143
|
-
function isRoutedFile(pageRoot, file) {
|
|
144
|
-
return isPageModuleFile(pageRoot, file) || isFilePageFile(pageRoot, file);
|
|
145
|
-
}
|
|
146
|
-
function isFilePageFile(pageRoot, file) {
|
|
147
|
-
const lower = file.toLowerCase();
|
|
148
|
-
return underPageRoot(pageRoot, file) && FILE_PAGE_EXTENSIONS.some((ext) => lower.endsWith(ext));
|
|
149
|
-
}
|
|
150
|
-
function isApiFile(root, file) {
|
|
151
|
-
const rel = path.relative(root, file);
|
|
152
|
-
return rel.startsWith(`server${path.sep}api${path.sep}`) && /\.(ts|tsx|js)$/.test(file) && !file.endsWith(".d.ts");
|
|
153
|
-
}
|
|
154
|
-
function isServerFile(root, file) {
|
|
155
|
-
const rel = path.relative(root, file);
|
|
156
|
-
return rel === "server" || rel.startsWith(`server${path.sep}`);
|
|
157
|
-
}
|
|
158
|
-
function vantagePlugin(options) {
|
|
159
|
-
const root = path.resolve(options.root);
|
|
160
|
-
const vantageDir = path.join(root, VANTAGE_DIR);
|
|
161
|
-
let model = options.model ?? scanProject(root);
|
|
162
|
-
let generated = Boolean(options.artifactsWritten);
|
|
163
|
-
let shellHtml = null;
|
|
164
|
-
const pageRoot = () => model.pageDir === "" ? root : path.join(root, model.pageDir);
|
|
165
|
-
const emit = () => {
|
|
166
|
-
generateArtifacts({ root, model });
|
|
167
|
-
generated = true;
|
|
168
|
-
shellHtml = null;
|
|
169
|
-
};
|
|
170
|
-
const ensureGenerated = () => {
|
|
171
|
-
if (!generated) emit();
|
|
172
|
-
};
|
|
173
|
-
const regenerate = () => {
|
|
174
|
-
model = scanProject(root);
|
|
175
|
-
emit();
|
|
176
|
-
};
|
|
177
|
-
const core = {
|
|
178
|
-
name: "vantage:core",
|
|
179
|
-
enforce: "pre",
|
|
180
|
-
config() {
|
|
181
|
-
return {
|
|
182
|
-
root,
|
|
183
|
-
appType: "custom",
|
|
184
|
-
envPrefix: ["PUBLIC_"],
|
|
185
|
-
resolve: { dedupe: DEDUPE },
|
|
186
|
-
optimizeDeps: { include: optimizeInclude(root, conditionalDeps(model)) },
|
|
187
|
-
server: {
|
|
188
|
-
// Browser console + runtime errors belong in the dev terminal: it is
|
|
189
|
-
// the feedback surface both humans and agents already watch. Vite 8
|
|
190
|
-
// forwards them natively — with source-mapped stacks and code frames,
|
|
191
|
-
// which the hand-rolled beacon bridge this replaces could not do — but
|
|
192
|
-
// only turns itself on when it detects an agent. Vantage wants it
|
|
193
|
-
// always. warn/error only: forwarding `log`/`info` too lets one chatty
|
|
194
|
-
// render loop bury the server's own output.
|
|
195
|
-
forwardConsole: { unhandledErrors: true, logLevels: ["warn", "error"] }
|
|
196
|
-
},
|
|
197
|
-
build: {
|
|
198
|
-
outDir: path.join(root, "dist", "client"),
|
|
199
|
-
emptyOutDir: true,
|
|
200
|
-
rollupOptions: {
|
|
201
|
-
input: path.join(vantageDir, "index.html")
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
},
|
|
206
|
-
configResolved() {
|
|
207
|
-
ensureGenerated();
|
|
208
|
-
},
|
|
209
|
-
buildStart() {
|
|
210
|
-
ensureGenerated();
|
|
211
|
-
},
|
|
212
|
-
// --- Server-import boundary: client code may never import server/. ---
|
|
213
|
-
resolveId(source, importer, opts) {
|
|
214
|
-
if (opts?.ssr) return null;
|
|
215
|
-
if (!importer) return null;
|
|
216
|
-
const imp = importer.split("?")[0];
|
|
217
|
-
if (!imp.startsWith(root)) return null;
|
|
218
|
-
const relImp = path.relative(root, imp);
|
|
219
|
-
if (relImp.startsWith(`server${path.sep}`) || relImp.startsWith(VANTAGE_DIR) || relImp.includes("node_modules")) {
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
let target = null;
|
|
223
|
-
if (source.startsWith(".")) target = path.resolve(path.dirname(imp), source);
|
|
224
|
-
else if (source.startsWith("/")) target = path.join(root, source.slice(1));
|
|
225
|
-
else if (source === "server" || source.startsWith("server/")) target = path.join(root, source);
|
|
226
|
-
if (!target) return null;
|
|
227
|
-
const relTarget = path.relative(root, target);
|
|
228
|
-
if (relTarget === "server" || relTarget.startsWith(`server${path.sep}`)) {
|
|
229
|
-
this.error(
|
|
230
|
-
`Client module "${relImp}" imports from server/ ("${source}"). server/ code must never reach the client bundle \u2014 move shared code to lib/.`
|
|
231
|
-
);
|
|
232
|
-
}
|
|
233
|
-
return null;
|
|
234
|
-
},
|
|
235
|
-
// --- Keep React Fast Refresh working on page modules. ---
|
|
236
|
-
// `export const page = definePage(...)` is a non-component export, which
|
|
237
|
-
// makes @vitejs/plugin-react bail out of Fast Refresh (full reload). The
|
|
238
|
-
// runtime never reads this export (title/description are extracted at
|
|
239
|
-
// generate time), so we drop the `export` keyword — turning it into a local
|
|
240
|
-
// const — before the React plugin analyzes the module. Offsets are
|
|
241
|
-
// preserved (6 spaces for "export") so sourcemaps stay accurate.
|
|
242
|
-
transform(code, id) {
|
|
243
|
-
const clean = id.split("?")[0];
|
|
244
|
-
if (!isPageModuleFile(pageRoot(), clean)) return null;
|
|
245
|
-
if (!/export\s+const\s+page\b/.test(code)) return null;
|
|
246
|
-
const out = code.replace(
|
|
247
|
-
/^([ \t]*)export(\s+const\s+page\b)/gm,
|
|
248
|
-
(_m, indent, rest) => indent + " " + rest
|
|
249
|
-
);
|
|
250
|
-
if (out === code) return null;
|
|
251
|
-
return { code: out, map: null };
|
|
252
|
-
},
|
|
253
|
-
configureServer(server) {
|
|
254
|
-
const getEnv = () => options.env ?? process.env;
|
|
255
|
-
const apiMw = createApiDevMiddleware({ server, getModel: () => model, getEnv });
|
|
256
|
-
server.middlewares.use((req, res, next) => {
|
|
257
|
-
if (model.hasServer) return apiMw(req, res, next);
|
|
258
|
-
return next();
|
|
259
|
-
});
|
|
260
|
-
const isStylesFile = (file) => path.relative(pageRoot(), file) === "styles.css";
|
|
261
|
-
const rootMoved = () => resolvePageRoot(root).dir !== model.pageDir;
|
|
262
|
-
const onStructural = (file) => {
|
|
263
|
-
if (rootMoved() || isRoutedFile(pageRoot(), file) || isApiFile(root, file) || isStylesFile(file)) {
|
|
264
|
-
regenerate();
|
|
265
|
-
server.ws.send({ type: "full-reload" });
|
|
266
|
-
}
|
|
267
|
-
};
|
|
268
|
-
const isRouteDir = (dir) => {
|
|
269
|
-
if (isServerFile(root, dir)) return true;
|
|
270
|
-
const rel = path.relative(pageRoot(), dir);
|
|
271
|
-
if (rel === "" || rel.startsWith("..")) return false;
|
|
272
|
-
return !rel.split(path.sep).some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith("."));
|
|
273
|
-
};
|
|
274
|
-
server.watcher.on("add", onStructural);
|
|
275
|
-
server.watcher.on("unlink", onStructural);
|
|
276
|
-
server.watcher.on("addDir", (dir) => {
|
|
277
|
-
if (rootMoved() || isRouteDir(dir)) regenerate();
|
|
278
|
-
});
|
|
279
|
-
server.watcher.on("unlinkDir", (dir) => {
|
|
280
|
-
if (!rootMoved() && !isRouteDir(dir)) return;
|
|
281
|
-
regenerate();
|
|
282
|
-
server.ws.send({ type: "full-reload" });
|
|
283
|
-
});
|
|
284
|
-
server.watcher.on("change", (file) => {
|
|
285
|
-
if (isServerFile(root, file)) {
|
|
286
|
-
const mods = server.moduleGraph.getModulesByFile(file);
|
|
287
|
-
if (mods) for (const m of mods) server.moduleGraph.invalidateModule(m);
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
if (isFilePageFile(pageRoot(), file)) server.ws.send({ type: "full-reload" });
|
|
291
|
-
});
|
|
292
|
-
return () => {
|
|
293
|
-
server.middlewares.use(async (req, res, next) => {
|
|
294
|
-
if (req.method !== "GET" && req.method !== "HEAD") return next();
|
|
295
|
-
try {
|
|
296
|
-
if (shellHtml === null) {
|
|
297
|
-
const raw = fs.readFileSync(path.join(vantageDir, "index.html"), "utf8");
|
|
298
|
-
const shellUrl = `/${VANTAGE_DIR}/index.html`;
|
|
299
|
-
shellHtml = await server.transformIndexHtml(shellUrl, raw, req.originalUrl);
|
|
300
|
-
}
|
|
301
|
-
res.statusCode = 200;
|
|
302
|
-
res.setHeader("Content-Type", "text/html");
|
|
303
|
-
res.end(shellHtml);
|
|
304
|
-
} catch (err) {
|
|
305
|
-
next(err);
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
return [core, react(), tailwindcss()];
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
export { vantagePlugin };
|
|
315
|
-
//# sourceMappingURL=chunk-VA776YE5.js.map
|
|
316
|
-
//# sourceMappingURL=chunk-VA776YE5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/dev.ts","../src/vite/index.ts"],"names":["path"],"mappings":";;;;;;;;;;;;AAsBO,SAAS,uBAAuB,IAAA,EAIxB;AACb,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAErC,EAAA,MAAM,cAAc,MAClB,aAAA;AAAA,IACE,QAAA,EAAS,CAAE,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1B,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,WAAA,EAAa,EAAE,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAAA,MACzD,WAAA,EAAa,EAAE,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,MAC3D,IAAA,EAAM,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,OAAO;AAAA,KAC5C,CAAE;AAAA,GACJ;AAEF,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,EAAK;AAIrB,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,EAAQ,CAAA;AACpC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,GAAA,CAAI,GAAA,CAAI,QAAQ,IAAI,CAAA;AACpB,IAAA,GAAA,CAAI,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,CAAA,KAA8C;AAClE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,WAAA,EAAY,EAAG,IAAI,QAAQ,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,GAAA,CAAI,QAAA,EAAS,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,KAAA,EAAO,MAAA,CAAO,gBAAA,CAAiB,GAAG,CAAA;AACrD,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,GAAA,CAAI,KAAK,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,GAAA,CAAI,GAAA,CAAI,QAAQ,MAAa,CAAA;AAE7B,EAAA,GAAA,CAAI,GAAA,CAAI,UAAU,MAAa,CAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAE7C,EAAA,OAAO,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AACzB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,IAAA,MAAMA,KAAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC7B,IAAA,IAAIA,KAAAA,KAAS,MAAA,IAAUA,KAAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAS,GAAA,EAAK,GAAG,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACjD,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,GAAG,CAAA;AACtD,QAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,UAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,UAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,kBAAkB,CAAA;AAChD,UAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,uBAAA,EAAyB,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF;;;ACtDA,IAAM,MAAA,GAAS,CAAC,OAAA,EAAS,WAAA,EAAa,0BAA0B,uBAAuB,CAAA;AAGvF,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAA;AASA,IAAM,QAAA,GAAW;AAAA,EACf,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,0BAAA;AAAA,EACA,uBAAA;AAAA,EACA,yBAAA;AAAA,EACA,4BAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EACA,wBAAA;AAAA,EACA,yBAAA;AAAA,EACA,4BAAA;AAAA,EACA,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,uBAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,uBAAA;AAAA,EACA,6BAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAA;AAGA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA;AACrE;AAGA,SAAS,UAAA,CAAW,SAAiB,GAAA,EAAsB;AACzD,EAAA,IAAI,GAAA,GAAM,OAAA;AACV,EAAA,WAAS;AACP,IAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,cAAA,EAAgB,GAAG,CAAC,CAAA,EAAG,OAAO,IAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,KAAA;AAC3B,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACF;AAoBA,SAAS,eAAA,CAAgB,MAAc,KAAA,EAA2B;AAChE,EAAA,OAAO,CAAC,GAAG,YAAA,EAAc,GAAG,QAAA,EAAU,GAAG,KAAK,CAAA,CAAE,MAAA;AAAA,IAAO,CAAC,IAAA,KACtD,UAAA,CAAW,IAAA,EAAM,WAAA,CAAY,IAAI,CAAC;AAAA,GACpC;AACF;AAYA,IAAM,cAAA,GAAiB,CAAC,WAAA,EAAa,yBAAyB,CAAA;AAC9D,IAAM,iBAAA,GAAoB,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAEpD,SAAS,gBAAgB,KAAA,EAA6B;AACpD,EAAA,OAAO;AAAA,IACL,GAAI,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,GAAI,cAAA,GAAiB,EAAC;AAAA,IACnE,GAAI,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,GAAI,iBAAA,GAAoB;AAAC,GAC5E;AACF;AAGA,SAAS,aAAA,CAAc,UAAkB,IAAA,EAAuB;AAC9D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAA;AACxC,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACnC,EAAA,OAAO,CAAC,QAAA,CAAS,IAAA,CAAK,CAAC,MAAM,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,IAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,IAAK,CAAA;AACzF;AAOA,SAAS,gBAAA,CAAiB,UAAkB,IAAA,EAAuB;AACjE,EAAA,OAAO,aAAA,CAAc,QAAA,EAAU,IAAI,CAAA,IAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,GAAA,KAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AAC1F;AAQA,SAAS,YAAA,CAAa,UAAkB,IAAA,EAAuB;AAC7D,EAAA,OAAO,iBAAiB,QAAA,EAAU,IAAI,CAAA,IAAK,cAAA,CAAe,UAAU,IAAI,CAAA;AAC1E;AAGA,SAAS,cAAA,CAAe,UAAkB,IAAA,EAAuB;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,OAAO,aAAA,CAAc,QAAA,EAAU,IAAI,CAAA,IAAK,oBAAA,CAAqB,IAAA,CAAK,CAAC,GAAA,KAAQ,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AAChG;AAEA,SAAS,SAAA,CAAU,MAAc,IAAA,EAAuB;AACtD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AACpC,EAAA,OAAO,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,MAAM,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA,IAAK,iBAAiB,IAAA,CAAK,IAAI,KAAK,CAAC,IAAA,CAAK,SAAS,OAAO,CAAA;AACnH;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAuB;AACzD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AACpC,EAAA,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC/D;AAOO,SAAS,cAAc,OAAA,EAA6C;AACzE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC9C,EAAA,IAAI,KAAA,GAAoB,OAAA,CAAQ,KAAA,IAAS,WAAA,CAAY,IAAI,CAAA;AAEzD,EAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAEhD,EAAA,IAAI,SAAA,GAA2B,IAAA;AAG/B,EAAA,MAAM,QAAA,GAAW,MAAe,KAAA,CAAM,OAAA,KAAY,EAAA,GAAK,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AAE3F,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AACjC,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAA;AAGA,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,IAAI,CAAC,WAAW,IAAA,EAAK;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,KAAA,GAAQ,YAAY,IAAI,CAAA;AACxB,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,IAAA,GAAe;AAAA,IACnB,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IAET,MAAA,GAAS;AACP,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAW,CAAC,SAAS,CAAA;AAAA,QACrB,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,QAC1B,YAAA,EAAc,EAAE,OAAA,EAAS,eAAA,CAAgB,MAAM,eAAA,CAAgB,KAAK,CAAC,CAAA,EAAE;AAAA,QACvE,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAQN,cAAA,EAAgB,EAAE,eAAA,EAAiB,IAAA,EAAM,WAAW,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAE,SACxE;AAAA,QACA,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,UACxC,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe;AAAA,YACb,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,YAAY;AAAA;AAC3C;AACF,OACF;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,GAAiB;AAEf,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAAA,IAEA,UAAA,GAAa;AAGX,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAAA;AAAA,IAGA,SAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM;AAChC,MAAA,IAAI,IAAA,EAAM,KAAK,OAAO,IAAA;AACtB,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,GAAG,OAAO,IAAA;AAClC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACtC,MAAA,IACE,MAAA,CAAO,UAAA,CAAW,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA,IACrC,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,IAC7B,MAAA,CAAO,QAAA,CAAS,cAAc,CAAA,EAC9B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,CAAA;AAAA,WAAA,IAClE,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,WAAA,IAChE,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW,SAAS,GAAG,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAC7F,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC5C,MAAA,IAAI,SAAA,KAAc,YAAY,SAAA,CAAU,UAAA,CAAW,SAAS,IAAA,CAAK,GAAG,EAAE,CAAA,EAAG;AACvE,QAAA,IAAA,CAAK,KAAA;AAAA,UACH,CAAA,eAAA,EAAkB,MAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,oFAAA;AAAA,SAE5D;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,SAAA,CAAU,MAAM,EAAA,EAAI;AAClB,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC7B,MAAA,IAAI,CAAC,gBAAA,CAAiB,QAAA,EAAS,EAAG,KAAK,GAAG,OAAO,IAAA;AACjD,MAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAGlD,MAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AAAA,QACf,sCAAA;AAAA,QACA,CAAC,EAAA,EAAI,MAAA,EAAgB,IAAA,KAAiB,SAAS,QAAA,GAAW;AAAA,OAC5D;AACA,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,IAAA;AACzB,MAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK;AAAA,IAChC,CAAA;AAAA,IAEA,gBAAgB,MAAA,EAAuB;AACrC,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,IAAQ,OAAA,CAAQ,GAAA;AAG7C,MAAA,MAAM,KAAA,GAAQ,uBAAuB,EAAE,MAAA,EAAQ,UAAU,MAAM,KAAA,EAAO,QAAQ,CAAA;AAC9E,MAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,EAAK,KAAK,IAAA,KAAS;AAGzC,QAAA,IAAI,MAAM,SAAA,EAAW,OAAO,KAAA,CAAM,GAAA,EAAK,KAAK,IAAI,CAAA;AAChD,QAAA,OAAO,IAAA,EAAK;AAAA,MACd,CAAC,CAAA;AAID,MAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB,IAAA,CAAK,SAAS,QAAA,EAAS,EAAG,IAAI,CAAA,KAAM,YAAA;AAG3E,MAAA,MAAM,YAAY,MAAM,eAAA,CAAgB,IAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,OAAA;AAC5D,MAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB;AACrC,QAAA,IAAI,SAAA,EAAU,IAAK,YAAA,CAAa,QAAA,EAAS,EAAG,IAAI,CAAA,IAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA,IAAK,YAAA,CAAa,IAAI,CAAA,EAAG;AAChG,UAAA,UAAA,EAAW;AACX,UAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,QACxC;AAAA,MACF,CAAA;AAOA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAClC,QAAA,IAAI,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AACpC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,IAAY,GAAG,CAAA;AACzC,QAAA,IAAI,QAAQ,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,IAAI,GAAG,OAAO,KAAA;AAC/C,QAAA,OAAO,CAAC,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,GAAG,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,cAAA,CAAe,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MACpF,CAAA;AACA,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA;AACrC,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,YAAY,CAAA;AACxC,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,GAAA,KAAQ;AACnC,QAAA,IAAI,SAAA,EAAU,IAAK,UAAA,CAAW,GAAG,GAAG,UAAA,EAAW;AAAA,MACjD,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,WAAA,EAAa,CAAC,GAAA,KAAQ;AACtC,QAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACtC,QAAA,UAAA,EAAW;AACX,QAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,MACxC,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,IAAA,KAAS;AACpC,QAAA,IAAI,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,EAAG;AAC5B,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,gBAAA,CAAiB,IAAI,CAAA;AACrD,UAAA,IAAI,MAAM,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAC,CAAA;AACrE,UAAA;AAAA,QACF;AAIA,QAAA,IAAI,cAAA,CAAe,QAAA,EAAS,EAAG,IAAI,CAAA,EAAG,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAe,CAAA;AAAA,MAC9E,CAAC,CAAA;AAGD,MAAA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,OAAO,GAAA,EAAK,KAAK,IAAA,KAAS;AAC/C,UAAA,IAAI,IAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,MAAA,SAAe,IAAA,EAAK;AAG/D,UAAA,IAAI;AAKF,YAAA,IAAI,cAAc,IAAA,EAAM;AACtB,cAAA,MAAM,GAAA,GAAM,GAAG,YAAA,CAAa,IAAA,CAAK,KAAK,UAAA,EAAY,YAAY,GAAG,MAAM,CAAA;AAQvE,cAAA,MAAM,QAAA,GAAW,IAAI,WAAW,CAAA,WAAA,CAAA;AAChC,cAAA,SAAA,GAAY,MAAM,MAAA,CAAO,kBAAA,CAAmB,QAAA,EAAU,GAAA,EAAK,IAAI,WAAW,CAAA;AAAA,YAC5E;AACA,YAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,YAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACzC,YAAA,GAAA,CAAI,IAAI,SAAS,CAAA;AAAA,UACnB,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,GAAY,CAAA;AAAA,UACnB;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,IACF;AAAA,GACF;AAGA,EAAA,OAAO,CAAC,IAAA,EAAM,KAAA,EAAM,EAAG,aAA6B,CAAA;AACtD","file":"chunk-VA776YE5.js","sourcesContent":["import { Hono } from \"hono\"\nimport { getRequestListener } from \"@hono/node-server\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { ViteDevServer } from \"vite\"\nimport type { RouteModel } from \"../core/types\"\nimport { corsMiddleware } from \"./cors\"\nimport {\n dispatchApi,\n matchApiRoute,\n sortApiRoutes,\n type ApiRouteEntry,\n} from \"./dispatch\"\nimport type { ApiModule } from \"./index\"\n\ntype Middleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void\n\n/**\n * Build a connect-style middleware that serves `server/api/**` in dev. Modules\n * are loaded through Vite's SSR pipeline so edits hot-reload, and the route list\n * is read fresh on every request so added/removed API files take effect without\n * a restart.\n */\nexport function createApiDevMiddleware(opts: {\n server: ViteDevServer\n getModel: () => RouteModel\n getEnv: () => Record<string, string | undefined>\n}): Middleware {\n const { server, getModel, getEnv } = opts\n\n const buildRoutes = (): ApiRouteEntry[] =>\n sortApiRoutes(\n getModel().apis.map((a) => ({\n routePath: a.routePath,\n segments: a.segments,\n hasCatchall: a.segments.some((s) => s.kind === \"catchall\"),\n staticCount: a.segments.filter((s) => s.kind === \"static\").length,\n load: () => server.ssrLoadModule(a.absFile) as Promise<ApiModule>,\n })),\n )\n\n const app = new Hono()\n\n // CORS for split deployments, matching prod. Off unless CORS_ORIGIN is set;\n // read once here from the current env (dev's CORS config is deploy-level).\n const cors = corsMiddleware(getEnv())\n if (cors) {\n app.use(\"/api\", cors)\n app.use(\"/api/*\", cors)\n }\n\n const handle = async (c: { req: { url: string; raw: Request } }) => {\n const url = new URL(c.req.url)\n const match = matchApiRoute(buildRoutes(), url.pathname)\n if (!match) {\n return Response.json({ error: \"Not Found\", path: url.pathname }, { status: 404 })\n }\n let mod: ApiModule\n try {\n mod = await match.route.load()\n } catch (err) {\n if (err instanceof Error) server.ssrFixStacktrace(err)\n throw err\n }\n return dispatchApi(mod, c.req.raw, match.params, getEnv())\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n app.all(\"/api\", handle as any)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n app.all(\"/api/*\", handle as any)\n\n const listener = getRequestListener(app.fetch)\n\n return (req, res, next) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0]!\n if (path === \"/api\" || path.startsWith(\"/api/\")) {\n Promise.resolve(listener(req, res)).catch((err) => {\n console.error(\"[vantage] API middleware failure:\", err)\n if (!res.headersSent) {\n res.statusCode = 500\n res.setHeader(\"content-type\", \"application/json\")\n res.end(JSON.stringify({ error: \"Internal Server Error\" }))\n }\n })\n } else {\n next()\n }\n }\n}\n","import fs from \"node:fs\"\nimport path from \"node:path\"\nimport react from \"@vitejs/plugin-react\"\nimport tailwindcss from \"@tailwindcss/vite\"\nimport type { Plugin, PluginOption, ViteDevServer } from \"vite\"\nimport {\n FILE_PAGE_EXTENSIONS,\n NON_ROUTE_DIRS,\n PAGE_EXTENSIONS,\n VANTAGE_DIR,\n} from \"../core/constants\"\nimport { generateArtifacts } from \"../core/generate\"\nimport { resolvePageRoot, scanProject } from \"../core/scan\"\nimport type { RouteModel } from \"../core/types\"\nimport { createApiDevMiddleware } from \"../server/dev\"\n\nexport interface VantagePluginOptions {\n root: string\n /** Server-side env (process.env + loaded .env), passed to API handlers. */\n env?: Record<string, string | undefined>\n /**\n * A route model the caller already scanned. `dev`/`build` run diagnostics\n * before starting Vite, so without this the project would be walked a second\n * time for an answer that is milliseconds old.\n */\n model?: RouteModel\n /**\n * Set when the caller has already written `.vantage/` for `model`. `build`\n * does, so that the server bundle — which reads `server-routes.gen.ts` — can\n * be produced at the same time as the client instead of after it.\n */\n artifactsWritten?: boolean\n}\n\nconst DEDUPE = [\"react\", \"react-dom\", \"@tanstack/react-router\", \"@tanstack/react-query\"]\n\n/** Always prebundled: the generated client entry imports these on every start. */\nconst RUNTIME_DEPS = [\n \"react\",\n \"react-dom\",\n \"react-dom/client\",\n \"react/jsx-runtime\",\n \"@tanstack/react-router\",\n \"@tanstack/react-query\",\n]\n\n/**\n * The rest of the managed stack — everything `@squadbase/vantage/ui` and\n * `/components` pull in. Apps import framework subpaths, never these directly,\n * so Vantage knows the full set up front and Vite does not have to rediscover\n * it. Declaring them removes the second optimize wave (and the full page reload\n * it forces) the first time a page reaches for a new kit component.\n */\nconst KIT_DEPS = [\n \"@tanstack/react-table\",\n \"class-variance-authority\",\n \"clsx\",\n \"cmdk\",\n \"date-fns\",\n \"date-fns/locale\",\n \"echarts\",\n \"lucide-react\",\n \"react-day-picker\",\n \"tailwind-merge\",\n \"@base-ui/react/accordion\",\n \"@base-ui/react/button\",\n \"@base-ui/react/checkbox\",\n \"@base-ui/react/collapsible\",\n \"@base-ui/react/dialog\",\n \"@base-ui/react/input\",\n \"@base-ui/react/menu\",\n \"@base-ui/react/merge-props\",\n \"@base-ui/react/popover\",\n \"@base-ui/react/progress\",\n \"@base-ui/react/scroll-area\",\n \"@base-ui/react/select\",\n \"@base-ui/react/separator\",\n \"@base-ui/react/slider\",\n \"@base-ui/react/switch\",\n \"@base-ui/react/tabs\",\n \"@base-ui/react/toggle\",\n \"@base-ui/react/toggle-group\",\n \"@base-ui/react/tooltip\",\n \"@base-ui/react/use-render\",\n]\n\n/** The package part of a specifier: `@base-ui/react/select` → `@base-ui/react`. */\nfunction packageName(spec: string): string {\n const parts = spec.split(\"/\")\n return spec.startsWith(\"@\") ? parts.slice(0, 2).join(\"/\") : parts[0]!\n}\n\n/** Walk up `node_modules` chains looking for a package directory. */\nfunction hasPackage(fromDir: string, pkg: string): boolean {\n let dir = fromDir\n for (;;) {\n if (fs.existsSync(path.join(dir, \"node_modules\", pkg))) return true\n const parent = path.dirname(dir)\n if (parent === dir) return false\n dir = parent\n }\n}\n\n/**\n * Build `optimizeDeps.include`, keeping only specifiers that actually resolve\n * from the project root.\n *\n * Two constraints pin this down. Vite hard-errors on an include entry it cannot\n * resolve, so guessing is not an option. And Vite's own dependency discovery\n * names these packages *plainly* — so the `parent > child` form, which would\n * reach the copy inside the framework's own node_modules, does not merge with\n * what discovery finds: it prebundles a second, never-requested copy of every\n * entry (measured: 156 files instead of 78).\n *\n * The practical effect is that a hoisted install (npm/yarn, and pnpm with\n * hoisting) declares the whole managed stack up front and skips the second\n * optimize wave — the one that forces a full page reload the first time a page\n * reaches for a new kit component. Under a strict pnpm layout the kit resolves\n * only from the framework package, nothing extra is declared, and behaviour is\n * exactly what it was before.\n */\nfunction optimizeInclude(root: string, extra: string[]): string[] {\n return [...RUNTIME_DEPS, ...KIT_DEPS, ...extra].filter((spec) =>\n hasPackage(root, packageName(spec)),\n )\n}\n\n/**\n * Dependencies only some projects reach for, declared only when they do.\n * They are loaded through `await import()` at the moment a user opens a data\n * file or clicks \"export\" — late enough that an undeclared dependency would\n * wake the optimizer and full-reload the page mid-action. Prebundling them for\n * every app instead would tax dev startup for nothing.\n */\n// `read-excel-file` publishes no root export, so the subpath is the specifier\n// both here and in `table/parse.ts` — Vite hard-errors on an include entry it\n// cannot resolve, and the two have to name the same module to merge.\nconst FILE_PAGE_DEPS = [\"papaparse\", \"read-excel-file/browser\"]\nconst SLIDE_EXPORT_DEPS = [\"html-to-image\", \"fflate\"]\n\nfunction conditionalDeps(model: RouteModel): string[] {\n return [\n ...(model.pages.some((p) => p.kind === \"file\") ? FILE_PAGE_DEPS : []),\n ...(model.pages.some((p) => p.variant === \"slide\") ? SLIDE_EXPORT_DEPS : []),\n ]\n}\n\n/** Whether a path sits somewhere under the page root that is actually scanned. */\nfunction underPageRoot(pageRoot: string, file: string): boolean {\n const rel = path.relative(pageRoot, file)\n if (rel.startsWith(\"..\")) return false\n const segments = rel.split(path.sep)\n return !segments.some((s) => NON_ROUTE_DIRS.has(s) || (s.startsWith(\".\") && s !== \"..\"))\n}\n\n/**\n * A `.tsx`/`.jsx` page module — the only thing `transform` may rewrite. Kept\n * separate from `isRoutedFile` on purpose: running the `export const page`\n * regex over a `.xlsx` would mean decoding spreadsheet binary as text.\n */\nfunction isPageModuleFile(pageRoot: string, file: string): boolean {\n return underPageRoot(pageRoot, file) && PAGE_EXTENSIONS.some((ext) => file.endsWith(ext))\n}\n\n/**\n * Anything under the page root that becomes a route: modules and data files.\n * Composed from the two halves rather than matching `ROUTED_EXTENSIONS`\n * directly, so it agrees with the scanner on case — `Sales.CSV` (what Excel on\n * Windows writes) is a route, and the watcher has to regenerate for it.\n */\nfunction isRoutedFile(pageRoot: string, file: string): boolean {\n return isPageModuleFile(pageRoot, file) || isFilePageFile(pageRoot, file)\n}\n\n/** Just the data-file half of `isRoutedFile`. Case-insensitive, as scan is. */\nfunction isFilePageFile(pageRoot: string, file: string): boolean {\n const lower = file.toLowerCase()\n return underPageRoot(pageRoot, file) && FILE_PAGE_EXTENSIONS.some((ext) => lower.endsWith(ext))\n}\n\nfunction isApiFile(root: string, file: string): boolean {\n const rel = path.relative(root, file)\n return rel.startsWith(`server${path.sep}api${path.sep}`) && /\\.(ts|tsx|js)$/.test(file) && !file.endsWith(\".d.ts\")\n}\n\nfunction isServerFile(root: string, file: string): boolean {\n const rel = path.relative(root, file)\n return rel === \"server\" || rel.startsWith(`server${path.sep}`)\n}\n\n/**\n * The single plugin that turns a plain Vite instance into Vantage: file-based\n * routing, generated entry/HTML, Tailwind, the server-import boundary, route\n * HMR and the dev-server defaults (including console forwarding).\n */\nexport function vantagePlugin(options: VantagePluginOptions): PluginOption {\n const root = path.resolve(options.root)\n const vantageDir = path.join(root, VANTAGE_DIR)\n let model: RouteModel = options.model ?? scanProject(root)\n /** Written once per start: `configResolved` and `buildStart` both need it. */\n let generated = Boolean(options.artifactsWritten)\n /** Cached dev shell, invalidated whenever the artifacts are rewritten. */\n let shellHtml: string | null = null\n\n /** Absolute page-scan root, kept in step with the last scan. */\n const pageRoot = (): string => (model.pageDir === \"\" ? root : path.join(root, model.pageDir))\n\n const emit = (): void => {\n generateArtifacts({ root, model })\n generated = true\n shellHtml = null\n }\n\n /** Write the artifacts for the model we already have, at most once per start. */\n const ensureGenerated = (): void => {\n if (!generated) emit()\n }\n\n const regenerate = (): void => {\n model = scanProject(root)\n emit()\n }\n\n const core: Plugin = {\n name: \"vantage:core\",\n enforce: \"pre\",\n\n config() {\n return {\n root,\n appType: \"custom\",\n envPrefix: [\"PUBLIC_\"],\n resolve: { dedupe: DEDUPE },\n optimizeDeps: { include: optimizeInclude(root, conditionalDeps(model)) },\n server: {\n // Browser console + runtime errors belong in the dev terminal: it is\n // the feedback surface both humans and agents already watch. Vite 8\n // forwards them natively — with source-mapped stacks and code frames,\n // which the hand-rolled beacon bridge this replaces could not do — but\n // only turns itself on when it detects an agent. Vantage wants it\n // always. warn/error only: forwarding `log`/`info` too lets one chatty\n // render loop bury the server's own output.\n forwardConsole: { unhandledErrors: true, logLevels: [\"warn\", \"error\"] },\n },\n build: {\n outDir: path.join(root, \"dist\", \"client\"),\n emptyOutDir: true,\n rollupOptions: {\n input: path.join(vantageDir, \"index.html\"),\n },\n },\n }\n },\n\n configResolved() {\n // Ensure .vantage exists before dev HTML serving or the build reads input.\n ensureGenerated()\n },\n\n buildStart() {\n // configResolved already ran in the normal path; this is the safety net\n // for embedders that construct the plugin without a full config pass.\n ensureGenerated()\n },\n\n // --- Server-import boundary: client code may never import server/. ---\n resolveId(source, importer, opts) {\n if (opts?.ssr) return null\n if (!importer) return null\n const imp = importer.split(\"?\")[0]!\n if (!imp.startsWith(root)) return null\n const relImp = path.relative(root, imp)\n if (\n relImp.startsWith(`server${path.sep}`) ||\n relImp.startsWith(VANTAGE_DIR) ||\n relImp.includes(\"node_modules\")\n ) {\n return null\n }\n let target: string | null = null\n if (source.startsWith(\".\")) target = path.resolve(path.dirname(imp), source)\n else if (source.startsWith(\"/\")) target = path.join(root, source.slice(1))\n else if (source === \"server\" || source.startsWith(\"server/\")) target = path.join(root, source)\n if (!target) return null\n const relTarget = path.relative(root, target)\n if (relTarget === \"server\" || relTarget.startsWith(`server${path.sep}`)) {\n this.error(\n `Client module \"${relImp}\" imports from server/ (\"${source}\"). ` +\n `server/ code must never reach the client bundle — move shared code to lib/.`,\n )\n }\n return null\n },\n\n // --- Keep React Fast Refresh working on page modules. ---\n // `export const page = definePage(...)` is a non-component export, which\n // makes @vitejs/plugin-react bail out of Fast Refresh (full reload). The\n // runtime never reads this export (title/description are extracted at\n // generate time), so we drop the `export` keyword — turning it into a local\n // const — before the React plugin analyzes the module. Offsets are\n // preserved (6 spaces for \"export\") so sourcemaps stay accurate.\n transform(code, id) {\n const clean = id.split(\"?\")[0]!\n if (!isPageModuleFile(pageRoot(), clean)) return null\n if (!/export\\s+const\\s+page\\b/.test(code)) return null\n // Anchor to line start so `export const page` inside a string/comment is\n // not rewritten. \"export\" (6 chars) becomes 6 spaces to keep offsets.\n const out = code.replace(\n /^([ \\t]*)export(\\s+const\\s+page\\b)/gm,\n (_m, indent: string, rest: string) => indent + \" \" + rest,\n )\n if (out === code) return null\n return { code: out, map: null }\n },\n\n configureServer(server: ViteDevServer) {\n const getEnv = () => options.env ?? (process.env as Record<string, string | undefined>)\n\n // API requests handled before Vite's own middlewares.\n const apiMw = createApiDevMiddleware({ server, getModel: () => model, getEnv })\n server.middlewares.use((req, res, next) => {\n // Without server/, /api/* is a normal client route: fall through to the\n // SPA shell instead of returning API 404s (matches production).\n if (model.hasServer) return apiMw(req, res, next)\n return next()\n })\n\n // Structural route changes -> regenerate manifest + reload. Adding or\n // removing styles.css also changes the generated runtime.css.\n const isStylesFile = (file: string) => path.relative(pageRoot(), file) === \"styles.css\"\n // Creating or deleting src/ moves the page root itself, which changes\n // every generated import even though no page file was touched.\n const rootMoved = () => resolvePageRoot(root).dir !== model.pageDir\n const onStructural = (file: string) => {\n if (rootMoved() || isRoutedFile(pageRoot(), file) || isApiFile(root, file) || isStylesFile(file)) {\n regenerate()\n server.ws.send({ type: \"full-reload\" })\n }\n }\n /**\n * A new directory can introduce route segments, so it has to be scanned —\n * but only when it could actually hold pages or API modules. Rescanning on\n * every mkdir (node_modules churn, build output, dot-dirs) walks the whole\n * project for nothing.\n */\n const isRouteDir = (dir: string) => {\n if (isServerFile(root, dir)) return true\n const rel = path.relative(pageRoot(), dir)\n if (rel === \"\" || rel.startsWith(\"..\")) return false\n return !rel.split(path.sep).some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith(\".\"))\n }\n server.watcher.on(\"add\", onStructural)\n server.watcher.on(\"unlink\", onStructural)\n server.watcher.on(\"addDir\", (dir) => {\n if (rootMoved() || isRouteDir(dir)) regenerate()\n })\n server.watcher.on(\"unlinkDir\", (dir) => {\n if (!rootMoved() && !isRouteDir(dir)) return\n regenerate()\n server.ws.send({ type: \"full-reload\" })\n })\n server.watcher.on(\"change\", (file) => {\n if (isServerFile(root, file)) {\n const mods = server.moduleGraph.getModulesByFile(file)\n if (mods) for (const m of mods) server.moduleGraph.invalidateModule(m)\n return\n }\n // A data file is fetched at runtime from a stable dev URL, so nothing\n // in the module graph changes when its bytes do — without this the\n // table keeps showing the old rows until someone reloads by hand.\n if (isFilePageFile(pageRoot(), file)) server.ws.send({ type: \"full-reload\" })\n })\n\n // SPA fallback: serve the generated index.html for navigations.\n return () => {\n server.middlewares.use(async (req, res, next) => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") return next()\n // Standard SPA fallback: anything Vite's own middlewares didn't handle\n // (real modules, assets, /@vite, /@id) resolves to the app shell.\n try {\n // The shell is generated, not authored, and the plugin set that\n // transforms it is fixed — so the result only changes when the\n // artifacts are rewritten. Caching it keeps every navigation from\n // re-running the whole HTML transform chain.\n if (shellHtml === null) {\n const raw = fs.readFileSync(path.join(vantageDir, \"index.html\"), \"utf8\")\n // The first argument is the URL of the shell *document*, not of the\n // navigation being answered: Vite derives the ids of the scripts it\n // injects (the React Refresh preamble) from it, emitting\n // `<src>?html-proxy&index=0.js`. Passing `req.url` would make a page\n // load of /sales request \"/sales?html-proxy&index=0.js\", which\n // resolves to sales/index.tsx and errors. `originalUrl` still carries\n // the real navigation for plugins that want it.\n const shellUrl = `/${VANTAGE_DIR}/index.html`\n shellHtml = await server.transformIndexHtml(shellUrl, raw, req.originalUrl)\n }\n res.statusCode = 200\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(shellHtml)\n } catch (err) {\n next(err as Error)\n }\n })\n }\n },\n }\n\n // React Fast Refresh + Tailwind are owned by Vantage, never by the user.\n return [core, react(), tailwindcss() as PluginOption]\n}\n"]}
|
package/dist/dev-GDKATCC7.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/dev.ts"],"names":[],"mappings":"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","file":"dev-GDKATCC7.js","sourcesContent":["import { createServer, loadEnv } from \"vite\"\nimport { runDiagnostics } from \"../core/diagnostics\"\nimport { timedAsync } from \"../core/profile\"\nimport { scanProject } from \"../core/scan\"\nimport { vantagePlugin } from \"../vite/index\"\nimport {\n applyApiBaseUrlFlag,\n log,\n printDiagnostics,\n reportPortInUse,\n resolveHmrOverlay,\n resolveHostOptions,\n resolvePortOptions,\n type ParsedArgs,\n} from \"./util\"\n\n/** `vantage dev` — start the dev server with HMR and the optional API server. */\nexport async function dev(root: string, args: ParsedArgs): Promise<number> {\n const model = scanProject(root)\n const errors = runDiagnostics(root, model).filter((d) => d.severity === \"error\")\n if (errors.length) {\n printDiagnostics(errors)\n log.error(\"Fix the errors above before starting the dev server.\")\n return 1\n }\n\n const mode = \"development\"\n applyApiBaseUrlFlag(args)\n const env = { ...process.env, ...loadEnv(mode, root, \"\") }\n const ports = resolvePortOptions(args.flags, 5173)\n if (!ports.ok) {\n log.error(ports.error)\n return 1\n }\n const { port, strictPort } = ports\n const hosts = resolveHostOptions(args.flags)\n if (!hosts.ok) {\n log.error(hosts.error)\n return 1\n }\n const overlay = resolveHmrOverlay(args.flags)\n\n const server = await timedAsync(\"vite:createServer\", () =>\n createServer({\n configFile: false,\n root,\n mode,\n // The model was just scanned for diagnostics; hand it over so the plugin\n // does not walk the project again.\n plugins: [vantagePlugin({ root, env, model })],\n // `host` / `allowedHosts` are only present when asked for, and `hmr` is\n // left alone unless the overlay is being turned off, so Vite's own\n // defaults (host, port, protocol) keep applying.\n server: {\n port,\n strictPort,\n ...hosts.options,\n ...(overlay ? {} : { hmr: { overlay: false } }),\n },\n clearScreen: false,\n }),\n )\n\n try {\n await timedAsync(\"vite:listen\", () => server.listen())\n } catch (err) {\n await server.close().catch(() => {})\n if (reportPortInUse(err, port, strictPort)) return 1\n throw err\n }\n log.brand(\"dev server ready\")\n server.printUrls()\n if (model.hasServer) log.info(\" \" + \"server/api enabled\")\n\n const shutdown = async () => {\n await server.close()\n process.exit(0)\n }\n process.on(\"SIGINT\", shutdown)\n process.on(\"SIGTERM\", shutdown)\n\n // Keep the process alive; the listening server owns the lifecycle.\n return new Promise<number>(() => {})\n}\n"]}
|