@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 CHANGED
@@ -1,13 +1,13 @@
1
1
  # @typed-assistant/builder
2
2
 
3
- ## 0.0.2
3
+ ## 0.0.76
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - Update READMEs.
7
+ - Add a filter for logs.
8
8
 
9
- ## 0.0.1
9
+ ## 0.0.75
10
10
 
11
11
  ### Patch Changes
12
12
 
13
- - First version.
13
+ - Prevent git pull from throwing.
package/package.json CHANGED
@@ -1,16 +1,19 @@
1
1
  {
2
2
  "name": "@typed-assistant/builder",
3
- "version": "0.0.74",
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
- "ansi-to-html": "^0.7.2",
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
- "eslint-plugin-html": "^7.1.0",
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.3.3",
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/"
@@ -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: "⬇️🚨" },
@@ -204,11 +204,16 @@ export const startWebappServer = async ({
204
204
  .get(
205
205
  "/log.txt",
206
206
  async ({ query }) => {
207
- return getLogsFromFile({ level: "trace", limit: query.limit })
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(
@@ -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 } = useLogStore()
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
- <a className={buttonStyle} href={`${basePath}/log.txt?limit=500`}>
25
- View raw log.txt
26
- </a>
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({ $query: { level, limit, offset } })
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
  }