@skybridge/devtools 1.2.6 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alpic-sdk.d.ts +2 -0
- package/dist/alpic-sdk.js +3 -0
- package/dist/alpic-sdk.js.map +1 -0
- package/dist/assets/index-DAVIy1qN.css +2 -0
- package/dist/assets/index-R5erQwQK.js +220 -0
- package/dist/deploy-router.d.ts +7 -0
- package/dist/deploy-router.js +206 -0
- package/dist/deploy-router.js.map +1 -0
- package/dist/devtoolsStaticServer.js +2 -0
- package/dist/devtoolsStaticServer.js.map +1 -1
- package/dist/index.html +2 -2
- package/dist/skybridge.svg +1 -0
- package/package.json +38 -36
- package/dist/assets/index-BQIJfzpz.js +0 -190
- package/dist/assets/index-CiEa4JLr.css +0 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Router } from "express";
|
|
2
|
+
/**
|
|
3
|
+
* Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
|
|
4
|
+
* in-process (no CLI spawning): `/status` is a plain request, deploy progress
|
|
5
|
+
* streams over SSE at `/events`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createDeployRouter(): Router;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import express, {} from "express";
|
|
2
|
+
import { alpic } from "./alpic-sdk.js";
|
|
3
|
+
const errMessage = (err, fallback) => err instanceof Error ? err.message : fallback;
|
|
4
|
+
/**
|
|
5
|
+
* Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
|
|
6
|
+
* in-process (no CLI spawning): `/status` is a plain request, deploy progress
|
|
7
|
+
* streams over SSE at `/events`.
|
|
8
|
+
*/
|
|
9
|
+
export function createDeployRouter() {
|
|
10
|
+
const router = express.Router();
|
|
11
|
+
let state = { status: "idle" };
|
|
12
|
+
const subscribers = new Set();
|
|
13
|
+
const write = (res, s) => {
|
|
14
|
+
res.write(`event: state\ndata: ${JSON.stringify(s)}\n\n`);
|
|
15
|
+
};
|
|
16
|
+
const setState = (s) => {
|
|
17
|
+
state = s;
|
|
18
|
+
for (const res of subscribers) {
|
|
19
|
+
write(res, s);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const runDeploy = async (environmentId, teamId) => {
|
|
23
|
+
const startedAt = Date.now();
|
|
24
|
+
setState({ status: "deploying", startedAt, deploymentPageUrl: null });
|
|
25
|
+
let pageUrl = null;
|
|
26
|
+
try {
|
|
27
|
+
const result = await alpic.deployments.deploy({
|
|
28
|
+
environmentId,
|
|
29
|
+
teamId,
|
|
30
|
+
onProgress: (event) => {
|
|
31
|
+
if (event.type === "deploying" && event.deploymentPageUrl) {
|
|
32
|
+
pageUrl = event.deploymentPageUrl;
|
|
33
|
+
}
|
|
34
|
+
setState({
|
|
35
|
+
status: "deploying",
|
|
36
|
+
startedAt,
|
|
37
|
+
deploymentPageUrl: pageUrl,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
if (result.status === "deployed") {
|
|
42
|
+
setState({
|
|
43
|
+
status: "deployed",
|
|
44
|
+
mcpServerUrl: result.mcpServerUrl,
|
|
45
|
+
deploymentPageUrl: result.deploymentPageUrl,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
setState({
|
|
50
|
+
status: "failed",
|
|
51
|
+
message: `Deployment ${result.status}.`,
|
|
52
|
+
deploymentPageUrl: result.deploymentPageUrl,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
setState({
|
|
58
|
+
status: "failed",
|
|
59
|
+
message: errMessage(err, "Deployment failed"),
|
|
60
|
+
deploymentPageUrl: pageUrl,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
router.get("/__skybridge/deploy/status", async (_req, res) => {
|
|
65
|
+
try {
|
|
66
|
+
const whoami = await alpic.whoami();
|
|
67
|
+
if (whoami.method === "unauthenticated") {
|
|
68
|
+
res.json({ state: "signedOut" });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const loaded = alpic.projects.loadConfig();
|
|
72
|
+
const cfg = loaded && (await alpic.projects.validateLink(loaded));
|
|
73
|
+
const staleConfig = loaded !== null && cfg === null;
|
|
74
|
+
if (!cfg) {
|
|
75
|
+
const teams = await alpic.api.teams.list.v1();
|
|
76
|
+
const team = teams[0];
|
|
77
|
+
if (!team) {
|
|
78
|
+
res.json({ state: "noTeam" });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
res.json({
|
|
82
|
+
state: "needsProject",
|
|
83
|
+
teams,
|
|
84
|
+
defaultTeamId: team.id,
|
|
85
|
+
staleConfig,
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let lastDeployGit = null;
|
|
90
|
+
let lastDeployStatus;
|
|
91
|
+
let lastDeployStartedAt;
|
|
92
|
+
let mcpServerUrl;
|
|
93
|
+
let deploymentPageUrl = null;
|
|
94
|
+
if (cfg.environmentId) {
|
|
95
|
+
try {
|
|
96
|
+
const latest = await alpic.deployments.getLatestForEnvironment(cfg.environmentId);
|
|
97
|
+
if (latest.sourceCommitId !== null) {
|
|
98
|
+
lastDeployGit = {
|
|
99
|
+
ref: latest.sourceRef,
|
|
100
|
+
commitMessage: latest.sourceCommitMessage,
|
|
101
|
+
author: latest.authorUsername,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
lastDeployStatus = latest.status;
|
|
105
|
+
lastDeployStartedAt = latest.startedAt?.getTime();
|
|
106
|
+
deploymentPageUrl = latest.deploymentPageUrl;
|
|
107
|
+
if (latest.status === "deployed") {
|
|
108
|
+
const environment = await alpic.api.environments.get.v1({
|
|
109
|
+
environmentId: cfg.environmentId,
|
|
110
|
+
});
|
|
111
|
+
mcpServerUrl = environment.mcpServerUrl;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// no deployments yet — leave defaults
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
res.json({
|
|
119
|
+
state: "ready",
|
|
120
|
+
lastDeployGit,
|
|
121
|
+
lastDeployStatus,
|
|
122
|
+
lastDeployStartedAt,
|
|
123
|
+
mcpServerUrl,
|
|
124
|
+
deploymentPageUrl,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
res.status(502).json({
|
|
129
|
+
state: "error",
|
|
130
|
+
message: errMessage(err, "Alpic API unavailable"),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
router.post("/__skybridge/deploy/project", async (req, res) => {
|
|
135
|
+
if (state.status === "deploying") {
|
|
136
|
+
res.status(409).json({ message: "A deployment is already in progress." });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const name = typeof req.body?.name === "string" ? req.body.name.trim() : "";
|
|
140
|
+
const teamId = typeof req.body?.teamId === "string" ? req.body.teamId : "";
|
|
141
|
+
const teamName = typeof req.body?.teamName === "string" ? req.body.teamName : undefined;
|
|
142
|
+
if (!name || !teamId) {
|
|
143
|
+
res.status(400).json({ message: "name and teamId are required." });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const existing = await alpic.api.projects.list.v1({ teamId });
|
|
148
|
+
if (existing.some((p) => p.name === name)) {
|
|
149
|
+
res
|
|
150
|
+
.status(409)
|
|
151
|
+
.json({ message: `A project named "${name}" already exists.` });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const cfg = await alpic.projects.createLinked({
|
|
155
|
+
name,
|
|
156
|
+
teamId,
|
|
157
|
+
teamName,
|
|
158
|
+
runtime: alpic.projects.detectRuntime() ?? "node24",
|
|
159
|
+
});
|
|
160
|
+
res.status(202).json({ ok: true });
|
|
161
|
+
void runDeploy(cfg.environmentId, cfg.teamId);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
res.status(502).json({
|
|
165
|
+
message: errMessage(err, "Failed to create project"),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
router.post("/__skybridge/deploy/login", async (_req, res) => {
|
|
170
|
+
try {
|
|
171
|
+
await alpic.auth.login();
|
|
172
|
+
res.json({ ok: true });
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
res.status(502).json({
|
|
176
|
+
message: errMessage(err, "Sign-in failed"),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
router.post("/__skybridge/deploy", (_req, res) => {
|
|
181
|
+
if (state.status === "deploying") {
|
|
182
|
+
res.status(409).json({ message: "A deployment is already in progress." });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const cfg = alpic.projects.loadConfig();
|
|
186
|
+
if (!cfg?.environmentId) {
|
|
187
|
+
res.status(409).json({ message: "No linked project to redeploy." });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
res.status(202).json({ ok: true });
|
|
191
|
+
void runDeploy(cfg.environmentId, cfg.teamId);
|
|
192
|
+
});
|
|
193
|
+
router.get("/__skybridge/deploy/events", (req, res) => {
|
|
194
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
195
|
+
res.setHeader("Cache-Control", "no-cache, no-transform");
|
|
196
|
+
res.setHeader("Connection", "keep-alive");
|
|
197
|
+
res.flushHeaders?.();
|
|
198
|
+
write(res, state);
|
|
199
|
+
subscribers.add(res);
|
|
200
|
+
req.on("close", () => {
|
|
201
|
+
subscribers.delete(res);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
return router;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=deploy-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-router.js","sourceRoot":"","sources":["../src/deploy-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
3
|
import cors from "cors";
|
|
4
4
|
import express, {} from "express";
|
|
5
|
+
import { createDeployRouter } from "./deploy-router.js";
|
|
5
6
|
const detectPackageManager = () => {
|
|
6
7
|
const userAgent = process.env.npm_config_user_agent ?? "";
|
|
7
8
|
if (userAgent.startsWith("pnpm")) {
|
|
@@ -36,6 +37,7 @@ export const devtoolsStaticServer = async () => {
|
|
|
36
37
|
router.get("/__skybridge/devtools/project", (_req, res) => {
|
|
37
38
|
res.json({ packageManager: detectPackageManager() });
|
|
38
39
|
});
|
|
40
|
+
router.use(createDeployRouter());
|
|
39
41
|
router.use(express.static(distDir));
|
|
40
42
|
router.get("/", (_req, res, next) => {
|
|
41
43
|
const indexHtmlPath = path.join(distDir, "index.html");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtoolsStaticServer.js","sourceRoot":"","sources":["../src/devtoolsStaticServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"devtoolsStaticServer.js","sourceRoot":"","sources":["../src/devtoolsStaticServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,oBAAoB,GAAG,GAAmB,EAAE;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC1D,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAqB,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
package/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Skybridge MCP devtools</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-R5erQwQK.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DAVIy1qN.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/dist/skybridge.svg
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Skybridge</title>
|
|
2
3
|
<g clip-path="url(#clip0_3933_970)">
|
|
3
4
|
<mask id="mask0_3933_970" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="90" height="90">
|
|
4
5
|
<path d="M90 0H0V90H90V0Z" fill="white"/>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skybridge/devtools",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,68 +16,70 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
+
"@alpic-ai/sdk": "^1.155.0",
|
|
19
20
|
"@t3-oss/env-core": "^0.13.11",
|
|
20
21
|
"cors": "^2.8.6",
|
|
21
22
|
"express": "^5.2.1",
|
|
22
|
-
"zod": "^4.3
|
|
23
|
+
"zod": "^4.4.3"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@alpic-ai/ui": "^1.
|
|
26
|
-
"@base-ui/react": "^1.
|
|
27
|
-
"@fontsource-variable/jetbrains-mono": "^5.
|
|
26
|
+
"@alpic-ai/ui": "^1.155.0",
|
|
27
|
+
"@base-ui/react": "^1.6.0",
|
|
28
|
+
"@fontsource-variable/jetbrains-mono": "^5.3.0",
|
|
28
29
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
29
|
-
"@playwright/test": "^1.
|
|
30
|
-
"@radix-ui/react-accordion": "^1.2.
|
|
31
|
-
"@radix-ui/react-tooltip": "^1.2.
|
|
32
|
-
"@rjsf/core": "^6.
|
|
33
|
-
"@rjsf/shadcn": "^6.
|
|
34
|
-
"@rjsf/utils": "^6.
|
|
35
|
-
"@rjsf/validator-ajv8": "^6.
|
|
36
|
-
"@tailwindcss/vite": "^4.
|
|
37
|
-
"@tanstack/react-query": "^5.
|
|
30
|
+
"@playwright/test": "^1.61.1",
|
|
31
|
+
"@radix-ui/react-accordion": "^1.2.16",
|
|
32
|
+
"@radix-ui/react-tooltip": "^1.2.12",
|
|
33
|
+
"@rjsf/core": "^6.7.0",
|
|
34
|
+
"@rjsf/shadcn": "^6.7.0",
|
|
35
|
+
"@rjsf/utils": "^6.7.0",
|
|
36
|
+
"@rjsf/validator-ajv8": "^6.7.0",
|
|
37
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
38
|
+
"@tanstack/react-query": "^5.101.2",
|
|
38
39
|
"@total-typescript/tsconfig": "^1.0.4",
|
|
39
40
|
"@types/cors": "^2.8.19",
|
|
40
41
|
"@types/express": "^5.0.6",
|
|
41
42
|
"@types/lodash-es": "^4.17.12",
|
|
42
|
-
"@types/react": "^19.2.
|
|
43
|
+
"@types/react": "^19.2.17",
|
|
43
44
|
"@types/react-dom": "^19.2.3",
|
|
44
45
|
"@types/react-syntax-highlighter": "^15.5.13",
|
|
45
|
-
"@vitejs/plugin-react": "^6.0.
|
|
46
|
+
"@vitejs/plugin-react": "^6.0.3",
|
|
46
47
|
"ahooks": "^3.9.7",
|
|
47
|
-
"autoprefixer": "^10.4
|
|
48
|
+
"autoprefixer": "^10.5.4",
|
|
48
49
|
"class-variance-authority": "^0.7.1",
|
|
49
50
|
"clsx": "^2.1.1",
|
|
50
51
|
"cmdk": "^1.1.1",
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"react": "^19.2.
|
|
58
|
-
"react-
|
|
59
|
-
"react-resizable-panels": "^4.11.0",
|
|
52
|
+
"lodash-es": "^4.18.1",
|
|
53
|
+
"lucide-react": "^1.25.0",
|
|
54
|
+
"motion": "^12.42.2",
|
|
55
|
+
"nuqs": "^2.9.1",
|
|
56
|
+
"postcss": "^8.5.19",
|
|
57
|
+
"react": "^19.2.7",
|
|
58
|
+
"react-dom": "^19.2.7",
|
|
59
|
+
"react-resizable-panels": "^4.12.2",
|
|
60
60
|
"react-syntax-highlighter": "^16.1.1",
|
|
61
|
-
"shadcn": "^4.
|
|
62
|
-
"shiki": "^4.
|
|
63
|
-
"tailwind-merge": "^3.
|
|
64
|
-
"tailwindcss": "^4.
|
|
61
|
+
"shadcn": "^4.13.1",
|
|
62
|
+
"shiki": "^4.3.1",
|
|
63
|
+
"tailwind-merge": "^3.6.0",
|
|
64
|
+
"tailwindcss": "^4.3.3",
|
|
65
65
|
"tailwindcss-animate": "^1.0.7",
|
|
66
|
-
"tsx": "^4.
|
|
66
|
+
"tsx": "^4.23.1",
|
|
67
67
|
"tw-animate-css": "^1.4.0",
|
|
68
|
-
"typescript": "~6.0.
|
|
69
|
-
"vite": "^8.
|
|
70
|
-
"
|
|
71
|
-
"
|
|
68
|
+
"typescript": "~6.0.3",
|
|
69
|
+
"vite": "^8.1.5",
|
|
70
|
+
"vitest": "^4.1.10",
|
|
71
|
+
"zustand": "^5.0.14",
|
|
72
|
+
"skybridge": "1.3.0"
|
|
72
73
|
},
|
|
73
74
|
"scripts": {
|
|
74
75
|
"dev": "vite",
|
|
75
76
|
"build": "tsc -b && vite build && pnpm run build:server",
|
|
76
77
|
"build:server": "tsc -p tsconfig.server.json",
|
|
77
|
-
"test": "pnpm run test:format && pnpm run test:types",
|
|
78
|
+
"test": "pnpm run test:format && pnpm run test:types && pnpm run test:unit",
|
|
78
79
|
"format": "biome check --write --error-on-warnings",
|
|
79
80
|
"test:format": "biome ci",
|
|
80
81
|
"test:types": "tsc --noEmit -p e2e/tsconfig.json",
|
|
82
|
+
"test:unit": "vitest run",
|
|
81
83
|
"preview": "vite preview",
|
|
82
84
|
"e2e:fixture": "tsx ./e2e/fixtures/server.ts",
|
|
83
85
|
"test:e2e": "playwright test --config e2e/playwright.config.ts",
|