@typed-assistant/builder 0.0.86 → 0.0.87
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 +7 -0
- package/package.json +3 -3
- package/src/setupWebserver.tsx +45 -26
- package/src/webserver/Logs.tsx +19 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @typed-assistant/builder
|
|
2
2
|
|
|
3
|
+
## 0.0.87
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Apply search filters before paginating logs so filtered results span all pages.
|
|
8
|
+
- Hide the Next pagination button entirely when no additional log pages are available.
|
|
9
|
+
|
|
3
10
|
## 0.0.86
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typed-assistant/builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.87",
|
|
4
4
|
"exports": {
|
|
5
5
|
"./appProcess": "./src/appProcess.tsx",
|
|
6
6
|
"./bunInstall": "./src/bunInstall.tsx",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"typescript": "^5.4.0",
|
|
31
31
|
"@typed-assistant/eslint-config": "0.0.10",
|
|
32
32
|
"@typed-assistant/logger": "0.0.22",
|
|
33
|
-
"@typed-assistant/
|
|
34
|
-
"@typed-assistant/
|
|
33
|
+
"@typed-assistant/utils": "0.0.19",
|
|
34
|
+
"@typed-assistant/typescript-config": "0.0.11"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public",
|
package/src/setupWebserver.tsx
CHANGED
|
@@ -427,33 +427,52 @@ const getLogsFromFile = async ({
|
|
|
427
427
|
filter?: string
|
|
428
428
|
}) => {
|
|
429
429
|
try {
|
|
430
|
-
const
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
430
|
+
const parsedLimit = Number(limitProp)
|
|
431
|
+
const limit = Number.isFinite(parsedLimit) && parsedLimit > 0
|
|
432
|
+
? parsedLimit
|
|
433
|
+
: undefined
|
|
434
|
+
const parsedOffset = Number(offsetProp)
|
|
435
|
+
const offset = Number.isFinite(parsedOffset) && parsedOffset >= 0
|
|
436
|
+
? parsedOffset
|
|
437
|
+
: 0
|
|
438
|
+
|
|
439
|
+
const normalizedFilter = filter?.toLowerCase().trim()
|
|
440
|
+
|
|
441
|
+
const parsedLogs = (await Bun.file("./log.txt").text())
|
|
442
|
+
.split("\n")
|
|
443
|
+
.reduce((result, line) => {
|
|
444
|
+
if (!line) return result
|
|
445
|
+
|
|
446
|
+
try {
|
|
447
|
+
const log = JSON.parse(line) as LogSchema
|
|
448
|
+
return result.concat(log)
|
|
449
|
+
} catch (e) {
|
|
450
|
+
return result.concat({
|
|
451
|
+
msg: e instanceof Error ? e.message : "Unknown parse error",
|
|
452
|
+
level: levels.fatal,
|
|
453
|
+
})
|
|
454
|
+
}
|
|
455
|
+
}, [] as LogSchema[])
|
|
456
|
+
|
|
457
|
+
const filteredLogs = parsedLogs.filter((log) => {
|
|
458
|
+
if (log.level < levels[level]) return false
|
|
459
|
+
|
|
460
|
+
if (normalizedFilter) {
|
|
461
|
+
const haystack = JSON.stringify(log).toLowerCase()
|
|
462
|
+
if (!haystack.includes(normalizedFilter)) return false
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
return true
|
|
466
|
+
})
|
|
467
|
+
|
|
468
|
+
const paginatedLogs = limit
|
|
469
|
+
? filteredLogs.slice(
|
|
470
|
+
Math.max(filteredLogs.length - limit * (offset + 1), 0),
|
|
471
|
+
filteredLogs.length - limit * offset || filteredLogs.length,
|
|
444
472
|
)
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
const log = line
|
|
450
|
-
? JSON.parse(line)
|
|
451
|
-
: { msg: "Empty line", level: levels.fatal }
|
|
452
|
-
if (log.level < levels[level]) return result
|
|
453
|
-
return result.concat(log)
|
|
454
|
-
}, [] as LogSchema[])
|
|
455
|
-
|
|
456
|
-
return { logs }
|
|
473
|
+
: filteredLogs
|
|
474
|
+
|
|
475
|
+
return { logs: paginatedLogs }
|
|
457
476
|
} catch (e) {
|
|
458
477
|
return {
|
|
459
478
|
logs: [
|
package/src/webserver/Logs.tsx
CHANGED
|
@@ -10,9 +10,11 @@ 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, filter, setFilter } =
|
|
13
|
+
const { level, setLevel, logs, offset, setOffset, ws, filter, setFilter, limit } =
|
|
14
14
|
useLogStore()
|
|
15
15
|
|
|
16
|
+
const hasNextPage = limit ? logs.length >= limit : false
|
|
17
|
+
|
|
16
18
|
return (
|
|
17
19
|
<>
|
|
18
20
|
<AppSection
|
|
@@ -31,7 +33,10 @@ export const Logs = ({ basePath }: { basePath: string }) => {
|
|
|
31
33
|
placeholder="Filter logs..."
|
|
32
34
|
className="border border-gray-300 rounded-md text-slate-800 px-2 flex-grow placeholder:text-slate-700"
|
|
33
35
|
value={filter}
|
|
34
|
-
onChange={(e) =>
|
|
36
|
+
onChange={(e) => {
|
|
37
|
+
setOffset(0)
|
|
38
|
+
setFilter(e.target.value)
|
|
39
|
+
}}
|
|
35
40
|
/>
|
|
36
41
|
</div>
|
|
37
42
|
|
|
@@ -63,7 +68,10 @@ export const Logs = ({ basePath }: { basePath: string }) => {
|
|
|
63
68
|
<select
|
|
64
69
|
className="border border-gray-300 rounded-md text-slate-800 px-2"
|
|
65
70
|
id="level"
|
|
66
|
-
onChange={(e) =>
|
|
71
|
+
onChange={(e) => {
|
|
72
|
+
setOffset(0)
|
|
73
|
+
setLevel(e.target.value as typeof level)
|
|
74
|
+
}}
|
|
67
75
|
value={level}
|
|
68
76
|
>
|
|
69
77
|
<option value="trace">Trace</option>
|
|
@@ -85,12 +93,14 @@ export const Logs = ({ basePath }: { basePath: string }) => {
|
|
|
85
93
|
Previous
|
|
86
94
|
</button>
|
|
87
95
|
)}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
{hasNextPage && (
|
|
97
|
+
<button
|
|
98
|
+
className={buttonStyle}
|
|
99
|
+
onClick={() => setOffset((offset) => offset + 1)}
|
|
100
|
+
>
|
|
101
|
+
Next
|
|
102
|
+
</button>
|
|
103
|
+
)}
|
|
94
104
|
</div>
|
|
95
105
|
</div>
|
|
96
106
|
</>
|