@typed-assistant/builder 0.0.70 → 0.0.72
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/package.json +4 -4
- package/src/getAddonInfo.tsx +1 -1
- package/src/killProcess.tsx +0 -1
- package/src/setupWebserver.tsx +30 -5
- package/src/webserver/Logs.tsx +54 -42
- package/src/webserver/Terminal.tsx +4 -54
- package/src/webserver/logStore.tsx +14 -6
- package/tsconfig.json +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typed-assistant/builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.72",
|
|
4
4
|
"exports": {
|
|
5
5
|
"./appProcess": "./src/appProcess.tsx",
|
|
6
6
|
"./bunInstall": "./src/bunInstall.tsx",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"ts-toolbelt": "^9.6.0",
|
|
26
26
|
"typescript": "^5.3.3",
|
|
27
27
|
"@typed-assistant/eslint-config": "0.0.10",
|
|
28
|
-
"@typed-assistant/logger": "0.0.
|
|
29
|
-
"@typed-assistant/
|
|
30
|
-
"@typed-assistant/
|
|
28
|
+
"@typed-assistant/logger": "0.0.21",
|
|
29
|
+
"@typed-assistant/typescript-config": "0.0.10",
|
|
30
|
+
"@typed-assistant/utils": "0.0.18"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {},
|
|
33
33
|
"publishConfig": {
|
package/src/getAddonInfo.tsx
CHANGED
package/src/killProcess.tsx
CHANGED
package/src/setupWebserver.tsx
CHANGED
|
@@ -204,7 +204,7 @@ export const startWebappServer = async ({
|
|
|
204
204
|
.get(
|
|
205
205
|
"/log.txt",
|
|
206
206
|
async ({ query }) => {
|
|
207
|
-
return getLogsFromFile("trace", query.limit)
|
|
207
|
+
return getLogsFromFile({ level: "trace", limit: query.limit })
|
|
208
208
|
},
|
|
209
209
|
{
|
|
210
210
|
query: t.Object({
|
|
@@ -223,12 +223,24 @@ export const startWebappServer = async ({
|
|
|
223
223
|
t.Literal("error"),
|
|
224
224
|
t.Literal("fatal"),
|
|
225
225
|
]),
|
|
226
|
+
offset: t.Optional(t.String()),
|
|
226
227
|
}),
|
|
228
|
+
|
|
227
229
|
async open(ws) {
|
|
228
|
-
ws.send(
|
|
230
|
+
ws.send(
|
|
231
|
+
await getLogsFromFile({
|
|
232
|
+
level: ws.data.query.level,
|
|
233
|
+
limit: ws.data.query.limit,
|
|
234
|
+
offset: ws.data.query.offset,
|
|
235
|
+
}),
|
|
236
|
+
)
|
|
229
237
|
logSubscribers.set(ws.id, async () => {
|
|
230
238
|
ws.send(
|
|
231
|
-
await getLogsFromFile(
|
|
239
|
+
await getLogsFromFile({
|
|
240
|
+
level: ws.data.query.level,
|
|
241
|
+
limit: ws.data.query.limit,
|
|
242
|
+
offset: ws.data.query.offset,
|
|
243
|
+
}),
|
|
232
244
|
)
|
|
233
245
|
})
|
|
234
246
|
},
|
|
@@ -327,8 +339,18 @@ export const startWebappServer = async ({
|
|
|
327
339
|
|
|
328
340
|
export type WebServer = Awaited<ReturnType<typeof startWebappServer>>
|
|
329
341
|
|
|
330
|
-
const getLogsFromFile = async (
|
|
342
|
+
const getLogsFromFile = async ({
|
|
343
|
+
level,
|
|
344
|
+
limit: limitProp,
|
|
345
|
+
offset: offsetProp = "0",
|
|
346
|
+
}: {
|
|
347
|
+
level: keyof typeof levels
|
|
348
|
+
limit?: string
|
|
349
|
+
offset?: string
|
|
350
|
+
}) => {
|
|
331
351
|
try {
|
|
352
|
+
const limit = Number(limitProp)
|
|
353
|
+
const offset = Number(offsetProp)
|
|
332
354
|
const lines = (await Bun.file("./log.txt").text())
|
|
333
355
|
.split("\n")
|
|
334
356
|
.map(
|
|
@@ -340,7 +362,10 @@ const getLogsFromFile = async (level: keyof typeof levels, limit?: string) => {
|
|
|
340
362
|
.filter((log) => log.level >= levels[level])
|
|
341
363
|
|
|
342
364
|
const logFile = limit
|
|
343
|
-
? lines.slice(
|
|
365
|
+
? lines.slice(
|
|
366
|
+
lines.length - 1 - limit * (offset + 1),
|
|
367
|
+
lines.length - 1 - limit * offset,
|
|
368
|
+
)
|
|
344
369
|
: lines
|
|
345
370
|
|
|
346
371
|
return { logs: logFile }
|
package/src/webserver/Logs.tsx
CHANGED
|
@@ -10,8 +10,7 @@ export const Logs = ({ basePath }: { basePath: string }) => {
|
|
|
10
10
|
const [dateTimeVisibility, setDateTimeVisibility] = useState<
|
|
11
11
|
"hidden" | "timeOnly" | "visible"
|
|
12
12
|
>("timeOnly")
|
|
13
|
-
const { level, setLevel, logs, ws } = useLogStore()
|
|
14
|
-
console.log("😅😅😅 ~ logs:", logs)
|
|
13
|
+
const { level, setLevel, logs, offset, setOffset, ws } = useLogStore()
|
|
15
14
|
|
|
16
15
|
return (
|
|
17
16
|
<>
|
|
@@ -26,50 +25,63 @@ export const Logs = ({ basePath }: { basePath: string }) => {
|
|
|
26
25
|
View raw log.txt
|
|
27
26
|
</a>
|
|
28
27
|
|
|
29
|
-
<div className="flex flex-wrap gap-2">
|
|
30
|
-
<div className="flex gap-2">
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
28
|
+
<div className="flex flex-wrap gap-2 justify-between w-full items-end">
|
|
29
|
+
<div className="flex flex-wrap gap-2">
|
|
30
|
+
<div className="">
|
|
31
|
+
<label className="block mb-1" htmlFor="dateTimeVisibility">
|
|
32
|
+
Date/Time
|
|
33
|
+
</label>
|
|
34
|
+
<select
|
|
35
|
+
className="border border-gray-300 rounded-md text-slate-800 px-2"
|
|
36
|
+
id="dateTimeVisibility"
|
|
37
|
+
onChange={(e) =>
|
|
38
|
+
setDateTimeVisibility(
|
|
39
|
+
e.target.value as typeof dateTimeVisibility,
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
value={dateTimeVisibility}
|
|
43
|
+
>
|
|
44
|
+
<option value="hidden">Hidden</option>
|
|
45
|
+
<option value="timeOnly">Time only</option>
|
|
46
|
+
<option value="visible">Visible</option>
|
|
47
|
+
</select>
|
|
48
|
+
</div>
|
|
49
|
+
<div className="">
|
|
50
|
+
<label className="block mb-1" htmlFor="level">
|
|
51
|
+
Level
|
|
52
|
+
</label>
|
|
53
|
+
<select
|
|
54
|
+
className="border border-gray-300 rounded-md text-slate-800 px-2"
|
|
55
|
+
id="level"
|
|
56
|
+
onChange={(e) => setLevel(e.target.value as typeof level)}
|
|
57
|
+
value={level}
|
|
58
|
+
>
|
|
59
|
+
<option value="trace">Trace</option>
|
|
60
|
+
<option value="debug">Debug</option>
|
|
61
|
+
<option value="info">Info</option>
|
|
62
|
+
<option value="warn">Warn</option>
|
|
63
|
+
<option value="error">Error</option>
|
|
64
|
+
<option value="fatal">Fatal</option>
|
|
65
|
+
</select>
|
|
66
|
+
</div>
|
|
46
67
|
</div>
|
|
68
|
+
|
|
47
69
|
<div className="flex gap-2">
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
70
|
+
{offset > 0 && (
|
|
71
|
+
<button
|
|
72
|
+
className={buttonStyle}
|
|
73
|
+
onClick={() => setOffset((offset) => offset - 1)}
|
|
74
|
+
>
|
|
75
|
+
Previous
|
|
76
|
+
</button>
|
|
77
|
+
)}
|
|
78
|
+
<button
|
|
79
|
+
className={buttonStyle}
|
|
80
|
+
onClick={() => setOffset((offset) => offset + 1)}
|
|
54
81
|
>
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
<option value="info">Info</option>
|
|
58
|
-
<option value="warn">Warn</option>
|
|
59
|
-
<option value="error">Error</option>
|
|
60
|
-
<option value="fatal">Fatal</option>
|
|
61
|
-
</select>
|
|
82
|
+
Next
|
|
83
|
+
</button>
|
|
62
84
|
</div>
|
|
63
|
-
{/* <div className="flex gap-2">
|
|
64
|
-
<label htmlFor="limit">Limit</label>
|
|
65
|
-
<input
|
|
66
|
-
className="border border-gray-300 rounded-md text-slate-800 px-2"
|
|
67
|
-
id="limit"
|
|
68
|
-
onChange={(e) => setLimit(Number(e.target.value))}
|
|
69
|
-
size={8}
|
|
70
|
-
value={limit}
|
|
71
|
-
/>
|
|
72
|
-
</div> */}
|
|
73
85
|
</div>
|
|
74
86
|
</>
|
|
75
87
|
)}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from "react"
|
|
2
|
-
import {
|
|
3
|
-
import { useWS } from "./useWS"
|
|
4
|
-
import { WSIndicator } from "./WSIndicator"
|
|
2
|
+
import { twMerge } from "tailwind-merge"
|
|
5
3
|
import { AppSection } from "./AppSection"
|
|
4
|
+
import { WSIndicator } from "./WSIndicator"
|
|
5
|
+
import { app } from "./api"
|
|
6
6
|
import { buttonStyle } from "./styles"
|
|
7
|
-
import {
|
|
7
|
+
import { useWS } from "./useWS"
|
|
8
8
|
|
|
9
9
|
type ButtonAsyncProps = {
|
|
10
10
|
onClick: () => Promise<{ error?: unknown }>
|
|
@@ -116,53 +116,3 @@ export function Terminal() {
|
|
|
116
116
|
</AppSection>
|
|
117
117
|
)
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
const RestartAppButton = () => {
|
|
121
|
-
const [state, setState] = useState<"idle" | "loading" | "error" | "success">(
|
|
122
|
-
"idle",
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
useEffect(() => {
|
|
126
|
-
if (state !== "loading" && state !== "idle") {
|
|
127
|
-
const timeout = setTimeout(() => setState("idle"), 2000)
|
|
128
|
-
|
|
129
|
-
return () => {
|
|
130
|
-
clearTimeout(timeout)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}, [state])
|
|
134
|
-
|
|
135
|
-
const onClick = async () => {
|
|
136
|
-
if (state !== "idle") return
|
|
137
|
-
setState("loading")
|
|
138
|
-
|
|
139
|
-
const { data, error } = await app["restart-app"].get()
|
|
140
|
-
|
|
141
|
-
if (error) {
|
|
142
|
-
setState("error")
|
|
143
|
-
return
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
setState("success")
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return (
|
|
150
|
-
<button
|
|
151
|
-
className={twMerge(
|
|
152
|
-
buttonStyle,
|
|
153
|
-
state === "loading" && "bg-blue-500",
|
|
154
|
-
state === "error" && "bg-red-500",
|
|
155
|
-
state === "success" && "bg-green-500",
|
|
156
|
-
)}
|
|
157
|
-
onClick={onClick}
|
|
158
|
-
>
|
|
159
|
-
{state === "loading"
|
|
160
|
-
? "Restarting app..."
|
|
161
|
-
: state === "error"
|
|
162
|
-
? "Error restarting app"
|
|
163
|
-
: state === "success"
|
|
164
|
-
? "App restarted"
|
|
165
|
-
: "Restart app"}
|
|
166
|
-
</button>
|
|
167
|
-
)
|
|
168
|
-
}
|
|
@@ -15,22 +15,22 @@ let logStore = {
|
|
|
15
15
|
export const getLogStore = ({
|
|
16
16
|
level,
|
|
17
17
|
limit,
|
|
18
|
+
offset,
|
|
18
19
|
}: {
|
|
19
20
|
level: keyof typeof levels
|
|
20
21
|
limit: string
|
|
22
|
+
offset: string
|
|
21
23
|
}) => ({
|
|
22
24
|
subscribe: (listener: () => void) => {
|
|
23
25
|
listeners = [...listeners, listener]
|
|
24
|
-
const ws = app.logsws.subscribe({
|
|
25
|
-
$query: { level, limit },
|
|
26
|
-
})
|
|
26
|
+
const ws = app.logsws.subscribe({ $query: { level, limit, offset } })
|
|
27
27
|
logStore = {
|
|
28
28
|
logs: [],
|
|
29
29
|
ws,
|
|
30
30
|
}
|
|
31
31
|
emitChange()
|
|
32
32
|
|
|
33
|
-
ws.on("open", (
|
|
33
|
+
ws.on("open", () => {
|
|
34
34
|
logStore = {
|
|
35
35
|
logs: logStore.logs,
|
|
36
36
|
ws: logStore.ws,
|
|
@@ -66,9 +66,15 @@ export const useLogStore = () => {
|
|
|
66
66
|
const [level, setLevel] = useState<
|
|
67
67
|
"trace" | "debug" | "info" | "warn" | "error" | "fatal"
|
|
68
68
|
>("info")
|
|
69
|
+
const [offset, setOffset] = useState(0)
|
|
69
70
|
const logStore = useMemo(
|
|
70
|
-
() =>
|
|
71
|
-
|
|
71
|
+
() =>
|
|
72
|
+
getLogStore({
|
|
73
|
+
level,
|
|
74
|
+
limit: limit.toString(),
|
|
75
|
+
offset: offset.toString(),
|
|
76
|
+
}),
|
|
77
|
+
[level, limit, offset],
|
|
72
78
|
)
|
|
73
79
|
const { logs, ws } = useSyncExternalStore(
|
|
74
80
|
logStore.subscribe,
|
|
@@ -81,6 +87,8 @@ export const useLogStore = () => {
|
|
|
81
87
|
level,
|
|
82
88
|
setLevel,
|
|
83
89
|
logs,
|
|
90
|
+
offset,
|
|
91
|
+
setOffset,
|
|
84
92
|
ws,
|
|
85
93
|
}
|
|
86
94
|
}
|
package/tsconfig.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"extends": "@typed-assistant/typescript-config/react.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"paths": {
|
|
5
|
-
"@elysiajs/eden": ["./node_modules/@elysiajs/eden/"]
|
|
6
|
-
}
|
|
5
|
+
"@elysiajs/eden": ["./node_modules/@elysiajs/eden/"]
|
|
6
|
+
}
|
|
7
7
|
},
|
|
8
8
|
"include": ["src"],
|
|
9
|
-
"exclude": ["node_modules", "dist"]
|
|
9
|
+
"exclude": ["node_modules", "dist"]
|
|
10
10
|
}
|