@typed-assistant/builder 0.0.85 → 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 CHANGED
@@ -1,5 +1,18 @@
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
+
10
+ ## 0.0.86
11
+
12
+ ### Patch Changes
13
+
14
+ - Update react, react-dom and ink to latest versions.
15
+
3
16
  ## 0.0.85
4
17
 
5
18
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typed-assistant/builder",
3
- "version": "0.0.85",
3
+ "version": "0.0.87",
4
4
  "exports": {
5
5
  "./appProcess": "./src/appProcess.tsx",
6
6
  "./bunInstall": "./src/bunInstall.tsx",
@@ -9,14 +9,14 @@
9
9
  "dependencies": {
10
10
  "@elysiajs/eden": "^1.1.3",
11
11
  "@mdi/svg": "^7.3.67",
12
- "@types/react": "^18.3.12",
13
- "@types/react-dom": "^18.3.1",
12
+ "@types/react": "^19.2.7",
13
+ "@types/react-dom": "^19.2.3",
14
14
  "ansi-to-html": "^0.7.2",
15
15
  "debounce": "^2.0.0",
16
16
  "elysia": "~1.1.25",
17
17
  "ignore": "^5.3.0",
18
- "react": "^18",
19
- "react-dom": "^18",
18
+ "react": "^19.2.3",
19
+ "react-dom": "^19.2.3",
20
20
  "tailwind-merge": "^2.2.1",
21
21
  "zod": "^3.22.4"
22
22
  },
@@ -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/typescript-config": "0.0.11",
34
- "@typed-assistant/utils": "0.0.19"
33
+ "@typed-assistant/utils": "0.0.19",
34
+ "@typed-assistant/typescript-config": "0.0.11"
35
35
  },
36
36
  "publishConfig": {
37
37
  "access": "public",
@@ -427,33 +427,52 @@ const getLogsFromFile = async ({
427
427
  filter?: string
428
428
  }) => {
429
429
  try {
430
- const limit = Number(limitProp)
431
- const offset = Number(offsetProp)
432
-
433
- const logs = (
434
- await Bun.file("./log.txt")
435
- .text()
436
- .then((text) => text.split("\n"))
437
- .then((lines) =>
438
- limit
439
- ? lines.slice(
440
- lines.length - 1 - limit * (offset + 1),
441
- lines.length - 1 - limit * offset,
442
- )
443
- : lines,
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
- ).reduce((result, line) => {
446
- if (filter && !line.toLowerCase().includes(filter.toLowerCase()))
447
- return result
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: [
@@ -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) => setFilter(e.target.value)}
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) => setLevel(e.target.value as typeof level)}
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
- <button
89
- className={buttonStyle}
90
- onClick={() => setOffset((offset) => offset + 1)}
91
- >
92
- Next
93
- </button>
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
  </>