@typed-assistant/builder 0.0.74 → 0.0.76
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/CHANGELOG.md +4 -4
- package/package.json +11 -8
- package/src/pullChanges.tsx +1 -1
- package/src/setupWebserver.tsx +17 -1
- package/src/webserver/Logs.tsx +14 -4
- package/src/webserver/logStore.tsx +10 -2
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typed-assistant/builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.76",
|
|
4
4
|
"exports": {
|
|
5
5
|
"./appProcess": "./src/appProcess.tsx",
|
|
6
6
|
"./bunInstall": "./src/bunInstall.tsx",
|
|
7
7
|
"./pullChanges": "./src/pullChanges.tsx"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"
|
|
11
|
-
"@elysiajs/eden": "^0.8.1",
|
|
12
|
-
"elysia": "^0.8.9",
|
|
10
|
+
"@elysiajs/eden": "^1.1.3",
|
|
13
11
|
"@mdi/svg": "^7.3.67",
|
|
12
|
+
"@types/react": "^18.3.12",
|
|
13
|
+
"@types/react-dom": "^18.3.1",
|
|
14
|
+
"ansi-to-html": "^0.7.2",
|
|
15
|
+
"debounce": "^2.0.0",
|
|
16
|
+
"elysia": "^1.1.25",
|
|
14
17
|
"ignore": "^5.3.0",
|
|
15
18
|
"react": "^18",
|
|
16
19
|
"react-dom": "^18",
|
|
@@ -18,18 +21,18 @@
|
|
|
18
21
|
"zod": "^3.22.4"
|
|
19
22
|
},
|
|
20
23
|
"devDependencies": {
|
|
21
|
-
"@types/node": "^20.10.6",
|
|
22
24
|
"@types/eslint": "^8.56.1",
|
|
23
|
-
"
|
|
25
|
+
"@types/node": "^20.10.6",
|
|
26
|
+
"bun-types": "^1.0.2",
|
|
24
27
|
"eslint": "^8.56.0",
|
|
28
|
+
"eslint-plugin-html": "^7.1.0",
|
|
25
29
|
"ts-toolbelt": "^9.6.0",
|
|
26
|
-
"typescript": "^5.
|
|
30
|
+
"typescript": "^5.4.0",
|
|
27
31
|
"@typed-assistant/eslint-config": "0.0.10",
|
|
28
32
|
"@typed-assistant/logger": "0.0.21",
|
|
29
33
|
"@typed-assistant/utils": "0.0.18",
|
|
30
34
|
"@typed-assistant/typescript-config": "0.0.10"
|
|
31
35
|
},
|
|
32
|
-
"peerDependencies": {},
|
|
33
36
|
"publishConfig": {
|
|
34
37
|
"access": "public",
|
|
35
38
|
"registry": "https://registry.npmjs.org/"
|
package/src/pullChanges.tsx
CHANGED
|
@@ -8,7 +8,7 @@ export const pullChanges = async ({
|
|
|
8
8
|
onChangesPulled: () => void
|
|
9
9
|
}) => {
|
|
10
10
|
logger.debug({ emoji: "⬇️" }, "Pulling changes...")
|
|
11
|
-
const { exitCode, stderr, stdout } = await $`git pull`.quiet()
|
|
11
|
+
const { exitCode, stderr, stdout } = await $`git pull`.nothrow().quiet()
|
|
12
12
|
if (exitCode) {
|
|
13
13
|
logger.error(
|
|
14
14
|
{ additionalDetails: stderr.toString().trim(), emoji: "⬇️🚨" },
|
package/src/setupWebserver.tsx
CHANGED
|
@@ -204,11 +204,16 @@ export const startWebappServer = async ({
|
|
|
204
204
|
.get(
|
|
205
205
|
"/log.txt",
|
|
206
206
|
async ({ query }) => {
|
|
207
|
-
return getLogsFromFile({
|
|
207
|
+
return getLogsFromFile({
|
|
208
|
+
level: "trace",
|
|
209
|
+
limit: query.limit,
|
|
210
|
+
filter: query.filter,
|
|
211
|
+
})
|
|
208
212
|
},
|
|
209
213
|
{
|
|
210
214
|
query: t.Object({
|
|
211
215
|
limit: t.Optional(t.String()),
|
|
216
|
+
filter: t.Optional(t.String()),
|
|
212
217
|
}),
|
|
213
218
|
},
|
|
214
219
|
)
|
|
@@ -224,11 +229,13 @@ export const startWebappServer = async ({
|
|
|
224
229
|
t.Literal("fatal"),
|
|
225
230
|
]),
|
|
226
231
|
offset: t.Optional(t.String()),
|
|
232
|
+
filter: t.Optional(t.String()),
|
|
227
233
|
}),
|
|
228
234
|
|
|
229
235
|
async open(ws) {
|
|
230
236
|
ws.send(
|
|
231
237
|
await getLogsFromFile({
|
|
238
|
+
filter: ws.data.query.filter,
|
|
232
239
|
level: ws.data.query.level,
|
|
233
240
|
limit: ws.data.query.limit,
|
|
234
241
|
offset: ws.data.query.offset,
|
|
@@ -237,6 +244,7 @@ export const startWebappServer = async ({
|
|
|
237
244
|
logSubscribers.set(ws.id, async () => {
|
|
238
245
|
ws.send(
|
|
239
246
|
await getLogsFromFile({
|
|
247
|
+
filter: ws.data.query.filter,
|
|
240
248
|
level: ws.data.query.level,
|
|
241
249
|
limit: ws.data.query.limit,
|
|
242
250
|
offset: ws.data.query.offset,
|
|
@@ -343,10 +351,12 @@ const getLogsFromFile = async ({
|
|
|
343
351
|
level,
|
|
344
352
|
limit: limitProp,
|
|
345
353
|
offset: offsetProp = "0",
|
|
354
|
+
filter,
|
|
346
355
|
}: {
|
|
347
356
|
level: keyof typeof levels
|
|
348
357
|
limit?: string
|
|
349
358
|
offset?: string
|
|
359
|
+
filter?: string
|
|
350
360
|
}) => {
|
|
351
361
|
try {
|
|
352
362
|
const limit = Number(limitProp)
|
|
@@ -360,6 +370,12 @@ const getLogsFromFile = async ({
|
|
|
360
370
|
: { msg: "Empty line", level: levels.fatal }) as LogSchema,
|
|
361
371
|
)
|
|
362
372
|
.filter((log) => log.level >= levels[level])
|
|
373
|
+
.filter((log) => {
|
|
374
|
+
if (!filter) return true
|
|
375
|
+
const keywords = filter.toLowerCase().split(" ")
|
|
376
|
+
const logText = JSON.stringify(log).toLowerCase()
|
|
377
|
+
return keywords.every((keyword) => logText.includes(keyword))
|
|
378
|
+
})
|
|
363
379
|
|
|
364
380
|
const logFile = limit
|
|
365
381
|
? lines.slice(
|
package/src/webserver/Logs.tsx
CHANGED
|
@@ -10,7 +10,8 @@ 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, offset, setOffset, ws } =
|
|
13
|
+
const { level, setLevel, logs, offset, setOffset, ws, filter, setFilter } =
|
|
14
|
+
useLogStore()
|
|
14
15
|
|
|
15
16
|
return (
|
|
16
17
|
<>
|
|
@@ -21,9 +22,18 @@ export const Logs = ({ basePath }: { basePath: string }) => {
|
|
|
21
22
|
Logs <WSIndicator ws={ws?.ws} />
|
|
22
23
|
</h2>
|
|
23
24
|
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
<div className="flex gap-2 mb-2">
|
|
26
|
+
<a className={buttonStyle} href={`${basePath}/log.txt?limit=500`}>
|
|
27
|
+
View raw log.txt
|
|
28
|
+
</a>
|
|
29
|
+
<input
|
|
30
|
+
type="search"
|
|
31
|
+
placeholder="Filter logs..."
|
|
32
|
+
className="border border-gray-300 rounded-md text-slate-800 px-2 flex-grow placeholder:text-slate-700"
|
|
33
|
+
value={filter}
|
|
34
|
+
onChange={(e) => setFilter(e.target.value)}
|
|
35
|
+
/>
|
|
36
|
+
</div>
|
|
27
37
|
|
|
28
38
|
<div className="flex flex-wrap gap-2 justify-between w-full items-end">
|
|
29
39
|
<div className="flex flex-wrap gap-2">
|
|
@@ -16,14 +16,18 @@ export const getLogStore = ({
|
|
|
16
16
|
level,
|
|
17
17
|
limit,
|
|
18
18
|
offset,
|
|
19
|
+
filter,
|
|
19
20
|
}: {
|
|
20
21
|
level: keyof typeof levels
|
|
21
22
|
limit: string
|
|
22
23
|
offset: string
|
|
24
|
+
filter: string
|
|
23
25
|
}) => ({
|
|
24
26
|
subscribe: (listener: () => void) => {
|
|
25
27
|
listeners = [...listeners, listener]
|
|
26
|
-
const ws = app.logsws.subscribe({
|
|
28
|
+
const ws = app.logsws.subscribe({
|
|
29
|
+
$query: { level, limit, offset, filter },
|
|
30
|
+
})
|
|
27
31
|
logStore = {
|
|
28
32
|
logs: [],
|
|
29
33
|
ws,
|
|
@@ -67,14 +71,16 @@ export const useLogStore = () => {
|
|
|
67
71
|
"trace" | "debug" | "info" | "warn" | "error" | "fatal"
|
|
68
72
|
>("info")
|
|
69
73
|
const [offset, setOffset] = useState(0)
|
|
74
|
+
const [filter, setFilter] = useState("")
|
|
70
75
|
const logStore = useMemo(
|
|
71
76
|
() =>
|
|
72
77
|
getLogStore({
|
|
73
78
|
level,
|
|
74
79
|
limit: limit.toString(),
|
|
75
80
|
offset: offset.toString(),
|
|
81
|
+
filter,
|
|
76
82
|
}),
|
|
77
|
-
[level, limit, offset],
|
|
83
|
+
[level, limit, offset, filter],
|
|
78
84
|
)
|
|
79
85
|
const { logs, ws } = useSyncExternalStore(
|
|
80
86
|
logStore.subscribe,
|
|
@@ -89,6 +95,8 @@ export const useLogStore = () => {
|
|
|
89
95
|
logs,
|
|
90
96
|
offset,
|
|
91
97
|
setOffset,
|
|
98
|
+
filter,
|
|
99
|
+
setFilter,
|
|
92
100
|
ws,
|
|
93
101
|
}
|
|
94
102
|
}
|