@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,32 @@
|
|
|
1
|
+
import { eq, like, or } from "drizzle-orm";
|
|
2
|
+
import { users } from "../db/schema/users.js";
|
|
3
|
+
import { slugify } from "../slugify.js";
|
|
4
|
+
// `deriveUserSlug` reads then the INSERT writes, so concurrent creates with the
|
|
5
|
+
// same derived base can both pick it and one loses the unique race. Callers
|
|
6
|
+
// re-derive and retry up to this many times; each retry sees the winner's row,
|
|
7
|
+
// so the loser advances to the next suffix.
|
|
8
|
+
export const MAX_SLUG_ATTEMPTS = 5;
|
|
9
|
+
/**
|
|
10
|
+
* Derive a unique, URL-safe author slug from a user's name. Slugifies the name
|
|
11
|
+
* (never the email — that would leak it into public `/authors/{slug}` URLs),
|
|
12
|
+
* falling back to `user` when the name transliterates to nothing. On collision
|
|
13
|
+
* the bare base is kept if free, otherwise the smallest free numeric suffix is
|
|
14
|
+
* appended (`john`, `john-1`, `john-2`), mirroring how a single term/entry keeps
|
|
15
|
+
* its bare slug. Called once at user creation; the result is stable thereafter.
|
|
16
|
+
*/
|
|
17
|
+
export async function deriveUserSlug(db, name) {
|
|
18
|
+
const base = slugify(name ?? "") || "user";
|
|
19
|
+
const rows = await db
|
|
20
|
+
.select({ slug: users.slug })
|
|
21
|
+
.from(users)
|
|
22
|
+
.where(or(eq(users.slug, base), like(users.slug, `${base}-%`)));
|
|
23
|
+
const taken = new Set(rows.map((r) => r.slug));
|
|
24
|
+
if (!taken.has(base))
|
|
25
|
+
return base;
|
|
26
|
+
for (let n = 1;; n++) {
|
|
27
|
+
const candidate = `${base}-${n}`;
|
|
28
|
+
if (!taken.has(candidate))
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/users/slug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,gFAAgF;AAChF,4EAA4E;AAC5E,+EAA+E;AAC/E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAM,EACN,IAA+B;IAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plumix/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Plumix core: runtime, auth, data model, and plugin system",
|
|
6
6
|
"license": "MIT",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"drizzle-valibot": "^0.4.2",
|
|
98
98
|
"fishery": "^2.4.0",
|
|
99
99
|
"valibot": "^1.4.2",
|
|
100
|
-
"@plumix/blocks": "0.
|
|
100
|
+
"@plumix/blocks": "0.5.0"
|
|
101
101
|
},
|
|
102
102
|
"peerDependencies": {
|
|
103
103
|
"@playwright/test": "^1.61.1",
|
package/dist/context/debug.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { TraceSpan } from "./stores.js";
|
|
2
|
-
/**
|
|
3
|
-
* Request-scoped debug collector. Core and plugins record per-request data
|
|
4
|
-
* under a namespace (a panel id) and read it back when their panel renders.
|
|
5
|
-
* Two implementations: {@link NOOP_DEBUG} (always present in core, prod-safe)
|
|
6
|
-
* and the real accumulating collector in the dev-gated debug-bar module.
|
|
7
|
-
*/
|
|
8
|
-
export interface DebugCollector {
|
|
9
|
-
/** Append an entry under `namespace` (the recording panel's id). */
|
|
10
|
-
record(namespace: string, entry: unknown): void;
|
|
11
|
-
/** Time `fn`, record a span, and return `fn`'s result unchanged. */
|
|
12
|
-
span<T>(name: string, fn: () => T): T;
|
|
13
|
-
/** Entries recorded under `namespace`, in record order. */
|
|
14
|
-
get(namespace: string): readonly unknown[];
|
|
15
|
-
/** The collected span tree (the Timeline panel consumes this). */
|
|
16
|
-
getSpans(): readonly TraceSpan[];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* The permanent no-op collector. Lives in core proper so plugin `ctx.debug`
|
|
20
|
-
* call sites stay safe in production: `record` drops the entry, `span` calls
|
|
21
|
-
* through and returns the result, reads are empty. The real collector is
|
|
22
|
-
* swapped in only under the dev gate.
|
|
23
|
-
*/
|
|
24
|
-
export declare const NOOP_DEBUG: DebugCollector;
|
|
25
|
-
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/context/debug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,oEAAoE;IACpE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,2DAA2D;IAC3D,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAAC;IAC3C,kEAAkE;IAClE,QAAQ,IAAI,SAAS,SAAS,EAAE,CAAC;CAClC;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,cAKxB,CAAC"}
|
package/dist/context/debug.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The permanent no-op collector. Lives in core proper so plugin `ctx.debug`
|
|
3
|
-
* call sites stay safe in production: `record` drops the entry, `span` calls
|
|
4
|
-
* through and returns the result, reads are empty. The real collector is
|
|
5
|
-
* swapped in only under the dev gate.
|
|
6
|
-
*/
|
|
7
|
-
export const NOOP_DEBUG = {
|
|
8
|
-
record: () => undefined,
|
|
9
|
-
span: (_name, fn) => fn(),
|
|
10
|
-
get: () => [],
|
|
11
|
-
getSpans: () => [],
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=debug.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/context/debug.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;IACzB,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE;IACb,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;CACnB,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { DebugCollector } from "../context/debug.js";
|
|
2
|
-
import type { DebugBarInput } from "./config.js";
|
|
3
|
-
/**
|
|
4
|
-
* The real, dev-only debug collector. Accumulates per-namespace entries and a
|
|
5
|
-
* span tree for the request. Created only under the dev gate; production uses
|
|
6
|
-
* {@link NOOP_DEBUG} instead, so this module tree-shakes out of prod builds.
|
|
7
|
-
*/
|
|
8
|
-
export declare function createDebugCollector(debugBar: DebugBarInput | undefined): DebugCollector;
|
|
9
|
-
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/debug-bar/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWjD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,cAAc,CAiEhB"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { NOOP_DEBUG } from "../context/debug.js";
|
|
2
|
-
import { traceStore } from "../context/stores.js";
|
|
3
|
-
import { normalizeDebugBar } from "./config.js";
|
|
4
|
-
function isThenable(value) {
|
|
5
|
-
return (value != null && typeof value.then === "function");
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* The real, dev-only debug collector. Accumulates per-namespace entries and a
|
|
9
|
-
* span tree for the request. Created only under the dev gate; production uses
|
|
10
|
-
* {@link NOOP_DEBUG} instead, so this module tree-shakes out of prod builds.
|
|
11
|
-
*/
|
|
12
|
-
export function createDebugCollector(debugBar) {
|
|
13
|
-
const { enabled, disabled } = normalizeDebugBar(debugBar);
|
|
14
|
-
// Globally disabled in dev: skip all collection overhead, not just render.
|
|
15
|
-
if (!enabled)
|
|
16
|
-
return NOOP_DEBUG;
|
|
17
|
-
const entries = new Map();
|
|
18
|
-
const roots = [];
|
|
19
|
-
return {
|
|
20
|
-
record(namespace, entry) {
|
|
21
|
-
// A disabled panel stops collecting too (not just rendering): its
|
|
22
|
-
// namespace is its panel id, so denylisted namespaces drop at the source.
|
|
23
|
-
if (disabled.has(namespace))
|
|
24
|
-
return;
|
|
25
|
-
const bucket = entries.get(namespace);
|
|
26
|
-
if (bucket)
|
|
27
|
-
bucket.push(entry);
|
|
28
|
-
else
|
|
29
|
-
entries.set(namespace, [entry]);
|
|
30
|
-
},
|
|
31
|
-
span(name, fn) {
|
|
32
|
-
const startedAt = Date.now();
|
|
33
|
-
const span = {
|
|
34
|
-
name,
|
|
35
|
-
startedAt,
|
|
36
|
-
durationMs: 0,
|
|
37
|
-
children: [],
|
|
38
|
-
annotations: {},
|
|
39
|
-
};
|
|
40
|
-
// Attach to the enclosing span (via AsyncLocalStorage) so nesting
|
|
41
|
-
// reflects call structure; top-level spans become roots.
|
|
42
|
-
const parent = traceStore.getStore();
|
|
43
|
-
if (parent)
|
|
44
|
-
parent.children.push(span);
|
|
45
|
-
else
|
|
46
|
-
roots.push(span);
|
|
47
|
-
const stamp = () => {
|
|
48
|
-
span.durationMs = Date.now() - startedAt;
|
|
49
|
-
};
|
|
50
|
-
let result;
|
|
51
|
-
try {
|
|
52
|
-
result = traceStore.run(span, fn);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
stamp();
|
|
56
|
-
throw error;
|
|
57
|
-
}
|
|
58
|
-
// Await async work before stamping so I/O time is measured, not just the
|
|
59
|
-
// synchronous prelude. Nesting already survives awaits via ALS.
|
|
60
|
-
if (isThenable(result)) {
|
|
61
|
-
return result.then((value) => {
|
|
62
|
-
stamp();
|
|
63
|
-
return value;
|
|
64
|
-
}, (error) => {
|
|
65
|
-
stamp();
|
|
66
|
-
throw error;
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
stamp();
|
|
70
|
-
return result;
|
|
71
|
-
},
|
|
72
|
-
get(namespace) {
|
|
73
|
-
return entries.get(namespace) ?? [];
|
|
74
|
-
},
|
|
75
|
-
getSpans() {
|
|
76
|
-
return roots;
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=collector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/debug-bar/collector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,KAAK,IAAI,IAAI,IAAI,OAAQ,KAA8B,CAAC,IAAI,KAAK,UAAU,CAC5E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAmC;IAEnC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC1D,2EAA2E;IAC3E,IAAI,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,OAAO;QACL,MAAM,CAAC,SAAS,EAAE,KAAK;YACrB,kEAAkE;YAClE,0EAA0E;YAC1E,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBAC1B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,EAAE;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAc;gBACtB,IAAI;gBACJ,SAAS;gBACT,UAAU,EAAE,CAAC;gBACb,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,EAAE;aAChB,CAAC;YACF,kEAAkE;YAClE,yDAAyD;YACzD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,MAAM;gBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;gBAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,GAAS,EAAE;gBACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC3C,CAAC,CAAC;YACF,IAAI,MAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,KAAK,EAAE,CAAC;gBACR,MAAM,KAAK,CAAC;YACd,CAAC;YACD,yEAAyE;YACzE,gEAAgE;YAChE,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,OAAO,MAAM,CAAC,IAAI,CAChB,CAAC,KAAK,EAAE,EAAE;oBACR,KAAK,EAAE,CAAC;oBACR,OAAO,KAAK,CAAC;gBACf,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;oBACR,KAAK,EAAE,CAAC;oBACR,MAAM,KAAK,CAAC;gBACd,CAAC,CACuB,CAAC;YAC7B,CAAC;YACD,KAAK,EAAE,CAAC;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,GAAG,CAAC,SAAS;YACX,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,QAAQ;YACN,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { Logger } from "drizzle-orm";
|
|
2
|
-
/** Panel id + collector namespace for database queries. */
|
|
3
|
-
export declare const DB_PANEL_ID = "database";
|
|
4
|
-
export interface DbQueryEntry {
|
|
5
|
-
readonly sql: string;
|
|
6
|
-
readonly params: readonly unknown[];
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* A drizzle `Logger` that feeds the Database panel. Pass it as the `logger`
|
|
10
|
-
* option to `drizzle(...)` (dev-gated) — one uniform mechanism across every
|
|
11
|
-
* driver, giving the `?`-form SQL plus the bound params. It reaches the
|
|
12
|
-
* request's collector via the request-store ALS, so it's a no-op outside a
|
|
13
|
-
* request (and in prod, where `ctx.debug` is the no-op collector). Per-query
|
|
14
|
-
* timing is not part of drizzle's logger contract; the Timeline panel measures
|
|
15
|
-
* it via spans instead.
|
|
16
|
-
*
|
|
17
|
-
* Driver-agnostic and free of any driver type import, so it can be shared with
|
|
18
|
-
* runtime adapters (D1) over a narrow subpath without dragging libsql types in.
|
|
19
|
-
*/
|
|
20
|
-
export declare function createDebugSqlLogger(): Logger;
|
|
21
|
-
//# sourceMappingURL=db-query.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db-query.d.ts","sourceRoot":"","sources":["../../src/debug-bar/db-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,2DAA2D;AAC3D,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { tryGetContext } from "../context/stores.js";
|
|
2
|
-
/** Panel id + collector namespace for database queries. */
|
|
3
|
-
export const DB_PANEL_ID = "database";
|
|
4
|
-
/**
|
|
5
|
-
* A drizzle `Logger` that feeds the Database panel. Pass it as the `logger`
|
|
6
|
-
* option to `drizzle(...)` (dev-gated) — one uniform mechanism across every
|
|
7
|
-
* driver, giving the `?`-form SQL plus the bound params. It reaches the
|
|
8
|
-
* request's collector via the request-store ALS, so it's a no-op outside a
|
|
9
|
-
* request (and in prod, where `ctx.debug` is the no-op collector). Per-query
|
|
10
|
-
* timing is not part of drizzle's logger contract; the Timeline panel measures
|
|
11
|
-
* it via spans instead.
|
|
12
|
-
*
|
|
13
|
-
* Driver-agnostic and free of any driver type import, so it can be shared with
|
|
14
|
-
* runtime adapters (D1) over a narrow subpath without dragging libsql types in.
|
|
15
|
-
*/
|
|
16
|
-
export function createDebugSqlLogger() {
|
|
17
|
-
return {
|
|
18
|
-
logQuery(sql, params) {
|
|
19
|
-
tryGetContext()?.debug.record(DB_PANEL_ID, { sql, params });
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=db-query.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db-query.js","sourceRoot":"","sources":["../../src/debug-bar/db-query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAOtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,QAAQ,CAAC,GAAG,EAAE,MAAM;YAClB,aAAa,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Client } from "@libsql/client";
|
|
2
|
-
/**
|
|
3
|
-
* Wraps a libsql client so every `execute` runs inside a timed `ctx.debug.span`
|
|
4
|
-
* — the Timeline panel's source of per-query durations, which drizzle's logger
|
|
5
|
-
* contract can't provide. Dev-only (call it behind the `PLUMIX_DEV` gate); a
|
|
6
|
-
* no-op outside a request, and tree-shaken from prod along with its callers.
|
|
7
|
-
*
|
|
8
|
-
* Lives apart from the driver-agnostic query logger so the libsql type import
|
|
9
|
-
* stays out of adapters that don't use libsql (e.g. the D1 runtime).
|
|
10
|
-
*
|
|
11
|
-
* Assumes drizzle's single-argument call convention (`execute(stmt)`,
|
|
12
|
-
* `batch(stmts)`); it forwards only that first argument, so a direct
|
|
13
|
-
* `execute(sql, args)` call would drop its params. Queries inside a drizzle
|
|
14
|
-
* transaction run through `tx.execute` and aren't timed — acceptable for a dev
|
|
15
|
-
* panel.
|
|
16
|
-
*/
|
|
17
|
-
export declare function traceSqlClient(client: Client): Client;
|
|
18
|
-
//# sourceMappingURL=trace-libsql.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-libsql.d.ts","sourceRoot":"","sources":["../../src/debug-bar/trace-libsql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,gBAAgB,CAAC;AAK1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0BrD"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { tryGetContext } from "../context/stores.js";
|
|
2
|
-
import { queryKind } from "./highlight-sql.js";
|
|
3
|
-
/**
|
|
4
|
-
* Wraps a libsql client so every `execute` runs inside a timed `ctx.debug.span`
|
|
5
|
-
* — the Timeline panel's source of per-query durations, which drizzle's logger
|
|
6
|
-
* contract can't provide. Dev-only (call it behind the `PLUMIX_DEV` gate); a
|
|
7
|
-
* no-op outside a request, and tree-shaken from prod along with its callers.
|
|
8
|
-
*
|
|
9
|
-
* Lives apart from the driver-agnostic query logger so the libsql type import
|
|
10
|
-
* stays out of adapters that don't use libsql (e.g. the D1 runtime).
|
|
11
|
-
*
|
|
12
|
-
* Assumes drizzle's single-argument call convention (`execute(stmt)`,
|
|
13
|
-
* `batch(stmts)`); it forwards only that first argument, so a direct
|
|
14
|
-
* `execute(sql, args)` call would drop its params. Queries inside a drizzle
|
|
15
|
-
* transaction run through `tx.execute` and aren't timed — acceptable for a dev
|
|
16
|
-
* panel.
|
|
17
|
-
*/
|
|
18
|
-
export function traceSqlClient(client) {
|
|
19
|
-
const stmtSql = (stmt) => typeof stmt === "string" ? stmt : stmt.sql;
|
|
20
|
-
const rawExecute = client.execute.bind(client);
|
|
21
|
-
client.execute = (stmt) => {
|
|
22
|
-
const ctx = tryGetContext();
|
|
23
|
-
const run = () => rawExecute(stmt);
|
|
24
|
-
if (!ctx)
|
|
25
|
-
return run();
|
|
26
|
-
return ctx.debug.span(`db: ${queryKind(stmtSql(stmt))}`, run);
|
|
27
|
-
};
|
|
28
|
-
// Relational reads and transactions run as one batched round-trip; time the
|
|
29
|
-
// whole batch as a single span (labelled by kind when uniform).
|
|
30
|
-
const rawBatch = client.batch.bind(client);
|
|
31
|
-
client.batch = (stmts, ...rest) => {
|
|
32
|
-
const ctx = tryGetContext();
|
|
33
|
-
const run = () => rawBatch(stmts, ...rest);
|
|
34
|
-
if (!ctx || !Array.isArray(stmts))
|
|
35
|
-
return run();
|
|
36
|
-
const kinds = new Set(stmts.map((stmt) => queryKind(stmtSql(stmt))));
|
|
37
|
-
const label = kinds.size === 1 ? `db: ${[...kinds][0]}` : "db: batch";
|
|
38
|
-
return ctx.debug.span(`${label} (${stmts.length})`, run);
|
|
39
|
-
};
|
|
40
|
-
return client;
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=trace-libsql.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-libsql.js","sourceRoot":"","sources":["../../src/debug-bar/trace-libsql.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAU,EAAE,CAC5C,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAE7C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,GAAG,CAAC,IAAiB,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAkC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG;YAAE,OAAO,GAAG,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,GAAG,CAAC,KAAoB,EAAE,GAAG,IAAe,EAAE,EAAE;QAC1D,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAgC,EAAE,CAC5C,QAAQ,CAAC,KAAK,EAAE,GAAI,IAAgB,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QACtE,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|