@hexclave/js 1.0.13 → 1.0.15
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/clickmap/clickmap-core.d.ts +15 -0
- package/dist/clickmap/clickmap-core.d.ts.map +1 -0
- package/dist/clickmap/clickmap-core.js +1527 -0
- package/dist/clickmap/clickmap-core.js.map +1 -0
- package/dist/clickmap/clickmap-styles.d.ts +5 -0
- package/dist/clickmap/clickmap-styles.d.ts.map +1 -0
- package/dist/clickmap/clickmap-styles.js +1095 -0
- package/dist/clickmap/clickmap-styles.js.map +1 -0
- package/dist/clickmap/index.d.ts +16 -0
- package/dist/clickmap/index.d.ts.map +1 -0
- package/dist/clickmap/index.js +74 -0
- package/dist/clickmap/index.js.map +1 -0
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-core.js +259 -263
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
- package/dist/dev-tool/dev-tool-styles.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-styles.js +13 -143
- package/dist/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/dev-tool/index.d.ts.map +1 -1
- package/dist/dev-tool/index.js +5 -12
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/esm/clickmap/clickmap-core.d.ts +15 -0
- package/dist/esm/clickmap/clickmap-core.d.ts.map +1 -0
- package/dist/esm/clickmap/clickmap-core.js +1525 -0
- package/dist/esm/clickmap/clickmap-core.js.map +1 -0
- package/dist/esm/clickmap/clickmap-styles.d.ts +5 -0
- package/dist/esm/clickmap/clickmap-styles.d.ts.map +1 -0
- package/dist/esm/clickmap/clickmap-styles.js +1093 -0
- package/dist/esm/clickmap/clickmap-styles.js.map +1 -0
- package/dist/esm/clickmap/index.d.ts +16 -0
- package/dist/esm/clickmap/index.d.ts.map +1 -0
- package/dist/esm/clickmap/index.js +72 -0
- package/dist/esm/clickmap/index.js.map +1 -0
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +36 -40
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.js +13 -143
- package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/esm/dev-tool/index.d.ts.map +1 -1
- package/dist/esm/dev-tool/index.js +2 -9
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/in-page-ui/base-styles.d.ts +5 -0
- package/dist/esm/in-page-ui/base-styles.d.ts.map +1 -0
- package/dist/esm/in-page-ui/base-styles.js +166 -0
- package/dist/esm/in-page-ui/base-styles.js.map +1 -0
- package/dist/esm/in-page-ui/dom.d.ts +15 -0
- package/dist/esm/in-page-ui/dom.d.ts.map +1 -0
- package/dist/esm/in-page-ui/dom.js +44 -0
- package/dist/esm/in-page-ui/dom.js.map +1 -0
- package/dist/esm/lib/auth.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +5 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js +20 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +4 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts +13 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js +146 -14
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js +221 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts +5 -0
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/in-page-ui/base-styles.d.ts +5 -0
- package/dist/in-page-ui/base-styles.d.ts.map +1 -0
- package/dist/in-page-ui/base-styles.js +168 -0
- package/dist/in-page-ui/base-styles.js.map +1 -0
- package/dist/in-page-ui/dom.d.ts +15 -0
- package/dist/in-page-ui/dom.d.ts.map +1 -0
- package/dist/in-page-ui/dom.js +51 -0
- package/dist/in-page-ui/dom.js.map +1 -0
- package/dist/integrations/convex/component/convex.config.d.ts +1 -1
- package/dist/lib/auth.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +5 -0
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js +20 -0
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +4 -2
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.d.ts +13 -0
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js +146 -14
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js +221 -0
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +5 -0
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
- package/dist/lib/hexclave-app/common.d.ts +1 -1
- package/dist/{storage-CG8QLF8G.d.ts → storage-CKsyME2q.d.ts} +1 -1
- package/dist/{storage-CG8QLF8G.d.ts.map → storage-CKsyME2q.d.ts.map} +1 -1
- package/package.json +2 -2
- package/src/clickmap/clickmap-core.ts +1997 -0
- package/src/clickmap/clickmap-styles.ts +1102 -0
- package/src/clickmap/index.ts +95 -0
- package/src/dev-tool/dev-tool-core.ts +38 -65
- package/src/dev-tool/dev-tool-styles.ts +13 -142
- package/src/dev-tool/index.ts +1 -14
- package/src/in-page-ui/base-styles.ts +171 -0
- package/src/in-page-ui/dom.ts +80 -0
- package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +23 -1
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +7 -0
- package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +287 -0
- package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +226 -16
- package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-tracker.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { EventTracker } from \"./event-tracker\";\n\nasync function advancePastFlush() {\n await vi.advanceTimersByTimeAsync(10_000);\n await Promise.resolve();\n}\n\nfunction getSentEventTypes(sentBodies: string[]) {\n const [body] = sentBodies;\n\n const payload = JSON.parse(body);\n if (typeof payload !== \"object\" || payload === null || !(\"events\" in payload) || !Array.isArray(payload.events)) {\n throw new Error(\"Expected analytics batch payload to include an events array.\");\n }\n\n return (payload.events as { event_type: string }[]).map((event) => event.event_type);\n}\n\ndescribe(\"EventTracker\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"captures events when browser globals are exposed as accessor descriptors\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Open project</button>\";\n\n const screenDescriptor = Object.getOwnPropertyDescriptor(window, \"screen\");\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(screenDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.value).toBeUndefined();\n expect(screenDescriptor?.get).toBeTypeOf(\"function\");\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 12,\n clientY: 34,\n }));\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"captures client-side navigations when history is exposed as an accessor descriptor\", async () => {\n vi.useFakeTimers();\n\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(historyDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n window.history.pushState({}, \"\", \"/projects/test-project\");\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n});\n"],"mappings":";;;;;;AAUA,eAAe,mBAAmB;AAChC,OAAM,GAAG,yBAAyB,IAAO;AACzC,OAAM,QAAQ,SAAS;;AAGzB,SAAS,kBAAkB,YAAsB;CAC/C,MAAM,CAAC,QAAQ;CAEf,MAAM,UAAU,KAAK,MAAM,KAAK;AAChC,KAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,EAAE,YAAY,YAAY,CAAC,MAAM,QAAQ,QAAQ,OAAO,CAC7G,OAAM,IAAI,MAAM,+DAA+D;AAGjF,QAAQ,QAAQ,OAAoC,KAAK,UAAU,MAAM,WAAW;;AAGtF,SAAS,sBAAsB;AAC7B,iBAAgB;AACd,KAAG,eAAe;GAClB;AAEF,IAAG,4EAA4E,YAAY;AACzF,KAAG,eAAe;AAClB,WAAS,KAAK,YAAY;EAE1B,MAAM,mBAAmB,OAAO,yBAAyB,QAAQ,SAAS;EAC1E,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,SAAO,kBAAkB,MAAM,CAAC,eAAe;AAC/C,SAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,SAAO,kBAAkB,IAAI,CAAC,WAAW,WAAW;AACpD,SAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAI,aAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAO,OAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,YAAS,cAAc,SAAS,EAAE,cAAc,IAAI,WAAW,SAAS;IACtE,SAAS;IACT,SAAS;IACT,SAAS;IACV,CAAC,CAAC;AAEH,SAAM,kBAAkB;AAExB,UAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;AAEF,IAAG,sFAAsF,YAAY;AACnG,KAAG,eAAe;EAElB,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,SAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,SAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAI,aAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAO,OAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,UAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,yBAAyB;AAE1D,SAAM,kBAAkB;AAExB,UAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;EACF"}
|
|
1
|
+
{"version":3,"file":"event-tracker.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { EventTracker } from \"./event-tracker\";\n\nasync function advancePastFlush() {\n await vi.advanceTimersByTimeAsync(10_000);\n await Promise.resolve();\n}\n\nfunction getSentEventTypes(sentBodies: string[]) {\n const [body] = sentBodies;\n\n const payload = JSON.parse(body);\n if (typeof payload !== \"object\" || payload === null || !(\"events\" in payload) || !Array.isArray(payload.events)) {\n throw new Error(\"Expected analytics batch payload to include an events array.\");\n }\n\n return (payload.events as { event_type: string }[]).map((event) => event.event_type);\n}\n\ndescribe(\"EventTracker\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"captures events when browser globals are exposed as accessor descriptors\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Open project</button>\";\n\n const screenDescriptor = Object.getOwnPropertyDescriptor(window, \"screen\");\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(screenDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.value).toBeUndefined();\n expect(screenDescriptor?.get).toBeTypeOf(\"function\");\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 12,\n clientY: 34,\n }));\n\n await advancePastFlush();\n\n // Dead-click classification marks the buffered $click in place —\n // exactly one click event either way.\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"emits a PostHog-style elements_chain plus scaled pointer coords for $click\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <main>\n <section class=\"card panel\">\n <button id=\"save-btn\" data-testid=\"save\" aria-label=\"Save project\">Save changes</button>\n </section>\n </main>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const button = document.querySelector(\"#save-btn\");\n if (button == null) throw new Error(\"button missing\");\n button.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 100,\n clientY: 200,\n }));\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const click = payload.events.find((event) => event.event_type === \"$click\");\n if (click == null) throw new Error(\"no $click event captured\");\n\n // elements_chain encodes the target leaf plus a few ancestors. Leaf is\n // first; segments are `;`-delimited. Assert against substrings rather\n // than the full string so jsdom layout quirks don't make this flaky.\n const chain = click.data.elements_chain;\n expect(typeof chain).toBe(\"string\");\n expect(chain).toContain('button');\n expect(chain).toContain('attr__id=\"save-btn\"');\n expect(chain).toContain('attr__data-testid=\"save\"');\n expect(chain).toContain('attr__aria-label=\"Save project\"');\n expect(chain).toContain('text=\"Save changes\"');\n // Ancestor section is in the chain too.\n expect(chain).toContain(\"section\");\n\n // Pre-scaled coords land in clickmap_events.pointer_*. SCALE_FACTOR=16.\n expect(click.data.x_scaled).toBe(Math.round(100 / 16));\n expect(click.data.y_scaled).toBe(Math.round(200 / 16));\n expect(click.data.client_y_scaled).toBe(Math.round(200 / 16));\n expect(click.data.scale_factor).toBe(16);\n expect(click.data.pointer_relative_x).toBeCloseTo(100 / window.innerWidth, 4);\n expect(click.data.pointer_target_fixed).toBe(0);\n\n // Legacy CSS selector still emitted for back-compat. The builder prefers\n // data-testid over id, so we assert against that anchor rather than #id.\n expect(click.data.selector).toContain('data-testid=\"save\"');\n expect(click.data.tag_name).toBe(\"button\");\n } finally {\n tracker.stop();\n }\n });\n\n it(\"ignores clicks inside the Hexclave dev tool\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <div id=\"__hexclave-dev-tool-root\">\n <button>Clickmap toolbar control</button>\n </div>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 100,\n clientY: 200,\n }));\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"flags pointer_target_fixed when the target sits under a fixed-position ancestor\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <header style=\"position: fixed; top: 0\">\n <button id=\"cta\">Sign up</button>\n </header>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"#cta\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const click = payload.events.find((event) => event.event_type === \"$click\");\n expect(click?.data.pointer_target_fixed).toBe(1);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"flags a click with no observable effect as dead on its single $click event\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"dead\\\">Does nothing</button>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const clickAtMs = Date.now();\n document.querySelector(\"#dead\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 10,\n clientY: 20,\n }));\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, event_at_ms: number, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n const click = clicks[0];\n\n // One event per physical click: the buffered $click is marked dead in\n // place, still timestamped at the original click rather than at\n // classification time (~3s later).\n expect(click.data.dead).toBe(1);\n expect(click.event_at_ms).toBe(clickAtMs);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"does not flag a click as dead when it mutates the DOM\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"live\\\">Adds content</button><div id=\\\"out\\\"></div>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const button = document.querySelector(\"#live\");\n if (button == null) throw new Error(\"button missing\");\n button.addEventListener(\"click\", () => {\n document.querySelector(\"#out\")?.appendChild(document.createElement(\"p\"));\n });\n button.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n // Let the MutationObserver microtask run so the mutation is recorded\n // before the dead-click sweeps start.\n await Promise.resolve();\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n expect(clicks[0].data.dead).toBeUndefined();\n } finally {\n tracker.stop();\n }\n });\n\n it(\"drains held clicks as alive on pagehide so navigation clicks are never lost\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<a id=\\\"nav\\\" href=\\\"/pricing\\\">Pricing</a>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const clickAtMs = Date.now();\n document.querySelector(\"#nav\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n\n // Navigation fires pagehide well before any classification sweep — the\n // keepalive flush ships the still-unclassified click as a plain (alive)\n // $click.\n window.dispatchEvent(new Event(\"pagehide\"));\n await Promise.resolve();\n await Promise.resolve();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, event_at_ms: number, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n expect(clicks[0].data.dead).toBeUndefined();\n expect(clicks[0].event_at_ms).toBe(clickAtMs);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"holds an unclassified click out of a flush and ships it on the next one\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"late\\\">Late click</button>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n // Click 500ms before the 10s flush tick: classification cannot finish\n // in time, so the flush must hold the click back rather than send it\n // unclassified.\n await vi.advanceTimersByTimeAsync(9_500);\n document.querySelector(\"#late\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await vi.advanceTimersByTimeAsync(500);\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n ]\n `);\n\n // By the next flush the sweep has classified it (dead — nothing\n // observable happened) and it ships marked.\n await vi.advanceTimersByTimeAsync(10_000);\n const second = JSON.parse(sentBodies[1] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n expect(second.events.map((event) => event.event_type)).toMatchInlineSnapshot(`\n [\n \"$click\",\n ]\n `);\n expect(second.events[0].data.dead).toBe(1);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"captures client-side navigations when history is exposed as an accessor descriptor\", async () => {\n vi.useFakeTimers();\n\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(historyDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n window.history.pushState({}, \"\", \"/projects/test-project\");\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n});\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getRelativePart } from "@hexclave/shared/dist/utils/urls";
|
|
2
1
|
import { HexclaveAssertionError } from "@hexclave/shared/dist/utils/errors";
|
|
2
|
+
import { getRelativePart } from "@hexclave/shared/dist/utils/urls";
|
|
3
3
|
|
|
4
4
|
//#region src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts
|
|
5
5
|
const crossDomainAuthQueryParams = {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AnalyticsClickmapOptions, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse } from "@hexclave/shared/dist/interface/admin-metrics";
|
|
1
2
|
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
2
3
|
import { InternalSession } from "@hexclave/shared/dist/sessions";
|
|
3
4
|
import { AsyncStoreProperty, EmailConfig } from "../../common";
|
|
@@ -217,6 +218,10 @@ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends st
|
|
|
217
218
|
refundTransactionId: string;
|
|
218
219
|
}>;
|
|
219
220
|
queryAnalytics(options: AnalyticsQueryOptions): Promise<AnalyticsQueryResponse>;
|
|
221
|
+
getAnalyticsClickmap(options: AnalyticsClickmapOptions): Promise<AnalyticsClickmapResponse>;
|
|
222
|
+
createAnalyticsClickmapToken(options: {
|
|
223
|
+
origin: string;
|
|
224
|
+
}): Promise<AnalyticsClickmapTokenResponse>;
|
|
220
225
|
listSessionReplays(options?: ListSessionReplaysOptions$1): Promise<ListSessionReplaysResult$1>;
|
|
221
226
|
getSessionReplay(sessionReplayId: string): Promise<AdminSessionReplay$1>;
|
|
222
227
|
listSessionReplayChunks(sessionReplayId: string, options?: ListSessionReplayChunksOptions$1): Promise<ListSessionReplayChunksResult$1>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-app.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/interfaces/admin-app.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin-app.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/interfaces/admin-app.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-app.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/interfaces/admin-app.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { AnalyticsQueryOptions, AnalyticsQueryResponse } from \"@hexclave/shared/dist/interface/crud/analytics\";\nimport type { AdminGetSessionReplayChunkEventsResponse, AdminGetSessionReplayAllEventsResponse } from \"@hexclave/shared/dist/interface/crud/session-replays\";\nimport type { Transaction, TransactionType } from \"@hexclave/shared/dist/interface/crud/transactions\";\nimport { InternalSession } from \"@hexclave/shared/dist/sessions\";\nimport type { MoneyAmount } from \"@hexclave/shared/dist/utils/currency-constants\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { AsyncStoreProperty, EmailConfig } from \"../../common\";\nimport { AdminEmailOutbox, AdminSentEmail } from \"../../email\";\nimport { InternalApiKey, InternalApiKeyCreateOptions, InternalApiKeyFirstView } from \"../../internal-api-keys\";\nimport { AdminProjectPermission, AdminProjectPermissionDefinition, AdminProjectPermissionDefinitionCreateOptions, AdminProjectPermissionDefinitionUpdateOptions, AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions } from \"../../permissions\";\nimport { AdminProject } from \"../../projects\";\nimport { _HexclaveAdminAppImpl } from \"../implementations\";\nimport { StackServerApp, StackServerAppConstructorOptions } from \"./server-app\";\n\nexport type EmailOutboxListOptions = {\n status?: string,\n simpleStatus?: string,\n limit?: number,\n cursor?: string,\n};\n\nexport type EmailOutboxListResult = {\n items: AdminEmailOutbox[],\n nextCursor: string | null,\n};\n\nexport type EmailOutboxUpdateOptions = {\n isPaused?: boolean,\n scheduledAtMillis?: number,\n cancel?: boolean,\n tsxSource?: string,\n themeId?: string | null,\n};\n\nexport type ManagedEmailProviderSetupResult = {\n domainId: string,\n subdomain: string,\n senderLocalPart: string,\n nameServerRecords: string[],\n status: ManagedEmailProviderStatus[\"status\"],\n};\n\nexport type ManagedEmailProviderStatus = {\n status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\",\n};\n\nexport type ManagedEmailProviderListItem = {\n domainId: string,\n subdomain: string,\n senderLocalPart: string,\n status: ManagedEmailProviderStatus[\"status\"],\n nameServerRecords: string[],\n};\n\nimport type { AdminSessionReplay, ListSessionReplayChunksOptions, ListSessionReplayChunksResult, ListSessionReplaysOptions, ListSessionReplaysResult, SessionReplayAllEventsResult } from \"../../session-replays\";\nexport type { AdminSessionReplay, AdminSessionReplayChunk, ListSessionReplaysOptions, ListSessionReplaysResult, ListSessionReplayChunksOptions, ListSessionReplayChunksResult, SessionReplayAllEventsResult } from \"../../session-replays\";\n\n\n/** @deprecated Use `HexclaveAdminAppConstructorOptions` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (\n & StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n & {\n superSecretAdminKey?: string,\n projectOwnerSession?: InternalSession | (() => Promise<string | null>),\n }\n);\n\n\n/** @deprecated Use `HexclaveAdminApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & AsyncStoreProperty<\"project\", [], AdminProject, false>\n & AsyncStoreProperty<\"internalApiKeys\", [], InternalApiKey[], true>\n & AsyncStoreProperty<\"teamPermissionDefinitions\", [], AdminTeamPermissionDefinition[], true>\n & AsyncStoreProperty<\"projectPermissionDefinitions\", [], AdminProjectPermissionDefinition[], true>\n & AsyncStoreProperty<\"emailThemes\", [], { id: string, displayName: string }[], true>\n & AsyncStoreProperty<\"emailPreview\", [{ themeId?: string | null | false, themeTsxSource?: string, templateId?: string, templateTsxSource?: string }], string, false>\n & AsyncStoreProperty<\"emailTemplates\", [], { id: string, displayName: string, themeId?: string, tsxSource: string }[], true>\n & AsyncStoreProperty<\"emailDrafts\", [], { id: string, displayName: string, themeId: string | undefined | false, tsxSource: string, sentAt: Date | null }[], true>\n & AsyncStoreProperty<\"stripeAccountInfo\", [], { account_id: string, charges_enabled: boolean, details_submitted: boolean, payouts_enabled: boolean } | null, false>\n & AsyncStoreProperty<\n \"transactions\",\n [{\n cursor?: string,\n limit?: number,\n type?: TransactionType,\n customerType?: 'user' | 'team' | 'custom',\n customerId?: string,\n }],\n { transactions: Transaction[], nextCursor: string | null },\n true\n >\n & {\n createInternalApiKey(options: InternalApiKeyCreateOptions): Promise<InternalApiKeyFirstView>,\n\n createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>,\n updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions): Promise<void>,\n deleteTeamPermissionDefinition(permissionId: string): Promise<void>,\n /**\n * @param options.query Free-text search; matches against permission ID and description.\n */\n listTeamPermissionDefinitionsPaginated(options: { limit: number, cursor?: string, query?: string }): Promise<{ items: AdminTeamPermissionDefinition[], nextCursor: string | null }>,\n\n createProjectPermissionDefinition(data: AdminProjectPermissionDefinitionCreateOptions): Promise<AdminProjectPermission>,\n updateProjectPermissionDefinition(permissionId: string, data: AdminProjectPermissionDefinitionUpdateOptions): Promise<void>,\n deleteProjectPermissionDefinition(permissionId: string): Promise<void>,\n\n\n sendTestEmail(options: {\n recipientEmail: string,\n emailConfig: EmailConfig,\n }): Promise<Result<undefined, { errorMessage: string }>>,\n\n sendTestWebhook(options: { endpointId: string }): Promise<Result<undefined, { errorMessage: string }>>,\n\n sendSignInInvitationEmail(email: string, callbackUrl: string): Promise<void>,\n\n listSentEmails(): Promise<AdminSentEmail[]>,\n setupManagedEmailProvider(options: { subdomain: string, senderLocalPart: string }): Promise<ManagedEmailProviderSetupResult>,\n checkManagedEmailStatus(options: { domainId: string, subdomain: string, senderLocalPart: string }): Promise<ManagedEmailProviderStatus>,\n listManagedEmailDomains(): Promise<ManagedEmailProviderListItem[]>,\n applyManagedEmailProvider(options: { domainId: string }): Promise<{ status: \"applied\" }>,\n deleteManagedEmailDomain(options: { resendDomainId: string }): Promise<{ status: \"deleted\" }>,\n\n createEmailTheme(displayName: string): Promise<{ id: string }>,\n updateEmailTheme(id: string, tsxSource: string): Promise<void>,\n deleteEmailTheme(id: string): Promise<void>,\n saveChatMessage(threadId: string, message: any): Promise<void>,\n listChatMessages(threadId: string): Promise<{ messages: Array<any> }>,\n rewriteTemplateSourceWithAI(templateTsxSource: string): Promise<{ tsxSource: string }>,\n updateEmailTemplate(id: string, tsxSource: string, themeId: string | null | false): Promise<{ renderedHtml: string }>,\n createEmailTemplate(displayName: string): Promise<{ id: string }>,\n deleteEmailTemplate(id: string): Promise<void>,\n\n setupPayments(): Promise<{ url: string }>,\n createStripeWidgetAccountSession(): Promise<{ client_secret: string }>,\n getPaymentMethodConfigs(): Promise<{ configId: string, methods: Array<{ id: string, name: string, enabled: boolean, available: boolean, overridable: boolean }> } | null>,\n updatePaymentMethodConfigs(configId: string, updates: Record<string, 'on' | 'off'>): Promise<void>,\n createEmailDraft(options: { displayName: string, themeId?: string | undefined | false, tsxSource?: string }): Promise<{ id: string }>,\n updateEmailDraft(id: string, data: { displayName?: string, themeId?: string | undefined | false, tsxSource?: string }): Promise<void>,\n deleteEmailDraft(id: string): Promise<void>,\n refreshEmailDrafts(): Promise<void>,\n createItemQuantityChange(options: (\n { userId: string, itemId: string, quantity: number, expiresAt?: string, description?: string } |\n { teamId: string, itemId: string, quantity: number, expiresAt?: string, description?: string } |\n { customCustomerId: string, itemId: string, quantity: number, expiresAt?: string, description?: string }\n )): Promise<void>,\n refundTransaction(options: {\n type: \"subscription\" | \"one-time-purchase\",\n id: string,\n invoiceId?: string,\n amountUsd: MoneyAmount,\n endAction?: \"now\" | \"at-period-end\",\n }): Promise<{ refundTransactionId: string }>,\n queryAnalytics(options: AnalyticsQueryOptions): Promise<AnalyticsQueryResponse>,\n\n listSessionReplays(options?: ListSessionReplaysOptions): Promise<ListSessionReplaysResult>,\n getSessionReplay(sessionReplayId: string): Promise<AdminSessionReplay>,\n listSessionReplayChunks(sessionReplayId: string, options?: ListSessionReplayChunksOptions): Promise<ListSessionReplayChunksResult>,\n getSessionReplayChunkEvents(sessionReplayId: string, chunkId: string): Promise<AdminGetSessionReplayChunkEventsResponse>,\n getSessionReplayEvents(sessionReplayId: string, options?: { offset?: number, limit?: number }): Promise<SessionReplayAllEventsResult>,\n\n // Email Outbox methods\n listOutboxEmails(options?: EmailOutboxListOptions): Promise<EmailOutboxListResult>,\n getOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n updateOutboxEmail(id: string, options: EmailOutboxUpdateOptions): Promise<AdminEmailOutbox>,\n pauseOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n unpauseOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n cancelOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n }\n & StackServerApp<HasTokenStore, ProjectId>\n);\n/** @deprecated Use `HexclaveAdminAppConstructor` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackAdminAppConstructor = {\n new <\n HasTokenStore extends boolean,\n ProjectId extends string\n >(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>,\n new(options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>,\n};\nexport type HexclaveAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackAdminAppConstructorOptions<HasTokenStore, ProjectId>;\nexport type HexclaveAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = StackAdminApp<HasTokenStore, ProjectId>;\nexport type HexclaveAdminAppConstructor = StackAdminAppConstructor;\nexport const HexclaveAdminApp: HexclaveAdminAppConstructor = _HexclaveAdminAppImpl;\n/** @deprecated Use `HexclaveAdminApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport const StackAdminApp: StackAdminAppConstructor = HexclaveAdminApp;\n"],"mappings":";;;AA0LA,MAAa,mBAAgD;;AAE7D,MAAa,gBAA0C"}
|
|
1
|
+
{"version":3,"file":"admin-app.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/interfaces/admin-app.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport type { AnalyticsClickmapOptions, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse } from \"@hexclave/shared/dist/interface/admin-metrics\";\nimport { AnalyticsQueryOptions, AnalyticsQueryResponse } from \"@hexclave/shared/dist/interface/crud/analytics\";\nimport type { AdminGetSessionReplayChunkEventsResponse, AdminGetSessionReplayAllEventsResponse } from \"@hexclave/shared/dist/interface/crud/session-replays\";\nimport type { Transaction, TransactionType } from \"@hexclave/shared/dist/interface/crud/transactions\";\nimport { InternalSession } from \"@hexclave/shared/dist/sessions\";\nimport type { MoneyAmount } from \"@hexclave/shared/dist/utils/currency-constants\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { AsyncStoreProperty, EmailConfig } from \"../../common\";\nimport { AdminEmailOutbox, AdminSentEmail } from \"../../email\";\nimport { InternalApiKey, InternalApiKeyCreateOptions, InternalApiKeyFirstView } from \"../../internal-api-keys\";\nimport { AdminProjectPermission, AdminProjectPermissionDefinition, AdminProjectPermissionDefinitionCreateOptions, AdminProjectPermissionDefinitionUpdateOptions, AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions } from \"../../permissions\";\nimport { AdminProject } from \"../../projects\";\nimport { _HexclaveAdminAppImpl } from \"../implementations\";\nimport { StackServerApp, StackServerAppConstructorOptions } from \"./server-app\";\n\nexport type EmailOutboxListOptions = {\n status?: string,\n simpleStatus?: string,\n limit?: number,\n cursor?: string,\n};\n\nexport type EmailOutboxListResult = {\n items: AdminEmailOutbox[],\n nextCursor: string | null,\n};\n\nexport type EmailOutboxUpdateOptions = {\n isPaused?: boolean,\n scheduledAtMillis?: number,\n cancel?: boolean,\n tsxSource?: string,\n themeId?: string | null,\n};\n\nexport type ManagedEmailProviderSetupResult = {\n domainId: string,\n subdomain: string,\n senderLocalPart: string,\n nameServerRecords: string[],\n status: ManagedEmailProviderStatus[\"status\"],\n};\n\nexport type ManagedEmailProviderStatus = {\n status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\",\n};\n\nexport type ManagedEmailProviderListItem = {\n domainId: string,\n subdomain: string,\n senderLocalPart: string,\n status: ManagedEmailProviderStatus[\"status\"],\n nameServerRecords: string[],\n};\n\nimport type { AdminSessionReplay, ListSessionReplayChunksOptions, ListSessionReplayChunksResult, ListSessionReplaysOptions, ListSessionReplaysResult, SessionReplayAllEventsResult } from \"../../session-replays\";\nexport type { AdminSessionReplay, AdminSessionReplayChunk, ListSessionReplaysOptions, ListSessionReplaysResult, ListSessionReplayChunksOptions, ListSessionReplayChunksResult, SessionReplayAllEventsResult } from \"../../session-replays\";\n\n\n/** @deprecated Use `HexclaveAdminAppConstructorOptions` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (\n & StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n & {\n superSecretAdminKey?: string,\n projectOwnerSession?: InternalSession | (() => Promise<string | null>),\n }\n);\n\n\n/** @deprecated Use `HexclaveAdminApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & AsyncStoreProperty<\"project\", [], AdminProject, false>\n & AsyncStoreProperty<\"internalApiKeys\", [], InternalApiKey[], true>\n & AsyncStoreProperty<\"teamPermissionDefinitions\", [], AdminTeamPermissionDefinition[], true>\n & AsyncStoreProperty<\"projectPermissionDefinitions\", [], AdminProjectPermissionDefinition[], true>\n & AsyncStoreProperty<\"emailThemes\", [], { id: string, displayName: string }[], true>\n & AsyncStoreProperty<\"emailPreview\", [{ themeId?: string | null | false, themeTsxSource?: string, templateId?: string, templateTsxSource?: string }], string, false>\n & AsyncStoreProperty<\"emailTemplates\", [], { id: string, displayName: string, themeId?: string, tsxSource: string }[], true>\n & AsyncStoreProperty<\"emailDrafts\", [], { id: string, displayName: string, themeId: string | undefined | false, tsxSource: string, sentAt: Date | null }[], true>\n & AsyncStoreProperty<\"stripeAccountInfo\", [], { account_id: string, charges_enabled: boolean, details_submitted: boolean, payouts_enabled: boolean } | null, false>\n & AsyncStoreProperty<\n \"transactions\",\n [{\n cursor?: string,\n limit?: number,\n type?: TransactionType,\n customerType?: 'user' | 'team' | 'custom',\n customerId?: string,\n }],\n { transactions: Transaction[], nextCursor: string | null },\n true\n >\n & {\n createInternalApiKey(options: InternalApiKeyCreateOptions): Promise<InternalApiKeyFirstView>,\n\n createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>,\n updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions): Promise<void>,\n deleteTeamPermissionDefinition(permissionId: string): Promise<void>,\n /**\n * @param options.query Free-text search; matches against permission ID and description.\n */\n listTeamPermissionDefinitionsPaginated(options: { limit: number, cursor?: string, query?: string }): Promise<{ items: AdminTeamPermissionDefinition[], nextCursor: string | null }>,\n\n createProjectPermissionDefinition(data: AdminProjectPermissionDefinitionCreateOptions): Promise<AdminProjectPermission>,\n updateProjectPermissionDefinition(permissionId: string, data: AdminProjectPermissionDefinitionUpdateOptions): Promise<void>,\n deleteProjectPermissionDefinition(permissionId: string): Promise<void>,\n\n\n sendTestEmail(options: {\n recipientEmail: string,\n emailConfig: EmailConfig,\n }): Promise<Result<undefined, { errorMessage: string }>>,\n\n sendTestWebhook(options: { endpointId: string }): Promise<Result<undefined, { errorMessage: string }>>,\n\n sendSignInInvitationEmail(email: string, callbackUrl: string): Promise<void>,\n\n listSentEmails(): Promise<AdminSentEmail[]>,\n setupManagedEmailProvider(options: { subdomain: string, senderLocalPart: string }): Promise<ManagedEmailProviderSetupResult>,\n checkManagedEmailStatus(options: { domainId: string, subdomain: string, senderLocalPart: string }): Promise<ManagedEmailProviderStatus>,\n listManagedEmailDomains(): Promise<ManagedEmailProviderListItem[]>,\n applyManagedEmailProvider(options: { domainId: string }): Promise<{ status: \"applied\" }>,\n deleteManagedEmailDomain(options: { resendDomainId: string }): Promise<{ status: \"deleted\" }>,\n\n createEmailTheme(displayName: string): Promise<{ id: string }>,\n updateEmailTheme(id: string, tsxSource: string): Promise<void>,\n deleteEmailTheme(id: string): Promise<void>,\n saveChatMessage(threadId: string, message: any): Promise<void>,\n listChatMessages(threadId: string): Promise<{ messages: Array<any> }>,\n rewriteTemplateSourceWithAI(templateTsxSource: string): Promise<{ tsxSource: string }>,\n updateEmailTemplate(id: string, tsxSource: string, themeId: string | null | false): Promise<{ renderedHtml: string }>,\n createEmailTemplate(displayName: string): Promise<{ id: string }>,\n deleteEmailTemplate(id: string): Promise<void>,\n\n setupPayments(): Promise<{ url: string }>,\n createStripeWidgetAccountSession(): Promise<{ client_secret: string }>,\n getPaymentMethodConfigs(): Promise<{ configId: string, methods: Array<{ id: string, name: string, enabled: boolean, available: boolean, overridable: boolean }> } | null>,\n updatePaymentMethodConfigs(configId: string, updates: Record<string, 'on' | 'off'>): Promise<void>,\n createEmailDraft(options: { displayName: string, themeId?: string | undefined | false, tsxSource?: string }): Promise<{ id: string }>,\n updateEmailDraft(id: string, data: { displayName?: string, themeId?: string | undefined | false, tsxSource?: string }): Promise<void>,\n deleteEmailDraft(id: string): Promise<void>,\n refreshEmailDrafts(): Promise<void>,\n createItemQuantityChange(options: (\n { userId: string, itemId: string, quantity: number, expiresAt?: string, description?: string } |\n { teamId: string, itemId: string, quantity: number, expiresAt?: string, description?: string } |\n { customCustomerId: string, itemId: string, quantity: number, expiresAt?: string, description?: string }\n )): Promise<void>,\n refundTransaction(options: {\n type: \"subscription\" | \"one-time-purchase\",\n id: string,\n invoiceId?: string,\n amountUsd: MoneyAmount,\n endAction?: \"now\" | \"at-period-end\",\n }): Promise<{ refundTransactionId: string }>,\n queryAnalytics(options: AnalyticsQueryOptions): Promise<AnalyticsQueryResponse>,\n getAnalyticsClickmap(options: AnalyticsClickmapOptions): Promise<AnalyticsClickmapResponse>,\n createAnalyticsClickmapToken(options: { origin: string }): Promise<AnalyticsClickmapTokenResponse>,\n\n listSessionReplays(options?: ListSessionReplaysOptions): Promise<ListSessionReplaysResult>,\n getSessionReplay(sessionReplayId: string): Promise<AdminSessionReplay>,\n listSessionReplayChunks(sessionReplayId: string, options?: ListSessionReplayChunksOptions): Promise<ListSessionReplayChunksResult>,\n getSessionReplayChunkEvents(sessionReplayId: string, chunkId: string): Promise<AdminGetSessionReplayChunkEventsResponse>,\n getSessionReplayEvents(sessionReplayId: string, options?: { offset?: number, limit?: number }): Promise<SessionReplayAllEventsResult>,\n\n // Email Outbox methods\n listOutboxEmails(options?: EmailOutboxListOptions): Promise<EmailOutboxListResult>,\n getOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n updateOutboxEmail(id: string, options: EmailOutboxUpdateOptions): Promise<AdminEmailOutbox>,\n pauseOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n unpauseOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n cancelOutboxEmail(id: string): Promise<AdminEmailOutbox>,\n }\n & StackServerApp<HasTokenStore, ProjectId>\n);\n/** @deprecated Use `HexclaveAdminAppConstructor` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackAdminAppConstructor = {\n new <\n HasTokenStore extends boolean,\n ProjectId extends string\n >(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>,\n new(options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>,\n};\nexport type HexclaveAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackAdminAppConstructorOptions<HasTokenStore, ProjectId>;\nexport type HexclaveAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = StackAdminApp<HasTokenStore, ProjectId>;\nexport type HexclaveAdminAppConstructor = StackAdminAppConstructor;\nexport const HexclaveAdminApp: HexclaveAdminAppConstructor = _HexclaveAdminAppImpl;\n/** @deprecated Use `HexclaveAdminApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport const StackAdminApp: StackAdminAppConstructor = HexclaveAdminApp;\n"],"mappings":";;;AA6LA,MAAa,mBAAgD;;AAE7D,MAAa,gBAA0C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-styles.d.ts","names":[],"sources":["../../src/in-page-ui/base-styles.ts"],"mappings":";iBAUgB,kBAAA,CAAmB,aAAA"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/in-page-ui/base-styles.ts
|
|
4
|
+
function getInPageUiBaseCSS(scopeSelector) {
|
|
5
|
+
return `
|
|
6
|
+
${scopeSelector} {
|
|
7
|
+
--sdt-bg: #0a0a0b;
|
|
8
|
+
--sdt-bg-elevated: #141416;
|
|
9
|
+
--sdt-bg-hover: #1c1c1f;
|
|
10
|
+
--sdt-bg-active: #232326;
|
|
11
|
+
--sdt-bg-subtle: #111113;
|
|
12
|
+
--sdt-border: #2a2a2e;
|
|
13
|
+
--sdt-border-subtle: #1e1e22;
|
|
14
|
+
--sdt-text: #ececef;
|
|
15
|
+
--sdt-text-secondary: #8b8b93;
|
|
16
|
+
--sdt-text-tertiary: #5c5c66;
|
|
17
|
+
--sdt-accent: #6366f1;
|
|
18
|
+
--sdt-accent-hover: #818cf8;
|
|
19
|
+
--sdt-accent-muted: rgba(99, 102, 241, 0.15);
|
|
20
|
+
--sdt-success: #22c55e;
|
|
21
|
+
--sdt-success-muted: rgba(34, 197, 94, 0.15);
|
|
22
|
+
--sdt-warning: #eab308;
|
|
23
|
+
--sdt-warning-muted: rgba(234, 179, 8, 0.15);
|
|
24
|
+
--sdt-error: #ef4444;
|
|
25
|
+
--sdt-error-muted: rgba(239, 68, 68, 0.15);
|
|
26
|
+
--sdt-info: #3b82f6;
|
|
27
|
+
--sdt-info-muted: rgba(59, 130, 246, 0.15);
|
|
28
|
+
--sdt-overlay-bg: rgba(17, 17, 19, 0.92);
|
|
29
|
+
--sdt-radius: 8px;
|
|
30
|
+
--sdt-radius-sm: 4px;
|
|
31
|
+
--sdt-radius-lg: 12px;
|
|
32
|
+
--sdt-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
33
|
+
--sdt-font-mono: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas, monospace;
|
|
34
|
+
--sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05);
|
|
35
|
+
--sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.08);
|
|
36
|
+
|
|
37
|
+
all: initial;
|
|
38
|
+
font-family: var(--sdt-font);
|
|
39
|
+
color: var(--sdt-text);
|
|
40
|
+
font-size: 13px;
|
|
41
|
+
line-height: 1.5;
|
|
42
|
+
-webkit-font-smoothing: antialiased;
|
|
43
|
+
-moz-osx-font-smoothing: grayscale;
|
|
44
|
+
box-sizing: border-box;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
${scopeSelector} *, ${scopeSelector} *::before, ${scopeSelector} *::after {
|
|
48
|
+
box-sizing: border-box;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* Thin, unobtrusive scrollbars for every scroll container */
|
|
52
|
+
${scopeSelector} * {
|
|
53
|
+
scrollbar-width: thin;
|
|
54
|
+
scrollbar-color: var(--sdt-border) transparent;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
${scopeSelector} *::-webkit-scrollbar {
|
|
58
|
+
width: 6px;
|
|
59
|
+
height: 6px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
${scopeSelector} *::-webkit-scrollbar-track {
|
|
63
|
+
background: transparent;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
${scopeSelector} *::-webkit-scrollbar-thumb {
|
|
67
|
+
background: var(--sdt-border);
|
|
68
|
+
border-radius: 3px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
${scopeSelector} *::-webkit-scrollbar-thumb:hover {
|
|
72
|
+
background: var(--sdt-text-tertiary);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
${scopeSelector} *::-webkit-scrollbar-corner {
|
|
76
|
+
background: transparent;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* --- Light theme: system preference fallback --- */
|
|
80
|
+
@media (prefers-color-scheme: light) {
|
|
81
|
+
${scopeSelector} {
|
|
82
|
+
--sdt-bg: #ffffff;
|
|
83
|
+
--sdt-bg-elevated: #f8f8fa;
|
|
84
|
+
--sdt-bg-hover: #f0f0f3;
|
|
85
|
+
--sdt-bg-active: #e8e8ec;
|
|
86
|
+
--sdt-bg-subtle: #fafafa;
|
|
87
|
+
--sdt-border: #e0e0e5;
|
|
88
|
+
--sdt-border-subtle: #eaeaef;
|
|
89
|
+
--sdt-text: #111113;
|
|
90
|
+
--sdt-text-secondary: #6b6b73;
|
|
91
|
+
--sdt-text-tertiary: #9b9ba3;
|
|
92
|
+
--sdt-accent: #6366f1;
|
|
93
|
+
--sdt-accent-hover: #4f46e5;
|
|
94
|
+
--sdt-accent-muted: rgba(99, 102, 241, 0.1);
|
|
95
|
+
--sdt-success: #16a34a;
|
|
96
|
+
--sdt-success-muted: rgba(22, 163, 74, 0.1);
|
|
97
|
+
--sdt-warning: #ca8a04;
|
|
98
|
+
--sdt-warning-muted: rgba(202, 138, 4, 0.1);
|
|
99
|
+
--sdt-error: #dc2626;
|
|
100
|
+
--sdt-error-muted: rgba(220, 38, 38, 0.1);
|
|
101
|
+
--sdt-info: #2563eb;
|
|
102
|
+
--sdt-info-muted: rgba(37, 99, 235, 0.1);
|
|
103
|
+
--sdt-overlay-bg: rgba(255, 255, 255, 0.92);
|
|
104
|
+
--sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);
|
|
105
|
+
--sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.06);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* --- Stack theme explicit overrides (take priority over system preference) --- */
|
|
110
|
+
html:has(head > [data-stack-theme="light"]) ${scopeSelector} {
|
|
111
|
+
--sdt-bg: #ffffff;
|
|
112
|
+
--sdt-bg-elevated: #f8f8fa;
|
|
113
|
+
--sdt-bg-hover: #f0f0f3;
|
|
114
|
+
--sdt-bg-active: #e8e8ec;
|
|
115
|
+
--sdt-bg-subtle: #fafafa;
|
|
116
|
+
--sdt-border: #e0e0e5;
|
|
117
|
+
--sdt-border-subtle: #eaeaef;
|
|
118
|
+
--sdt-text: #111113;
|
|
119
|
+
--sdt-text-secondary: #6b6b73;
|
|
120
|
+
--sdt-text-tertiary: #9b9ba3;
|
|
121
|
+
--sdt-accent: #6366f1;
|
|
122
|
+
--sdt-accent-hover: #4f46e5;
|
|
123
|
+
--sdt-accent-muted: rgba(99, 102, 241, 0.1);
|
|
124
|
+
--sdt-success: #16a34a;
|
|
125
|
+
--sdt-success-muted: rgba(22, 163, 74, 0.1);
|
|
126
|
+
--sdt-warning: #ca8a04;
|
|
127
|
+
--sdt-warning-muted: rgba(202, 138, 4, 0.1);
|
|
128
|
+
--sdt-error: #dc2626;
|
|
129
|
+
--sdt-error-muted: rgba(220, 38, 38, 0.1);
|
|
130
|
+
--sdt-info: #2563eb;
|
|
131
|
+
--sdt-info-muted: rgba(37, 99, 235, 0.1);
|
|
132
|
+
--sdt-overlay-bg: rgba(255, 255, 255, 0.92);
|
|
133
|
+
--sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);
|
|
134
|
+
--sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.06);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
html:has(head > [data-stack-theme="dark"]) ${scopeSelector} {
|
|
138
|
+
--sdt-bg: #0a0a0b;
|
|
139
|
+
--sdt-bg-elevated: #141416;
|
|
140
|
+
--sdt-bg-hover: #1c1c1f;
|
|
141
|
+
--sdt-bg-active: #232326;
|
|
142
|
+
--sdt-bg-subtle: #111113;
|
|
143
|
+
--sdt-border: #2a2a2e;
|
|
144
|
+
--sdt-border-subtle: #1e1e22;
|
|
145
|
+
--sdt-text: #ececef;
|
|
146
|
+
--sdt-text-secondary: #8b8b93;
|
|
147
|
+
--sdt-text-tertiary: #5c5c66;
|
|
148
|
+
--sdt-accent: #6366f1;
|
|
149
|
+
--sdt-accent-hover: #818cf8;
|
|
150
|
+
--sdt-accent-muted: rgba(99, 102, 241, 0.15);
|
|
151
|
+
--sdt-success: #22c55e;
|
|
152
|
+
--sdt-success-muted: rgba(34, 197, 94, 0.15);
|
|
153
|
+
--sdt-warning: #eab308;
|
|
154
|
+
--sdt-warning-muted: rgba(234, 179, 8, 0.15);
|
|
155
|
+
--sdt-error: #ef4444;
|
|
156
|
+
--sdt-error-muted: rgba(239, 68, 68, 0.15);
|
|
157
|
+
--sdt-info: #3b82f6;
|
|
158
|
+
--sdt-info-muted: rgba(59, 130, 246, 0.15);
|
|
159
|
+
--sdt-overlay-bg: rgba(17, 17, 19, 0.92);
|
|
160
|
+
--sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05);
|
|
161
|
+
--sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.08);
|
|
162
|
+
}
|
|
163
|
+
`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
//#endregion
|
|
167
|
+
exports.getInPageUiBaseCSS = getInPageUiBaseCSS;
|
|
168
|
+
//# sourceMappingURL=base-styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-styles.js","names":[],"sources":["../../src/in-page-ui/base-styles.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// Shared design tokens + base reset for Hexclave's in-page UIs (the dev tool\n// and the standalone clickmap overlay). Each feature passes its own scope\n// selector so the two stylesheets never collide, while the tokens stay defined\n// in exactly one place. This module deliberately lives outside both feature\n// folders so either feature can be removed without affecting the other.\n\nexport function getInPageUiBaseCSS(scopeSelector: string): string {\n return `\n ${scopeSelector} {\n --sdt-bg: #0a0a0b;\n --sdt-bg-elevated: #141416;\n --sdt-bg-hover: #1c1c1f;\n --sdt-bg-active: #232326;\n --sdt-bg-subtle: #111113;\n --sdt-border: #2a2a2e;\n --sdt-border-subtle: #1e1e22;\n --sdt-text: #ececef;\n --sdt-text-secondary: #8b8b93;\n --sdt-text-tertiary: #5c5c66;\n --sdt-accent: #6366f1;\n --sdt-accent-hover: #818cf8;\n --sdt-accent-muted: rgba(99, 102, 241, 0.15);\n --sdt-success: #22c55e;\n --sdt-success-muted: rgba(34, 197, 94, 0.15);\n --sdt-warning: #eab308;\n --sdt-warning-muted: rgba(234, 179, 8, 0.15);\n --sdt-error: #ef4444;\n --sdt-error-muted: rgba(239, 68, 68, 0.15);\n --sdt-info: #3b82f6;\n --sdt-info-muted: rgba(59, 130, 246, 0.15);\n --sdt-overlay-bg: rgba(17, 17, 19, 0.92);\n --sdt-radius: 8px;\n --sdt-radius-sm: 4px;\n --sdt-radius-lg: 12px;\n --sdt-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n --sdt-font-mono: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas, monospace;\n --sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05);\n --sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.08);\n\n all: initial;\n font-family: var(--sdt-font);\n color: var(--sdt-text);\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-sizing: border-box;\n }\n\n ${scopeSelector} *, ${scopeSelector} *::before, ${scopeSelector} *::after {\n box-sizing: border-box;\n }\n\n /* Thin, unobtrusive scrollbars for every scroll container */\n ${scopeSelector} * {\n scrollbar-width: thin;\n scrollbar-color: var(--sdt-border) transparent;\n }\n\n ${scopeSelector} *::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n ${scopeSelector} *::-webkit-scrollbar-track {\n background: transparent;\n }\n\n ${scopeSelector} *::-webkit-scrollbar-thumb {\n background: var(--sdt-border);\n border-radius: 3px;\n }\n\n ${scopeSelector} *::-webkit-scrollbar-thumb:hover {\n background: var(--sdt-text-tertiary);\n }\n\n ${scopeSelector} *::-webkit-scrollbar-corner {\n background: transparent;\n }\n\n /* --- Light theme: system preference fallback --- */\n @media (prefers-color-scheme: light) {\n ${scopeSelector} {\n --sdt-bg: #ffffff;\n --sdt-bg-elevated: #f8f8fa;\n --sdt-bg-hover: #f0f0f3;\n --sdt-bg-active: #e8e8ec;\n --sdt-bg-subtle: #fafafa;\n --sdt-border: #e0e0e5;\n --sdt-border-subtle: #eaeaef;\n --sdt-text: #111113;\n --sdt-text-secondary: #6b6b73;\n --sdt-text-tertiary: #9b9ba3;\n --sdt-accent: #6366f1;\n --sdt-accent-hover: #4f46e5;\n --sdt-accent-muted: rgba(99, 102, 241, 0.1);\n --sdt-success: #16a34a;\n --sdt-success-muted: rgba(22, 163, 74, 0.1);\n --sdt-warning: #ca8a04;\n --sdt-warning-muted: rgba(202, 138, 4, 0.1);\n --sdt-error: #dc2626;\n --sdt-error-muted: rgba(220, 38, 38, 0.1);\n --sdt-info: #2563eb;\n --sdt-info-muted: rgba(37, 99, 235, 0.1);\n --sdt-overlay-bg: rgba(255, 255, 255, 0.92);\n --sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\n --sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.06);\n }\n }\n\n /* --- Stack theme explicit overrides (take priority over system preference) --- */\n html:has(head > [data-stack-theme=\"light\"]) ${scopeSelector} {\n --sdt-bg: #ffffff;\n --sdt-bg-elevated: #f8f8fa;\n --sdt-bg-hover: #f0f0f3;\n --sdt-bg-active: #e8e8ec;\n --sdt-bg-subtle: #fafafa;\n --sdt-border: #e0e0e5;\n --sdt-border-subtle: #eaeaef;\n --sdt-text: #111113;\n --sdt-text-secondary: #6b6b73;\n --sdt-text-tertiary: #9b9ba3;\n --sdt-accent: #6366f1;\n --sdt-accent-hover: #4f46e5;\n --sdt-accent-muted: rgba(99, 102, 241, 0.1);\n --sdt-success: #16a34a;\n --sdt-success-muted: rgba(22, 163, 74, 0.1);\n --sdt-warning: #ca8a04;\n --sdt-warning-muted: rgba(202, 138, 4, 0.1);\n --sdt-error: #dc2626;\n --sdt-error-muted: rgba(220, 38, 38, 0.1);\n --sdt-info: #2563eb;\n --sdt-info-muted: rgba(37, 99, 235, 0.1);\n --sdt-overlay-bg: rgba(255, 255, 255, 0.92);\n --sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\n --sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.06);\n }\n\n html:has(head > [data-stack-theme=\"dark\"]) ${scopeSelector} {\n --sdt-bg: #0a0a0b;\n --sdt-bg-elevated: #141416;\n --sdt-bg-hover: #1c1c1f;\n --sdt-bg-active: #232326;\n --sdt-bg-subtle: #111113;\n --sdt-border: #2a2a2e;\n --sdt-border-subtle: #1e1e22;\n --sdt-text: #ececef;\n --sdt-text-secondary: #8b8b93;\n --sdt-text-tertiary: #5c5c66;\n --sdt-accent: #6366f1;\n --sdt-accent-hover: #818cf8;\n --sdt-accent-muted: rgba(99, 102, 241, 0.15);\n --sdt-success: #22c55e;\n --sdt-success-muted: rgba(34, 197, 94, 0.15);\n --sdt-warning: #eab308;\n --sdt-warning-muted: rgba(234, 179, 8, 0.15);\n --sdt-error: #ef4444;\n --sdt-error-muted: rgba(239, 68, 68, 0.15);\n --sdt-info: #3b82f6;\n --sdt-info-muted: rgba(59, 130, 246, 0.15);\n --sdt-overlay-bg: rgba(17, 17, 19, 0.92);\n --sdt-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05);\n --sdt-trigger-shadow: 0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.08);\n }\n`;\n}\n"],"mappings":";;;AAUA,SAAgB,mBAAmB,eAA+B;AAChE,QAAO;IACL,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyCd,cAAc,MAAM,cAAc,cAAc,cAAc;;;;;IAK9D,cAAc;;;;;IAKd,cAAc;;;;;IAKd,cAAc;;;;IAId,cAAc;;;;;IAKd,cAAc;;;;IAId,cAAc;;;;;;MAMZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDA6B4B,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA2Bf,cAAc"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/in-page-ui/dom.d.ts
|
|
2
|
+
declare function h<K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, any> | null, ...children: (string | Node | null | undefined)[]): HTMLElementTagNameMap[K];
|
|
3
|
+
declare function setHtml(el: HTMLElement, html: string): void;
|
|
4
|
+
declare function hasAppendChild(value: unknown): value is {
|
|
5
|
+
appendChild(node: Node): void;
|
|
6
|
+
};
|
|
7
|
+
declare function canMountIntoDom(): boolean;
|
|
8
|
+
type UiGlobalInstance = {
|
|
9
|
+
cleanup: () => void;
|
|
10
|
+
};
|
|
11
|
+
declare function getGlobalUiInstance(key: string): UiGlobalInstance | null;
|
|
12
|
+
declare function setGlobalUiInstance(key: string, instance: UiGlobalInstance | null): void;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { UiGlobalInstance, canMountIntoDom, getGlobalUiInstance, h, hasAppendChild, setGlobalUiInstance, setHtml };
|
|
15
|
+
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.d.ts","names":[],"sources":["../../src/in-page-ui/dom.ts"],"mappings":";iBAQgB,CAAA,iBAAkB,qBAAA,CAAA,CAChC,GAAA,EAAK,CAAA,EACL,KAAA,GAAQ,MAAA,yBACL,QAAA,YAAoB,IAAA,yBACtB,qBAAA,CAAsB,CAAA;AAAA,iBAuBT,OAAA,CAAQ,EAAA,EAAI,WAAA,EAAa,IAAA;AAAA,iBAIzB,cAAA,CAAe,KAAA,YAAiB,KAAA;EAAW,WAAA,CAAY,IAAA,EAAM,IAAA;AAAA;AAAA,iBAI7D,eAAA,CAAA;AAAA,KAeJ,gBAAA;EACV,OAAA;AAAA;AAAA,iBAOc,mBAAA,CAAoB,GAAA,WAAc,gBAAA;AAAA,iBAMlC,mBAAA,CAAoB,GAAA,UAAa,QAAA,EAAU,gBAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/in-page-ui/dom.ts
|
|
4
|
+
function h(tag, attrs, ...children) {
|
|
5
|
+
const el = document.createElement(tag);
|
|
6
|
+
if (attrs) for (const [k, v] of Object.entries(attrs)) {
|
|
7
|
+
if (v == null) continue;
|
|
8
|
+
if (k === "className") el.className = v;
|
|
9
|
+
else if (k === "style" && typeof v === "object") Object.assign(el.style, v);
|
|
10
|
+
else if (k.startsWith("on") && typeof v === "function") el.addEventListener(k.slice(2).toLowerCase(), v);
|
|
11
|
+
else el.setAttribute(k, String(v));
|
|
12
|
+
}
|
|
13
|
+
for (const child of children) {
|
|
14
|
+
if (child == null) continue;
|
|
15
|
+
el.appendChild(typeof child === "string" ? document.createTextNode(child) : child);
|
|
16
|
+
}
|
|
17
|
+
return el;
|
|
18
|
+
}
|
|
19
|
+
function setHtml(el, html) {
|
|
20
|
+
el.innerHTML = html;
|
|
21
|
+
}
|
|
22
|
+
function hasAppendChild(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && typeof Reflect.get(value, "appendChild") === "function";
|
|
24
|
+
}
|
|
25
|
+
function canMountIntoDom() {
|
|
26
|
+
if (typeof window === "undefined" || typeof document === "undefined") return false;
|
|
27
|
+
if (typeof document.createElement !== "function") return false;
|
|
28
|
+
return hasAppendChild(Reflect.get(document, "body"));
|
|
29
|
+
}
|
|
30
|
+
function isUiGlobalInstance(value) {
|
|
31
|
+
return typeof value === "object" && value !== null && typeof Reflect.get(value, "cleanup") === "function";
|
|
32
|
+
}
|
|
33
|
+
function getGlobalUiInstance(key) {
|
|
34
|
+
if (typeof window === "undefined") return null;
|
|
35
|
+
const value = Reflect.get(window, key);
|
|
36
|
+
return isUiGlobalInstance(value) ? value : null;
|
|
37
|
+
}
|
|
38
|
+
function setGlobalUiInstance(key, instance) {
|
|
39
|
+
if (typeof window === "undefined") return;
|
|
40
|
+
if (instance === null) Reflect.deleteProperty(window, key);
|
|
41
|
+
else Reflect.set(window, key, instance);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
exports.canMountIntoDom = canMountIntoDom;
|
|
46
|
+
exports.getGlobalUiInstance = getGlobalUiInstance;
|
|
47
|
+
exports.h = h;
|
|
48
|
+
exports.hasAppendChild = hasAppendChild;
|
|
49
|
+
exports.setGlobalUiInstance = setGlobalUiInstance;
|
|
50
|
+
exports.setHtml = setHtml;
|
|
51
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","names":[],"sources":["../../src/in-page-ui/dom.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// Tiny DOM helpers shared by Hexclave's in-page UIs (the dev tool and the\n// standalone clickmap overlay). This module deliberately lives outside both\n// feature folders so either feature can be removed without affecting the other.\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs?: Record<string, any> | null,\n ...children: (string | Node | null | undefined)[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) {\n if (v == null) continue;\n if (k === 'className') {\n el.className = v;\n } else if (k === 'style' && typeof v === 'object') {\n Object.assign(el.style, v);\n } else if (k.startsWith('on') && typeof v === 'function') {\n el.addEventListener(k.slice(2).toLowerCase(), v);\n } else {\n el.setAttribute(k, String(v));\n }\n }\n }\n for (const child of children) {\n if (child == null) continue;\n el.appendChild(typeof child === 'string' ? document.createTextNode(child) : child);\n }\n return el;\n}\n\nexport function setHtml(el: HTMLElement, html: string) {\n el.innerHTML = html;\n}\n\nexport function hasAppendChild(value: unknown): value is { appendChild(node: Node): void } {\n return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'appendChild') === 'function';\n}\n\nexport function canMountIntoDom(): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return false;\n }\n if (typeof document.createElement !== 'function') {\n return false;\n }\n return hasAppendChild(Reflect.get(document, 'body'));\n}\n\n// ---------------------------------------------------------------------------\n// Window-global singleton slot, so remounts (e.g. across HMR or multiple app\n// instances) can tear down the previous instance before mounting a new one.\n// ---------------------------------------------------------------------------\n\nexport type UiGlobalInstance = {\n cleanup: () => void;\n};\n\nfunction isUiGlobalInstance(value: unknown): value is UiGlobalInstance {\n return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'cleanup') === 'function';\n}\n\nexport function getGlobalUiInstance(key: string): UiGlobalInstance | null {\n if (typeof window === 'undefined') return null;\n const value: unknown = Reflect.get(window, key);\n return isUiGlobalInstance(value) ? value : null;\n}\n\nexport function setGlobalUiInstance(key: string, instance: UiGlobalInstance | null) {\n if (typeof window === 'undefined') return;\n if (instance === null) {\n Reflect.deleteProperty(window, key);\n } else {\n Reflect.set(window, key, instance);\n }\n}\n"],"mappings":";;;AAQA,SAAgB,EACd,KACA,OACA,GAAG,UACuB;CAC1B,MAAM,KAAK,SAAS,cAAc,IAAI;AACtC,KAAI,MACF,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,EAAE;AAC1C,MAAI,KAAK,KAAM;AACf,MAAI,MAAM,YACR,IAAG,YAAY;WACN,MAAM,WAAW,OAAO,MAAM,SACvC,QAAO,OAAO,GAAG,OAAO,EAAE;WACjB,EAAE,WAAW,KAAK,IAAI,OAAO,MAAM,WAC5C,IAAG,iBAAiB,EAAE,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE;MAEhD,IAAG,aAAa,GAAG,OAAO,EAAE,CAAC;;AAInC,MAAK,MAAM,SAAS,UAAU;AAC5B,MAAI,SAAS,KAAM;AACnB,KAAG,YAAY,OAAO,UAAU,WAAW,SAAS,eAAe,MAAM,GAAG,MAAM;;AAEpF,QAAO;;AAGT,SAAgB,QAAQ,IAAiB,MAAc;AACrD,IAAG,YAAY;;AAGjB,SAAgB,eAAe,OAA4D;AACzF,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,QAAQ,IAAI,OAAO,cAAc,KAAK;;AAGrG,SAAgB,kBAA2B;AACzC,KAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YACvD,QAAO;AAET,KAAI,OAAO,SAAS,kBAAkB,WACpC,QAAO;AAET,QAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,CAAC;;AAYtD,SAAS,mBAAmB,OAA2C;AACrE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,QAAQ,IAAI,OAAO,UAAU,KAAK;;AAGjG,SAAgB,oBAAoB,KAAsC;AACxE,KAAI,OAAO,WAAW,YAAa,QAAO;CAC1C,MAAM,QAAiB,QAAQ,IAAI,QAAQ,IAAI;AAC/C,QAAO,mBAAmB,MAAM,GAAG,QAAQ;;AAG7C,SAAgB,oBAAoB,KAAa,UAAmC;AAClF,KAAI,OAAO,WAAW,YAAa;AACnC,KAAI,aAAa,KACf,SAAQ,eAAe,QAAQ,IAAI;KAEnC,SAAQ,IAAI,QAAQ,KAAK,SAAS"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FunctionReference } from "../../../storage-
|
|
1
|
+
import { n as FunctionReference } from "../../../storage-CKsyME2q.js";
|
|
2
2
|
|
|
3
3
|
//#region ../../node_modules/.pnpm/convex@1.27.0_react@19.2.1/node_modules/convex/dist/cjs-types/server/components/index.d.ts
|
|
4
4
|
interface ComponentExports {
|
package/dist/lib/auth.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
3
|
+
let _hexclave_shared_dist_utils_strings = require("@hexclave/shared/dist/utils/strings");
|
|
3
4
|
let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
|
|
4
5
|
let _hexclave_shared = require("@hexclave/shared");
|
|
5
6
|
let _hexclave_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
|
|
6
|
-
let _hexclave_shared_dist_utils_strings = require("@hexclave/shared/dist/utils/strings");
|
|
7
7
|
let ___utils_url_js = require("../utils/url.js");
|
|
8
8
|
let __cookie_js = require("./cookie.js");
|
|
9
9
|
|
|
@@ -17,6 +17,7 @@ import * as _hexclave_shared_dist_interface_client_interface0 from "@hexclave/sh
|
|
|
17
17
|
import { RestrictedReason } from "@hexclave/shared/dist/schema-fields";
|
|
18
18
|
import { ProjectsCrud } from "@hexclave/shared/dist/interface/crud/projects";
|
|
19
19
|
import { CompleteConfig } from "@hexclave/shared/dist/config/schema";
|
|
20
|
+
import { AnalyticsClickmapOptions, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse } from "@hexclave/shared/dist/interface/admin-metrics";
|
|
20
21
|
import { AnalyticsQueryOptions, AnalyticsQueryResponse } from "@hexclave/shared/dist/interface/crud/analytics";
|
|
21
22
|
import { AdminGetSessionReplayChunkEventsResponse } from "@hexclave/shared/dist/interface/crud/session-replays";
|
|
22
23
|
import { Transaction, TransactionType } from "@hexclave/shared/dist/interface/crud/transactions";
|
|
@@ -337,6 +338,10 @@ declare class _HexclaveAdminAppImplIncomplete<HasTokenStore extends boolean, Pro
|
|
|
337
338
|
payouts_enabled: boolean;
|
|
338
339
|
}>;
|
|
339
340
|
queryAnalytics(options: AnalyticsQueryOptions): Promise<AnalyticsQueryResponse>;
|
|
341
|
+
getAnalyticsClickmap(options: AnalyticsClickmapOptions): Promise<AnalyticsClickmapResponse>;
|
|
342
|
+
createAnalyticsClickmapToken(options: {
|
|
343
|
+
origin: string;
|
|
344
|
+
}): Promise<AnalyticsClickmapTokenResponse>;
|
|
340
345
|
listSessionReplays(options?: ListSessionReplaysOptions): Promise<ListSessionReplaysResult>;
|
|
341
346
|
getSessionReplay(sessionReplayId: string): Promise<AdminSessionReplay>;
|
|
342
347
|
listSessionReplayChunks(sessionReplayId: string, options?: ListSessionReplayChunksOptions): Promise<ListSessionReplayChunksResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-app-impl.d.ts","names":[],"sources":["../../../../../src/lib/hexclave-app/apps/implementations/admin-app-impl.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin-app-impl.d.ts","names":[],"sources":["../../../../../src/lib/hexclave-app/apps/implementations/admin-app-impl.ts"],"mappings":"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"}
|
|
@@ -824,6 +824,26 @@ var _HexclaveAdminAppImplIncomplete = class extends __server_app_impl_js._Hexcla
|
|
|
824
824
|
async queryAnalytics(options) {
|
|
825
825
|
return await this._interface.queryAnalytics(options);
|
|
826
826
|
}
|
|
827
|
+
async getAnalyticsClickmap(options) {
|
|
828
|
+
return await this._interface.getAnalyticsClickmap({
|
|
829
|
+
kind: options.kind,
|
|
830
|
+
member_user_ids: options.memberUserIds,
|
|
831
|
+
route_path: options.routePath,
|
|
832
|
+
route_regex: options.routeRegex,
|
|
833
|
+
url_pattern: options.urlPattern,
|
|
834
|
+
user_id: options.userId,
|
|
835
|
+
replay_id: options.replayId,
|
|
836
|
+
device: options.device,
|
|
837
|
+
viewport_width_min: options.viewportWidthMin,
|
|
838
|
+
viewport_width_max: options.viewportWidthMax,
|
|
839
|
+
sampling: options.sampling,
|
|
840
|
+
since: options.since,
|
|
841
|
+
until: options.until
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
async createAnalyticsClickmapToken(options) {
|
|
845
|
+
return await this._interface.createAnalyticsClickmapToken(options);
|
|
846
|
+
}
|
|
827
847
|
async listSessionReplays(options) {
|
|
828
848
|
const response = await this._interface.listSessionReplays({
|
|
829
849
|
cursor: options?.cursor,
|