@plumix/core 0.3.0 → 0.5.0

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.
Files changed (304) hide show
  1. package/dist/auth/authenticator.d.ts +8 -1
  2. package/dist/auth/authenticator.d.ts.map +1 -1
  3. package/dist/auth/authenticator.js +15 -0
  4. package/dist/auth/authenticator.js.map +1 -1
  5. package/dist/auth/bearer.js +2 -2
  6. package/dist/auth/bearer.js.map +1 -1
  7. package/dist/auth/bootstrap.d.ts.map +1 -1
  8. package/dist/auth/bootstrap.js +39 -22
  9. package/dist/auth/bootstrap.js.map +1 -1
  10. package/dist/cache/decision.d.ts +7 -3
  11. package/dist/cache/decision.d.ts.map +1 -1
  12. package/dist/cache/decision.js +8 -6
  13. package/dist/cache/decision.js.map +1 -1
  14. package/dist/cache/read-through.d.ts +3 -0
  15. package/dist/cache/read-through.d.ts.map +1 -1
  16. package/dist/cache/read-through.js +14 -7
  17. package/dist/cache/read-through.js.map +1 -1
  18. package/dist/cache/tags.d.ts.map +1 -1
  19. package/dist/cache/tags.js +9 -0
  20. package/dist/cache/tags.js.map +1 -1
  21. package/dist/config.d.ts +9 -0
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +1 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/context/app.d.ts +38 -6
  26. package/dist/context/app.d.ts.map +1 -1
  27. package/dist/context/app.js +41 -8
  28. package/dist/context/app.js.map +1 -1
  29. package/dist/context/collector.d.ts +9 -0
  30. package/dist/context/collector.d.ts.map +1 -0
  31. package/dist/context/collector.js +130 -0
  32. package/dist/context/collector.js.map +1 -0
  33. package/dist/context/index.d.ts +1 -0
  34. package/dist/context/index.d.ts.map +1 -1
  35. package/dist/context/index.js +1 -0
  36. package/dist/context/index.js.map +1 -1
  37. package/dist/context/stores.d.ts +2 -9
  38. package/dist/context/stores.d.ts.map +1 -1
  39. package/dist/context/stores.js.map +1 -1
  40. package/dist/context/telemetry.d.ts +148 -0
  41. package/dist/context/telemetry.d.ts.map +1 -0
  42. package/dist/context/telemetry.js +20 -0
  43. package/dist/context/telemetry.js.map +1 -0
  44. package/dist/context/traced-fetch.d.ts +14 -0
  45. package/dist/context/traced-fetch.d.ts.map +1 -0
  46. package/dist/context/traced-fetch.js +33 -0
  47. package/dist/context/traced-fetch.js.map +1 -0
  48. package/dist/db/errors.d.ts +8 -0
  49. package/dist/db/errors.d.ts.map +1 -1
  50. package/dist/db/errors.js +22 -0
  51. package/dist/db/errors.js.map +1 -1
  52. package/dist/db/index.d.ts +1 -1
  53. package/dist/db/index.d.ts.map +1 -1
  54. package/dist/db/index.js +1 -1
  55. package/dist/db/index.js.map +1 -1
  56. package/dist/db/libsql.d.ts.map +1 -1
  57. package/dist/db/libsql.js +6 -12
  58. package/dist/db/libsql.js.map +1 -1
  59. package/dist/db/query-kind.d.ts +8 -0
  60. package/dist/db/query-kind.d.ts.map +1 -0
  61. package/dist/db/query-kind.js +11 -0
  62. package/dist/db/query-kind.js.map +1 -0
  63. package/dist/db/schema/users.d.ts +57 -0
  64. package/dist/db/schema/users.d.ts.map +1 -1
  65. package/dist/db/schema/users.js +10 -2
  66. package/dist/db/schema/users.js.map +1 -1
  67. package/dist/db/trace-libsql.d.ts +15 -0
  68. package/dist/db/trace-libsql.d.ts.map +1 -0
  69. package/dist/db/trace-libsql.js +37 -0
  70. package/dist/db/trace-libsql.js.map +1 -0
  71. package/dist/db/trace.d.ts +21 -0
  72. package/dist/db/trace.d.ts.map +1 -0
  73. package/dist/db/trace.js +64 -0
  74. package/dist/db/trace.js.map +1 -0
  75. package/dist/debug-bar/consumer.d.ts +12 -0
  76. package/dist/debug-bar/consumer.d.ts.map +1 -0
  77. package/dist/debug-bar/consumer.js +13 -0
  78. package/dist/debug-bar/consumer.js.map +1 -0
  79. package/dist/debug-bar/format-param.d.ts +6 -4
  80. package/dist/debug-bar/format-param.d.ts.map +1 -1
  81. package/dist/debug-bar/format-param.js +6 -9
  82. package/dist/debug-bar/format-param.js.map +1 -1
  83. package/dist/debug-bar/highlight-sql.d.ts +0 -3
  84. package/dist/debug-bar/highlight-sql.d.ts.map +1 -1
  85. package/dist/debug-bar/highlight-sql.js +0 -6
  86. package/dist/debug-bar/highlight-sql.js.map +1 -1
  87. package/dist/debug-bar/panels/database.d.ts +6 -4
  88. package/dist/debug-bar/panels/database.d.ts.map +1 -1
  89. package/dist/debug-bar/panels/database.js +44 -8
  90. package/dist/debug-bar/panels/database.js.map +1 -1
  91. package/dist/debug-bar/panels/template.d.ts +1 -1
  92. package/dist/debug-bar/panels/template.d.ts.map +1 -1
  93. package/dist/debug-bar/panels/template.js +16 -2
  94. package/dist/debug-bar/panels/template.js.map +1 -1
  95. package/dist/debug-bar/panels/timeline.js +1 -1
  96. package/dist/debug-bar/panels/timeline.js.map +1 -1
  97. package/dist/debug-bar/styles.d.ts.map +1 -1
  98. package/dist/debug-bar/styles.js +5 -0
  99. package/dist/debug-bar/styles.js.map +1 -1
  100. package/dist/debug-bar/template-node-label.d.ts.map +1 -1
  101. package/dist/debug-bar/template-node-label.js +8 -0
  102. package/dist/debug-bar/template-node-label.js.map +1 -1
  103. package/dist/debug-bar/timeline-model.d.ts +3 -3
  104. package/dist/debug-bar/timeline-model.d.ts.map +1 -1
  105. package/dist/debug-bar/timeline-model.js +1 -1
  106. package/dist/debug-bar/timeline-model.js.map +1 -1
  107. package/dist/debug-bar/types.d.ts +1 -1
  108. package/dist/hooks/registry.d.ts.map +1 -1
  109. package/dist/hooks/registry.js +21 -3
  110. package/dist/hooks/registry.js.map +1 -1
  111. package/dist/index.d.ts +7 -5
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +5 -5
  114. package/dist/index.js.map +1 -1
  115. package/dist/mcp/server.d.ts.map +1 -1
  116. package/dist/mcp/server.js +9 -3
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/plugin/manifest.d.ts +51 -0
  119. package/dist/plugin/manifest.d.ts.map +1 -1
  120. package/dist/plugin/manifest.js +8 -2
  121. package/dist/plugin/manifest.js.map +1 -1
  122. package/dist/plugin/provides-context.d.ts.map +1 -1
  123. package/dist/plugin/provides-context.js +5 -0
  124. package/dist/plugin/provides-context.js.map +1 -1
  125. package/dist/plugin/setup-context.d.ts +10 -1
  126. package/dist/plugin/setup-context.d.ts.map +1 -1
  127. package/dist/plugin/setup-context.js +12 -0
  128. package/dist/plugin/setup-context.js.map +1 -1
  129. package/dist/rest/build-handler.d.ts.map +1 -1
  130. package/dist/rest/build-handler.js +14 -1
  131. package/dist/rest/build-handler.js.map +1 -1
  132. package/dist/revisions/snapshot-envelope.d.ts +4 -2
  133. package/dist/revisions/snapshot-envelope.d.ts.map +1 -1
  134. package/dist/revisions/snapshot-envelope.js +6 -3
  135. package/dist/revisions/snapshot-envelope.js.map +1 -1
  136. package/dist/route/compile.d.ts +21 -0
  137. package/dist/route/compile.d.ts.map +1 -1
  138. package/dist/route/compile.js +63 -1
  139. package/dist/route/compile.js.map +1 -1
  140. package/dist/route/current.d.ts +5 -3
  141. package/dist/route/current.d.ts.map +1 -1
  142. package/dist/route/date-range.d.ts +12 -0
  143. package/dist/route/date-range.d.ts.map +1 -0
  144. package/dist/route/date-range.js +39 -0
  145. package/dist/route/date-range.js.map +1 -0
  146. package/dist/route/intent.d.ts +7 -3
  147. package/dist/route/intent.d.ts.map +1 -1
  148. package/dist/route/match.d.ts +1 -0
  149. package/dist/route/match.d.ts.map +1 -1
  150. package/dist/route/match.js +1 -1
  151. package/dist/route/match.js.map +1 -1
  152. package/dist/route/render/build-resolved-entries.d.ts.map +1 -1
  153. package/dist/route/render/build-resolved-entries.js +6 -1
  154. package/dist/route/render/build-resolved-entries.js.map +1 -1
  155. package/dist/route/render/render-template.d.ts.map +1 -1
  156. package/dist/route/render/render-template.js +23 -14
  157. package/dist/route/render/render-template.js.map +1 -1
  158. package/dist/route/render/resolved-entry.d.ts +36 -0
  159. package/dist/route/render/resolved-entry.d.ts.map +1 -1
  160. package/dist/route/render/template-builders.d.ts +66 -2
  161. package/dist/route/render/template-builders.d.ts.map +1 -1
  162. package/dist/route/render/template-builders.js +83 -4
  163. package/dist/route/render/template-builders.js.map +1 -1
  164. package/dist/route/render/template-hierarchy.d.ts +17 -1
  165. package/dist/route/render/template-hierarchy.d.ts.map +1 -1
  166. package/dist/route/render/template-hierarchy.js +23 -0
  167. package/dist/route/render/template-hierarchy.js.map +1 -1
  168. package/dist/route/resolve.d.ts +3 -1
  169. package/dist/route/resolve.d.ts.map +1 -1
  170. package/dist/route/resolve.js +152 -5
  171. package/dist/route/resolve.js.map +1 -1
  172. package/dist/rpc/authenticated.d.ts.map +1 -1
  173. package/dist/rpc/authenticated.js +2 -1
  174. package/dist/rpc/authenticated.js.map +1 -1
  175. package/dist/rpc/build-handler.d.ts.map +1 -1
  176. package/dist/rpc/build-handler.js +12 -0
  177. package/dist/rpc/build-handler.js.map +1 -1
  178. package/dist/rpc/procedures/auth/session.d.ts.map +1 -1
  179. package/dist/rpc/procedures/auth/session.js +2 -1
  180. package/dist/rpc/procedures/auth/session.js.map +1 -1
  181. package/dist/rpc/procedures/entry/create.d.ts +2 -2
  182. package/dist/rpc/procedures/entry/delete-permanent.d.ts +2 -2
  183. package/dist/rpc/procedures/entry/duplicate.d.ts +2 -2
  184. package/dist/rpc/procedures/entry/get.d.ts +2 -2
  185. package/dist/rpc/procedures/entry/helpers.d.ts +21 -0
  186. package/dist/rpc/procedures/entry/helpers.d.ts.map +1 -1
  187. package/dist/rpc/procedures/entry/helpers.js +44 -0
  188. package/dist/rpc/procedures/entry/helpers.js.map +1 -1
  189. package/dist/rpc/procedures/entry/index.d.ts +23 -22
  190. package/dist/rpc/procedures/entry/index.d.ts.map +1 -1
  191. package/dist/rpc/procedures/entry/list.d.ts +2 -2
  192. package/dist/rpc/procedures/entry/publish.d.ts +2 -2
  193. package/dist/rpc/procedures/entry/restore.d.ts +2 -2
  194. package/dist/rpc/procedures/entry/revisions.d.ts +8 -8
  195. package/dist/rpc/procedures/entry/schemas.d.ts +2 -0
  196. package/dist/rpc/procedures/entry/schemas.d.ts.map +1 -1
  197. package/dist/rpc/procedures/entry/schemas.js +7 -0
  198. package/dist/rpc/procedures/entry/schemas.js.map +1 -1
  199. package/dist/rpc/procedures/entry/trash.d.ts +2 -2
  200. package/dist/rpc/procedures/entry/update.d.ts +3 -2
  201. package/dist/rpc/procedures/entry/update.d.ts.map +1 -1
  202. package/dist/rpc/procedures/entry/update.js +10 -5
  203. package/dist/rpc/procedures/entry/update.js.map +1 -1
  204. package/dist/rpc/procedures/term/create.d.ts +2 -2
  205. package/dist/rpc/procedures/term/delete.d.ts +2 -2
  206. package/dist/rpc/procedures/term/get.d.ts +2 -2
  207. package/dist/rpc/procedures/term/index.d.ts +10 -10
  208. package/dist/rpc/procedures/term/list.d.ts +2 -2
  209. package/dist/rpc/procedures/term/update.d.ts +2 -2
  210. package/dist/rpc/procedures/user/delete.d.ts +2 -0
  211. package/dist/rpc/procedures/user/delete.d.ts.map +1 -1
  212. package/dist/rpc/procedures/user/disable.d.ts +2 -0
  213. package/dist/rpc/procedures/user/disable.d.ts.map +1 -1
  214. package/dist/rpc/procedures/user/enable.d.ts +2 -0
  215. package/dist/rpc/procedures/user/enable.d.ts.map +1 -1
  216. package/dist/rpc/procedures/user/get.d.ts +2 -0
  217. package/dist/rpc/procedures/user/get.d.ts.map +1 -1
  218. package/dist/rpc/procedures/user/index.d.ts +13 -0
  219. package/dist/rpc/procedures/user/index.d.ts.map +1 -1
  220. package/dist/rpc/procedures/user/invite.d.ts.map +1 -1
  221. package/dist/rpc/procedures/user/invite.js +28 -15
  222. package/dist/rpc/procedures/user/invite.js.map +1 -1
  223. package/dist/rpc/procedures/user/list.d.ts +2 -0
  224. package/dist/rpc/procedures/user/list.d.ts.map +1 -1
  225. package/dist/rpc/procedures/user/list.js +1 -0
  226. package/dist/rpc/procedures/user/list.js.map +1 -1
  227. package/dist/rpc/procedures/user/schemas.d.ts +1 -0
  228. package/dist/rpc/procedures/user/schemas.d.ts.map +1 -1
  229. package/dist/rpc/procedures/user/schemas.js +5 -0
  230. package/dist/rpc/procedures/user/schemas.js.map +1 -1
  231. package/dist/rpc/procedures/user/update.d.ts +3 -0
  232. package/dist/rpc/procedures/user/update.d.ts.map +1 -1
  233. package/dist/rpc/procedures/user/update.js +10 -1
  234. package/dist/rpc/procedures/user/update.js.map +1 -1
  235. package/dist/rpc/router.d.ts +46 -32
  236. package/dist/rpc/router.d.ts.map +1 -1
  237. package/dist/rpc/schemas.js +6 -6
  238. package/dist/rpc/schemas.js.map +1 -1
  239. package/dist/rpc/validation.d.ts +10 -0
  240. package/dist/rpc/validation.d.ts.map +1 -1
  241. package/dist/rpc/validation.js +10 -0
  242. package/dist/rpc/validation.js.map +1 -1
  243. package/dist/runtime/dispatcher.d.ts.map +1 -1
  244. package/dist/runtime/dispatcher.js +105 -14
  245. package/dist/runtime/dispatcher.js.map +1 -1
  246. package/dist/runtime/load-user-for-public-request.d.ts.map +1 -1
  247. package/dist/runtime/load-user-for-public-request.js +2 -2
  248. package/dist/runtime/load-user-for-public-request.js.map +1 -1
  249. package/dist/runtime/scheduled.d.ts +3 -1
  250. package/dist/runtime/scheduled.d.ts.map +1 -1
  251. package/dist/runtime/scheduled.js +16 -2
  252. package/dist/runtime/scheduled.js.map +1 -1
  253. package/dist/runtime/telemetry-delivery.d.ts +14 -0
  254. package/dist/runtime/telemetry-delivery.d.ts.map +1 -0
  255. package/dist/runtime/telemetry-delivery.js +39 -0
  256. package/dist/runtime/telemetry-delivery.js.map +1 -0
  257. package/dist/seo/feed.d.ts +19 -4
  258. package/dist/seo/feed.d.ts.map +1 -1
  259. package/dist/seo/feed.js +49 -12
  260. package/dist/seo/feed.js.map +1 -1
  261. package/dist/seo/head-defaults.d.ts.map +1 -1
  262. package/dist/seo/head-defaults.js +6 -3
  263. package/dist/seo/head-defaults.js.map +1 -1
  264. package/dist/template-registry.d.ts +31 -1
  265. package/dist/template-registry.d.ts.map +1 -1
  266. package/dist/test/default-theme.d.ts.map +1 -1
  267. package/dist/test/default-theme.js +3 -0
  268. package/dist/test/default-theme.js.map +1 -1
  269. package/dist/test/dispatcher.d.ts +13 -0
  270. package/dist/test/dispatcher.d.ts.map +1 -1
  271. package/dist/test/dispatcher.js +9 -3
  272. package/dist/test/dispatcher.js.map +1 -1
  273. package/dist/test/factories.d.ts +39 -21
  274. package/dist/test/factories.d.ts.map +1 -1
  275. package/dist/test/factories.js +1 -0
  276. package/dist/test/factories.js.map +1 -1
  277. package/dist/test/harness.d.ts.map +1 -1
  278. package/dist/test/harness.js +4 -12
  279. package/dist/test/harness.js.map +1 -1
  280. package/dist/theme.d.ts +15 -7
  281. package/dist/theme.d.ts.map +1 -1
  282. package/dist/theme.js +9 -0
  283. package/dist/theme.js.map +1 -1
  284. package/dist/users/slug.d.ts +12 -0
  285. package/dist/users/slug.d.ts.map +1 -0
  286. package/dist/users/slug.js +32 -0
  287. package/dist/users/slug.js.map +1 -0
  288. package/package.json +2 -2
  289. package/dist/context/debug.d.ts +0 -25
  290. package/dist/context/debug.d.ts.map +0 -1
  291. package/dist/context/debug.js +0 -13
  292. package/dist/context/debug.js.map +0 -1
  293. package/dist/debug-bar/collector.d.ts +0 -9
  294. package/dist/debug-bar/collector.d.ts.map +0 -1
  295. package/dist/debug-bar/collector.js +0 -80
  296. package/dist/debug-bar/collector.js.map +0 -1
  297. package/dist/debug-bar/db-query.d.ts +0 -21
  298. package/dist/debug-bar/db-query.d.ts.map +0 -1
  299. package/dist/debug-bar/db-query.js +0 -23
  300. package/dist/debug-bar/db-query.js.map +0 -1
  301. package/dist/debug-bar/trace-libsql.d.ts +0 -18
  302. package/dist/debug-bar/trace-libsql.d.ts.map +0 -1
  303. package/dist/debug-bar/trace-libsql.js +0 -42
  304. package/dist/debug-bar/trace-libsql.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ const KNOWN_KINDS = new Set(["select", "insert", "update", "delete"]);
2
+ /**
3
+ * The leading statement kind. Names every query span (`db: select`) and colors
4
+ * the Database panel's per-query badge — shared by prod tracing and the dev
5
+ * bar, hence its home here rather than in the debug-bar UI.
6
+ */
7
+ export function queryKind(sql) {
8
+ const first = sql.trimStart().split(/\s/, 1)[0]?.toLowerCase() ?? "";
9
+ return (KNOWN_KINDS.has(first) ? first : "other");
10
+ }
11
+ //# sourceMappingURL=query-kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-kind.js","sourceRoot":"","sources":["../../src/db/query-kind.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEtE;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACrE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAc,CAAC;AACjE,CAAC"}
@@ -40,6 +40,25 @@ export declare const users: import("drizzle-orm/sqlite-core").SQLiteTableWithCol
40
40
  }, {}, {
41
41
  length: undefined;
42
42
  }>;
43
+ slug: import("drizzle-orm/sqlite-core").SQLiteColumn<{
44
+ name: "slug";
45
+ tableName: "users";
46
+ dataType: "string";
47
+ columnType: "SQLiteText";
48
+ data: string;
49
+ driverParam: string;
50
+ notNull: true;
51
+ hasDefault: false;
52
+ isPrimaryKey: false;
53
+ isAutoincrement: false;
54
+ hasRuntimeDefault: false;
55
+ enumValues: [string, ...string[]];
56
+ baseColumn: never;
57
+ identity: undefined;
58
+ generated: undefined;
59
+ }, {}, {
60
+ length: undefined;
61
+ }>;
43
62
  name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
44
63
  name: "name";
45
64
  tableName: "users";
@@ -226,6 +245,25 @@ export declare const userInsertSchema: import("drizzle-valibot").BuildSchema<"in
226
245
  }, {}, {
227
246
  length: undefined;
228
247
  }>;
248
+ slug: import("drizzle-orm/sqlite-core").SQLiteColumn<{
249
+ name: "slug";
250
+ tableName: "users";
251
+ dataType: "string";
252
+ columnType: "SQLiteText";
253
+ data: string;
254
+ driverParam: string;
255
+ notNull: true;
256
+ hasDefault: false;
257
+ isPrimaryKey: false;
258
+ isAutoincrement: false;
259
+ hasRuntimeDefault: false;
260
+ enumValues: [string, ...string[]];
261
+ baseColumn: never;
262
+ identity: undefined;
263
+ generated: undefined;
264
+ }, {}, {
265
+ length: undefined;
266
+ }>;
229
267
  name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
230
268
  name: "name";
231
269
  tableName: "users";
@@ -408,6 +446,25 @@ export declare const userSelectSchema: import("drizzle-valibot").BuildSchema<"se
408
446
  }, {}, {
409
447
  length: undefined;
410
448
  }>;
449
+ slug: import("drizzle-orm/sqlite-core").SQLiteColumn<{
450
+ name: "slug";
451
+ tableName: "users";
452
+ dataType: "string";
453
+ columnType: "SQLiteText";
454
+ data: string;
455
+ driverParam: string;
456
+ notNull: true;
457
+ hasDefault: false;
458
+ isPrimaryKey: false;
459
+ isAutoincrement: false;
460
+ hasRuntimeDefault: false;
461
+ enumValues: [string, ...string[]];
462
+ baseColumn: never;
463
+ identity: undefined;
464
+ generated: undefined;
465
+ }, {}, {
466
+ length: undefined;
467
+ }>;
411
468
  name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
412
469
  name: "name";
413
470
  tableName: "users";
@@ -1 +1 @@
1
- {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/db/schema/users.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,qEAMb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBf,CAAC;AAEJ,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAEhD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAA4B,CAAC;AAC1D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAA4B,CAAC"}
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/db/schema/users.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,qEAMb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCjB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAEhD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAA4B,CAAC;AAC1D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAA4B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { sql } from "drizzle-orm";
2
- import { sqliteTable } from "drizzle-orm/sqlite-core";
2
+ import { sqliteTable, uniqueIndex } from "drizzle-orm/sqlite-core";
3
3
  import { createInsertSchema, createSelectSchema } from "drizzle-valibot";
4
4
  export const USER_ROLES = [
5
5
  "subscriber",
@@ -11,6 +11,11 @@ export const USER_ROLES = [
11
11
  export const users = sqliteTable("users", (t) => ({
12
12
  id: t.integer().primaryKey({ autoIncrement: true }),
13
13
  email: t.text().notNull().unique(),
14
+ // URL-safe author-archive identifier (`/authors/{slug}`). Derived from
15
+ // `name` at creation and stable thereafter — a name edit never rewrites
16
+ // it, so author permalinks don't break. Globally unique via the index
17
+ // below (users have no parent to scope by, unlike terms/entries).
18
+ slug: t.text().notNull(),
14
19
  name: t.text(),
15
20
  avatarUrl: t.text(),
16
21
  role: t.text({ enum: USER_ROLES }).notNull().default("subscriber"),
@@ -30,7 +35,10 @@ export const users = sqliteTable("users", (t) => ({
30
35
  .notNull()
31
36
  .default(sql `(unixepoch())`)
32
37
  .$onUpdate(() => sql `(unixepoch())`),
33
- }));
38
+ }),
39
+ // Named unique index, mirroring `terms_taxonomy_slug_idx` /
40
+ // `entries_type_slug_idx` — single-column since the slug is global.
41
+ (table) => [uniqueIndex("users_slug_idx").on(table.slug)]);
34
42
  export const userInsertSchema = createInsertSchema(users);
35
43
  export const userSelectSchema = createSelectSchema(users);
36
44
  //# sourceMappingURL=users.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/db/schema/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,OAAO;CACC,CAAC;AAIX,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IACd,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IAClE,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtB,KAAK,EAA2B;SAChC,OAAO,EAAE;SACT,OAAO,CAAC,EAAE,CAAC;IACd,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACjD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC5C,SAAS,EAAE,CAAC;SACT,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC9B,OAAO,EAAE;SACT,OAAO,CAAC,GAAG,CAAA,eAAe,CAAC;IAC9B,SAAS,EAAE,CAAC;SACT,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC9B,OAAO,EAAE;SACT,OAAO,CAAC,GAAG,CAAA,eAAe,CAAC;SAC3B,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAA,eAAe,CAAC;CACvC,CAAC,CAAC,CAAC;AAKJ,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/db/schema/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,OAAO;CACC,CAAC;AAIX,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAC9B,OAAO,EACP,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAClC,uEAAuE;IACvE,wEAAwE;IACxE,sEAAsE;IACtE,kEAAkE;IAClE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE;IACxB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IACd,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IAClE,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACtB,KAAK,EAA2B;SAChC,OAAO,EAAE;SACT,OAAO,CAAC,EAAE,CAAC;IACd,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACjD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC5C,SAAS,EAAE,CAAC;SACT,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC9B,OAAO,EAAE;SACT,OAAO,CAAC,GAAG,CAAA,eAAe,CAAC;IAC9B,SAAS,EAAE,CAAC;SACT,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC9B,OAAO,EAAE;SACT,OAAO,CAAC,GAAG,CAAA,eAAe,CAAC;SAC3B,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAA,eAAe,CAAC;CACvC,CAAC;AACF,4DAA4D;AAC5D,oEAAoE;AACpE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAC1D,CAAC;AAKF,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Client } from "@libsql/client";
2
+ /**
3
+ * Wraps a libsql client so every query — `execute`, `batch`, and statements
4
+ * inside an interactive `transaction` — runs through {@link traceDbQuery} /
5
+ * {@link traceDbBatch}: one timed `db: <kind>` span each, with sql/params/rows
6
+ * attributes. Applied unconditionally at adapter construction; without an
7
+ * active collector the spans are no-ops, so production with no telemetry
8
+ * consumer pays nothing.
9
+ *
10
+ * Assumes drizzle's single-argument call convention (`execute(stmt)`,
11
+ * `batch(stmts)`); it forwards only that first argument, so a direct
12
+ * `execute(sql, args)` call would drop its params.
13
+ */
14
+ export declare function traceSqlClient(client: Client): Client;
15
+ //# sourceMappingURL=trace-libsql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-libsql.d.ts","sourceRoot":"","sources":["../../src/db/trace-libsql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAIP,MAAM,gBAAgB,CAAC;AAwCxB;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUrD"}
@@ -0,0 +1,37 @@
1
+ import { traceDbBatch, traceDbQuery } from "./trace.js";
2
+ // drizzle binds positionally; named-args objects are a direct-client shape
3
+ // this wrap never sees, so they degrade to "no params".
4
+ const stmtQuery = (stmt) => typeof stmt === "string"
5
+ ? { sql: stmt, params: [] }
6
+ : { sql: stmt.sql, params: Array.isArray(stmt.args) ? stmt.args : [] };
7
+ const resultRows = (result) => result.rows.length > 0 ? result.rows.length : result.rowsAffected;
8
+ function wrapQueryTarget(target) {
9
+ const rawExecute = target.execute.bind(target);
10
+ target.execute = (stmt) => traceDbQuery(stmtQuery(stmt), () => rawExecute(stmt), resultRows);
11
+ // Relational reads run as one batched round-trip; time the whole batch as a
12
+ // single span.
13
+ const rawBatch = target.batch.bind(target);
14
+ target.batch = (stmts, ...rest) => traceDbBatch(stmts.map(stmtQuery), () => rawBatch(stmts, ...rest), resultRows);
15
+ return target;
16
+ }
17
+ /**
18
+ * Wraps a libsql client so every query — `execute`, `batch`, and statements
19
+ * inside an interactive `transaction` — runs through {@link traceDbQuery} /
20
+ * {@link traceDbBatch}: one timed `db: <kind>` span each, with sql/params/rows
21
+ * attributes. Applied unconditionally at adapter construction; without an
22
+ * active collector the spans are no-ops, so production with no telemetry
23
+ * consumer pays nothing.
24
+ *
25
+ * Assumes drizzle's single-argument call convention (`execute(stmt)`,
26
+ * `batch(stmts)`); it forwards only that first argument, so a direct
27
+ * `execute(sql, args)` call would drop its params.
28
+ */
29
+ export function traceSqlClient(client) {
30
+ wrapQueryTarget(client);
31
+ // drizzle runs in-transaction statements through the Transaction object's
32
+ // own execute/batch — wrap each transaction as it opens.
33
+ const rawTransaction = client.transaction.bind(client);
34
+ client.transaction = async (mode) => wrapQueryTarget(await rawTransaction(mode));
35
+ return client;
36
+ }
37
+ //# sourceMappingURL=trace-libsql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-libsql.js","sourceRoot":"","sources":["../../src/db/trace-libsql.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAExD,2EAA2E;AAC3E,wDAAwD;AACxD,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAe,EAAE,CACnD,OAAO,IAAI,KAAK,QAAQ;IACtB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;IAC3B,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAE3E,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAU,EAAE,CAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;AASpE,SAAS,eAAe,CAAwB,MAAS;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,GAAG,CAAC,IAAiB,EAAE,EAAE,CACrC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IAEpE,4EAA4E;IAC5E,eAAe;IACf,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,GAAG,CAAC,KAAoB,EAAE,GAAG,IAAa,EAAE,EAAE,CACxD,YAAY,CACV,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EACpB,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAC9B,UAAU,CACX,CAAC;IAEJ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,CAAC,WAAW,GAAG,KAAK,EAAE,IAAsB,EAAE,EAAE,CACpD,eAAe,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** One statement as the driver wrap sees it: `?`-form SQL plus bound params. */
2
+ export interface TracedQuery {
3
+ readonly sql: string;
4
+ readonly params: readonly unknown[];
5
+ }
6
+ /**
7
+ * Times one driver-level query as a `db: <kind>` span with the SQL, bound
8
+ * params, and row count as attributes — the single mechanism behind every
9
+ * `ctx.db` driver wrap (libsql, D1, demo proxy). A no-op outside a request;
10
+ * with an inactive collector the span passes through and the lazy params are
11
+ * never serialized. `countRows` reads the driver's result shape: rows
12
+ * returned, or rows affected for a write.
13
+ */
14
+ export declare function traceDbQuery<T>(query: TracedQuery, run: () => Promise<T>, countRows: (result: T) => number): Promise<T>;
15
+ /**
16
+ * Times a driver-level batch — one round-trip, so one span (labelled by kind
17
+ * when uniform, `db: batch` otherwise), with the per-statement sql/params under
18
+ * a `db.batch` attribute and the row counts summed across results.
19
+ */
20
+ export declare function traceDbBatch<R>(queries: readonly TracedQuery[], run: () => Promise<R[]>, countRows: (result: R) => number): Promise<R[]>;
21
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/db/trace.ts"],"names":[],"mappings":"AAIA,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAsCD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAC/B,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EACvB,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAC/B,OAAO,CAAC,CAAC,EAAE,CAAC,CAiBd"}
@@ -0,0 +1,64 @@
1
+ import { tryGetContext } from "../context/stores.js";
2
+ import { queryKind } from "./query-kind.js";
3
+ // Bound params may carry driver values (blobs, bigints, dates) that a
4
+ // JSON-serializable snapshot can't hold; degrade those to short descriptions.
5
+ function jsonParam(value) {
6
+ if (value === null ||
7
+ typeof value === "string" ||
8
+ typeof value === "number" ||
9
+ typeof value === "boolean") {
10
+ return value;
11
+ }
12
+ if (typeof value === "bigint")
13
+ return value.toString();
14
+ if (value instanceof Date)
15
+ return value.toISOString();
16
+ if (value instanceof Uint8Array || value instanceof ArrayBuffer) {
17
+ return `<blob ${value.byteLength} bytes>`;
18
+ }
19
+ return `<${typeof value}>`;
20
+ }
21
+ function dbSpan(name, setAttributes, run, countRows) {
22
+ const ctx = tryGetContext();
23
+ if (!ctx)
24
+ return run();
25
+ return ctx.telemetry.span(name, (s) => {
26
+ setAttributes(s);
27
+ return run().then((result) => {
28
+ s.set("db.rows", countRows(result));
29
+ return result;
30
+ });
31
+ });
32
+ }
33
+ /**
34
+ * Times one driver-level query as a `db: <kind>` span with the SQL, bound
35
+ * params, and row count as attributes — the single mechanism behind every
36
+ * `ctx.db` driver wrap (libsql, D1, demo proxy). A no-op outside a request;
37
+ * with an inactive collector the span passes through and the lazy params are
38
+ * never serialized. `countRows` reads the driver's result shape: rows
39
+ * returned, or rows affected for a write.
40
+ */
41
+ export function traceDbQuery(query, run, countRows) {
42
+ return dbSpan(`db: ${queryKind(query.sql)}`, (s) => {
43
+ s.set("db.sql", query.sql);
44
+ if (query.params.length > 0) {
45
+ s.set("db.params", () => query.params.map(jsonParam));
46
+ }
47
+ }, run, countRows);
48
+ }
49
+ /**
50
+ * Times a driver-level batch — one round-trip, so one span (labelled by kind
51
+ * when uniform, `db: batch` otherwise), with the per-statement sql/params under
52
+ * a `db.batch` attribute and the row counts summed across results.
53
+ */
54
+ export function traceDbBatch(queries, run, countRows) {
55
+ const kinds = new Set(queries.map((query) => queryKind(query.sql)));
56
+ const kind = kinds.size === 1 ? [...kinds][0] : "batch";
57
+ return dbSpan(`db: ${kind} (${queries.length})`, (s) => {
58
+ s.set("db.batch", () => queries.map((query) => ({
59
+ sql: query.sql,
60
+ params: query.params.map(jsonParam),
61
+ })));
62
+ }, run, (results) => results.reduce((total, result) => total + countRows(result), 0));
63
+ }
64
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/db/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TelemetryConsumer } from "../context/telemetry.js";
2
+ import type { DebugBarInput } from "./config.js";
3
+ /**
4
+ * The debug bar as a telemetry consumer — the first one registered in dev, so
5
+ * the collector activates for the request the bar renders. It has no
6
+ * `onRequestEnd`: the bar reads the live collector mid-request while
7
+ * rendering. Returns null when the bar is configured off, so a disabled bar
8
+ * costs no collection either. Referenced only under the `PLUMIX_DEV` gate and
9
+ * dead-code-eliminated from production builds.
10
+ */
11
+ export declare function debugBarTelemetryConsumer(debugBar: DebugBarInput | undefined): TelemetryConsumer | null;
12
+ //# sourceMappingURL=consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/debug-bar/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,iBAAiB,GAAG,IAAI,CAE1B"}
@@ -0,0 +1,13 @@
1
+ import { normalizeDebugBar } from "./config.js";
2
+ /**
3
+ * The debug bar as a telemetry consumer — the first one registered in dev, so
4
+ * the collector activates for the request the bar renders. It has no
5
+ * `onRequestEnd`: the bar reads the live collector mid-request while
6
+ * rendering. Returns null when the bar is configured off, so a disabled bar
7
+ * costs no collection either. Referenced only under the `PLUMIX_DEV` gate and
8
+ * dead-code-eliminated from production builds.
9
+ */
10
+ export function debugBarTelemetryConsumer(debugBar) {
11
+ return normalizeDebugBar(debugBar).enabled ? { id: "debug-bar" } : null;
12
+ }
13
+ //# sourceMappingURL=consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/debug-bar/consumer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAmC;IAEnC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC"}
@@ -1,13 +1,15 @@
1
- type SqlParamKind = "string" | "number" | "boolean" | "null" | "blob";
1
+ type SqlParamKind = "string" | "number" | "boolean" | "null";
2
2
  export interface DescribedParam {
3
3
  readonly kind: SqlParamKind;
4
4
  readonly text: string;
5
5
  }
6
6
  /**
7
7
  * Describe a bound SQL parameter for the Database panel: its `kind` (for
8
- * per-type coloring) and display `text` (strings quoted, numbers/bigints/
9
- * booleans/null as literals, long strings truncated) — the `?`-form SQL stays
10
- * copyable. One pass so the kind and text can't drift apart.
8
+ * per-type coloring) and display `text` (strings quoted, numbers/booleans/null
9
+ * as literals, long strings truncated) — the `?`-form SQL stays copyable.
10
+ * Params arrive as span-attribute `JsonValue`s (driver values like blobs and
11
+ * bigints were already degraded to strings at record time). One pass so the
12
+ * kind and text can't drift apart.
11
13
  */
12
14
  export declare function describeSqlParam(value: unknown): DescribedParam;
13
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"format-param.d.ts","sourceRoot":"","sources":["../../src/debug-bar/format-param.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAiB/D"}
1
+ {"version":3,"file":"format-param.d.ts","sourceRoot":"","sources":["../../src/debug-bar/format-param.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAY/D"}
@@ -1,9 +1,11 @@
1
1
  const MAX_LEN = 80;
2
2
  /**
3
3
  * Describe a bound SQL parameter for the Database panel: its `kind` (for
4
- * per-type coloring) and display `text` (strings quoted, numbers/bigints/
5
- * booleans/null as literals, long strings truncated) — the `?`-form SQL stays
6
- * copyable. One pass so the kind and text can't drift apart.
4
+ * per-type coloring) and display `text` (strings quoted, numbers/booleans/null
5
+ * as literals, long strings truncated) — the `?`-form SQL stays copyable.
6
+ * Params arrive as span-attribute `JsonValue`s (driver values like blobs and
7
+ * bigints were already degraded to strings at record time). One pass so the
8
+ * kind and text can't drift apart.
7
9
  */
8
10
  export function describeSqlParam(value) {
9
11
  if (value === null || value === undefined)
@@ -12,16 +14,11 @@ export function describeSqlParam(value) {
12
14
  const text = value.length > MAX_LEN ? `${value.slice(0, MAX_LEN)}…` : value;
13
15
  return { kind: "string", text: `"${text}"` };
14
16
  }
15
- if (typeof value === "bigint")
16
- return { kind: "number", text: value.toString() };
17
17
  if (typeof value === "number")
18
18
  return { kind: "number", text: String(value) };
19
19
  if (typeof value === "boolean")
20
20
  return { kind: "boolean", text: String(value) };
21
- if (value instanceof Uint8Array) {
22
- return { kind: "blob", text: `<blob ${value.byteLength} bytes>` };
23
- }
24
- // Objects/dates are unusual as bound params — JSON gives a readable form.
21
+ // Nested arrays/objects are unusual as params — JSON gives a readable form.
25
22
  return { kind: "string", text: JSON.stringify(value) };
26
23
  }
27
24
  //# sourceMappingURL=format-param.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-param.js","sourceRoot":"","sources":["../../src/debug-bar/format-param.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,EAAE,CAAC;AASnB;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9E,IAAI,OAAO,KAAK,KAAK,SAAS;QAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,CAAC,UAAU,SAAS,EAAE,CAAC;IACpE,CAAC;IACD,0EAA0E;IAC1E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"format-param.js","sourceRoot":"","sources":["../../src/debug-bar/format-param.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,EAAE,CAAC;AASnB;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9E,IAAI,OAAO,KAAK,KAAK,SAAS;QAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,4EAA4E;IAC5E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AACzD,CAAC"}
@@ -4,8 +4,5 @@ export interface SqlToken {
4
4
  readonly kind: SqlTokenKind;
5
5
  }
6
6
  export declare function tokenizeSql(sql: string): readonly SqlToken[];
7
- export type QueryKind = "select" | "insert" | "update" | "delete" | "other";
8
- /** The leading statement kind, for the per-query badge/color. */
9
- export declare function queryKind(sql: string): QueryKind;
10
7
  export {};
11
8
  //# sourceMappingURL=highlight-sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"highlight-sql.d.ts","sourceRoot":"","sources":["../../src/debug-bar/highlight-sql.ts"],"names":[],"mappings":"AAuDA,KAAK,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAQD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,CAa5D;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAI5E,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAGhD"}
1
+ {"version":3,"file":"highlight-sql.d.ts","sourceRoot":"","sources":["../../src/debug-bar/highlight-sql.ts"],"names":[],"mappings":"AAuDA,KAAK,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAQD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,CAa5D"}
@@ -73,10 +73,4 @@ export function tokenizeSql(sql) {
73
73
  }
74
74
  return tokens;
75
75
  }
76
- const KNOWN_KINDS = new Set(["select", "insert", "update", "delete"]);
77
- /** The leading statement kind, for the per-query badge/color. */
78
- export function queryKind(sql) {
79
- const first = sql.trimStart().split(/\s/, 1)[0]?.toLowerCase() ?? "";
80
- return (KNOWN_KINDS.has(first) ? first : "other");
81
- }
82
76
  //# sourceMappingURL=highlight-sql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"highlight-sql.js","sourceRoot":"","sources":["../../src/debug-bar/highlight-sql.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAE1E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,QAAQ;IACR,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,WAAW;IACX,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;CACT,CAAC,CAAC;AASH,0EAA0E;AAC1E,2EAA2E;AAC3E,6CAA6C;AAC7C,MAAM,KAAK,GACT,8EAA8E,CAAC;AAEjF,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;aAC/D,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;aACpE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACV,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aAC5D,CAAC,CAAC;QACL,CAAC;;YAAM,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEtE,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACrE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAc,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"highlight-sql.js","sourceRoot":"","sources":["../../src/debug-bar/highlight-sql.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAE1E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,QAAQ;IACR,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,WAAW;IACX,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;CACT,CAAC,CAAC;AASH,0EAA0E;AAC1E,2EAA2E;AAC3E,6CAA6C;AAC7C,MAAM,KAAK,GACT,8EAA8E,CAAC;AAEjF,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;aAC/D,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;aACpE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACV,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aAC5D,CAAC,CAAC;QACL,CAAC;;YAAM,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import type { DebugPanel } from "../types.js";
2
+ /** Panel id, also the disable-denylist key and tab testid suffix. */
3
+ export declare const DB_PANEL_ID = "database";
2
4
  /**
3
- * The Database panel: every query recorded for this request (via the drizzle
4
- * logger), with SQL syntax highlighting, a per-query kind badge, and the bound
5
- * params shown separately (typed-colored) — the `?`-form SQL stays copyable.
6
- * Per-query timing arrives with the Timeline slice.
5
+ * The Database panel: every query span this request's driver wrap emitted,
6
+ * with SQL syntax highlighting, a per-query kind badge, per-query duration,
7
+ * and the bound params shown separately (typed-colored) — the `?`-form SQL
8
+ * stays copyable.
7
9
  */
8
10
  export declare const databasePanel: DebugPanel;
9
11
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/debug-bar/panels/database.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsB9C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,UAgD3B,CAAC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/debug-bar/panels/database.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,qEAAqE;AACrE,eAAO,MAAM,WAAW,aAAa,CAAC;AAgEtC;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,UAqD3B,CAAC"}
@@ -1,29 +1,65 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { DB_PANEL_ID } from "../db-query.js";
2
+ import { queryKind } from "../../db/query-kind.js";
3
3
  import { describeSqlParam } from "../format-param.js";
4
- import { queryKind, tokenizeSql } from "../highlight-sql.js";
4
+ import { tokenizeSql } from "../highlight-sql.js";
5
5
  import { DebugSection } from "../primitives.js";
6
+ /** Panel id, also the disable-denylist key and tab testid suffix. */
7
+ export const DB_PANEL_ID = "database";
8
+ function asParams(value) {
9
+ return Array.isArray(value) ? value : [];
10
+ }
11
+ // `Array.isArray` narrows a readonly-array union to `any[]`; a dedicated
12
+ // guard keeps the elements typed as JsonValue.
13
+ function isJsonArray(value) {
14
+ return Array.isArray(value);
15
+ }
16
+ // Walks the span tree collecting what the driver wraps emit: a `db.sql` span
17
+ // is one query row; a `db.batch` span flattens into one row per statement.
18
+ function collectQueryRows(spans) {
19
+ const rows = [];
20
+ const visit = (span) => {
21
+ const { "db.sql": sql, "db.params": params, "db.batch": batch, } = span.attributes;
22
+ if (typeof sql === "string") {
23
+ rows.push({ sql, params: asParams(params), durationMs: span.durationMs });
24
+ }
25
+ else if (isJsonArray(batch)) {
26
+ for (const stmt of batch) {
27
+ if (typeof stmt !== "object" || stmt === null || isJsonArray(stmt)) {
28
+ continue;
29
+ }
30
+ if (typeof stmt.sql !== "string")
31
+ continue;
32
+ rows.push({ sql: stmt.sql, params: asParams(stmt.params) });
33
+ }
34
+ }
35
+ for (const child of span.children)
36
+ visit(child);
37
+ };
38
+ for (const span of spans)
39
+ visit(span);
40
+ return rows;
41
+ }
6
42
  function HighlightedSql({ sql }) {
7
43
  return (_jsx("code", { className: "plumix-debug-bar__sql", children: tokenizeSql(sql).map((token, i) => token.kind === "text" ? (token.text) : (_jsx("span", { className: `plumix-debug-bar__tok--${token.kind}`, children: token.text }, i))) }));
8
44
  }
9
45
  /**
10
- * The Database panel: every query recorded for this request (via the drizzle
11
- * logger), with SQL syntax highlighting, a per-query kind badge, and the bound
12
- * params shown separately (typed-colored) — the `?`-form SQL stays copyable.
13
- * Per-query timing arrives with the Timeline slice.
46
+ * The Database panel: every query span this request's driver wrap emitted,
47
+ * with SQL syntax highlighting, a per-query kind badge, per-query duration,
48
+ * and the bound params shown separately (typed-colored) — the `?`-form SQL
49
+ * stays copyable.
14
50
  */
15
51
  export const databasePanel = {
16
52
  id: DB_PANEL_ID,
17
53
  title: "Database",
18
54
  order: 20,
19
55
  render: (ctx) => {
20
- const queries = ctx.debug.get(DB_PANEL_ID);
56
+ const queries = collectQueryRows(ctx.telemetry.getSpans());
21
57
  if (queries.length === 0) {
22
58
  return _jsx("p", { className: "plumix-debug-bar__empty", children: "No queries recorded." });
23
59
  }
24
60
  return (_jsx(DebugSection, { title: `${queries.length} ${queries.length === 1 ? "query" : "queries"}`, children: _jsx("ol", { className: "plumix-debug-bar__queries", children: queries.map((query, i) => {
25
61
  const kind = queryKind(query.sql);
26
- return (_jsxs("li", { className: "plumix-debug-bar__query", children: [_jsxs("div", { className: "plumix-debug-bar__query-head", children: [_jsx("span", { className: `plumix-debug-bar__kind plumix-debug-bar__kind--${kind}`, children: kind }), _jsx(HighlightedSql, { sql: query.sql })] }), query.params.length > 0 ? (_jsx("div", { className: "plumix-debug-bar__params", children: query.params.map((param, j) => {
62
+ return (_jsxs("li", { className: "plumix-debug-bar__query", children: [_jsxs("div", { className: "plumix-debug-bar__query-head", children: [_jsx("span", { className: `plumix-debug-bar__kind plumix-debug-bar__kind--${kind}`, children: kind }), _jsx(HighlightedSql, { sql: query.sql }), query.durationMs !== undefined ? (_jsxs("span", { className: "plumix-debug-bar__query-ms", children: [query.durationMs, "ms"] })) : null] }), query.params.length > 0 ? (_jsx("div", { className: "plumix-debug-bar__params", children: query.params.map((param, j) => {
27
63
  const { kind: paramKind, text } = describeSqlParam(param);
28
64
  return (_jsx("span", { className: `plumix-debug-bar__param plumix-debug-bar__param--${paramKind}`, children: text }, j));
29
65
  }) })) : null] }, i));
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/debug-bar/panels/database.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,SAAS,cAAc,CAAC,EAAE,GAAG,EAA4B;IACvD,OAAO,CACL,eAAM,SAAS,EAAC,uBAAuB,YACpC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CACjC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACtB,KAAK,CAAC,IAAI,CACX,CAAC,CAAC,CAAC,CACF,eAAc,SAAS,EAAE,0BAA0B,KAAK,CAAC,IAAI,EAAE,YAC5D,KAAK,CAAC,IAAI,IADF,CAAC,CAEL,CACR,CACF,GACI,CACR,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAe;IACvC,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,CAAC,GAAe,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAA4B,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,YAAG,SAAS,EAAC,yBAAyB,qCAAyB,CAAC;QACzE,CAAC;QACD,OAAO,CACL,KAAC,YAAY,IACX,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,YAExE,aAAI,SAAS,EAAC,2BAA2B,YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACxB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAClC,OAAO,CACL,cAAY,SAAS,EAAC,yBAAyB,aAC7C,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eACE,SAAS,EAAE,kDAAkD,IAAI,EAAE,YAElE,IAAI,GACA,EACP,KAAC,cAAc,IAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAI,IAC9B,EACL,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACzB,cAAK,SAAS,EAAC,0BAA0B,YACtC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oCAC7B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;oCAC1D,OAAO,CACL,eAEE,SAAS,EAAE,oDAAoD,SAAS,EAAE,YAEzE,IAAI,IAHA,CAAC,CAID,CACR,CAAC;gCACJ,CAAC,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,KAvBD,CAAC,CAwBL,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,GACQ,CAChB,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/debug-bar/panels/database.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ResolutionTrace } from "../../route/render/template-hierarchy.js";
2
2
  import type { DebugPanel } from "../types.js";
3
- /** Recorded by the renderer; read by the panel. */
3
+ /** Set as the `template` span's `resolution` attribute by the renderer. */
4
4
  export interface TemplateResolution extends ResolutionTrace {
5
5
  /** Human label for the resolved route node, e.g. "post: hello-world". */
6
6
  readonly nodeLabel: string;
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/debug-bar/panels/template.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,mDAAmD;AACnD,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAUD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,UA4C3B,CAAC"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/debug-bar/panels/template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,2EAA2E;AAC3E,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAyBD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,UA4C3B,CAAC"}
@@ -1,6 +1,19 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { DebugKV, DebugSection, DebugTable } from "../primitives.js";
3
3
  import { TEMPLATE_PANEL_ID } from "../template-node-label.js";
4
+ // Matches on the resolution attribute too, so an unrelated span that happens
5
+ // to share the `template` name can't shadow the renderer's span.
6
+ function findResolutionSpan(spans) {
7
+ for (const span of spans) {
8
+ if (span.name === TEMPLATE_PANEL_ID && "resolution" in span.attributes) {
9
+ return span;
10
+ }
11
+ const nested = findResolutionSpan(span.children);
12
+ if (nested)
13
+ return nested;
14
+ }
15
+ return undefined;
16
+ }
4
17
  /** How a predicate reads in the table — or an em dash when the rule has none. */
5
18
  function predicateCell(predicate) {
6
19
  if (predicate === undefined)
@@ -20,9 +33,10 @@ export const templatePanel = {
20
33
  title: "Template",
21
34
  order: 15,
22
35
  render: (ctx) => {
23
- const resolution = ctx.debug.get(TEMPLATE_PANEL_ID)[0];
36
+ const resolution = findResolutionSpan(ctx.telemetry.getSpans())?.attributes
37
+ .resolution;
24
38
  if (!resolution) {
25
- return (_jsx("p", { className: "plumix-debug-bar__empty", children: "No template resolution \u2014 this is likely an error page." }));
39
+ return (_jsx("p", { className: "plumix-debug-bar__empty", children: "No template resolution recorded \u2014 error pages don't resolve one." }));
26
40
  }
27
41
  return (_jsxs(_Fragment, { children: [_jsx(DebugSection, { title: "Resolution", children: _jsx(DebugKV, { rows: [
28
42
  { label: "Resolved", value: resolution.nodeLabel },