@fanar-app/fanar
v0.1.0
Published
Debug receiver for Node.js — see what your app is doing, instantly.
Downloads
27
Readme
fanar
Debug receiver for Node.js — see what your app is doing, instantly.
Send any value from your Node.js app and watch it appear in the Fanar desktop app in real time. Zero dependencies. Works with plain Node, Express, Fastify, and NestJS.
Install
npm install @fanar-app/fanarRequires the Fanar desktop app running on your machine.
Usage
import fanar from '@fanar-app/fanar'
// Primitives
fanar('hello world')
fanar(42)
fanar(true)
// Objects — renders as a collapsible JSON tree
fanar({ user, orders, meta })
// Exceptions — renders with clickable stack frames that open in VS Code
fanar(new Error('something went wrong'))
// SQL queries — syntax highlighted, bindings listed, slow queries flagged red
fanar.query('SELECT * FROM users WHERE id = ?', { bindings: [userId], duration: 12 })
// Timers
const t = fanar.time('render')
// ... do work ...
t.stop()
// Named label and color for any payload
fanar(data).label('after transform').color('purple')
// Clear the desktop app
await fanar.clear()Request context
Automatically group all fanar() calls within a single request. Register the middleware once:
Express / Fastify
app.use(fanar.middleware())Standalone (no HTTP framework)
fanar.run(() => {
fanar('inside this closure — all calls share a request ID')
})NestJS
import { FanarModule, FanarTypeOrmLogger, withFanar, Fanar } from '@fanar-app/fanar/nestjs'Module setup:
// Inline config
FanarModule.forRoot({ enabled: true, host: 'localhost', port: 23517 })
// From ConfigService
FanarModule.forRootAsync({
imports: [ConfigModule],
useFactory: (config: ConfigService) => ({
enabled: config.get('NODE_ENV') !== 'production',
}),
inject: [ConfigService],
})Once imported, a global interceptor fires after every request and sends: method, path, status, duration, and query count.
TypeORM — automatic query logging:
// data-source.ts
import { FanarTypeOrmLogger } from '@fanar-app/fanar/nestjs'
export const AppDataSource = new DataSource({
// ...
logger: new FanarTypeOrmLogger(),
})Prisma — automatic query logging:
import { withFanar } from '@fanar-app/fanar/nestjs'
export const prisma = withFanar(
new PrismaClient({ log: [{ emit: 'event', level: 'query' }] })
)Method tracing:
import { Fanar } from '@fanar-app/fanar/nestjs'
@Injectable()
export class OrderService {
@Fanar()
async createOrder(dto: CreateOrderDto) {
// method name, args, return value, and duration sent automatically
}
}Configuration
fanar.configure({ host: 'localhost', port: 23517 })Or set at startup — the desktop app also accepts FANAR_PORT as an environment variable.
License
MIT
