@interfere/react 0.1.0-alpha.6 → 0.2.0-alpha.2
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/README.md +90 -0
- package/dist/error-boundary.d.mts +27 -0
- package/dist/error-boundary.d.mts.map +1 -0
- package/dist/error-boundary.mjs +42 -0
- package/dist/error-boundary.mjs.map +1 -0
- package/dist/internal/client.d.mts +13 -0
- package/dist/internal/client.d.mts.map +1 -0
- package/dist/internal/client.mjs +80 -0
- package/dist/internal/client.mjs.map +1 -0
- package/dist/internal/config.d.mts +9 -0
- package/dist/internal/config.d.mts.map +1 -0
- package/dist/internal/config.mjs +27 -0
- package/dist/internal/config.mjs.map +1 -0
- package/dist/internal/context.d.mts +6 -0
- package/dist/internal/context.d.mts.map +1 -0
- package/dist/internal/context.mjs +32 -0
- package/dist/internal/context.mjs.map +1 -0
- package/dist/internal/envelope.d.mts +14 -0
- package/dist/internal/envelope.d.mts.map +1 -0
- package/dist/internal/envelope.mjs +20 -0
- package/dist/internal/envelope.mjs.map +1 -0
- package/dist/internal/errors.d.mts +4 -0
- package/dist/internal/errors.d.mts.map +1 -0
- package/dist/internal/errors.mjs +4 -0
- package/dist/internal/errors.mjs.map +1 -0
- package/dist/internal/sw.d.mts +4 -0
- package/dist/internal/sw.d.mts.map +1 -0
- package/dist/internal/sw.mjs +10 -0
- package/dist/internal/sw.mjs.map +1 -0
- package/dist/plugins/errors.d.mts +6 -0
- package/dist/plugins/errors.d.mts.map +1 -0
- package/dist/plugins/errors.mjs +59 -0
- package/dist/plugins/errors.mjs.map +1 -0
- package/dist/plugins/lib/loader.d.mts +9 -0
- package/dist/plugins/lib/loader.d.mts.map +1 -0
- package/dist/plugins/lib/loader.mjs +47 -0
- package/dist/plugins/lib/loader.mjs.map +1 -0
- package/dist/plugins/lib/types.d.mts +14 -0
- package/dist/plugins/lib/types.d.mts.map +1 -0
- package/dist/plugins/lib/types.mjs +1 -0
- package/dist/plugins/pages.d.mts +6 -0
- package/dist/plugins/pages.d.mts.map +1 -0
- package/dist/plugins/pages.mjs +102 -0
- package/dist/plugins/pages.mjs.map +1 -0
- package/dist/plugins/rage-clicks.d.mts +6 -0
- package/dist/plugins/rage-clicks.d.mts.map +1 -0
- package/dist/plugins/rage-clicks.mjs +53 -0
- package/dist/plugins/rage-clicks.mjs.map +1 -0
- package/dist/plugins/replay.d.mts +6 -0
- package/dist/plugins/replay.d.mts.map +1 -0
- package/dist/plugins/replay.mjs +62 -0
- package/dist/plugins/replay.mjs.map +1 -0
- package/dist/provider.d.mts +17 -11
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +18 -17
- package/dist/provider.mjs.map +1 -1
- package/dist/tracking/api.d.mts +22 -0
- package/dist/tracking/api.d.mts.map +1 -0
- package/dist/tracking/api.mjs +88 -0
- package/dist/tracking/api.mjs.map +1 -0
- package/dist/tracking/session.d.mts +19 -0
- package/dist/tracking/session.d.mts.map +1 -0
- package/dist/tracking/session.mjs +92 -0
- package/dist/tracking/session.mjs.map +1 -0
- package/dist/tracking/visitor.d.mts +6 -0
- package/dist/tracking/visitor.d.mts.map +1 -0
- package/dist/tracking/visitor.mjs +35 -0
- package/dist/tracking/visitor.mjs.map +1 -0
- package/dist/transport/http.d.mts +15 -0
- package/dist/transport/http.d.mts.map +1 -0
- package/dist/transport/http.mjs +56 -0
- package/dist/transport/http.mjs.map +1 -0
- package/dist/transport/queue.d.mts +25 -0
- package/dist/transport/queue.d.mts.map +1 -0
- package/dist/transport/queue.mjs +60 -0
- package/dist/transport/queue.mjs.map +1 -0
- package/dist/util/log.d.mts +13 -0
- package/dist/util/log.d.mts.map +1 -0
- package/dist/util/log.mjs +37 -0
- package/dist/util/log.mjs.map +1 -0
- package/package.json +38 -64
- package/dist/client.d.mts +0 -8
- package/dist/client.d.mts.map +0 -1
- package/dist/client.mjs +0 -14
- package/dist/client.mjs.map +0 -1
- package/dist/core/events/define-event.d.mts +0 -12
- package/dist/core/events/define-event.d.mts.map +0 -1
- package/dist/core/events/define-event.mjs +0 -39
- package/dist/core/events/define-event.mjs.map +0 -1
- package/dist/core/events/event-registry.d.mts +0 -23
- package/dist/core/events/event-registry.d.mts.map +0 -1
- package/dist/core/events/event-registry.mjs +0 -32
- package/dist/core/events/event-registry.mjs.map +0 -1
- package/dist/core/events/plugin-event-types.d.mts +0 -130
- package/dist/core/events/plugin-event-types.d.mts.map +0 -1
- package/dist/core/events/plugin-event-types.mjs +0 -25
- package/dist/core/events/plugin-event-types.mjs.map +0 -1
- package/dist/core/plugins/define-plugin.d.mts +0 -43
- package/dist/core/plugins/define-plugin.d.mts.map +0 -1
- package/dist/core/plugins/define-plugin.mjs +0 -23
- package/dist/core/plugins/define-plugin.mjs.map +0 -1
- package/dist/core/plugins/dom-utils.d.mts +0 -9
- package/dist/core/plugins/dom-utils.d.mts.map +0 -1
- package/dist/core/plugins/dom-utils.mjs +0 -25
- package/dist/core/plugins/dom-utils.mjs.map +0 -1
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts +0 -18
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs +0 -17
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/ai-summary/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/ai-summary/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary/plugin.mjs +0 -151
- package/dist/core/plugins/impl/ai-summary/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts +0 -17
- package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/errors-plugin-api.mjs +0 -58
- package/dist/core/plugins/impl/errors/errors-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/logic.d.mts +0 -15
- package/dist/core/plugins/impl/errors/logic.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/logic.mjs +0 -48
- package/dist/core/plugins/impl/errors/logic.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/patches.d.mts +0 -13
- package/dist/core/plugins/impl/errors/patches.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/patches.mjs +0 -43
- package/dist/core/plugins/impl/errors/patches.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/plugin.d.mts +0 -9
- package/dist/core/plugins/impl/errors/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/plugin.mjs +0 -91
- package/dist/core/plugins/impl/errors/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts +0 -19
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs +0 -38
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/page-events/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events/plugin.mjs +0 -95
- package/dist/core/plugins/impl/page-events/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/rage-click/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/plugin.mjs +0 -38
- package/dist/core/plugins/impl/rage-click/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts +0 -9
- package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs +0 -35
- package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts +0 -16
- package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.service.mjs +0 -7
- package/dist/core/plugins/impl/rage-click/rage-click.service.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts +0 -16
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs +0 -18
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs.map +0 -1
- package/dist/core/plugins/impl/replay/plugin.d.mts +0 -9
- package/dist/core/plugins/impl/replay/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay/plugin.mjs +0 -83
- package/dist/core/plugins/impl/replay/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts +0 -18
- package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay/replay-plugin-api.mjs +0 -50
- package/dist/core/plugins/impl/replay/replay-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/plugin.d.mts +0 -13
- package/dist/core/plugins/impl/server-tracing/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/plugin.mjs +0 -75
- package/dist/core/plugins/impl/server-tracing/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts +0 -16
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs +0 -17
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts +0 -29
- package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs +0 -55
- package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs.map +0 -1
- package/dist/core/plugins/plugin-loader.d.mts +0 -75
- package/dist/core/plugins/plugin-loader.d.mts.map +0 -1
- package/dist/core/plugins/plugin-loader.mjs +0 -79
- package/dist/core/plugins/plugin-loader.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.d.mts +0 -12
- package/dist/core/plugins/services/event-capture.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.layer.d.mts +0 -11
- package/dist/core/plugins/services/event-capture.layer.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.layer.mjs +0 -79
- package/dist/core/plugins/services/event-capture.layer.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.mjs +0 -7
- package/dist/core/plugins/services/event-capture.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.test-layer.d.mts +0 -17
- package/dist/core/plugins/services/event-capture.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.test-layer.mjs +0 -21
- package/dist/core/plugins/services/event-capture.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-config.d.mts +0 -11
- package/dist/core/plugins/services/plugin-config.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-config.mjs +0 -7
- package/dist/core/plugins/services/plugin-config.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-config.test-layer.d.mts +0 -60
- package/dist/core/plugins/services/plugin-config.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-config.test-layer.mjs +0 -8
- package/dist/core/plugins/services/plugin-config.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-logger.d.mts +0 -14
- package/dist/core/plugins/services/plugin-logger.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-logger.mjs +0 -7
- package/dist/core/plugins/services/plugin-logger.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-logger.test-layer.d.mts +0 -18
- package/dist/core/plugins/services/plugin-logger.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-logger.test-layer.mjs +0 -28
- package/dist/core/plugins/services/plugin-logger.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.d.mts +0 -10
- package/dist/core/plugins/services/plugin-runtime.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.mjs +0 -7
- package/dist/core/plugins/services/plugin-runtime.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts +0 -16
- package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.test-layer.mjs +0 -21
- package/dist/core/plugins/services/plugin-runtime.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/session-info.d.mts +0 -11
- package/dist/core/plugins/services/session-info.d.mts.map +0 -1
- package/dist/core/plugins/services/session-info.mjs +0 -7
- package/dist/core/plugins/services/session-info.mjs.map +0 -1
- package/dist/core/plugins/services/session-info.test-layer.d.mts +0 -18
- package/dist/core/plugins/services/session-info.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/session-info.test-layer.mjs +0 -20
- package/dist/core/plugins/services/session-info.test-layer.mjs.map +0 -1
- package/dist/core/runtime/config.d.mts +0 -14
- package/dist/core/runtime/config.d.mts.map +0 -1
- package/dist/core/runtime/config.mjs +0 -33
- package/dist/core/runtime/config.mjs.map +0 -1
- package/dist/core/runtime/context.d.mts +0 -50
- package/dist/core/runtime/context.d.mts.map +0 -1
- package/dist/core/runtime/context.mjs +0 -46
- package/dist/core/runtime/context.mjs.map +0 -1
- package/dist/core/runtime/ingest-target.d.mts +0 -10
- package/dist/core/runtime/ingest-target.d.mts.map +0 -1
- package/dist/core/runtime/ingest-target.mjs +0 -15
- package/dist/core/runtime/ingest-target.mjs.map +0 -1
- package/dist/core/runtime/native-fetch.d.mts +0 -32
- package/dist/core/runtime/native-fetch.d.mts.map +0 -1
- package/dist/core/runtime/native-fetch.mjs +0 -49
- package/dist/core/runtime/native-fetch.mjs.map +0 -1
- package/dist/core/schemas.d.mts +0 -26
- package/dist/core/schemas.d.mts.map +0 -1
- package/dist/core/schemas.mjs +0 -1
- package/dist/effect/errors.d.mts +0 -22
- package/dist/effect/errors.d.mts.map +0 -1
- package/dist/effect/errors.mjs +0 -17
- package/dist/effect/errors.mjs.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.d.mts +0 -9
- package/dist/effect/layers/circuit-breaker.layer.d.mts.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.mjs +0 -9
- package/dist/effect/layers/circuit-breaker.layer.mjs.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts +0 -18
- package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs +0 -43
- package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs.map +0 -1
- package/dist/effect/layers/config.layer.d.mts +0 -13
- package/dist/effect/layers/config.layer.d.mts.map +0 -1
- package/dist/effect/layers/config.layer.mjs +0 -21
- package/dist/effect/layers/config.layer.mjs.map +0 -1
- package/dist/effect/layers/context.layer.d.mts +0 -12
- package/dist/effect/layers/context.layer.d.mts.map +0 -1
- package/dist/effect/layers/context.layer.mjs +0 -14
- package/dist/effect/layers/context.layer.mjs.map +0 -1
- package/dist/effect/layers/http.layer.d.mts +0 -21
- package/dist/effect/layers/http.layer.d.mts.map +0 -1
- package/dist/effect/layers/http.layer.mjs +0 -118
- package/dist/effect/layers/http.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.d.mts +0 -31
- package/dist/effect/layers/queue.layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.mjs +0 -257
- package/dist/effect/layers/queue.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.test-layer.d.mts +0 -19
- package/dist/effect/layers/queue.layer.test-layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.test-layer.mjs +0 -44
- package/dist/effect/layers/queue.layer.test-layer.mjs.map +0 -1
- package/dist/effect/layers/session.layer.d.mts +0 -34
- package/dist/effect/layers/session.layer.d.mts.map +0 -1
- package/dist/effect/layers/session.layer.mjs +0 -127
- package/dist/effect/layers/session.layer.mjs.map +0 -1
- package/dist/effect/layers/storage.layer.d.mts +0 -50
- package/dist/effect/layers/storage.layer.d.mts.map +0 -1
- package/dist/effect/layers/storage.layer.mjs +0 -180
- package/dist/effect/layers/storage.layer.mjs.map +0 -1
- package/dist/effect/layers/test-utils.d.mts +0 -19
- package/dist/effect/layers/test-utils.d.mts.map +0 -1
- package/dist/effect/layers/test-utils.mjs +0 -32
- package/dist/effect/layers/test-utils.mjs.map +0 -1
- package/dist/effect/runtime-services.d.mts +0 -23
- package/dist/effect/runtime-services.d.mts.map +0 -1
- package/dist/effect/runtime-services.mjs +0 -79
- package/dist/effect/runtime-services.mjs.map +0 -1
- package/dist/effect/tags.d.mts +0 -58
- package/dist/effect/tags.d.mts.map +0 -1
- package/dist/effect/tags.mjs +0 -7
- package/dist/effect/tags.mjs.map +0 -1
- package/dist/hooks/use-runtime-and-plugins.d.mts +0 -7
- package/dist/hooks/use-runtime-and-plugins.d.mts.map +0 -1
- package/dist/hooks/use-runtime-and-plugins.mjs +0 -121
- package/dist/hooks/use-runtime-and-plugins.mjs.map +0 -1
- package/dist/hooks/use-session.d.mts +0 -40
- package/dist/hooks/use-session.d.mts.map +0 -1
- package/dist/hooks/use-session.mjs +0 -96
- package/dist/hooks/use-session.mjs.map +0 -1
- package/dist/package.mjs +0 -103
- package/dist/package.mjs.map +0 -1
- package/dist/server/auth.d.mts +0 -15
- package/dist/server/auth.d.mts.map +0 -1
- package/dist/server/auth.mjs +0 -45
- package/dist/server/auth.mjs.map +0 -1
- package/dist/server/capture.d.mts +0 -34
- package/dist/server/capture.d.mts.map +0 -1
- package/dist/server/capture.mjs +0 -172
- package/dist/server/capture.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/errors-plugin-api.ts"],"sourcesContent":["import type { ErrorEnvelopePayload } from \"@interfere/types/sdk/plugins/payload/errors\";\n\nimport { Context, Duration, Effect, Layer, Ref } from \"effect\";\n\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\nimport type { ErrorInfo } from \"./logic.js\";\nimport { buildErrorPayload, toStringSafe } from \"./logic.js\";\n\ninterface ErrorsPluginApiService {\n readonly captureConsoleArgsOnce: (\n span: string,\n args: readonly unknown[]\n ) => Effect.Effect<void>;\n readonly captureErrorInfoOnce: (\n span: string,\n info: ErrorInfo,\n meta?: Record<string, unknown>\n ) => Effect.Effect<void>;\n readonly capturePayloadOnce: (\n span: string,\n payload: ErrorEnvelopePayload\n ) => Effect.Effect<void>;\n}\n\nexport class ErrorsPluginApi extends Context.Tag(\n \"@interfere/plugins/errors/ErrorsPluginApi\"\n)<ErrorsPluginApi, ErrorsPluginApiService>() {}\n\nconst DEDUPE_TTL_MS = 2000;\nconst STACK_PREFIX_SLICE = 120;\n\nconst makeDedupeKey = (input: {\n readonly message?: string | null;\n readonly stack?: string | null;\n readonly name?: string | null;\n}) =>\n `${input.name ?? \"\"}|${input.message ?? \"\"}|${input.stack?.slice(0, STACK_PREFIX_SLICE) ?? \"\"}`;\n\nexport const ErrorsPluginApiLayer = Layer.effect(\n ErrorsPluginApi,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n const recentRef = yield* Ref.make<ReadonlySet<string>>(new Set());\n\n const markIfNew = (key: string) =>\n Ref.modify(recentRef, (previous) => {\n if (previous.has(key)) {\n return [false, previous] as const;\n }\n\n const next = new Set(previous);\n next.add(key);\n return [true, next] as const;\n });\n\n const scheduleDelete = (key: string) =>\n Effect.sleep(Duration.millis(DEDUPE_TTL_MS)).pipe(\n Effect.zipRight(\n Ref.update(recentRef, (previous) => {\n if (!previous.has(key)) {\n return previous;\n }\n\n const next = new Set(previous);\n next.delete(key);\n return next;\n })\n ),\n Effect.forkDaemon,\n Effect.asVoid\n );\n\n const capturePayloadOnce = Effect.fn(\"ErrorsPluginApi.capturePayloadOnce\")(\n (span: string, payload: ErrorEnvelopePayload) =>\n Effect.gen(function* () {\n const key = makeDedupeKey(payload);\n\n const isNew = yield* markIfNew(key);\n if (!isNew) {\n return;\n }\n\n yield* scheduleDelete(key);\n yield* capture.capture(\"error\", payload).pipe(Effect.withSpan(span));\n })\n );\n\n const captureErrorInfoOnce = Effect.fn(\n \"ErrorsPluginApi.captureErrorInfoOnce\"\n )((span: string, info: ErrorInfo, meta?: Record<string, unknown>) =>\n Effect.gen(function* () {\n const payload = buildErrorPayload(info);\n const merged = meta\n ? ({ ...payload, ...meta } as ErrorEnvelopePayload)\n : payload;\n\n yield* capturePayloadOnce(span, merged);\n })\n );\n\n const captureConsoleArgsOnce = Effect.fn(\n \"ErrorsPluginApi.captureConsoleArgsOnce\"\n )((span: string, args: readonly unknown[]) =>\n Effect.gen(function* () {\n const firstError = args.find((a): a is Error => a instanceof Error);\n const message = args.map(toStringSafe).join(\" \");\n\n yield* logger.debug(\"Captured console.error\");\n yield* captureErrorInfoOnce(\n span,\n {\n message,\n name: firstError?.name ?? \"ConsoleError\",\n stack: firstError?.stack,\n },\n undefined\n );\n })\n );\n\n return ErrorsPluginApi.of({\n capturePayloadOnce,\n captureErrorInfoOnce,\n captureConsoleArgsOnce,\n });\n })\n);\n"],"mappings":";;;;;;AAyBA,IAAa,kBAAb,cAAqC,QAAQ,IAC3C,4CACD,EAA2C,CAAC;AAE7C,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAE3B,MAAM,iBAAiB,UAKrB,GAAG,MAAM,QAAQ,GAAG,GAAG,MAAM,WAAW,GAAG,GAAG,MAAM,OAAO,MAAM,GAAG,mBAAmB,IAAI;AAE7F,MAAa,uBAAuB,MAAM,OACxC,iBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CAEtB,MAAM,YAAY,OAAO,IAAI,qBAA0B,IAAI,KAAK,CAAC;CAEjE,MAAM,aAAa,QACjB,IAAI,OAAO,YAAY,aAAa;AAClC,MAAI,SAAS,IAAI,IAAI,CACnB,QAAO,CAAC,OAAO,SAAS;EAG1B,MAAM,OAAO,IAAI,IAAI,SAAS;AAC9B,OAAK,IAAI,IAAI;AACb,SAAO,CAAC,MAAM,KAAK;GACnB;CAEJ,MAAM,kBAAkB,QACtB,OAAO,MAAM,SAAS,OAAO,cAAc,CAAC,CAAC,KAC3C,OAAO,SACL,IAAI,OAAO,YAAY,aAAa;AAClC,MAAI,CAAC,SAAS,IAAI,IAAI,CACpB,QAAO;EAGT,MAAM,OAAO,IAAI,IAAI,SAAS;AAC9B,OAAK,OAAO,IAAI;AAChB,SAAO;GACP,CACH,EACD,OAAO,YACP,OAAO,OACR;CAEH,MAAM,qBAAqB,OAAO,GAAG,qCAAqC,EACvE,MAAc,YACb,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,cAAc,QAAQ;AAGlC,MAAI,EADU,OAAO,UAAU,IAAI,EAEjC;AAGF,SAAO,eAAe,IAAI;AAC1B,SAAO,QAAQ,QAAQ,SAAS,QAAQ,CAAC,KAAK,OAAO,SAAS,KAAK,CAAC;GACpE,CACL;CAED,MAAM,uBAAuB,OAAO,GAClC,uCACD,EAAE,MAAc,MAAiB,SAChC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,kBAAkB,KAAK;AAKvC,SAAO,mBAAmB,MAJX,OACV;GAAE,GAAG;GAAS,GAAG;GAAM,GACxB,QAEmC;GACvC,CACH;CAED,MAAM,yBAAyB,OAAO,GACpC,yCACD,EAAE,MAAc,SACf,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,KAAK,MAAM,MAAkB,aAAa,MAAM;EACnE,MAAM,UAAU,KAAK,IAAI,aAAa,CAAC,KAAK,IAAI;AAEhD,SAAO,OAAO,MAAM,yBAAyB;AAC7C,SAAO,qBACL,MACA;GACE;GACA,MAAM,YAAY,QAAQ;GAC1B,OAAO,YAAY;GACpB,EACD,OACD;GACD,CACH;AAED,QAAO,gBAAgB,GAAG;EACxB;EACA;EACA;EACD,CAAC;EACF,CACH"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ErrorEnvelopePayload } from "@interfere/types/sdk/plugins/payload/errors";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/errors/logic.d.ts
|
|
4
|
-
interface ErrorInfo {
|
|
5
|
-
readonly colno?: number;
|
|
6
|
-
readonly filename?: string;
|
|
7
|
-
readonly lineno?: number;
|
|
8
|
-
readonly message?: string;
|
|
9
|
-
readonly name?: string;
|
|
10
|
-
readonly stack?: string;
|
|
11
|
-
}
|
|
12
|
-
declare function buildErrorPayload(error: ErrorInfo): ErrorEnvelopePayload;
|
|
13
|
-
declare function toStringSafe(a: unknown): string;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { ErrorInfo, buildErrorPayload, toStringSafe };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logic.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/logic.ts"],"mappings":";;;UAMiB,SAAA;EAAA,SACN,KAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,iBAoCK,iBAAA,CAAkB,KAAA,EAAO,SAAA,GAAY,oBAAA;AAAA,iBAqBrC,YAAA,CAAa,CAAA"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
//#region src/core/plugins/impl/errors/logic.ts
|
|
2
|
-
const STACK_TRACE_REGEX = /at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/;
|
|
3
|
-
function parseStackTrace(stack) {
|
|
4
|
-
if (!stack) return [];
|
|
5
|
-
const lines = stack.split("\n");
|
|
6
|
-
const frames = [];
|
|
7
|
-
for (const line of lines) {
|
|
8
|
-
const match = line.match(STACK_TRACE_REGEX);
|
|
9
|
-
if (match) frames.push({
|
|
10
|
-
file: { reported: match[2] || null },
|
|
11
|
-
line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },
|
|
12
|
-
column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },
|
|
13
|
-
fn: { reported: match[1] || null }
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return frames.length > 0 ? frames : [{
|
|
17
|
-
file: { reported: null },
|
|
18
|
-
line: { reported: null },
|
|
19
|
-
column: { reported: null },
|
|
20
|
-
fn: { reported: null }
|
|
21
|
-
}];
|
|
22
|
-
}
|
|
23
|
-
function buildErrorPayload(error) {
|
|
24
|
-
return {
|
|
25
|
-
frames: error.stack ? parseStackTrace(error.stack) : [{
|
|
26
|
-
file: { reported: error.filename || null },
|
|
27
|
-
line: { reported: error.lineno || null },
|
|
28
|
-
column: { reported: error.colno || null },
|
|
29
|
-
fn: { reported: null }
|
|
30
|
-
}],
|
|
31
|
-
message: error.message || null,
|
|
32
|
-
name: error.name || null,
|
|
33
|
-
stack: error.stack || null,
|
|
34
|
-
errorSource: "client"
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function toStringSafe(a) {
|
|
38
|
-
if (typeof a === "string") return a;
|
|
39
|
-
if (a instanceof Error) return a.message;
|
|
40
|
-
try {
|
|
41
|
-
return JSON.stringify(a) ?? String(a);
|
|
42
|
-
} catch {
|
|
43
|
-
return String(a);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
//#endregion
|
|
48
|
-
export { buildErrorPayload, toStringSafe };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logic.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/logic.ts"],"sourcesContent":["import type { IngestedFrame } from \"@interfere/types/data/frame\";\nimport type { ErrorEnvelopePayload } from \"@interfere/types/sdk/plugins/payload/errors\";\n\n// Regex defined at top level for performance\nconst STACK_TRACE_REGEX = /at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?/;\n\nexport interface ErrorInfo {\n readonly colno?: number;\n readonly filename?: string;\n readonly lineno?: number;\n readonly message?: string;\n readonly name?: string;\n readonly stack?: string;\n}\n\nfunction parseStackTrace(stack?: string): IngestedFrame[] {\n if (!stack) {\n return [];\n }\n\n const lines = stack.split(\"\\n\");\n const frames: IngestedFrame[] = [];\n\n for (const line of lines) {\n const match = line.match(STACK_TRACE_REGEX);\n\n if (match) {\n frames.push({\n file: { reported: match[2] || null },\n line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },\n column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },\n fn: { reported: match[1] || null },\n });\n }\n }\n\n return frames.length > 0\n ? frames\n : [\n {\n file: { reported: null },\n line: { reported: null },\n column: { reported: null },\n fn: { reported: null },\n },\n ];\n}\n\nexport function buildErrorPayload(error: ErrorInfo): ErrorEnvelopePayload {\n const frames = error.stack\n ? parseStackTrace(error.stack)\n : [\n {\n file: { reported: error.filename || null },\n line: { reported: error.lineno || null },\n column: { reported: error.colno || null },\n fn: { reported: null },\n },\n ];\n\n return {\n frames,\n message: error.message || null,\n name: error.name || null,\n stack: error.stack || null,\n errorSource: \"client\",\n };\n}\n\nexport function toStringSafe(a: unknown): string {\n if (typeof a === \"string\") {\n return a;\n }\n if (a instanceof Error) {\n return a.message;\n }\n try {\n const json = JSON.stringify(a);\n // JSON.stringify returns undefined for Symbol, undefined, and functions\n return json ?? String(a);\n } catch {\n return String(a);\n }\n}\n"],"mappings":";AAIA,MAAM,oBAAoB;AAW1B,SAAS,gBAAgB,OAAiC;AACxD,KAAI,CAAC,MACH,QAAO,EAAE;CAGX,MAAM,QAAQ,MAAM,MAAM,KAAK;CAC/B,MAAM,SAA0B,EAAE;AAElC,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,KAAK,MAAM,kBAAkB;AAE3C,MAAI,MACF,QAAO,KAAK;GACV,MAAM,EAAE,UAAU,MAAM,MAAM,MAAM;GACpC,MAAM,EAAE,UAAU,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG,GAAG,MAAM;GACnE,QAAQ,EAAE,UAAU,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG,GAAG,MAAM;GACrE,IAAI,EAAE,UAAU,MAAM,MAAM,MAAM;GACnC,CAAC;;AAIN,QAAO,OAAO,SAAS,IACnB,SACA,CACE;EACE,MAAM,EAAE,UAAU,MAAM;EACxB,MAAM,EAAE,UAAU,MAAM;EACxB,QAAQ,EAAE,UAAU,MAAM;EAC1B,IAAI,EAAE,UAAU,MAAM;EACvB,CACF;;AAGP,SAAgB,kBAAkB,OAAwC;AAYxE,QAAO;EACL,QAZa,MAAM,QACjB,gBAAgB,MAAM,MAAM,GAC5B,CACE;GACE,MAAM,EAAE,UAAU,MAAM,YAAY,MAAM;GAC1C,MAAM,EAAE,UAAU,MAAM,UAAU,MAAM;GACxC,QAAQ,EAAE,UAAU,MAAM,SAAS,MAAM;GACzC,IAAI,EAAE,UAAU,MAAM;GACvB,CACF;EAIH,SAAS,MAAM,WAAW;EAC1B,MAAM,MAAM,QAAQ;EACpB,OAAO,MAAM,SAAS;EACtB,aAAa;EACd;;AAGH,SAAgB,aAAa,GAAoB;AAC/C,KAAI,OAAO,MAAM,SACf,QAAO;AAET,KAAI,aAAa,MACf,QAAO,EAAE;AAEX,KAAI;AAGF,SAFa,KAAK,UAAU,EAAE,IAEf,OAAO,EAAE;SAClB;AACN,SAAO,OAAO,EAAE"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region src/core/plugins/impl/errors/patches.d.ts
|
|
2
|
-
declare function patchWindowError(onError: (event: ErrorEvent) => void): () => void;
|
|
3
|
-
declare function patchUnhandledRejection(onRejection: (event: PromiseRejectionEvent) => void): () => void;
|
|
4
|
-
declare function patchFetch(onError: (error: unknown, args: Parameters<typeof fetch>) => void): {
|
|
5
|
-
readonly original: typeof window.fetch;
|
|
6
|
-
readonly cleanup: () => void;
|
|
7
|
-
};
|
|
8
|
-
declare function patchConsoleError(onError: (args: unknown[]) => void): {
|
|
9
|
-
readonly original: typeof console.error;
|
|
10
|
-
readonly cleanup: () => void;
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { patchConsoleError, patchFetch, patchUnhandledRejection, patchWindowError };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"patches.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/patches.ts"],"mappings":";iBAAgB,gBAAA,CACd,OAAA,GAAU,KAAA,EAAO,UAAA;AAAA,iBAOH,uBAAA,CACd,WAAA,GAAc,KAAA,EAAO,qBAAA;AAAA,iBAMP,UAAA,CACd,OAAA,GAAU,KAAA,WAAgB,IAAA,EAAM,UAAA,QAAkB,KAAA;EAAA,SACtC,QAAA,SAAiB,MAAA,CAAO,KAAA;EAAA,SAAgB,OAAA;AAAA;AAAA,iBAmBtC,iBAAA,CAAkB,OAAA,GAAU,IAAA;EAAA,SACjC,QAAA,SAAiB,OAAA,CAAQ,KAAA;EAAA,SACzB,OAAA;AAAA"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
//#region src/core/plugins/impl/errors/patches.ts
|
|
2
|
-
function patchWindowError(onError) {
|
|
3
|
-
const handler = (e) => onError(e);
|
|
4
|
-
window.addEventListener("error", handler, { capture: true });
|
|
5
|
-
return () => window.removeEventListener("error", handler, { capture: true });
|
|
6
|
-
}
|
|
7
|
-
function patchUnhandledRejection(onRejection) {
|
|
8
|
-
window.addEventListener("unhandledrejection", onRejection);
|
|
9
|
-
return () => window.removeEventListener("unhandledrejection", onRejection);
|
|
10
|
-
}
|
|
11
|
-
function patchFetch(onError) {
|
|
12
|
-
const originalFetch = window.fetch.bind(window);
|
|
13
|
-
const patchedFetch = (...args) => originalFetch(...args).catch((err) => {
|
|
14
|
-
onError(err, args);
|
|
15
|
-
throw err;
|
|
16
|
-
});
|
|
17
|
-
window.fetch = patchedFetch;
|
|
18
|
-
return {
|
|
19
|
-
original: originalFetch,
|
|
20
|
-
cleanup: () => {
|
|
21
|
-
window.fetch = originalFetch;
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
function patchConsoleError(onError) {
|
|
26
|
-
const originalConsoleError = console.error.bind(console);
|
|
27
|
-
console.error = (...args) => {
|
|
28
|
-
try {
|
|
29
|
-
originalConsoleError(...args);
|
|
30
|
-
} finally {
|
|
31
|
-
onError(args);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
return {
|
|
35
|
-
original: originalConsoleError,
|
|
36
|
-
cleanup: () => {
|
|
37
|
-
console.error = originalConsoleError;
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
//#endregion
|
|
43
|
-
export { patchConsoleError, patchFetch, patchUnhandledRejection, patchWindowError };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"patches.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/patches.ts"],"sourcesContent":["export function patchWindowError(\n onError: (event: ErrorEvent) => void\n): () => void {\n const handler = (e: ErrorEvent) => onError(e);\n window.addEventListener(\"error\", handler, { capture: true });\n return () => window.removeEventListener(\"error\", handler, { capture: true });\n}\n\nexport function patchUnhandledRejection(\n onRejection: (event: PromiseRejectionEvent) => void\n): () => void {\n window.addEventListener(\"unhandledrejection\", onRejection);\n return () => window.removeEventListener(\"unhandledrejection\", onRejection);\n}\n\nexport function patchFetch(\n onError: (error: unknown, args: Parameters<typeof fetch>) => void\n): { readonly original: typeof window.fetch; readonly cleanup: () => void } {\n const originalFetch: typeof window.fetch = window.fetch.bind(window);\n\n const patchedFetch: typeof window.fetch = (...args) =>\n originalFetch(...args).catch((err: unknown) => {\n onError(err, args);\n throw err;\n });\n\n window.fetch = patchedFetch;\n\n return {\n original: originalFetch,\n cleanup: () => {\n window.fetch = originalFetch;\n },\n };\n}\n\nexport function patchConsoleError(onError: (args: unknown[]) => void): {\n readonly original: typeof console.error;\n readonly cleanup: () => void;\n} {\n const originalConsoleError: typeof console.error =\n console.error.bind(console);\n\n console.error = (...args: unknown[]) => {\n try {\n originalConsoleError(...(args as Parameters<typeof console.error>));\n } finally {\n onError(args);\n }\n };\n\n return {\n original: originalConsoleError,\n cleanup: () => {\n console.error = originalConsoleError as typeof console.error;\n },\n };\n}\n"],"mappings":";AAAA,SAAgB,iBACd,SACY;CACZ,MAAM,WAAW,MAAkB,QAAQ,EAAE;AAC7C,QAAO,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAC5D,cAAa,OAAO,oBAAoB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;;AAG9E,SAAgB,wBACd,aACY;AACZ,QAAO,iBAAiB,sBAAsB,YAAY;AAC1D,cAAa,OAAO,oBAAoB,sBAAsB,YAAY;;AAG5E,SAAgB,WACd,SAC0E;CAC1E,MAAM,gBAAqC,OAAO,MAAM,KAAK,OAAO;CAEpE,MAAM,gBAAqC,GAAG,SAC5C,cAAc,GAAG,KAAK,CAAC,OAAO,QAAiB;AAC7C,UAAQ,KAAK,KAAK;AAClB,QAAM;GACN;AAEJ,QAAO,QAAQ;AAEf,QAAO;EACL,UAAU;EACV,eAAe;AACb,UAAO,QAAQ;;EAElB;;AAGH,SAAgB,kBAAkB,SAGhC;CACA,MAAM,uBACJ,QAAQ,MAAM,KAAK,QAAQ;AAE7B,SAAQ,SAAS,GAAG,SAAoB;AACtC,MAAI;AACF,wBAAqB,GAAI,KAA0C;YAC3D;AACR,WAAQ,KAAK;;;AAIjB,QAAO;EACL,UAAU;EACV,eAAe;AACb,WAAQ,QAAQ;;EAEnB"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { PluginDef } from "../../define-plugin.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/errors/plugin.d.ts
|
|
4
|
-
interface ErrorsAPI {
|
|
5
|
-
captureError: (err: unknown, meta?: Record<string, unknown>) => void;
|
|
6
|
-
}
|
|
7
|
-
declare const _default: PluginDef<"errors", ErrorsAPI>;
|
|
8
|
-
//#endregion
|
|
9
|
-
export { ErrorsAPI, _default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/plugin.ts"],"mappings":";;;UAciB,SAAA;EACf,YAAA,GAAe,GAAA,WAAc,IAAA,GAAO,MAAA;AAAA;AAAA,cACrC,QAAA"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { isInterfereInternalError } from "../../../runtime/native-fetch.mjs";
|
|
2
|
-
import { PluginRuntime } from "../../services/plugin-runtime.mjs";
|
|
3
|
-
import { definePlugin } from "../../define-plugin.mjs";
|
|
4
|
-
import { defineEvent } from "../../../events/define-event.mjs";
|
|
5
|
-
import { ErrorsPluginApi, ErrorsPluginApiLayer } from "./errors-plugin-api.mjs";
|
|
6
|
-
import { patchConsoleError, patchFetch, patchUnhandledRejection, patchWindowError } from "./patches.mjs";
|
|
7
|
-
import { Effect } from "effect";
|
|
8
|
-
|
|
9
|
-
//#region src/core/plugins/impl/errors/plugin.ts
|
|
10
|
-
var plugin_default = definePlugin("errors", {
|
|
11
|
-
name: "errors",
|
|
12
|
-
events: [defineEvent("error").value()],
|
|
13
|
-
layer: ErrorsPluginApiLayer,
|
|
14
|
-
setup: Effect.gen(function* () {
|
|
15
|
-
const api = yield* ErrorsPluginApi;
|
|
16
|
-
const runtime = yield* PluginRuntime;
|
|
17
|
-
if (typeof window === "undefined") return {};
|
|
18
|
-
const apiPublic = { captureError: (err, meta) => {
|
|
19
|
-
if (isInterfereInternalError(err)) return;
|
|
20
|
-
const errorInfo = err instanceof Error ? {
|
|
21
|
-
message: err.message,
|
|
22
|
-
stack: err.stack,
|
|
23
|
-
name: err.name
|
|
24
|
-
} : {
|
|
25
|
-
message: String(err),
|
|
26
|
-
name: "UnknownError"
|
|
27
|
-
};
|
|
28
|
-
runtime.fork(api.captureErrorInfoOnce("plugin.error.capture", errorInfo, meta));
|
|
29
|
-
} };
|
|
30
|
-
const errorHandler = (event) => {
|
|
31
|
-
if (isInterfereInternalError(event.error)) return;
|
|
32
|
-
runtime.fork(api.captureErrorInfoOnce("plugin.error.window", {
|
|
33
|
-
message: event.message,
|
|
34
|
-
stack: event.error?.stack,
|
|
35
|
-
filename: event.filename,
|
|
36
|
-
lineno: event.lineno,
|
|
37
|
-
colno: event.colno,
|
|
38
|
-
name: event.error?.name
|
|
39
|
-
}, void 0));
|
|
40
|
-
};
|
|
41
|
-
const rejectionHandler = (event) => {
|
|
42
|
-
const reason = event.reason;
|
|
43
|
-
if (isInterfereInternalError(reason)) return;
|
|
44
|
-
runtime.fork(api.captureErrorInfoOnce("plugin.error.rejection", reason instanceof Error ? {
|
|
45
|
-
message: `Unhandled Promise Rejection: ${reason.message}`,
|
|
46
|
-
stack: reason.stack,
|
|
47
|
-
name: reason.name
|
|
48
|
-
} : {
|
|
49
|
-
message: `Unhandled Promise Rejection: ${String(reason)}`,
|
|
50
|
-
name: "UnhandledRejection"
|
|
51
|
-
}, void 0));
|
|
52
|
-
};
|
|
53
|
-
const fetchPatch = patchFetch((err) => {
|
|
54
|
-
if (isInterfereInternalError(err)) throw err;
|
|
55
|
-
runtime.fork(api.captureErrorInfoOnce("plugin.error.fetch", err instanceof Error ? {
|
|
56
|
-
message: `Fetch failed: ${err.message}`,
|
|
57
|
-
stack: err.stack,
|
|
58
|
-
name: err.name
|
|
59
|
-
} : {
|
|
60
|
-
message: `Fetch failed: ${String(err)}`,
|
|
61
|
-
name: "FetchError"
|
|
62
|
-
}, void 0));
|
|
63
|
-
});
|
|
64
|
-
let inConsoleCapture = false;
|
|
65
|
-
const consolePatch = patchConsoleError((args) => {
|
|
66
|
-
if (inConsoleCapture) return;
|
|
67
|
-
inConsoleCapture = true;
|
|
68
|
-
try {
|
|
69
|
-
const firstError = args.find((a) => a instanceof Error);
|
|
70
|
-
if (firstError && isInterfereInternalError(firstError)) return;
|
|
71
|
-
runtime.fork(api.captureConsoleArgsOnce("plugin.error.console_error", args));
|
|
72
|
-
} finally {
|
|
73
|
-
inConsoleCapture = false;
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
const cleanupWindowError = patchWindowError(errorHandler);
|
|
77
|
-
const cleanupRejection = patchUnhandledRejection(rejectionHandler);
|
|
78
|
-
return {
|
|
79
|
-
api: apiPublic,
|
|
80
|
-
cleanup: () => {
|
|
81
|
-
cleanupWindowError();
|
|
82
|
-
cleanupRejection();
|
|
83
|
-
fetchPatch.cleanup();
|
|
84
|
-
consolePatch.cleanup();
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
}).pipe(Effect.withSpan("plugins.errors.setup"))
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
//#endregion
|
|
91
|
-
export { plugin_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { isInterfereInternalError } from \"../../../runtime/native-fetch.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport { ErrorsPluginApi, ErrorsPluginApiLayer } from \"./errors-plugin-api.js\";\nimport {\n patchConsoleError,\n patchFetch,\n patchUnhandledRejection,\n patchWindowError,\n} from \"./patches.js\";\n\nexport interface ErrorsAPI {\n captureError: (err: unknown, meta?: Record<string, unknown>) => void;\n}\n\nexport default definePlugin(\"errors\", {\n name: \"errors\",\n events: [defineEvent(\"error\").value()],\n layer: ErrorsPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* ErrorsPluginApi;\n const runtime = yield* PluginRuntime;\n\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const apiPublic: ErrorsAPI = {\n captureError: (err, meta) => {\n if (isInterfereInternalError(err)) {\n return;\n }\n\n const errorInfo =\n err instanceof Error\n ? { message: err.message, stack: err.stack, name: err.name }\n : { message: String(err), name: \"UnknownError\" };\n runtime.fork(\n api.captureErrorInfoOnce(\"plugin.error.capture\", errorInfo, meta)\n );\n },\n };\n\n const errorHandler = (event: ErrorEvent) => {\n if (isInterfereInternalError(event.error)) {\n return;\n }\n\n runtime.fork(\n api.captureErrorInfoOnce(\n \"plugin.error.window\",\n {\n message: event.message,\n stack: event.error?.stack,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n name: event.error?.name,\n },\n undefined\n )\n );\n };\n\n const rejectionHandler = (event: PromiseRejectionEvent) => {\n const reason = event.reason;\n\n if (isInterfereInternalError(reason)) {\n return;\n }\n\n runtime.fork(\n api.captureErrorInfoOnce(\n \"plugin.error.rejection\",\n reason instanceof Error\n ? {\n message: `Unhandled Promise Rejection: ${reason.message}`,\n stack: reason.stack,\n name: reason.name,\n }\n : {\n message: `Unhandled Promise Rejection: ${String(reason)}`,\n name: \"UnhandledRejection\",\n },\n undefined\n )\n );\n };\n\n const fetchPatch = patchFetch((err) => {\n if (isInterfereInternalError(err)) {\n throw err;\n }\n\n runtime.fork(\n api.captureErrorInfoOnce(\n \"plugin.error.fetch\",\n err instanceof Error\n ? {\n message: `Fetch failed: ${err.message}`,\n stack: err.stack,\n name: err.name,\n }\n : { message: `Fetch failed: ${String(err)}`, name: \"FetchError\" },\n undefined\n )\n );\n });\n\n let inConsoleCapture = false;\n const consolePatch = patchConsoleError((args) => {\n if (inConsoleCapture) {\n return;\n }\n\n inConsoleCapture = true;\n try {\n const firstError = args.find((a): a is Error => a instanceof Error);\n if (firstError && isInterfereInternalError(firstError)) {\n return;\n }\n runtime.fork(\n api.captureConsoleArgsOnce(\"plugin.error.console_error\", args)\n );\n } finally {\n inConsoleCapture = false;\n }\n });\n\n const cleanupWindowError = patchWindowError(errorHandler);\n const cleanupRejection = patchUnhandledRejection(rejectionHandler);\n\n return {\n api: apiPublic,\n cleanup: () => {\n cleanupWindowError();\n cleanupRejection();\n fetchPatch.cleanup();\n consolePatch.cleanup();\n },\n };\n }).pipe(Effect.withSpan(\"plugins.errors.setup\")),\n});\n"],"mappings":";;;;;;;;;AAkBA,qBAAe,aAAa,UAAU;CACpC,MAAM;CACN,QAAQ,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC;CACtC,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,MAAM,OAAO;EACnB,MAAM,UAAU,OAAO;AAEvB,MAAI,OAAO,WAAW,YACpB,QAAO,EAAE;EAGX,MAAM,YAAuB,EAC3B,eAAe,KAAK,SAAS;AAC3B,OAAI,yBAAyB,IAAI,CAC/B;GAGF,MAAM,YACJ,eAAe,QACX;IAAE,SAAS,IAAI;IAAS,OAAO,IAAI;IAAO,MAAM,IAAI;IAAM,GAC1D;IAAE,SAAS,OAAO,IAAI;IAAE,MAAM;IAAgB;AACpD,WAAQ,KACN,IAAI,qBAAqB,wBAAwB,WAAW,KAAK,CAClE;KAEJ;EAED,MAAM,gBAAgB,UAAsB;AAC1C,OAAI,yBAAyB,MAAM,MAAM,CACvC;AAGF,WAAQ,KACN,IAAI,qBACF,uBACA;IACE,SAAS,MAAM;IACf,OAAO,MAAM,OAAO;IACpB,UAAU,MAAM;IAChB,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,MAAM,MAAM,OAAO;IACpB,EACD,OACD,CACF;;EAGH,MAAM,oBAAoB,UAAiC;GACzD,MAAM,SAAS,MAAM;AAErB,OAAI,yBAAyB,OAAO,CAClC;AAGF,WAAQ,KACN,IAAI,qBACF,0BACA,kBAAkB,QACd;IACE,SAAS,gCAAgC,OAAO;IAChD,OAAO,OAAO;IACd,MAAM,OAAO;IACd,GACD;IACE,SAAS,gCAAgC,OAAO,OAAO;IACvD,MAAM;IACP,EACL,OACD,CACF;;EAGH,MAAM,aAAa,YAAY,QAAQ;AACrC,OAAI,yBAAyB,IAAI,CAC/B,OAAM;AAGR,WAAQ,KACN,IAAI,qBACF,sBACA,eAAe,QACX;IACE,SAAS,iBAAiB,IAAI;IAC9B,OAAO,IAAI;IACX,MAAM,IAAI;IACX,GACD;IAAE,SAAS,iBAAiB,OAAO,IAAI;IAAI,MAAM;IAAc,EACnE,OACD,CACF;IACD;EAEF,IAAI,mBAAmB;EACvB,MAAM,eAAe,mBAAmB,SAAS;AAC/C,OAAI,iBACF;AAGF,sBAAmB;AACnB,OAAI;IACF,MAAM,aAAa,KAAK,MAAM,MAAkB,aAAa,MAAM;AACnE,QAAI,cAAc,yBAAyB,WAAW,CACpD;AAEF,YAAQ,KACN,IAAI,uBAAuB,8BAA8B,KAAK,CAC/D;aACO;AACR,uBAAmB;;IAErB;EAEF,MAAM,qBAAqB,iBAAiB,aAAa;EACzD,MAAM,mBAAmB,wBAAwB,iBAAiB;AAElE,SAAO;GACL,KAAK;GACL,eAAe;AACb,wBAAoB;AACpB,sBAAkB;AAClB,eAAW,SAAS;AACpB,iBAAa,SAAS;;GAEzB;GACD,CAAC,KAAK,OAAO,SAAS,uBAAuB,CAAC;CACjD,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { EventPayload } from "../../../events/event-registry.mjs";
|
|
2
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
3
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
4
|
-
import { Context, Effect, Layer } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/page-events/page-events-plugin-api.d.ts
|
|
7
|
-
type PageviewPayload = EventPayload<"pageview">;
|
|
8
|
-
type PageleavePayload = EventPayload<"pageleave">;
|
|
9
|
-
type UiEventPayload = EventPayload<"ui_event">;
|
|
10
|
-
interface PageEventsPluginApiService {
|
|
11
|
-
readonly onPageLeave: (payload: PageleavePayload) => Effect.Effect<void>;
|
|
12
|
-
readonly onPageView: (payload: PageviewPayload) => Effect.Effect<void>;
|
|
13
|
-
readonly onUiEvent: (payload: UiEventPayload) => Effect.Effect<void>;
|
|
14
|
-
}
|
|
15
|
-
declare const PageEventsPluginApi_base: Context.TagClass<PageEventsPluginApi, "@interfere/plugins/page-events/PageEventsPluginApi", PageEventsPluginApiService>;
|
|
16
|
-
declare class PageEventsPluginApi extends PageEventsPluginApi_base {}
|
|
17
|
-
declare const PageEventsPluginApiLayer: Layer.Layer<PageEventsPluginApi, never, EventCapture | PluginLogger>;
|
|
18
|
-
//#endregion
|
|
19
|
-
export { PageEventsPluginApi, PageEventsPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-events-plugin-api.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/page-events-plugin-api.ts"],"mappings":";;;;;;KAMK,eAAA,GAAkB,YAAA;AAAA,KAClB,gBAAA,GAAmB,YAAA;AAAA,KACnB,cAAA,GAAiB,YAAA;AAAA,UAEZ,0BAAA;EAAA,SACC,WAAA,GAAc,OAAA,EAAS,gBAAA,KAAqB,MAAA,CAAO,MAAA;EAAA,SACnD,UAAA,GAAa,OAAA,EAAS,eAAA,KAAoB,MAAA,CAAO,MAAA;EAAA,SACjD,SAAA,GAAY,OAAA,EAAS,cAAA,KAAmB,MAAA,CAAO,MAAA;AAAA;AAAA,cAAM,wBAAA;cAGnD,mBAAA,SAA4B,wBAAA;AAAA,cAI5B,wBAAA,EAAwB,KAAA,CAAA,KAAA,CAAA,mBAAA,SAAA,YAAA,GAAA,YAAA"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { Context, Effect, Layer, Ref } from "effect";
|
|
4
|
-
|
|
5
|
-
//#region src/core/plugins/impl/page-events/page-events-plugin-api.ts
|
|
6
|
-
var PageEventsPluginApi = class extends Context.Tag("@interfere/plugins/page-events/PageEventsPluginApi")() {};
|
|
7
|
-
const PageEventsPluginApiLayer = Layer.effect(PageEventsPluginApi, Effect.gen(function* () {
|
|
8
|
-
const capture = yield* EventCapture;
|
|
9
|
-
const logger = yield* PluginLogger;
|
|
10
|
-
const lastKeyRef = yield* Ref.make(null);
|
|
11
|
-
const shouldRunForKey = (key) => Ref.modify(lastKeyRef, (lastKey) => {
|
|
12
|
-
if (lastKey === key) return [false, lastKey];
|
|
13
|
-
return [true, key];
|
|
14
|
-
});
|
|
15
|
-
const onPageView = Effect.fn("PageEventsPluginApi.onPageView")((payload) => Effect.gen(function* () {
|
|
16
|
-
yield* logger.trace("Page view");
|
|
17
|
-
if (!(yield* shouldRunForKey(`pageview:${payload.url}`))) return;
|
|
18
|
-
yield* capture.capture("pageview", payload).pipe(Effect.withSpan("plugin.page_events.pageview"));
|
|
19
|
-
}));
|
|
20
|
-
const onPageLeave = Effect.fn("PageEventsPluginApi.onPageLeave")((payload) => Effect.gen(function* () {
|
|
21
|
-
yield* logger.trace("Page leave");
|
|
22
|
-
if (!(yield* shouldRunForKey(`pageleave:${payload.url}`))) return;
|
|
23
|
-
yield* capture.capture("pageleave", payload).pipe(Effect.withSpan("plugin.page_events.pageleave"));
|
|
24
|
-
}));
|
|
25
|
-
const onUiEvent = Effect.fn("PageEventsPluginApi.onUiEvent")((payload) => Effect.gen(function* () {
|
|
26
|
-
const event = payload.event;
|
|
27
|
-
if (!(yield* shouldRunForKey(`ui_event:${event.selector}:${event.text ?? ""}`))) return;
|
|
28
|
-
yield* capture.capture("ui_event", payload).pipe(Effect.withSpan("plugin.page_events.ui_event"));
|
|
29
|
-
}));
|
|
30
|
-
return PageEventsPluginApi.of({
|
|
31
|
-
onPageView,
|
|
32
|
-
onPageLeave,
|
|
33
|
-
onUiEvent
|
|
34
|
-
});
|
|
35
|
-
}));
|
|
36
|
-
|
|
37
|
-
//#endregion
|
|
38
|
-
export { PageEventsPluginApi, PageEventsPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-events-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/page-events-plugin-api.ts"],"sourcesContent":["import { Context, Effect, Layer, Ref } from \"effect\";\n\nimport type { EventPayload } from \"../../../events/event-registry.js\";\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\n\ntype PageviewPayload = EventPayload<\"pageview\">;\ntype PageleavePayload = EventPayload<\"pageleave\">;\ntype UiEventPayload = EventPayload<\"ui_event\">;\n\ninterface PageEventsPluginApiService {\n readonly onPageLeave: (payload: PageleavePayload) => Effect.Effect<void>;\n readonly onPageView: (payload: PageviewPayload) => Effect.Effect<void>;\n readonly onUiEvent: (payload: UiEventPayload) => Effect.Effect<void>;\n}\n\nexport class PageEventsPluginApi extends Context.Tag(\n \"@interfere/plugins/page-events/PageEventsPluginApi\"\n)<PageEventsPluginApi, PageEventsPluginApiService>() {}\n\nexport const PageEventsPluginApiLayer = Layer.effect(\n PageEventsPluginApi,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n const lastKeyRef = yield* Ref.make<string | null>(null);\n\n const shouldRunForKey = (key: string) =>\n Ref.modify(lastKeyRef, (lastKey) => {\n if (lastKey === key) {\n return [false, lastKey] as const;\n }\n\n return [true, key] as const;\n });\n\n const onPageView = Effect.fn(\"PageEventsPluginApi.onPageView\")(\n (payload: PageviewPayload) =>\n Effect.gen(function* () {\n yield* logger.trace(\"Page view\");\n\n const shouldRun = yield* shouldRunForKey(`pageview:${payload.url}`);\n if (!shouldRun) {\n return;\n }\n\n yield* capture\n .capture(\"pageview\", payload)\n .pipe(Effect.withSpan(\"plugin.page_events.pageview\"));\n })\n );\n\n const onPageLeave = Effect.fn(\"PageEventsPluginApi.onPageLeave\")(\n (payload: PageleavePayload) =>\n Effect.gen(function* () {\n yield* logger.trace(\"Page leave\");\n\n const shouldRun = yield* shouldRunForKey(`pageleave:${payload.url}`);\n if (!shouldRun) {\n return;\n }\n\n yield* capture\n .capture(\"pageleave\", payload)\n .pipe(Effect.withSpan(\"plugin.page_events.pageleave\"));\n })\n );\n\n const onUiEvent = Effect.fn(\"PageEventsPluginApi.onUiEvent\")(\n (payload: UiEventPayload) =>\n Effect.gen(function* () {\n const event = payload.event;\n const key = `ui_event:${event.selector}:${event.text ?? \"\"}`;\n\n const shouldRun = yield* shouldRunForKey(key);\n if (!shouldRun) {\n return;\n }\n\n yield* capture\n .capture(\"ui_event\", payload)\n .pipe(Effect.withSpan(\"plugin.page_events.ui_event\"));\n })\n );\n\n return PageEventsPluginApi.of({\n onPageView,\n onPageLeave,\n onUiEvent,\n });\n })\n);\n"],"mappings":";;;;;AAgBA,IAAa,sBAAb,cAAyC,QAAQ,IAC/C,qDACD,EAAmD,CAAC;AAErD,MAAa,2BAA2B,MAAM,OAC5C,qBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CAEtB,MAAM,aAAa,OAAO,IAAI,KAAoB,KAAK;CAEvD,MAAM,mBAAmB,QACvB,IAAI,OAAO,aAAa,YAAY;AAClC,MAAI,YAAY,IACd,QAAO,CAAC,OAAO,QAAQ;AAGzB,SAAO,CAAC,MAAM,IAAI;GAClB;CAEJ,MAAM,aAAa,OAAO,GAAG,iCAAiC,EAC3D,YACC,OAAO,IAAI,aAAa;AACtB,SAAO,OAAO,MAAM,YAAY;AAGhC,MAAI,EADc,OAAO,gBAAgB,YAAY,QAAQ,MAAM,EAEjE;AAGF,SAAO,QACJ,QAAQ,YAAY,QAAQ,CAC5B,KAAK,OAAO,SAAS,8BAA8B,CAAC;GACvD,CACL;CAED,MAAM,cAAc,OAAO,GAAG,kCAAkC,EAC7D,YACC,OAAO,IAAI,aAAa;AACtB,SAAO,OAAO,MAAM,aAAa;AAGjC,MAAI,EADc,OAAO,gBAAgB,aAAa,QAAQ,MAAM,EAElE;AAGF,SAAO,QACJ,QAAQ,aAAa,QAAQ,CAC7B,KAAK,OAAO,SAAS,+BAA+B,CAAC;GACxD,CACL;CAED,MAAM,YAAY,OAAO,GAAG,gCAAgC,EACzD,YACC,OAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,QAAQ;AAItB,MAAI,EADc,OAAO,gBAFb,YAAY,MAAM,SAAS,GAAG,MAAM,QAAQ,KAEX,EAE3C;AAGF,SAAO,QACJ,QAAQ,YAAY,QAAQ,CAC5B,KAAK,OAAO,SAAS,8BAA8B,CAAC;GACvD,CACL;AAED,QAAO,oBAAoB,GAAG;EAC5B;EACA;EACA;EACD,CAAC;EACF,CACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/plugin.ts"],"mappings":""}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { PluginRuntime } from "../../services/plugin-runtime.mjs";
|
|
2
|
-
import { definePlugin } from "../../define-plugin.mjs";
|
|
3
|
-
import { getElementSelector, getElementText } from "../../dom-utils.mjs";
|
|
4
|
-
import { defineEvent } from "../../../events/define-event.mjs";
|
|
5
|
-
import { PageEventsPluginApi, PageEventsPluginApiLayer } from "./page-events-plugin-api.mjs";
|
|
6
|
-
import { Effect } from "effect";
|
|
7
|
-
|
|
8
|
-
//#region src/core/plugins/impl/page-events/plugin.ts
|
|
9
|
-
const TRUNCATE_LENGTH = 100;
|
|
10
|
-
var plugin_default = definePlugin("pageEvents", {
|
|
11
|
-
name: "page-events",
|
|
12
|
-
events: [
|
|
13
|
-
defineEvent("pageview").value(),
|
|
14
|
-
defineEvent("pageleave").value(),
|
|
15
|
-
defineEvent("ui_event").value()
|
|
16
|
-
],
|
|
17
|
-
layer: PageEventsPluginApiLayer,
|
|
18
|
-
setup: Effect.gen(function* () {
|
|
19
|
-
const api = yield* PageEventsPluginApi;
|
|
20
|
-
const runtime = yield* PluginRuntime;
|
|
21
|
-
if (typeof window === "undefined") return {};
|
|
22
|
-
const handlePageView = () => {
|
|
23
|
-
const url = window.location.href;
|
|
24
|
-
const title = document.title;
|
|
25
|
-
runtime.fork(api.onPageView({
|
|
26
|
-
url,
|
|
27
|
-
title
|
|
28
|
-
}));
|
|
29
|
-
};
|
|
30
|
-
const handlePageLeave = () => {
|
|
31
|
-
const url = window.location.href;
|
|
32
|
-
const duration = performance.now();
|
|
33
|
-
runtime.fork(api.onPageLeave({
|
|
34
|
-
url,
|
|
35
|
-
durationMs: Math.round(duration)
|
|
36
|
-
}));
|
|
37
|
-
};
|
|
38
|
-
const isInteractiveElement = (element) => {
|
|
39
|
-
const isInteractiveTag = [
|
|
40
|
-
"BUTTON",
|
|
41
|
-
"A",
|
|
42
|
-
"INPUT",
|
|
43
|
-
"SELECT",
|
|
44
|
-
"TEXTAREA"
|
|
45
|
-
].includes(element.tagName);
|
|
46
|
-
const hasClickHandler = element.onclick !== null;
|
|
47
|
-
const hasRole = element.getAttribute("role") === "button";
|
|
48
|
-
return isInteractiveTag || hasClickHandler || hasRole;
|
|
49
|
-
};
|
|
50
|
-
const handleUIEvent = (event) => {
|
|
51
|
-
const target = event.target;
|
|
52
|
-
if (!isInteractiveElement(target)) return;
|
|
53
|
-
const selector = getElementSelector(target);
|
|
54
|
-
const text = getElementText(target);
|
|
55
|
-
runtime.fork(api.onUiEvent({ event: {
|
|
56
|
-
type: "click",
|
|
57
|
-
selector,
|
|
58
|
-
text: text ? text.substring(0, TRUNCATE_LENGTH) : void 0,
|
|
59
|
-
url: window.location.href,
|
|
60
|
-
timestamp: Date.now()
|
|
61
|
-
} }));
|
|
62
|
-
};
|
|
63
|
-
handlePageView();
|
|
64
|
-
const originalPushState = history.pushState;
|
|
65
|
-
const originalReplaceState = history.replaceState;
|
|
66
|
-
history.pushState = (...args) => {
|
|
67
|
-
const result = originalPushState.apply(history, args);
|
|
68
|
-
handlePageView();
|
|
69
|
-
return result;
|
|
70
|
-
};
|
|
71
|
-
history.replaceState = (...args) => {
|
|
72
|
-
const result = originalReplaceState.apply(history, args);
|
|
73
|
-
handlePageView();
|
|
74
|
-
return result;
|
|
75
|
-
};
|
|
76
|
-
window.addEventListener("popstate", handlePageView);
|
|
77
|
-
window.addEventListener("beforeunload", handlePageLeave);
|
|
78
|
-
const onVisibility = () => {
|
|
79
|
-
if (document.visibilityState === "hidden") handlePageLeave();
|
|
80
|
-
};
|
|
81
|
-
document.addEventListener("visibilitychange", onVisibility);
|
|
82
|
-
document.addEventListener("click", handleUIEvent, true);
|
|
83
|
-
return { cleanup: () => {
|
|
84
|
-
history.pushState = originalPushState;
|
|
85
|
-
history.replaceState = originalReplaceState;
|
|
86
|
-
window.removeEventListener("popstate", handlePageView);
|
|
87
|
-
window.removeEventListener("beforeunload", handlePageLeave);
|
|
88
|
-
document.removeEventListener("visibilitychange", onVisibility);
|
|
89
|
-
document.removeEventListener("click", handleUIEvent, true);
|
|
90
|
-
} };
|
|
91
|
-
}).pipe(Effect.withSpan("plugins.pageEvents.setup"))
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
//#endregion
|
|
95
|
-
export { plugin_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { getElementSelector, getElementText } from \"../../dom-utils.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport {\n PageEventsPluginApi,\n PageEventsPluginApiLayer,\n} from \"./page-events-plugin-api.js\";\n\nconst TRUNCATE_LENGTH = 100;\n\nexport default definePlugin(\"pageEvents\", {\n name: \"page-events\",\n events: [\n defineEvent(\"pageview\").value(),\n defineEvent(\"pageleave\").value(),\n defineEvent(\"ui_event\").value(),\n ],\n layer: PageEventsPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* PageEventsPluginApi;\n const runtime = yield* PluginRuntime;\n\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const handlePageView = () => {\n const url = window.location.href;\n const title = document.title;\n runtime.fork(api.onPageView({ url, title }));\n };\n\n const handlePageLeave = () => {\n const url = window.location.href;\n const duration = performance.now();\n runtime.fork(api.onPageLeave({ url, durationMs: Math.round(duration) }));\n };\n\n const isInteractiveElement = (element: HTMLElement): boolean => {\n const interactiveTags = [\"BUTTON\", \"A\", \"INPUT\", \"SELECT\", \"TEXTAREA\"];\n const isInteractiveTag = interactiveTags.includes(element.tagName);\n const hasClickHandler = element.onclick !== null;\n const hasRole = element.getAttribute(\"role\") === \"button\";\n\n return isInteractiveTag || hasClickHandler || hasRole;\n };\n\n const handleUIEvent = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (!isInteractiveElement(target)) {\n return;\n }\n\n const selector = getElementSelector(target);\n const text = getElementText(target);\n\n runtime.fork(\n api.onUiEvent({\n event: {\n type: \"click\",\n selector,\n text: text ? text.substring(0, TRUNCATE_LENGTH) : undefined,\n url: window.location.href,\n timestamp: Date.now(),\n },\n })\n );\n };\n\n handlePageView();\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n handlePageView();\n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n handlePageView();\n return result;\n };\n\n window.addEventListener(\"popstate\", handlePageView);\n window.addEventListener(\"beforeunload\", handlePageLeave);\n\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") {\n handlePageLeave();\n }\n };\n document.addEventListener(\"visibilitychange\", onVisibility);\n\n document.addEventListener(\"click\", handleUIEvent, true);\n\n return {\n cleanup: () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", handlePageView);\n window.removeEventListener(\"beforeunload\", handlePageLeave);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n document.removeEventListener(\"click\", handleUIEvent, true);\n },\n };\n }).pipe(Effect.withSpan(\"plugins.pageEvents.setup\")),\n});\n"],"mappings":";;;;;;;;AAWA,MAAM,kBAAkB;AAExB,qBAAe,aAAa,cAAc;CACxC,MAAM;CACN,QAAQ;EACN,YAAY,WAAW,CAAC,OAAO;EAC/B,YAAY,YAAY,CAAC,OAAO;EAChC,YAAY,WAAW,CAAC,OAAO;EAChC;CACD,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,MAAM,OAAO;EACnB,MAAM,UAAU,OAAO;AAEvB,MAAI,OAAO,WAAW,YACpB,QAAO,EAAE;EAGX,MAAM,uBAAuB;GAC3B,MAAM,MAAM,OAAO,SAAS;GAC5B,MAAM,QAAQ,SAAS;AACvB,WAAQ,KAAK,IAAI,WAAW;IAAE;IAAK;IAAO,CAAC,CAAC;;EAG9C,MAAM,wBAAwB;GAC5B,MAAM,MAAM,OAAO,SAAS;GAC5B,MAAM,WAAW,YAAY,KAAK;AAClC,WAAQ,KAAK,IAAI,YAAY;IAAE;IAAK,YAAY,KAAK,MAAM,SAAS;IAAE,CAAC,CAAC;;EAG1E,MAAM,wBAAwB,YAAkC;GAE9D,MAAM,mBADkB;IAAC;IAAU;IAAK;IAAS;IAAU;IAAW,CAC7B,SAAS,QAAQ,QAAQ;GAClE,MAAM,kBAAkB,QAAQ,YAAY;GAC5C,MAAM,UAAU,QAAQ,aAAa,OAAO,KAAK;AAEjD,UAAO,oBAAoB,mBAAmB;;EAGhD,MAAM,iBAAiB,UAAsB;GAC3C,MAAM,SAAS,MAAM;AAErB,OAAI,CAAC,qBAAqB,OAAO,CAC/B;GAGF,MAAM,WAAW,mBAAmB,OAAO;GAC3C,MAAM,OAAO,eAAe,OAAO;AAEnC,WAAQ,KACN,IAAI,UAAU,EACZ,OAAO;IACL,MAAM;IACN;IACA,MAAM,OAAO,KAAK,UAAU,GAAG,gBAAgB,GAAG;IAClD,KAAK,OAAO,SAAS;IACrB,WAAW,KAAK,KAAK;IACtB,EACF,CAAC,CACH;;AAGH,kBAAgB;EAEhB,MAAM,oBAAoB,QAAQ;EAClC,MAAM,uBAAuB,QAAQ;AAErC,UAAQ,aAAa,GAAG,SAAS;GAC/B,MAAM,SAAS,kBAAkB,MAAM,SAAS,KAAK;AACrD,mBAAgB;AAChB,UAAO;;AAGT,UAAQ,gBAAgB,GAAG,SAAS;GAClC,MAAM,SAAS,qBAAqB,MAAM,SAAS,KAAK;AACxD,mBAAgB;AAChB,UAAO;;AAGT,SAAO,iBAAiB,YAAY,eAAe;AACnD,SAAO,iBAAiB,gBAAgB,gBAAgB;EAExD,MAAM,qBAAqB;AACzB,OAAI,SAAS,oBAAoB,SAC/B,kBAAiB;;AAGrB,WAAS,iBAAiB,oBAAoB,aAAa;AAE3D,WAAS,iBAAiB,SAAS,eAAe,KAAK;AAEvD,SAAO,EACL,eAAe;AACb,WAAQ,YAAY;AACpB,WAAQ,eAAe;AACvB,UAAO,oBAAoB,YAAY,eAAe;AACtD,UAAO,oBAAoB,gBAAgB,gBAAgB;AAC3D,YAAS,oBAAoB,oBAAoB,aAAa;AAC9D,YAAS,oBAAoB,SAAS,eAAe,KAAK;KAE7D;GACD,CAAC,KAAK,OAAO,SAAS,2BAA2B,CAAC;CACrD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/plugin.ts"],"mappings":""}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { PluginRuntime } from "../../services/plugin-runtime.mjs";
|
|
2
|
-
import { definePlugin } from "../../define-plugin.mjs";
|
|
3
|
-
import { getElementSelector } from "../../dom-utils.mjs";
|
|
4
|
-
import { defineEvent } from "../../../events/define-event.mjs";
|
|
5
|
-
import { RageClickService } from "./rage-click.service.mjs";
|
|
6
|
-
import { RageClickLive } from "./rage-click.layer.mjs";
|
|
7
|
-
import { Effect } from "effect";
|
|
8
|
-
|
|
9
|
-
//#region src/core/plugins/impl/rage-click/plugin.ts
|
|
10
|
-
const TRUNCATE_LENGTH = 100;
|
|
11
|
-
var plugin_default = definePlugin("rageClick", {
|
|
12
|
-
name: "rage-click",
|
|
13
|
-
events: [defineEvent("rage_click").value()],
|
|
14
|
-
layer: RageClickLive,
|
|
15
|
-
setup: Effect.gen(function* () {
|
|
16
|
-
const service = yield* RageClickService;
|
|
17
|
-
const runtime = yield* PluginRuntime;
|
|
18
|
-
if (typeof window === "undefined") return {};
|
|
19
|
-
const handleClick = (event) => {
|
|
20
|
-
const now = Date.now();
|
|
21
|
-
const target = event.target;
|
|
22
|
-
runtime.fork(service.onClick({
|
|
23
|
-
now,
|
|
24
|
-
x: event.clientX,
|
|
25
|
-
y: event.clientY,
|
|
26
|
-
selector: target ? getElementSelector(target) : "unknown",
|
|
27
|
-
text: target?.textContent?.substring(0, TRUNCATE_LENGTH) || ""
|
|
28
|
-
}));
|
|
29
|
-
};
|
|
30
|
-
window.addEventListener("click", handleClick, true);
|
|
31
|
-
return { cleanup: () => {
|
|
32
|
-
window.removeEventListener("click", handleClick, true);
|
|
33
|
-
} };
|
|
34
|
-
}).pipe(Effect.withSpan("plugins.rageClick.setup"))
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
//#endregion
|
|
38
|
-
export { plugin_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { getElementSelector } from \"../../dom-utils.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport { RageClickLive } from \"./rage-click.layer.js\";\nimport { RageClickService } from \"./rage-click.service.js\";\n\nconst TRUNCATE_LENGTH = 100;\n\nexport default definePlugin(\"rageClick\", {\n name: \"rage-click\",\n events: [defineEvent(\"rage_click\").value()],\n layer: RageClickLive,\n setup: Effect.gen(function* () {\n const service = yield* RageClickService;\n const runtime = yield* PluginRuntime;\n\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const handleClick = (event: MouseEvent) => {\n const now = Date.now();\n const target = event.target as Element | null;\n runtime.fork(\n service.onClick({\n now,\n x: event.clientX,\n y: event.clientY,\n selector: target ? getElementSelector(target) : \"unknown\",\n text: target?.textContent?.substring(0, TRUNCATE_LENGTH) || \"\",\n })\n );\n };\n\n window.addEventListener(\"click\", handleClick, true);\n\n return {\n cleanup: () => {\n window.removeEventListener(\"click\", handleClick, true);\n },\n };\n }).pipe(Effect.withSpan(\"plugins.rageClick.setup\")),\n});\n"],"mappings":";;;;;;;;;AASA,MAAM,kBAAkB;AAExB,qBAAe,aAAa,aAAa;CACvC,MAAM;CACN,QAAQ,CAAC,YAAY,aAAa,CAAC,OAAO,CAAC;CAC3C,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,UAAU,OAAO;EACvB,MAAM,UAAU,OAAO;AAEvB,MAAI,OAAO,WAAW,YACpB,QAAO,EAAE;EAGX,MAAM,eAAe,UAAsB;GACzC,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,SAAS,MAAM;AACrB,WAAQ,KACN,QAAQ,QAAQ;IACd;IACA,GAAG,MAAM;IACT,GAAG,MAAM;IACT,UAAU,SAAS,mBAAmB,OAAO,GAAG;IAChD,MAAM,QAAQ,aAAa,UAAU,GAAG,gBAAgB,IAAI;IAC7D,CAAC,CACH;;AAGH,SAAO,iBAAiB,SAAS,aAAa,KAAK;AAEnD,SAAO,EACL,eAAe;AACb,UAAO,oBAAoB,SAAS,aAAa,KAAK;KAEzD;GACD,CAAC,KAAK,OAAO,SAAS,0BAA0B,CAAC;CACpD,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { RageClickService } from "./rage-click.service.mjs";
|
|
4
|
-
import { Layer } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/rage-click/rage-click.layer.d.ts
|
|
7
|
-
declare const RageClickLive: Layer.Layer<RageClickService, never, EventCapture | PluginLogger>;
|
|
8
|
-
//#endregion
|
|
9
|
-
export { RageClickLive };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.layer.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.layer.ts"],"mappings":";;;;;;cASa,aAAA,EAAa,KAAA,CAAA,KAAA,CAAA,gBAAA,SAAA,YAAA,GAAA,YAAA"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { RageClickService } from "./rage-click.service.mjs";
|
|
4
|
-
import { Effect, Layer, Ref } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/rage-click/rage-click.layer.ts
|
|
7
|
-
const DEFAULT_TIME_WINDOW_MS = 1e3;
|
|
8
|
-
const DEFAULT_THRESHOLD = 3;
|
|
9
|
-
const RageClickLive = Layer.effect(RageClickService, Effect.gen(function* () {
|
|
10
|
-
const capture = yield* EventCapture;
|
|
11
|
-
const logger = yield* PluginLogger;
|
|
12
|
-
const clickTimestampsRef = yield* Ref.make([]);
|
|
13
|
-
const onClick = Effect.fn("RageClick.onClick")((input) => Effect.gen(function* () {
|
|
14
|
-
const payload = yield* Ref.modify(clickTimestampsRef, (previous) => {
|
|
15
|
-
const next = [...previous.filter((ts) => input.now - ts < DEFAULT_TIME_WINDOW_MS), input.now];
|
|
16
|
-
if (next.length < DEFAULT_THRESHOLD) return [void 0, next];
|
|
17
|
-
return [{
|
|
18
|
-
count: next.length,
|
|
19
|
-
timeWindow: DEFAULT_TIME_WINDOW_MS,
|
|
20
|
-
selector: input.selector,
|
|
21
|
-
text: input.text,
|
|
22
|
-
x: input.x,
|
|
23
|
-
y: input.y,
|
|
24
|
-
timestamp: input.now
|
|
25
|
-
}, []];
|
|
26
|
-
});
|
|
27
|
-
if (!payload) return;
|
|
28
|
-
yield* logger.debug("Rage click detected");
|
|
29
|
-
yield* capture.capture("rage_click", payload).pipe(Effect.withSpan("plugin.rage_click"));
|
|
30
|
-
}));
|
|
31
|
-
return RageClickService.of({ onClick });
|
|
32
|
-
}));
|
|
33
|
-
|
|
34
|
-
//#endregion
|
|
35
|
-
export { RageClickLive };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.layer.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.layer.ts"],"sourcesContent":["import { Effect, Layer, Ref } from \"effect\";\n\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\nimport { RageClickService } from \"./rage-click.service.js\";\n\nconst DEFAULT_TIME_WINDOW_MS = 1000;\nconst DEFAULT_THRESHOLD = 3;\n\nexport const RageClickLive = Layer.effect(\n RageClickService,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n const clickTimestampsRef = yield* Ref.make<readonly number[]>([]);\n\n const onClick = Effect.fn(\"RageClick.onClick\")(\n (input: {\n readonly now: number;\n readonly x: number;\n readonly y: number;\n readonly selector: string;\n readonly text: string;\n }) =>\n Effect.gen(function* () {\n const payload = yield* Ref.modify(clickTimestampsRef, (previous) => {\n const filtered = previous.filter(\n (ts) => input.now - ts < DEFAULT_TIME_WINDOW_MS\n );\n const next = [...filtered, input.now];\n\n if (next.length < DEFAULT_THRESHOLD) {\n return [undefined, next] as const;\n }\n\n return [\n {\n count: next.length,\n timeWindow: DEFAULT_TIME_WINDOW_MS,\n selector: input.selector,\n text: input.text,\n x: input.x,\n y: input.y,\n timestamp: input.now,\n },\n [],\n ] as const;\n });\n\n if (!payload) {\n return;\n }\n\n yield* logger.debug(\"Rage click detected\");\n yield* capture\n .capture(\"rage_click\", payload)\n .pipe(Effect.withSpan(\"plugin.rage_click\"));\n })\n );\n\n return RageClickService.of({ onClick });\n })\n);\n"],"mappings":";;;;;;AAMA,MAAM,yBAAyB;AAC/B,MAAM,oBAAoB;AAE1B,MAAa,gBAAgB,MAAM,OACjC,kBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CAEtB,MAAM,qBAAqB,OAAO,IAAI,KAAwB,EAAE,CAAC;CAEjE,MAAM,UAAU,OAAO,GAAG,oBAAoB,EAC3C,UAOC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,IAAI,OAAO,qBAAqB,aAAa;GAIlE,MAAM,OAAO,CAAC,GAHG,SAAS,QACvB,OAAO,MAAM,MAAM,KAAK,uBAC1B,EAC0B,MAAM,IAAI;AAErC,OAAI,KAAK,SAAS,kBAChB,QAAO,CAAC,QAAW,KAAK;AAG1B,UAAO,CACL;IACE,OAAO,KAAK;IACZ,YAAY;IACZ,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ,GAAG,MAAM;IACT,GAAG,MAAM;IACT,WAAW,MAAM;IAClB,EACD,EAAE,CACH;IACD;AAEF,MAAI,CAAC,QACH;AAGF,SAAO,OAAO,MAAM,sBAAsB;AAC1C,SAAO,QACJ,QAAQ,cAAc,QAAQ,CAC9B,KAAK,OAAO,SAAS,oBAAoB,CAAC;GAC7C,CACL;AAED,QAAO,iBAAiB,GAAG,EAAE,SAAS,CAAC;EACvC,CACH"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Context, Effect } from "effect";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/rage-click/rage-click.service.d.ts
|
|
4
|
-
interface RageClickServiceApi {
|
|
5
|
-
readonly onClick: (input: {
|
|
6
|
-
readonly now: number;
|
|
7
|
-
readonly x: number;
|
|
8
|
-
readonly y: number;
|
|
9
|
-
readonly selector: string;
|
|
10
|
-
readonly text: string;
|
|
11
|
-
}) => Effect.Effect<void>;
|
|
12
|
-
}
|
|
13
|
-
declare const RageClickService_base: Context.TagClass<RageClickService, "@interfere/plugins/rage-click/RageClickService", RageClickServiceApi>;
|
|
14
|
-
declare class RageClickService extends RageClickService_base {}
|
|
15
|
-
//#endregion
|
|
16
|
-
export { RageClickService };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.service.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.service.ts"],"mappings":";;;UAEU,mBAAA;EAAA,SACC,OAAA,GAAU,KAAA;IAAA,SACR,GAAA;IAAA,SACA,CAAA;IAAA,SACA,CAAA;IAAA,SACA,QAAA;IAAA,SACA,IAAA;EAAA,MACL,MAAA,CAAO,MAAA;AAAA;AAAA,cAAM,qBAAA;cAGR,gBAAA,SAAyB,qBAAA"}
|