@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.
- package/dist/auth/authenticator.d.ts +8 -1
- package/dist/auth/authenticator.d.ts.map +1 -1
- package/dist/auth/authenticator.js +15 -0
- package/dist/auth/authenticator.js.map +1 -1
- package/dist/auth/bearer.js +2 -2
- package/dist/auth/bearer.js.map +1 -1
- package/dist/auth/bootstrap.d.ts.map +1 -1
- package/dist/auth/bootstrap.js +39 -22
- package/dist/auth/bootstrap.js.map +1 -1
- package/dist/cache/decision.d.ts +7 -3
- package/dist/cache/decision.d.ts.map +1 -1
- package/dist/cache/decision.js +8 -6
- package/dist/cache/decision.js.map +1 -1
- package/dist/cache/read-through.d.ts +3 -0
- package/dist/cache/read-through.d.ts.map +1 -1
- package/dist/cache/read-through.js +14 -7
- package/dist/cache/read-through.js.map +1 -1
- package/dist/cache/tags.d.ts.map +1 -1
- package/dist/cache/tags.js +9 -0
- package/dist/cache/tags.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/context/app.d.ts +38 -6
- package/dist/context/app.d.ts.map +1 -1
- package/dist/context/app.js +41 -8
- package/dist/context/app.js.map +1 -1
- package/dist/context/collector.d.ts +9 -0
- package/dist/context/collector.d.ts.map +1 -0
- package/dist/context/collector.js +130 -0
- package/dist/context/collector.js.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -0
- package/dist/context/index.js.map +1 -1
- package/dist/context/stores.d.ts +2 -9
- package/dist/context/stores.d.ts.map +1 -1
- package/dist/context/stores.js.map +1 -1
- package/dist/context/telemetry.d.ts +148 -0
- package/dist/context/telemetry.d.ts.map +1 -0
- package/dist/context/telemetry.js +20 -0
- package/dist/context/telemetry.js.map +1 -0
- package/dist/context/traced-fetch.d.ts +14 -0
- package/dist/context/traced-fetch.d.ts.map +1 -0
- package/dist/context/traced-fetch.js +33 -0
- package/dist/context/traced-fetch.js.map +1 -0
- package/dist/db/errors.d.ts +8 -0
- package/dist/db/errors.d.ts.map +1 -1
- package/dist/db/errors.js +22 -0
- package/dist/db/errors.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/libsql.d.ts.map +1 -1
- package/dist/db/libsql.js +6 -12
- package/dist/db/libsql.js.map +1 -1
- package/dist/db/query-kind.d.ts +8 -0
- package/dist/db/query-kind.d.ts.map +1 -0
- package/dist/db/query-kind.js +11 -0
- package/dist/db/query-kind.js.map +1 -0
- package/dist/db/schema/users.d.ts +57 -0
- package/dist/db/schema/users.d.ts.map +1 -1
- package/dist/db/schema/users.js +10 -2
- package/dist/db/schema/users.js.map +1 -1
- package/dist/db/trace-libsql.d.ts +15 -0
- package/dist/db/trace-libsql.d.ts.map +1 -0
- package/dist/db/trace-libsql.js +37 -0
- package/dist/db/trace-libsql.js.map +1 -0
- package/dist/db/trace.d.ts +21 -0
- package/dist/db/trace.d.ts.map +1 -0
- package/dist/db/trace.js +64 -0
- package/dist/db/trace.js.map +1 -0
- package/dist/debug-bar/consumer.d.ts +12 -0
- package/dist/debug-bar/consumer.d.ts.map +1 -0
- package/dist/debug-bar/consumer.js +13 -0
- package/dist/debug-bar/consumer.js.map +1 -0
- package/dist/debug-bar/format-param.d.ts +6 -4
- package/dist/debug-bar/format-param.d.ts.map +1 -1
- package/dist/debug-bar/format-param.js +6 -9
- package/dist/debug-bar/format-param.js.map +1 -1
- package/dist/debug-bar/highlight-sql.d.ts +0 -3
- package/dist/debug-bar/highlight-sql.d.ts.map +1 -1
- package/dist/debug-bar/highlight-sql.js +0 -6
- package/dist/debug-bar/highlight-sql.js.map +1 -1
- package/dist/debug-bar/panels/database.d.ts +6 -4
- package/dist/debug-bar/panels/database.d.ts.map +1 -1
- package/dist/debug-bar/panels/database.js +44 -8
- package/dist/debug-bar/panels/database.js.map +1 -1
- package/dist/debug-bar/panels/template.d.ts +1 -1
- package/dist/debug-bar/panels/template.d.ts.map +1 -1
- package/dist/debug-bar/panels/template.js +16 -2
- package/dist/debug-bar/panels/template.js.map +1 -1
- package/dist/debug-bar/panels/timeline.js +1 -1
- package/dist/debug-bar/panels/timeline.js.map +1 -1
- package/dist/debug-bar/styles.d.ts.map +1 -1
- package/dist/debug-bar/styles.js +5 -0
- package/dist/debug-bar/styles.js.map +1 -1
- package/dist/debug-bar/template-node-label.d.ts.map +1 -1
- package/dist/debug-bar/template-node-label.js +8 -0
- package/dist/debug-bar/template-node-label.js.map +1 -1
- package/dist/debug-bar/timeline-model.d.ts +3 -3
- package/dist/debug-bar/timeline-model.d.ts.map +1 -1
- package/dist/debug-bar/timeline-model.js +1 -1
- package/dist/debug-bar/timeline-model.js.map +1 -1
- package/dist/debug-bar/types.d.ts +1 -1
- package/dist/hooks/registry.d.ts.map +1 -1
- package/dist/hooks/registry.js +21 -3
- package/dist/hooks/registry.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +9 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/plugin/manifest.d.ts +51 -0
- package/dist/plugin/manifest.d.ts.map +1 -1
- package/dist/plugin/manifest.js +8 -2
- package/dist/plugin/manifest.js.map +1 -1
- package/dist/plugin/provides-context.d.ts.map +1 -1
- package/dist/plugin/provides-context.js +5 -0
- package/dist/plugin/provides-context.js.map +1 -1
- package/dist/plugin/setup-context.d.ts +10 -1
- package/dist/plugin/setup-context.d.ts.map +1 -1
- package/dist/plugin/setup-context.js +12 -0
- package/dist/plugin/setup-context.js.map +1 -1
- package/dist/rest/build-handler.d.ts.map +1 -1
- package/dist/rest/build-handler.js +14 -1
- package/dist/rest/build-handler.js.map +1 -1
- package/dist/revisions/snapshot-envelope.d.ts +4 -2
- package/dist/revisions/snapshot-envelope.d.ts.map +1 -1
- package/dist/revisions/snapshot-envelope.js +6 -3
- package/dist/revisions/snapshot-envelope.js.map +1 -1
- package/dist/route/compile.d.ts +21 -0
- package/dist/route/compile.d.ts.map +1 -1
- package/dist/route/compile.js +63 -1
- package/dist/route/compile.js.map +1 -1
- package/dist/route/current.d.ts +5 -3
- package/dist/route/current.d.ts.map +1 -1
- package/dist/route/date-range.d.ts +12 -0
- package/dist/route/date-range.d.ts.map +1 -0
- package/dist/route/date-range.js +39 -0
- package/dist/route/date-range.js.map +1 -0
- package/dist/route/intent.d.ts +7 -3
- package/dist/route/intent.d.ts.map +1 -1
- package/dist/route/match.d.ts +1 -0
- package/dist/route/match.d.ts.map +1 -1
- package/dist/route/match.js +1 -1
- package/dist/route/match.js.map +1 -1
- package/dist/route/render/build-resolved-entries.d.ts.map +1 -1
- package/dist/route/render/build-resolved-entries.js +6 -1
- package/dist/route/render/build-resolved-entries.js.map +1 -1
- package/dist/route/render/render-template.d.ts.map +1 -1
- package/dist/route/render/render-template.js +23 -14
- package/dist/route/render/render-template.js.map +1 -1
- package/dist/route/render/resolved-entry.d.ts +36 -0
- package/dist/route/render/resolved-entry.d.ts.map +1 -1
- package/dist/route/render/template-builders.d.ts +66 -2
- package/dist/route/render/template-builders.d.ts.map +1 -1
- package/dist/route/render/template-builders.js +83 -4
- package/dist/route/render/template-builders.js.map +1 -1
- package/dist/route/render/template-hierarchy.d.ts +17 -1
- package/dist/route/render/template-hierarchy.d.ts.map +1 -1
- package/dist/route/render/template-hierarchy.js +23 -0
- package/dist/route/render/template-hierarchy.js.map +1 -1
- package/dist/route/resolve.d.ts +3 -1
- package/dist/route/resolve.d.ts.map +1 -1
- package/dist/route/resolve.js +152 -5
- package/dist/route/resolve.js.map +1 -1
- package/dist/rpc/authenticated.d.ts.map +1 -1
- package/dist/rpc/authenticated.js +2 -1
- package/dist/rpc/authenticated.js.map +1 -1
- package/dist/rpc/build-handler.d.ts.map +1 -1
- package/dist/rpc/build-handler.js +12 -0
- package/dist/rpc/build-handler.js.map +1 -1
- package/dist/rpc/procedures/auth/session.d.ts.map +1 -1
- package/dist/rpc/procedures/auth/session.js +2 -1
- package/dist/rpc/procedures/auth/session.js.map +1 -1
- package/dist/rpc/procedures/entry/create.d.ts +2 -2
- package/dist/rpc/procedures/entry/delete-permanent.d.ts +2 -2
- package/dist/rpc/procedures/entry/duplicate.d.ts +2 -2
- package/dist/rpc/procedures/entry/get.d.ts +2 -2
- package/dist/rpc/procedures/entry/helpers.d.ts +21 -0
- package/dist/rpc/procedures/entry/helpers.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/helpers.js +44 -0
- package/dist/rpc/procedures/entry/helpers.js.map +1 -1
- package/dist/rpc/procedures/entry/index.d.ts +23 -22
- package/dist/rpc/procedures/entry/index.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/list.d.ts +2 -2
- package/dist/rpc/procedures/entry/publish.d.ts +2 -2
- package/dist/rpc/procedures/entry/restore.d.ts +2 -2
- package/dist/rpc/procedures/entry/revisions.d.ts +8 -8
- package/dist/rpc/procedures/entry/schemas.d.ts +2 -0
- package/dist/rpc/procedures/entry/schemas.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/schemas.js +7 -0
- package/dist/rpc/procedures/entry/schemas.js.map +1 -1
- package/dist/rpc/procedures/entry/trash.d.ts +2 -2
- package/dist/rpc/procedures/entry/update.d.ts +3 -2
- package/dist/rpc/procedures/entry/update.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/update.js +10 -5
- package/dist/rpc/procedures/entry/update.js.map +1 -1
- package/dist/rpc/procedures/term/create.d.ts +2 -2
- package/dist/rpc/procedures/term/delete.d.ts +2 -2
- package/dist/rpc/procedures/term/get.d.ts +2 -2
- package/dist/rpc/procedures/term/index.d.ts +10 -10
- package/dist/rpc/procedures/term/list.d.ts +2 -2
- package/dist/rpc/procedures/term/update.d.ts +2 -2
- package/dist/rpc/procedures/user/delete.d.ts +2 -0
- package/dist/rpc/procedures/user/delete.d.ts.map +1 -1
- package/dist/rpc/procedures/user/disable.d.ts +2 -0
- package/dist/rpc/procedures/user/disable.d.ts.map +1 -1
- package/dist/rpc/procedures/user/enable.d.ts +2 -0
- package/dist/rpc/procedures/user/enable.d.ts.map +1 -1
- package/dist/rpc/procedures/user/get.d.ts +2 -0
- package/dist/rpc/procedures/user/get.d.ts.map +1 -1
- package/dist/rpc/procedures/user/index.d.ts +13 -0
- package/dist/rpc/procedures/user/index.d.ts.map +1 -1
- package/dist/rpc/procedures/user/invite.d.ts.map +1 -1
- package/dist/rpc/procedures/user/invite.js +28 -15
- package/dist/rpc/procedures/user/invite.js.map +1 -1
- package/dist/rpc/procedures/user/list.d.ts +2 -0
- package/dist/rpc/procedures/user/list.d.ts.map +1 -1
- package/dist/rpc/procedures/user/list.js +1 -0
- package/dist/rpc/procedures/user/list.js.map +1 -1
- package/dist/rpc/procedures/user/schemas.d.ts +1 -0
- package/dist/rpc/procedures/user/schemas.d.ts.map +1 -1
- package/dist/rpc/procedures/user/schemas.js +5 -0
- package/dist/rpc/procedures/user/schemas.js.map +1 -1
- package/dist/rpc/procedures/user/update.d.ts +3 -0
- package/dist/rpc/procedures/user/update.d.ts.map +1 -1
- package/dist/rpc/procedures/user/update.js +10 -1
- package/dist/rpc/procedures/user/update.js.map +1 -1
- package/dist/rpc/router.d.ts +46 -32
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/schemas.js +6 -6
- package/dist/rpc/schemas.js.map +1 -1
- package/dist/rpc/validation.d.ts +10 -0
- package/dist/rpc/validation.d.ts.map +1 -1
- package/dist/rpc/validation.js +10 -0
- package/dist/rpc/validation.js.map +1 -1
- package/dist/runtime/dispatcher.d.ts.map +1 -1
- package/dist/runtime/dispatcher.js +105 -14
- package/dist/runtime/dispatcher.js.map +1 -1
- package/dist/runtime/load-user-for-public-request.d.ts.map +1 -1
- package/dist/runtime/load-user-for-public-request.js +2 -2
- package/dist/runtime/load-user-for-public-request.js.map +1 -1
- package/dist/runtime/scheduled.d.ts +3 -1
- package/dist/runtime/scheduled.d.ts.map +1 -1
- package/dist/runtime/scheduled.js +16 -2
- package/dist/runtime/scheduled.js.map +1 -1
- package/dist/runtime/telemetry-delivery.d.ts +14 -0
- package/dist/runtime/telemetry-delivery.d.ts.map +1 -0
- package/dist/runtime/telemetry-delivery.js +39 -0
- package/dist/runtime/telemetry-delivery.js.map +1 -0
- package/dist/seo/feed.d.ts +19 -4
- package/dist/seo/feed.d.ts.map +1 -1
- package/dist/seo/feed.js +49 -12
- package/dist/seo/feed.js.map +1 -1
- package/dist/seo/head-defaults.d.ts.map +1 -1
- package/dist/seo/head-defaults.js +6 -3
- package/dist/seo/head-defaults.js.map +1 -1
- package/dist/template-registry.d.ts +31 -1
- package/dist/template-registry.d.ts.map +1 -1
- package/dist/test/default-theme.d.ts.map +1 -1
- package/dist/test/default-theme.js +3 -0
- package/dist/test/default-theme.js.map +1 -1
- package/dist/test/dispatcher.d.ts +13 -0
- package/dist/test/dispatcher.d.ts.map +1 -1
- package/dist/test/dispatcher.js +9 -3
- package/dist/test/dispatcher.js.map +1 -1
- package/dist/test/factories.d.ts +39 -21
- package/dist/test/factories.d.ts.map +1 -1
- package/dist/test/factories.js +1 -0
- package/dist/test/factories.js.map +1 -1
- package/dist/test/harness.d.ts.map +1 -1
- package/dist/test/harness.js +4 -12
- package/dist/test/harness.js.map +1 -1
- package/dist/theme.d.ts +15 -7
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +9 -0
- package/dist/theme.js.map +1 -1
- package/dist/users/slug.d.ts +12 -0
- package/dist/users/slug.d.ts.map +1 -0
- package/dist/users/slug.js +32 -0
- package/dist/users/slug.js.map +1 -0
- package/package.json +2 -2
- package/dist/context/debug.d.ts +0 -25
- package/dist/context/debug.d.ts.map +0 -1
- package/dist/context/debug.js +0 -13
- package/dist/context/debug.js.map +0 -1
- package/dist/debug-bar/collector.d.ts +0 -9
- package/dist/debug-bar/collector.d.ts.map +0 -1
- package/dist/debug-bar/collector.js +0 -80
- package/dist/debug-bar/collector.js.map +0 -1
- package/dist/debug-bar/db-query.d.ts +0 -21
- package/dist/debug-bar/db-query.d.ts.map +0 -1
- package/dist/debug-bar/db-query.js +0 -23
- package/dist/debug-bar/db-query.js.map +0 -1
- package/dist/debug-bar/trace-libsql.d.ts +0 -18
- package/dist/debug-bar/trace-libsql.d.ts.map +0 -1
- package/dist/debug-bar/trace-libsql.js +0 -42
- 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
|
|
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"}
|
package/dist/db/schema/users.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/db/trace.js
ADDED
|
@@ -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"
|
|
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/
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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,
|
|
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/
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4
|
-
*
|
|
5
|
-
* params shown separately (typed-colored) — the `?`-form SQL
|
|
6
|
-
*
|
|
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;
|
|
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 {
|
|
2
|
+
import { queryKind } from "../../db/query-kind.js";
|
|
3
3
|
import { describeSqlParam } from "../format-param.js";
|
|
4
|
-
import {
|
|
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
|
|
11
|
-
*
|
|
12
|
-
* params shown separately (typed-colored) — the `?`-form SQL
|
|
13
|
-
*
|
|
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.
|
|
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,
|
|
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
|
-
/**
|
|
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":"
|
|
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.
|
|
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
|
|
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 },
|