@kopai/sqlite-datasource 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/dist/index.cjs +1126 -0
- package/dist/index.d.cts +32 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +32 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1126 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["kyselySql","sql","openetelemetryTablesSchemaDdl"],"sources":["../src/sqlite-datasource-error.ts","../src/datasource.ts","../src/sqlite-opentelemetry-ddl.ts","../src/initialize-database.ts"],"sourcesContent":["export abstract class SqliteDatasourceError extends Error {\n abstract readonly code: string;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class SqliteDatasourceQueryError extends SqliteDatasourceError {\n readonly code = \"QUERY_ERROR\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n }\n}\n","import { DatabaseSync } from \"node:sqlite\";\nimport {\n DummyDriver,\n Kysely,\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n sql as kyselySql,\n type Insertable,\n} from \"kysely\";\n\nimport {\n otlp,\n type datasource,\n type otlpMetrics,\n type dataFilterSchemas,\n type denormalizedSignals,\n} from \"@kopai/core\";\nimport { SqliteDatasourceQueryError } from \"./sqlite-datasource-error.js\";\n\nimport type {\n DB,\n OtelMetricsGauge,\n OtelMetricsSum,\n OtelMetricsHistogram,\n OtelMetricsExponentialHistogram,\n OtelMetricsSummary,\n OtelTraces,\n OtelLogs,\n} from \"./db-types.js\";\n\nconst queryBuilder = new Kysely<DB>({\n dialect: {\n createAdapter: () => new SqliteAdapter(),\n createDriver: () => new DummyDriver(),\n createIntrospector: (db) => new SqliteIntrospector(db),\n createQueryCompiler: () => new SqliteQueryCompiler(),\n },\n});\n\nexport class NodeSqliteTelemetryDatasource\n implements datasource.TelemetryDatasource\n{\n constructor(private sqliteConnection: DatabaseSync) {}\n\n async writeMetrics(\n metricsData: datasource.MetricsData\n ): Promise<datasource.MetricsPartialSuccess> {\n const gaugeRows: Insertable<OtelMetricsGauge>[] = [];\n const sumRows: Insertable<OtelMetricsSum>[] = [];\n const histogramRows: Insertable<OtelMetricsHistogram>[] = [];\n const expHistogramRows: Insertable<OtelMetricsExponentialHistogram>[] = [];\n const summaryRows: Insertable<OtelMetricsSummary>[] = [];\n\n for (const resourceMetric of metricsData.resourceMetrics ?? []) {\n const { resource, schemaUrl: resourceSchemaUrl } = resourceMetric;\n\n for (const scopeMetric of resourceMetric.scopeMetrics ?? []) {\n const { scope, schemaUrl: scopeSchemaUrl } = scopeMetric;\n\n for (const metric of scopeMetric.metrics ?? []) {\n if (metric.gauge) {\n for (const dataPoint of metric.gauge.dataPoints ?? []) {\n gaugeRows.push(\n toGaugeRow(\n resource,\n resourceSchemaUrl,\n scope,\n scopeSchemaUrl,\n metric,\n dataPoint\n )\n );\n }\n }\n if (metric.sum) {\n for (const dataPoint of metric.sum.dataPoints ?? []) {\n sumRows.push(\n toSumRow(\n resource,\n resourceSchemaUrl,\n scope,\n scopeSchemaUrl,\n metric,\n dataPoint,\n metric.sum.aggregationTemporality,\n metric.sum.isMonotonic\n )\n );\n }\n }\n if (metric.histogram) {\n for (const dataPoint of metric.histogram.dataPoints ?? []) {\n histogramRows.push(\n toHistogramRow(\n resource,\n resourceSchemaUrl,\n scope,\n scopeSchemaUrl,\n metric,\n dataPoint,\n metric.histogram.aggregationTemporality\n )\n );\n }\n }\n if (metric.exponentialHistogram) {\n for (const dataPoint of metric.exponentialHistogram.dataPoints ??\n []) {\n expHistogramRows.push(\n toExpHistogramRow(\n resource,\n resourceSchemaUrl,\n scope,\n scopeSchemaUrl,\n metric,\n dataPoint,\n metric.exponentialHistogram.aggregationTemporality\n )\n );\n }\n }\n if (metric.summary) {\n for (const dataPoint of metric.summary.dataPoints ?? []) {\n summaryRows.push(\n toSummaryRow(\n resource,\n resourceSchemaUrl,\n scope,\n scopeSchemaUrl,\n metric,\n dataPoint\n )\n );\n }\n }\n }\n }\n\n for (const { table, rows } of [\n { table: \"otel_metrics_gauge\", rows: gaugeRows },\n { table: \"otel_metrics_sum\", rows: sumRows },\n { table: \"otel_metrics_histogram\", rows: histogramRows },\n { table: \"otel_metrics_exponential_histogram\", rows: expHistogramRows },\n { table: \"otel_metrics_summary\", rows: summaryRows },\n ] as const) {\n for (const row of rows) {\n const { sql, parameters } = queryBuilder\n .insertInto(table)\n .values(row)\n .compile();\n this.sqliteConnection\n .prepare(sql)\n .run(...(parameters as (string | number | bigint | null)[]));\n }\n }\n }\n\n return { rejectedDataPoints: \"\" };\n }\n\n async writeTraces(\n tracesData: datasource.TracesData\n ): Promise<datasource.TracesPartialSuccess> {\n const spanRows: Insertable<OtelTraces>[] = [];\n const traceTimestamps = new Map<string, { min: bigint; max: bigint }>();\n\n for (const resourceSpan of tracesData.resourceSpans ?? []) {\n const { resource } = resourceSpan;\n\n for (const scopeSpan of resourceSpan.scopeSpans ?? []) {\n const { scope } = scopeSpan;\n\n for (const span of scopeSpan.spans ?? []) {\n const row = toSpanRow(resource, scope, span);\n spanRows.push(row);\n\n // Track min/max timestamps per traceId\n const traceId = span.traceId ?? \"\";\n if (traceId) {\n const timestamp = row.Timestamp;\n const existing = traceTimestamps.get(traceId);\n if (existing) {\n existing.min =\n timestamp < existing.min ? timestamp : existing.min;\n existing.max =\n timestamp > existing.max ? timestamp : existing.max;\n } else {\n traceTimestamps.set(traceId, { min: timestamp, max: timestamp });\n }\n }\n }\n }\n }\n\n // Insert span rows\n for (const row of spanRows) {\n const { sql, parameters } = queryBuilder\n .insertInto(\"otel_traces\")\n .values(row)\n .compile();\n this.sqliteConnection\n .prepare(sql)\n .run(...(parameters as (string | number | bigint | null)[]));\n }\n\n // Upsert trace_id_ts lookup table\n for (const [traceId, { min, max }] of traceTimestamps) {\n const { sql, parameters } = queryBuilder\n .insertInto(\"otel_traces_trace_id_ts\")\n .values({ TraceId: traceId, Start: min, End: max })\n .onConflict((oc) =>\n oc.column(\"TraceId\").doUpdateSet({\n Start: (eb) =>\n eb.fn(\"min\", [\n eb.ref(\"otel_traces_trace_id_ts.Start\"),\n eb.val(min),\n ]),\n End: (eb) =>\n eb.fn(\"max\", [\n eb.ref(\"otel_traces_trace_id_ts.End\"),\n eb.val(max),\n ]),\n })\n )\n .compile();\n this.sqliteConnection\n .prepare(sql)\n .run(...(parameters as (string | number | bigint | null)[]));\n }\n\n return { rejectedSpans: \"\" };\n }\n\n async writeLogs(\n logsData: datasource.LogsData\n ): Promise<datasource.LogsPartialSuccess> {\n const logRows: Insertable<OtelLogs>[] = [];\n\n for (const resourceLog of logsData.resourceLogs ?? []) {\n const { resource, schemaUrl: resourceSchemaUrl } = resourceLog;\n\n for (const scopeLog of resourceLog.scopeLogs ?? []) {\n const { scope, schemaUrl: scopeSchemaUrl } = scopeLog;\n\n for (const logRecord of scopeLog.logRecords ?? []) {\n logRows.push(\n toLogRow(\n resource,\n resourceSchemaUrl,\n scope,\n scopeSchemaUrl,\n logRecord\n )\n );\n }\n }\n }\n\n for (const row of logRows) {\n const { sql, parameters } = queryBuilder\n .insertInto(\"otel_logs\")\n .values(row)\n .compile();\n this.sqliteConnection\n .prepare(sql)\n .run(...(parameters as (string | number | bigint | null)[]));\n }\n\n return { rejectedLogRecords: \"\" };\n }\n\n async getTraces(filter: dataFilterSchemas.TracesDataFilter): Promise<{\n data: denormalizedSignals.OtelTracesRow[];\n nextCursor: string | null;\n }> {\n try {\n const limit = filter.limit ?? 100;\n const sortOrder = filter.sortOrder ?? \"DESC\";\n\n let query = queryBuilder.selectFrom(\"otel_traces\").selectAll();\n\n // Exact match filters\n if (filter.traceId) query = query.where(\"TraceId\", \"=\", filter.traceId);\n if (filter.spanId) query = query.where(\"SpanId\", \"=\", filter.spanId);\n if (filter.parentSpanId)\n query = query.where(\"ParentSpanId\", \"=\", filter.parentSpanId);\n if (filter.serviceName)\n query = query.where(\"ServiceName\", \"=\", filter.serviceName);\n if (filter.spanName)\n query = query.where(\"SpanName\", \"=\", filter.spanName);\n if (filter.spanKind)\n query = query.where(\"SpanKind\", \"=\", filter.spanKind);\n if (filter.statusCode)\n query = query.where(\"StatusCode\", \"=\", filter.statusCode);\n if (filter.scopeName)\n query = query.where(\"ScopeName\", \"=\", filter.scopeName);\n\n // Time range (nanos)\n if (filter.timestampMin != null)\n query = query.where(\"Timestamp\", \">=\", BigInt(filter.timestampMin));\n if (filter.timestampMax != null)\n query = query.where(\"Timestamp\", \"<=\", BigInt(filter.timestampMax));\n\n // Duration range (nanos)\n if (filter.durationMin != null)\n query = query.where(\"Duration\", \">=\", BigInt(filter.durationMin));\n if (filter.durationMax != null)\n query = query.where(\"Duration\", \"<=\", BigInt(filter.durationMax));\n\n // Cursor pagination with SpanId tiebreaker\n if (filter.cursor) {\n const colonIdx = filter.cursor.indexOf(\":\");\n const cursorTs = BigInt(filter.cursor.slice(0, colonIdx));\n const cursorSpanId = filter.cursor.slice(colonIdx + 1);\n\n if (sortOrder === \"DESC\") {\n query = query.where((eb) =>\n eb.or([\n eb(\"Timestamp\", \"<\", cursorTs),\n eb.and([\n eb(\"Timestamp\", \"=\", cursorTs),\n eb(\"SpanId\", \"<\", cursorSpanId),\n ]),\n ])\n );\n } else {\n query = query.where((eb) =>\n eb.or([\n eb(\"Timestamp\", \">\", cursorTs),\n eb.and([\n eb(\"Timestamp\", \"=\", cursorTs),\n eb(\"SpanId\", \">\", cursorSpanId),\n ]),\n ])\n );\n }\n }\n\n // Attribute filters (JSON extract - path must be literal, not parameter)\n if (filter.spanAttributes) {\n for (const [key, value] of Object.entries(filter.spanAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(SpanAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n if (filter.resourceAttributes) {\n for (const [key, value] of Object.entries(filter.resourceAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(ResourceAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n\n // Sort and limit (+1 for next cursor detection)\n query = query\n .orderBy(\"Timestamp\", sortOrder === \"ASC\" ? \"asc\" : \"desc\")\n .orderBy(\"SpanId\", sortOrder === \"ASC\" ? \"asc\" : \"desc\")\n .limit(limit + 1);\n\n // Execute\n const { sql, parameters } = query.compile();\n const stmt = this.sqliteConnection.prepare(sql);\n stmt.setReadBigInts(true);\n const rows = stmt.all(\n ...(parameters as (string | number | bigint | null)[])\n ) as Record<string, unknown>[];\n\n // Determine nextCursor\n const hasMore = rows.length > limit;\n const data = hasMore ? rows.slice(0, limit) : rows;\n const lastRow = data[data.length - 1];\n const nextCursor =\n hasMore && lastRow ? `${lastRow.Timestamp}:${lastRow.SpanId}` : null;\n\n // Map rows to OtelTracesRow (parse JSON fields)\n return { data: data.map(mapRowToOtelTraces), nextCursor };\n } catch (error) {\n throw new SqliteDatasourceQueryError(\"Failed to query traces\", {\n cause: error,\n });\n }\n }\n\n async getMetrics(filter: dataFilterSchemas.MetricsDataFilter): Promise<{\n data: denormalizedSignals.OtelMetricsRow[];\n nextCursor: string | null;\n }> {\n try {\n const limit = filter.limit ?? 100;\n const sortOrder = filter.sortOrder ?? \"DESC\";\n const metricType = filter.metricType;\n\n const tableMap = {\n Gauge: \"otel_metrics_gauge\",\n Sum: \"otel_metrics_sum\",\n Histogram: \"otel_metrics_histogram\",\n ExponentialHistogram: \"otel_metrics_exponential_histogram\",\n Summary: \"otel_metrics_summary\",\n } as const;\n\n const table = tableMap[metricType];\n\n let query = queryBuilder\n .selectFrom(table)\n .select([\n \"TimeUnix\",\n \"StartTimeUnix\",\n \"Attributes\",\n \"MetricName\",\n \"MetricDescription\",\n \"MetricUnit\",\n \"ResourceAttributes\",\n \"ResourceSchemaUrl\",\n \"ScopeAttributes\",\n \"ScopeDroppedAttrCount\",\n \"ScopeName\",\n \"ScopeSchemaUrl\",\n \"ScopeVersion\",\n \"ServiceName\",\n kyselySql<number>`rowid`.as(\"_rowid\"),\n ]);\n\n // Exemplars columns exist on all metric tables except Summary\n if (metricType !== \"Summary\") {\n query = query.select([\n kyselySql<string>`\"Exemplars.FilteredAttributes\"`.as(\n \"Exemplars.FilteredAttributes\"\n ),\n kyselySql<string>`\"Exemplars.SpanId\"`.as(\"Exemplars.SpanId\"),\n kyselySql<string>`\"Exemplars.TimeUnix\"`.as(\"Exemplars.TimeUnix\"),\n kyselySql<string>`\"Exemplars.TraceId\"`.as(\"Exemplars.TraceId\"),\n kyselySql<string>`\"Exemplars.Value\"`.as(\"Exemplars.Value\"),\n ]);\n }\n\n // Add type-specific fields\n if (metricType === \"Gauge\") {\n query = query.select([\"Value\", \"Flags\"]);\n } else if (metricType === \"Sum\") {\n query = query.select([\n \"Value\",\n \"Flags\",\n \"AggTemporality\",\n \"IsMonotonic\",\n ]);\n } else if (metricType === \"Histogram\") {\n query = query.select([\n \"Count\",\n \"Sum\",\n \"BucketCounts\",\n \"ExplicitBounds\",\n \"Min\",\n \"Max\",\n \"AggTemporality\",\n ]);\n } else if (metricType === \"ExponentialHistogram\") {\n query = query.select([\n \"Count\",\n \"Sum\",\n \"Scale\",\n \"ZeroCount\",\n \"PositiveOffset\",\n \"PositiveBucketCounts\",\n \"NegativeOffset\",\n \"NegativeBucketCounts\",\n \"Min\",\n \"Max\",\n \"ZeroThreshold\",\n \"AggTemporality\",\n ]);\n } else if (metricType === \"Summary\") {\n query = query.select([\"Count\", \"Sum\"]);\n query = query.select([\n kyselySql<string>`\"ValueAtQuantiles.Quantile\"`.as(\n \"ValueAtQuantiles.Quantile\"\n ),\n kyselySql<string>`\"ValueAtQuantiles.Value\"`.as(\n \"ValueAtQuantiles.Value\"\n ),\n ]);\n }\n\n // Exact match filters\n if (filter.metricName)\n query = query.where(\"MetricName\", \"=\", filter.metricName);\n if (filter.serviceName)\n query = query.where(\"ServiceName\", \"=\", filter.serviceName);\n if (filter.scopeName)\n query = query.where(\"ScopeName\", \"=\", filter.scopeName);\n\n // Time range (nanos)\n if (filter.timeUnixMin != null)\n query = query.where(\"TimeUnix\", \">=\", BigInt(filter.timeUnixMin));\n if (filter.timeUnixMax != null)\n query = query.where(\"TimeUnix\", \"<=\", BigInt(filter.timeUnixMax));\n\n // Cursor pagination with rowid tiebreaker\n if (filter.cursor) {\n const colonIdx = filter.cursor.indexOf(\":\");\n const cursorTs = BigInt(filter.cursor.slice(0, colonIdx));\n const cursorRowid = parseInt(filter.cursor.slice(colonIdx + 1), 10);\n\n if (sortOrder === \"DESC\") {\n query = query.where((eb) =>\n eb.or([\n eb(\"TimeUnix\", \"<\", cursorTs),\n eb.and([\n eb(\"TimeUnix\", \"=\", cursorTs),\n eb(kyselySql`rowid`, \"<\", cursorRowid),\n ]),\n ])\n );\n } else {\n query = query.where((eb) =>\n eb.or([\n eb(\"TimeUnix\", \">\", cursorTs),\n eb.and([\n eb(\"TimeUnix\", \"=\", cursorTs),\n eb(kyselySql`rowid`, \">\", cursorRowid),\n ]),\n ])\n );\n }\n }\n\n // Attribute filters (JSON extract)\n if (filter.attributes) {\n for (const [key, value] of Object.entries(filter.attributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(Attributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n if (filter.resourceAttributes) {\n for (const [key, value] of Object.entries(filter.resourceAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(ResourceAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n if (filter.scopeAttributes) {\n for (const [key, value] of Object.entries(filter.scopeAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(ScopeAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n\n // Sort and limit (+1 for next cursor detection)\n query = query\n .orderBy(\"TimeUnix\", sortOrder === \"ASC\" ? \"asc\" : \"desc\")\n .orderBy(kyselySql`rowid`, sortOrder === \"ASC\" ? \"asc\" : \"desc\")\n .limit(limit + 1);\n\n // Execute\n const { sql, parameters } = query.compile();\n const stmt = this.sqliteConnection.prepare(sql);\n stmt.setReadBigInts(true);\n const rows = stmt.all(\n ...(parameters as (string | number | bigint | null)[])\n ) as Record<string, unknown>[];\n\n // Determine nextCursor\n const hasMore = rows.length > limit;\n const data = hasMore ? rows.slice(0, limit) : rows;\n const lastRow = data[data.length - 1];\n const nextCursor =\n hasMore && lastRow ? `${lastRow.TimeUnix}:${lastRow._rowid}` : null;\n\n // Map rows to OtelMetricsRow (parse JSON fields)\n return {\n data: data.map((row) => mapRowToOtelMetrics(row, metricType)),\n nextCursor,\n };\n } catch (error) {\n if (error instanceof SqliteDatasourceQueryError) throw error;\n throw new SqliteDatasourceQueryError(\"Failed to query metrics\", {\n cause: error,\n });\n }\n }\n\n async getLogs(filter: dataFilterSchemas.LogsDataFilter): Promise<{\n data: denormalizedSignals.OtelLogsRow[];\n nextCursor: string | null;\n }> {\n try {\n const limit = filter.limit ?? 100;\n const sortOrder = filter.sortOrder ?? \"DESC\";\n\n let query = queryBuilder\n .selectFrom(\"otel_logs\")\n .select([\n \"Timestamp\",\n \"TraceId\",\n \"SpanId\",\n \"TraceFlags\",\n \"SeverityText\",\n \"SeverityNumber\",\n \"Body\",\n \"LogAttributes\",\n \"ResourceAttributes\",\n \"ResourceSchemaUrl\",\n \"ServiceName\",\n \"ScopeName\",\n \"ScopeVersion\",\n \"ScopeAttributes\",\n \"ScopeSchemaUrl\",\n kyselySql<number>`rowid`.as(\"_rowid\"),\n ]);\n\n // Exact match filters\n if (filter.traceId) query = query.where(\"TraceId\", \"=\", filter.traceId);\n if (filter.spanId) query = query.where(\"SpanId\", \"=\", filter.spanId);\n if (filter.serviceName)\n query = query.where(\"ServiceName\", \"=\", filter.serviceName);\n if (filter.scopeName)\n query = query.where(\"ScopeName\", \"=\", filter.scopeName);\n if (filter.severityText)\n query = query.where(\"SeverityText\", \"=\", filter.severityText);\n\n // Severity number range\n if (filter.severityNumberMin != null)\n query = query.where(\"SeverityNumber\", \">=\", filter.severityNumberMin);\n if (filter.severityNumberMax != null)\n query = query.where(\"SeverityNumber\", \"<=\", filter.severityNumberMax);\n\n // Time range (nanos)\n if (filter.timestampMin != null)\n query = query.where(\"Timestamp\", \">=\", BigInt(filter.timestampMin));\n if (filter.timestampMax != null)\n query = query.where(\"Timestamp\", \"<=\", BigInt(filter.timestampMax));\n\n // Body contains (substring search using INSTR)\n if (filter.bodyContains) {\n query = query.where(\n kyselySql`INSTR(Body, ${filter.bodyContains})`,\n \">\",\n 0\n );\n }\n\n // Cursor pagination with rowid tiebreaker\n if (filter.cursor) {\n const colonIdx = filter.cursor.indexOf(\":\");\n const cursorTs = BigInt(filter.cursor.slice(0, colonIdx));\n const cursorRowid = parseInt(filter.cursor.slice(colonIdx + 1), 10);\n\n if (sortOrder === \"DESC\") {\n query = query.where((eb) =>\n eb.or([\n eb(\"Timestamp\", \"<\", cursorTs),\n eb.and([\n eb(\"Timestamp\", \"=\", cursorTs),\n eb(kyselySql`rowid`, \"<\", cursorRowid),\n ]),\n ])\n );\n } else {\n query = query.where((eb) =>\n eb.or([\n eb(\"Timestamp\", \">\", cursorTs),\n eb.and([\n eb(\"Timestamp\", \"=\", cursorTs),\n eb(kyselySql`rowid`, \">\", cursorRowid),\n ]),\n ])\n );\n }\n }\n\n // Attribute filters (JSON extract)\n if (filter.logAttributes) {\n for (const [key, value] of Object.entries(filter.logAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(LogAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n if (filter.resourceAttributes) {\n for (const [key, value] of Object.entries(filter.resourceAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(ResourceAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n if (filter.scopeAttributes) {\n for (const [key, value] of Object.entries(filter.scopeAttributes)) {\n const jsonPath = `$.\"${key.replace(/\"/g, '\"\"')}\"`;\n query = query.where(\n kyselySql`json_extract(ScopeAttributes, ${kyselySql.lit(jsonPath)})`,\n \"=\",\n value\n );\n }\n }\n\n // Sort and limit (+1 for next cursor detection)\n query = query\n .orderBy(\"Timestamp\", sortOrder === \"ASC\" ? \"asc\" : \"desc\")\n .orderBy(kyselySql`rowid`, sortOrder === \"ASC\" ? \"asc\" : \"desc\")\n .limit(limit + 1);\n\n // Execute\n const { sql, parameters } = query.compile();\n const stmt = this.sqliteConnection.prepare(sql);\n stmt.setReadBigInts(true);\n const rows = stmt.all(\n ...(parameters as (string | number | bigint | null)[])\n ) as Record<string, unknown>[];\n\n // Determine nextCursor\n const hasMore = rows.length > limit;\n const data = hasMore ? rows.slice(0, limit) : rows;\n const lastRow = data[data.length - 1];\n const nextCursor =\n hasMore && lastRow ? `${lastRow.Timestamp}:${lastRow._rowid}` : null;\n\n // Map rows to OtelLogsRow (parse JSON fields)\n return { data: data.map(mapRowToOtelLogs), nextCursor };\n } catch (error) {\n throw new SqliteDatasourceQueryError(\"Failed to query logs\", {\n cause: error,\n });\n }\n }\n\n async discoverMetrics(): Promise<datasource.MetricsDiscoveryResult> {\n try {\n // Step 1: Get distinct metrics across all tables using UNION\n const distinctMetricsSql = METRIC_TABLES.map(\n ({ table, type }) =>\n `SELECT DISTINCT MetricName, MetricUnit, MetricDescription, '${type}' as MetricType FROM ${table}`\n ).join(\" UNION \");\n\n const distinctMetrics = this.sqliteConnection\n .prepare(distinctMetricsSql)\n .all() as {\n MetricName: string;\n MetricUnit: string | null;\n MetricDescription: string | null;\n MetricType: datasource.MetricType;\n }[];\n\n const metrics: datasource.DiscoveredMetric[] = [];\n\n for (const metric of distinctMetrics) {\n const table = METRIC_TABLES.find(\n (t) => t.type === metric.MetricType\n )!.table;\n\n // Step 2: Get distinct attribute keys for this metric\n const attrKeysSql = `\n SELECT DISTINCT json_each.key as key\n FROM ${table}, json_each(Attributes)\n WHERE MetricName = ?\n `;\n const attrKeys = this.sqliteConnection\n .prepare(attrKeysSql)\n .all(metric.MetricName) as { key: string }[];\n\n // Step 3: Get distinct values for each attribute key (limit 101 to detect truncation)\n let attrsTruncated = false;\n const attributes: Record<string, string[]> = {};\n\n for (const { key } of attrKeys) {\n const valuesSql = `\n SELECT DISTINCT json_each.value as value\n FROM ${table}, json_each(Attributes)\n WHERE MetricName = ? AND json_each.key = ?\n LIMIT ${MAX_ATTR_VALUES + 1}\n `;\n const values = this.sqliteConnection\n .prepare(valuesSql)\n .all(metric.MetricName, key) as { value: string }[];\n\n if (values.length > MAX_ATTR_VALUES) {\n attrsTruncated = true;\n attributes[key] = values\n .slice(0, MAX_ATTR_VALUES)\n .map((v) => String(v.value));\n } else {\n attributes[key] = values.map((v) => String(v.value));\n }\n }\n\n // Step 4: Get distinct resource attribute keys for this metric\n const resAttrKeysSql = `\n SELECT DISTINCT json_each.key as key\n FROM ${table}, json_each(ResourceAttributes)\n WHERE MetricName = ?\n `;\n const resAttrKeys = this.sqliteConnection\n .prepare(resAttrKeysSql)\n .all(metric.MetricName) as { key: string }[];\n\n // Step 5: Get distinct values for each resource attribute key\n let resAttrsTruncated = false;\n const resourceAttributes: Record<string, string[]> = {};\n\n for (const { key } of resAttrKeys) {\n const valuesSql = `\n SELECT DISTINCT json_each.value as value\n FROM ${table}, json_each(ResourceAttributes)\n WHERE MetricName = ? AND json_each.key = ?\n LIMIT ${MAX_ATTR_VALUES + 1}\n `;\n const values = this.sqliteConnection\n .prepare(valuesSql)\n .all(metric.MetricName, key) as { value: string }[];\n\n if (values.length > MAX_ATTR_VALUES) {\n resAttrsTruncated = true;\n resourceAttributes[key] = values\n .slice(0, MAX_ATTR_VALUES)\n .map((v) => String(v.value));\n } else {\n resourceAttributes[key] = values.map((v) => String(v.value));\n }\n }\n\n metrics.push({\n name: metric.MetricName,\n type: metric.MetricType,\n unit: metric.MetricUnit || undefined,\n description: metric.MetricDescription || undefined,\n attributes: {\n values: attributes,\n ...(attrsTruncated && { _truncated: true }),\n },\n resourceAttributes: {\n values: resourceAttributes,\n ...(resAttrsTruncated && { _truncated: true }),\n },\n });\n }\n\n return { metrics };\n } catch (error) {\n if (error instanceof SqliteDatasourceQueryError) throw error;\n throw new SqliteDatasourceQueryError(\"Failed to discover metrics\", {\n cause: error,\n });\n }\n }\n}\n\nfunction toSpanRow(\n resource: otlp.Resource | undefined,\n scope: otlp.InstrumentationScope | undefined,\n span: otlp.Span\n): Insertable<OtelTraces> {\n const events = span.events ?? [];\n const links = span.links ?? [];\n const startNanos = nanosToSqlite(span.startTimeUnixNano);\n const endNanos = nanosToSqlite(span.endTimeUnixNano);\n const durationNanos = endNanos - startNanos;\n\n return {\n TraceId: span.traceId ?? \"\",\n SpanId: span.spanId ?? \"\",\n ParentSpanId: span.parentSpanId ?? \"\",\n TraceState: span.traceState ?? \"\",\n SpanName: span.name ?? \"\",\n SpanKind: spanKindToString(span.kind),\n ServiceName: extractServiceName(resource),\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n SpanAttributes: keyValueArrayToJson(span.attributes),\n Timestamp: startNanos,\n Duration: durationNanos,\n StatusCode: statusCodeToString(span.status?.code),\n StatusMessage: span.status?.message ?? \"\",\n \"Events.Timestamp\": JSON.stringify(\n events.map((e) => String(nanosToSqlite(e.timeUnixNano)))\n ),\n \"Events.Name\": JSON.stringify(events.map((e) => e.name ?? \"\")),\n \"Events.Attributes\": JSON.stringify(\n events.map((e) => keyValueArrayToObject(e.attributes))\n ),\n \"Links.TraceId\": JSON.stringify(links.map((l) => l.traceId ?? \"\")),\n \"Links.SpanId\": JSON.stringify(links.map((l) => l.spanId ?? \"\")),\n \"Links.TraceState\": JSON.stringify(links.map((l) => l.traceState ?? \"\")),\n \"Links.Attributes\": JSON.stringify(\n links.map((l) => keyValueArrayToObject(l.attributes))\n ),\n };\n}\n\nfunction toLogRow(\n resource: otlp.Resource | undefined,\n resourceSchemaUrl: string | undefined,\n scope: otlp.InstrumentationScope | undefined,\n scopeSchemaUrl: string | undefined,\n logRecord: otlp.LogRecord\n): Insertable<OtelLogs> {\n return {\n Timestamp: nanosToSqlite(logRecord.timeUnixNano),\n TraceId: logRecord.traceId ?? \"\",\n SpanId: logRecord.spanId ?? \"\",\n TraceFlags: logRecord.flags ?? 0,\n SeverityText: logRecord.severityText ?? \"\",\n SeverityNumber: logRecord.severityNumber ?? 0,\n Body: anyValueToBodyString(logRecord.body),\n LogAttributes: keyValueArrayToJson(logRecord.attributes),\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ResourceSchemaUrl: resourceSchemaUrl ?? \"\",\n ServiceName: extractServiceName(resource),\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n ScopeAttributes: keyValueArrayToJson(scope?.attributes),\n ScopeSchemaUrl: scopeSchemaUrl ?? \"\",\n };\n}\n\nfunction spanKindToString(kind: otlp.SpanKind | undefined): string {\n if (kind === undefined) return \"\";\n return otlp.SpanKind[kind] ?? \"\";\n}\n\nfunction statusCodeToString(code: otlp.StatusCode | undefined): string {\n if (code === undefined) return \"\";\n return otlp.StatusCode[code] ?? \"\";\n}\n\nfunction toGaugeRow(\n resource: otlp.Resource | undefined,\n resourceSchemaUrl: string | undefined,\n scope: otlp.InstrumentationScope | undefined,\n scopeSchemaUrl: string | undefined,\n metric: otlpMetrics.Metric,\n dataPoint: otlpMetrics.NumberDataPoint\n): Insertable<OtelMetricsGauge> {\n const exemplars = dataPoint.exemplars ?? [];\n return {\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ResourceSchemaUrl: resourceSchemaUrl ?? \"\",\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n ScopeAttributes: keyValueArrayToJson(scope?.attributes),\n ScopeDroppedAttrCount: scope?.droppedAttributesCount ?? 0,\n ScopeSchemaUrl: scopeSchemaUrl ?? \"\",\n ServiceName: extractServiceName(resource),\n MetricName: metric.name ?? \"\",\n MetricDescription: metric.description ?? \"\",\n MetricUnit: metric.unit ?? \"\",\n Attributes: keyValueArrayToJson(dataPoint.attributes),\n StartTimeUnix: nanosToSqlite(dataPoint.startTimeUnixNano),\n TimeUnix: nanosToSqlite(dataPoint.timeUnixNano),\n Value: dataPoint.asDouble ?? Number(dataPoint.asInt ?? 0),\n Flags: dataPoint.flags ?? 0,\n \"Exemplars.FilteredAttributes\": exemplarsArrayToJson(exemplars, (e) =>\n keyValueArrayToObject(e.filteredAttributes)\n ),\n \"Exemplars.TimeUnix\": exemplarsArrayToJson(exemplars, (e) =>\n String(nanosToSqlite(e.timeUnixNano))\n ),\n \"Exemplars.Value\": exemplarsArrayToJson(\n exemplars,\n (e) => e.asDouble ?? Number(e.asInt ?? 0)\n ),\n \"Exemplars.SpanId\": exemplarsArrayToJson(exemplars, (e) => e.spanId ?? \"\"),\n \"Exemplars.TraceId\": exemplarsArrayToJson(exemplars, (e) =>\n e.traceId ? bufferToHex(e.traceId) : \"\"\n ),\n };\n}\n\nfunction toSumRow(\n resource: otlp.Resource | undefined,\n resourceSchemaUrl: string | undefined,\n scope: otlp.InstrumentationScope | undefined,\n scopeSchemaUrl: string | undefined,\n metric: otlpMetrics.Metric,\n dataPoint: otlpMetrics.NumberDataPoint,\n aggregationTemporality: otlp.AggregationTemporality | undefined,\n isMonotonic: boolean | undefined\n): Insertable<OtelMetricsSum> {\n const exemplars = dataPoint.exemplars ?? [];\n return {\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ResourceSchemaUrl: resourceSchemaUrl ?? \"\",\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n ScopeAttributes: keyValueArrayToJson(scope?.attributes),\n ScopeDroppedAttrCount: scope?.droppedAttributesCount ?? 0,\n ScopeSchemaUrl: scopeSchemaUrl ?? \"\",\n ServiceName: extractServiceName(resource),\n MetricName: metric.name ?? \"\",\n MetricDescription: metric.description ?? \"\",\n MetricUnit: metric.unit ?? \"\",\n Attributes: keyValueArrayToJson(dataPoint.attributes),\n StartTimeUnix: nanosToSqlite(dataPoint.startTimeUnixNano),\n TimeUnix: nanosToSqlite(dataPoint.timeUnixNano),\n Value: dataPoint.asDouble ?? Number(dataPoint.asInt ?? 0),\n Flags: dataPoint.flags ?? 0,\n \"Exemplars.FilteredAttributes\": exemplarsArrayToJson(exemplars, (e) =>\n keyValueArrayToObject(e.filteredAttributes)\n ),\n \"Exemplars.TimeUnix\": exemplarsArrayToJson(exemplars, (e) =>\n String(nanosToSqlite(e.timeUnixNano))\n ),\n \"Exemplars.Value\": exemplarsArrayToJson(\n exemplars,\n (e) => e.asDouble ?? Number(e.asInt ?? 0)\n ),\n \"Exemplars.SpanId\": exemplarsArrayToJson(exemplars, (e) => e.spanId ?? \"\"),\n \"Exemplars.TraceId\": exemplarsArrayToJson(exemplars, (e) =>\n e.traceId ? bufferToHex(e.traceId) : \"\"\n ),\n AggTemporality: aggTemporalityToString(aggregationTemporality),\n IsMonotonic: isMonotonic ? 1 : 0,\n };\n}\n\nfunction toHistogramRow(\n resource: otlp.Resource | undefined,\n resourceSchemaUrl: string | undefined,\n scope: otlp.InstrumentationScope | undefined,\n scopeSchemaUrl: string | undefined,\n metric: otlpMetrics.Metric,\n dataPoint: otlpMetrics.HistogramDataPoint,\n aggregationTemporality: otlp.AggregationTemporality | undefined\n): Insertable<OtelMetricsHistogram> {\n const exemplars = dataPoint.exemplars ?? [];\n return {\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ResourceSchemaUrl: resourceSchemaUrl ?? \"\",\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n ScopeAttributes: keyValueArrayToJson(scope?.attributes),\n ScopeDroppedAttrCount: scope?.droppedAttributesCount ?? 0,\n ScopeSchemaUrl: scopeSchemaUrl ?? \"\",\n ServiceName: extractServiceName(resource),\n MetricName: metric.name ?? \"\",\n MetricDescription: metric.description ?? \"\",\n MetricUnit: metric.unit ?? \"\",\n Attributes: keyValueArrayToJson(dataPoint.attributes),\n StartTimeUnix: nanosToSqlite(dataPoint.startTimeUnixNano),\n TimeUnix: nanosToSqlite(dataPoint.timeUnixNano),\n Count: Number(dataPoint.count ?? 0),\n Sum: dataPoint.sum ?? 0,\n BucketCounts: JSON.stringify(dataPoint.bucketCounts ?? []),\n ExplicitBounds: JSON.stringify(dataPoint.explicitBounds ?? []),\n Min: dataPoint.min ?? null,\n Max: dataPoint.max ?? null,\n \"Exemplars.FilteredAttributes\": exemplarsArrayToJson(exemplars, (e) =>\n keyValueArrayToObject(e.filteredAttributes)\n ),\n \"Exemplars.TimeUnix\": exemplarsArrayToJson(exemplars, (e) =>\n String(nanosToSqlite(e.timeUnixNano))\n ),\n \"Exemplars.Value\": exemplarsArrayToJson(\n exemplars,\n (e) => e.asDouble ?? Number(e.asInt ?? 0)\n ),\n \"Exemplars.SpanId\": exemplarsArrayToJson(exemplars, (e) => e.spanId ?? \"\"),\n \"Exemplars.TraceId\": exemplarsArrayToJson(exemplars, (e) =>\n e.traceId ? bufferToHex(e.traceId) : \"\"\n ),\n AggTemporality: aggTemporalityToString(aggregationTemporality),\n };\n}\n\nfunction toExpHistogramRow(\n resource: otlp.Resource | undefined,\n resourceSchemaUrl: string | undefined,\n scope: otlp.InstrumentationScope | undefined,\n scopeSchemaUrl: string | undefined,\n metric: otlpMetrics.Metric,\n dataPoint: otlpMetrics.ExponentialHistogramDataPoint,\n aggregationTemporality: otlp.AggregationTemporality | undefined\n): Insertable<OtelMetricsExponentialHistogram> {\n const exemplars = dataPoint.exemplars ?? [];\n return {\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ResourceSchemaUrl: resourceSchemaUrl ?? \"\",\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n ScopeAttributes: keyValueArrayToJson(scope?.attributes),\n ScopeDroppedAttrCount: scope?.droppedAttributesCount ?? 0,\n ScopeSchemaUrl: scopeSchemaUrl ?? \"\",\n ServiceName: extractServiceName(resource),\n MetricName: metric.name ?? \"\",\n MetricDescription: metric.description ?? \"\",\n MetricUnit: metric.unit ?? \"\",\n Attributes: keyValueArrayToJson(dataPoint.attributes),\n StartTimeUnix: nanosToSqlite(dataPoint.startTimeUnixNano),\n TimeUnix: nanosToSqlite(dataPoint.timeUnixNano),\n Count: Number(dataPoint.count ?? 0),\n Sum: dataPoint.sum ?? 0,\n Scale: dataPoint.scale ?? 0,\n ZeroCount: Number(dataPoint.zeroCount ?? 0),\n PositiveOffset: dataPoint.positive?.offset ?? 0,\n PositiveBucketCounts: JSON.stringify(\n dataPoint.positive?.bucketCounts ?? []\n ),\n NegativeOffset: dataPoint.negative?.offset ?? 0,\n NegativeBucketCounts: JSON.stringify(\n dataPoint.negative?.bucketCounts ?? []\n ),\n Min: dataPoint.min ?? null,\n Max: dataPoint.max ?? null,\n ZeroThreshold: dataPoint.zeroThreshold ?? 0,\n \"Exemplars.FilteredAttributes\": exemplarsArrayToJson(exemplars, (e) =>\n keyValueArrayToObject(e.filteredAttributes)\n ),\n \"Exemplars.TimeUnix\": exemplarsArrayToJson(exemplars, (e) =>\n String(nanosToSqlite(e.timeUnixNano))\n ),\n \"Exemplars.Value\": exemplarsArrayToJson(\n exemplars,\n (e) => e.asDouble ?? Number(e.asInt ?? 0)\n ),\n \"Exemplars.SpanId\": exemplarsArrayToJson(exemplars, (e) => e.spanId ?? \"\"),\n \"Exemplars.TraceId\": exemplarsArrayToJson(exemplars, (e) =>\n e.traceId ? bufferToHex(e.traceId) : \"\"\n ),\n AggTemporality: aggTemporalityToString(aggregationTemporality),\n };\n}\n\nfunction toSummaryRow(\n resource: otlp.Resource | undefined,\n resourceSchemaUrl: string | undefined,\n scope: otlp.InstrumentationScope | undefined,\n scopeSchemaUrl: string | undefined,\n metric: otlpMetrics.Metric,\n dataPoint: otlpMetrics.SummaryDataPoint\n): Insertable<OtelMetricsSummary> {\n const quantileValues = dataPoint.quantileValues ?? [];\n return {\n ResourceAttributes: keyValueArrayToJson(resource?.attributes),\n ResourceSchemaUrl: resourceSchemaUrl ?? \"\",\n ScopeName: scope?.name ?? \"\",\n ScopeVersion: scope?.version ?? \"\",\n ScopeAttributes: keyValueArrayToJson(scope?.attributes),\n ScopeDroppedAttrCount: scope?.droppedAttributesCount ?? 0,\n ScopeSchemaUrl: scopeSchemaUrl ?? \"\",\n ServiceName: extractServiceName(resource),\n MetricName: metric.name ?? \"\",\n MetricDescription: metric.description ?? \"\",\n MetricUnit: metric.unit ?? \"\",\n Attributes: keyValueArrayToJson(dataPoint.attributes),\n StartTimeUnix: nanosToSqlite(dataPoint.startTimeUnixNano),\n TimeUnix: nanosToSqlite(dataPoint.timeUnixNano),\n Count: Number(dataPoint.count ?? 0),\n Sum: dataPoint.sum ?? 0,\n \"ValueAtQuantiles.Quantile\": JSON.stringify(\n quantileValues.map(\n (q: otlpMetrics.SummaryDataPoint_ValueAtQuantile) => q.quantile ?? 0\n )\n ),\n \"ValueAtQuantiles.Value\": JSON.stringify(\n quantileValues.map(\n (q: otlpMetrics.SummaryDataPoint_ValueAtQuantile) => q.value ?? 0\n )\n ),\n };\n}\n\nfunction aggTemporalityToString(\n agg: otlp.AggregationTemporality | undefined\n): string {\n if (agg === undefined) return \"\";\n return otlp.AggregationTemporality[agg] ?? \"\";\n}\n\nfunction anyValueToSimple(value: otlp.AnyValue | undefined): unknown {\n if (!value) return null;\n if (value.stringValue !== undefined) return value.stringValue;\n if (value.boolValue !== undefined) return value.boolValue;\n if (value.intValue !== undefined) return value.intValue;\n if (value.doubleValue !== undefined) return value.doubleValue;\n if (value.bytesValue !== undefined) return value.bytesValue;\n if (value.arrayValue !== undefined) {\n return value.arrayValue.values?.map((v) => anyValueToSimple(v)) ?? [];\n }\n if (value.kvlistValue !== undefined) {\n const obj: Record<string, unknown> = {};\n for (const kv of value.kvlistValue.values ?? []) {\n if (kv.key) obj[kv.key] = anyValueToSimple(kv.value);\n }\n return obj;\n }\n return null;\n}\n\nfunction anyValueToBodyString(value: otlp.AnyValue | undefined): string {\n const simple = anyValueToSimple(value);\n if (typeof simple === \"string\") return simple;\n return JSON.stringify(simple);\n}\n\nfunction keyValueArrayToObject(\n attrs: otlp.KeyValue[] | undefined\n): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n if (!attrs) return obj;\n for (const kv of attrs) {\n if (kv.key) obj[kv.key] = anyValueToSimple(kv.value);\n }\n return obj;\n}\n\nfunction keyValueArrayToJson(attrs: otlp.KeyValue[] | undefined): string {\n if (!attrs || attrs.length === 0) return \"{}\";\n return JSON.stringify(keyValueArrayToObject(attrs));\n}\n\nfunction extractServiceName(resource: otlp.Resource | undefined): string {\n if (!resource?.attributes) return \"\";\n for (const kv of resource.attributes) {\n if (kv.key === \"service.name\" && kv.value?.stringValue) {\n return kv.value.stringValue;\n }\n }\n return \"\";\n}\n\nfunction nanosToSqlite(nanos: string | undefined): bigint {\n return BigInt(nanos ?? \"0\");\n}\n\nfunction exemplarsArrayToJson<T>(\n exemplars: otlpMetrics.Exemplar[],\n extractor: (e: otlpMetrics.Exemplar) => T\n): string {\n if (exemplars.length === 0) return \"[]\";\n return JSON.stringify(exemplars.map(extractor));\n}\n\nfunction bufferToHex(buf: Uint8Array): string {\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction mapRowToOtelTraces(\n row: Record<string, unknown> // TODO: can we use kysely-generated type for this?\n): denormalizedSignals.OtelTracesRow {\n return {\n TraceId: row.TraceId as string,\n SpanId: row.SpanId as string,\n Timestamp: String(row.Timestamp),\n ParentSpanId: row.ParentSpanId as string | undefined,\n TraceState: row.TraceState as string | undefined,\n SpanName: row.SpanName as string | undefined,\n SpanKind: row.SpanKind as string | undefined,\n ServiceName: row.ServiceName as string | undefined,\n ResourceAttributes: parseJsonField(row.ResourceAttributes),\n ScopeName: row.ScopeName as string | undefined,\n ScopeVersion: row.ScopeVersion as string | undefined,\n SpanAttributes: parseJsonField(row.SpanAttributes),\n Duration: row.Duration != null ? String(row.Duration) : undefined,\n StatusCode: row.StatusCode as string | undefined,\n StatusMessage: row.StatusMessage as string | undefined,\n \"Events.Timestamp\": parseStringArrayField(row[\"Events.Timestamp\"]),\n \"Events.Name\": parseStringArrayField(row[\"Events.Name\"]),\n \"Events.Attributes\": parseJsonArrayField(row[\"Events.Attributes\"]),\n \"Links.TraceId\": parseStringArrayField(row[\"Links.TraceId\"]),\n \"Links.SpanId\": parseStringArrayField(row[\"Links.SpanId\"]),\n \"Links.TraceState\": parseStringArrayField(row[\"Links.TraceState\"]),\n \"Links.Attributes\": parseJsonArrayField(row[\"Links.Attributes\"]),\n };\n}\n\ntype AttributeValue = string | number | boolean;\n\nfunction parseJsonField(\n value: unknown\n): Record<string, AttributeValue> | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction parseJsonArrayField(\n value: unknown\n): Record<string, AttributeValue>[] | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction parseStringArrayField(value: unknown): string[] | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction parseNumberArrayField(value: unknown): number[] | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\n// Convert BigInt to Number for non-timestamp integer fields\nfunction toNumber(value: unknown): number | undefined {\n if (value == null) return undefined;\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return value;\n return undefined;\n}\n\nfunction mapRowToOtelLogs(\n row: Record<string, unknown> // TODO: can we use kysely-generated type for this?\n): denormalizedSignals.OtelLogsRow {\n return {\n Timestamp: String(row.Timestamp),\n TraceId: row.TraceId as string | undefined,\n SpanId: row.SpanId as string | undefined,\n TraceFlags: toNumber(row.TraceFlags),\n SeverityText: row.SeverityText as string | undefined,\n SeverityNumber: toNumber(row.SeverityNumber),\n Body: row.Body as string | undefined,\n LogAttributes: parseJsonField(row.LogAttributes),\n ResourceAttributes: parseJsonField(row.ResourceAttributes),\n ResourceSchemaUrl: row.ResourceSchemaUrl as string | undefined,\n ServiceName: row.ServiceName as string | undefined,\n ScopeName: row.ScopeName as string | undefined,\n ScopeVersion: row.ScopeVersion as string | undefined,\n ScopeAttributes: parseJsonField(row.ScopeAttributes),\n ScopeSchemaUrl: row.ScopeSchemaUrl as string | undefined,\n };\n}\n\nconst METRIC_TABLES = [\n { table: \"otel_metrics_gauge\", type: \"Gauge\" },\n { table: \"otel_metrics_sum\", type: \"Sum\" },\n { table: \"otel_metrics_histogram\", type: \"Histogram\" },\n { table: \"otel_metrics_exponential_histogram\", type: \"ExponentialHistogram\" },\n { table: \"otel_metrics_summary\", type: \"Summary\" },\n] as const;\n\nconst MAX_ATTR_VALUES = 100;\n\nfunction mapRowToOtelMetrics(\n row: Record<string, unknown>, // TODO: can we use kysely-generated type for this?\n metricType: \"Gauge\" | \"Sum\" | \"Histogram\" | \"ExponentialHistogram\" | \"Summary\"\n): denormalizedSignals.OtelMetricsRow {\n const base = {\n TimeUnix: String(row.TimeUnix),\n StartTimeUnix: String(row.StartTimeUnix),\n Attributes: parseJsonField(row.Attributes),\n MetricName: row.MetricName as string | undefined,\n MetricDescription: row.MetricDescription as string | undefined,\n MetricUnit: row.MetricUnit as string | undefined,\n ResourceAttributes: parseJsonField(row.ResourceAttributes),\n ResourceSchemaUrl: row.ResourceSchemaUrl as string | undefined,\n ScopeAttributes: parseJsonField(row.ScopeAttributes),\n ScopeDroppedAttrCount: toNumber(row.ScopeDroppedAttrCount),\n ScopeName: row.ScopeName as string | undefined,\n ScopeSchemaUrl: row.ScopeSchemaUrl as string | undefined,\n ScopeVersion: row.ScopeVersion as string | undefined,\n ServiceName: row.ServiceName as string | undefined,\n \"Exemplars.FilteredAttributes\": parseJsonArrayField(\n row[\"Exemplars.FilteredAttributes\"]\n ),\n \"Exemplars.SpanId\": parseStringArrayField(row[\"Exemplars.SpanId\"]),\n \"Exemplars.TimeUnix\": parseStringArrayField(row[\"Exemplars.TimeUnix\"]),\n \"Exemplars.TraceId\": parseStringArrayField(row[\"Exemplars.TraceId\"]),\n \"Exemplars.Value\": parseNumberArrayField(row[\"Exemplars.Value\"]),\n };\n\n if (metricType === \"Gauge\") {\n return {\n ...base,\n MetricType: \"Gauge\" as const,\n Value: row.Value as number,\n Flags: toNumber(row.Flags),\n };\n }\n\n if (metricType === \"Sum\") {\n return {\n ...base,\n MetricType: \"Sum\" as const,\n Value: row.Value as number,\n Flags: toNumber(row.Flags),\n AggTemporality: row.AggTemporality as string | undefined,\n IsMonotonic: toNumber(row.IsMonotonic),\n };\n }\n\n if (metricType === \"Histogram\") {\n return {\n ...base,\n MetricType: \"Histogram\" as const,\n Count: toNumber(row.Count),\n Sum: row.Sum as number | undefined,\n Min: row.Min as number | null | undefined,\n Max: row.Max as number | null | undefined,\n BucketCounts: parseNumberArrayField(row.BucketCounts),\n ExplicitBounds: parseNumberArrayField(row.ExplicitBounds),\n AggTemporality: row.AggTemporality as string | undefined,\n };\n }\n\n if (metricType === \"ExponentialHistogram\") {\n return {\n ...base,\n MetricType: \"ExponentialHistogram\" as const,\n Count: toNumber(row.Count),\n Sum: row.Sum as number | undefined,\n Min: row.Min as number | null | undefined,\n Max: row.Max as number | null | undefined,\n Scale: toNumber(row.Scale),\n ZeroCount: toNumber(row.ZeroCount),\n PositiveOffset: toNumber(row.PositiveOffset),\n PositiveBucketCounts: parseNumberArrayField(row.PositiveBucketCounts),\n NegativeOffset: toNumber(row.NegativeOffset),\n NegativeBucketCounts: parseNumberArrayField(row.NegativeBucketCounts),\n AggTemporality: row.AggTemporality as string | undefined,\n };\n }\n\n // Summary\n return {\n ...base,\n MetricType: \"Summary\" as const,\n Count: toNumber(row.Count),\n Sum: row.Sum as number | undefined,\n \"ValueAtQuantiles.Quantile\": parseNumberArrayField(\n row[\"ValueAtQuantiles.Quantile\"]\n ),\n \"ValueAtQuantiles.Value\": parseNumberArrayField(\n row[\"ValueAtQuantiles.Value\"]\n ),\n };\n}\n","export const ddl = `\n-- OpenTelemetry SQLite Schema\n-- Migrated from ClickHouse OTEL exporter schema v0.136.0\n--\n-- Conversion notes:\n-- - Map/Array types → JSON TEXT columns\n-- - DateTime64(9) → INTEGER (unix nanoseconds)\n-- - LowCardinality(String) → TEXT (CH optimization removed)\n-- - Removed: CODEC compression, PARTITION BY, TTL, bloom filters, MergeTree engine\n-- - Skipped: otel_traces_trace_id_ts_mv materialized view\n-- - Column names with dots (e.g. \"Events.Timestamp\") preserved for compatibility\n--\n-- Source: /k8s/migrations/clickhouse/002-otel-schema-v136.sql\n\n-- =============================================================================\n-- 1. LOGS TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_logs (\n Timestamp INTEGER NOT NULL,\n TimestampTime INTEGER GENERATED ALWAYS AS (Timestamp / 1000000000) STORED,\n TraceId TEXT NOT NULL DEFAULT '',\n SpanId TEXT NOT NULL DEFAULT '',\n TraceFlags INTEGER NOT NULL DEFAULT 0,\n SeverityText TEXT NOT NULL DEFAULT '',\n SeverityNumber INTEGER NOT NULL DEFAULT 0,\n ServiceName TEXT NOT NULL DEFAULT '',\n Body TEXT NOT NULL DEFAULT '',\n ResourceSchemaUrl TEXT NOT NULL DEFAULT '',\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeSchemaUrl TEXT NOT NULL DEFAULT '',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n ScopeAttributes TEXT NOT NULL DEFAULT '{}',\n LogAttributes TEXT NOT NULL DEFAULT '{}'\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_logs_service_time ON otel_logs (ServiceName, TimestampTime);\nCREATE INDEX IF NOT EXISTS idx_otel_logs_trace_id ON otel_logs (TraceId) WHERE TraceId != '';\nCREATE INDEX IF NOT EXISTS idx_otel_logs_severity ON otel_logs (SeverityNumber);\n\n-- =============================================================================\n-- 2. TRACES TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_traces (\n Timestamp INTEGER NOT NULL,\n TraceId TEXT NOT NULL,\n SpanId TEXT NOT NULL,\n ParentSpanId TEXT NOT NULL DEFAULT '',\n TraceState TEXT NOT NULL DEFAULT '',\n SpanName TEXT NOT NULL DEFAULT '',\n SpanKind TEXT NOT NULL DEFAULT '',\n ServiceName TEXT NOT NULL DEFAULT '',\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n SpanAttributes TEXT NOT NULL DEFAULT '{}',\n Duration INTEGER NOT NULL DEFAULT 0,\n StatusCode TEXT NOT NULL DEFAULT '',\n StatusMessage TEXT NOT NULL DEFAULT '',\n \"Events.Timestamp\" TEXT NOT NULL DEFAULT '[]',\n \"Events.Name\" TEXT NOT NULL DEFAULT '[]',\n \"Events.Attributes\" TEXT NOT NULL DEFAULT '[]',\n \"Links.TraceId\" TEXT NOT NULL DEFAULT '[]',\n \"Links.SpanId\" TEXT NOT NULL DEFAULT '[]',\n \"Links.TraceState\" TEXT NOT NULL DEFAULT '[]',\n \"Links.Attributes\" TEXT NOT NULL DEFAULT '[]'\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_traces_service_span_time ON otel_traces (ServiceName, SpanName, Timestamp);\nCREATE INDEX IF NOT EXISTS idx_otel_traces_trace_id ON otel_traces (TraceId);\nCREATE INDEX IF NOT EXISTS idx_otel_traces_parent_span ON otel_traces (ParentSpanId) WHERE ParentSpanId != '';\nCREATE INDEX IF NOT EXISTS idx_otel_traces_duration ON otel_traces (Duration);\nCREATE INDEX IF NOT EXISTS idx_otel_traces_timestamp_span ON otel_traces (Timestamp, SpanId);\n\n-- =============================================================================\n-- 3. TRACE LOOKUP TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_traces_trace_id_ts (\n TraceId TEXT NOT NULL PRIMARY KEY,\n Start INTEGER NOT NULL,\n End INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_traces_trace_id_ts_start ON otel_traces_trace_id_ts (Start);\n\n-- =============================================================================\n-- 4. METRICS - GAUGE TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_metrics_gauge (\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ResourceSchemaUrl TEXT NOT NULL DEFAULT '',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n ScopeAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeDroppedAttrCount INTEGER NOT NULL DEFAULT 0,\n ScopeSchemaUrl TEXT NOT NULL DEFAULT '',\n ServiceName TEXT NOT NULL DEFAULT '',\n MetricName TEXT NOT NULL DEFAULT '',\n MetricDescription TEXT NOT NULL DEFAULT '',\n MetricUnit TEXT NOT NULL DEFAULT '',\n Attributes TEXT NOT NULL DEFAULT '{}',\n StartTimeUnix INTEGER NOT NULL,\n TimeUnix INTEGER NOT NULL,\n Value REAL NOT NULL,\n Flags INTEGER NOT NULL DEFAULT 0,\n \"Exemplars.FilteredAttributes\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TimeUnix\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.Value\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.SpanId\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TraceId\" TEXT NOT NULL DEFAULT '[]'\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_metrics_gauge_service_metric_time ON otel_metrics_gauge (ServiceName, MetricName, TimeUnix);\n\n-- =============================================================================\n-- 5. METRICS - SUM TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_metrics_sum (\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ResourceSchemaUrl TEXT NOT NULL DEFAULT '',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n ScopeAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeDroppedAttrCount INTEGER NOT NULL DEFAULT 0,\n ScopeSchemaUrl TEXT NOT NULL DEFAULT '',\n ServiceName TEXT NOT NULL DEFAULT '',\n MetricName TEXT NOT NULL DEFAULT '',\n MetricDescription TEXT NOT NULL DEFAULT '',\n MetricUnit TEXT NOT NULL DEFAULT '',\n Attributes TEXT NOT NULL DEFAULT '{}',\n StartTimeUnix INTEGER NOT NULL,\n TimeUnix INTEGER NOT NULL,\n Value REAL NOT NULL,\n Flags INTEGER NOT NULL DEFAULT 0,\n \"Exemplars.FilteredAttributes\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TimeUnix\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.Value\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.SpanId\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TraceId\" TEXT NOT NULL DEFAULT '[]',\n AggTemporality TEXT NOT NULL DEFAULT '',\n IsMonotonic INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_metrics_sum_service_metric_time ON otel_metrics_sum (ServiceName, MetricName, TimeUnix);\n\n-- =============================================================================\n-- 6. METRICS - HISTOGRAM TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_metrics_histogram (\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ResourceSchemaUrl TEXT NOT NULL DEFAULT '',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n ScopeAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeDroppedAttrCount INTEGER NOT NULL DEFAULT 0,\n ScopeSchemaUrl TEXT NOT NULL DEFAULT '',\n ServiceName TEXT NOT NULL DEFAULT '',\n MetricName TEXT NOT NULL DEFAULT '',\n MetricDescription TEXT NOT NULL DEFAULT '',\n MetricUnit TEXT NOT NULL DEFAULT '',\n Attributes TEXT NOT NULL DEFAULT '{}',\n StartTimeUnix INTEGER NOT NULL,\n TimeUnix INTEGER NOT NULL,\n Count INTEGER NOT NULL DEFAULT 0,\n Sum REAL NOT NULL DEFAULT 0,\n BucketCounts TEXT NOT NULL DEFAULT '[]',\n ExplicitBounds TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.FilteredAttributes\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TimeUnix\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.Value\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.SpanId\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TraceId\" TEXT NOT NULL DEFAULT '[]',\n Min REAL,\n Max REAL,\n AggTemporality TEXT NOT NULL DEFAULT ''\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_metrics_histogram_service_metric_time ON otel_metrics_histogram (ServiceName, MetricName, TimeUnix);\n\n-- =============================================================================\n-- 7. METRICS - EXPONENTIAL HISTOGRAM TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_metrics_exponential_histogram (\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ResourceSchemaUrl TEXT NOT NULL DEFAULT '',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n ScopeAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeDroppedAttrCount INTEGER NOT NULL DEFAULT 0,\n ScopeSchemaUrl TEXT NOT NULL DEFAULT '',\n ServiceName TEXT NOT NULL DEFAULT '',\n MetricName TEXT NOT NULL DEFAULT '',\n MetricDescription TEXT NOT NULL DEFAULT '',\n MetricUnit TEXT NOT NULL DEFAULT '',\n Attributes TEXT NOT NULL DEFAULT '{}',\n StartTimeUnix INTEGER NOT NULL,\n TimeUnix INTEGER NOT NULL,\n Count INTEGER NOT NULL DEFAULT 0,\n Sum REAL NOT NULL DEFAULT 0,\n Scale INTEGER NOT NULL DEFAULT 0,\n ZeroCount INTEGER NOT NULL DEFAULT 0,\n PositiveOffset INTEGER NOT NULL DEFAULT 0,\n PositiveBucketCounts TEXT NOT NULL DEFAULT '[]',\n NegativeOffset INTEGER NOT NULL DEFAULT 0,\n NegativeBucketCounts TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.FilteredAttributes\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TimeUnix\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.Value\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.SpanId\" TEXT NOT NULL DEFAULT '[]',\n \"Exemplars.TraceId\" TEXT NOT NULL DEFAULT '[]',\n Min REAL,\n Max REAL,\n ZeroThreshold REAL NOT NULL DEFAULT 0,\n AggTemporality TEXT NOT NULL DEFAULT ''\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_metrics_exp_histogram_service_metric_time ON otel_metrics_exponential_histogram (ServiceName, MetricName, TimeUnix);\n\n-- =============================================================================\n-- 8. METRICS - SUMMARY TABLE\n-- =============================================================================\n\nCREATE TABLE IF NOT EXISTS otel_metrics_summary (\n ResourceAttributes TEXT NOT NULL DEFAULT '{}',\n ResourceSchemaUrl TEXT NOT NULL DEFAULT '',\n ScopeName TEXT NOT NULL DEFAULT '',\n ScopeVersion TEXT NOT NULL DEFAULT '',\n ScopeAttributes TEXT NOT NULL DEFAULT '{}',\n ScopeDroppedAttrCount INTEGER NOT NULL DEFAULT 0,\n ScopeSchemaUrl TEXT NOT NULL DEFAULT '',\n ServiceName TEXT NOT NULL DEFAULT '',\n MetricName TEXT NOT NULL DEFAULT '',\n MetricDescription TEXT NOT NULL DEFAULT '',\n MetricUnit TEXT NOT NULL DEFAULT '',\n Attributes TEXT NOT NULL DEFAULT '{}',\n StartTimeUnix INTEGER NOT NULL,\n TimeUnix INTEGER NOT NULL,\n Count INTEGER NOT NULL DEFAULT 0,\n Sum REAL NOT NULL DEFAULT 0,\n \"ValueAtQuantiles.Quantile\" TEXT NOT NULL DEFAULT '[]',\n \"ValueAtQuantiles.Value\" TEXT NOT NULL DEFAULT '[]'\n);\n\nCREATE INDEX IF NOT EXISTS idx_otel_metrics_summary_service_metric_time ON otel_metrics_summary (ServiceName, MetricName, TimeUnix);\n`;\n","import type { PathLike } from \"node:fs\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { ddl as openetelemetryTablesSchemaDdl } from \"./sqlite-opentelemetry-ddl.js\";\n\ntype DatabaseSyncParams = ConstructorParameters<typeof DatabaseSync>;\n\nexport function initializeDatabase(\n path: PathLike,\n opts?: DatabaseSyncParams[1]\n) {\n const database = new DatabaseSync(path, opts ?? {});\n\n database.exec(openetelemetryTablesSchemaDdl);\n\n return database;\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kopai/sqlite-datasource",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"author": "Vladimir Adamic",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/kopai-app/kopai-mono.git",
|
|
9
|
+
"directory": "packages/sqlite-datasource"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/kopai-app/kopai-mono/tree/main/packages/sqlite-datasource#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/kopai-app/kopai-mono/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.mts",
|
|
19
|
+
"import": "./dist/index.mjs",
|
|
20
|
+
"require": "./dist/index.cjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"main": "./dist/index.cjs",
|
|
24
|
+
"module": "./dist/index.mjs",
|
|
25
|
+
"types": "./dist/index.d.mts",
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"kysely": "^0.28.10",
|
|
31
|
+
"@kopai/core": "0.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"tsdown": "^0.20.1",
|
|
35
|
+
"@kopai/tsconfig": "0.0.0"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsdown",
|
|
39
|
+
"dev": "tsdown --watch",
|
|
40
|
+
"lint": "eslint src",
|
|
41
|
+
"type-check": "tsc --noEmit",
|
|
42
|
+
"test": "vitest run"
|
|
43
|
+
}
|
|
44
|
+
}
|