@easydocs/nextjs 0.4.2 → 0.5.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/dist/index.cjs CHANGED
@@ -26,6 +26,7 @@ __export(index_exports, {
26
26
  module.exports = __toCommonJS(index_exports);
27
27
  var import_core = require("@easydocs/core");
28
28
  function withEasydocs(handler, config) {
29
+ const parsedConfig = (0, import_core.parseConfig)(config);
29
30
  return async (req, ctx) => {
30
31
  const startedAt = Date.now();
31
32
  const response = await handler(req, ctx);
@@ -46,42 +47,42 @@ function withEasydocs(handler, config) {
46
47
  }
47
48
  }
48
49
  (0, import_core.capture)(
49
- {
50
+ (0, import_core.buildCaptureEvent)({
50
51
  method: req.method,
51
52
  path: req.nextUrl.pathname,
52
53
  query: Object.fromEntries(req.nextUrl.searchParams.entries()),
53
54
  params: resolvedParams,
54
- body: requestBody,
55
- response: responseBody,
55
+ requestBody,
56
+ responseBody,
56
57
  status: response.status,
57
58
  requestHeaders: Object.fromEntries(req.headers.entries()),
58
59
  responseHeaders: Object.fromEntries(response.headers.entries()),
59
60
  durationMs: Date.now() - startedAt
60
- },
61
- config
61
+ }),
62
+ parsedConfig
62
63
  );
63
64
  return response;
64
65
  };
65
66
  }
66
67
  function withEasydocsPagesHandler(handler, config) {
68
+ const parsedConfig = (0, import_core.parseConfig)(config);
67
69
  return async (req, res) => {
68
70
  const startedAt = Date.now();
69
71
  const originalJson = res.json.bind(res);
70
72
  res.json = function(body) {
71
73
  (0, import_core.capture)(
72
- {
74
+ (0, import_core.buildCaptureEvent)({
73
75
  method: req.method ?? "GET",
74
76
  path: req.url?.split("?")[0] ?? "/",
75
77
  query: req.query,
76
- params: {},
77
- body: req.body,
78
- response: body,
78
+ requestBody: req.body,
79
+ responseBody: body,
79
80
  status: res.statusCode,
80
81
  requestHeaders: req.headers,
81
82
  responseHeaders: res.getHeaders(),
82
83
  durationMs: Date.now() - startedAt
83
- },
84
- config
84
+ }),
85
+ parsedConfig
85
86
  );
86
87
  return originalJson(body);
87
88
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { capture } from '@easydocs/core'\nimport type { EasyDocsConfig, HttpMethod } from '@easydocs/core'\n\n// ─── Local structural types (avoid importing from next at build time) ──────────\n\ninterface NextURL {\n pathname: string\n searchParams: URLSearchParams\n}\n\ninterface NextRequestLike {\n method: string\n nextUrl: NextURL\n headers: Headers\n clone(): { json(): Promise<unknown> }\n}\n\ninterface NextApiRequestLike {\n method?: string\n url?: string\n query: Record<string, string | string[]>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\ninterface NextApiResponseLike {\n statusCode: number\n json: (body: unknown) => NextApiResponseLike\n getHeaders(): Record<string, string | string[] | number | undefined>\n}\n\n// ─── App Router ───────────────────────────────────────────────────────────────\n\ntype AppRouterContext = { params?: Promise<Record<string, string>> | Record<string, string> }\ntype AppRouterHandler = (req: NextRequestLike, ctx?: AppRouterContext) => Promise<Response> | Response\n\nexport function withEasydocs(handler: AppRouterHandler, config?: EasyDocsConfig): AppRouterHandler {\n return async (req, ctx) => {\n const startedAt = Date.now()\n const response = await handler(req, ctx)\n\n let responseBody: unknown = null\n try {\n responseBody = await response.clone().json()\n } catch {\n // non-JSON response — skip body capture\n }\n\n let resolvedParams: Record<string, string> = {}\n if (ctx?.params) {\n resolvedParams =\n ctx.params instanceof Promise ? await ctx.params : (ctx.params as Record<string, string>)\n }\n\n let requestBody: unknown = null\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n try {\n requestBody = await req.clone().json()\n } catch {\n // non-JSON body\n }\n }\n\n capture(\n {\n method: req.method as HttpMethod,\n path: req.nextUrl.pathname,\n query: Object.fromEntries(req.nextUrl.searchParams.entries()),\n params: resolvedParams,\n body: requestBody,\n response: responseBody,\n status: response.status,\n requestHeaders: Object.fromEntries(req.headers.entries()),\n responseHeaders: Object.fromEntries(response.headers.entries()),\n durationMs: Date.now() - startedAt,\n },\n config\n )\n\n return response\n }\n}\n\n// ─── Pages Router ─────────────────────────────────────────────────────────────\n\ntype PagesHandler = (req: NextApiRequestLike, res: NextApiResponseLike) => void | Promise<void>\n\nexport function withEasydocsPagesHandler(\n handler: PagesHandler,\n config?: EasyDocsConfig\n): PagesHandler {\n return async (req, res) => {\n const startedAt = Date.now()\n const originalJson = res.json.bind(res)\n\n res.json = function (body: unknown) {\n capture(\n {\n method: (req.method ?? 'GET') as HttpMethod,\n path: req.url?.split('?')[0] ?? '/',\n query: req.query as Record<string, string>,\n params: {},\n body: req.body,\n response: body,\n status: res.statusCode,\n requestHeaders: req.headers as Record<string, string>,\n responseHeaders: res.getHeaders() as Record<string, string>,\n durationMs: Date.now() - startedAt,\n },\n config\n )\n return originalJson(body)\n }\n\n await handler(req, res)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAoCjB,SAAS,aAAa,SAA2B,QAA2C;AACjG,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,WAAW,MAAM,QAAQ,KAAK,GAAG;AAEvC,QAAI,eAAwB;AAC5B,QAAI;AACF,qBAAe,MAAM,SAAS,MAAM,EAAE,KAAK;AAAA,IAC7C,QAAQ;AAAA,IAER;AAEA,QAAI,iBAAyC,CAAC;AAC9C,QAAI,KAAK,QAAQ;AACf,uBACE,IAAI,kBAAkB,UAAU,MAAM,IAAI,SAAU,IAAI;AAAA,IAC5D;AAEA,QAAI,cAAuB;AAC3B,QAAI,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AACjD,UAAI;AACF,sBAAc,MAAM,IAAI,MAAM,EAAE,KAAK;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA;AAAA,MACE;AAAA,QACE,QAAQ,IAAI;AAAA,QACZ,MAAM,IAAI,QAAQ;AAAA,QAClB,OAAO,OAAO,YAAY,IAAI,QAAQ,aAAa,QAAQ,CAAC;AAAA,QAC5D,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,gBAAgB,OAAO,YAAY,IAAI,QAAQ,QAAQ,CAAC;AAAA,QACxD,iBAAiB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,QAC9D,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,yBACd,SACA,QACc;AACd,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAEtC,QAAI,OAAO,SAAU,MAAe;AAClC;AAAA,QACE;AAAA,UACE,QAAS,IAAI,UAAU;AAAA,UACvB,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,UAChC,OAAO,IAAI;AAAA,UACX,QAAQ,CAAC;AAAA,UACT,MAAM,IAAI;AAAA,UACV,UAAU;AAAA,UACV,QAAQ,IAAI;AAAA,UACZ,gBAAgB,IAAI;AAAA,UACpB,iBAAiB,IAAI,WAAW;AAAA,UAChC,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AACA,aAAO,aAAa,IAAI;AAAA,IAC1B;AAEA,UAAM,QAAQ,KAAK,GAAG;AAAA,EACxB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { capture, parseConfig, buildCaptureEvent } from '@easydocs/core'\nimport type { EasyDocsConfig } from '@easydocs/core'\n\n// ─── Local structural types (avoid importing from next at build time) ──────────\n\ninterface NextURL {\n pathname: string\n searchParams: URLSearchParams\n}\n\ninterface NextRequestLike {\n method: string\n nextUrl: NextURL\n headers: Headers\n clone(): { json(): Promise<unknown> }\n}\n\ninterface NextApiRequestLike {\n method?: string\n url?: string\n query: Record<string, string | string[]>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\ninterface NextApiResponseLike {\n statusCode: number\n json: (body: unknown) => NextApiResponseLike\n getHeaders(): Record<string, string | string[] | number | undefined>\n}\n\n// ─── App Router ───────────────────────────────────────────────────────────────\n\ntype AppRouterContext = { params?: Promise<Record<string, string>> | Record<string, string> }\ntype AppRouterHandler = (req: NextRequestLike, ctx?: AppRouterContext) => Promise<Response> | Response\n\nexport function withEasydocs(handler: AppRouterHandler, config?: EasyDocsConfig): AppRouterHandler {\n const parsedConfig = parseConfig(config)\n return async (req, ctx) => {\n const startedAt = Date.now()\n const response = await handler(req, ctx)\n\n let responseBody: unknown = null\n try {\n responseBody = await response.clone().json()\n } catch {\n // non-JSON response\n }\n\n let resolvedParams: Record<string, string> = {}\n if (ctx?.params) {\n resolvedParams =\n ctx.params instanceof Promise ? await ctx.params : (ctx.params as Record<string, string>)\n }\n\n let requestBody: unknown = null\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n try {\n requestBody = await req.clone().json()\n } catch {\n // non-JSON body\n }\n }\n\n capture(\n buildCaptureEvent({\n method: req.method,\n path: req.nextUrl.pathname,\n query: Object.fromEntries(req.nextUrl.searchParams.entries()),\n params: resolvedParams,\n requestBody,\n responseBody,\n status: response.status,\n requestHeaders: Object.fromEntries(req.headers.entries()),\n responseHeaders: Object.fromEntries(response.headers.entries()),\n durationMs: Date.now() - startedAt,\n }),\n parsedConfig\n )\n\n return response\n }\n}\n\n// ─── Pages Router ─────────────────────────────────────────────────────────────\n\ntype PagesHandler = (req: NextApiRequestLike, res: NextApiResponseLike) => void | Promise<void>\n\nexport function withEasydocsPagesHandler(\n handler: PagesHandler,\n config?: EasyDocsConfig\n): PagesHandler {\n const parsedConfig = parseConfig(config)\n return async (req, res) => {\n const startedAt = Date.now()\n const originalJson = res.json.bind(res)\n\n res.json = function (body: unknown) {\n capture(\n buildCaptureEvent({\n method: req.method ?? 'GET',\n path: req.url?.split('?')[0] ?? '/',\n query: req.query as Record<string, unknown>,\n requestBody: req.body,\n responseBody: body,\n status: res.statusCode,\n requestHeaders: req.headers as Record<string, unknown>,\n responseHeaders: res.getHeaders() as Record<string, unknown>,\n durationMs: Date.now() - startedAt,\n }),\n parsedConfig\n )\n return originalJson(body)\n }\n\n await handler(req, res)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwD;AAoCjD,SAAS,aAAa,SAA2B,QAA2C;AACjG,QAAM,mBAAe,yBAAY,MAAM;AACvC,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,WAAW,MAAM,QAAQ,KAAK,GAAG;AAEvC,QAAI,eAAwB;AAC5B,QAAI;AACF,qBAAe,MAAM,SAAS,MAAM,EAAE,KAAK;AAAA,IAC7C,QAAQ;AAAA,IAER;AAEA,QAAI,iBAAyC,CAAC;AAC9C,QAAI,KAAK,QAAQ;AACf,uBACE,IAAI,kBAAkB,UAAU,MAAM,IAAI,SAAU,IAAI;AAAA,IAC5D;AAEA,QAAI,cAAuB;AAC3B,QAAI,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AACjD,UAAI;AACF,sBAAc,MAAM,IAAI,MAAM,EAAE,KAAK;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA;AAAA,UACE,+BAAkB;AAAA,QAChB,QAAQ,IAAI;AAAA,QACZ,MAAM,IAAI,QAAQ;AAAA,QAClB,OAAO,OAAO,YAAY,IAAI,QAAQ,aAAa,QAAQ,CAAC;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,gBAAgB,OAAO,YAAY,IAAI,QAAQ,QAAQ,CAAC;AAAA,QACxD,iBAAiB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,QAC9D,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B,CAAC;AAAA,MACD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,yBACd,SACA,QACc;AACd,QAAM,mBAAe,yBAAY,MAAM;AACvC,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAEtC,QAAI,OAAO,SAAU,MAAe;AAClC;AAAA,YACE,+BAAkB;AAAA,UAChB,QAAQ,IAAI,UAAU;AAAA,UACtB,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,UAChC,OAAO,IAAI;AAAA,UACX,aAAa,IAAI;AAAA,UACjB,cAAc;AAAA,UACd,QAAQ,IAAI;AAAA,UACZ,gBAAgB,IAAI;AAAA,UACpB,iBAAiB,IAAI,WAAW;AAAA,UAChC,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B,CAAC;AAAA,QACD;AAAA,MACF;AACA,aAAO,aAAa,IAAI;AAAA,IAC1B;AAEA,UAAM,QAAQ,KAAK,GAAG;AAAA,EACxB;AACF;","names":[]}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
- import { capture } from "@easydocs/core";
2
+ import { capture, parseConfig, buildCaptureEvent } from "@easydocs/core";
3
3
  function withEasydocs(handler, config) {
4
+ const parsedConfig = parseConfig(config);
4
5
  return async (req, ctx) => {
5
6
  const startedAt = Date.now();
6
7
  const response = await handler(req, ctx);
@@ -21,42 +22,42 @@ function withEasydocs(handler, config) {
21
22
  }
22
23
  }
23
24
  capture(
24
- {
25
+ buildCaptureEvent({
25
26
  method: req.method,
26
27
  path: req.nextUrl.pathname,
27
28
  query: Object.fromEntries(req.nextUrl.searchParams.entries()),
28
29
  params: resolvedParams,
29
- body: requestBody,
30
- response: responseBody,
30
+ requestBody,
31
+ responseBody,
31
32
  status: response.status,
32
33
  requestHeaders: Object.fromEntries(req.headers.entries()),
33
34
  responseHeaders: Object.fromEntries(response.headers.entries()),
34
35
  durationMs: Date.now() - startedAt
35
- },
36
- config
36
+ }),
37
+ parsedConfig
37
38
  );
38
39
  return response;
39
40
  };
40
41
  }
41
42
  function withEasydocsPagesHandler(handler, config) {
43
+ const parsedConfig = parseConfig(config);
42
44
  return async (req, res) => {
43
45
  const startedAt = Date.now();
44
46
  const originalJson = res.json.bind(res);
45
47
  res.json = function(body) {
46
48
  capture(
47
- {
49
+ buildCaptureEvent({
48
50
  method: req.method ?? "GET",
49
51
  path: req.url?.split("?")[0] ?? "/",
50
52
  query: req.query,
51
- params: {},
52
- body: req.body,
53
- response: body,
53
+ requestBody: req.body,
54
+ responseBody: body,
54
55
  status: res.statusCode,
55
56
  requestHeaders: req.headers,
56
57
  responseHeaders: res.getHeaders(),
57
58
  durationMs: Date.now() - startedAt
58
- },
59
- config
59
+ }),
60
+ parsedConfig
60
61
  );
61
62
  return originalJson(body);
62
63
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { capture } from '@easydocs/core'\nimport type { EasyDocsConfig, HttpMethod } from '@easydocs/core'\n\n// ─── Local structural types (avoid importing from next at build time) ──────────\n\ninterface NextURL {\n pathname: string\n searchParams: URLSearchParams\n}\n\ninterface NextRequestLike {\n method: string\n nextUrl: NextURL\n headers: Headers\n clone(): { json(): Promise<unknown> }\n}\n\ninterface NextApiRequestLike {\n method?: string\n url?: string\n query: Record<string, string | string[]>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\ninterface NextApiResponseLike {\n statusCode: number\n json: (body: unknown) => NextApiResponseLike\n getHeaders(): Record<string, string | string[] | number | undefined>\n}\n\n// ─── App Router ───────────────────────────────────────────────────────────────\n\ntype AppRouterContext = { params?: Promise<Record<string, string>> | Record<string, string> }\ntype AppRouterHandler = (req: NextRequestLike, ctx?: AppRouterContext) => Promise<Response> | Response\n\nexport function withEasydocs(handler: AppRouterHandler, config?: EasyDocsConfig): AppRouterHandler {\n return async (req, ctx) => {\n const startedAt = Date.now()\n const response = await handler(req, ctx)\n\n let responseBody: unknown = null\n try {\n responseBody = await response.clone().json()\n } catch {\n // non-JSON response — skip body capture\n }\n\n let resolvedParams: Record<string, string> = {}\n if (ctx?.params) {\n resolvedParams =\n ctx.params instanceof Promise ? await ctx.params : (ctx.params as Record<string, string>)\n }\n\n let requestBody: unknown = null\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n try {\n requestBody = await req.clone().json()\n } catch {\n // non-JSON body\n }\n }\n\n capture(\n {\n method: req.method as HttpMethod,\n path: req.nextUrl.pathname,\n query: Object.fromEntries(req.nextUrl.searchParams.entries()),\n params: resolvedParams,\n body: requestBody,\n response: responseBody,\n status: response.status,\n requestHeaders: Object.fromEntries(req.headers.entries()),\n responseHeaders: Object.fromEntries(response.headers.entries()),\n durationMs: Date.now() - startedAt,\n },\n config\n )\n\n return response\n }\n}\n\n// ─── Pages Router ─────────────────────────────────────────────────────────────\n\ntype PagesHandler = (req: NextApiRequestLike, res: NextApiResponseLike) => void | Promise<void>\n\nexport function withEasydocsPagesHandler(\n handler: PagesHandler,\n config?: EasyDocsConfig\n): PagesHandler {\n return async (req, res) => {\n const startedAt = Date.now()\n const originalJson = res.json.bind(res)\n\n res.json = function (body: unknown) {\n capture(\n {\n method: (req.method ?? 'GET') as HttpMethod,\n path: req.url?.split('?')[0] ?? '/',\n query: req.query as Record<string, string>,\n params: {},\n body: req.body,\n response: body,\n status: res.statusCode,\n requestHeaders: req.headers as Record<string, string>,\n responseHeaders: res.getHeaders() as Record<string, string>,\n durationMs: Date.now() - startedAt,\n },\n config\n )\n return originalJson(body)\n }\n\n await handler(req, res)\n }\n}\n"],"mappings":";AAAA,SAAS,eAAe;AAoCjB,SAAS,aAAa,SAA2B,QAA2C;AACjG,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,WAAW,MAAM,QAAQ,KAAK,GAAG;AAEvC,QAAI,eAAwB;AAC5B,QAAI;AACF,qBAAe,MAAM,SAAS,MAAM,EAAE,KAAK;AAAA,IAC7C,QAAQ;AAAA,IAER;AAEA,QAAI,iBAAyC,CAAC;AAC9C,QAAI,KAAK,QAAQ;AACf,uBACE,IAAI,kBAAkB,UAAU,MAAM,IAAI,SAAU,IAAI;AAAA,IAC5D;AAEA,QAAI,cAAuB;AAC3B,QAAI,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AACjD,UAAI;AACF,sBAAc,MAAM,IAAI,MAAM,EAAE,KAAK;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA;AAAA,MACE;AAAA,QACE,QAAQ,IAAI;AAAA,QACZ,MAAM,IAAI,QAAQ;AAAA,QAClB,OAAO,OAAO,YAAY,IAAI,QAAQ,aAAa,QAAQ,CAAC;AAAA,QAC5D,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,gBAAgB,OAAO,YAAY,IAAI,QAAQ,QAAQ,CAAC;AAAA,QACxD,iBAAiB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,QAC9D,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,yBACd,SACA,QACc;AACd,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAEtC,QAAI,OAAO,SAAU,MAAe;AAClC;AAAA,QACE;AAAA,UACE,QAAS,IAAI,UAAU;AAAA,UACvB,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,UAChC,OAAO,IAAI;AAAA,UACX,QAAQ,CAAC;AAAA,UACT,MAAM,IAAI;AAAA,UACV,UAAU;AAAA,UACV,QAAQ,IAAI;AAAA,UACZ,gBAAgB,IAAI;AAAA,UACpB,iBAAiB,IAAI,WAAW;AAAA,UAChC,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AACA,aAAO,aAAa,IAAI;AAAA,IAC1B;AAEA,UAAM,QAAQ,KAAK,GAAG;AAAA,EACxB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { capture, parseConfig, buildCaptureEvent } from '@easydocs/core'\nimport type { EasyDocsConfig } from '@easydocs/core'\n\n// ─── Local structural types (avoid importing from next at build time) ──────────\n\ninterface NextURL {\n pathname: string\n searchParams: URLSearchParams\n}\n\ninterface NextRequestLike {\n method: string\n nextUrl: NextURL\n headers: Headers\n clone(): { json(): Promise<unknown> }\n}\n\ninterface NextApiRequestLike {\n method?: string\n url?: string\n query: Record<string, string | string[]>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\ninterface NextApiResponseLike {\n statusCode: number\n json: (body: unknown) => NextApiResponseLike\n getHeaders(): Record<string, string | string[] | number | undefined>\n}\n\n// ─── App Router ───────────────────────────────────────────────────────────────\n\ntype AppRouterContext = { params?: Promise<Record<string, string>> | Record<string, string> }\ntype AppRouterHandler = (req: NextRequestLike, ctx?: AppRouterContext) => Promise<Response> | Response\n\nexport function withEasydocs(handler: AppRouterHandler, config?: EasyDocsConfig): AppRouterHandler {\n const parsedConfig = parseConfig(config)\n return async (req, ctx) => {\n const startedAt = Date.now()\n const response = await handler(req, ctx)\n\n let responseBody: unknown = null\n try {\n responseBody = await response.clone().json()\n } catch {\n // non-JSON response\n }\n\n let resolvedParams: Record<string, string> = {}\n if (ctx?.params) {\n resolvedParams =\n ctx.params instanceof Promise ? await ctx.params : (ctx.params as Record<string, string>)\n }\n\n let requestBody: unknown = null\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n try {\n requestBody = await req.clone().json()\n } catch {\n // non-JSON body\n }\n }\n\n capture(\n buildCaptureEvent({\n method: req.method,\n path: req.nextUrl.pathname,\n query: Object.fromEntries(req.nextUrl.searchParams.entries()),\n params: resolvedParams,\n requestBody,\n responseBody,\n status: response.status,\n requestHeaders: Object.fromEntries(req.headers.entries()),\n responseHeaders: Object.fromEntries(response.headers.entries()),\n durationMs: Date.now() - startedAt,\n }),\n parsedConfig\n )\n\n return response\n }\n}\n\n// ─── Pages Router ─────────────────────────────────────────────────────────────\n\ntype PagesHandler = (req: NextApiRequestLike, res: NextApiResponseLike) => void | Promise<void>\n\nexport function withEasydocsPagesHandler(\n handler: PagesHandler,\n config?: EasyDocsConfig\n): PagesHandler {\n const parsedConfig = parseConfig(config)\n return async (req, res) => {\n const startedAt = Date.now()\n const originalJson = res.json.bind(res)\n\n res.json = function (body: unknown) {\n capture(\n buildCaptureEvent({\n method: req.method ?? 'GET',\n path: req.url?.split('?')[0] ?? '/',\n query: req.query as Record<string, unknown>,\n requestBody: req.body,\n responseBody: body,\n status: res.statusCode,\n requestHeaders: req.headers as Record<string, unknown>,\n responseHeaders: res.getHeaders() as Record<string, unknown>,\n durationMs: Date.now() - startedAt,\n }),\n parsedConfig\n )\n return originalJson(body)\n }\n\n await handler(req, res)\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS,aAAa,yBAAyB;AAoCjD,SAAS,aAAa,SAA2B,QAA2C;AACjG,QAAM,eAAe,YAAY,MAAM;AACvC,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,WAAW,MAAM,QAAQ,KAAK,GAAG;AAEvC,QAAI,eAAwB;AAC5B,QAAI;AACF,qBAAe,MAAM,SAAS,MAAM,EAAE,KAAK;AAAA,IAC7C,QAAQ;AAAA,IAER;AAEA,QAAI,iBAAyC,CAAC;AAC9C,QAAI,KAAK,QAAQ;AACf,uBACE,IAAI,kBAAkB,UAAU,MAAM,IAAI,SAAU,IAAI;AAAA,IAC5D;AAEA,QAAI,cAAuB;AAC3B,QAAI,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AACjD,UAAI;AACF,sBAAc,MAAM,IAAI,MAAM,EAAE,KAAK;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA;AAAA,MACE,kBAAkB;AAAA,QAChB,QAAQ,IAAI;AAAA,QACZ,MAAM,IAAI,QAAQ;AAAA,QAClB,OAAO,OAAO,YAAY,IAAI,QAAQ,aAAa,QAAQ,CAAC;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,gBAAgB,OAAO,YAAY,IAAI,QAAQ,QAAQ,CAAC;AAAA,QACxD,iBAAiB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,QAC9D,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B,CAAC;AAAA,MACD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,yBACd,SACA,QACc;AACd,QAAM,eAAe,YAAY,MAAM;AACvC,SAAO,OAAO,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAEtC,QAAI,OAAO,SAAU,MAAe;AAClC;AAAA,QACE,kBAAkB;AAAA,UAChB,QAAQ,IAAI,UAAU;AAAA,UACtB,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,UAChC,OAAO,IAAI;AAAA,UACX,aAAa,IAAI;AAAA,UACjB,cAAc;AAAA,UACd,QAAQ,IAAI;AAAA,UACZ,gBAAgB,IAAI;AAAA,UACpB,iBAAiB,IAAI,WAAW;AAAA,UAChC,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B,CAAC;AAAA,QACD;AAAA,MACF;AACA,aAAO,aAAa,IAAI;AAAA,IAC1B;AAEA,UAAM,QAAQ,KAAK,GAAG;AAAA,EACxB;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easydocs/nextjs",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "README.md"
@@ -18,7 +18,7 @@
18
18
  }
19
19
  },
20
20
  "dependencies": {
21
- "@easydocs/core": "0.4.2"
21
+ "@easydocs/core": "0.5.0"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "next": ">=14.0.0"