Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions examples/tanstack-start/nitro.config.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { defineConfig } from 'nitro'
import type { NitroConfig } from 'nitro/types'
import evlog from 'evlog/nitro/v3'

/* `evlog/nitro/v3` may resolve a different `nitro` version than this example's
* `nitro-nightly`. Runtime behavior matches; align the module slot for tsc. */
type NitroUserConfig = Parameters<typeof defineConfig>[0]
type NitroModuleSlot = NonNullable<NitroUserConfig['modules']>[number]
type NitroModuleSlot = NonNullable<NitroConfig['modules']>[number]

export default defineConfig({
export default {
experimental: {
asyncContext: true,
},
Expand All @@ -15,4 +14,4 @@ export default defineConfig({
env: { service: 'tanstack-start-example' },
}) as unknown as NitroModuleSlot,
],
})
} satisfies NitroConfig
2 changes: 1 addition & 1 deletion examples/tanstack-start/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { nitro } from 'nitro/vite'
* app's `vite` — assert once here instead of drowning in TS2769 chains. */
const plugins = [
devtools(),
nitro({ rollupConfig: { external: [/^@sentry\//] } }),
nitro(),
tsconfigPaths({ projects: ['./tsconfig.json'] }),
tailwindcss(),
tanstackStart(),
Expand Down
2 changes: 1 addition & 1 deletion packages/evlog/src/adapters/axiom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ const AXIOM_FIELDS: ConfigField<ResolvedAxiomConfig>[] = [

let warnedAboutToken = false

function applyApiKeyAlias(config: ResolvedAxiomConfig): ResolvedAxiomConfig {
function applyApiKeyAlias(config: Partial<ResolvedAxiomConfig>): Partial<ResolvedAxiomConfig> {
if (!config.apiKey && config.token) {
if (!warnedAboutToken) {
warnedAboutToken = true
Expand Down
8 changes: 4 additions & 4 deletions packages/evlog/src/audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ function decorateAudit(audit: AuditFields, timestamp: string): AuditFields {
*/
export function withAuditMethods<T extends object = Record<string, unknown>>(logger: RequestLogger<T>): AuditableLogger<T> {
const target = logger as AuditableLogger<T>
if (target.audit) return target
if ((target as { audit?: AuditMethod<T> }).audit) return target

const audit = function audit(input: AuditInput): void {
const fields = buildAuditFields(input)
Expand Down Expand Up @@ -424,11 +424,11 @@ export function defineAuditAction<TTargetType extends string | undefined = undef
const targetType = options?.target
return (input) => {
const merged: AuditInput = {
...input,
...(input as AuditInput),
action,
}
if (targetType && input.target && !input.target.type) {
merged.target = { ...input.target, type: targetType }
merged.target = { ...input.target, type: targetType } as AuditTarget
}
return merged
}
Expand Down Expand Up @@ -511,7 +511,7 @@ function matchesAudit(event: AuditFields, matcher: AuditMatcher): boolean {
if (matcher.outcome !== undefined && event.outcome !== matcher.outcome) return false
if (matcher.actor) {
for (const [k, v] of Object.entries(matcher.actor)) {
if ((event.actor as Record<string, unknown>)[k] !== v) return false
if ((event.actor as unknown as Record<string, unknown>)[k] !== v) return false
}
}
if (matcher.target) {
Expand Down
2 changes: 1 addition & 1 deletion packages/evlog/src/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ export function defineError<
const TEntry extends ErrorCatalogEntry,
>(code: TCode, entry: TEntry): DefinedError<TCode, TEntry> {
const factory = ((...args: unknown[]) =>
buildEvlogError(code, entry, args[0] as Record<string, unknown> | undefined)) as DefinedError<TCode, TEntry>
buildEvlogError(code, entry, args[0] as Record<string, unknown> | undefined)) as unknown as DefinedError<TCode, TEntry>

Object.defineProperties(factory, {
code: { value: code, enumerable: true },
Expand Down
2 changes: 1 addition & 1 deletion packages/evlog/src/express/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export { useLogger }

declare module 'express-serve-static-core' {
interface Request {
log: RequestLogger
log?: RequestLogger
}
}

Expand Down
5 changes: 3 additions & 2 deletions packages/evlog/src/fastify/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { FastifyPluginCallback, FastifyRequest } from 'fastify'
import type { RequestLogger } from '../types'
import { defineFrameworkIntegration } from '../shared/integration'
import type { BaseEvlogOptions } from '../shared/middleware'
import { createLoggerStorage } from '../shared/storage'
Expand All @@ -13,8 +14,8 @@ export { useLogger }

declare module 'fastify' {
interface FastifyRequest {
// Overrides Fastify's built-in pino logger on the request with evlog's RequestLogger.
log: any
// @ts-expect-error intentionally overrides Fastify's built-in pino logger with evlog's RequestLogger
log: RequestLogger
}
}

Expand Down
4 changes: 2 additions & 2 deletions packages/evlog/src/next/instrumentation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ export function createInstrumentation(options: InstrumentationOptions = {}): Ins
patching = false
}
}
return originalStdoutWrite(chunk, ...args as [])
return originalStdoutWrite(chunk as string, ...args as [])
} as typeof process.stdout.write

proc.stderr.write = function(chunk: unknown, ...args: unknown[]): boolean {
Expand All @@ -155,7 +155,7 @@ export function createInstrumentation(options: InstrumentationOptions = {}): Ins
patching = false
}
}
return originalStderrWrite(chunk, ...args as [])
return originalStderrWrite(chunk as string, ...args as [])
} as typeof process.stderr.write
}

Expand Down
5 changes: 4 additions & 1 deletion packages/evlog/src/next/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ type NextRequest = {
}

type NextResponse = {
headers: { set(name: string, value: string): void }
headers: {
set(name: string, value: string): void
get(name: string): string | null
}
}

type NextResponseStatic = {
Expand Down
1 change: 1 addition & 0 deletions packages/evlog/src/shared/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ const noopResult: MiddlewareLoggerResult = {
error() {},
info() {},
warn() {},
setLevel() {},
emit() {
return null
},
Expand Down
2 changes: 1 addition & 1 deletion packages/evlog/src/sveltekit/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export { useLogger }
*/
type SvelteKitHandle = (input: {
event: { request: Request; url: URL; locals: Record<string, any> }
resolve: (event: any) => Promise<Response>
resolve: (...args: any[]) => Response | Promise<Response>
}) => Promise<Response>

/**
Expand Down
13 changes: 11 additions & 2 deletions packages/evlog/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,20 @@ export const SENSITIVE_HEADERS = [
'proxy-authorization',
]

export function filterSafeHeaders(headers: Record<string, string>): Record<string, string> {
/**
* Filter out undefined values and sensitive headers from a raw header map.
*
* @param headers - Flat header map where values may be `undefined`
* (e.g. from `IncomingMessage.headers` or a framework's header accessor).
* @returns A new object containing only the headers whose values are defined
* and whose lowercased key is not in the built-in sensitive-header list
* (e.g. `authorization`, `cookie`, `x-api-key`).
*/
export function filterSafeHeaders(headers: Partial<Record<string, string | undefined>>): Record<string, string> {
const safeHeaders: Record<string, string> = {}

for (const [key, value] of Object.entries(headers)) {
if (!SENSITIVE_HEADERS.includes(key.toLowerCase())) {
if (value !== undefined && !SENSITIVE_HEADERS.includes(key.toLowerCase())) {
safeHeaders[key] = value
}
}
Expand Down
32 changes: 16 additions & 16 deletions packages/evlog/test/adapters/axiom.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

expect(fetchSpy).toHaveBeenCalledTimes(1)
Expand All @@ -42,7 +42,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
baseUrl: 'https://custom.axiom.co',
})

Expand All @@ -55,7 +55,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
edgeUrl: 'https://eu-central-1.aws.edge.axiom.co',
})

Expand All @@ -68,7 +68,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
edgeUrl: 'http://localhost:3400/custom/ingest/',
})

Expand All @@ -81,7 +81,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my dataset/test',
token: 'test-token',
apiKey: 'test-token',
})

const [url] = fetchSpy.mock.calls[0] as [string, RequestInit]
Expand All @@ -93,7 +93,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my dataset/test',
token: 'test-token',
apiKey: 'test-token',
edgeUrl: 'https://eu-central-1.aws.edge.axiom.co',
})

Expand All @@ -106,7 +106,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'my-secret-token',
apiKey: 'my-secret-token',
})

const [, options] = fetchSpy.mock.calls[0] as [string, RequestInit]
Expand All @@ -120,7 +120,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
orgId: 'my-org-123',
})

Expand All @@ -135,7 +135,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

const [, options] = fetchSpy.mock.calls[0] as [string, RequestInit]
Expand All @@ -148,7 +148,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

const [, options] = fetchSpy.mock.calls[0] as [string, RequestInit]
Expand All @@ -162,7 +162,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

const [, options] = fetchSpy.mock.calls[0] as [string, RequestInit]
Expand All @@ -179,7 +179,7 @@ describe('axiom adapter', () => {

await expect(sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})).rejects.toThrow('Axiom API error: 400 Bad Request')
})
})
Expand All @@ -194,7 +194,7 @@ describe('axiom adapter', () => {

await sendBatchToAxiom(events, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

expect(fetchSpy).toHaveBeenCalledTimes(1)
Expand All @@ -207,7 +207,7 @@ describe('axiom adapter', () => {
it('sends empty array when no events', async () => {
await sendBatchToAxiom([], {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

const [, options] = fetchSpy.mock.calls[0] as [string, RequestInit]
Expand All @@ -225,7 +225,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
})

expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000)
Expand All @@ -237,7 +237,7 @@ describe('axiom adapter', () => {

await sendToAxiom(event, {
dataset: 'my-dataset',
token: 'test-token',
apiKey: 'test-token',
timeout: 10000,
})

Expand Down
Loading
Loading