@blyp/core 0.1.2 → 0.1.22
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 +273 -14
- package/STABILITY.md +56 -0
- package/dist/ai/anthropic/index.d.ts +3 -0
- package/dist/ai/anthropic/normalize.d.ts +9 -0
- package/dist/ai/anthropic/stream.d.ts +3 -0
- package/dist/ai/anthropic/wrap.d.ts +13 -0
- package/dist/ai/anthropic.js +701 -0
- package/dist/ai/anthropic.mjs +701 -0
- package/dist/ai/fetch.js +701 -0
- package/dist/ai/fetch.mjs +701 -0
- package/dist/ai/openai/index.d.ts +3 -0
- package/dist/ai/openai/normalize.d.ts +10 -0
- package/dist/ai/openai/stream.d.ts +3 -0
- package/dist/ai/openai/wrap.d.ts +24 -0
- package/dist/ai/openai.js +701 -0
- package/dist/ai/openai.mjs +701 -0
- package/dist/ai/shared/fetch.d.ts +5 -0
- package/dist/ai/shared/index.d.ts +2 -0
- package/dist/ai/shared/normalize.d.ts +17 -0
- package/dist/ai/shared/redaction.d.ts +6 -0
- package/dist/ai/shared/stream.d.ts +7 -0
- package/dist/ai/shared/trace.d.ts +116 -0
- package/dist/ai/shared/types.d.ts +161 -0
- package/dist/ai/shared.js +701 -0
- package/dist/ai/shared.mjs +701 -0
- package/dist/ai/vercel/index.d.ts +3 -0
- package/dist/ai/vercel/middleware.d.ts +3 -0
- package/dist/ai/vercel/model.d.ts +3 -0
- package/dist/ai/vercel.js +701 -0
- package/dist/ai/vercel.mjs +701 -0
- package/dist/astro.js +701 -0
- package/dist/astro.mjs +701 -0
- package/dist/client.js +1 -1132
- package/dist/client.mjs +1 -1125
- package/dist/connectors/betterstack.js +9 -1508
- package/dist/connectors/betterstack.mjs +9 -1483
- package/dist/connectors/databuddy/index.d.ts +7 -0
- package/dist/connectors/databuddy/sender.d.ts +5 -0
- package/dist/connectors/databuddy.js +9 -0
- package/dist/connectors/databuddy.mjs +9 -0
- package/dist/connectors/delivery/backoff.d.ts +2 -0
- package/dist/connectors/delivery/manager.d.ts +44 -0
- package/dist/connectors/delivery/queue-path.d.ts +1 -0
- package/dist/connectors/delivery/sqlite-adapter-bun.d.ts +1 -0
- package/dist/connectors/delivery/sqlite-adapter-node.d.ts +1 -0
- package/dist/connectors/delivery/sqlite-client.d.ts +37 -0
- package/dist/connectors/delivery/sqlite-worker.d.ts +1 -0
- package/dist/connectors/delivery/studio-queue.d.ts +12 -0
- package/dist/connectors/delivery/types.d.ts +98 -0
- package/dist/connectors/otlp/index.d.ts +1 -0
- package/dist/connectors/otlp.js +9 -1347
- package/dist/connectors/otlp.mjs +9 -1344
- package/dist/connectors/posthog/properties.d.ts +4 -0
- package/dist/connectors/posthog/sender.d.ts +0 -1
- package/dist/connectors/posthog.js +10 -1503
- package/dist/connectors/posthog.mjs +10 -1498
- package/dist/connectors/sentry.js +9 -1356
- package/dist/connectors/sentry.mjs +9 -1333
- package/dist/core/config.d.ts +7 -2
- package/dist/core/log-record.d.ts +5 -4
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/optional-module.d.ts +1 -0
- package/dist/core/pino-pretty-loader.d.ts +4 -0
- package/dist/database.js +1 -24
- package/dist/database.mjs +1 -21
- package/dist/elysia.js +621 -4100
- package/dist/elysia.mjs +622 -4073
- package/dist/expo.js +1 -719
- package/dist/expo.mjs +1 -717
- package/dist/express.js +616 -4085
- package/dist/express.mjs +616 -4056
- package/dist/fastify.js +618 -4104
- package/dist/fastify.mjs +618 -4075
- package/dist/frameworks/astro/index.d.ts +2 -0
- package/dist/frameworks/astro/logger.d.ts +3 -0
- package/dist/frameworks/elysia/index.d.ts +1 -1
- package/dist/frameworks/elysia/logger.d.ts +2 -35
- package/dist/frameworks/nestjs/helpers.d.ts +2 -0
- package/dist/frameworks/nitro/index.d.ts +2 -0
- package/dist/frameworks/nitro/logger.d.ts +6 -0
- package/dist/frameworks/nuxt/index.d.ts +2 -0
- package/dist/frameworks/nuxt/logger.d.ts +3 -0
- package/dist/frameworks/react-router/index.d.ts +2 -0
- package/dist/frameworks/react-router/logger.d.ts +3 -0
- package/dist/frameworks/shared/h3.d.ts +19 -0
- package/dist/frameworks/shared/http.d.ts +3 -2
- package/dist/frameworks/shared/index.d.ts +2 -1
- package/dist/frameworks/shared/logger.d.ts +2 -0
- package/dist/frameworks/shared/request-context.d.ts +2 -0
- package/dist/frameworks/shared/trace.d.ts +6 -0
- package/dist/hono.js +624 -4079
- package/dist/hono.mjs +626 -4053
- package/dist/index.d.ts +57 -17
- package/dist/index.js +616 -6494
- package/dist/index.mjs +619 -6410
- package/dist/nestjs.js +626 -4574
- package/dist/nestjs.mjs +622 -4542
- package/dist/nextjs.js +625 -4107
- package/dist/nextjs.mjs +627 -4081
- package/dist/nitro.js +701 -0
- package/dist/nitro.mjs +701 -0
- package/dist/nuxt.js +701 -0
- package/dist/nuxt.mjs +701 -0
- package/dist/react-router.js +701 -0
- package/dist/react-router.mjs +701 -0
- package/dist/shared/redaction.d.ts +17 -0
- package/dist/standalone.js +606 -3258
- package/dist/standalone.mjs +611 -3234
- package/dist/sveltekit.js +625 -4106
- package/dist/sveltekit.mjs +626 -4079
- package/dist/tanstack-start.js +624 -4105
- package/dist/tanstack-start.mjs +626 -4079
- package/dist/types/connectors/databuddy.d.ts +52 -0
- package/dist/types/core/config.d.ts +89 -0
- package/dist/types/core/logger.d.ts +5 -0
- package/dist/types/core/structured-log.d.ts +2 -0
- package/dist/types/database.d.ts +1 -0
- package/dist/types/frameworks/astro.d.ts +33 -0
- package/dist/types/frameworks/client.d.ts +2 -0
- package/dist/types/frameworks/elysia.d.ts +2 -0
- package/dist/types/frameworks/express.d.ts +1 -0
- package/dist/types/frameworks/fastify.d.ts +1 -0
- package/dist/types/frameworks/hono.d.ts +1 -0
- package/dist/types/frameworks/http.d.ts +1 -0
- package/dist/types/frameworks/nestjs.d.ts +2 -0
- package/dist/types/frameworks/nextjs.d.ts +1 -0
- package/dist/types/frameworks/nitro.d.ts +63 -0
- package/dist/types/frameworks/nuxt.d.ts +12 -0
- package/dist/types/frameworks/react-router.d.ts +35 -0
- package/dist/types/frameworks/request-context.d.ts +1 -0
- package/dist/types/frameworks/shared.d.ts +28 -1
- package/dist/types/frameworks/standalone.d.ts +3 -2
- package/dist/types/frameworks/sveltekit.d.ts +1 -0
- package/dist/types/frameworks/tanstack-start.d.ts +9 -3
- package/dist/types/frameworks/workers.d.ts +3 -0
- package/dist/types/shared/client-log.d.ts +2 -1
- package/dist/workers.js +2 -626
- package/dist/workers.mjs +2 -623
- package/package.json +273 -143
- package/dist/client.js.map +0 -1
- package/dist/client.mjs.map +0 -1
- package/dist/connectors/betterstack.js.map +0 -1
- package/dist/connectors/betterstack.mjs.map +0 -1
- package/dist/connectors/otlp.js.map +0 -1
- package/dist/connectors/otlp.mjs.map +0 -1
- package/dist/connectors/posthog.js.map +0 -1
- package/dist/connectors/posthog.mjs.map +0 -1
- package/dist/connectors/sentry.js.map +0 -1
- package/dist/connectors/sentry.mjs.map +0 -1
- package/dist/database.js.map +0 -1
- package/dist/database.mjs.map +0 -1
- package/dist/elysia.js.map +0 -1
- package/dist/elysia.mjs.map +0 -1
- package/dist/expo.js.map +0 -1
- package/dist/expo.mjs.map +0 -1
- package/dist/express.js.map +0 -1
- package/dist/express.mjs.map +0 -1
- package/dist/fastify.js.map +0 -1
- package/dist/fastify.mjs.map +0 -1
- package/dist/hono.js.map +0 -1
- package/dist/hono.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/nestjs.js.map +0 -1
- package/dist/nestjs.mjs.map +0 -1
- package/dist/nextjs.js.map +0 -1
- package/dist/nextjs.mjs.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/standalone.mjs.map +0 -1
- package/dist/sveltekit.js.map +0 -1
- package/dist/sveltekit.mjs.map +0 -1
- package/dist/tanstack-start.js.map +0 -1
- package/dist/tanstack-start.mjs.map +0 -1
- package/dist/workers.js.map +0 -1
- package/dist/workers.mjs.map +0 -1
- package/exports/client.js +0 -3
- package/exports/client.mjs +0 -3
- package/exports/connectors/betterstack.js +0 -1
- package/exports/connectors/betterstack.mjs +0 -1
- package/exports/connectors/otlp.js +0 -1
- package/exports/connectors/otlp.mjs +0 -1
- package/exports/connectors/posthog.js +0 -1
- package/exports/connectors/posthog.mjs +0 -1
- package/exports/connectors/sentry.js +0 -1
- package/exports/connectors/sentry.mjs +0 -1
- package/exports/database.js +0 -1
- package/exports/database.mjs +0 -1
- package/exports/expo.js +0 -1
- package/exports/expo.mjs +0 -1
- package/exports/frameworks/elysia.js +0 -1
- package/exports/frameworks/elysia.mjs +0 -1
- package/exports/frameworks/express.js +0 -1
- package/exports/frameworks/express.mjs +0 -1
- package/exports/frameworks/fastify.js +0 -1
- package/exports/frameworks/fastify.mjs +0 -1
- package/exports/frameworks/hono.js +0 -1
- package/exports/frameworks/hono.mjs +0 -1
- package/exports/frameworks/nestjs.js +0 -1
- package/exports/frameworks/nestjs.mjs +0 -1
- package/exports/frameworks/nextjs.js +0 -1
- package/exports/frameworks/nextjs.mjs +0 -1
- package/exports/frameworks/standalone.js +0 -1
- package/exports/frameworks/standalone.mjs +0 -1
- package/exports/frameworks/sveltekit.js +0 -1
- package/exports/frameworks/sveltekit.mjs +0 -1
- package/exports/frameworks/tanstack-start.js +0 -1
- package/exports/frameworks/tanstack-start.mjs +0 -1
- package/exports/workers.js +0 -1
- package/exports/workers.mjs +0 -1
- package/types/client.d.ts +0 -34
- package/types/connectors/betterstack.d.ts +0 -1
- package/types/connectors/otlp.d.ts +0 -1
- package/types/connectors/posthog.d.ts +0 -1
- package/types/connectors/sentry.d.ts +0 -1
- package/types/database.d.ts +0 -1
- package/types/expo.d.ts +0 -17
- package/types/frameworks/client.d.ts +0 -160
- package/types/frameworks/elysia.d.ts +0 -1
- package/types/frameworks/expo.d.ts +0 -50
- package/types/frameworks/express.d.ts +0 -1
- package/types/frameworks/fastify.d.ts +0 -1
- package/types/frameworks/hono.d.ts +0 -1
- package/types/frameworks/nestjs.d.ts +0 -1
- package/types/frameworks/nextjs.d.ts +0 -1
- package/types/frameworks/standalone.d.ts +0 -1
- package/types/frameworks/sveltekit.d.ts +0 -1
- package/types/frameworks/tanstack-start.d.ts +0 -1
- package/types/frameworks/workers.d.ts +0 -115
- package/types/index.d.ts +0 -1
- package/types/workers.d.ts +0 -13
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/log-value.ts","../../src/shared/validation.ts","../../src/shared/client-log.ts","../../src/shared/once.ts","../../src/core/config.ts","../../src/core/log-record.ts","../../src/core/structured-log.ts","../../src/core/file-logger.ts","../../src/connectors/shared.ts","../../src/connectors/betterstack/sender.ts","../../src/connectors/betterstack/index.ts"],"names":["z","warnedKeys","resolve","existsSync","readFileSync","dirname","writeFileSync","appendFileSync","jiti","createJiti","serializeMessage","normalizeError","warnOnce","Sentry","Logtail"],"mappings":"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","file":"betterstack.js","sourcesContent":["export function normalizeError(error: Error): Record<string, unknown> {\n const normalized: Record<string, unknown> = {\n name: error.name,\n message: error.message,\n };\n\n if (error.stack) {\n normalized.stack = error.stack;\n }\n\n const errorWithCause = error as Error & { cause?: unknown };\n if (errorWithCause.cause !== undefined) {\n normalized.cause = normalizeLogValue(errorWithCause.cause);\n }\n\n return normalized;\n}\n\nexport function normalizeLogValue(\n value: unknown,\n seen: WeakSet<object> = new WeakSet()\n): unknown {\n if (value instanceof Error) {\n return normalizeError(value);\n }\n\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value === undefined || value === null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeLogValue(entry, seen));\n }\n\n if (typeof value === 'object') {\n if (seen.has(value)) {\n return '[Circular]';\n }\n\n seen.add(value);\n const normalized: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n normalized[key] = normalizeLogValue(entry, seen);\n }\n\n seen.delete(value);\n return normalized;\n }\n\n return value;\n}\n\nexport function serializeLogMessage(message: unknown): string {\n if (typeof message === 'string') {\n return message;\n }\n\n if (message instanceof Error) {\n return message.message || message.name;\n }\n\n const normalized = normalizeLogValue(message);\n if (typeof normalized === 'string') {\n return normalized;\n }\n\n try {\n const serialized = JSON.stringify(normalized, null, 2);\n return serialized ?? String(normalized);\n } catch {\n return String(normalized);\n }\n}\n","import { z } from 'zod';\n\nexport const absoluteHttpUrlSchema = z.string().url().refine((value) => {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}, {\n message: 'Expected an absolute http(s) URL',\n});\n\nexport const plainObjectSchema = z.custom<Record<string, unknown>>(\n (value): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n },\n {\n message: 'Expected a plain object',\n }\n);\n\nexport const nonEmptyStringSchema = z.string().trim().min(1);\n\nexport function isAbsoluteHttpUrl(value: unknown): value is string {\n return absoluteHttpUrlSchema.safeParse(value).success;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return plainObjectSchema.safeParse(value).success;\n}\n\nexport function hasNonEmptyString(value: unknown): value is string {\n return nonEmptyStringSchema.safeParse(value).success;\n}\n","/// <reference lib=\"dom\" />\n\nimport { z } from 'zod';\nimport {\n normalizeError,\n normalizeLogValue,\n serializeLogMessage,\n} from './log-value';\nimport {\n isPlainObject,\n nonEmptyStringSchema,\n plainObjectSchema,\n} from './validation';\nimport type {\n ClientConnectorRequest,\n ClientLogBrowserContext,\n ClientLogDeviceContext,\n ClientLogEvent,\n ClientLogLevel,\n ClientLogPageContext,\n ClientLogSessionContext,\n RemoteDeliveryConfig,\n RemoteDeliveryDropContext,\n RemoteDeliveryFailureContext,\n RemoteDeliveryFailureReason,\n RemoteDeliveryRetryContext,\n RemoteDeliveryRuntime,\n RemoteDeliverySuccessContext,\n RemoteDeliveryTransport,\n} from '../types/shared/client-log';\n\nexport type {\n ClientConnectorRequest,\n ClientLogBrowserContext,\n ClientLogDeviceContext,\n ClientLogEvent,\n ClientLogLevel,\n ClientLogPageContext,\n ClientLogSessionContext,\n RemoteDeliveryConfig,\n RemoteDeliveryDropContext,\n RemoteDeliveryFailureContext,\n RemoteDeliveryFailureReason,\n RemoteDeliveryRetryContext,\n RemoteDeliverySuccessContext,\n RemoteDeliveryTransport,\n} from '../types/shared/client-log';\n\nexport const DEFAULT_CLIENT_LOG_ENDPOINT = '/inngest';\nconst SESSION_STORAGE_KEY = 'blyp:session-id';\n\nconst CLIENT_LOG_LEVELS: ClientLogLevel[] = [\n 'debug',\n 'info',\n 'warning',\n 'error',\n 'critical',\n 'success',\n 'table',\n];\nconst clientConnectorRequestSchema = z.union([\n z.literal('betterstack'),\n z.literal('posthog'),\n z.literal('sentry'),\n z.undefined(),\n z.object({\n type: z.literal('otlp'),\n name: nonEmptyStringSchema,\n }),\n]);\n\nfunction isClientLogLevel(value: unknown): value is ClientLogLevel {\n return typeof value === 'string' && CLIENT_LOG_LEVELS.includes(value as ClientLogLevel);\n}\n\nfunction isClientConnectorRequest(value: unknown): value is ClientConnectorRequest {\n return clientConnectorRequestSchema.safeParse(value).success;\n}\n\nfunction safeGet<T>(getter: () => T): T | undefined {\n try {\n return getter();\n } catch {\n return undefined;\n }\n}\n\nfunction randomSegment(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport function createRandomId(): string {\n const maybeCrypto = safeGet(() => globalThis.crypto);\n const randomUUID = maybeCrypto && typeof maybeCrypto.randomUUID === 'function'\n ? maybeCrypto.randomUUID.bind(maybeCrypto)\n : undefined;\n\n if (randomUUID) {\n return randomUUID();\n }\n\n return `${Date.now().toString(36)}-${randomSegment()}`;\n}\n\nexport function normalizeClientLogLevel(level: ClientLogLevel | 'warn'): ClientLogLevel {\n return level === 'warn' ? 'warning' : level;\n}\n\nexport { normalizeError, normalizeLogValue, serializeLogMessage };\n\nexport function normalizeClientPayloadData(message: unknown, args: unknown[]): unknown {\n const normalizedArgs = args.map((entry) => normalizeLogValue(entry));\n const messageData = message instanceof Error ? normalizeError(message) : undefined;\n\n if (messageData !== undefined && normalizedArgs.length === 0) {\n return messageData;\n }\n\n const combined = messageData === undefined ? normalizedArgs : [messageData, ...normalizedArgs];\n\n if (combined.length === 0) {\n return undefined;\n }\n\n if (combined.length === 1) {\n return combined[0];\n }\n\n return combined;\n}\n\nexport function getBrowserPageContext(): ClientLogPageContext {\n const location = safeGet(() => globalThis.location);\n const document = safeGet(() => globalThis.document);\n\n return {\n url: location?.href,\n pathname: location?.pathname,\n search: location?.search,\n hash: location?.hash,\n title: document?.title,\n referrer: document?.referrer,\n };\n}\n\nexport function getBrowserContext(): ClientLogBrowserContext {\n const navigator = safeGet(() => globalThis.navigator);\n\n return {\n userAgent: navigator?.userAgent,\n language: navigator?.language,\n platform: navigator?.platform,\n };\n}\n\nexport function getClientSessionId(): string {\n const storage = safeGet(() => globalThis.sessionStorage);\n const existing = safeGet(() => storage?.getItem(SESSION_STORAGE_KEY));\n\n if (existing) {\n return existing;\n }\n\n const sessionId = createRandomId();\n safeGet(() => storage?.setItem(SESSION_STORAGE_KEY, sessionId));\n return sessionId;\n}\n\nexport function normalizeMetadata(\n metadata: Record<string, unknown> | (() => Record<string, unknown>) | undefined\n): Record<string, unknown> | undefined {\n if (metadata === undefined) {\n return undefined;\n }\n\n const resolved = typeof metadata === 'function' ? safeGet(metadata) : metadata;\n if (!isPlainObject(resolved)) {\n return undefined;\n }\n\n return normalizeLogValue(resolved) as Record<string, unknown>;\n}\n\nexport function isClientLogEvent(payload: unknown): payload is ClientLogEvent {\n if (!isPlainObject(payload)) {\n return false;\n }\n\n if (\n payload.type !== 'client_log' ||\n payload.source !== 'client' ||\n !isClientLogLevel(payload.level) ||\n typeof payload.id !== 'string' ||\n typeof payload.message !== 'string' ||\n typeof payload.clientTimestamp !== 'string'\n ) {\n return false;\n }\n\n const pageResult = plainObjectSchema.safeParse(payload.page);\n const browserResult = plainObjectSchema.safeParse(payload.browser);\n const sessionResult = plainObjectSchema.safeParse(payload.session);\n\n if (!pageResult.success || !browserResult.success || !sessionResult.success) {\n return false;\n }\n\n if (!isClientConnectorRequest(payload.connector)) {\n return false;\n }\n\n return (\n typeof sessionResult.data.pageId === 'string' &&\n typeof sessionResult.data.sessionId === 'string'\n );\n}\n\nexport function normalizeEndpointPath(path: string | undefined): string {\n if (!path) {\n return DEFAULT_CLIENT_LOG_ENDPOINT;\n }\n\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import type { ConsoleMethod, ConsoleOnceLogger } from '../types/shared/once';\n\nexport type { ConsoleOnceLogger } from '../types/shared/once';\n\nfunction createConsoleOnceLogger(\n method: ConsoleMethod,\n warnedKeys: Set<string> = new Set<string>()\n): ConsoleOnceLogger {\n return (key, message, error) => {\n if (warnedKeys.has(key) || typeof console === 'undefined') {\n return;\n }\n\n const writer = console[method];\n if (typeof writer !== 'function') {\n return;\n }\n\n warnedKeys.add(key);\n if (error === undefined) {\n writer.call(console, message);\n return;\n }\n\n writer.call(console, message, error);\n };\n}\n\nexport function createWarnOnceLogger(warnedKeys?: Set<string>): ConsoleOnceLogger {\n return createConsoleOnceLogger('warn', warnedKeys);\n}\n\nexport function createErrorOnceLogger(warnedKeys?: Set<string>): ConsoleOnceLogger {\n return createConsoleOnceLogger('error', warnedKeys);\n}\n","import { appendFileSync, existsSync, readFileSync, writeFileSync } from 'fs';\nimport { createJiti } from 'jiti';\nimport { dirname, resolve } from 'path';\nimport { DEFAULT_CLIENT_LOG_ENDPOINT } from '../shared/client-log';\nimport { createWarnOnceLogger } from '../shared/once';\nimport { hasNonEmptyString, isAbsoluteHttpUrl } from '../shared/validation';\nimport type {\n BetterStackConnectorConfig,\n BetterStackErrorTrackingConfig,\n BlypDestination,\n BlypConfig,\n BlypConnectorsConfig,\n ClientLoggingConfig,\n ConfigFileMatch,\n DatabaseDeliveryConfig,\n DatabaseLoggerConfig,\n DatabaseRetryConfig,\n DrizzleDatabaseAdapterConfig,\n LogFileConfig,\n LogRotationConfig,\n OTLPConnectorConfig,\n PostHogConnectorConfig,\n PrismaDatabaseAdapterConfig,\n ResolvedBetterStackConnectorConfig,\n ResolvedBetterStackErrorTrackingConfig,\n ResolvedBlypConfig,\n ResolvedBlypConnectorsConfig,\n ResolvedDatabaseLoggerConfig,\n ResolvedOTLPConnectorConfig,\n ResolvedPostHogConnectorConfig,\n ResolvedSentryConnectorConfig,\n SentryConnectorConfig\n} from '../types/core/config';\n\nexport type { ConnectorMode } from '../types/connectors/mode';\nexport type {\n BlypConfig,\n BetterStackConnectorConfig,\n BetterStackErrorTrackingConfig,\n BlypDestination,\n BlypConnectorsConfig,\n ClientLoggingConfig,\n DatabaseAdapterConfig,\n DatabaseAdapterKind,\n DatabaseDeliveryConfig,\n DatabaseDialect,\n DatabaseLoggerConfig,\n DatabaseRetryConfig,\n DrizzleDatabaseAdapterConfig,\n LogFileConfig,\n LogRotationConfig,\n OTLPConnectorConfig,\n PostHogConnectorConfig,\n PrismaDatabaseAdapterConfig,\n ResolvedBlypConfig,\n ResolvedBetterStackConnectorConfig,\n ResolvedBetterStackErrorTrackingConfig,\n ResolvedDatabaseDeliveryConfig,\n ResolvedDatabaseLoggerConfig,\n PostHogErrorTrackingConfig,\n ResolvedOTLPConnectorConfig,\n ResolvedPostHogConnectorConfig,\n ResolvedDatabaseRetryConfig,\n ResolvedPostHogErrorTrackingConfig,\n ResolvedSentryConnectorConfig,\n SentryConnectorConfig\n} from '../types/core/config';\n\nconst PACKAGE_NAME = '@blyp/core';\nconst GITIGNORE_FILE_NAME = '.gitignore';\nconst CONFIG_FILE_NAMES = [\n 'blyp.config.ts',\n 'blyp.config.mts',\n 'blyp.config.cts',\n 'blyp.config.js',\n 'blyp.config.mjs',\n 'blyp.config.cjs',\n 'blyp.config.json',\n] as const;\nconst CONFIG_FILE_NAME = 'blyp.config.json';\nconst DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';\nconst DEFAULT_CONNECTOR_SERVICE_NAME = 'blyp-app';\nconst DEFAULT_POSTHOG_SERVICE_NAME = DEFAULT_CONNECTOR_SERVICE_NAME;\nconst warnedKeys = new Set<string>();\nconst warnOnce = createWarnOnceLogger(warnedKeys);\n\nexport const DEFAULT_ROTATION_CONFIG: Required<LogRotationConfig> = {\n enabled: true,\n maxSizeBytes: 10 * 1024 * 1024,\n maxArchives: 5,\n compress: true,\n};\n\nexport const DEFAULT_FILE_CONFIG: Required<LogFileConfig> = {\n enabled: true,\n dir: '',\n archiveDir: '',\n format: 'ndjson',\n rotation: DEFAULT_ROTATION_CONFIG,\n};\n\nexport const DEFAULT_CLIENT_LOGGING_CONFIG: Required<ClientLoggingConfig> = {\n enabled: true,\n path: DEFAULT_CLIENT_LOG_ENDPOINT,\n};\n\nexport const DEFAULT_DATABASE_RETRY_CONFIG: Required<DatabaseRetryConfig> = {\n maxRetries: 1,\n backoffMs: 100,\n};\n\nexport const DEFAULT_DATABASE_DELIVERY_CONFIG: Required<Omit<DatabaseDeliveryConfig, 'retry'>> & {\n retry: Required<DatabaseRetryConfig>;\n} = {\n strategy: 'immediate',\n batchSize: 1,\n flushIntervalMs: 250,\n maxQueueSize: 1000,\n overflowStrategy: 'drop-oldest',\n flushTimeoutMs: 5000,\n retry: DEFAULT_DATABASE_RETRY_CONFIG,\n};\n\nexport const DEFAULT_CONFIG: BlypConfig = {\n pretty: true,\n level: 'info',\n destination: 'file',\n file: DEFAULT_FILE_CONFIG,\n clientLogging: DEFAULT_CLIENT_LOGGING_CONFIG,\n connectors: {},\n};\n\nlet cachedConfig: ResolvedBlypConfig | null = null;\n\nfunction findNearestPackageName(startDir: string): string | undefined {\n let currentDir = startDir;\n\n while (true) {\n const packageJsonPath = resolve(currentDir, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n name?: unknown;\n };\n if (hasNonEmptyString(packageJson.name)) {\n return packageJson.name;\n }\n } catch {}\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n return undefined;\n }\n\n currentDir = parentDir;\n }\n}\n\nfunction resolveDefaultConnectorServiceName(cwd: string = process.cwd()): string {\n return findNearestPackageName(cwd) ?? DEFAULT_POSTHOG_SERVICE_NAME;\n}\n\nfunction getBootstrapConfig(): BlypConfig {\n return {\n pretty: true,\n level: 'info',\n destination: 'file',\n file: {\n enabled: true,\n format: 'ndjson',\n rotation: {\n enabled: true,\n maxSizeBytes: 10 * 1024 * 1024,\n maxArchives: 5,\n compress: true,\n },\n },\n clientLogging: {\n enabled: true,\n path: DEFAULT_CLIENT_LOG_ENDPOINT,\n },\n connectors: {},\n };\n}\n\nfunction shouldBootstrapProjectFiles(cwd: string): boolean {\n const packageJsonPath = resolve(cwd, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n return true;\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as { name?: string };\n return packageJson.name !== PACKAGE_NAME;\n } catch {\n return true;\n }\n}\n\nfunction ensureConfigFile(cwd: string): void {\n if (CONFIG_FILE_NAMES.some((fileName) => existsSync(resolve(cwd, fileName)))) {\n return;\n }\n\n const configPath = resolve(cwd, CONFIG_FILE_NAME);\n\n if (existsSync(configPath)) {\n return;\n }\n\n try {\n writeFileSync(configPath, `${JSON.stringify(getBootstrapConfig(), null, 2)}\\n`);\n } catch (error) {\n console.error('[Blyp] Warning: Failed to create blyp.config.json:', error);\n }\n}\n\nfunction ensureLogsIgnored(cwd: string): void {\n const gitignorePath = resolve(cwd, GITIGNORE_FILE_NAME);\n\n if (!existsSync(gitignorePath)) {\n try {\n writeFileSync(gitignorePath, 'logs\\n');\n } catch (error) {\n console.error('[Blyp] Warning: Failed to create .gitignore:', error);\n }\n return;\n }\n\n try {\n const currentContent = readFileSync(gitignorePath, 'utf-8');\n if (/^(?:\\/?logs\\/?)\\s*$/m.test(currentContent)) {\n return;\n }\n\n const separator = currentContent.endsWith('\\n') ? '' : '\\n';\n appendFileSync(gitignorePath, `${separator}logs\\n`);\n } catch (error) {\n console.error('[Blyp] Warning: Failed to update .gitignore:', error);\n }\n}\n\nfunction bootstrapProjectFiles(): void {\n const cwd = process.cwd();\n\n if (!shouldBootstrapProjectFiles(cwd)) {\n return;\n }\n\n ensureConfigFile(cwd);\n ensureLogsIgnored(cwd);\n}\n\nfunction findConfigFile(): ConfigFileMatch | null {\n const cwd = process.cwd();\n const matches = CONFIG_FILE_NAMES\n .map((fileName) => resolve(cwd, fileName))\n .filter((filePath) => existsSync(filePath));\n\n if (matches.length === 0) {\n return null;\n }\n\n if (matches.length > 1) {\n const preferred = matches[0]!;\n warnOnce(\n `config-multiple:${preferred}`,\n `[Blyp] Warning: Multiple config files found. Using ${preferred} and ignoring ${matches.slice(1).join(', ')}.`\n );\n }\n\n const selectedPath = matches[0]!;\n return {\n path: selectedPath,\n type: selectedPath.endsWith('.json') ? 'json' : 'jiti',\n };\n}\n\nfunction normalizeLoadedConfig(\n value: unknown,\n configPath: string\n): Partial<BlypConfig> {\n const normalized = (\n value &&\n typeof value === 'object' &&\n 'default' in value &&\n (value as { default?: unknown }).default !== undefined\n )\n ? (value as { default: unknown }).default\n : value;\n\n if (!normalized || typeof normalized !== 'object' || Array.isArray(normalized)) {\n warnOnce(\n `config-invalid:${configPath}`,\n `[Blyp] Warning: Config file ${configPath} did not export an object. Falling back to defaults.`\n );\n return {};\n }\n\n return normalized as Partial<BlypConfig>;\n}\n\nfunction parseJsonConfigFile(configPath: string): Partial<BlypConfig> {\n try {\n const content = readFileSync(configPath, 'utf-8');\n return normalizeLoadedConfig(JSON.parse(content), configPath);\n } catch (error) {\n console.error('[Blyp] Warning: Failed to parse blyp.config.json:', error);\n return {};\n }\n}\n\nfunction parseExecutableConfigFile(configPath: string): Partial<BlypConfig> {\n try {\n const jiti = createJiti(process.cwd(), {\n interopDefault: true,\n moduleCache: false,\n fsCache: false,\n });\n return normalizeLoadedConfig(jiti(configPath), configPath);\n } catch (error) {\n console.error(`[Blyp] Warning: Failed to load ${configPath}:`, error);\n return {};\n }\n}\n\nfunction parseConfigFile(config: ConfigFileMatch): Partial<BlypConfig> {\n return config.type === 'json'\n ? parseJsonConfigFile(config.path)\n : parseExecutableConfigFile(config.path);\n}\n\nfunction isPrismaAdapter(\n value: DatabaseLoggerConfig['adapter']\n): value is PrismaDatabaseAdapterConfig {\n return !!value && typeof value === 'object' && value.type === 'prisma';\n}\n\nfunction isDrizzleAdapter(\n value: DatabaseLoggerConfig['adapter']\n): value is DrizzleDatabaseAdapterConfig {\n return !!value && typeof value === 'object' && value.type === 'drizzle';\n}\n\nfunction mergeDatabaseRetryConfig(\n base: DatabaseRetryConfig | undefined,\n override: DatabaseRetryConfig | undefined\n): Required<DatabaseRetryConfig> {\n return {\n ...DEFAULT_DATABASE_RETRY_CONFIG,\n ...base,\n ...override,\n };\n}\n\nfunction mergeDatabaseDeliveryConfig(\n base: DatabaseDeliveryConfig | undefined,\n override: DatabaseDeliveryConfig | undefined\n): ResolvedDatabaseLoggerConfig['delivery'] {\n return {\n ...DEFAULT_DATABASE_DELIVERY_CONFIG,\n ...base,\n ...override,\n retry: mergeDatabaseRetryConfig(base?.retry, override?.retry),\n };\n}\n\nfunction hasPrismaDelegate(adapter: PrismaDatabaseAdapterConfig): boolean {\n const model = adapter.model ?? 'blypLog';\n const client = adapter.client as Record<string, unknown> | null | undefined;\n const delegate = client?.[model] as Record<string, unknown> | undefined;\n\n return !!delegate && typeof delegate.create === 'function';\n}\n\nfunction hasDrizzleAdapterShape(adapter: DrizzleDatabaseAdapterConfig): boolean {\n const db = adapter.db as { insert?: unknown } | null | undefined;\n return !!db && typeof db.insert === 'function' && adapter.table !== undefined;\n}\n\nfunction resolveDatabaseLoggerConfig(\n config: DatabaseLoggerConfig | undefined,\n sourceType?: ConfigFileMatch['type']\n): ResolvedDatabaseLoggerConfig | undefined {\n if (!config) {\n return undefined;\n }\n\n const adapter = config.adapter;\n let ready = false;\n\n if (sourceType === 'json') {\n warnOnce(\n 'database-json-config',\n '[Blyp] Warning: Database logging requires an executable blyp config file. Database destination remains disabled until you move this config to blyp.config.ts/js.'\n );\n } else if (config.dialect !== 'postgres' && config.dialect !== 'mysql') {\n warnOnce(\n `database-dialect:${String(config.dialect)}`,\n `[Blyp] Warning: Unsupported database dialect \"${String(config.dialect)}\". Database logging is disabled.`\n );\n } else if (!adapter) {\n warnOnce(\n 'database-adapter-missing',\n '[Blyp] Warning: Database logging is enabled without an adapter. Database logging is disabled.'\n );\n } else if (isPrismaAdapter(adapter)) {\n ready = hasPrismaDelegate({\n ...adapter,\n model: adapter.model ?? 'blypLog',\n });\n\n if (!ready) {\n warnOnce(\n 'database-prisma-missing',\n `[Blyp] Warning: Prisma database adapter is missing the \"${adapter.model ?? 'blypLog'}\" delegate or its create method. Database logging is disabled.`\n );\n }\n } else if (isDrizzleAdapter(adapter)) {\n ready = hasDrizzleAdapterShape(adapter);\n\n if (!ready) {\n warnOnce(\n 'database-drizzle-missing',\n '[Blyp] Warning: Drizzle database adapter is missing a db.insert function or table reference. Database logging is disabled.'\n );\n }\n }\n\n const normalizedAdapter = isPrismaAdapter(adapter)\n ? {\n ...adapter,\n model: adapter.model ?? 'blypLog',\n }\n : adapter;\n\n return {\n dialect: config.dialect,\n adapter: normalizedAdapter,\n delivery: mergeDatabaseDeliveryConfig(undefined, config.delivery),\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeRotationConfig(\n base: LogRotationConfig | undefined,\n override: LogRotationConfig | undefined\n): Required<LogRotationConfig> {\n return {\n ...DEFAULT_ROTATION_CONFIG,\n ...base,\n ...override,\n };\n}\n\nfunction mergeFileConfig(\n base: LogFileConfig | undefined,\n override: LogFileConfig | undefined\n): Required<LogFileConfig> {\n return {\n ...DEFAULT_FILE_CONFIG,\n ...base,\n ...override,\n rotation: mergeRotationConfig(base?.rotation, override?.rotation),\n };\n}\n\nfunction mergeClientLoggingConfig(\n base: ClientLoggingConfig | undefined,\n override: ClientLoggingConfig | undefined\n): Required<ClientLoggingConfig> {\n return {\n ...DEFAULT_CLIENT_LOGGING_CONFIG,\n ...base,\n ...override,\n path: override?.path ?? base?.path ?? DEFAULT_CLIENT_LOGGING_CONFIG.path,\n };\n}\n\nfunction mergeDatabaseLoggerConfig(\n base: DatabaseLoggerConfig | undefined,\n override: DatabaseLoggerConfig | undefined,\n sourceType?: ConfigFileMatch['type']\n): ResolvedDatabaseLoggerConfig | undefined {\n if (!base && !override) {\n return undefined;\n }\n\n return resolveDatabaseLoggerConfig(\n {\n dialect: override?.dialect ?? base?.dialect,\n adapter: override?.adapter ?? base?.adapter,\n delivery: {\n ...(base?.delivery ?? {}),\n ...(override?.delivery ?? {}),\n retry: {\n ...(base?.delivery?.retry ?? {}),\n ...(override?.delivery?.retry ?? {}),\n },\n },\n },\n sourceType\n );\n}\n\nfunction mergePostHogConnectorConfig(\n base: PostHogConnectorConfig | undefined,\n override: PostHogConnectorConfig | undefined\n): ResolvedPostHogConnectorConfig {\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const projectKey = override?.projectKey ?? base?.projectKey;\n const baseErrorTracking = base?.enabled === true ? base?.errorTracking : undefined;\n const errorTrackingMode =\n override?.errorTracking?.mode ??\n baseErrorTracking?.mode ??\n 'auto';\n const errorTrackingEnabled =\n override?.errorTracking?.enabled ??\n baseErrorTracking?.enabled ??\n enabled;\n const errorTrackingReady =\n enabled &&\n errorTrackingEnabled &&\n typeof projectKey === 'string' &&\n projectKey.trim().length > 0;\n\n return {\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n projectKey,\n host: override?.host ?? base?.host ?? DEFAULT_POSTHOG_HOST,\n serviceName:\n override?.serviceName ??\n base?.serviceName ??\n resolveDefaultConnectorServiceName(),\n errorTracking: {\n enabled: errorTrackingEnabled,\n mode: errorTrackingMode,\n enableExceptionAutocapture:\n override?.errorTracking?.enableExceptionAutocapture ??\n baseErrorTracking?.enableExceptionAutocapture ??\n (errorTrackingMode === 'auto'),\n ready: errorTrackingReady,\n status: errorTrackingReady ? 'enabled' : 'missing',\n },\n };\n}\n\nfunction mergeBetterStackConnectorConfig(\n base: BetterStackConnectorConfig | undefined,\n override: BetterStackConnectorConfig | undefined\n): ResolvedBetterStackConnectorConfig {\n const sourceToken = override?.sourceToken ?? base?.sourceToken;\n const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const baseErrorTracking = base?.enabled === true ? base?.errorTracking : undefined;\n const errorTracking = mergeBetterStackErrorTrackingConfig(\n enabled,\n baseErrorTracking,\n override?.errorTracking\n );\n const ready =\n enabled &&\n hasNonEmptyString(sourceToken) &&\n isAbsoluteHttpUrl(ingestingHost);\n\n return {\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n sourceToken,\n ingestingHost,\n serviceName:\n override?.serviceName ??\n base?.serviceName ??\n resolveDefaultConnectorServiceName(),\n errorTracking,\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeBetterStackErrorTrackingConfig(\n connectorEnabled: boolean,\n base: BetterStackErrorTrackingConfig | undefined,\n override: BetterStackErrorTrackingConfig | undefined\n): ResolvedBetterStackErrorTrackingConfig {\n const dsn = override?.dsn ?? base?.dsn;\n const enabled = override?.enabled ?? base?.enabled ?? connectorEnabled;\n const ready = enabled && hasNonEmptyString(dsn);\n\n return {\n enabled,\n dsn,\n tracesSampleRate: override?.tracesSampleRate ?? base?.tracesSampleRate ?? 1.0,\n environment: override?.environment ?? base?.environment,\n release: override?.release ?? base?.release,\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeSentryConnectorConfig(\n base: SentryConnectorConfig | undefined,\n override: SentryConnectorConfig | undefined\n): ResolvedSentryConnectorConfig {\n const dsn = override?.dsn ?? base?.dsn;\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const ready = enabled && typeof dsn === 'string' && dsn.trim().length > 0;\n\n return {\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n dsn,\n environment: override?.environment ?? base?.environment,\n release: override?.release ?? base?.release,\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeOTLPConnectorConfig(\n base: OTLPConnectorConfig | undefined,\n override: OTLPConnectorConfig | undefined\n): ResolvedOTLPConnectorConfig {\n const endpoint = override?.endpoint ?? base?.endpoint;\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const resolvedHeaders = {\n ...(base?.headers ?? {}),\n ...(override?.headers ?? {}),\n };\n const ready = enabled && isAbsoluteHttpUrl(endpoint);\n\n return {\n name: override?.name ?? base?.name ?? '',\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n endpoint,\n headers: resolvedHeaders,\n auth: override?.auth ?? base?.auth,\n serviceName:\n override?.serviceName ??\n base?.serviceName ??\n resolveDefaultConnectorServiceName(),\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeOTLPConnectorsConfig(\n base: OTLPConnectorConfig[] | undefined,\n override: OTLPConnectorConfig[] | undefined\n): ResolvedOTLPConnectorConfig[] {\n const source = override ?? base ?? [];\n const deduped = new Map<string, ResolvedOTLPConnectorConfig>();\n\n for (const connector of source) {\n if (!connector || typeof connector.name !== 'string' || connector.name.length === 0) {\n continue;\n }\n\n if (deduped.has(connector.name)) {\n warnOnce(\n `otlp-duplicate:${connector.name}`,\n `[Blyp] Warning: Duplicate OTLP connector name \"${connector.name}\" found. Using the last definition.`\n );\n }\n\n deduped.set(connector.name, mergeOTLPConnectorConfig(undefined, connector));\n }\n\n return Array.from(deduped.values());\n}\n\nfunction mergeConnectorsConfig(\n base: BlypConnectorsConfig | undefined,\n override: BlypConnectorsConfig | undefined\n): ResolvedBlypConnectorsConfig {\n return {\n betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),\n posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),\n sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),\n otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp),\n };\n}\n\nexport function mergeBlypConfig(\n base: BlypConfig,\n override: Partial<BlypConfig> = {},\n options: { configFileType?: ConfigFileMatch['type'] } = {}\n): ResolvedBlypConfig {\n return {\n ...base,\n ...override,\n destination: override.destination ?? base.destination ?? 'file',\n file: mergeFileConfig(base.file, override.file),\n database: mergeDatabaseLoggerConfig(base.database, override.database, options.configFileType),\n clientLogging: mergeClientLoggingConfig(base.clientLogging, override.clientLogging),\n connectors: mergeConnectorsConfig(base.connectors, override.connectors),\n };\n}\n\nexport function loadConfig(): ResolvedBlypConfig {\n if (cachedConfig !== null) {\n return cachedConfig;\n }\n\n bootstrapProjectFiles();\n const configFile = findConfigFile();\n\n if (configFile) {\n const userConfig = parseConfigFile(configFile);\n cachedConfig = mergeBlypConfig(DEFAULT_CONFIG, userConfig, {\n configFileType: configFile.type,\n });\n } else {\n cachedConfig = mergeBlypConfig(DEFAULT_CONFIG);\n }\n\n return cachedConfig;\n}\n\nexport function resolveConfig(overrides: Partial<BlypConfig> = {}): ResolvedBlypConfig {\n return mergeBlypConfig(loadConfig(), overrides);\n}\n\nexport function getConfig(): ResolvedBlypConfig {\n return loadConfig();\n}\n\nexport function resetConfigCache(): void {\n cachedConfig = null;\n warnedKeys.clear();\n}\n","import type { LogRecord } from './file-logger';\nimport type { StructuredLogPayload } from './structured-log';\nimport {\n normalizeError,\n normalizeLogValue,\n serializeLogMessage,\n} from '../shared/log-value';\nimport type { LogMethodName } from '../types/core/log-record';\n\nexport type { LogMethodName } from '../types/core/log-record';\n\nconst RECORD_LEVELS: Record<LogMethodName, string> = {\n success: 'success',\n critical: 'critical',\n warning: 'warning',\n info: 'info',\n debug: 'debug',\n error: 'error',\n warn: 'warning',\n table: 'table',\n};\n\nfunction normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/');\n}\n\nfunction isInternalLoggerFrame(filePath: string): boolean {\n const normalizedPath = normalizePath(filePath);\n\n return (\n normalizedPath.startsWith('node:') ||\n normalizedPath.includes('/node_modules/pino') ||\n normalizedPath.includes('/node_modules/pino-pretty') ||\n normalizedPath.includes('/node_modules/@blyp/core/') ||\n normalizedPath.includes('/blyp/src/core/') ||\n normalizedPath.includes('/blyp/src/frameworks/') ||\n normalizedPath.includes('/blyp/src/posthog/') ||\n normalizedPath.includes('/blyp/dist/')\n );\n}\n\nfunction formatCallerPath(filePath: string): string {\n const normalizedPath = normalizePath(filePath);\n const normalizedCwd = normalizePath(process.cwd());\n return normalizedPath.startsWith(`${normalizedCwd}/`)\n ? normalizedPath.slice(normalizedCwd.length + 1)\n : normalizedPath;\n}\n\nexport function getCallerLocation(): { file: string | null; line: number | null } {\n try {\n const stack = new Error().stack;\n if (!stack) {\n return { file: null, line: null };\n }\n\n const lines = stack.split('\\n');\n let fallback: { file: string; line: number | null } | null = null;\n\n for (let index = 2; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n\n const match = line.match(/\\((.*):(\\d+):\\d+\\)/) || line.match(/at\\s+(.*):(\\d+):(\\d+)/);\n if (!match) {\n continue;\n }\n\n const fileName = match[1] || '';\n const lineNumber = parseInt(match[2] || '0', 10) || null;\n\n if (fileName && !fileName.includes('node_modules') && !isInternalLoggerFrame(fileName)) {\n const formattedPath = formatCallerPath(fileName);\n const normalizedFormattedPath = normalizePath(formattedPath);\n\n if (!normalizedFormattedPath.startsWith('dist/')) {\n return { file: formattedPath, line: lineNumber };\n }\n\n fallback ??= { file: formattedPath, line: lineNumber };\n }\n }\n\n if (fallback) {\n return fallback;\n }\n } catch {\n return { file: null, line: null };\n }\n\n return { file: null, line: null };\n}\n\nexport const serializeMessage = serializeLogMessage;\n\nexport function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, '');\n}\n\nexport function buildRecord(\n level: LogMethodName,\n message: unknown,\n args: unknown[],\n bindings: Record<string, unknown>\n): LogRecord {\n const { file, line } = getCallerLocation();\n const serializedMessage = serializeMessage(message);\n const record: LogRecord = {\n timestamp: new Date().toISOString(),\n level: RECORD_LEVELS[level],\n message: stripAnsi(serializedMessage),\n };\n\n if (message instanceof Error) {\n record.error = normalizeError(message);\n }\n\n if (file) {\n record.caller = line !== null ? `${file}:${line}` : file;\n }\n\n if (args.length === 1) {\n record.data = normalizeLogValue(args[0]);\n } else if (args.length > 1) {\n record.data = normalizeLogValue(args);\n }\n\n if (Object.keys(bindings).length > 0) {\n record.bindings = normalizeLogValue(bindings) as Record<string, unknown>;\n }\n\n return record;\n}\n\nexport function buildStructuredRecord(\n level: LogMethodName,\n message: string,\n payload: StructuredLogPayload,\n bindings: Record<string, unknown>\n): LogRecord {\n const { file, line } = getCallerLocation();\n const normalizedPayload = normalizeLogValue(payload) as StructuredLogPayload;\n const record: LogRecord = {\n message: stripAnsi(message),\n ...normalizedPayload,\n };\n\n if (file) {\n record.caller = line !== null ? `${file}:${line}` : file;\n }\n\n if (Object.keys(bindings).length > 0) {\n record.bindings = normalizeLogValue(bindings) as Record<string, unknown>;\n }\n\n record.level =\n typeof normalizedPayload.level === 'string' && normalizedPayload.level.length > 0\n ? normalizedPayload.level\n : RECORD_LEVELS[level];\n record.timestamp =\n typeof normalizedPayload.timestamp === 'string' && normalizedPayload.timestamp.length > 0\n ? normalizedPayload.timestamp\n : new Date().toISOString();\n\n return record;\n}\n\nexport function resolveStructuredWriteLevel(level: StructuredLogPayload['level']): LogMethodName {\n switch (level) {\n case 'debug':\n return 'debug';\n case 'warning':\n return 'warning';\n case 'warn':\n return 'warn';\n case 'error':\n return 'error';\n case 'success':\n return 'success';\n case 'critical':\n return 'critical';\n case 'table':\n return 'table';\n case 'info':\n default:\n return 'info';\n }\n}\n","import type {\n CreateStructuredLogOptions,\n StructuredLog,\n StructuredLogError,\n StructuredLogEvent,\n StructuredLogEmitOptions,\n StructuredLogLevel,\n StructuredLogPayload,\n} from '../types/core/structured-log';\n\nexport type {\n CreateStructuredLogOptions,\n StructuredLog,\n StructuredLogError,\n StructuredLogEvent,\n StructuredLogEmitOptions,\n StructuredLogLevel,\n StructuredLogPayload,\n} from '../types/core/structured-log';\n\nfunction serializeMessage(message: unknown): string {\n if (typeof message === 'string') {\n return message;\n }\n\n if (message !== null && typeof message === 'object') {\n try {\n return JSON.stringify(\n message,\n (_key, value) => {\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (value === undefined) {\n return '[undefined]';\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n },\n 2\n );\n } catch {\n return '[Object]';\n }\n }\n\n return String(message);\n}\n\nfunction normalizeEventData(message: unknown, args: unknown[]): unknown {\n if (typeof message === 'string') {\n if (args.length === 0) {\n return undefined;\n }\n\n return args.length === 1 ? args[0] : args;\n }\n\n const values = [message, ...args];\n return values.length === 1 ? values[0] : values;\n}\n\nfunction normalizeDetails(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction normalizeError(error: unknown, fallbackStatus?: number): StructuredLogError | undefined {\n if (error === undefined || error === null) {\n return fallbackStatus === undefined || fallbackStatus < 400\n ? undefined\n : {\n message: `HTTP ${fallbackStatus}`,\n code: fallbackStatus,\n type: 'HttpError',\n };\n }\n\n if (error instanceof Error) {\n const errorLike = error as Error & {\n code?: string | number;\n why?: string;\n fix?: string;\n link?: string;\n details?: unknown;\n cause?: unknown;\n type?: string;\n };\n\n return {\n message: error.message,\n code: errorLike.code,\n type: errorLike.type ?? error.name ?? error.constructor?.name,\n stack: error.stack,\n why: errorLike.why,\n fix: errorLike.fix,\n link: errorLike.link,\n details: normalizeDetails(errorLike.details),\n cause: errorLike.cause,\n };\n }\n\n if (typeof error === 'object') {\n const record = error as Record<string, unknown>;\n const statusCode =\n typeof record.statusCode === 'number'\n ? record.statusCode\n : typeof record.status === 'number'\n ? record.status\n : fallbackStatus;\n\n return {\n message:\n typeof record.message === 'string'\n ? record.message\n : `HTTP ${statusCode ?? 500}`,\n code:\n typeof record.code === 'string' || typeof record.code === 'number'\n ? record.code\n : statusCode,\n type:\n typeof record.type === 'string'\n ? record.type\n : typeof record.name === 'string'\n ? record.name\n : 'Error',\n stack: typeof record.stack === 'string' ? record.stack : undefined,\n why: typeof record.why === 'string' ? record.why : undefined,\n fix: typeof record.fix === 'string' ? record.fix : undefined,\n link: typeof record.link === 'string' ? record.link : undefined,\n details: normalizeDetails(record.details),\n cause: record.cause,\n };\n }\n\n return {\n message: String(error),\n code: fallbackStatus,\n type: typeof error,\n };\n}\n\nfunction resolveEmitStatus(options: StructuredLogEmitOptions): number | undefined {\n if (options.response && typeof options.response.status === 'number') {\n return options.response.status;\n }\n\n if (typeof options.status === 'number') {\n return options.status;\n }\n\n if (\n options.error &&\n typeof options.error === 'object' &&\n options.error !== null &&\n typeof (options.error as { statusCode?: unknown }).statusCode === 'number'\n ) {\n return (options.error as { statusCode: number }).statusCode;\n }\n\n if (\n options.error &&\n typeof options.error === 'object' &&\n options.error !== null &&\n typeof (options.error as { status?: unknown }).status === 'number'\n ) {\n return (options.error as { status: number }).status;\n }\n\n return options.error ? 500 : undefined;\n}\n\nexport function createStructuredLog(\n groupId: string,\n options: CreateStructuredLogOptions\n): StructuredLog<Record<string, unknown>> {\n const startedAt = performance.now();\n const fields = { ...(options.initialFields ?? {}) };\n const events: StructuredLogEvent[] = [];\n let emittedPayload: StructuredLogPayload<Record<string, unknown>> | undefined;\n\n options.onCreate?.();\n\n const appendEvent = (\n level: StructuredLogLevel,\n message: unknown,\n args: unknown[]\n ): StructuredLog<Record<string, unknown>> => {\n events.push({\n level,\n message: serializeMessage(message),\n timestamp: new Date().toISOString(),\n ...(normalizeEventData(message, args) === undefined\n ? {}\n : { data: normalizeEventData(message, args) }),\n });\n\n return structuredLog;\n };\n\n const structuredLog: StructuredLog<Record<string, unknown>> = {\n set<TNextFields extends Record<string, unknown>>(extraFields: TNextFields) {\n Object.assign(fields, extraFields);\n return structuredLog as StructuredLog<Record<string, unknown> & TNextFields>;\n },\n\n debug(message, ...args) {\n return appendEvent('debug', message, args);\n },\n\n info(message, ...args) {\n return appendEvent('info', message, args);\n },\n\n warn(message, ...args) {\n return appendEvent('warn', message, args);\n },\n\n warning(message, ...args) {\n return appendEvent('warning', message, args);\n },\n\n error(message, ...args) {\n return appendEvent('error', message, args);\n },\n\n success(message, ...args) {\n return appendEvent('success', message, args);\n },\n\n critical(message, ...args) {\n return appendEvent('critical', message, args);\n },\n\n table(message, data) {\n return appendEvent('table', message, data === undefined ? [] : [data]);\n },\n\n emit(emitOptions = {}) {\n if (emittedPayload) {\n return emittedPayload;\n }\n\n const defaultFields = options.resolveDefaultFields?.() ?? {};\n const status = resolveEmitStatus(emitOptions);\n const error = normalizeError(emitOptions.error, status);\n const level = emitOptions.level ?? (error ? 'error' : 'info');\n const payload: StructuredLogPayload<Record<string, unknown>> = {\n ...defaultFields,\n ...fields,\n groupId,\n timestamp: new Date().toISOString(),\n level,\n duration: Math.round(performance.now() - startedAt),\n ...(typeof status === 'number' ? { status } : {}),\n ...(events.length > 0 ? { events: [...events] } : {}),\n ...(error ? { error } : {}),\n };\n\n options.write(payload, emitOptions.message ?? 'structured_log');\n emittedPayload = payload;\n options.onEmit?.(payload);\n return payload;\n },\n };\n\n return structuredLog;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { gzipSync } from 'fflate';\nimport type { BlypConfig } from './config';\nimport type {\n FileLoggerDependencies,\n LogRecord,\n ResolvedFileLoggerConfig,\n StreamState,\n} from '../types/core/file-logger';\n\nexport type { LogRecord } from '../types/core/file-logger';\n\nfunction gzipBuffer(buf: Buffer): Buffer {\n return Buffer.from(gzipSync(buf));\n}\n\nfunction warnWithConsole(message: string, error?: unknown): void {\n console.warn(`[Blyp] Warning: ${message}`, error);\n}\n\nfunction ensureDirectory(dirPath: string): void {\n fs.mkdirSync(dirPath, { recursive: true });\n}\n\nfunction getFileSize(filePath: string): number {\n try {\n return fs.statSync(filePath).size;\n } catch {\n return 0;\n }\n}\n\nfunction formatArchiveTimestamp(timestamp: Date): string {\n const year = timestamp.getUTCFullYear();\n const month = String(timestamp.getUTCMonth() + 1).padStart(2, '0');\n const day = String(timestamp.getUTCDate()).padStart(2, '0');\n const hours = String(timestamp.getUTCHours()).padStart(2, '0');\n const minutes = String(timestamp.getUTCMinutes()).padStart(2, '0');\n const seconds = String(timestamp.getUTCSeconds()).padStart(2, '0');\n return `${year}${month}${day}T${hours}${minutes}${seconds}Z`;\n}\n\nfunction getUniqueArchivePath(basePath: string, extension: string): string {\n let candidate = `${basePath}${extension}`;\n let suffix = 1;\n\n while (fs.existsSync(candidate)) {\n candidate = `${basePath}-${suffix}${extension}`;\n suffix += 1;\n }\n\n return candidate;\n}\n\nfunction pruneArchives(\n archiveDir: string,\n archivePrefix: string,\n maxArchives: number,\n warn: (message: string, error?: unknown) => void\n): void {\n const prefix = `${archivePrefix}.`;\n\n try {\n const archivePaths = fs\n .readdirSync(archiveDir)\n .filter((name) =>\n name.startsWith(prefix) &&\n (name.endsWith('.ndjson') || name.endsWith('.ndjson.gz'))\n )\n .map((name) => path.join(archiveDir, name))\n .sort((left, right) => {\n return fs.statSync(left).mtimeMs - fs.statSync(right).mtimeMs;\n });\n\n const deleteCount = Math.max(archivePaths.length - maxArchives, 0);\n\n for (let index = 0; index < deleteCount; index += 1) {\n fs.rmSync(archivePaths[index]!);\n }\n } catch (error) {\n warn(`Failed to prune archives for ${archivePrefix}`, error);\n }\n}\n\nfunction createSafeReplacer() {\n const seen = new WeakSet<object>();\n\n return (_key: string, value: unknown) => {\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (value === undefined) {\n return '[undefined]';\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value !== null && typeof value === 'object') {\n if (seen.has(value)) {\n return '[Circular]';\n }\n\n seen.add(value);\n }\n\n return value;\n };\n}\n\nexport function serializeLogRecord(record: LogRecord): string {\n return JSON.stringify(record, createSafeReplacer());\n}\n\nfunction resolveFileLoggerConfig(config: BlypConfig): ResolvedFileLoggerConfig {\n const fileConfig = config.file;\n const dir = fileConfig?.dir || config.logDir || path.join(process.cwd(), 'logs');\n const archiveDir = fileConfig?.archiveDir || path.join(dir, 'archive');\n const rotation = fileConfig?.rotation;\n\n return {\n enabled: fileConfig?.enabled ?? true,\n dir,\n archiveDir,\n rotationEnabled: rotation?.enabled ?? true,\n maxSizeBytes: rotation?.maxSizeBytes ?? 10 * 1024 * 1024,\n maxArchives: rotation?.maxArchives ?? 5,\n compress: rotation?.compress ?? true,\n };\n}\n\nexport class RotatingFileLogger {\n private readonly config: ResolvedFileLoggerConfig;\n private readonly gzip: (input: Buffer) => Buffer;\n private readonly warn: (message: string, error?: unknown) => void;\n private readonly combined: StreamState;\n private readonly error: StreamState;\n\n constructor(config: BlypConfig, dependencies: FileLoggerDependencies = {}) {\n this.config = resolveFileLoggerConfig(config);\n this.gzip = dependencies.gzip ?? gzipBuffer;\n this.warn = dependencies.warn ?? warnWithConsole;\n this.combined = {\n activePath: path.join(this.config.dir, 'log.ndjson'),\n archivePrefix: 'log',\n bytes: 0,\n queue: [],\n processing: false,\n };\n this.error = {\n activePath: path.join(this.config.dir, 'log.error.ndjson'),\n archivePrefix: 'log.error',\n bytes: 0,\n queue: [],\n processing: false,\n };\n\n if (!this.config.enabled) {\n return;\n }\n\n ensureDirectory(this.config.dir);\n ensureDirectory(this.config.archiveDir);\n this.seedStream(this.combined);\n this.seedStream(this.error);\n }\n\n write(record: LogRecord): void {\n if (!this.config.enabled) {\n return;\n }\n\n const line = `${serializeLogRecord(record)}\\n`;\n this.enqueue(this.combined, line);\n\n if (record.level === 'error' || record.level === 'critical') {\n this.enqueue(this.error, line);\n }\n }\n\n private enqueue(stream: StreamState, line: string): void {\n stream.queue.push(line);\n this.processQueue(stream);\n }\n\n private processQueue(stream: StreamState): void {\n if (stream.processing) {\n return;\n }\n\n stream.processing = true;\n\n try {\n while (stream.queue.length > 0) {\n const queuedLine = stream.queue.shift();\n if (queuedLine === undefined) {\n continue;\n }\n\n try {\n this.append(stream, queuedLine);\n } catch (error) {\n this.warn(`Failed writing log line for ${stream.archivePrefix}`, error);\n }\n }\n } finally {\n stream.processing = false;\n }\n }\n\n private seedStream(stream: StreamState): void {\n stream.bytes = getFileSize(stream.activePath);\n\n if (this.config.rotationEnabled && stream.bytes > this.config.maxSizeBytes && stream.bytes > 0) {\n this.rotate(stream);\n fs.closeSync(fs.openSync(stream.activePath, 'a'));\n stream.bytes = 0;\n }\n }\n\n private append(stream: StreamState, line: string): void {\n ensureDirectory(this.config.dir);\n const lineBytes = Buffer.byteLength(line, 'utf8');\n\n if (\n this.config.rotationEnabled &&\n stream.bytes > 0 &&\n stream.bytes + lineBytes > this.config.maxSizeBytes\n ) {\n this.rotate(stream);\n }\n\n fs.appendFileSync(stream.activePath, line, 'utf8');\n stream.bytes += lineBytes;\n }\n\n private rotate(stream: StreamState): void {\n ensureDirectory(this.config.archiveDir);\n if (!fs.existsSync(stream.activePath) || stream.bytes === 0) {\n stream.bytes = 0;\n return;\n }\n\n const archiveTimestamp = formatArchiveTimestamp(new Date());\n const archiveBasePath = path.join(\n this.config.archiveDir,\n `${stream.archivePrefix}.${archiveTimestamp}`\n );\n const archivePath = getUniqueArchivePath(archiveBasePath, '.ndjson');\n\n fs.renameSync(stream.activePath, archivePath);\n\n if (this.config.compress) {\n try {\n const compressedPath = `${archivePath}.gz`;\n const gzipped = this.gzip(fs.readFileSync(archivePath));\n fs.writeFileSync(compressedPath, gzipped);\n fs.rmSync(archivePath);\n } catch (error) {\n this.warn(`Failed to gzip archive ${archivePath}`, error);\n }\n }\n\n stream.bytes = 0;\n pruneArchives(this.config.archiveDir, stream.archivePrefix, this.config.maxArchives, this.warn);\n }\n}\n\nexport function createFileLogger(config: BlypConfig): RotatingFileLogger {\n return new RotatingFileLogger(config);\n}\n","import type { BlypConfig } from '../core/config';\nimport type { LogRecord } from '../core/file-logger';\nimport { isPlainObject } from '../shared/validation';\n\nexport function isBlypConfig(config: unknown): config is BlypConfig {\n return isPlainObject(config) && (\n 'connectors' in config ||\n 'pretty' in config ||\n 'level' in config\n );\n}\n\nexport function getPrimaryPayload(record: LogRecord): Record<string, unknown> {\n return isPlainObject(record.data) ? record.data : record;\n}\n\nexport function getField<T extends string | number>(\n record: LogRecord,\n key: string\n): T | undefined {\n if (key in record) {\n const direct = record[key];\n if (typeof direct === 'string' || typeof direct === 'number') {\n return direct as T;\n }\n }\n\n const payload = getPrimaryPayload(record);\n const nested = payload[key];\n if (typeof nested === 'string' || typeof nested === 'number') {\n return nested as T;\n }\n\n return undefined;\n}\n\nexport function getClientPageField(\n record: LogRecord,\n key: 'pathname' | 'url'\n): string | undefined {\n const payload = getPrimaryPayload(record);\n const page = isPlainObject(payload.page) ? payload.page : undefined;\n const value = page?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function getClientSessionField(\n record: LogRecord,\n key: 'sessionId' | 'pageId'\n): string | undefined {\n const payload = getPrimaryPayload(record);\n const session = isPlainObject(payload.session) ? payload.session : undefined;\n const value = session?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function getRecordType(record: LogRecord): string | undefined {\n return getField<string>(record, 'type');\n}\n","import * as Sentry from '@sentry/node';\nimport { Logtail } from '@logtail/node';\nimport type {\n BetterStackConnectorConfig,\n BlypConfig,\n ResolvedBetterStackConnectorConfig,\n} from '../../core/config';\nimport type { LogRecord } from '../../core/file-logger';\nimport { serializeLogRecord } from '../../core/file-logger';\nimport { createErrorOnceLogger } from '../../shared/once';\nimport { hasNonEmptyString, isAbsoluteHttpUrl, isPlainObject } from '../../shared/validation';\nimport type {\n BetterStackClientLike,\n BetterStackExceptionCaptureOptions,\n BetterStackLogSource,\n BetterStackSender,\n BetterStackTestHooks,\n} from '../../types/connectors/betterstack';\nimport type { SentryModuleLike } from '../../types/connectors/sentry';\nimport {\n getClientPageField,\n getClientSessionField,\n getField,\n getPrimaryPayload,\n getRecordType,\n isBlypConfig,\n} from '../shared';\n\nconst PREVIOUSLY_CAPTURED_ERROR_KEY = '__betterstack_previously_captured_error';\nconst warnedKeys = new Set<string>();\nlet testHooks: BetterStackTestHooks = {};\nconst warnOnce = createErrorOnceLogger(warnedKeys);\n\nfunction getSentryModule(): SentryModuleLike {\n return testHooks.module ?? (Sentry as unknown as SentryModuleLike);\n}\n\nfunction resolveConnectorConfig(\n config: BlypConfig | ResolvedBetterStackConnectorConfig | BetterStackConnectorConfig\n): ResolvedBetterStackConnectorConfig {\n const connector = isBlypConfig(config)\n ? config.connectors?.betterstack\n : config;\n const enabled = connector?.enabled ?? false;\n const sourceToken = connector?.sourceToken;\n const ingestingHost = connector?.ingestingHost;\n const errorTrackingEnabled = connector?.errorTracking?.enabled ?? enabled;\n const errorTrackingDsn = connector?.errorTracking?.dsn;\n const errorTrackingReady =\n enabled &&\n errorTrackingEnabled &&\n hasNonEmptyString(errorTrackingDsn);\n const ready =\n enabled &&\n hasNonEmptyString(sourceToken) &&\n isAbsoluteHttpUrl(ingestingHost);\n\n return {\n enabled,\n mode: connector?.mode ?? 'auto',\n sourceToken,\n ingestingHost,\n serviceName: connector?.serviceName ?? 'blyp-app',\n errorTracking: {\n enabled: errorTrackingEnabled,\n dsn: errorTrackingDsn,\n tracesSampleRate: connector?.errorTracking?.tracesSampleRate ?? 1.0,\n environment: connector?.errorTracking?.environment,\n release: connector?.errorTracking?.release,\n ready: errorTrackingReady,\n status: errorTrackingReady ? 'enabled' : 'missing',\n },\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction resolveBetterStackLevel(level: string): string {\n switch (level) {\n case 'debug':\n return 'debug';\n case 'warning':\n case 'warn':\n return 'warn';\n case 'error':\n return 'error';\n case 'critical':\n return 'fatal';\n case 'success':\n case 'table':\n case 'info':\n default:\n return 'info';\n }\n}\n\nfunction parseCaller(caller: unknown): { file?: string; line?: number } {\n if (typeof caller !== 'string' || caller.trim().length === 0) {\n return {};\n }\n\n const match = caller.match(/^(.*):(\\d+)$/);\n if (!match) {\n return {};\n }\n\n const file = match[1]?.trim();\n const line = Number.parseInt(match[2] ?? '', 10);\n\n return {\n ...(file ? { file } : {}),\n ...(Number.isFinite(line) ? { line } : {}),\n };\n}\n\nfunction buildContext(\n record: LogRecord,\n connector: ResolvedBetterStackConnectorConfig,\n source: BetterStackLogSource\n): Record<string, unknown> {\n const recordType = getRecordType(record);\n const groupId = getField<string>(record, 'groupId');\n const method = getField<string>(record, 'method');\n const path = getField<string>(record, 'path');\n const status = getField<number>(record, 'status');\n const duration = getField<number>(record, 'duration');\n const pagePath = getClientPageField(record, 'pathname');\n const pageUrl = getClientPageField(record, 'url');\n const sessionId = getClientSessionField(record, 'sessionId');\n const pageId = getClientSessionField(record, 'pageId');\n const runtime = parseCaller(record.caller);\n\n return {\n service: connector.serviceName,\n context: {\n blyp: {\n level: record.level,\n source,\n ...(recordType ? { type: recordType } : {}),\n ...(groupId ? { group_id: groupId } : {}),\n ...(record.caller ? { caller: record.caller } : {}),\n ...(duration !== undefined ? { duration_ms: duration } : {}),\n ...(record.bindings ? { bindings: record.bindings } : {}),\n payload: serializeLogRecord(record),\n },\n ...(method || path || status !== undefined\n ? {\n http: {\n ...(method ? { method } : {}),\n ...(path ? { path } : {}),\n ...(status !== undefined ? { status_code: status } : {}),\n },\n }\n : {}),\n ...(pagePath || pageUrl || sessionId || pageId\n ? {\n client: {\n ...(pagePath ? { page_path: pagePath } : {}),\n ...(pageUrl ? { page_url: pageUrl } : {}),\n ...(sessionId ? { session_id: sessionId } : {}),\n ...(pageId ? { page_id: pageId } : {}),\n },\n }\n : {}),\n ...(Object.keys(runtime).length > 0 ? { runtime } : {}),\n ...(record.data !== undefined ? { data: record.data } : {}),\n ...(record.error !== undefined ? { error: record.error } : {}),\n },\n };\n}\n\nfunction toExceptionCandidate(value: unknown): unknown {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const message = typeof value.message === 'string' ? value.message : undefined;\n const name = typeof value.name === 'string' ? value.name : undefined;\n const stack = typeof value.stack === 'string' ? value.stack : undefined;\n\n if (!message && !name && !stack) {\n return undefined;\n }\n\n const error = new Error(message ?? name ?? 'Unknown error');\n error.name = name ?? 'Error';\n if (stack) {\n error.stack = stack;\n }\n\n for (const [key, entry] of Object.entries(value)) {\n if (key === 'message' || key === 'name' || key === 'stack') {\n continue;\n }\n\n ((error as unknown) as Record<string, unknown>)[key] = entry;\n }\n\n return error;\n}\n\nfunction normalizeScopeLevel(level: string): Sentry.SeverityLevel {\n switch (level) {\n case 'debug':\n return 'debug';\n case 'warning':\n case 'warn':\n return 'warning';\n case 'critical':\n return 'fatal';\n case 'error':\n return 'error';\n case 'success':\n case 'table':\n case 'info':\n default:\n return 'info';\n }\n}\n\nfunction normalizeExceptionInput(input: unknown): unknown {\n if (input instanceof Error) {\n return input;\n }\n\n const direct = toExceptionCandidate(input);\n if (direct) {\n return direct;\n }\n\n if (typeof input === 'string') {\n return new Error(input);\n }\n\n return new Error('Unknown Better Stack exception');\n}\n\nfunction isPreviouslyCapturedError(value: unknown): boolean {\n return isPlainObject(value) && value[PREVIOUSLY_CAPTURED_ERROR_KEY] === true;\n}\n\nfunction markCapturedError(value: unknown): void {\n if (!isPlainObject(value) || isPreviouslyCapturedError(value)) {\n return;\n }\n\n try {\n Object.defineProperty(value, PREVIOUSLY_CAPTURED_ERROR_KEY, {\n value: true,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n } catch {\n try {\n value[PREVIOUSLY_CAPTURED_ERROR_KEY] = true;\n } catch {}\n }\n}\n\nfunction createDefaultClient(\n connector: ResolvedBetterStackConnectorConfig\n): BetterStackClientLike {\n return new Logtail(connector.sourceToken ?? '', {\n endpoint: connector.ingestingHost,\n captureStackContext: false,\n }) as BetterStackClientLike;\n}\n\nfunction getClientOptions(client: ReturnType<SentryModuleLike['getClient']>): {\n dsn?: unknown;\n environment?: unknown;\n release?: unknown;\n} {\n return client?.getOptions?.() ?? {};\n}\n\nfunction registerShutdownHooks(key: string, flush: () => Promise<void>): void {\n const handlers: Array<NodeJS.Signals | 'beforeExit'> = ['beforeExit', 'SIGINT', 'SIGTERM'];\n\n for (const event of handlers) {\n process.once(event, () => {\n void flush().catch((error) => {\n warnOnce(\n `${key}:shutdown`,\n '[Blyp] Failed to flush Better Stack logs during shutdown.',\n error\n );\n });\n });\n }\n}\n\nexport function createBetterStackSender(\n config: BlypConfig | ResolvedBetterStackConnectorConfig | BetterStackConnectorConfig\n): BetterStackSender {\n const connector = resolveConnectorConfig(config);\n const key = `${connector.serviceName}:${connector.ingestingHost ?? 'missing'}:${connector.mode}`;\n const sentryModule = getSentryModule();\n const client = connector.ready\n ? (testHooks.createClient?.(connector) ?? createDefaultClient(connector))\n : undefined;\n let sentryClient = connector.errorTracking.enabled\n ? sentryModule?.getClient?.()\n : undefined;\n\n if (sentryClient) {\n const options = getClientOptions(sentryClient);\n if (\n (hasNonEmptyString(connector.errorTracking.dsn) && connector.errorTracking.dsn !== options.dsn) ||\n (hasNonEmptyString(connector.errorTracking.environment) && connector.errorTracking.environment !== options.environment) ||\n (hasNonEmptyString(connector.errorTracking.release) && connector.errorTracking.release !== options.release)\n ) {\n warnOnce(\n `betterstack-error-mismatch:${key}`,\n '[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client for Better Stack error tracking.'\n );\n }\n }\n\n if (\n !sentryClient &&\n connector.errorTracking.enabled &&\n hasNonEmptyString(connector.errorTracking.dsn) &&\n sentryModule\n ) {\n try {\n sentryModule.init({\n dsn: connector.errorTracking.dsn,\n tracesSampleRate: connector.errorTracking.tracesSampleRate,\n environment: connector.errorTracking.environment,\n release: connector.errorTracking.release,\n });\n sentryClient = sentryModule.getClient();\n } catch (error) {\n warnOnce(\n `betterstack-error-init:${key}`,\n '[Blyp] Failed to initialize Better Stack error tracking.',\n error\n );\n }\n }\n\n const errorTrackingReady = connector.errorTracking.enabled && sentryClient !== undefined;\n\n if (client || errorTrackingReady) {\n registerShutdownHooks(key, async () => {\n if (client) {\n await client.flush();\n }\n if (errorTrackingReady) {\n await sentryModule.flush(2000);\n }\n });\n }\n\n const emitUnavailableWarning = (): void => {\n warnOnce(\n `betterstack-unavailable:${key}`,\n '[Blyp] Better Stack connector is not configured or not ready. Skipping Better Stack delivery.'\n );\n };\n\n const emitExceptionUnavailableWarning = (): void => {\n warnOnce(\n `betterstack-exception-unavailable:${key}`,\n '[Blyp] Better Stack error tracking is not configured. Skipping Better Stack exception capture.'\n );\n };\n\n return {\n enabled: connector.enabled,\n ready: connector.ready,\n mode: connector.mode,\n serviceName: connector.serviceName,\n ingestingHost: connector.ingestingHost,\n status: connector.status,\n errorTracking: {\n enabled: connector.errorTracking.enabled,\n ready: errorTrackingReady,\n status: errorTrackingReady ? 'enabled' : 'missing',\n dsn: connector.errorTracking.dsn,\n tracesSampleRate: connector.errorTracking.tracesSampleRate,\n environment: connector.errorTracking.environment,\n release: connector.errorTracking.release,\n },\n shouldAutoForwardServerLogs() {\n return connector.ready && connector.mode === 'auto';\n },\n shouldAutoCaptureExceptions() {\n return errorTrackingReady;\n },\n send(record, options = {}) {\n if (!connector.ready || !client) {\n if (options.warnIfUnavailable) {\n emitUnavailableWarning();\n }\n return;\n }\n\n const source = options.source ?? 'server';\n void client.log(\n record.message,\n resolveBetterStackLevel(record.level),\n buildContext(record, connector, source)\n ).catch((error) => {\n warnOnce(\n `betterstack-send:${key}`,\n '[Blyp] Failed to deliver log to Better Stack.',\n error\n );\n });\n },\n captureException(error, options: BetterStackExceptionCaptureOptions = {}) {\n if (!errorTrackingReady || !sentryModule) {\n if (options.warnIfUnavailable) {\n emitExceptionUnavailableWarning();\n }\n return;\n }\n\n if (isPreviouslyCapturedError(error)) {\n return;\n }\n\n try {\n const exception = normalizeExceptionInput(error);\n sentryModule.withScope((scope) => {\n scope.setLevel(\n normalizeScopeLevel(\n options.source === 'client' ? 'error' : 'error'\n )\n );\n scope.setContext('blyp', {\n source: options.source ?? 'server',\n ...(options.context ? { context: options.context } : {}),\n });\n sentryModule.captureException(exception);\n });\n markCapturedError(error);\n markCapturedError(exception);\n } catch (captureError) {\n warnOnce(\n `betterstack-manual-capture:${key}`,\n '[Blyp] Failed to capture exception in Better Stack error tracking.',\n captureError\n );\n }\n },\n async flush() {\n if (!client) {\n if (!errorTrackingReady || !sentryModule) {\n return;\n }\n }\n\n try {\n if (client) {\n await client.flush();\n }\n if (errorTrackingReady && sentryModule) {\n await sentryModule.flush(2000);\n }\n } catch (error) {\n warnOnce(\n `betterstack-flush:${key}`,\n '[Blyp] Failed to flush Better Stack logs.',\n error\n );\n }\n },\n };\n}\n\nexport function setBetterStackTestHooks(hooks: BetterStackTestHooks): void {\n testHooks = hooks;\n}\n\nexport function resetBetterStackTestHooks(): void {\n testHooks = {};\n warnedKeys.clear();\n}\n","import { resolveConfig } from '../../core/config';\nimport {\n buildRecord,\n buildStructuredRecord,\n resolveStructuredWriteLevel,\n type LogMethodName,\n} from '../../core/log-record';\nimport {\n createStructuredLog,\n type StructuredLog,\n type StructuredLogPayload,\n} from '../../core/structured-log';\nimport {\n createBetterStackSender,\n} from './sender';\nimport type {\n BetterStackErrorTracker,\n BetterStackExceptionCaptureOptions,\n BetterStackLogger,\n BetterStackLoggerConfig,\n BetterStackSender,\n} from '../../types/connectors/betterstack';\n\nexport type {\n BetterStackErrorTracker,\n BetterStackExceptionCaptureOptions,\n BetterStackLogger,\n BetterStackLoggerConfig,\n} from '../../types/connectors/betterstack';\n\nfunction resolveSender(config: BetterStackLoggerConfig = {}): BetterStackSender {\n return createBetterStackSender(resolveConfig({\n ...(config.connectors ? { connectors: config.connectors } : {}),\n }));\n}\n\nfunction createBetterStackLoggerInstance(\n sender: BetterStackSender,\n bindings: Record<string, unknown> = {}\n): BetterStackLogger {\n const writeRecord = (\n level: LogMethodName,\n message: unknown,\n args: unknown[]\n ): void => {\n sender.send(buildRecord(level, message, args, bindings), {\n source: 'server',\n warnIfUnavailable: true,\n });\n };\n\n const writeStructured = (\n payload: StructuredLogPayload,\n message: string\n ): void => {\n sender.send(\n buildStructuredRecord(\n resolveStructuredWriteLevel(payload.level),\n message,\n payload,\n bindings\n ),\n {\n source: 'server',\n warnIfUnavailable: true,\n }\n );\n };\n\n return {\n debug: (message: unknown, ...args: unknown[]) => {\n writeRecord('debug', message, args);\n },\n info: (message: unknown, ...args: unknown[]) => {\n writeRecord('info', message, args);\n },\n error: (message: unknown, ...args: unknown[]) => {\n writeRecord('error', message, args);\n },\n warn: (message: unknown, ...args: unknown[]) => {\n writeRecord('warn', message, args);\n },\n warning: (message: unknown, ...args: unknown[]) => {\n writeRecord('warning', message, args);\n },\n success: (message: unknown, ...args: unknown[]) => {\n writeRecord('success', message, args);\n },\n critical: (message: unknown, ...args: unknown[]) => {\n writeRecord('critical', message, args);\n },\n table: (message: string, data?: unknown) => {\n writeRecord('table', message, data === undefined ? [] : [data]);\n },\n flush: async () => {},\n shutdown: async () => {},\n createStructuredLog: (\n groupId: string,\n initial?: Record<string, unknown>\n ): StructuredLog => {\n return createStructuredLog(groupId, {\n initialFields: initial,\n write: writeStructured,\n });\n },\n child: (childBindings: Record<string, unknown>) => {\n return createBetterStackLoggerInstance(sender, {\n ...bindings,\n ...childBindings,\n });\n },\n };\n}\n\nfunction createBetterStackErrorTrackerInstance(\n sender: BetterStackSender,\n bindings: Record<string, unknown> = {}\n): BetterStackErrorTracker {\n return {\n capture: (error: unknown, options: BetterStackExceptionCaptureOptions = {}) => {\n sender.captureException(error, {\n source: options.source ?? 'server',\n warnIfUnavailable: options.warnIfUnavailable ?? true,\n context: {\n ...bindings,\n ...(options.context ?? {}),\n 'blyp.manual': true,\n },\n });\n },\n child: (childBindings: Record<string, unknown>) => {\n return createBetterStackErrorTrackerInstance(sender, {\n ...bindings,\n ...childBindings,\n });\n },\n };\n}\n\nexport function createBetterStackLogger(\n config: BetterStackLoggerConfig = {}\n): BetterStackLogger {\n return createBetterStackLoggerInstance(resolveSender(config));\n}\n\nexport function createBetterStackErrorTracker(\n config: BetterStackLoggerConfig = {}\n): BetterStackErrorTracker {\n return createBetterStackErrorTrackerInstance(resolveSender(config));\n}\n\nexport function captureBetterStackException(\n error: unknown,\n options: BetterStackExceptionCaptureOptions = {},\n config: BetterStackLoggerConfig = {}\n): void {\n createBetterStackErrorTracker(config).capture(error, options);\n}\n\nexport function createStructuredBetterStackLogger<\n TFields extends Record<string, unknown> = Record<string, unknown>,\n>(\n groupId: string,\n initial?: TFields,\n config: BetterStackLoggerConfig = {}\n): StructuredLog<TFields> {\n const sender = resolveSender(config);\n\n return createStructuredLog(groupId, {\n initialFields: initial,\n write: (payload, message) => {\n sender.send(\n buildStructuredRecord(\n resolveStructuredWriteLevel(payload.level),\n message,\n payload,\n {}\n ),\n {\n source: 'server',\n warnIfUnavailable: true,\n }\n );\n },\n }) as StructuredLog<TFields>;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/log-value.ts","../../src/shared/validation.ts","../../src/shared/client-log.ts","../../src/shared/once.ts","../../src/core/config.ts","../../src/core/log-record.ts","../../src/core/structured-log.ts","../../src/core/file-logger.ts","../../src/connectors/shared.ts","../../src/connectors/betterstack/sender.ts","../../src/connectors/betterstack/index.ts"],"names":["z","warnedKeys","serializeMessage","normalizeError","warnOnce"],"mappings":"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","file":"betterstack.mjs","sourcesContent":["export function normalizeError(error: Error): Record<string, unknown> {\n const normalized: Record<string, unknown> = {\n name: error.name,\n message: error.message,\n };\n\n if (error.stack) {\n normalized.stack = error.stack;\n }\n\n const errorWithCause = error as Error & { cause?: unknown };\n if (errorWithCause.cause !== undefined) {\n normalized.cause = normalizeLogValue(errorWithCause.cause);\n }\n\n return normalized;\n}\n\nexport function normalizeLogValue(\n value: unknown,\n seen: WeakSet<object> = new WeakSet()\n): unknown {\n if (value instanceof Error) {\n return normalizeError(value);\n }\n\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value === undefined || value === null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeLogValue(entry, seen));\n }\n\n if (typeof value === 'object') {\n if (seen.has(value)) {\n return '[Circular]';\n }\n\n seen.add(value);\n const normalized: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n normalized[key] = normalizeLogValue(entry, seen);\n }\n\n seen.delete(value);\n return normalized;\n }\n\n return value;\n}\n\nexport function serializeLogMessage(message: unknown): string {\n if (typeof message === 'string') {\n return message;\n }\n\n if (message instanceof Error) {\n return message.message || message.name;\n }\n\n const normalized = normalizeLogValue(message);\n if (typeof normalized === 'string') {\n return normalized;\n }\n\n try {\n const serialized = JSON.stringify(normalized, null, 2);\n return serialized ?? String(normalized);\n } catch {\n return String(normalized);\n }\n}\n","import { z } from 'zod';\n\nexport const absoluteHttpUrlSchema = z.string().url().refine((value) => {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}, {\n message: 'Expected an absolute http(s) URL',\n});\n\nexport const plainObjectSchema = z.custom<Record<string, unknown>>(\n (value): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n },\n {\n message: 'Expected a plain object',\n }\n);\n\nexport const nonEmptyStringSchema = z.string().trim().min(1);\n\nexport function isAbsoluteHttpUrl(value: unknown): value is string {\n return absoluteHttpUrlSchema.safeParse(value).success;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return plainObjectSchema.safeParse(value).success;\n}\n\nexport function hasNonEmptyString(value: unknown): value is string {\n return nonEmptyStringSchema.safeParse(value).success;\n}\n","/// <reference lib=\"dom\" />\n\nimport { z } from 'zod';\nimport {\n normalizeError,\n normalizeLogValue,\n serializeLogMessage,\n} from './log-value';\nimport {\n isPlainObject,\n nonEmptyStringSchema,\n plainObjectSchema,\n} from './validation';\nimport type {\n ClientConnectorRequest,\n ClientLogBrowserContext,\n ClientLogDeviceContext,\n ClientLogEvent,\n ClientLogLevel,\n ClientLogPageContext,\n ClientLogSessionContext,\n RemoteDeliveryConfig,\n RemoteDeliveryDropContext,\n RemoteDeliveryFailureContext,\n RemoteDeliveryFailureReason,\n RemoteDeliveryRetryContext,\n RemoteDeliveryRuntime,\n RemoteDeliverySuccessContext,\n RemoteDeliveryTransport,\n} from '../types/shared/client-log';\n\nexport type {\n ClientConnectorRequest,\n ClientLogBrowserContext,\n ClientLogDeviceContext,\n ClientLogEvent,\n ClientLogLevel,\n ClientLogPageContext,\n ClientLogSessionContext,\n RemoteDeliveryConfig,\n RemoteDeliveryDropContext,\n RemoteDeliveryFailureContext,\n RemoteDeliveryFailureReason,\n RemoteDeliveryRetryContext,\n RemoteDeliverySuccessContext,\n RemoteDeliveryTransport,\n} from '../types/shared/client-log';\n\nexport const DEFAULT_CLIENT_LOG_ENDPOINT = '/inngest';\nconst SESSION_STORAGE_KEY = 'blyp:session-id';\n\nconst CLIENT_LOG_LEVELS: ClientLogLevel[] = [\n 'debug',\n 'info',\n 'warning',\n 'error',\n 'critical',\n 'success',\n 'table',\n];\nconst clientConnectorRequestSchema = z.union([\n z.literal('betterstack'),\n z.literal('posthog'),\n z.literal('sentry'),\n z.undefined(),\n z.object({\n type: z.literal('otlp'),\n name: nonEmptyStringSchema,\n }),\n]);\n\nfunction isClientLogLevel(value: unknown): value is ClientLogLevel {\n return typeof value === 'string' && CLIENT_LOG_LEVELS.includes(value as ClientLogLevel);\n}\n\nfunction isClientConnectorRequest(value: unknown): value is ClientConnectorRequest {\n return clientConnectorRequestSchema.safeParse(value).success;\n}\n\nfunction safeGet<T>(getter: () => T): T | undefined {\n try {\n return getter();\n } catch {\n return undefined;\n }\n}\n\nfunction randomSegment(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport function createRandomId(): string {\n const maybeCrypto = safeGet(() => globalThis.crypto);\n const randomUUID = maybeCrypto && typeof maybeCrypto.randomUUID === 'function'\n ? maybeCrypto.randomUUID.bind(maybeCrypto)\n : undefined;\n\n if (randomUUID) {\n return randomUUID();\n }\n\n return `${Date.now().toString(36)}-${randomSegment()}`;\n}\n\nexport function normalizeClientLogLevel(level: ClientLogLevel | 'warn'): ClientLogLevel {\n return level === 'warn' ? 'warning' : level;\n}\n\nexport { normalizeError, normalizeLogValue, serializeLogMessage };\n\nexport function normalizeClientPayloadData(message: unknown, args: unknown[]): unknown {\n const normalizedArgs = args.map((entry) => normalizeLogValue(entry));\n const messageData = message instanceof Error ? normalizeError(message) : undefined;\n\n if (messageData !== undefined && normalizedArgs.length === 0) {\n return messageData;\n }\n\n const combined = messageData === undefined ? normalizedArgs : [messageData, ...normalizedArgs];\n\n if (combined.length === 0) {\n return undefined;\n }\n\n if (combined.length === 1) {\n return combined[0];\n }\n\n return combined;\n}\n\nexport function getBrowserPageContext(): ClientLogPageContext {\n const location = safeGet(() => globalThis.location);\n const document = safeGet(() => globalThis.document);\n\n return {\n url: location?.href,\n pathname: location?.pathname,\n search: location?.search,\n hash: location?.hash,\n title: document?.title,\n referrer: document?.referrer,\n };\n}\n\nexport function getBrowserContext(): ClientLogBrowserContext {\n const navigator = safeGet(() => globalThis.navigator);\n\n return {\n userAgent: navigator?.userAgent,\n language: navigator?.language,\n platform: navigator?.platform,\n };\n}\n\nexport function getClientSessionId(): string {\n const storage = safeGet(() => globalThis.sessionStorage);\n const existing = safeGet(() => storage?.getItem(SESSION_STORAGE_KEY));\n\n if (existing) {\n return existing;\n }\n\n const sessionId = createRandomId();\n safeGet(() => storage?.setItem(SESSION_STORAGE_KEY, sessionId));\n return sessionId;\n}\n\nexport function normalizeMetadata(\n metadata: Record<string, unknown> | (() => Record<string, unknown>) | undefined\n): Record<string, unknown> | undefined {\n if (metadata === undefined) {\n return undefined;\n }\n\n const resolved = typeof metadata === 'function' ? safeGet(metadata) : metadata;\n if (!isPlainObject(resolved)) {\n return undefined;\n }\n\n return normalizeLogValue(resolved) as Record<string, unknown>;\n}\n\nexport function isClientLogEvent(payload: unknown): payload is ClientLogEvent {\n if (!isPlainObject(payload)) {\n return false;\n }\n\n if (\n payload.type !== 'client_log' ||\n payload.source !== 'client' ||\n !isClientLogLevel(payload.level) ||\n typeof payload.id !== 'string' ||\n typeof payload.message !== 'string' ||\n typeof payload.clientTimestamp !== 'string'\n ) {\n return false;\n }\n\n const pageResult = plainObjectSchema.safeParse(payload.page);\n const browserResult = plainObjectSchema.safeParse(payload.browser);\n const sessionResult = plainObjectSchema.safeParse(payload.session);\n\n if (!pageResult.success || !browserResult.success || !sessionResult.success) {\n return false;\n }\n\n if (!isClientConnectorRequest(payload.connector)) {\n return false;\n }\n\n return (\n typeof sessionResult.data.pageId === 'string' &&\n typeof sessionResult.data.sessionId === 'string'\n );\n}\n\nexport function normalizeEndpointPath(path: string | undefined): string {\n if (!path) {\n return DEFAULT_CLIENT_LOG_ENDPOINT;\n }\n\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import type { ConsoleMethod, ConsoleOnceLogger } from '../types/shared/once';\n\nexport type { ConsoleOnceLogger } from '../types/shared/once';\n\nfunction createConsoleOnceLogger(\n method: ConsoleMethod,\n warnedKeys: Set<string> = new Set<string>()\n): ConsoleOnceLogger {\n return (key, message, error) => {\n if (warnedKeys.has(key) || typeof console === 'undefined') {\n return;\n }\n\n const writer = console[method];\n if (typeof writer !== 'function') {\n return;\n }\n\n warnedKeys.add(key);\n if (error === undefined) {\n writer.call(console, message);\n return;\n }\n\n writer.call(console, message, error);\n };\n}\n\nexport function createWarnOnceLogger(warnedKeys?: Set<string>): ConsoleOnceLogger {\n return createConsoleOnceLogger('warn', warnedKeys);\n}\n\nexport function createErrorOnceLogger(warnedKeys?: Set<string>): ConsoleOnceLogger {\n return createConsoleOnceLogger('error', warnedKeys);\n}\n","import { appendFileSync, existsSync, readFileSync, writeFileSync } from 'fs';\nimport { createJiti } from 'jiti';\nimport { dirname, resolve } from 'path';\nimport { DEFAULT_CLIENT_LOG_ENDPOINT } from '../shared/client-log';\nimport { createWarnOnceLogger } from '../shared/once';\nimport { hasNonEmptyString, isAbsoluteHttpUrl } from '../shared/validation';\nimport type {\n BetterStackConnectorConfig,\n BetterStackErrorTrackingConfig,\n BlypDestination,\n BlypConfig,\n BlypConnectorsConfig,\n ClientLoggingConfig,\n ConfigFileMatch,\n DatabaseDeliveryConfig,\n DatabaseLoggerConfig,\n DatabaseRetryConfig,\n DrizzleDatabaseAdapterConfig,\n LogFileConfig,\n LogRotationConfig,\n OTLPConnectorConfig,\n PostHogConnectorConfig,\n PrismaDatabaseAdapterConfig,\n ResolvedBetterStackConnectorConfig,\n ResolvedBetterStackErrorTrackingConfig,\n ResolvedBlypConfig,\n ResolvedBlypConnectorsConfig,\n ResolvedDatabaseLoggerConfig,\n ResolvedOTLPConnectorConfig,\n ResolvedPostHogConnectorConfig,\n ResolvedSentryConnectorConfig,\n SentryConnectorConfig\n} from '../types/core/config';\n\nexport type { ConnectorMode } from '../types/connectors/mode';\nexport type {\n BlypConfig,\n BetterStackConnectorConfig,\n BetterStackErrorTrackingConfig,\n BlypDestination,\n BlypConnectorsConfig,\n ClientLoggingConfig,\n DatabaseAdapterConfig,\n DatabaseAdapterKind,\n DatabaseDeliveryConfig,\n DatabaseDialect,\n DatabaseLoggerConfig,\n DatabaseRetryConfig,\n DrizzleDatabaseAdapterConfig,\n LogFileConfig,\n LogRotationConfig,\n OTLPConnectorConfig,\n PostHogConnectorConfig,\n PrismaDatabaseAdapterConfig,\n ResolvedBlypConfig,\n ResolvedBetterStackConnectorConfig,\n ResolvedBetterStackErrorTrackingConfig,\n ResolvedDatabaseDeliveryConfig,\n ResolvedDatabaseLoggerConfig,\n PostHogErrorTrackingConfig,\n ResolvedOTLPConnectorConfig,\n ResolvedPostHogConnectorConfig,\n ResolvedDatabaseRetryConfig,\n ResolvedPostHogErrorTrackingConfig,\n ResolvedSentryConnectorConfig,\n SentryConnectorConfig\n} from '../types/core/config';\n\nconst PACKAGE_NAME = '@blyp/core';\nconst GITIGNORE_FILE_NAME = '.gitignore';\nconst CONFIG_FILE_NAMES = [\n 'blyp.config.ts',\n 'blyp.config.mts',\n 'blyp.config.cts',\n 'blyp.config.js',\n 'blyp.config.mjs',\n 'blyp.config.cjs',\n 'blyp.config.json',\n] as const;\nconst CONFIG_FILE_NAME = 'blyp.config.json';\nconst DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';\nconst DEFAULT_CONNECTOR_SERVICE_NAME = 'blyp-app';\nconst DEFAULT_POSTHOG_SERVICE_NAME = DEFAULT_CONNECTOR_SERVICE_NAME;\nconst warnedKeys = new Set<string>();\nconst warnOnce = createWarnOnceLogger(warnedKeys);\n\nexport const DEFAULT_ROTATION_CONFIG: Required<LogRotationConfig> = {\n enabled: true,\n maxSizeBytes: 10 * 1024 * 1024,\n maxArchives: 5,\n compress: true,\n};\n\nexport const DEFAULT_FILE_CONFIG: Required<LogFileConfig> = {\n enabled: true,\n dir: '',\n archiveDir: '',\n format: 'ndjson',\n rotation: DEFAULT_ROTATION_CONFIG,\n};\n\nexport const DEFAULT_CLIENT_LOGGING_CONFIG: Required<ClientLoggingConfig> = {\n enabled: true,\n path: DEFAULT_CLIENT_LOG_ENDPOINT,\n};\n\nexport const DEFAULT_DATABASE_RETRY_CONFIG: Required<DatabaseRetryConfig> = {\n maxRetries: 1,\n backoffMs: 100,\n};\n\nexport const DEFAULT_DATABASE_DELIVERY_CONFIG: Required<Omit<DatabaseDeliveryConfig, 'retry'>> & {\n retry: Required<DatabaseRetryConfig>;\n} = {\n strategy: 'immediate',\n batchSize: 1,\n flushIntervalMs: 250,\n maxQueueSize: 1000,\n overflowStrategy: 'drop-oldest',\n flushTimeoutMs: 5000,\n retry: DEFAULT_DATABASE_RETRY_CONFIG,\n};\n\nexport const DEFAULT_CONFIG: BlypConfig = {\n pretty: true,\n level: 'info',\n destination: 'file',\n file: DEFAULT_FILE_CONFIG,\n clientLogging: DEFAULT_CLIENT_LOGGING_CONFIG,\n connectors: {},\n};\n\nlet cachedConfig: ResolvedBlypConfig | null = null;\n\nfunction findNearestPackageName(startDir: string): string | undefined {\n let currentDir = startDir;\n\n while (true) {\n const packageJsonPath = resolve(currentDir, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n name?: unknown;\n };\n if (hasNonEmptyString(packageJson.name)) {\n return packageJson.name;\n }\n } catch {}\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n return undefined;\n }\n\n currentDir = parentDir;\n }\n}\n\nfunction resolveDefaultConnectorServiceName(cwd: string = process.cwd()): string {\n return findNearestPackageName(cwd) ?? DEFAULT_POSTHOG_SERVICE_NAME;\n}\n\nfunction getBootstrapConfig(): BlypConfig {\n return {\n pretty: true,\n level: 'info',\n destination: 'file',\n file: {\n enabled: true,\n format: 'ndjson',\n rotation: {\n enabled: true,\n maxSizeBytes: 10 * 1024 * 1024,\n maxArchives: 5,\n compress: true,\n },\n },\n clientLogging: {\n enabled: true,\n path: DEFAULT_CLIENT_LOG_ENDPOINT,\n },\n connectors: {},\n };\n}\n\nfunction shouldBootstrapProjectFiles(cwd: string): boolean {\n const packageJsonPath = resolve(cwd, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n return true;\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as { name?: string };\n return packageJson.name !== PACKAGE_NAME;\n } catch {\n return true;\n }\n}\n\nfunction ensureConfigFile(cwd: string): void {\n if (CONFIG_FILE_NAMES.some((fileName) => existsSync(resolve(cwd, fileName)))) {\n return;\n }\n\n const configPath = resolve(cwd, CONFIG_FILE_NAME);\n\n if (existsSync(configPath)) {\n return;\n }\n\n try {\n writeFileSync(configPath, `${JSON.stringify(getBootstrapConfig(), null, 2)}\\n`);\n } catch (error) {\n console.error('[Blyp] Warning: Failed to create blyp.config.json:', error);\n }\n}\n\nfunction ensureLogsIgnored(cwd: string): void {\n const gitignorePath = resolve(cwd, GITIGNORE_FILE_NAME);\n\n if (!existsSync(gitignorePath)) {\n try {\n writeFileSync(gitignorePath, 'logs\\n');\n } catch (error) {\n console.error('[Blyp] Warning: Failed to create .gitignore:', error);\n }\n return;\n }\n\n try {\n const currentContent = readFileSync(gitignorePath, 'utf-8');\n if (/^(?:\\/?logs\\/?)\\s*$/m.test(currentContent)) {\n return;\n }\n\n const separator = currentContent.endsWith('\\n') ? '' : '\\n';\n appendFileSync(gitignorePath, `${separator}logs\\n`);\n } catch (error) {\n console.error('[Blyp] Warning: Failed to update .gitignore:', error);\n }\n}\n\nfunction bootstrapProjectFiles(): void {\n const cwd = process.cwd();\n\n if (!shouldBootstrapProjectFiles(cwd)) {\n return;\n }\n\n ensureConfigFile(cwd);\n ensureLogsIgnored(cwd);\n}\n\nfunction findConfigFile(): ConfigFileMatch | null {\n const cwd = process.cwd();\n const matches = CONFIG_FILE_NAMES\n .map((fileName) => resolve(cwd, fileName))\n .filter((filePath) => existsSync(filePath));\n\n if (matches.length === 0) {\n return null;\n }\n\n if (matches.length > 1) {\n const preferred = matches[0]!;\n warnOnce(\n `config-multiple:${preferred}`,\n `[Blyp] Warning: Multiple config files found. Using ${preferred} and ignoring ${matches.slice(1).join(', ')}.`\n );\n }\n\n const selectedPath = matches[0]!;\n return {\n path: selectedPath,\n type: selectedPath.endsWith('.json') ? 'json' : 'jiti',\n };\n}\n\nfunction normalizeLoadedConfig(\n value: unknown,\n configPath: string\n): Partial<BlypConfig> {\n const normalized = (\n value &&\n typeof value === 'object' &&\n 'default' in value &&\n (value as { default?: unknown }).default !== undefined\n )\n ? (value as { default: unknown }).default\n : value;\n\n if (!normalized || typeof normalized !== 'object' || Array.isArray(normalized)) {\n warnOnce(\n `config-invalid:${configPath}`,\n `[Blyp] Warning: Config file ${configPath} did not export an object. Falling back to defaults.`\n );\n return {};\n }\n\n return normalized as Partial<BlypConfig>;\n}\n\nfunction parseJsonConfigFile(configPath: string): Partial<BlypConfig> {\n try {\n const content = readFileSync(configPath, 'utf-8');\n return normalizeLoadedConfig(JSON.parse(content), configPath);\n } catch (error) {\n console.error('[Blyp] Warning: Failed to parse blyp.config.json:', error);\n return {};\n }\n}\n\nfunction parseExecutableConfigFile(configPath: string): Partial<BlypConfig> {\n try {\n const jiti = createJiti(process.cwd(), {\n interopDefault: true,\n moduleCache: false,\n fsCache: false,\n });\n return normalizeLoadedConfig(jiti(configPath), configPath);\n } catch (error) {\n console.error(`[Blyp] Warning: Failed to load ${configPath}:`, error);\n return {};\n }\n}\n\nfunction parseConfigFile(config: ConfigFileMatch): Partial<BlypConfig> {\n return config.type === 'json'\n ? parseJsonConfigFile(config.path)\n : parseExecutableConfigFile(config.path);\n}\n\nfunction isPrismaAdapter(\n value: DatabaseLoggerConfig['adapter']\n): value is PrismaDatabaseAdapterConfig {\n return !!value && typeof value === 'object' && value.type === 'prisma';\n}\n\nfunction isDrizzleAdapter(\n value: DatabaseLoggerConfig['adapter']\n): value is DrizzleDatabaseAdapterConfig {\n return !!value && typeof value === 'object' && value.type === 'drizzle';\n}\n\nfunction mergeDatabaseRetryConfig(\n base: DatabaseRetryConfig | undefined,\n override: DatabaseRetryConfig | undefined\n): Required<DatabaseRetryConfig> {\n return {\n ...DEFAULT_DATABASE_RETRY_CONFIG,\n ...base,\n ...override,\n };\n}\n\nfunction mergeDatabaseDeliveryConfig(\n base: DatabaseDeliveryConfig | undefined,\n override: DatabaseDeliveryConfig | undefined\n): ResolvedDatabaseLoggerConfig['delivery'] {\n return {\n ...DEFAULT_DATABASE_DELIVERY_CONFIG,\n ...base,\n ...override,\n retry: mergeDatabaseRetryConfig(base?.retry, override?.retry),\n };\n}\n\nfunction hasPrismaDelegate(adapter: PrismaDatabaseAdapterConfig): boolean {\n const model = adapter.model ?? 'blypLog';\n const client = adapter.client as Record<string, unknown> | null | undefined;\n const delegate = client?.[model] as Record<string, unknown> | undefined;\n\n return !!delegate && typeof delegate.create === 'function';\n}\n\nfunction hasDrizzleAdapterShape(adapter: DrizzleDatabaseAdapterConfig): boolean {\n const db = adapter.db as { insert?: unknown } | null | undefined;\n return !!db && typeof db.insert === 'function' && adapter.table !== undefined;\n}\n\nfunction resolveDatabaseLoggerConfig(\n config: DatabaseLoggerConfig | undefined,\n sourceType?: ConfigFileMatch['type']\n): ResolvedDatabaseLoggerConfig | undefined {\n if (!config) {\n return undefined;\n }\n\n const adapter = config.adapter;\n let ready = false;\n\n if (sourceType === 'json') {\n warnOnce(\n 'database-json-config',\n '[Blyp] Warning: Database logging requires an executable blyp config file. Database destination remains disabled until you move this config to blyp.config.ts/js.'\n );\n } else if (config.dialect !== 'postgres' && config.dialect !== 'mysql') {\n warnOnce(\n `database-dialect:${String(config.dialect)}`,\n `[Blyp] Warning: Unsupported database dialect \"${String(config.dialect)}\". Database logging is disabled.`\n );\n } else if (!adapter) {\n warnOnce(\n 'database-adapter-missing',\n '[Blyp] Warning: Database logging is enabled without an adapter. Database logging is disabled.'\n );\n } else if (isPrismaAdapter(adapter)) {\n ready = hasPrismaDelegate({\n ...adapter,\n model: adapter.model ?? 'blypLog',\n });\n\n if (!ready) {\n warnOnce(\n 'database-prisma-missing',\n `[Blyp] Warning: Prisma database adapter is missing the \"${adapter.model ?? 'blypLog'}\" delegate or its create method. Database logging is disabled.`\n );\n }\n } else if (isDrizzleAdapter(adapter)) {\n ready = hasDrizzleAdapterShape(adapter);\n\n if (!ready) {\n warnOnce(\n 'database-drizzle-missing',\n '[Blyp] Warning: Drizzle database adapter is missing a db.insert function or table reference. Database logging is disabled.'\n );\n }\n }\n\n const normalizedAdapter = isPrismaAdapter(adapter)\n ? {\n ...adapter,\n model: adapter.model ?? 'blypLog',\n }\n : adapter;\n\n return {\n dialect: config.dialect,\n adapter: normalizedAdapter,\n delivery: mergeDatabaseDeliveryConfig(undefined, config.delivery),\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeRotationConfig(\n base: LogRotationConfig | undefined,\n override: LogRotationConfig | undefined\n): Required<LogRotationConfig> {\n return {\n ...DEFAULT_ROTATION_CONFIG,\n ...base,\n ...override,\n };\n}\n\nfunction mergeFileConfig(\n base: LogFileConfig | undefined,\n override: LogFileConfig | undefined\n): Required<LogFileConfig> {\n return {\n ...DEFAULT_FILE_CONFIG,\n ...base,\n ...override,\n rotation: mergeRotationConfig(base?.rotation, override?.rotation),\n };\n}\n\nfunction mergeClientLoggingConfig(\n base: ClientLoggingConfig | undefined,\n override: ClientLoggingConfig | undefined\n): Required<ClientLoggingConfig> {\n return {\n ...DEFAULT_CLIENT_LOGGING_CONFIG,\n ...base,\n ...override,\n path: override?.path ?? base?.path ?? DEFAULT_CLIENT_LOGGING_CONFIG.path,\n };\n}\n\nfunction mergeDatabaseLoggerConfig(\n base: DatabaseLoggerConfig | undefined,\n override: DatabaseLoggerConfig | undefined,\n sourceType?: ConfigFileMatch['type']\n): ResolvedDatabaseLoggerConfig | undefined {\n if (!base && !override) {\n return undefined;\n }\n\n return resolveDatabaseLoggerConfig(\n {\n dialect: override?.dialect ?? base?.dialect,\n adapter: override?.adapter ?? base?.adapter,\n delivery: {\n ...(base?.delivery ?? {}),\n ...(override?.delivery ?? {}),\n retry: {\n ...(base?.delivery?.retry ?? {}),\n ...(override?.delivery?.retry ?? {}),\n },\n },\n },\n sourceType\n );\n}\n\nfunction mergePostHogConnectorConfig(\n base: PostHogConnectorConfig | undefined,\n override: PostHogConnectorConfig | undefined\n): ResolvedPostHogConnectorConfig {\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const projectKey = override?.projectKey ?? base?.projectKey;\n const baseErrorTracking = base?.enabled === true ? base?.errorTracking : undefined;\n const errorTrackingMode =\n override?.errorTracking?.mode ??\n baseErrorTracking?.mode ??\n 'auto';\n const errorTrackingEnabled =\n override?.errorTracking?.enabled ??\n baseErrorTracking?.enabled ??\n enabled;\n const errorTrackingReady =\n enabled &&\n errorTrackingEnabled &&\n typeof projectKey === 'string' &&\n projectKey.trim().length > 0;\n\n return {\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n projectKey,\n host: override?.host ?? base?.host ?? DEFAULT_POSTHOG_HOST,\n serviceName:\n override?.serviceName ??\n base?.serviceName ??\n resolveDefaultConnectorServiceName(),\n errorTracking: {\n enabled: errorTrackingEnabled,\n mode: errorTrackingMode,\n enableExceptionAutocapture:\n override?.errorTracking?.enableExceptionAutocapture ??\n baseErrorTracking?.enableExceptionAutocapture ??\n (errorTrackingMode === 'auto'),\n ready: errorTrackingReady,\n status: errorTrackingReady ? 'enabled' : 'missing',\n },\n };\n}\n\nfunction mergeBetterStackConnectorConfig(\n base: BetterStackConnectorConfig | undefined,\n override: BetterStackConnectorConfig | undefined\n): ResolvedBetterStackConnectorConfig {\n const sourceToken = override?.sourceToken ?? base?.sourceToken;\n const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const baseErrorTracking = base?.enabled === true ? base?.errorTracking : undefined;\n const errorTracking = mergeBetterStackErrorTrackingConfig(\n enabled,\n baseErrorTracking,\n override?.errorTracking\n );\n const ready =\n enabled &&\n hasNonEmptyString(sourceToken) &&\n isAbsoluteHttpUrl(ingestingHost);\n\n return {\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n sourceToken,\n ingestingHost,\n serviceName:\n override?.serviceName ??\n base?.serviceName ??\n resolveDefaultConnectorServiceName(),\n errorTracking,\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeBetterStackErrorTrackingConfig(\n connectorEnabled: boolean,\n base: BetterStackErrorTrackingConfig | undefined,\n override: BetterStackErrorTrackingConfig | undefined\n): ResolvedBetterStackErrorTrackingConfig {\n const dsn = override?.dsn ?? base?.dsn;\n const enabled = override?.enabled ?? base?.enabled ?? connectorEnabled;\n const ready = enabled && hasNonEmptyString(dsn);\n\n return {\n enabled,\n dsn,\n tracesSampleRate: override?.tracesSampleRate ?? base?.tracesSampleRate ?? 1.0,\n environment: override?.environment ?? base?.environment,\n release: override?.release ?? base?.release,\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeSentryConnectorConfig(\n base: SentryConnectorConfig | undefined,\n override: SentryConnectorConfig | undefined\n): ResolvedSentryConnectorConfig {\n const dsn = override?.dsn ?? base?.dsn;\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const ready = enabled && typeof dsn === 'string' && dsn.trim().length > 0;\n\n return {\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n dsn,\n environment: override?.environment ?? base?.environment,\n release: override?.release ?? base?.release,\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeOTLPConnectorConfig(\n base: OTLPConnectorConfig | undefined,\n override: OTLPConnectorConfig | undefined\n): ResolvedOTLPConnectorConfig {\n const endpoint = override?.endpoint ?? base?.endpoint;\n const enabled = override?.enabled ?? base?.enabled ?? false;\n const resolvedHeaders = {\n ...(base?.headers ?? {}),\n ...(override?.headers ?? {}),\n };\n const ready = enabled && isAbsoluteHttpUrl(endpoint);\n\n return {\n name: override?.name ?? base?.name ?? '',\n enabled,\n mode: override?.mode ?? base?.mode ?? 'auto',\n endpoint,\n headers: resolvedHeaders,\n auth: override?.auth ?? base?.auth,\n serviceName:\n override?.serviceName ??\n base?.serviceName ??\n resolveDefaultConnectorServiceName(),\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction mergeOTLPConnectorsConfig(\n base: OTLPConnectorConfig[] | undefined,\n override: OTLPConnectorConfig[] | undefined\n): ResolvedOTLPConnectorConfig[] {\n const source = override ?? base ?? [];\n const deduped = new Map<string, ResolvedOTLPConnectorConfig>();\n\n for (const connector of source) {\n if (!connector || typeof connector.name !== 'string' || connector.name.length === 0) {\n continue;\n }\n\n if (deduped.has(connector.name)) {\n warnOnce(\n `otlp-duplicate:${connector.name}`,\n `[Blyp] Warning: Duplicate OTLP connector name \"${connector.name}\" found. Using the last definition.`\n );\n }\n\n deduped.set(connector.name, mergeOTLPConnectorConfig(undefined, connector));\n }\n\n return Array.from(deduped.values());\n}\n\nfunction mergeConnectorsConfig(\n base: BlypConnectorsConfig | undefined,\n override: BlypConnectorsConfig | undefined\n): ResolvedBlypConnectorsConfig {\n return {\n betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),\n posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),\n sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),\n otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp),\n };\n}\n\nexport function mergeBlypConfig(\n base: BlypConfig,\n override: Partial<BlypConfig> = {},\n options: { configFileType?: ConfigFileMatch['type'] } = {}\n): ResolvedBlypConfig {\n return {\n ...base,\n ...override,\n destination: override.destination ?? base.destination ?? 'file',\n file: mergeFileConfig(base.file, override.file),\n database: mergeDatabaseLoggerConfig(base.database, override.database, options.configFileType),\n clientLogging: mergeClientLoggingConfig(base.clientLogging, override.clientLogging),\n connectors: mergeConnectorsConfig(base.connectors, override.connectors),\n };\n}\n\nexport function loadConfig(): ResolvedBlypConfig {\n if (cachedConfig !== null) {\n return cachedConfig;\n }\n\n bootstrapProjectFiles();\n const configFile = findConfigFile();\n\n if (configFile) {\n const userConfig = parseConfigFile(configFile);\n cachedConfig = mergeBlypConfig(DEFAULT_CONFIG, userConfig, {\n configFileType: configFile.type,\n });\n } else {\n cachedConfig = mergeBlypConfig(DEFAULT_CONFIG);\n }\n\n return cachedConfig;\n}\n\nexport function resolveConfig(overrides: Partial<BlypConfig> = {}): ResolvedBlypConfig {\n return mergeBlypConfig(loadConfig(), overrides);\n}\n\nexport function getConfig(): ResolvedBlypConfig {\n return loadConfig();\n}\n\nexport function resetConfigCache(): void {\n cachedConfig = null;\n warnedKeys.clear();\n}\n","import type { LogRecord } from './file-logger';\nimport type { StructuredLogPayload } from './structured-log';\nimport {\n normalizeError,\n normalizeLogValue,\n serializeLogMessage,\n} from '../shared/log-value';\nimport type { LogMethodName } from '../types/core/log-record';\n\nexport type { LogMethodName } from '../types/core/log-record';\n\nconst RECORD_LEVELS: Record<LogMethodName, string> = {\n success: 'success',\n critical: 'critical',\n warning: 'warning',\n info: 'info',\n debug: 'debug',\n error: 'error',\n warn: 'warning',\n table: 'table',\n};\n\nfunction normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/');\n}\n\nfunction isInternalLoggerFrame(filePath: string): boolean {\n const normalizedPath = normalizePath(filePath);\n\n return (\n normalizedPath.startsWith('node:') ||\n normalizedPath.includes('/node_modules/pino') ||\n normalizedPath.includes('/node_modules/pino-pretty') ||\n normalizedPath.includes('/node_modules/@blyp/core/') ||\n normalizedPath.includes('/blyp/src/core/') ||\n normalizedPath.includes('/blyp/src/frameworks/') ||\n normalizedPath.includes('/blyp/src/posthog/') ||\n normalizedPath.includes('/blyp/dist/')\n );\n}\n\nfunction formatCallerPath(filePath: string): string {\n const normalizedPath = normalizePath(filePath);\n const normalizedCwd = normalizePath(process.cwd());\n return normalizedPath.startsWith(`${normalizedCwd}/`)\n ? normalizedPath.slice(normalizedCwd.length + 1)\n : normalizedPath;\n}\n\nexport function getCallerLocation(): { file: string | null; line: number | null } {\n try {\n const stack = new Error().stack;\n if (!stack) {\n return { file: null, line: null };\n }\n\n const lines = stack.split('\\n');\n let fallback: { file: string; line: number | null } | null = null;\n\n for (let index = 2; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n\n const match = line.match(/\\((.*):(\\d+):\\d+\\)/) || line.match(/at\\s+(.*):(\\d+):(\\d+)/);\n if (!match) {\n continue;\n }\n\n const fileName = match[1] || '';\n const lineNumber = parseInt(match[2] || '0', 10) || null;\n\n if (fileName && !fileName.includes('node_modules') && !isInternalLoggerFrame(fileName)) {\n const formattedPath = formatCallerPath(fileName);\n const normalizedFormattedPath = normalizePath(formattedPath);\n\n if (!normalizedFormattedPath.startsWith('dist/')) {\n return { file: formattedPath, line: lineNumber };\n }\n\n fallback ??= { file: formattedPath, line: lineNumber };\n }\n }\n\n if (fallback) {\n return fallback;\n }\n } catch {\n return { file: null, line: null };\n }\n\n return { file: null, line: null };\n}\n\nexport const serializeMessage = serializeLogMessage;\n\nexport function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, '');\n}\n\nexport function buildRecord(\n level: LogMethodName,\n message: unknown,\n args: unknown[],\n bindings: Record<string, unknown>\n): LogRecord {\n const { file, line } = getCallerLocation();\n const serializedMessage = serializeMessage(message);\n const record: LogRecord = {\n timestamp: new Date().toISOString(),\n level: RECORD_LEVELS[level],\n message: stripAnsi(serializedMessage),\n };\n\n if (message instanceof Error) {\n record.error = normalizeError(message);\n }\n\n if (file) {\n record.caller = line !== null ? `${file}:${line}` : file;\n }\n\n if (args.length === 1) {\n record.data = normalizeLogValue(args[0]);\n } else if (args.length > 1) {\n record.data = normalizeLogValue(args);\n }\n\n if (Object.keys(bindings).length > 0) {\n record.bindings = normalizeLogValue(bindings) as Record<string, unknown>;\n }\n\n return record;\n}\n\nexport function buildStructuredRecord(\n level: LogMethodName,\n message: string,\n payload: StructuredLogPayload,\n bindings: Record<string, unknown>\n): LogRecord {\n const { file, line } = getCallerLocation();\n const normalizedPayload = normalizeLogValue(payload) as StructuredLogPayload;\n const record: LogRecord = {\n message: stripAnsi(message),\n ...normalizedPayload,\n };\n\n if (file) {\n record.caller = line !== null ? `${file}:${line}` : file;\n }\n\n if (Object.keys(bindings).length > 0) {\n record.bindings = normalizeLogValue(bindings) as Record<string, unknown>;\n }\n\n record.level =\n typeof normalizedPayload.level === 'string' && normalizedPayload.level.length > 0\n ? normalizedPayload.level\n : RECORD_LEVELS[level];\n record.timestamp =\n typeof normalizedPayload.timestamp === 'string' && normalizedPayload.timestamp.length > 0\n ? normalizedPayload.timestamp\n : new Date().toISOString();\n\n return record;\n}\n\nexport function resolveStructuredWriteLevel(level: StructuredLogPayload['level']): LogMethodName {\n switch (level) {\n case 'debug':\n return 'debug';\n case 'warning':\n return 'warning';\n case 'warn':\n return 'warn';\n case 'error':\n return 'error';\n case 'success':\n return 'success';\n case 'critical':\n return 'critical';\n case 'table':\n return 'table';\n case 'info':\n default:\n return 'info';\n }\n}\n","import type {\n CreateStructuredLogOptions,\n StructuredLog,\n StructuredLogError,\n StructuredLogEvent,\n StructuredLogEmitOptions,\n StructuredLogLevel,\n StructuredLogPayload,\n} from '../types/core/structured-log';\n\nexport type {\n CreateStructuredLogOptions,\n StructuredLog,\n StructuredLogError,\n StructuredLogEvent,\n StructuredLogEmitOptions,\n StructuredLogLevel,\n StructuredLogPayload,\n} from '../types/core/structured-log';\n\nfunction serializeMessage(message: unknown): string {\n if (typeof message === 'string') {\n return message;\n }\n\n if (message !== null && typeof message === 'object') {\n try {\n return JSON.stringify(\n message,\n (_key, value) => {\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (value === undefined) {\n return '[undefined]';\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n },\n 2\n );\n } catch {\n return '[Object]';\n }\n }\n\n return String(message);\n}\n\nfunction normalizeEventData(message: unknown, args: unknown[]): unknown {\n if (typeof message === 'string') {\n if (args.length === 0) {\n return undefined;\n }\n\n return args.length === 1 ? args[0] : args;\n }\n\n const values = [message, ...args];\n return values.length === 1 ? values[0] : values;\n}\n\nfunction normalizeDetails(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction normalizeError(error: unknown, fallbackStatus?: number): StructuredLogError | undefined {\n if (error === undefined || error === null) {\n return fallbackStatus === undefined || fallbackStatus < 400\n ? undefined\n : {\n message: `HTTP ${fallbackStatus}`,\n code: fallbackStatus,\n type: 'HttpError',\n };\n }\n\n if (error instanceof Error) {\n const errorLike = error as Error & {\n code?: string | number;\n why?: string;\n fix?: string;\n link?: string;\n details?: unknown;\n cause?: unknown;\n type?: string;\n };\n\n return {\n message: error.message,\n code: errorLike.code,\n type: errorLike.type ?? error.name ?? error.constructor?.name,\n stack: error.stack,\n why: errorLike.why,\n fix: errorLike.fix,\n link: errorLike.link,\n details: normalizeDetails(errorLike.details),\n cause: errorLike.cause,\n };\n }\n\n if (typeof error === 'object') {\n const record = error as Record<string, unknown>;\n const statusCode =\n typeof record.statusCode === 'number'\n ? record.statusCode\n : typeof record.status === 'number'\n ? record.status\n : fallbackStatus;\n\n return {\n message:\n typeof record.message === 'string'\n ? record.message\n : `HTTP ${statusCode ?? 500}`,\n code:\n typeof record.code === 'string' || typeof record.code === 'number'\n ? record.code\n : statusCode,\n type:\n typeof record.type === 'string'\n ? record.type\n : typeof record.name === 'string'\n ? record.name\n : 'Error',\n stack: typeof record.stack === 'string' ? record.stack : undefined,\n why: typeof record.why === 'string' ? record.why : undefined,\n fix: typeof record.fix === 'string' ? record.fix : undefined,\n link: typeof record.link === 'string' ? record.link : undefined,\n details: normalizeDetails(record.details),\n cause: record.cause,\n };\n }\n\n return {\n message: String(error),\n code: fallbackStatus,\n type: typeof error,\n };\n}\n\nfunction resolveEmitStatus(options: StructuredLogEmitOptions): number | undefined {\n if (options.response && typeof options.response.status === 'number') {\n return options.response.status;\n }\n\n if (typeof options.status === 'number') {\n return options.status;\n }\n\n if (\n options.error &&\n typeof options.error === 'object' &&\n options.error !== null &&\n typeof (options.error as { statusCode?: unknown }).statusCode === 'number'\n ) {\n return (options.error as { statusCode: number }).statusCode;\n }\n\n if (\n options.error &&\n typeof options.error === 'object' &&\n options.error !== null &&\n typeof (options.error as { status?: unknown }).status === 'number'\n ) {\n return (options.error as { status: number }).status;\n }\n\n return options.error ? 500 : undefined;\n}\n\nexport function createStructuredLog(\n groupId: string,\n options: CreateStructuredLogOptions\n): StructuredLog<Record<string, unknown>> {\n const startedAt = performance.now();\n const fields = { ...(options.initialFields ?? {}) };\n const events: StructuredLogEvent[] = [];\n let emittedPayload: StructuredLogPayload<Record<string, unknown>> | undefined;\n\n options.onCreate?.();\n\n const appendEvent = (\n level: StructuredLogLevel,\n message: unknown,\n args: unknown[]\n ): StructuredLog<Record<string, unknown>> => {\n events.push({\n level,\n message: serializeMessage(message),\n timestamp: new Date().toISOString(),\n ...(normalizeEventData(message, args) === undefined\n ? {}\n : { data: normalizeEventData(message, args) }),\n });\n\n return structuredLog;\n };\n\n const structuredLog: StructuredLog<Record<string, unknown>> = {\n set<TNextFields extends Record<string, unknown>>(extraFields: TNextFields) {\n Object.assign(fields, extraFields);\n return structuredLog as StructuredLog<Record<string, unknown> & TNextFields>;\n },\n\n debug(message, ...args) {\n return appendEvent('debug', message, args);\n },\n\n info(message, ...args) {\n return appendEvent('info', message, args);\n },\n\n warn(message, ...args) {\n return appendEvent('warn', message, args);\n },\n\n warning(message, ...args) {\n return appendEvent('warning', message, args);\n },\n\n error(message, ...args) {\n return appendEvent('error', message, args);\n },\n\n success(message, ...args) {\n return appendEvent('success', message, args);\n },\n\n critical(message, ...args) {\n return appendEvent('critical', message, args);\n },\n\n table(message, data) {\n return appendEvent('table', message, data === undefined ? [] : [data]);\n },\n\n emit(emitOptions = {}) {\n if (emittedPayload) {\n return emittedPayload;\n }\n\n const defaultFields = options.resolveDefaultFields?.() ?? {};\n const status = resolveEmitStatus(emitOptions);\n const error = normalizeError(emitOptions.error, status);\n const level = emitOptions.level ?? (error ? 'error' : 'info');\n const payload: StructuredLogPayload<Record<string, unknown>> = {\n ...defaultFields,\n ...fields,\n groupId,\n timestamp: new Date().toISOString(),\n level,\n duration: Math.round(performance.now() - startedAt),\n ...(typeof status === 'number' ? { status } : {}),\n ...(events.length > 0 ? { events: [...events] } : {}),\n ...(error ? { error } : {}),\n };\n\n options.write(payload, emitOptions.message ?? 'structured_log');\n emittedPayload = payload;\n options.onEmit?.(payload);\n return payload;\n },\n };\n\n return structuredLog;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { gzipSync } from 'fflate';\nimport type { BlypConfig } from './config';\nimport type {\n FileLoggerDependencies,\n LogRecord,\n ResolvedFileLoggerConfig,\n StreamState,\n} from '../types/core/file-logger';\n\nexport type { LogRecord } from '../types/core/file-logger';\n\nfunction gzipBuffer(buf: Buffer): Buffer {\n return Buffer.from(gzipSync(buf));\n}\n\nfunction warnWithConsole(message: string, error?: unknown): void {\n console.warn(`[Blyp] Warning: ${message}`, error);\n}\n\nfunction ensureDirectory(dirPath: string): void {\n fs.mkdirSync(dirPath, { recursive: true });\n}\n\nfunction getFileSize(filePath: string): number {\n try {\n return fs.statSync(filePath).size;\n } catch {\n return 0;\n }\n}\n\nfunction formatArchiveTimestamp(timestamp: Date): string {\n const year = timestamp.getUTCFullYear();\n const month = String(timestamp.getUTCMonth() + 1).padStart(2, '0');\n const day = String(timestamp.getUTCDate()).padStart(2, '0');\n const hours = String(timestamp.getUTCHours()).padStart(2, '0');\n const minutes = String(timestamp.getUTCMinutes()).padStart(2, '0');\n const seconds = String(timestamp.getUTCSeconds()).padStart(2, '0');\n return `${year}${month}${day}T${hours}${minutes}${seconds}Z`;\n}\n\nfunction getUniqueArchivePath(basePath: string, extension: string): string {\n let candidate = `${basePath}${extension}`;\n let suffix = 1;\n\n while (fs.existsSync(candidate)) {\n candidate = `${basePath}-${suffix}${extension}`;\n suffix += 1;\n }\n\n return candidate;\n}\n\nfunction pruneArchives(\n archiveDir: string,\n archivePrefix: string,\n maxArchives: number,\n warn: (message: string, error?: unknown) => void\n): void {\n const prefix = `${archivePrefix}.`;\n\n try {\n const archivePaths = fs\n .readdirSync(archiveDir)\n .filter((name) =>\n name.startsWith(prefix) &&\n (name.endsWith('.ndjson') || name.endsWith('.ndjson.gz'))\n )\n .map((name) => path.join(archiveDir, name))\n .sort((left, right) => {\n return fs.statSync(left).mtimeMs - fs.statSync(right).mtimeMs;\n });\n\n const deleteCount = Math.max(archivePaths.length - maxArchives, 0);\n\n for (let index = 0; index < deleteCount; index += 1) {\n fs.rmSync(archivePaths[index]!);\n }\n } catch (error) {\n warn(`Failed to prune archives for ${archivePrefix}`, error);\n }\n}\n\nfunction createSafeReplacer() {\n const seen = new WeakSet<object>();\n\n return (_key: string, value: unknown) => {\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n if (value === undefined) {\n return '[undefined]';\n }\n\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n if (value !== null && typeof value === 'object') {\n if (seen.has(value)) {\n return '[Circular]';\n }\n\n seen.add(value);\n }\n\n return value;\n };\n}\n\nexport function serializeLogRecord(record: LogRecord): string {\n return JSON.stringify(record, createSafeReplacer());\n}\n\nfunction resolveFileLoggerConfig(config: BlypConfig): ResolvedFileLoggerConfig {\n const fileConfig = config.file;\n const dir = fileConfig?.dir || config.logDir || path.join(process.cwd(), 'logs');\n const archiveDir = fileConfig?.archiveDir || path.join(dir, 'archive');\n const rotation = fileConfig?.rotation;\n\n return {\n enabled: fileConfig?.enabled ?? true,\n dir,\n archiveDir,\n rotationEnabled: rotation?.enabled ?? true,\n maxSizeBytes: rotation?.maxSizeBytes ?? 10 * 1024 * 1024,\n maxArchives: rotation?.maxArchives ?? 5,\n compress: rotation?.compress ?? true,\n };\n}\n\nexport class RotatingFileLogger {\n private readonly config: ResolvedFileLoggerConfig;\n private readonly gzip: (input: Buffer) => Buffer;\n private readonly warn: (message: string, error?: unknown) => void;\n private readonly combined: StreamState;\n private readonly error: StreamState;\n\n constructor(config: BlypConfig, dependencies: FileLoggerDependencies = {}) {\n this.config = resolveFileLoggerConfig(config);\n this.gzip = dependencies.gzip ?? gzipBuffer;\n this.warn = dependencies.warn ?? warnWithConsole;\n this.combined = {\n activePath: path.join(this.config.dir, 'log.ndjson'),\n archivePrefix: 'log',\n bytes: 0,\n queue: [],\n processing: false,\n };\n this.error = {\n activePath: path.join(this.config.dir, 'log.error.ndjson'),\n archivePrefix: 'log.error',\n bytes: 0,\n queue: [],\n processing: false,\n };\n\n if (!this.config.enabled) {\n return;\n }\n\n ensureDirectory(this.config.dir);\n ensureDirectory(this.config.archiveDir);\n this.seedStream(this.combined);\n this.seedStream(this.error);\n }\n\n write(record: LogRecord): void {\n if (!this.config.enabled) {\n return;\n }\n\n const line = `${serializeLogRecord(record)}\\n`;\n this.enqueue(this.combined, line);\n\n if (record.level === 'error' || record.level === 'critical') {\n this.enqueue(this.error, line);\n }\n }\n\n private enqueue(stream: StreamState, line: string): void {\n stream.queue.push(line);\n this.processQueue(stream);\n }\n\n private processQueue(stream: StreamState): void {\n if (stream.processing) {\n return;\n }\n\n stream.processing = true;\n\n try {\n while (stream.queue.length > 0) {\n const queuedLine = stream.queue.shift();\n if (queuedLine === undefined) {\n continue;\n }\n\n try {\n this.append(stream, queuedLine);\n } catch (error) {\n this.warn(`Failed writing log line for ${stream.archivePrefix}`, error);\n }\n }\n } finally {\n stream.processing = false;\n }\n }\n\n private seedStream(stream: StreamState): void {\n stream.bytes = getFileSize(stream.activePath);\n\n if (this.config.rotationEnabled && stream.bytes > this.config.maxSizeBytes && stream.bytes > 0) {\n this.rotate(stream);\n fs.closeSync(fs.openSync(stream.activePath, 'a'));\n stream.bytes = 0;\n }\n }\n\n private append(stream: StreamState, line: string): void {\n ensureDirectory(this.config.dir);\n const lineBytes = Buffer.byteLength(line, 'utf8');\n\n if (\n this.config.rotationEnabled &&\n stream.bytes > 0 &&\n stream.bytes + lineBytes > this.config.maxSizeBytes\n ) {\n this.rotate(stream);\n }\n\n fs.appendFileSync(stream.activePath, line, 'utf8');\n stream.bytes += lineBytes;\n }\n\n private rotate(stream: StreamState): void {\n ensureDirectory(this.config.archiveDir);\n if (!fs.existsSync(stream.activePath) || stream.bytes === 0) {\n stream.bytes = 0;\n return;\n }\n\n const archiveTimestamp = formatArchiveTimestamp(new Date());\n const archiveBasePath = path.join(\n this.config.archiveDir,\n `${stream.archivePrefix}.${archiveTimestamp}`\n );\n const archivePath = getUniqueArchivePath(archiveBasePath, '.ndjson');\n\n fs.renameSync(stream.activePath, archivePath);\n\n if (this.config.compress) {\n try {\n const compressedPath = `${archivePath}.gz`;\n const gzipped = this.gzip(fs.readFileSync(archivePath));\n fs.writeFileSync(compressedPath, gzipped);\n fs.rmSync(archivePath);\n } catch (error) {\n this.warn(`Failed to gzip archive ${archivePath}`, error);\n }\n }\n\n stream.bytes = 0;\n pruneArchives(this.config.archiveDir, stream.archivePrefix, this.config.maxArchives, this.warn);\n }\n}\n\nexport function createFileLogger(config: BlypConfig): RotatingFileLogger {\n return new RotatingFileLogger(config);\n}\n","import type { BlypConfig } from '../core/config';\nimport type { LogRecord } from '../core/file-logger';\nimport { isPlainObject } from '../shared/validation';\n\nexport function isBlypConfig(config: unknown): config is BlypConfig {\n return isPlainObject(config) && (\n 'connectors' in config ||\n 'pretty' in config ||\n 'level' in config\n );\n}\n\nexport function getPrimaryPayload(record: LogRecord): Record<string, unknown> {\n return isPlainObject(record.data) ? record.data : record;\n}\n\nexport function getField<T extends string | number>(\n record: LogRecord,\n key: string\n): T | undefined {\n if (key in record) {\n const direct = record[key];\n if (typeof direct === 'string' || typeof direct === 'number') {\n return direct as T;\n }\n }\n\n const payload = getPrimaryPayload(record);\n const nested = payload[key];\n if (typeof nested === 'string' || typeof nested === 'number') {\n return nested as T;\n }\n\n return undefined;\n}\n\nexport function getClientPageField(\n record: LogRecord,\n key: 'pathname' | 'url'\n): string | undefined {\n const payload = getPrimaryPayload(record);\n const page = isPlainObject(payload.page) ? payload.page : undefined;\n const value = page?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function getClientSessionField(\n record: LogRecord,\n key: 'sessionId' | 'pageId'\n): string | undefined {\n const payload = getPrimaryPayload(record);\n const session = isPlainObject(payload.session) ? payload.session : undefined;\n const value = session?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function getRecordType(record: LogRecord): string | undefined {\n return getField<string>(record, 'type');\n}\n","import * as Sentry from '@sentry/node';\nimport { Logtail } from '@logtail/node';\nimport type {\n BetterStackConnectorConfig,\n BlypConfig,\n ResolvedBetterStackConnectorConfig,\n} from '../../core/config';\nimport type { LogRecord } from '../../core/file-logger';\nimport { serializeLogRecord } from '../../core/file-logger';\nimport { createErrorOnceLogger } from '../../shared/once';\nimport { hasNonEmptyString, isAbsoluteHttpUrl, isPlainObject } from '../../shared/validation';\nimport type {\n BetterStackClientLike,\n BetterStackExceptionCaptureOptions,\n BetterStackLogSource,\n BetterStackSender,\n BetterStackTestHooks,\n} from '../../types/connectors/betterstack';\nimport type { SentryModuleLike } from '../../types/connectors/sentry';\nimport {\n getClientPageField,\n getClientSessionField,\n getField,\n getPrimaryPayload,\n getRecordType,\n isBlypConfig,\n} from '../shared';\n\nconst PREVIOUSLY_CAPTURED_ERROR_KEY = '__betterstack_previously_captured_error';\nconst warnedKeys = new Set<string>();\nlet testHooks: BetterStackTestHooks = {};\nconst warnOnce = createErrorOnceLogger(warnedKeys);\n\nfunction getSentryModule(): SentryModuleLike {\n return testHooks.module ?? (Sentry as unknown as SentryModuleLike);\n}\n\nfunction resolveConnectorConfig(\n config: BlypConfig | ResolvedBetterStackConnectorConfig | BetterStackConnectorConfig\n): ResolvedBetterStackConnectorConfig {\n const connector = isBlypConfig(config)\n ? config.connectors?.betterstack\n : config;\n const enabled = connector?.enabled ?? false;\n const sourceToken = connector?.sourceToken;\n const ingestingHost = connector?.ingestingHost;\n const errorTrackingEnabled = connector?.errorTracking?.enabled ?? enabled;\n const errorTrackingDsn = connector?.errorTracking?.dsn;\n const errorTrackingReady =\n enabled &&\n errorTrackingEnabled &&\n hasNonEmptyString(errorTrackingDsn);\n const ready =\n enabled &&\n hasNonEmptyString(sourceToken) &&\n isAbsoluteHttpUrl(ingestingHost);\n\n return {\n enabled,\n mode: connector?.mode ?? 'auto',\n sourceToken,\n ingestingHost,\n serviceName: connector?.serviceName ?? 'blyp-app',\n errorTracking: {\n enabled: errorTrackingEnabled,\n dsn: errorTrackingDsn,\n tracesSampleRate: connector?.errorTracking?.tracesSampleRate ?? 1.0,\n environment: connector?.errorTracking?.environment,\n release: connector?.errorTracking?.release,\n ready: errorTrackingReady,\n status: errorTrackingReady ? 'enabled' : 'missing',\n },\n ready,\n status: ready ? 'enabled' : 'missing',\n };\n}\n\nfunction resolveBetterStackLevel(level: string): string {\n switch (level) {\n case 'debug':\n return 'debug';\n case 'warning':\n case 'warn':\n return 'warn';\n case 'error':\n return 'error';\n case 'critical':\n return 'fatal';\n case 'success':\n case 'table':\n case 'info':\n default:\n return 'info';\n }\n}\n\nfunction parseCaller(caller: unknown): { file?: string; line?: number } {\n if (typeof caller !== 'string' || caller.trim().length === 0) {\n return {};\n }\n\n const match = caller.match(/^(.*):(\\d+)$/);\n if (!match) {\n return {};\n }\n\n const file = match[1]?.trim();\n const line = Number.parseInt(match[2] ?? '', 10);\n\n return {\n ...(file ? { file } : {}),\n ...(Number.isFinite(line) ? { line } : {}),\n };\n}\n\nfunction buildContext(\n record: LogRecord,\n connector: ResolvedBetterStackConnectorConfig,\n source: BetterStackLogSource\n): Record<string, unknown> {\n const recordType = getRecordType(record);\n const groupId = getField<string>(record, 'groupId');\n const method = getField<string>(record, 'method');\n const path = getField<string>(record, 'path');\n const status = getField<number>(record, 'status');\n const duration = getField<number>(record, 'duration');\n const pagePath = getClientPageField(record, 'pathname');\n const pageUrl = getClientPageField(record, 'url');\n const sessionId = getClientSessionField(record, 'sessionId');\n const pageId = getClientSessionField(record, 'pageId');\n const runtime = parseCaller(record.caller);\n\n return {\n service: connector.serviceName,\n context: {\n blyp: {\n level: record.level,\n source,\n ...(recordType ? { type: recordType } : {}),\n ...(groupId ? { group_id: groupId } : {}),\n ...(record.caller ? { caller: record.caller } : {}),\n ...(duration !== undefined ? { duration_ms: duration } : {}),\n ...(record.bindings ? { bindings: record.bindings } : {}),\n payload: serializeLogRecord(record),\n },\n ...(method || path || status !== undefined\n ? {\n http: {\n ...(method ? { method } : {}),\n ...(path ? { path } : {}),\n ...(status !== undefined ? { status_code: status } : {}),\n },\n }\n : {}),\n ...(pagePath || pageUrl || sessionId || pageId\n ? {\n client: {\n ...(pagePath ? { page_path: pagePath } : {}),\n ...(pageUrl ? { page_url: pageUrl } : {}),\n ...(sessionId ? { session_id: sessionId } : {}),\n ...(pageId ? { page_id: pageId } : {}),\n },\n }\n : {}),\n ...(Object.keys(runtime).length > 0 ? { runtime } : {}),\n ...(record.data !== undefined ? { data: record.data } : {}),\n ...(record.error !== undefined ? { error: record.error } : {}),\n },\n };\n}\n\nfunction toExceptionCandidate(value: unknown): unknown {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const message = typeof value.message === 'string' ? value.message : undefined;\n const name = typeof value.name === 'string' ? value.name : undefined;\n const stack = typeof value.stack === 'string' ? value.stack : undefined;\n\n if (!message && !name && !stack) {\n return undefined;\n }\n\n const error = new Error(message ?? name ?? 'Unknown error');\n error.name = name ?? 'Error';\n if (stack) {\n error.stack = stack;\n }\n\n for (const [key, entry] of Object.entries(value)) {\n if (key === 'message' || key === 'name' || key === 'stack') {\n continue;\n }\n\n ((error as unknown) as Record<string, unknown>)[key] = entry;\n }\n\n return error;\n}\n\nfunction normalizeScopeLevel(level: string): Sentry.SeverityLevel {\n switch (level) {\n case 'debug':\n return 'debug';\n case 'warning':\n case 'warn':\n return 'warning';\n case 'critical':\n return 'fatal';\n case 'error':\n return 'error';\n case 'success':\n case 'table':\n case 'info':\n default:\n return 'info';\n }\n}\n\nfunction normalizeExceptionInput(input: unknown): unknown {\n if (input instanceof Error) {\n return input;\n }\n\n const direct = toExceptionCandidate(input);\n if (direct) {\n return direct;\n }\n\n if (typeof input === 'string') {\n return new Error(input);\n }\n\n return new Error('Unknown Better Stack exception');\n}\n\nfunction isPreviouslyCapturedError(value: unknown): boolean {\n return isPlainObject(value) && value[PREVIOUSLY_CAPTURED_ERROR_KEY] === true;\n}\n\nfunction markCapturedError(value: unknown): void {\n if (!isPlainObject(value) || isPreviouslyCapturedError(value)) {\n return;\n }\n\n try {\n Object.defineProperty(value, PREVIOUSLY_CAPTURED_ERROR_KEY, {\n value: true,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n } catch {\n try {\n value[PREVIOUSLY_CAPTURED_ERROR_KEY] = true;\n } catch {}\n }\n}\n\nfunction createDefaultClient(\n connector: ResolvedBetterStackConnectorConfig\n): BetterStackClientLike {\n return new Logtail(connector.sourceToken ?? '', {\n endpoint: connector.ingestingHost,\n captureStackContext: false,\n }) as BetterStackClientLike;\n}\n\nfunction getClientOptions(client: ReturnType<SentryModuleLike['getClient']>): {\n dsn?: unknown;\n environment?: unknown;\n release?: unknown;\n} {\n return client?.getOptions?.() ?? {};\n}\n\nfunction registerShutdownHooks(key: string, flush: () => Promise<void>): void {\n const handlers: Array<NodeJS.Signals | 'beforeExit'> = ['beforeExit', 'SIGINT', 'SIGTERM'];\n\n for (const event of handlers) {\n process.once(event, () => {\n void flush().catch((error) => {\n warnOnce(\n `${key}:shutdown`,\n '[Blyp] Failed to flush Better Stack logs during shutdown.',\n error\n );\n });\n });\n }\n}\n\nexport function createBetterStackSender(\n config: BlypConfig | ResolvedBetterStackConnectorConfig | BetterStackConnectorConfig\n): BetterStackSender {\n const connector = resolveConnectorConfig(config);\n const key = `${connector.serviceName}:${connector.ingestingHost ?? 'missing'}:${connector.mode}`;\n const sentryModule = getSentryModule();\n const client = connector.ready\n ? (testHooks.createClient?.(connector) ?? createDefaultClient(connector))\n : undefined;\n let sentryClient = connector.errorTracking.enabled\n ? sentryModule?.getClient?.()\n : undefined;\n\n if (sentryClient) {\n const options = getClientOptions(sentryClient);\n if (\n (hasNonEmptyString(connector.errorTracking.dsn) && connector.errorTracking.dsn !== options.dsn) ||\n (hasNonEmptyString(connector.errorTracking.environment) && connector.errorTracking.environment !== options.environment) ||\n (hasNonEmptyString(connector.errorTracking.release) && connector.errorTracking.release !== options.release)\n ) {\n warnOnce(\n `betterstack-error-mismatch:${key}`,\n '[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client for Better Stack error tracking.'\n );\n }\n }\n\n if (\n !sentryClient &&\n connector.errorTracking.enabled &&\n hasNonEmptyString(connector.errorTracking.dsn) &&\n sentryModule\n ) {\n try {\n sentryModule.init({\n dsn: connector.errorTracking.dsn,\n tracesSampleRate: connector.errorTracking.tracesSampleRate,\n environment: connector.errorTracking.environment,\n release: connector.errorTracking.release,\n });\n sentryClient = sentryModule.getClient();\n } catch (error) {\n warnOnce(\n `betterstack-error-init:${key}`,\n '[Blyp] Failed to initialize Better Stack error tracking.',\n error\n );\n }\n }\n\n const errorTrackingReady = connector.errorTracking.enabled && sentryClient !== undefined;\n\n if (client || errorTrackingReady) {\n registerShutdownHooks(key, async () => {\n if (client) {\n await client.flush();\n }\n if (errorTrackingReady) {\n await sentryModule.flush(2000);\n }\n });\n }\n\n const emitUnavailableWarning = (): void => {\n warnOnce(\n `betterstack-unavailable:${key}`,\n '[Blyp] Better Stack connector is not configured or not ready. Skipping Better Stack delivery.'\n );\n };\n\n const emitExceptionUnavailableWarning = (): void => {\n warnOnce(\n `betterstack-exception-unavailable:${key}`,\n '[Blyp] Better Stack error tracking is not configured. Skipping Better Stack exception capture.'\n );\n };\n\n return {\n enabled: connector.enabled,\n ready: connector.ready,\n mode: connector.mode,\n serviceName: connector.serviceName,\n ingestingHost: connector.ingestingHost,\n status: connector.status,\n errorTracking: {\n enabled: connector.errorTracking.enabled,\n ready: errorTrackingReady,\n status: errorTrackingReady ? 'enabled' : 'missing',\n dsn: connector.errorTracking.dsn,\n tracesSampleRate: connector.errorTracking.tracesSampleRate,\n environment: connector.errorTracking.environment,\n release: connector.errorTracking.release,\n },\n shouldAutoForwardServerLogs() {\n return connector.ready && connector.mode === 'auto';\n },\n shouldAutoCaptureExceptions() {\n return errorTrackingReady;\n },\n send(record, options = {}) {\n if (!connector.ready || !client) {\n if (options.warnIfUnavailable) {\n emitUnavailableWarning();\n }\n return;\n }\n\n const source = options.source ?? 'server';\n void client.log(\n record.message,\n resolveBetterStackLevel(record.level),\n buildContext(record, connector, source)\n ).catch((error) => {\n warnOnce(\n `betterstack-send:${key}`,\n '[Blyp] Failed to deliver log to Better Stack.',\n error\n );\n });\n },\n captureException(error, options: BetterStackExceptionCaptureOptions = {}) {\n if (!errorTrackingReady || !sentryModule) {\n if (options.warnIfUnavailable) {\n emitExceptionUnavailableWarning();\n }\n return;\n }\n\n if (isPreviouslyCapturedError(error)) {\n return;\n }\n\n try {\n const exception = normalizeExceptionInput(error);\n sentryModule.withScope((scope) => {\n scope.setLevel(\n normalizeScopeLevel(\n options.source === 'client' ? 'error' : 'error'\n )\n );\n scope.setContext('blyp', {\n source: options.source ?? 'server',\n ...(options.context ? { context: options.context } : {}),\n });\n sentryModule.captureException(exception);\n });\n markCapturedError(error);\n markCapturedError(exception);\n } catch (captureError) {\n warnOnce(\n `betterstack-manual-capture:${key}`,\n '[Blyp] Failed to capture exception in Better Stack error tracking.',\n captureError\n );\n }\n },\n async flush() {\n if (!client) {\n if (!errorTrackingReady || !sentryModule) {\n return;\n }\n }\n\n try {\n if (client) {\n await client.flush();\n }\n if (errorTrackingReady && sentryModule) {\n await sentryModule.flush(2000);\n }\n } catch (error) {\n warnOnce(\n `betterstack-flush:${key}`,\n '[Blyp] Failed to flush Better Stack logs.',\n error\n );\n }\n },\n };\n}\n\nexport function setBetterStackTestHooks(hooks: BetterStackTestHooks): void {\n testHooks = hooks;\n}\n\nexport function resetBetterStackTestHooks(): void {\n testHooks = {};\n warnedKeys.clear();\n}\n","import { resolveConfig } from '../../core/config';\nimport {\n buildRecord,\n buildStructuredRecord,\n resolveStructuredWriteLevel,\n type LogMethodName,\n} from '../../core/log-record';\nimport {\n createStructuredLog,\n type StructuredLog,\n type StructuredLogPayload,\n} from '../../core/structured-log';\nimport {\n createBetterStackSender,\n} from './sender';\nimport type {\n BetterStackErrorTracker,\n BetterStackExceptionCaptureOptions,\n BetterStackLogger,\n BetterStackLoggerConfig,\n BetterStackSender,\n} from '../../types/connectors/betterstack';\n\nexport type {\n BetterStackErrorTracker,\n BetterStackExceptionCaptureOptions,\n BetterStackLogger,\n BetterStackLoggerConfig,\n} from '../../types/connectors/betterstack';\n\nfunction resolveSender(config: BetterStackLoggerConfig = {}): BetterStackSender {\n return createBetterStackSender(resolveConfig({\n ...(config.connectors ? { connectors: config.connectors } : {}),\n }));\n}\n\nfunction createBetterStackLoggerInstance(\n sender: BetterStackSender,\n bindings: Record<string, unknown> = {}\n): BetterStackLogger {\n const writeRecord = (\n level: LogMethodName,\n message: unknown,\n args: unknown[]\n ): void => {\n sender.send(buildRecord(level, message, args, bindings), {\n source: 'server',\n warnIfUnavailable: true,\n });\n };\n\n const writeStructured = (\n payload: StructuredLogPayload,\n message: string\n ): void => {\n sender.send(\n buildStructuredRecord(\n resolveStructuredWriteLevel(payload.level),\n message,\n payload,\n bindings\n ),\n {\n source: 'server',\n warnIfUnavailable: true,\n }\n );\n };\n\n return {\n debug: (message: unknown, ...args: unknown[]) => {\n writeRecord('debug', message, args);\n },\n info: (message: unknown, ...args: unknown[]) => {\n writeRecord('info', message, args);\n },\n error: (message: unknown, ...args: unknown[]) => {\n writeRecord('error', message, args);\n },\n warn: (message: unknown, ...args: unknown[]) => {\n writeRecord('warn', message, args);\n },\n warning: (message: unknown, ...args: unknown[]) => {\n writeRecord('warning', message, args);\n },\n success: (message: unknown, ...args: unknown[]) => {\n writeRecord('success', message, args);\n },\n critical: (message: unknown, ...args: unknown[]) => {\n writeRecord('critical', message, args);\n },\n table: (message: string, data?: unknown) => {\n writeRecord('table', message, data === undefined ? [] : [data]);\n },\n flush: async () => {},\n shutdown: async () => {},\n createStructuredLog: (\n groupId: string,\n initial?: Record<string, unknown>\n ): StructuredLog => {\n return createStructuredLog(groupId, {\n initialFields: initial,\n write: writeStructured,\n });\n },\n child: (childBindings: Record<string, unknown>) => {\n return createBetterStackLoggerInstance(sender, {\n ...bindings,\n ...childBindings,\n });\n },\n };\n}\n\nfunction createBetterStackErrorTrackerInstance(\n sender: BetterStackSender,\n bindings: Record<string, unknown> = {}\n): BetterStackErrorTracker {\n return {\n capture: (error: unknown, options: BetterStackExceptionCaptureOptions = {}) => {\n sender.captureException(error, {\n source: options.source ?? 'server',\n warnIfUnavailable: options.warnIfUnavailable ?? true,\n context: {\n ...bindings,\n ...(options.context ?? {}),\n 'blyp.manual': true,\n },\n });\n },\n child: (childBindings: Record<string, unknown>) => {\n return createBetterStackErrorTrackerInstance(sender, {\n ...bindings,\n ...childBindings,\n });\n },\n };\n}\n\nexport function createBetterStackLogger(\n config: BetterStackLoggerConfig = {}\n): BetterStackLogger {\n return createBetterStackLoggerInstance(resolveSender(config));\n}\n\nexport function createBetterStackErrorTracker(\n config: BetterStackLoggerConfig = {}\n): BetterStackErrorTracker {\n return createBetterStackErrorTrackerInstance(resolveSender(config));\n}\n\nexport function captureBetterStackException(\n error: unknown,\n options: BetterStackExceptionCaptureOptions = {},\n config: BetterStackLoggerConfig = {}\n): void {\n createBetterStackErrorTracker(config).capture(error, options);\n}\n\nexport function createStructuredBetterStackLogger<\n TFields extends Record<string, unknown> = Record<string, unknown>,\n>(\n groupId: string,\n initial?: TFields,\n config: BetterStackLoggerConfig = {}\n): StructuredLog<TFields> {\n const sender = resolveSender(config);\n\n return createStructuredLog(groupId, {\n initialFields: initial,\n write: (payload, message) => {\n sender.send(\n buildStructuredRecord(\n resolveStructuredWriteLevel(payload.level),\n message,\n payload,\n {}\n ),\n {\n source: 'server',\n warnIfUnavailable: true,\n }\n );\n },\n }) as StructuredLog<TFields>;\n}\n"]}
|