@blyp/core 0.1.21 → 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.
Files changed (242) hide show
  1. package/README.md +217 -11
  2. package/STABILITY.md +56 -0
  3. package/dist/ai/anthropic/index.d.ts +3 -0
  4. package/dist/ai/anthropic/normalize.d.ts +9 -0
  5. package/dist/ai/anthropic/stream.d.ts +3 -0
  6. package/dist/ai/anthropic/wrap.d.ts +13 -0
  7. package/dist/ai/anthropic.js +701 -0
  8. package/dist/ai/anthropic.mjs +701 -0
  9. package/dist/ai/fetch.js +701 -0
  10. package/dist/ai/fetch.mjs +701 -0
  11. package/dist/ai/openai/index.d.ts +3 -0
  12. package/dist/ai/openai/normalize.d.ts +10 -0
  13. package/dist/ai/openai/stream.d.ts +3 -0
  14. package/dist/ai/openai/wrap.d.ts +24 -0
  15. package/dist/ai/openai.js +701 -0
  16. package/dist/ai/openai.mjs +701 -0
  17. package/dist/ai/shared/fetch.d.ts +5 -0
  18. package/dist/ai/shared/index.d.ts +2 -0
  19. package/dist/ai/shared/normalize.d.ts +17 -0
  20. package/dist/ai/shared/redaction.d.ts +6 -0
  21. package/dist/ai/shared/stream.d.ts +7 -0
  22. package/dist/ai/shared/trace.d.ts +116 -0
  23. package/dist/ai/shared/types.d.ts +161 -0
  24. package/dist/ai/shared.js +701 -0
  25. package/dist/ai/shared.mjs +701 -0
  26. package/dist/ai/vercel/index.d.ts +3 -0
  27. package/dist/ai/vercel/middleware.d.ts +3 -0
  28. package/dist/ai/vercel/model.d.ts +3 -0
  29. package/dist/ai/vercel.js +701 -0
  30. package/dist/ai/vercel.mjs +701 -0
  31. package/dist/astro.js +618 -4519
  32. package/dist/astro.mjs +618 -4491
  33. package/dist/client.js +1 -1139
  34. package/dist/client.mjs +1 -1132
  35. package/dist/connectors/betterstack.js +9 -1532
  36. package/dist/connectors/betterstack.mjs +9 -1507
  37. package/dist/connectors/databuddy.js +9 -1456
  38. package/dist/connectors/databuddy.mjs +9 -1451
  39. package/dist/connectors/delivery/backoff.d.ts +2 -0
  40. package/dist/connectors/delivery/manager.d.ts +44 -0
  41. package/dist/connectors/delivery/queue-path.d.ts +1 -0
  42. package/dist/connectors/delivery/sqlite-adapter-bun.d.ts +1 -0
  43. package/dist/connectors/delivery/sqlite-adapter-node.d.ts +1 -0
  44. package/dist/connectors/delivery/sqlite-client.d.ts +37 -0
  45. package/dist/connectors/delivery/sqlite-worker.d.ts +1 -0
  46. package/dist/connectors/delivery/studio-queue.d.ts +12 -0
  47. package/dist/connectors/delivery/types.d.ts +98 -0
  48. package/dist/connectors/otlp/index.d.ts +1 -0
  49. package/dist/connectors/otlp.js +9 -1371
  50. package/dist/connectors/otlp.mjs +9 -1368
  51. package/dist/connectors/posthog/properties.d.ts +4 -0
  52. package/dist/connectors/posthog/sender.d.ts +0 -1
  53. package/dist/connectors/posthog.js +10 -1527
  54. package/dist/connectors/posthog.mjs +10 -1522
  55. package/dist/connectors/sentry.js +9 -1380
  56. package/dist/connectors/sentry.mjs +9 -1357
  57. package/dist/core/config.d.ts +7 -2
  58. package/dist/core/log-record.d.ts +5 -4
  59. package/dist/core/logger.d.ts +2 -0
  60. package/dist/core/optional-module.d.ts +1 -0
  61. package/dist/core/pino-pretty-loader.d.ts +4 -0
  62. package/dist/database.js +1 -24
  63. package/dist/database.mjs +1 -21
  64. package/dist/elysia.js +613 -4517
  65. package/dist/elysia.mjs +615 -4491
  66. package/dist/expo.js +1 -726
  67. package/dist/expo.mjs +1 -724
  68. package/dist/express.js +613 -4507
  69. package/dist/express.mjs +615 -4480
  70. package/dist/fastify.js +615 -4526
  71. package/dist/fastify.mjs +617 -4499
  72. package/dist/frameworks/elysia/index.d.ts +1 -1
  73. package/dist/frameworks/elysia/logger.d.ts +2 -35
  74. package/dist/frameworks/nestjs/helpers.d.ts +2 -0
  75. package/dist/frameworks/shared/http.d.ts +3 -2
  76. package/dist/frameworks/shared/index.d.ts +2 -1
  77. package/dist/frameworks/shared/logger.d.ts +2 -0
  78. package/dist/frameworks/shared/request-context.d.ts +2 -0
  79. package/dist/frameworks/shared/trace.d.ts +6 -0
  80. package/dist/hono.js +616 -4496
  81. package/dist/hono.mjs +618 -4470
  82. package/dist/index.d.ts +49 -19
  83. package/dist/index.js +615 -7557
  84. package/dist/index.mjs +618 -7465
  85. package/dist/nestjs.js +626 -4999
  86. package/dist/nestjs.mjs +621 -4966
  87. package/dist/nextjs.js +618 -4525
  88. package/dist/nextjs.mjs +620 -4499
  89. package/dist/nitro.js +617 -4642
  90. package/dist/nitro.mjs +619 -4616
  91. package/dist/nuxt.js +617 -4649
  92. package/dist/nuxt.mjs +619 -4623
  93. package/dist/react-router.js +616 -4559
  94. package/dist/react-router.mjs +618 -4533
  95. package/dist/shared/redaction.d.ts +17 -0
  96. package/dist/standalone.js +606 -3628
  97. package/dist/standalone.mjs +610 -3603
  98. package/dist/sveltekit.js +617 -4523
  99. package/dist/sveltekit.mjs +619 -4497
  100. package/dist/tanstack-start.js +616 -4522
  101. package/dist/tanstack-start.mjs +618 -4496
  102. package/dist/types/core/config.d.ts +57 -0
  103. package/dist/types/core/logger.d.ts +3 -0
  104. package/dist/types/core/structured-log.d.ts +2 -0
  105. package/dist/types/database.d.ts +1 -0
  106. package/dist/types/frameworks/astro.d.ts +1 -0
  107. package/dist/types/frameworks/client.d.ts +2 -0
  108. package/dist/types/frameworks/elysia.d.ts +2 -0
  109. package/dist/types/frameworks/express.d.ts +1 -0
  110. package/dist/types/frameworks/fastify.d.ts +1 -0
  111. package/dist/types/frameworks/hono.d.ts +1 -0
  112. package/dist/types/frameworks/http.d.ts +1 -0
  113. package/dist/types/frameworks/nestjs.d.ts +2 -0
  114. package/dist/types/frameworks/nextjs.d.ts +1 -0
  115. package/dist/types/frameworks/nitro.d.ts +1 -0
  116. package/dist/types/frameworks/react-router.d.ts +2 -0
  117. package/dist/types/frameworks/request-context.d.ts +1 -0
  118. package/dist/types/frameworks/shared.d.ts +4 -1
  119. package/dist/types/frameworks/standalone.d.ts +3 -2
  120. package/dist/types/frameworks/sveltekit.d.ts +1 -0
  121. package/dist/types/frameworks/tanstack-start.d.ts +9 -3
  122. package/dist/types/frameworks/workers.d.ts +3 -0
  123. package/dist/types/shared/client-log.d.ts +1 -0
  124. package/dist/workers.js +2 -626
  125. package/dist/workers.mjs +2 -623
  126. package/package.json +246 -173
  127. package/dist/astro.js.map +0 -1
  128. package/dist/astro.mjs.map +0 -1
  129. package/dist/client.js.map +0 -1
  130. package/dist/client.mjs.map +0 -1
  131. package/dist/connectors/betterstack.js.map +0 -1
  132. package/dist/connectors/betterstack.mjs.map +0 -1
  133. package/dist/connectors/databuddy.js.map +0 -1
  134. package/dist/connectors/databuddy.mjs.map +0 -1
  135. package/dist/connectors/otlp.js.map +0 -1
  136. package/dist/connectors/otlp.mjs.map +0 -1
  137. package/dist/connectors/posthog.js.map +0 -1
  138. package/dist/connectors/posthog.mjs.map +0 -1
  139. package/dist/connectors/sentry.js.map +0 -1
  140. package/dist/connectors/sentry.mjs.map +0 -1
  141. package/dist/database.js.map +0 -1
  142. package/dist/database.mjs.map +0 -1
  143. package/dist/elysia.js.map +0 -1
  144. package/dist/elysia.mjs.map +0 -1
  145. package/dist/expo.js.map +0 -1
  146. package/dist/expo.mjs.map +0 -1
  147. package/dist/express.js.map +0 -1
  148. package/dist/express.mjs.map +0 -1
  149. package/dist/fastify.js.map +0 -1
  150. package/dist/fastify.mjs.map +0 -1
  151. package/dist/hono.js.map +0 -1
  152. package/dist/hono.mjs.map +0 -1
  153. package/dist/index.js.map +0 -1
  154. package/dist/index.mjs.map +0 -1
  155. package/dist/nestjs.js.map +0 -1
  156. package/dist/nestjs.mjs.map +0 -1
  157. package/dist/nextjs.js.map +0 -1
  158. package/dist/nextjs.mjs.map +0 -1
  159. package/dist/nitro.js.map +0 -1
  160. package/dist/nitro.mjs.map +0 -1
  161. package/dist/nuxt.js.map +0 -1
  162. package/dist/nuxt.mjs.map +0 -1
  163. package/dist/react-router.js.map +0 -1
  164. package/dist/react-router.mjs.map +0 -1
  165. package/dist/standalone.js.map +0 -1
  166. package/dist/standalone.mjs.map +0 -1
  167. package/dist/sveltekit.js.map +0 -1
  168. package/dist/sveltekit.mjs.map +0 -1
  169. package/dist/tanstack-start.js.map +0 -1
  170. package/dist/tanstack-start.mjs.map +0 -1
  171. package/dist/workers.js.map +0 -1
  172. package/dist/workers.mjs.map +0 -1
  173. package/exports/client.js +0 -3
  174. package/exports/client.mjs +0 -3
  175. package/exports/connectors/betterstack.js +0 -1
  176. package/exports/connectors/betterstack.mjs +0 -1
  177. package/exports/connectors/databuddy.js +0 -1
  178. package/exports/connectors/databuddy.mjs +0 -1
  179. package/exports/connectors/otlp.js +0 -1
  180. package/exports/connectors/otlp.mjs +0 -1
  181. package/exports/connectors/posthog.js +0 -1
  182. package/exports/connectors/posthog.mjs +0 -1
  183. package/exports/connectors/sentry.js +0 -1
  184. package/exports/connectors/sentry.mjs +0 -1
  185. package/exports/database.js +0 -1
  186. package/exports/database.mjs +0 -1
  187. package/exports/expo.js +0 -1
  188. package/exports/expo.mjs +0 -1
  189. package/exports/frameworks/astro.js +0 -1
  190. package/exports/frameworks/astro.mjs +0 -1
  191. package/exports/frameworks/elysia.js +0 -1
  192. package/exports/frameworks/elysia.mjs +0 -1
  193. package/exports/frameworks/express.js +0 -1
  194. package/exports/frameworks/express.mjs +0 -1
  195. package/exports/frameworks/fastify.js +0 -1
  196. package/exports/frameworks/fastify.mjs +0 -1
  197. package/exports/frameworks/hono.js +0 -1
  198. package/exports/frameworks/hono.mjs +0 -1
  199. package/exports/frameworks/nestjs.js +0 -1
  200. package/exports/frameworks/nestjs.mjs +0 -1
  201. package/exports/frameworks/nextjs.js +0 -1
  202. package/exports/frameworks/nextjs.mjs +0 -1
  203. package/exports/frameworks/nitro.js +0 -1
  204. package/exports/frameworks/nitro.mjs +0 -1
  205. package/exports/frameworks/nuxt.js +0 -1
  206. package/exports/frameworks/nuxt.mjs +0 -1
  207. package/exports/frameworks/react-router.js +0 -1
  208. package/exports/frameworks/react-router.mjs +0 -1
  209. package/exports/frameworks/standalone.js +0 -1
  210. package/exports/frameworks/standalone.mjs +0 -1
  211. package/exports/frameworks/sveltekit.js +0 -1
  212. package/exports/frameworks/sveltekit.mjs +0 -1
  213. package/exports/frameworks/tanstack-start.js +0 -1
  214. package/exports/frameworks/tanstack-start.mjs +0 -1
  215. package/exports/workers.js +0 -1
  216. package/exports/workers.mjs +0 -1
  217. package/types/client.d.ts +0 -34
  218. package/types/connectors/betterstack.d.ts +0 -1
  219. package/types/connectors/databuddy.d.ts +0 -1
  220. package/types/connectors/otlp.d.ts +0 -1
  221. package/types/connectors/posthog.d.ts +0 -1
  222. package/types/connectors/sentry.d.ts +0 -1
  223. package/types/database.d.ts +0 -1
  224. package/types/expo.d.ts +0 -17
  225. package/types/frameworks/astro.d.ts +0 -1
  226. package/types/frameworks/client.d.ts +0 -160
  227. package/types/frameworks/elysia.d.ts +0 -1
  228. package/types/frameworks/expo.d.ts +0 -50
  229. package/types/frameworks/express.d.ts +0 -1
  230. package/types/frameworks/fastify.d.ts +0 -1
  231. package/types/frameworks/hono.d.ts +0 -1
  232. package/types/frameworks/nestjs.d.ts +0 -1
  233. package/types/frameworks/nextjs.d.ts +0 -1
  234. package/types/frameworks/nitro.d.ts +0 -1
  235. package/types/frameworks/nuxt.d.ts +0 -1
  236. package/types/frameworks/react-router.d.ts +0 -1
  237. package/types/frameworks/standalone.d.ts +0 -1
  238. package/types/frameworks/sveltekit.d.ts +0 -1
  239. package/types/frameworks/tanstack-start.d.ts +0 -1
  240. package/types/frameworks/workers.d.ts +0 -115
  241. package/types/index.d.ts +0 -1
  242. package/types/workers.d.ts +0 -13
@@ -1,1368 +1,9 @@
1
- import { existsSync, readFileSync, writeFileSync, appendFileSync } from 'fs';
2
- import { createJiti } from 'jiti';
3
- import { resolve, dirname } from 'path';
4
- import { z } from 'zod';
5
- import { SeverityNumber } from '@opentelemetry/api-logs';
6
- import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
7
- import { resourceFromAttributes } from '@opentelemetry/resources';
8
- import { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';
9
- import 'fflate';
10
-
11
- // src/core/config.ts
12
-
13
- // src/shared/log-value.ts
14
- function normalizeError(error) {
15
- const normalized = {
16
- name: error.name,
17
- message: error.message
18
- };
19
- if (error.stack) {
20
- normalized.stack = error.stack;
21
- }
22
- const errorWithCause = error;
23
- if (errorWithCause.cause !== void 0) {
24
- normalized.cause = normalizeLogValue(errorWithCause.cause);
25
- }
26
- return normalized;
27
- }
28
- function normalizeLogValue(value, seen = /* @__PURE__ */ new WeakSet()) {
29
- if (value instanceof Error) {
30
- return normalizeError(value);
31
- }
32
- if (typeof value === "function") {
33
- return `[Function: ${value.name || "anonymous"}]`;
34
- }
35
- if (typeof value === "symbol") {
36
- return value.toString();
37
- }
38
- if (value === void 0 || value === null) {
39
- return value;
40
- }
41
- if (Array.isArray(value)) {
42
- return value.map((entry) => normalizeLogValue(entry, seen));
43
- }
44
- if (typeof value === "object") {
45
- if (seen.has(value)) {
46
- return "[Circular]";
47
- }
48
- seen.add(value);
49
- const normalized = {};
50
- for (const [key, entry] of Object.entries(value)) {
51
- normalized[key] = normalizeLogValue(entry, seen);
52
- }
53
- seen.delete(value);
54
- return normalized;
55
- }
56
- return value;
57
- }
58
- function serializeLogMessage(message) {
59
- if (typeof message === "string") {
60
- return message;
61
- }
62
- if (message instanceof Error) {
63
- return message.message || message.name;
64
- }
65
- const normalized = normalizeLogValue(message);
66
- if (typeof normalized === "string") {
67
- return normalized;
68
- }
69
- try {
70
- const serialized = JSON.stringify(normalized, null, 2);
71
- return serialized ?? String(normalized);
72
- } catch {
73
- return String(normalized);
74
- }
75
- }
76
- var absoluteHttpUrlSchema = z.string().url().refine((value) => {
77
- try {
78
- const url = new URL(value);
79
- return url.protocol === "http:" || url.protocol === "https:";
80
- } catch {
81
- return false;
82
- }
83
- }, {
84
- message: "Expected an absolute http(s) URL"
85
- });
86
- var plainObjectSchema = z.custom(
87
- (value) => {
88
- return value !== null && typeof value === "object" && !Array.isArray(value);
89
- },
90
- {
91
- message: "Expected a plain object"
92
- }
93
- );
94
- var nonEmptyStringSchema = z.string().trim().min(1);
95
- function isAbsoluteHttpUrl(value) {
96
- return absoluteHttpUrlSchema.safeParse(value).success;
97
- }
98
- function isPlainObject(value) {
99
- return plainObjectSchema.safeParse(value).success;
100
- }
101
- function hasNonEmptyString(value) {
102
- return nonEmptyStringSchema.safeParse(value).success;
103
- }
104
-
105
- // src/shared/client-log.ts
106
- var DEFAULT_CLIENT_LOG_ENDPOINT = "/inngest";
107
- z.union([
108
- z.literal("betterstack"),
109
- z.literal("databuddy"),
110
- z.literal("posthog"),
111
- z.literal("sentry"),
112
- z.undefined(),
113
- z.object({
114
- type: z.literal("otlp"),
115
- name: nonEmptyStringSchema
116
- })
117
- ]);
118
-
119
- // src/shared/once.ts
120
- function createConsoleOnceLogger(method, warnedKeys3 = /* @__PURE__ */ new Set()) {
121
- return (key, message, error) => {
122
- if (warnedKeys3.has(key) || typeof console === "undefined") {
123
- return;
124
- }
125
- const writer = console[method];
126
- if (typeof writer !== "function") {
127
- return;
128
- }
129
- warnedKeys3.add(key);
130
- if (error === void 0) {
131
- writer.call(console, message);
132
- return;
133
- }
134
- writer.call(console, message, error);
135
- };
136
- }
137
- function createWarnOnceLogger(warnedKeys3) {
138
- return createConsoleOnceLogger("warn", warnedKeys3);
139
- }
140
- function createErrorOnceLogger(warnedKeys3) {
141
- return createConsoleOnceLogger("error", warnedKeys3);
142
- }
143
-
144
- // src/core/config.ts
145
- var PACKAGE_NAME = "@blyp/core";
146
- var GITIGNORE_FILE_NAME = ".gitignore";
147
- var CONFIG_FILE_NAMES = [
148
- "blyp.config.ts",
149
- "blyp.config.mts",
150
- "blyp.config.cts",
151
- "blyp.config.js",
152
- "blyp.config.mjs",
153
- "blyp.config.cjs",
154
- "blyp.config.json"
155
- ];
156
- var CONFIG_FILE_NAME = "blyp.config.json";
157
- var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com";
158
- var DEFAULT_CONNECTOR_SERVICE_NAME = "blyp-app";
159
- var DEFAULT_POSTHOG_SERVICE_NAME = DEFAULT_CONNECTOR_SERVICE_NAME;
160
- var warnedKeys = /* @__PURE__ */ new Set();
161
- var warnOnce = createWarnOnceLogger(warnedKeys);
162
- var DEFAULT_ROTATION_CONFIG = {
163
- enabled: true,
164
- maxSizeBytes: 10 * 1024 * 1024,
165
- maxArchives: 5,
166
- compress: true
167
- };
168
- var DEFAULT_FILE_CONFIG = {
169
- enabled: true,
170
- dir: "",
171
- archiveDir: "",
172
- format: "ndjson",
173
- rotation: DEFAULT_ROTATION_CONFIG
174
- };
175
- var DEFAULT_CLIENT_LOGGING_CONFIG = {
176
- enabled: true,
177
- path: DEFAULT_CLIENT_LOG_ENDPOINT
178
- };
179
- var DEFAULT_DATABASE_RETRY_CONFIG = {
180
- maxRetries: 1,
181
- backoffMs: 100
182
- };
183
- var DEFAULT_DATABASE_DELIVERY_CONFIG = {
184
- strategy: "immediate",
185
- batchSize: 1,
186
- flushIntervalMs: 250,
187
- maxQueueSize: 1e3,
188
- overflowStrategy: "drop-oldest",
189
- flushTimeoutMs: 5e3,
190
- retry: DEFAULT_DATABASE_RETRY_CONFIG
191
- };
192
- var DEFAULT_CONFIG = {
193
- pretty: true,
194
- level: "info",
195
- destination: "file",
196
- file: DEFAULT_FILE_CONFIG,
197
- clientLogging: DEFAULT_CLIENT_LOGGING_CONFIG,
198
- connectors: {}
199
- };
200
- var cachedConfig = null;
201
- function findNearestPackageName(startDir) {
202
- let currentDir = startDir;
203
- while (true) {
204
- const packageJsonPath = resolve(currentDir, "package.json");
205
- if (existsSync(packageJsonPath)) {
206
- try {
207
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
208
- if (hasNonEmptyString(packageJson.name)) {
209
- return packageJson.name;
210
- }
211
- } catch {
212
- }
213
- }
214
- const parentDir = dirname(currentDir);
215
- if (parentDir === currentDir) {
216
- return void 0;
217
- }
218
- currentDir = parentDir;
219
- }
220
- }
221
- function resolveDefaultConnectorServiceName(cwd = process.cwd()) {
222
- return findNearestPackageName(cwd) ?? DEFAULT_POSTHOG_SERVICE_NAME;
223
- }
224
- function getBootstrapConfig() {
225
- return {
226
- pretty: true,
227
- level: "info",
228
- destination: "file",
229
- file: {
230
- enabled: true,
231
- format: "ndjson",
232
- rotation: {
233
- enabled: true,
234
- maxSizeBytes: 10 * 1024 * 1024,
235
- maxArchives: 5,
236
- compress: true
237
- }
238
- },
239
- clientLogging: {
240
- enabled: true,
241
- path: DEFAULT_CLIENT_LOG_ENDPOINT
242
- },
243
- connectors: {}
244
- };
245
- }
246
- function shouldBootstrapProjectFiles(cwd) {
247
- const packageJsonPath = resolve(cwd, "package.json");
248
- if (!existsSync(packageJsonPath)) {
249
- return true;
250
- }
251
- try {
252
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
253
- return packageJson.name !== PACKAGE_NAME;
254
- } catch {
255
- return true;
256
- }
257
- }
258
- function ensureConfigFile(cwd) {
259
- if (CONFIG_FILE_NAMES.some((fileName) => existsSync(resolve(cwd, fileName)))) {
260
- return;
261
- }
262
- const configPath = resolve(cwd, CONFIG_FILE_NAME);
263
- if (existsSync(configPath)) {
264
- return;
265
- }
266
- try {
267
- writeFileSync(configPath, `${JSON.stringify(getBootstrapConfig(), null, 2)}
268
- `);
269
- } catch (error) {
270
- console.error("[Blyp] Warning: Failed to create blyp.config.json:", error);
271
- }
272
- }
273
- function ensureLogsIgnored(cwd) {
274
- const gitignorePath = resolve(cwd, GITIGNORE_FILE_NAME);
275
- if (!existsSync(gitignorePath)) {
276
- try {
277
- writeFileSync(gitignorePath, "logs\n");
278
- } catch (error) {
279
- console.error("[Blyp] Warning: Failed to create .gitignore:", error);
280
- }
281
- return;
282
- }
283
- try {
284
- const currentContent = readFileSync(gitignorePath, "utf-8");
285
- if (/^(?:\/?logs\/?)\s*$/m.test(currentContent)) {
286
- return;
287
- }
288
- const separator = currentContent.endsWith("\n") ? "" : "\n";
289
- appendFileSync(gitignorePath, `${separator}logs
290
- `);
291
- } catch (error) {
292
- console.error("[Blyp] Warning: Failed to update .gitignore:", error);
293
- }
294
- }
295
- function bootstrapProjectFiles() {
296
- const cwd = process.cwd();
297
- if (!shouldBootstrapProjectFiles(cwd)) {
298
- return;
299
- }
300
- ensureConfigFile(cwd);
301
- ensureLogsIgnored(cwd);
302
- }
303
- function findConfigFile() {
304
- const cwd = process.cwd();
305
- const matches = CONFIG_FILE_NAMES.map((fileName) => resolve(cwd, fileName)).filter((filePath) => existsSync(filePath));
306
- if (matches.length === 0) {
307
- return null;
308
- }
309
- if (matches.length > 1) {
310
- const preferred = matches[0];
311
- warnOnce(
312
- `config-multiple:${preferred}`,
313
- `[Blyp] Warning: Multiple config files found. Using ${preferred} and ignoring ${matches.slice(1).join(", ")}.`
314
- );
315
- }
316
- const selectedPath = matches[0];
317
- return {
318
- path: selectedPath,
319
- type: selectedPath.endsWith(".json") ? "json" : "jiti"
320
- };
321
- }
322
- function normalizeLoadedConfig(value, configPath) {
323
- const normalized = value && typeof value === "object" && "default" in value && value.default !== void 0 ? value.default : value;
324
- if (!normalized || typeof normalized !== "object" || Array.isArray(normalized)) {
325
- warnOnce(
326
- `config-invalid:${configPath}`,
327
- `[Blyp] Warning: Config file ${configPath} did not export an object. Falling back to defaults.`
328
- );
329
- return {};
330
- }
331
- return normalized;
332
- }
333
- function parseJsonConfigFile(configPath) {
334
- try {
335
- const content = readFileSync(configPath, "utf-8");
336
- return normalizeLoadedConfig(JSON.parse(content), configPath);
337
- } catch (error) {
338
- console.error("[Blyp] Warning: Failed to parse blyp.config.json:", error);
339
- return {};
340
- }
341
- }
342
- function parseExecutableConfigFile(configPath) {
343
- try {
344
- const jiti = createJiti(process.cwd(), {
345
- interopDefault: true,
346
- moduleCache: false,
347
- fsCache: false
348
- });
349
- return normalizeLoadedConfig(jiti(configPath), configPath);
350
- } catch (error) {
351
- console.error(`[Blyp] Warning: Failed to load ${configPath}:`, error);
352
- return {};
353
- }
354
- }
355
- function parseConfigFile(config) {
356
- return config.type === "json" ? parseJsonConfigFile(config.path) : parseExecutableConfigFile(config.path);
357
- }
358
- function isPrismaAdapter(value) {
359
- return !!value && typeof value === "object" && value.type === "prisma";
360
- }
361
- function isDrizzleAdapter(value) {
362
- return !!value && typeof value === "object" && value.type === "drizzle";
363
- }
364
- function mergeDatabaseRetryConfig(base, override) {
365
- return {
366
- ...DEFAULT_DATABASE_RETRY_CONFIG,
367
- ...base,
368
- ...override
369
- };
370
- }
371
- function mergeDatabaseDeliveryConfig(base, override) {
372
- return {
373
- ...DEFAULT_DATABASE_DELIVERY_CONFIG,
374
- ...base,
375
- ...override,
376
- retry: mergeDatabaseRetryConfig(base?.retry, override?.retry)
377
- };
378
- }
379
- function hasPrismaDelegate(adapter) {
380
- const model = adapter.model ?? "blypLog";
381
- const client = adapter.client;
382
- const delegate = client?.[model];
383
- return !!delegate && typeof delegate.create === "function";
384
- }
385
- function hasDrizzleAdapterShape(adapter) {
386
- const db = adapter.db;
387
- return !!db && typeof db.insert === "function" && adapter.table !== void 0;
388
- }
389
- function resolveDatabaseLoggerConfig(config, sourceType) {
390
- if (!config) {
391
- return void 0;
392
- }
393
- const adapter = config.adapter;
394
- let ready = false;
395
- if (sourceType === "json") {
396
- warnOnce(
397
- "database-json-config",
398
- "[Blyp] Warning: Database logging requires an executable blyp config file. Database destination remains disabled until you move this config to blyp.config.ts/js."
399
- );
400
- } else if (config.dialect !== "postgres" && config.dialect !== "mysql") {
401
- warnOnce(
402
- `database-dialect:${String(config.dialect)}`,
403
- `[Blyp] Warning: Unsupported database dialect "${String(config.dialect)}". Database logging is disabled.`
404
- );
405
- } else if (!adapter) {
406
- warnOnce(
407
- "database-adapter-missing",
408
- "[Blyp] Warning: Database logging is enabled without an adapter. Database logging is disabled."
409
- );
410
- } else if (isPrismaAdapter(adapter)) {
411
- ready = hasPrismaDelegate({
412
- ...adapter,
413
- model: adapter.model ?? "blypLog"
414
- });
415
- if (!ready) {
416
- warnOnce(
417
- "database-prisma-missing",
418
- `[Blyp] Warning: Prisma database adapter is missing the "${adapter.model ?? "blypLog"}" delegate or its create method. Database logging is disabled.`
419
- );
420
- }
421
- } else if (isDrizzleAdapter(adapter)) {
422
- ready = hasDrizzleAdapterShape(adapter);
423
- if (!ready) {
424
- warnOnce(
425
- "database-drizzle-missing",
426
- "[Blyp] Warning: Drizzle database adapter is missing a db.insert function or table reference. Database logging is disabled."
427
- );
428
- }
429
- }
430
- const normalizedAdapter = isPrismaAdapter(adapter) ? {
431
- ...adapter,
432
- model: adapter.model ?? "blypLog"
433
- } : adapter;
434
- return {
435
- dialect: config.dialect,
436
- adapter: normalizedAdapter,
437
- delivery: mergeDatabaseDeliveryConfig(void 0, config.delivery),
438
- ready,
439
- status: ready ? "enabled" : "missing"
440
- };
441
- }
442
- function mergeRotationConfig(base, override) {
443
- return {
444
- ...DEFAULT_ROTATION_CONFIG,
445
- ...base,
446
- ...override
447
- };
448
- }
449
- function mergeFileConfig(base, override) {
450
- return {
451
- ...DEFAULT_FILE_CONFIG,
452
- ...base,
453
- ...override,
454
- rotation: mergeRotationConfig(base?.rotation, override?.rotation)
455
- };
456
- }
457
- function mergeClientLoggingConfig(base, override) {
458
- return {
459
- ...DEFAULT_CLIENT_LOGGING_CONFIG,
460
- ...base,
461
- ...override,
462
- path: override?.path ?? base?.path ?? DEFAULT_CLIENT_LOGGING_CONFIG.path
463
- };
464
- }
465
- function mergeDatabaseLoggerConfig(base, override, sourceType) {
466
- if (!base && !override) {
467
- return void 0;
468
- }
469
- return resolveDatabaseLoggerConfig(
470
- {
471
- dialect: override?.dialect ?? base?.dialect,
472
- adapter: override?.adapter ?? base?.adapter,
473
- delivery: {
474
- ...base?.delivery ?? {},
475
- ...override?.delivery ?? {},
476
- retry: {
477
- ...base?.delivery?.retry ?? {},
478
- ...override?.delivery?.retry ?? {}
479
- }
480
- }
481
- },
482
- sourceType
483
- );
484
- }
485
- function mergePostHogConnectorConfig(base, override) {
486
- const enabled = override?.enabled ?? base?.enabled ?? false;
487
- const projectKey = override?.projectKey ?? base?.projectKey;
488
- const baseErrorTracking = base?.enabled === true ? base?.errorTracking : void 0;
489
- const errorTrackingMode = override?.errorTracking?.mode ?? baseErrorTracking?.mode ?? "auto";
490
- const errorTrackingEnabled = override?.errorTracking?.enabled ?? baseErrorTracking?.enabled ?? enabled;
491
- const errorTrackingReady = enabled && errorTrackingEnabled && typeof projectKey === "string" && projectKey.trim().length > 0;
492
- return {
493
- enabled,
494
- mode: override?.mode ?? base?.mode ?? "auto",
495
- projectKey,
496
- host: override?.host ?? base?.host ?? DEFAULT_POSTHOG_HOST,
497
- serviceName: override?.serviceName ?? base?.serviceName ?? resolveDefaultConnectorServiceName(),
498
- errorTracking: {
499
- enabled: errorTrackingEnabled,
500
- mode: errorTrackingMode,
501
- enableExceptionAutocapture: override?.errorTracking?.enableExceptionAutocapture ?? baseErrorTracking?.enableExceptionAutocapture ?? errorTrackingMode === "auto",
502
- ready: errorTrackingReady,
503
- status: errorTrackingReady ? "enabled" : "missing"
504
- }
505
- };
506
- }
507
- function mergeDatabuddyConnectorConfig(base, override) {
508
- const enabled = override?.enabled ?? base?.enabled ?? false;
509
- const apiKey = override?.apiKey ?? base?.apiKey;
510
- const websiteId = override?.websiteId ?? base?.websiteId;
511
- const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
512
- return {
513
- enabled,
514
- mode: override?.mode ?? base?.mode ?? "auto",
515
- apiKey,
516
- websiteId,
517
- namespace: override?.namespace ?? base?.namespace,
518
- source: override?.source ?? base?.source,
519
- apiUrl: override?.apiUrl ?? base?.apiUrl,
520
- debug: override?.debug ?? base?.debug ?? false,
521
- enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
522
- batchSize: override?.batchSize ?? base?.batchSize,
523
- batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
524
- maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
525
- ready,
526
- status: ready ? "enabled" : "missing"
527
- };
528
- }
529
- function mergeBetterStackConnectorConfig(base, override) {
530
- const sourceToken = override?.sourceToken ?? base?.sourceToken;
531
- const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
532
- const enabled = override?.enabled ?? base?.enabled ?? false;
533
- const baseErrorTracking = base?.enabled === true ? base?.errorTracking : void 0;
534
- const errorTracking = mergeBetterStackErrorTrackingConfig(
535
- enabled,
536
- baseErrorTracking,
537
- override?.errorTracking
538
- );
539
- const ready = enabled && hasNonEmptyString(sourceToken) && isAbsoluteHttpUrl(ingestingHost);
540
- return {
541
- enabled,
542
- mode: override?.mode ?? base?.mode ?? "auto",
543
- sourceToken,
544
- ingestingHost,
545
- serviceName: override?.serviceName ?? base?.serviceName ?? resolveDefaultConnectorServiceName(),
546
- errorTracking,
547
- ready,
548
- status: ready ? "enabled" : "missing"
549
- };
550
- }
551
- function mergeBetterStackErrorTrackingConfig(connectorEnabled, base, override) {
552
- const dsn = override?.dsn ?? base?.dsn;
553
- const enabled = override?.enabled ?? base?.enabled ?? connectorEnabled;
554
- const ready = enabled && hasNonEmptyString(dsn);
555
- return {
556
- enabled,
557
- dsn,
558
- tracesSampleRate: override?.tracesSampleRate ?? base?.tracesSampleRate ?? 1,
559
- environment: override?.environment ?? base?.environment,
560
- release: override?.release ?? base?.release,
561
- ready,
562
- status: ready ? "enabled" : "missing"
563
- };
564
- }
565
- function mergeSentryConnectorConfig(base, override) {
566
- const dsn = override?.dsn ?? base?.dsn;
567
- const enabled = override?.enabled ?? base?.enabled ?? false;
568
- const ready = enabled && typeof dsn === "string" && dsn.trim().length > 0;
569
- return {
570
- enabled,
571
- mode: override?.mode ?? base?.mode ?? "auto",
572
- dsn,
573
- environment: override?.environment ?? base?.environment,
574
- release: override?.release ?? base?.release,
575
- ready,
576
- status: ready ? "enabled" : "missing"
577
- };
578
- }
579
- function mergeOTLPConnectorConfig(base, override) {
580
- const endpoint = override?.endpoint ?? base?.endpoint;
581
- const enabled = override?.enabled ?? base?.enabled ?? false;
582
- const resolvedHeaders = {
583
- ...{},
584
- ...override?.headers ?? {}
585
- };
586
- const ready = enabled && isAbsoluteHttpUrl(endpoint);
587
- return {
588
- name: override?.name ?? base?.name ?? "",
589
- enabled,
590
- mode: override?.mode ?? base?.mode ?? "auto",
591
- endpoint,
592
- headers: resolvedHeaders,
593
- auth: override?.auth ?? base?.auth,
594
- serviceName: override?.serviceName ?? base?.serviceName ?? resolveDefaultConnectorServiceName(),
595
- ready,
596
- status: ready ? "enabled" : "missing"
597
- };
598
- }
599
- function mergeOTLPConnectorsConfig(base, override) {
600
- const source = override ?? base ?? [];
601
- const deduped = /* @__PURE__ */ new Map();
602
- for (const connector of source) {
603
- if (!connector || typeof connector.name !== "string" || connector.name.length === 0) {
604
- continue;
605
- }
606
- if (deduped.has(connector.name)) {
607
- warnOnce(
608
- `otlp-duplicate:${connector.name}`,
609
- `[Blyp] Warning: Duplicate OTLP connector name "${connector.name}" found. Using the last definition.`
610
- );
611
- }
612
- deduped.set(connector.name, mergeOTLPConnectorConfig(void 0, connector));
613
- }
614
- return Array.from(deduped.values());
615
- }
616
- function mergeConnectorsConfig(base, override) {
617
- return {
618
- betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
619
- databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
620
- posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
621
- sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
622
- otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
623
- };
624
- }
625
- function mergeBlypConfig(base, override = {}, options = {}) {
626
- return {
627
- ...base,
628
- ...override,
629
- destination: override.destination ?? base.destination ?? "file",
630
- file: mergeFileConfig(base.file, override.file),
631
- database: mergeDatabaseLoggerConfig(base.database, override.database, options.configFileType),
632
- clientLogging: mergeClientLoggingConfig(base.clientLogging, override.clientLogging),
633
- connectors: mergeConnectorsConfig(base.connectors, override.connectors)
634
- };
635
- }
636
- function loadConfig() {
637
- if (cachedConfig !== null) {
638
- return cachedConfig;
639
- }
640
- bootstrapProjectFiles();
641
- const configFile = findConfigFile();
642
- if (configFile) {
643
- const userConfig = parseConfigFile(configFile);
644
- cachedConfig = mergeBlypConfig(DEFAULT_CONFIG, userConfig, {
645
- configFileType: configFile.type
646
- });
647
- } else {
648
- cachedConfig = mergeBlypConfig(DEFAULT_CONFIG);
649
- }
650
- return cachedConfig;
651
- }
652
- function resolveConfig(overrides = {}) {
653
- return mergeBlypConfig(loadConfig(), overrides);
654
- }
655
-
656
- // src/core/log-record.ts
657
- var RECORD_LEVELS = {
658
- success: "success",
659
- critical: "critical",
660
- warning: "warning",
661
- info: "info",
662
- debug: "debug",
663
- error: "error",
664
- warn: "warning",
665
- table: "table"
666
- };
667
- function normalizePath(filePath) {
668
- return filePath.replace(/\\/g, "/");
669
- }
670
- function isInternalLoggerFrame(filePath) {
671
- const normalizedPath = normalizePath(filePath);
672
- return normalizedPath.startsWith("node:") || normalizedPath.includes("/node_modules/pino") || normalizedPath.includes("/node_modules/pino-pretty") || normalizedPath.includes("/node_modules/@blyp/core/") || normalizedPath.includes("/blyp/src/core/") || normalizedPath.includes("/blyp/src/frameworks/") || normalizedPath.includes("/blyp/src/posthog/") || normalizedPath.includes("/blyp/dist/");
673
- }
674
- function formatCallerPath(filePath) {
675
- const normalizedPath = normalizePath(filePath);
676
- const normalizedCwd = normalizePath(process.cwd());
677
- return normalizedPath.startsWith(`${normalizedCwd}/`) ? normalizedPath.slice(normalizedCwd.length + 1) : normalizedPath;
678
- }
679
- function getCallerLocation() {
680
- try {
681
- const stack = new Error().stack;
682
- if (!stack) {
683
- return { file: null, line: null };
684
- }
685
- const lines = stack.split("\n");
686
- let fallback = null;
687
- for (let index = 2; index < lines.length; index += 1) {
688
- const line = lines[index];
689
- if (!line) {
690
- continue;
691
- }
692
- const match = line.match(/\((.*):(\d+):\d+\)/) || line.match(/at\s+(.*):(\d+):(\d+)/);
693
- if (!match) {
694
- continue;
695
- }
696
- const fileName = match[1] || "";
697
- const lineNumber = parseInt(match[2] || "0", 10) || null;
698
- if (fileName && !fileName.includes("node_modules") && !isInternalLoggerFrame(fileName)) {
699
- const formattedPath = formatCallerPath(fileName);
700
- const normalizedFormattedPath = normalizePath(formattedPath);
701
- if (!normalizedFormattedPath.startsWith("dist/")) {
702
- return { file: formattedPath, line: lineNumber };
703
- }
704
- fallback ?? (fallback = { file: formattedPath, line: lineNumber });
705
- }
706
- }
707
- if (fallback) {
708
- return fallback;
709
- }
710
- } catch {
711
- return { file: null, line: null };
712
- }
713
- return { file: null, line: null };
714
- }
715
- var serializeMessage = serializeLogMessage;
716
- function stripAnsi(value) {
717
- return value.replace(/\u001b\[[0-9;]*m/g, "");
718
- }
719
- function buildRecord(level, message, args, bindings) {
720
- const { file, line } = getCallerLocation();
721
- const serializedMessage = serializeMessage(message);
722
- const record = {
723
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
724
- level: RECORD_LEVELS[level],
725
- message: stripAnsi(serializedMessage)
726
- };
727
- if (message instanceof Error) {
728
- record.error = normalizeError(message);
729
- }
730
- if (file) {
731
- record.caller = line !== null ? `${file}:${line}` : file;
732
- }
733
- if (args.length === 1) {
734
- record.data = normalizeLogValue(args[0]);
735
- } else if (args.length > 1) {
736
- record.data = normalizeLogValue(args);
737
- }
738
- if (Object.keys(bindings).length > 0) {
739
- record.bindings = normalizeLogValue(bindings);
740
- }
741
- return record;
742
- }
743
- function buildStructuredRecord(level, message, payload, bindings) {
744
- const { file, line } = getCallerLocation();
745
- const normalizedPayload = normalizeLogValue(payload);
746
- const record = {
747
- message: stripAnsi(message),
748
- ...normalizedPayload
749
- };
750
- if (file) {
751
- record.caller = line !== null ? `${file}:${line}` : file;
752
- }
753
- if (Object.keys(bindings).length > 0) {
754
- record.bindings = normalizeLogValue(bindings);
755
- }
756
- record.level = typeof normalizedPayload.level === "string" && normalizedPayload.level.length > 0 ? normalizedPayload.level : RECORD_LEVELS[level];
757
- record.timestamp = typeof normalizedPayload.timestamp === "string" && normalizedPayload.timestamp.length > 0 ? normalizedPayload.timestamp : (/* @__PURE__ */ new Date()).toISOString();
758
- return record;
759
- }
760
- function resolveStructuredWriteLevel(level) {
761
- switch (level) {
762
- case "debug":
763
- return "debug";
764
- case "warning":
765
- return "warning";
766
- case "warn":
767
- return "warn";
768
- case "error":
769
- return "error";
770
- case "success":
771
- return "success";
772
- case "critical":
773
- return "critical";
774
- case "table":
775
- return "table";
776
- case "info":
777
- default:
778
- return "info";
779
- }
780
- }
781
-
782
- // src/core/structured-log.ts
783
- function serializeMessage2(message) {
784
- if (typeof message === "string") {
785
- return message;
786
- }
787
- if (message !== null && typeof message === "object") {
788
- try {
789
- return JSON.stringify(
790
- message,
791
- (_key, value) => {
792
- if (typeof value === "function") {
793
- return `[Function: ${value.name || "anonymous"}]`;
794
- }
795
- if (value === void 0) {
796
- return "[undefined]";
797
- }
798
- if (typeof value === "symbol") {
799
- return value.toString();
800
- }
801
- return value;
802
- },
803
- 2
804
- );
805
- } catch {
806
- return "[Object]";
807
- }
808
- }
809
- return String(message);
810
- }
811
- function normalizeEventData(message, args) {
812
- if (typeof message === "string") {
813
- if (args.length === 0) {
814
- return void 0;
815
- }
816
- return args.length === 1 ? args[0] : args;
817
- }
818
- const values = [message, ...args];
819
- return values.length === 1 ? values[0] : values;
820
- }
821
- function normalizeDetails(value) {
822
- if (!value || typeof value !== "object" || Array.isArray(value)) {
823
- return void 0;
824
- }
825
- return value;
826
- }
827
- function normalizeError2(error, fallbackStatus) {
828
- if (error === void 0 || error === null) {
829
- return fallbackStatus === void 0 || fallbackStatus < 400 ? void 0 : {
830
- message: `HTTP ${fallbackStatus}`,
831
- code: fallbackStatus,
832
- type: "HttpError"
833
- };
834
- }
835
- if (error instanceof Error) {
836
- const errorLike = error;
837
- return {
838
- message: error.message,
839
- code: errorLike.code,
840
- type: errorLike.type ?? error.name ?? error.constructor?.name,
841
- stack: error.stack,
842
- why: errorLike.why,
843
- fix: errorLike.fix,
844
- link: errorLike.link,
845
- details: normalizeDetails(errorLike.details),
846
- cause: errorLike.cause
847
- };
848
- }
849
- if (typeof error === "object") {
850
- const record = error;
851
- const statusCode = typeof record.statusCode === "number" ? record.statusCode : typeof record.status === "number" ? record.status : fallbackStatus;
852
- return {
853
- message: typeof record.message === "string" ? record.message : `HTTP ${statusCode ?? 500}`,
854
- code: typeof record.code === "string" || typeof record.code === "number" ? record.code : statusCode,
855
- type: typeof record.type === "string" ? record.type : typeof record.name === "string" ? record.name : "Error",
856
- stack: typeof record.stack === "string" ? record.stack : void 0,
857
- why: typeof record.why === "string" ? record.why : void 0,
858
- fix: typeof record.fix === "string" ? record.fix : void 0,
859
- link: typeof record.link === "string" ? record.link : void 0,
860
- details: normalizeDetails(record.details),
861
- cause: record.cause
862
- };
863
- }
864
- return {
865
- message: String(error),
866
- code: fallbackStatus,
867
- type: typeof error
868
- };
869
- }
870
- function resolveEmitStatus(options) {
871
- if (options.response && typeof options.response.status === "number") {
872
- return options.response.status;
873
- }
874
- if (typeof options.status === "number") {
875
- return options.status;
876
- }
877
- if (options.error && typeof options.error === "object" && options.error !== null && typeof options.error.statusCode === "number") {
878
- return options.error.statusCode;
879
- }
880
- if (options.error && typeof options.error === "object" && options.error !== null && typeof options.error.status === "number") {
881
- return options.error.status;
882
- }
883
- return options.error ? 500 : void 0;
884
- }
885
- function createStructuredLog(groupId, options) {
886
- const startedAt = performance.now();
887
- const fields = { ...options.initialFields ?? {} };
888
- const events = [];
889
- let emittedPayload;
890
- options.onCreate?.();
891
- const appendEvent = (level, message, args) => {
892
- events.push({
893
- level,
894
- message: serializeMessage2(message),
895
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
896
- ...normalizeEventData(message, args) === void 0 ? {} : { data: normalizeEventData(message, args) }
897
- });
898
- return structuredLog;
899
- };
900
- const structuredLog = {
901
- set(extraFields) {
902
- Object.assign(fields, extraFields);
903
- return structuredLog;
904
- },
905
- debug(message, ...args) {
906
- return appendEvent("debug", message, args);
907
- },
908
- info(message, ...args) {
909
- return appendEvent("info", message, args);
910
- },
911
- warn(message, ...args) {
912
- return appendEvent("warn", message, args);
913
- },
914
- warning(message, ...args) {
915
- return appendEvent("warning", message, args);
916
- },
917
- error(message, ...args) {
918
- return appendEvent("error", message, args);
919
- },
920
- success(message, ...args) {
921
- return appendEvent("success", message, args);
922
- },
923
- critical(message, ...args) {
924
- return appendEvent("critical", message, args);
925
- },
926
- table(message, data) {
927
- return appendEvent("table", message, data === void 0 ? [] : [data]);
928
- },
929
- emit(emitOptions = {}) {
930
- if (emittedPayload) {
931
- return emittedPayload;
932
- }
933
- const defaultFields = options.resolveDefaultFields?.() ?? {};
934
- const status = resolveEmitStatus(emitOptions);
935
- const error = normalizeError2(emitOptions.error, status);
936
- const level = emitOptions.level ?? (error ? "error" : "info");
937
- const payload = {
938
- ...defaultFields,
939
- ...fields,
940
- groupId,
941
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
942
- level,
943
- duration: Math.round(performance.now() - startedAt),
944
- ...typeof status === "number" ? { status } : {},
945
- ...events.length > 0 ? { events: [...events] } : {},
946
- ...error ? { error } : {}
947
- };
948
- options.write(payload, emitOptions.message ?? "structured_log");
949
- emittedPayload = payload;
950
- options.onEmit?.(payload);
951
- return payload;
952
- }
953
- };
954
- return structuredLog;
955
- }
956
- function createSafeReplacer() {
957
- const seen = /* @__PURE__ */ new WeakSet();
958
- return (_key, value) => {
959
- if (typeof value === "function") {
960
- return `[Function: ${value.name || "anonymous"}]`;
961
- }
962
- if (value === void 0) {
963
- return "[undefined]";
964
- }
965
- if (typeof value === "symbol") {
966
- return value.toString();
967
- }
968
- if (value !== null && typeof value === "object") {
969
- if (seen.has(value)) {
970
- return "[Circular]";
971
- }
972
- seen.add(value);
973
- }
974
- return value;
975
- };
976
- }
977
- function serializeLogRecord(record) {
978
- return JSON.stringify(record, createSafeReplacer());
979
- }
980
-
981
- // src/connectors/shared.ts
982
- function isBlypConfig(config) {
983
- return isPlainObject(config) && ("connectors" in config || "pretty" in config || "level" in config);
984
- }
985
- function getPrimaryPayload(record) {
986
- return isPlainObject(record.data) ? record.data : record;
987
- }
988
- function getField(record, key) {
989
- if (key in record) {
990
- const direct = record[key];
991
- if (typeof direct === "string" || typeof direct === "number") {
992
- return direct;
993
- }
994
- }
995
- const payload = getPrimaryPayload(record);
996
- const nested = payload[key];
997
- if (typeof nested === "string" || typeof nested === "number") {
998
- return nested;
999
- }
1000
- return void 0;
1001
- }
1002
- function getClientPageField(record, key) {
1003
- const payload = getPrimaryPayload(record);
1004
- const page = isPlainObject(payload.page) ? payload.page : void 0;
1005
- const value = page?.[key];
1006
- return typeof value === "string" ? value : void 0;
1007
- }
1008
- function getClientSessionField(record, key) {
1009
- const payload = getPrimaryPayload(record);
1010
- const session = isPlainObject(payload.session) ? payload.session : void 0;
1011
- const value = session?.[key];
1012
- return typeof value === "string" ? value : void 0;
1013
- }
1014
- function getRecordType(record) {
1015
- return getField(record, "type");
1016
- }
1017
-
1018
- // src/connectors/otlp/sender.ts
1019
- var warnedKeys2 = /* @__PURE__ */ new Set();
1020
- var testHooks = {};
1021
- var warnOnce2 = createErrorOnceLogger(warnedKeys2);
1022
- function normalizeOTLPRecord(record, connector, source = "server") {
1023
- const severity = resolveSeverity(record.level);
1024
- const body = typeof record.message === "string" ? record.message : String(record.message);
1025
- const recordType = getRecordType(record);
1026
- const caller = typeof record.caller === "string" ? record.caller : void 0;
1027
- const groupId = getField(record, "groupId");
1028
- const method = getField(record, "method");
1029
- const path = getField(record, "path");
1030
- const status = getField(record, "status");
1031
- const duration = getField(record, "duration");
1032
- const pagePath = getClientPageField(record, "pathname");
1033
- const pageUrl = getClientPageField(record, "url");
1034
- const sessionId = getClientSessionField(record, "sessionId");
1035
- const pageId = getClientSessionField(record, "pageId");
1036
- const attributes = {
1037
- "blyp.level": record.level,
1038
- "blyp.source": source,
1039
- "blyp.payload": serializeLogRecord(record)
1040
- };
1041
- const ifTruthy = [
1042
- ["blyp.type", recordType],
1043
- ["blyp.caller", caller],
1044
- ["blyp.group_id", groupId],
1045
- ["http.method", method],
1046
- ["url.path", path],
1047
- ["client.page_path", pagePath],
1048
- ["client.page_url", pageUrl],
1049
- ["client.session_id", sessionId],
1050
- ["client.page_id", pageId]
1051
- ];
1052
- const ifDefined = [
1053
- ["http.status_code", status],
1054
- ["blyp.duration_ms", duration]
1055
- ];
1056
- for (const [k, v] of ifTruthy) if (v) attributes[k] = v;
1057
- for (const [k, v] of ifDefined) if (v !== void 0) attributes[k] = v;
1058
- return {
1059
- body,
1060
- severityText: severity.text,
1061
- severityNumber: severity.number,
1062
- attributes,
1063
- resourceAttributes: {
1064
- "service.name": connector.serviceName
1065
- }
1066
- };
1067
- }
1068
- function resolveSeverity(level) {
1069
- switch (level) {
1070
- case "debug":
1071
- return { text: "debug", number: SeverityNumber.DEBUG };
1072
- case "warning":
1073
- case "warn":
1074
- return { text: "warn", number: SeverityNumber.WARN };
1075
- case "error":
1076
- return { text: "error", number: SeverityNumber.ERROR };
1077
- case "critical":
1078
- return { text: "fatal", number: SeverityNumber.FATAL };
1079
- case "success":
1080
- case "table":
1081
- case "info":
1082
- default:
1083
- return { text: "info", number: SeverityNumber.INFO };
1084
- }
1085
- }
1086
- function registerShutdownHooks(key, shutdown) {
1087
- const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
1088
- for (const event of handlers) {
1089
- process.once(event, async () => {
1090
- try {
1091
- await shutdown();
1092
- } catch (error) {
1093
- warnOnce2(
1094
- `${key}:shutdown`,
1095
- "[Blyp] Failed to flush OTLP logs during shutdown.",
1096
- error
1097
- );
1098
- }
1099
- if (event !== "beforeExit") {
1100
- process.exit(0);
1101
- }
1102
- });
1103
- }
1104
- }
1105
- function resolveTransportHeaders(connector) {
1106
- const headers = {
1107
- ...connector.headers ?? {}
1108
- };
1109
- if (headers.Authorization === void 0 && connector.auth) {
1110
- headers.Authorization = connector.auth;
1111
- }
1112
- return headers;
1113
- }
1114
- function createDefaultTransport(connector) {
1115
- const exporter = new OTLPLogExporter({
1116
- url: connector.endpoint,
1117
- headers: resolveTransportHeaders(connector)
1118
- });
1119
- const provider = new LoggerProvider({
1120
- resource: resourceFromAttributes({
1121
- "service.name": connector.serviceName
1122
- }),
1123
- processors: [new BatchLogRecordProcessor(exporter)]
1124
- });
1125
- const logger = provider.getLogger(`blyp-otlp:${connector.name}`);
1126
- return {
1127
- emit(payload) {
1128
- logger.emit({
1129
- body: payload.body,
1130
- severityText: payload.severityText,
1131
- severityNumber: payload.severityNumber,
1132
- attributes: payload.attributes
1133
- });
1134
- },
1135
- flush() {
1136
- return provider.forceFlush();
1137
- },
1138
- shutdown() {
1139
- return provider.shutdown();
1140
- }
1141
- };
1142
- }
1143
- function resolveConnectors(config) {
1144
- const connectors = isBlypConfig(config) ? config.connectors?.otlp ?? [] : config;
1145
- return connectors.map((connector) => {
1146
- const headers = {
1147
- ...connector.headers ?? {}
1148
- };
1149
- const enabled = connector.enabled ?? false;
1150
- const endpoint = connector.endpoint;
1151
- const explicitReady = "ready" in connector && typeof connector.ready === "boolean" ? connector.ready : void 0;
1152
- const ready = (explicitReady ?? (enabled && isAbsoluteHttpUrl(endpoint))) && isAbsoluteHttpUrl(endpoint);
1153
- return {
1154
- name: connector.name,
1155
- enabled,
1156
- mode: connector.mode ?? "auto",
1157
- endpoint,
1158
- headers,
1159
- auth: connector.auth,
1160
- serviceName: connector.serviceName ?? "blyp-app",
1161
- ready,
1162
- status: ready ? "enabled" : "missing"
1163
- };
1164
- });
1165
- }
1166
- function createUnavailableSender(name, connector) {
1167
- const senderName = name || connector?.name || "otlp";
1168
- const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
1169
- const emitUnavailableWarning = () => {
1170
- warnOnce2(
1171
- `otlp-unavailable:${key}`,
1172
- `[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
1173
- );
1174
- };
1175
- return {
1176
- name: senderName,
1177
- enabled: connector?.enabled ?? false,
1178
- ready: false,
1179
- mode: connector?.mode ?? "auto",
1180
- serviceName: connector?.serviceName ?? "blyp-app",
1181
- endpoint: connector?.endpoint,
1182
- status: "missing",
1183
- send(_record, options = {}) {
1184
- if (options.warnIfUnavailable) {
1185
- emitUnavailableWarning();
1186
- }
1187
- },
1188
- async flush() {
1189
- }
1190
- };
1191
- }
1192
- function createSender(connector) {
1193
- if (!connector.ready || !connector.endpoint) {
1194
- return createUnavailableSender(connector.name, connector);
1195
- }
1196
- const key = `${connector.name}:${connector.serviceName}:${connector.endpoint}:${connector.mode}`;
1197
- const transportConnector = {
1198
- ...connector,
1199
- headers: resolveTransportHeaders(connector)
1200
- };
1201
- const transport = testHooks.createTransport?.(transportConnector) ?? createDefaultTransport(transportConnector);
1202
- return {
1203
- name: connector.name,
1204
- enabled: connector.enabled,
1205
- ready: connector.ready,
1206
- mode: connector.mode,
1207
- serviceName: connector.serviceName,
1208
- endpoint: connector.endpoint,
1209
- status: connector.status,
1210
- send(record, options = {}) {
1211
- const source = options.source ?? "server";
1212
- const normalized = normalizeOTLPRecord(record, connector, source);
1213
- try {
1214
- const result = transport.emit(normalized);
1215
- if (result && typeof result.catch === "function") {
1216
- void result.catch((error) => {
1217
- warnOnce2(
1218
- `otlp-emit:${key}`,
1219
- `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
1220
- error
1221
- );
1222
- });
1223
- }
1224
- } catch (error) {
1225
- warnOnce2(
1226
- `otlp-emit:${key}`,
1227
- `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
1228
- error
1229
- );
1230
- }
1231
- },
1232
- async flush() {
1233
- try {
1234
- if (transport.flush) {
1235
- await transport.flush();
1236
- }
1237
- } catch (error) {
1238
- warnOnce2(
1239
- `otlp-flush:${key}`,
1240
- `[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
1241
- error
1242
- );
1243
- }
1244
- }
1245
- };
1246
- }
1247
- function createOTLPRegistry(config) {
1248
- const senders = /* @__PURE__ */ new Map();
1249
- for (const connector of resolveConnectors(config)) {
1250
- senders.set(connector.name, createSender(connector));
1251
- }
1252
- const registry = {
1253
- get(name) {
1254
- return senders.get(name) ?? createUnavailableSender(name);
1255
- },
1256
- getAutoForwardTargets() {
1257
- return Array.from(senders.values()).filter((sender) => sender.ready && sender.mode === "auto");
1258
- },
1259
- send(name, record, options = {}) {
1260
- const sender = senders.get(name) ?? createUnavailableSender(name);
1261
- sender.send(record, options);
1262
- },
1263
- async flush() {
1264
- await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
1265
- }
1266
- };
1267
- registerShutdownHooks("otlp-registry", () => registry.flush());
1268
- return registry;
1269
- }
1270
-
1271
- // src/connectors/otlp/index.ts
1272
- function resolveSender(config = { name: "" }) {
1273
- const registry = createOTLPRegistry(resolveConfig({
1274
- ...config.connectors ? { connectors: config.connectors } : {}
1275
- }));
1276
- return registry.get(config.name);
1277
- }
1278
- function createOTLPLoggerInstance(sender, bindings = {}) {
1279
- const writeRecord = (level, message, args) => {
1280
- sender.send(buildRecord(level, message, args, bindings), {
1281
- source: "server",
1282
- warnIfUnavailable: true
1283
- });
1284
- };
1285
- const writeStructured = (payload, message) => {
1286
- sender.send(
1287
- buildStructuredRecord(
1288
- resolveStructuredWriteLevel(payload.level),
1289
- message,
1290
- payload,
1291
- bindings
1292
- ),
1293
- {
1294
- source: "server",
1295
- warnIfUnavailable: true
1296
- }
1297
- );
1298
- };
1299
- return {
1300
- debug: (message, ...args) => {
1301
- writeRecord("debug", message, args);
1302
- },
1303
- info: (message, ...args) => {
1304
- writeRecord("info", message, args);
1305
- },
1306
- error: (message, ...args) => {
1307
- writeRecord("error", message, args);
1308
- },
1309
- warn: (message, ...args) => {
1310
- writeRecord("warn", message, args);
1311
- },
1312
- warning: (message, ...args) => {
1313
- writeRecord("warning", message, args);
1314
- },
1315
- success: (message, ...args) => {
1316
- writeRecord("success", message, args);
1317
- },
1318
- critical: (message, ...args) => {
1319
- writeRecord("critical", message, args);
1320
- },
1321
- table: (message, data) => {
1322
- writeRecord("table", message, data === void 0 ? [] : [data]);
1323
- },
1324
- flush: async () => {
1325
- },
1326
- shutdown: async () => {
1327
- },
1328
- createStructuredLog: (groupId, initial) => {
1329
- return createStructuredLog(groupId, {
1330
- initialFields: initial,
1331
- write: writeStructured
1332
- });
1333
- },
1334
- child: (childBindings) => {
1335
- return createOTLPLoggerInstance(sender, {
1336
- ...bindings,
1337
- ...childBindings
1338
- });
1339
- }
1340
- };
1341
- }
1342
- function createOtlpLogger(config = { name: "" }) {
1343
- return createOTLPLoggerInstance(resolveSender(config));
1344
- }
1345
- function createStructuredOtlpLogger(groupId, initial, config) {
1346
- const sender = resolveSender(config ?? { name: "" });
1347
- return createStructuredLog(groupId, {
1348
- initialFields: initial,
1349
- write: (payload, message) => {
1350
- sender.send(
1351
- buildStructuredRecord(
1352
- resolveStructuredWriteLevel(payload.level),
1353
- message,
1354
- payload,
1355
- {}
1356
- ),
1357
- {
1358
- source: "server",
1359
- warnIfUnavailable: true
1360
- }
1361
- );
1362
- }
1363
- });
1364
- }
1365
-
1366
- export { createOtlpLogger, createStructuredOtlpLogger };
1367
- //# sourceMappingURL=otlp.mjs.map
1368
- //# sourceMappingURL=otlp.mjs.map
1
+ import {existsSync,readFileSync,writeFileSync,appendFileSync}from'fs';import {createJiti}from'jiti';import je,{resolve,dirname}from'path';import Me from'os';import {z}from'zod';import {AsyncLocalStorage}from'async_hooks';import {SeverityNumber}from'@opentelemetry/api-logs';import {OTLPLogExporter}from'@opentelemetry/exporter-logs-otlp-http';import {resourceFromAttributes}from'@opentelemetry/resources';import {LoggerProvider,BatchLogRecordProcessor}from'@opentelemetry/sdk-logs';import'fflate';function oe(){return je.join(Me.homedir(),".blyp","queue.db")}function B(e){let t={name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let n=e;return n.cause!==void 0&&(t.cause=R(n.cause)),t}function R(e,t=new WeakSet){if(e instanceof Error)return B(e);if(typeof e=="function")return `[Function: ${e.name||"anonymous"}]`;if(typeof e=="symbol")return e.toString();if(e==null)return e;if(Array.isArray(e))return e.map(n=>R(n,t));if(typeof e=="object"){if(t.has(e))return "[Circular]";t.add(e);let n={};for(let[r,o]of Object.entries(e))n[r]=R(o,t);return t.delete(e),n}return e}function j(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message||e.name;let t=R(e);if(typeof t=="string")return t;try{return JSON.stringify(t,null,2)??String(t)}catch{return String(t)}}var qe=z.string().url().refine(e=>{try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return false}},{message:"Expected an absolute http(s) URL"}),ie=z.custom(e=>e!==null&&typeof e=="object"&&!Array.isArray(e),{message:"Expected a plain object"}),$=z.string().trim().min(1);function S(e){return qe.safeParse(e).success}function v(e){return ie.safeParse(e).success}function b(e){return $.safeParse(e).success}var H="/inngest";z.union([z.literal("betterstack"),z.literal("databuddy"),z.literal("posthog"),z.literal("sentry"),z.undefined(),z.object({type:z.literal("otlp"),name:$})]);function se(e,t=new Set){return (n,r,o)=>{if(t.has(n)||typeof console>"u")return;let i=console[e];if(typeof i=="function"){if(t.add(n),o===void 0){i.call(console,r);return}i.call(console,r,o);}}}function ae(e){return se("warn",e)}function ce(e){return se("error",e)}var $e="[REDACTED]",He=["password","passwd","pwd","secret","token","api_key","apikey","api_secret","authorization","auth","x-api-key","private_key","privatekey","access_token","refresh_token","client_secret","session","cookie","set-cookie","ssn","credit_card","card_number","cvv","cvc","otp","pin"];var Ue=[{type:"bearer",pattern:/\bBearer\s+(?:sk-[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{16,}|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+|[A-Za-z0-9._~+/-]{20,})\b/g},{type:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{type:"api_key",pattern:/\b(?:sk-[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{16,})\b/g}],We=/\b(?:\d[ -]*?){16}\b/g;function ue(e){let t=new Set,n=[];for(let r of e)typeof r!="string"||r.length===0||t.has(r)||(t.add(r),n.push(r));return n}function Ge(e){let t=e.flags.includes("g")?e.flags:`${e.flags}g`;return new RegExp(e.source,t)}function Qe(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Je(e){return new Set(e.keys.map(t=>t.toLowerCase()))}function Ve(e){return e.split(".").filter(Boolean)}function U(e,t,n=0,r=0){if(n===e.length)return r===t.length;let o=e[n];if(o==="**"){if(n===e.length-1)return true;for(let i=r;i<=t.length;i+=1)if(U(e,t,n+1,i))return true;return false}return r>=t.length||o!=="*"&&o!==t[r]?false:U(e,t,n+1,r+1)}function Ke(e,t){return e.length===0||t.paths.length===0?false:t.paths.some(n=>U(Ve(n),e))}function Ze(e){let t=e.replace(/\D/g,"");if(t.length!==16)return false;let n=0,r=false;for(let o=t.length-1;o>=0;o-=1){let i=Number(t[o]);r&&(i*=2,i>9&&(i-=9)),n+=i,r=!r;}return n%10===0}function le(e,t,n){if(n||t.disablePatternScanning)return e;let r=e;for(let{type:o,pattern:i}of Ue)r=r.replace(i,`[REDACTED:${o}]`);r=r.replace(We,o=>Ze(o)?"[REDACTED:card]":o);for(let o of t.patterns)r=r.replace(Ge(o),"[REDACTED:pattern]");return r}function A(e,t,n,r){if(typeof e=="string")return le(e,t,!!r.skipPatternScanning);if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map((i,a)=>A(i,t,n,{path:[...r.path,String(a)],skipPatternScanning:r.skipPatternScanning}));if(!Qe(e))return e;let o={};for(let[i,a]of Object.entries(e)){let s=[...r.path,i];if(n.has(i.toLowerCase())||Ke(s,t)){if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean"){o[i]=$e;continue}o[i]=A(a,t,n,{path:s,skipPatternScanning:r.skipPatternScanning});continue}o[i]=A(a,t,n,{path:s,skipPatternScanning:r.skipPatternScanning});}return o}function m(e,t){return {keys:ue([...He,...e?.keys??[],...t?.keys??[]]),paths:ue([...e?.paths??[],...t?.paths??[]]),patterns:[...e?.patterns??[],...t?.patterns??[]].filter(n=>n instanceof RegExp),disablePatternScanning:t?.disablePatternScanning??e?.disablePatternScanning??false}}function g(e,t,n={path:[]}){let r=R(e);return A(r,t,Je(t),n)}function D(e,t){return typeof e=="string"?le(e,t,false):j(g(e,t))}var tt="@blyp/core",nt=".gitignore",pe=["blyp.config.ts","blyp.config.mts","blyp.config.cts","blyp.config.js","blyp.config.mjs","blyp.config.cjs","blyp.config.json"],rt="blyp.config.json",ot="https://us.i.posthog.com",it="blyp-app",st=it,at=new Set,y=ae(at),me={enabled:true,maxSizeBytes:10*1024*1024,maxArchives:5,compress:true},ye={enabled:true,dir:"",archiveDir:"",format:"ndjson",rotation:me},W={enabled:true,path:H},Ce=m(),T={maxAttempts:8,initialBackoffMs:500,maxBackoffMs:3e4,multiplier:2,jitter:true},f={enabled:false,memoryBufferSize:500,durableQueuePath:oe(),durableSpillStrategy:"after-first-failure",memoryBatchSize:25,sqliteWriteBatchSize:100,sqliteReadBatchSize:50,dispatchConcurrency:4,pollIntervalMs:1e3,overflowStrategy:"drop-oldest",retry:T},he={maxRetries:1,backoffMs:100},ct={strategy:"immediate",batchSize:1,flushIntervalMs:250,maxQueueSize:1e3,overflowStrategy:"drop-oldest",flushTimeoutMs:5e3,retry:he},ge={pretty:true,level:"info",destination:"file",file:ye,clientLogging:W,redact:Ce,connectors:{delivery:f}},P=null;function ut(e){let t=e;for(;;){let n=resolve(t,"package.json");if(existsSync(n))try{let o=JSON.parse(readFileSync(n,"utf-8"));if(b(o.name))return o.name}catch{}let r=dirname(t);if(r===t)return;t=r;}}function Q(e=process.cwd()){return ut(e)??st}function lt(){return {pretty:true,level:"info",destination:"file",file:{enabled:true,format:"ndjson",rotation:{enabled:true,maxSizeBytes:10*1024*1024,maxArchives:5,compress:true}},clientLogging:{enabled:true,path:H},redact:Ce,connectors:{delivery:f}}}function gt(e){let t=resolve(e,"package.json");if(!existsSync(t))return true;try{return JSON.parse(readFileSync(t,"utf-8")).name!==tt}catch{return true}}function dt(e){if(pe.some(n=>existsSync(resolve(e,n))))return;let t=resolve(e,rt);if(!existsSync(t))try{writeFileSync(t,`${JSON.stringify(lt(),null,2)}
2
+ `);}catch(n){console.error("[Blyp] Warning: Failed to create blyp.config.json:",n);}}function ft(e){let t=resolve(e,nt);if(!existsSync(t)){try{writeFileSync(t,`logs
3
+ .blyp
4
+ `);}catch(n){console.error("[Blyp] Warning: Failed to create .gitignore:",n);}return}try{let n=readFileSync(t,"utf-8"),r=["logs",".blyp"].filter(i=>{let a=i.replace(".","\\.");return !new RegExp(`^(?:/?${a}/?)\\s*$`,"m").test(n)});if(r.length===0)return;let o=n.endsWith(`
5
+ `)?"":`
6
+ `;appendFileSync(t,`${o}${r.join(`
7
+ `)}
8
+ `);}catch(n){console.error("[Blyp] Warning: Failed to update .gitignore:",n);}}function pt(){let e=process.cwd();gt(e)&&(dt(e),ft(e));}function mt(){let e=process.cwd(),t=pe.map(r=>resolve(e,r)).filter(r=>existsSync(r));if(t.length===0)return null;if(t.length>1){let r=t[0];y(`config-multiple:${r}`,`[Blyp] Warning: Multiple config files found. Using ${r} and ignoring ${t.slice(1).join(", ")}.`);}let n=t[0];return {path:n,type:n.endsWith(".json")?"json":"jiti"}}function Re(e,t){let n=e&&typeof e=="object"&&"default"in e&&e.default!==void 0?e.default:e;return !n||typeof n!="object"||Array.isArray(n)?(y(`config-invalid:${t}`,`[Blyp] Warning: Config file ${t} did not export an object. Falling back to defaults.`),{}):n}function yt(e){try{let t=readFileSync(e,"utf-8");return Re(JSON.parse(t),e)}catch(t){return console.error("[Blyp] Warning: Failed to parse blyp.config.json:",t),{}}}function Ct(e){try{let t=createJiti(process.cwd(),{interopDefault:!0,moduleCache:!1,fsCache:!1});return Re(t(e),e)}catch(t){return console.error(`[Blyp] Warning: Failed to load ${e}:`,t),{}}}function ht(e){return e.type==="json"?yt(e.path):Ct(e.path)}function de(e){return !!e&&typeof e=="object"&&e.type==="prisma"}function Rt(e){return !!e&&typeof e=="object"&&e.type==="drizzle"}function bt(e,t){return {...he,...e,...t}}function Lt(e,t){return {...ct,...e,...t,retry:bt(e?.retry,t?.retry)}}function St(e){let t=e.model??"blypLog",r=e.client?.[t];return !!r&&typeof r.create=="function"}function vt(e){let t=e.db;return !!t&&typeof t.insert=="function"&&e.table!==void 0}function Tt(e,t){if(!e)return;let n=e.adapter,r=false;t==="json"?y("database-json-config","[Blyp] Warning: Database logging requires an executable blyp config file. Database destination remains disabled until you move this config to blyp.config.ts/js."):e.dialect!=="postgres"&&e.dialect!=="mysql"?y(`database-dialect:${String(e.dialect)}`,`[Blyp] Warning: Unsupported database dialect "${String(e.dialect)}". Database logging is disabled.`):n?de(n)?(r=St({...n,model:n.model??"blypLog"}),r||y("database-prisma-missing",`[Blyp] Warning: Prisma database adapter is missing the "${n.model??"blypLog"}" delegate or its create method. Database logging is disabled.`)):Rt(n)&&(r=vt(n),r||y("database-drizzle-missing","[Blyp] Warning: Drizzle database adapter is missing a db.insert function or table reference. Database logging is disabled.")):y("database-adapter-missing","[Blyp] Warning: Database logging is enabled without an adapter. Database logging is disabled.");let o=de(n)?{...n,model:n.model??"blypLog"}:n;return {dialect:e.dialect,adapter:o,delivery:Lt(void 0,e.delivery),ready:r,status:r?"enabled":"missing"}}function kt(e,t){return {...me,...e,...t}}function wt(e,t){return {...ye,...e,...t,rotation:kt(e?.rotation,t?.rotation)}}function xt(e,t){return {...W,...e,...t,path:t?.path??e?.path??W.path}}function Dt(e,t){return m(e,t)}function Pt(e,t){return {maxAttempts:Math.max(1,Math.floor(t?.maxAttempts??e?.maxAttempts??T.maxAttempts)),initialBackoffMs:Math.max(0,Math.floor(t?.initialBackoffMs??e?.initialBackoffMs??T.initialBackoffMs)),maxBackoffMs:Math.max(0,Math.floor(t?.maxBackoffMs??e?.maxBackoffMs??T.maxBackoffMs)),multiplier:Math.max(1,t?.multiplier??e?.multiplier??T.multiplier),jitter:t?.jitter??e?.jitter??T.jitter}}function Et(e,t){let n=t?.durableQueuePath??e?.durableQueuePath??f.durableQueuePath;return {enabled:t?.enabled??e?.enabled??f.enabled,memoryBufferSize:Math.max(1,Math.floor(t?.memoryBufferSize??e?.memoryBufferSize??f.memoryBufferSize)),durableQueuePath:b(n)?n:f.durableQueuePath,durableSpillStrategy:t?.durableSpillStrategy??e?.durableSpillStrategy??f.durableSpillStrategy,memoryBatchSize:Math.max(1,Math.floor(t?.memoryBatchSize??e?.memoryBatchSize??f.memoryBatchSize)),sqliteWriteBatchSize:Math.max(1,Math.floor(t?.sqliteWriteBatchSize??e?.sqliteWriteBatchSize??f.sqliteWriteBatchSize)),sqliteReadBatchSize:Math.max(1,Math.floor(t?.sqliteReadBatchSize??e?.sqliteReadBatchSize??f.sqliteReadBatchSize)),dispatchConcurrency:Math.max(1,Math.floor(t?.dispatchConcurrency??e?.dispatchConcurrency??f.dispatchConcurrency)),pollIntervalMs:Math.max(50,Math.floor(t?.pollIntervalMs??e?.pollIntervalMs??f.pollIntervalMs)),overflowStrategy:t?.overflowStrategy??e?.overflowStrategy??f.overflowStrategy,retry:Pt(e?.retry,t?.retry),durableReady:false}}function Ot(e,t,n){if(!(!e&&!t))return Tt({dialect:t?.dialect??e?.dialect,adapter:t?.adapter??e?.adapter,delivery:{...e?.delivery??{},...t?.delivery??{},retry:{...e?.delivery?.retry??{},...t?.delivery?.retry??{}}}},n)}function Bt(e,t){let n=t?.enabled??e?.enabled??false,r=t?.projectKey??e?.projectKey,o=e?.enabled===true?e?.errorTracking:void 0,i=t?.errorTracking?.mode??o?.mode??"auto",a=t?.errorTracking?.enabled??o?.enabled??n,s=n&&a&&typeof r=="string"&&r.trim().length>0;return {enabled:n,mode:t?.mode??e?.mode??"auto",projectKey:r,host:t?.host??e?.host??ot,serviceName:t?.serviceName??e?.serviceName??Q(),errorTracking:{enabled:a,mode:i,enableExceptionAutocapture:t?.errorTracking?.enableExceptionAutocapture??o?.enableExceptionAutocapture??i==="auto",ready:s,status:s?"enabled":"missing"}}}function At(e,t){let n=t?.enabled??e?.enabled??false,r=t?.apiKey??e?.apiKey,o=t?.websiteId??e?.websiteId,i=n&&b(r)&&b(o);return {enabled:n,mode:t?.mode??e?.mode??"auto",apiKey:r,websiteId:o,namespace:t?.namespace??e?.namespace,source:t?.source??e?.source,apiUrl:t?.apiUrl??e?.apiUrl,debug:t?.debug??e?.debug??false,enableBatching:t?.enableBatching??e?.enableBatching??true,batchSize:t?.batchSize??e?.batchSize,batchTimeout:t?.batchTimeout??e?.batchTimeout,maxQueueSize:t?.maxQueueSize??e?.maxQueueSize,ready:i,status:i?"enabled":"missing"}}function zt(e,t){let n=t?.sourceToken??e?.sourceToken,r=t?.ingestingHost??e?.ingestingHost,o=t?.enabled??e?.enabled??false,i=e?.enabled===true?e?.errorTracking:void 0,a=Ft(o,i,t?.errorTracking),s=o&&b(n)&&S(r);return {enabled:o,mode:t?.mode??e?.mode??"auto",sourceToken:n,ingestingHost:r,serviceName:t?.serviceName??e?.serviceName??Q(),errorTracking:a,ready:s,status:s?"enabled":"missing"}}function Ft(e,t,n){let r=n?.dsn??t?.dsn,o=n?.enabled??t?.enabled??e,i=o&&b(r);return {enabled:o,dsn:r,tracesSampleRate:n?.tracesSampleRate??t?.tracesSampleRate??1,environment:n?.environment??t?.environment,release:n?.release??t?.release,ready:i,status:i?"enabled":"missing"}}function Nt(e,t){let n=t?.dsn??e?.dsn,r=t?.enabled??e?.enabled??false,o=r&&typeof n=="string"&&n.trim().length>0;return {enabled:r,mode:t?.mode??e?.mode??"auto",dsn:n,environment:t?.environment??e?.environment,release:t?.release??e?.release,ready:o,status:o?"enabled":"missing"}}function _t(e,t){let n=t?.endpoint??e?.endpoint,r=t?.enabled??e?.enabled??false,o={...{},...t?.headers??{}},i=r&&S(n);return {name:t?.name??e?.name??"",enabled:r,mode:t?.mode??e?.mode??"auto",endpoint:n,headers:o,auth:t?.auth??e?.auth,serviceName:t?.serviceName??e?.serviceName??Q(),ready:i,status:i?"enabled":"missing"}}function It(e,t){let n=t??e??[],r=new Map;for(let o of n)!o||typeof o.name!="string"||o.name.length===0||(r.has(o.name)&&y(`otlp-duplicate:${o.name}`,`[Blyp] Warning: Duplicate OTLP connector name "${o.name}" found. Using the last definition.`),r.set(o.name,_t(void 0,o)));return Array.from(r.values())}function Mt(e,t){return {betterstack:zt(e?.betterstack,t?.betterstack),databuddy:At(e?.databuddy,t?.databuddy),posthog:Bt(e?.posthog,t?.posthog),sentry:Nt(e?.sentry,t?.sentry),otlp:It(e?.otlp,t?.otlp),delivery:Et(e?.delivery,t?.delivery)}}function G(e,t={},n={}){return {...e,...t,destination:t.destination??e.destination??"file",file:wt(e.file,t.file),database:Ot(e.database,t.database,n.configFileType),clientLogging:xt(e.clientLogging,t.clientLogging),redact:Dt(e.redact,t.redact),connectors:Mt(e.connectors,t.connectors)}}function jt(){if(P!==null)return P;pt();let e=mt();if(e){let t=ht(e);P=G(ge,t,{configFileType:e.type});}else P=G(ge);return P}function be(e={}){return G(jt(),e)}var $t=new AsyncLocalStorage;function Ht(){return $t.getStore()}function J(){return Ht()?.traceId}var Le={success:"success",critical:"critical",warning:"warning",info:"info",debug:"debug",error:"error",warn:"warning",table:"table"};function F(e){return e.replace(/\\/g,"/")}function Ut(e){let t=F(e);return t.startsWith("node:")||t.includes("/node_modules/pino")||t.includes("/node_modules/pino-pretty")||t.includes("/node_modules/@blyp/core/")||t.includes("/blyp/src/core/")||t.includes("/blyp/src/frameworks/")||t.includes("/blyp/src/posthog/")||t.includes("/blyp/dist/")}function Wt(e){let t=F(e),n=F(process.cwd());return t.startsWith(`${n}/`)?t.slice(n.length+1):t}function Se(){try{let e=new Error().stack;if(!e)return {file:null,line:null};let t=e.split(`
9
+ `),n=null;for(let r=2;r<t.length;r+=1){let o=t[r];if(!o)continue;let i=o.match(/\((.*):(\d+):\d+\)/)||o.match(/at\s+(.*):(\d+):(\d+)/);if(!i)continue;let a=i[1]||"",s=parseInt(i[2]||"0",10)||null;if(a&&!a.includes("node_modules")&&!Ut(a)){let u=Wt(a);if(!F(u).startsWith("dist/"))return {file:u,line:s};n??(n={file:u,line:s});}}if(n)return n}catch{return {file:null,line:null}}return {file:null,line:null}}var ve=D;function Te(e){return e.replace(/\u001b\[[0-9;]*m/g,"")}function ke(e,t,n,r,o=m()){let{file:i,line:a}=Se(),s=ve(t,o),u={timestamp:new Date().toISOString(),level:Le[e],message:Te(s)},c=J();return t instanceof Error&&(u.error=g(B(t),o)),i&&(u.caller=a!==null?`${i}:${a}`:i),n.length===1?u.data=g(n[0],o):n.length>1&&(u.data=g(n,o)),Object.keys(r).length>0&&(u.bindings=g(r,o)),c&&(u.traceId=c),u}function V(e,t,n,r,o=m()){let{file:i,line:a}=Se(),s=g(n,o),u=J(),c={message:Te(ve(t,o)),...s};return i&&(c.caller=a!==null?`${i}:${a}`:i),Object.keys(r).length>0&&(c.bindings=g(r,o)),u&&c.traceId===void 0&&(c.traceId=u),c.level=typeof s.level=="string"&&s.level.length>0?s.level:Le[e],c.timestamp=typeof s.timestamp=="string"&&s.timestamp.length>0?s.timestamp:new Date().toISOString(),c}function K(e){switch(e){case "debug":return "debug";case "warning":return "warning";case "warn":return "warn";case "error":return "error";case "success":return "success";case "critical":return "critical";case "table":return "table";default:return "info"}}function we(e,t){if(typeof e=="string")return t.length===0?void 0:t.length===1?t[0]:t;let n=[e,...t];return n.length===1?n[0]:n}function xe(e){if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function Gt(e,t){if(e==null)return t===void 0||t<400?void 0:{message:`HTTP ${t}`,code:t,type:"HttpError"};if(e instanceof Error){let n=e;return {message:e.message,code:n.code,type:n.type??e.name??e.constructor?.name,stack:e.stack,why:n.why,fix:n.fix,link:n.link,details:xe(n.details),cause:n.cause}}if(typeof e=="object"){let n=e,r=typeof n.statusCode=="number"?n.statusCode:typeof n.status=="number"?n.status:t;return {message:typeof n.message=="string"?n.message:`HTTP ${r??500}`,code:typeof n.code=="string"||typeof n.code=="number"?n.code:r,type:typeof n.type=="string"?n.type:typeof n.name=="string"?n.name:"Error",stack:typeof n.stack=="string"?n.stack:void 0,why:typeof n.why=="string"?n.why:void 0,fix:typeof n.fix=="string"?n.fix:void 0,link:typeof n.link=="string"?n.link:void 0,details:xe(n.details),cause:n.cause}}return {message:String(e),code:t,type:typeof e}}function Qt(e){return e.response&&typeof e.response.status=="number"?e.response.status:typeof e.status=="number"?e.status:e.error&&typeof e.error=="object"&&e.error!==null&&typeof e.error.statusCode=="number"?e.error.statusCode:e.error&&typeof e.error=="object"&&e.error!==null&&typeof e.error.status=="number"?e.error.status:e.error?500:void 0}function Z(e,t){let n=t.redact??m(),r=performance.now(),o=g(t.initialFields??{},n),i=[],a;t.onCreate?.();let s=(c,l,d)=>(i.push({level:c,message:D(l,n),timestamp:new Date().toISOString(),...we(l,d)===void 0?{}:{data:g(we(l,d),n)}}),u),u={set(c){return Object.assign(o,g(c,n)),u},debug(c,...l){return s("debug",c,l)},info(c,...l){return s("info",c,l)},warn(c,...l){return s("warn",c,l)},warning(c,...l){return s("warning",c,l)},error(c,...l){return s("error",c,l)},success(c,...l){return s("success",c,l)},critical(c,...l){return s("critical",c,l)},table(c,l){return s("table",c,l===void 0?[]:[l])},emit(c={}){if(a)return a;let l=g(t.resolveDefaultFields?.()??{},n),d=Qt(c),h=g(Gt(c.error,d),n),_=c.level??(h?"error":"info"),L=g({...l,...o,groupId:e,timestamp:new Date().toISOString(),level:_,duration:Math.round(performance.now()-r),...typeof d=="number"?{status:d}:{},...i.length>0?{events:[...i]}:{},...h?{error:h}:{}},n);return t.write(L,D(c.message??"structured_log",n)),a=L,t.onEmit?.(L),L}};return u}function Jt(){let e=new WeakSet;return (t,n)=>{if(typeof n=="function")return `[Function: ${n.name||"anonymous"}]`;if(n===void 0)return "[undefined]";if(typeof n=="symbol")return n.toString();if(n!==null&&typeof n=="object"){if(e.has(n))return "[Circular]";e.add(n);}return n}}function De(e){return JSON.stringify(e,Jt())}var N=Symbol("blyp.connector.batch-dispatch"),Y=Symbol("blyp.connector.delivery-binder");function Pe(e){return v(e)&&("connectors"in e||"pretty"in e||"level"in e)}function X(e){return v(e.data)?e.data:e}function C(e,t){if(t in e){let o=e[t];if(typeof o=="string"||typeof o=="number")return o}let r=X(e)[t];if(typeof r=="string"||typeof r=="number")return r}function ee(e,t){let n=X(e),o=(v(n.page)?n.page:void 0)?.[t];return typeof o=="string"?o:void 0}function te(e,t){let n=X(e),o=(v(n.session)?n.session:void 0)?.[t];return typeof o=="string"?o:void 0}function Ee(e){return C(e,"type")}var Xt=new Set,en={},O=ce(Xt);function ne(e,t,n="server"){let r=tn(e.level),o=typeof e.message=="string"?e.message:String(e.message),i=Ee(e),a=typeof e.caller=="string"?e.caller:void 0,s=C(e,"groupId"),u=C(e,"traceId"),c=C(e,"method"),l=C(e,"path"),d=C(e,"status"),h=C(e,"duration"),_=ee(e,"pathname"),L=ee(e,"url"),Fe=te(e,"sessionId"),Ne=te(e,"pageId"),I={"blyp.level":e.level,"blyp.source":n,"blyp.payload":De(e)},_e=[["blyp.type",i],["blyp.caller",a],["blyp.group_id",s],["blyp.trace_id",u],["http.method",c],["url.path",l],["client.page_path",_],["client.page_url",L],["client.session_id",Fe],["client.page_id",Ne]],Ie=[["http.status_code",d],["blyp.duration_ms",h]];for(let[M,x]of _e)x&&(I[M]=x);for(let[M,x]of Ie)x!==void 0&&(I[M]=x);return {body:o,severityText:r.text,severityNumber:r.number,attributes:I,resourceAttributes:{"service.name":t.serviceName}}}function tn(e){switch(e){case "debug":return {text:"debug",number:SeverityNumber.DEBUG};case "warning":case "warn":return {text:"warn",number:SeverityNumber.WARN};case "error":return {text:"error",number:SeverityNumber.ERROR};case "critical":return {text:"fatal",number:SeverityNumber.FATAL};default:return {text:"info",number:SeverityNumber.INFO}}}function nn(e,t){let n=["beforeExit","SIGINT","SIGTERM"];for(let r of n)process.once(r,async()=>{try{await t();}catch(o){O(`${e}:shutdown`,"[Blyp] Failed to flush OTLP logs during shutdown.",o);}r!=="beforeExit"&&process.exit(0);});}function Oe(e){let t={...e.headers??{}};return t.Authorization===void 0&&e.auth&&(t.Authorization=e.auth),t}function rn(e){let t=new OTLPLogExporter({url:e.endpoint,headers:Oe(e)}),n=new LoggerProvider({resource:resourceFromAttributes({"service.name":e.serviceName}),processors:[new BatchLogRecordProcessor(t)]}),r=n.getLogger(`blyp-otlp:${e.name}`);return {emit(o){r.emit({body:o.body,severityText:o.severityText,severityNumber:o.severityNumber,attributes:o.attributes});},flush(){return n.forceFlush()},shutdown(){return n.shutdown()}}}function on(e){return (Pe(e)?e.connectors?.otlp??[]:e).map(n=>{let r={...n.headers??{}},o=n.enabled??false,i=n.endpoint,s=(("ready"in n&&typeof n.ready=="boolean"?n.ready:void 0)??(o&&S(i)))&&S(i);return {name:n.name,enabled:o,mode:n.mode??"auto",endpoint:i,headers:r,auth:n.auth,serviceName:n.serviceName??"blyp-app",ready:s,status:s?"enabled":"missing"}})}function re(e,t){let n=e||t?.name||"otlp",r=`${n}:${t?.serviceName??"blyp-app"}:${t?.endpoint??"missing"}`,o=()=>{O(`otlp-unavailable:${r}`,`[Blyp] OTLP target "${n}" is not configured or not ready. Skipping OTLP delivery.`);};return {name:n,enabled:t?.enabled??false,ready:false,mode:t?.mode??"auto",serviceName:t?.serviceName??"blyp-app",endpoint:t?.endpoint,status:"missing",send(a,s={}){s.warnIfUnavailable&&o();},async flush(){},[N]:{dispatchKey:`otlp:${n}`,dispatch:async()=>({ok:false,retryable:false,error:`OTLP target "${n}" is unavailable.`})},[Y](a){}}}function sn(e){if(!e.ready||!e.endpoint)return re(e.name,e);let t=`${e.name}:${e.serviceName}:${e.endpoint}:${e.mode}`,n={...e,headers:Oe(e)},r=en.createTransport?.(n)??rn(n),o=null,i=async s=>{try{return await Promise.all(s.map(u=>Promise.resolve(r.emit(ne(u,e,"server"))))),r.flush&&await r.flush(),{ok:!0}}catch(u){return {ok:false,retryable:true,error:u instanceof Error?u.message:String(u)}}},a={name:e.name,enabled:e.enabled,ready:e.ready,mode:e.mode,serviceName:e.serviceName,endpoint:e.endpoint,status:e.status,send(s,u={}){if((u.source??"server")!=="client"&&o){o.enqueue("otlp",s,a[N],e.name);return}let c=u.source??"server",l=ne(s,e,c);try{let d=r.emit(l);d&&typeof d.catch=="function"&&d.catch(h=>{O(`otlp-emit:${t}`,`[Blyp] Failed to deliver log to OTLP target "${e.name}".`,h);});}catch(d){O(`otlp-emit:${t}`,`[Blyp] Failed to deliver log to OTLP target "${e.name}".`,d);}},async flush(){try{r.flush&&await r.flush();}catch(s){O(`otlp-flush:${t}`,`[Blyp] Failed to flush OTLP logs for target "${e.name}".`,s);}},[N]:{dispatchKey:`otlp:${e.name}`,dispatch:s=>i(s)},[Y](s){o=s;}};return a}function Be(e){let t=new Map;for(let r of on(e))t.set(r.name,sn(r));let n={get(r){return t.get(r)??re(r)},getAutoForwardTargets(){return Array.from(t.values()).filter(r=>r.ready&&r.mode==="auto")},send(r,o,i={}){(t.get(r)??re(r)).send(o,i);},async flush(){await Promise.all(Array.from(t.values()).map(r=>r.flush()));}};return nn("otlp-registry",()=>n.flush()),n}function Ae(e={name:""}){return Be(be({...e.connectors?{connectors:e.connectors}:{}})).get(e.name)}function ze(e,t={}){let n=(o,i,a)=>{e.send(ke(o,i,a,t),{source:"server",warnIfUnavailable:true});},r=(o,i)=>{e.send(V(K(o.level),i,o,t),{source:"server",warnIfUnavailable:true});};return {debug:(o,...i)=>{n("debug",o,i);},info:(o,...i)=>{n("info",o,i);},error:(o,...i)=>{n("error",o,i);},warn:(o,...i)=>{n("warn",o,i);},warning:(o,...i)=>{n("warning",o,i);},success:(o,...i)=>{n("success",o,i);},critical:(o,...i)=>{n("critical",o,i);},table:(o,i)=>{n("table",o,i===void 0?[]:[i]);},flush:async()=>{},shutdown:async()=>{},createStructuredLog:(o,i)=>Z(o,{initialFields:i,write:r}),child:o=>ze(e,{...t,...o})}}function cr(e={name:""}){return ze(Ae(e))}function ur(e,t,n){let r=Ae(n??{name:""});return Z(e,{initialFields:t,write:(o,i)=>{r.send(V(K(o.level),i,o,{}),{source:"server",warnIfUnavailable:true});}})}export{cr as createOtlpLogger,ur as createStructuredOtlpLogger,ne as normalizeOTLPRecord};