npm package: @inso_web/els-next
Description: Next.js helpers для @inso_web/els-client — логирование в API routes (Pages + App Router), middleware.ts, edge runtime support. Drop-in замена console.log в Next.js приложениях.
Author: INSOWEB
Latest version: 0.3.0

# @inso_web/els-next

[![npm version](https://img.shields.io/npm/v/@inso_web/els-next.svg)](https://www.npmjs.com/package/@inso_web/els-next)
[![npm downloads](https://img.shields.io/npm/dm/@inso_web/els-next.svg)](https://www.npmjs.com/package/@inso_web/els-next)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](https://www.typescriptlang.org/)

Next.js helpers поверх [`@inso_web/els-client`](https://www.npmjs.com/package/@inso_web/els-client). Поддержка Pages Router, App Router, middleware.ts и edge runtime.

## Что внутри

- **`createELSLogger(config)`** — singleton-фабрика клиента-логгера для всего приложения
- **`withELSLogger`** — HOC для Pages Router API routes (добавляет `req.log` и `req.id`)
- **`withELSRouteLogger`** — wrapper для App Router route handlers (передаёт `{ log, reqId }` вторым аргументом)
- **`withELSMiddleware`** — helper для `middleware.ts` (генерация request id)

## Quick Start

```bash
npm i @inso_web/els-next next
```

### `lib/els.ts`

```ts
import { createELSLogger } from "@inso_web/els-next";

export const log = createELSLogger({
  endpoint: "https://api.insoweb.ru/els",
  apiKey: process.env.ELS_API_KEY!,
  appSlug: "my-next-app",
  serviceName: "next-api",
  deploymentEnv: "PRODUCTION",
  minLevel: "info",
});
```

### Pages Router (`pages/api/users/[id].ts`)

```ts
import { withELSLogger, type NextApiRequestWithLogger } from "@inso_web/els-next";
import type { NextApiResponse } from "next";
import "@/lib/els"; // initialize singleton

export default withELSLogger(async (req: NextApiRequestWithLogger, res: NextApiResponse) => {
  req.log.info({ userId: req.query.id }, "Fetching user");
  res.json({ id: req.query.id });
});
```

### App Router (`app/api/users/[id]/route.ts`)

```ts
import { withELSRouteLogger } from "@inso_web/els-next";
import { NextResponse } from "next/server";
import "@/lib/els";

export const GET = withELSRouteLogger(async (req, { log }) => {
  log.info("Fetching user");
  return NextResponse.json({ ok: true });
});
```

### `middleware.ts`

```ts
import { withELSMiddleware } from "@inso_web/els-next";

export const middleware = withELSMiddleware();

export const config = {
  matcher: ["/((?!_next/static|favicon.ico).*)"],
};
```

## Migration from console.log

```diff
  // pages/api/users.ts
- export default async function handler(req, res) {
-   console.log('Fetching user', req.query.id);
+ import { withELSLogger } from '@inso_web/els-next';
+ export default withELSLogger(async (req, res) => {
+   req.log.info({ id: req.query.id }, 'Fetching user');
    res.json({ ok: true });
- }
+ });
```

## Migration from pino

```diff
- import pino from 'pino';
- const log = pino();
+ import { createELSLogger } from '@inso_web/els-next';
+ const log = createELSLogger({ endpoint, apiKey, appSlug });

// Дальше API совпадает: log.info(), log.warn(), log.error(), log.child()
```

## Edge Runtime notes

`withELSRouteLogger` и `withELSMiddleware` работают в Edge Runtime, потому что используют только Web Crypto API (`crypto.randomUUID()`) и стандартные `Request`/`Response`. `withELSLogger` (Pages Router) тоже работает в Edge — Next 14 поддерживает Edge API routes.

Если ваш runtime — Node.js (по умолчанию для API routes в Pages Router), всё работает без оговорок.

## License

MIT