@uniai-fe/util-next 0.2.7 → 0.2.8
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/README.md +40 -2
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.cjs +3 -2
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.mjs +3 -2
- package/dist/server/index.mjs.map +1 -1
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -1,3 +1,41 @@
|
|
|
1
|
-
# util
|
|
1
|
+
# @uniai-fe/util-next
|
|
2
2
|
|
|
3
|
-
Next.js
|
|
3
|
+
Next.js(서버 컴포넌트, Route Handler, Middleware)에서 반복되는 패턴을 캡슐화한 유틸 모음입니다.
|
|
4
|
+
|
|
5
|
+
## 설치
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @uniai-fe/util-next
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 사용 예시
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import {
|
|
15
|
+
setTokenRequestHeaders,
|
|
16
|
+
setDebugResponseHeaders,
|
|
17
|
+
} from "@uniai-fe/util-next/server";
|
|
18
|
+
import { generateBackendQueryUrl_GET } from "@uniai-fe/util-functions/api";
|
|
19
|
+
|
|
20
|
+
export async function GET(request: NextRequest) {
|
|
21
|
+
const headers = await setTokenRequestHeaders();
|
|
22
|
+
const url = generateBackendQueryUrl_GET({
|
|
23
|
+
domain: process.env.NATIVE_AI_DOMAIN!,
|
|
24
|
+
routeUrl: "/api/farms",
|
|
25
|
+
queryUrl: "/ai/farms",
|
|
26
|
+
searchParams: request.nextUrl.searchParams,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const response = await fetch(url, { headers });
|
|
30
|
+
return setDebugResponseHeaders({
|
|
31
|
+
res: await response.json(),
|
|
32
|
+
domain: process.env.NATIVE_AI_DOMAIN!,
|
|
33
|
+
queryUrl: "/ai/farms",
|
|
34
|
+
searchParams: request.nextUrl.searchParams,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Codex 참고용 카탈로그
|
|
40
|
+
|
|
41
|
+
엔트리별 책임과 시나리오는 [`catalog.md`](./catalog.md)에 정리되어 있습니다. Codex 작업을 시작하기 전에 catalog를 열어 표준 헤더/파라미터 구성을 먼저 확인하세요.
|
package/dist/index.cjs
CHANGED
|
@@ -6,12 +6,13 @@ var api = require('@uniai-fe/util-functions/api');
|
|
|
6
6
|
var utilFunctions = require('@uniai-fe/util-functions');
|
|
7
7
|
|
|
8
8
|
// src/server/module.ts
|
|
9
|
-
async function setTokenRequestHeaders() {
|
|
9
|
+
async function setTokenRequestHeaders(headerOptions) {
|
|
10
10
|
const nextHeaders = await headers.headers();
|
|
11
11
|
const token = nextHeaders.get("Authorization") || "";
|
|
12
12
|
if (!token) return void 0;
|
|
13
13
|
return new Headers({
|
|
14
|
-
Authorization: token
|
|
14
|
+
Authorization: token,
|
|
15
|
+
...headerOptions
|
|
15
16
|
});
|
|
16
17
|
}
|
|
17
18
|
async function setDebugResponseHeaders({
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/module.ts","../src/runtime-env/module.ts"],"names":["headers","NextResponse","getQueryString","checkResponsiveDevice","checkAppleDevice"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/server/module.ts","../src/runtime-env/module.ts"],"names":["headers","NextResponse","getQueryString","checkResponsiveDevice","checkAppleDevice"],"mappings":";;;;;;;;AAgBA,eAAsB,uBACpB,aAAA,EACkC;AAClC,EAAA,MAAM,WAAA,GAAc,MAAMA,eAAA,EAAQ;AAClC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA;AAClD,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,IAAI,OAAA,CAAQ;AAAA,IACjB,aAAA,EAAe,KAAA;AAAA,IACf,GAAG;AAAA,GACJ,CAAA;AACH;AAqBA,eAAsB,uBAAA,CAAsC;AAAA,EAC1D,GAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAgCyC;AACvC,EAAA,MAAM,QAAA,GAAWC,mBAAA,CAAa,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAE/C,EAAA,QAAA,CAAS,QAAQ,GAAA,CAAI,+BAAA,EAAiC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AACtE,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAA,EAAuB,MAAM,CAAA;AAClD,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,QAAQ,CAAA;AAElD,EAAA,MAAM,GAAA,GACJ,OAAA,IACA,CAAA,EAAG,MAAA,IAAU,EAAE,CAAA,EAAG,QAAA,IAAY,EAAE,CAAA,EAAG,WAAA,IAAe,YAAA,GAAeC,kBAAA,CAAe,YAAY,IAAI,EAAE,CAAA,CAAA;AACpG,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,GAAG,CAAA;AAE5C,EAAA,OAAO,QAAA;AACT;AC3FO,SAAS,qBAAA,CACd,UACA,SAAA,EACc;AACd,EAAA,MAAM,cAAA,GAAiB,QAAA;AAGvB,EAAA,cAAA,CAAe,OAAA,CAAQ,GAAA;AAAA,IACrB,qBAAA;AAAA,IACAC,oCAAsB,SAAS;AAAA,GACjC;AAGA,EAAA,cAAA,CAAe,OAAA,CAAQ,GAAA;AAAA,IACrB,gBAAA;AAAA,IACAC,8BAAA,CAAiB,SAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACzC;AAEA,EAAA,OAAO,cAAA;AACT","file":"index.cjs","sourcesContent":["\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString } from \"@uniai-fe/util-functions/api\";\n\n/**\n * 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.\n *\n * @remarks\n * - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.\n * - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.\n * - Authorization 헤더가 없으면 undefined를 반환합니다.\n *\n * @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined\n */\nexport async function setTokenRequestHeaders(\n headerOptions?: HeadersInit,\n): Promise<HeadersInit | undefined> {\n const nextHeaders = await headers();\n const token = nextHeaders.get(\"Authorization\") || \"\";\n if (!token) return undefined;\n return new Headers({\n Authorization: token,\n ...headerOptions,\n });\n}\n\n/**\n * 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정\n * @util\n * @desc\n * 추가되는 헤더:\n * - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)\n * - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)\n * - Uniai-Native-Path: 호출된 API path (queryUrl)\n * - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)\n * @typeParam ResponseData - 응답 바디의 타입\n * @property {ResponseData} res - fetch 응답 데이터\n * @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등\n * @property {string} queryUrl - API 쿼리 URL\n * @property {string} [queryString] - 쿼리 스트링\n * @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체\n * @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용\n * @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }\n * @return {NextResponse<ResponseData>} 설정된 응답 객체\n */\nexport async function setDebugResponseHeaders<ResponseData>({\n res,\n domain,\n queryUrl,\n queryString,\n searchParams,\n fullUrl,\n options,\n}: {\n /**\n * fetch 응답 데이터\n */\n res: ResponseData;\n /**\n * API 도메인\n * - \"ai\"(ai-service), \"db\"(chickenmonger CRUD), \"uniai\"\n * - 커스텀 도메인을 쓰는 경우 string으로 직접 적용\n */\n domain: string;\n /**\n * API 엔드포인트 쿼리 path\n */\n queryUrl: string;\n} & Partial<{\n /**\n * 쿼리스트링\n */\n queryString: string;\n /**\n * URLSearchParams 객체\n */\n searchParams: URLSearchParams | object;\n /**\n * 전체 URL\n */\n fullUrl: string;\n /**\n * 응답 옵션\n */\n options: ResponseInit;\n}>): Promise<NextResponse<ResponseData>> {\n const response = NextResponse.json(res, options);\n\n response.headers.set(\"Uniai-Native-Domain-Env-Exist\", String(!!domain));\n response.headers.set(\"Uniai-Native-Domain\", domain);\n response.headers.set(\"Uniai-Native-Path\", queryUrl);\n\n const url =\n fullUrl ||\n `${domain || \"\"}${queryUrl || \"\"}${queryString || searchParams ? getQueryString(searchParams) : \"\"}`;\n response.headers.set(\"Uniai-Native-URL\", url);\n\n return response;\n}\n","import type { NextResponse } from \"next/server\";\nimport {\n checkResponsiveDevice,\n checkAppleDevice,\n} from \"@uniai-fe/util-functions\";\n\n/**\n * 감지된 기기 환경 저장\n */\nexport function setViewportDeviceInfo(\n response: NextResponse,\n userAgent: string,\n): NextResponse {\n const responseUpdate = response;\n\n // 접속 디바이스의 브레이크 포인트 체크\n responseUpdate.headers.set(\n \"X-Responsive-Device\",\n checkResponsiveDevice(userAgent),\n );\n\n // 접속 디바이스의 애플 기기 여부 체크\n responseUpdate.headers.set(\n \"X-Apple-Device\",\n checkAppleDevice(userAgent) ? \"true\" : \"false\",\n );\n\n return responseUpdate;\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -10,7 +10,7 @@ import { NextResponse } from 'next/server';
|
|
|
10
10
|
*
|
|
11
11
|
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
12
|
*/
|
|
13
|
-
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
13
|
+
declare function setTokenRequestHeaders(headerOptions?: HeadersInit): Promise<HeadersInit | undefined>;
|
|
14
14
|
/**
|
|
15
15
|
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
16
|
* @util
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { NextResponse } from 'next/server';
|
|
|
10
10
|
*
|
|
11
11
|
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
12
|
*/
|
|
13
|
-
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
13
|
+
declare function setTokenRequestHeaders(headerOptions?: HeadersInit): Promise<HeadersInit | undefined>;
|
|
14
14
|
/**
|
|
15
15
|
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
16
|
* @util
|
package/dist/index.mjs
CHANGED
|
@@ -4,12 +4,13 @@ import { getQueryString } from '@uniai-fe/util-functions/api';
|
|
|
4
4
|
import { checkResponsiveDevice, checkAppleDevice } from '@uniai-fe/util-functions';
|
|
5
5
|
|
|
6
6
|
// src/server/module.ts
|
|
7
|
-
async function setTokenRequestHeaders() {
|
|
7
|
+
async function setTokenRequestHeaders(headerOptions) {
|
|
8
8
|
const nextHeaders = await headers();
|
|
9
9
|
const token = nextHeaders.get("Authorization") || "";
|
|
10
10
|
if (!token) return void 0;
|
|
11
11
|
return new Headers({
|
|
12
|
-
Authorization: token
|
|
12
|
+
Authorization: token,
|
|
13
|
+
...headerOptions
|
|
13
14
|
});
|
|
14
15
|
}
|
|
15
16
|
async function setDebugResponseHeaders({
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/module.ts","../src/runtime-env/module.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/server/module.ts","../src/runtime-env/module.ts"],"names":[],"mappings":";;;;;;AAgBA,eAAsB,uBACpB,aAAA,EACkC;AAClC,EAAA,MAAM,WAAA,GAAc,MAAM,OAAA,EAAQ;AAClC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA;AAClD,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,IAAI,OAAA,CAAQ;AAAA,IACjB,aAAA,EAAe,KAAA;AAAA,IACf,GAAG;AAAA,GACJ,CAAA;AACH;AAqBA,eAAsB,uBAAA,CAAsC;AAAA,EAC1D,GAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAgCyC;AACvC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAE/C,EAAA,QAAA,CAAS,QAAQ,GAAA,CAAI,+BAAA,EAAiC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AACtE,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAA,EAAuB,MAAM,CAAA;AAClD,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,QAAQ,CAAA;AAElD,EAAA,MAAM,GAAA,GACJ,OAAA,IACA,CAAA,EAAG,MAAA,IAAU,EAAE,CAAA,EAAG,QAAA,IAAY,EAAE,CAAA,EAAG,WAAA,IAAe,YAAA,GAAe,cAAA,CAAe,YAAY,IAAI,EAAE,CAAA,CAAA;AACpG,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,GAAG,CAAA;AAE5C,EAAA,OAAO,QAAA;AACT;AC3FO,SAAS,qBAAA,CACd,UACA,SAAA,EACc;AACd,EAAA,MAAM,cAAA,GAAiB,QAAA;AAGvB,EAAA,cAAA,CAAe,OAAA,CAAQ,GAAA;AAAA,IACrB,qBAAA;AAAA,IACA,sBAAsB,SAAS;AAAA,GACjC;AAGA,EAAA,cAAA,CAAe,OAAA,CAAQ,GAAA;AAAA,IACrB,gBAAA;AAAA,IACA,gBAAA,CAAiB,SAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACzC;AAEA,EAAA,OAAO,cAAA;AACT","file":"index.mjs","sourcesContent":["\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString } from \"@uniai-fe/util-functions/api\";\n\n/**\n * 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.\n *\n * @remarks\n * - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.\n * - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.\n * - Authorization 헤더가 없으면 undefined를 반환합니다.\n *\n * @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined\n */\nexport async function setTokenRequestHeaders(\n headerOptions?: HeadersInit,\n): Promise<HeadersInit | undefined> {\n const nextHeaders = await headers();\n const token = nextHeaders.get(\"Authorization\") || \"\";\n if (!token) return undefined;\n return new Headers({\n Authorization: token,\n ...headerOptions,\n });\n}\n\n/**\n * 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정\n * @util\n * @desc\n * 추가되는 헤더:\n * - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)\n * - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)\n * - Uniai-Native-Path: 호출된 API path (queryUrl)\n * - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)\n * @typeParam ResponseData - 응답 바디의 타입\n * @property {ResponseData} res - fetch 응답 데이터\n * @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등\n * @property {string} queryUrl - API 쿼리 URL\n * @property {string} [queryString] - 쿼리 스트링\n * @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체\n * @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용\n * @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }\n * @return {NextResponse<ResponseData>} 설정된 응답 객체\n */\nexport async function setDebugResponseHeaders<ResponseData>({\n res,\n domain,\n queryUrl,\n queryString,\n searchParams,\n fullUrl,\n options,\n}: {\n /**\n * fetch 응답 데이터\n */\n res: ResponseData;\n /**\n * API 도메인\n * - \"ai\"(ai-service), \"db\"(chickenmonger CRUD), \"uniai\"\n * - 커스텀 도메인을 쓰는 경우 string으로 직접 적용\n */\n domain: string;\n /**\n * API 엔드포인트 쿼리 path\n */\n queryUrl: string;\n} & Partial<{\n /**\n * 쿼리스트링\n */\n queryString: string;\n /**\n * URLSearchParams 객체\n */\n searchParams: URLSearchParams | object;\n /**\n * 전체 URL\n */\n fullUrl: string;\n /**\n * 응답 옵션\n */\n options: ResponseInit;\n}>): Promise<NextResponse<ResponseData>> {\n const response = NextResponse.json(res, options);\n\n response.headers.set(\"Uniai-Native-Domain-Env-Exist\", String(!!domain));\n response.headers.set(\"Uniai-Native-Domain\", domain);\n response.headers.set(\"Uniai-Native-Path\", queryUrl);\n\n const url =\n fullUrl ||\n `${domain || \"\"}${queryUrl || \"\"}${queryString || searchParams ? getQueryString(searchParams) : \"\"}`;\n response.headers.set(\"Uniai-Native-URL\", url);\n\n return response;\n}\n","import type { NextResponse } from \"next/server\";\nimport {\n checkResponsiveDevice,\n checkAppleDevice,\n} from \"@uniai-fe/util-functions\";\n\n/**\n * 감지된 기기 환경 저장\n */\nexport function setViewportDeviceInfo(\n response: NextResponse,\n userAgent: string,\n): NextResponse {\n const responseUpdate = response;\n\n // 접속 디바이스의 브레이크 포인트 체크\n responseUpdate.headers.set(\n \"X-Responsive-Device\",\n checkResponsiveDevice(userAgent),\n );\n\n // 접속 디바이스의 애플 기기 여부 체크\n responseUpdate.headers.set(\n \"X-Apple-Device\",\n checkAppleDevice(userAgent) ? \"true\" : \"false\",\n );\n\n return responseUpdate;\n}\n"]}
|
package/dist/server/index.cjs
CHANGED
|
@@ -29,12 +29,13 @@ module.exports = __toCommonJS(server_exports);
|
|
|
29
29
|
var import_headers = require("next/headers");
|
|
30
30
|
var import_server = require("next/server");
|
|
31
31
|
var import_api = require("@uniai-fe/util-functions/api");
|
|
32
|
-
async function setTokenRequestHeaders() {
|
|
32
|
+
async function setTokenRequestHeaders(headerOptions) {
|
|
33
33
|
const nextHeaders = await (0, import_headers.headers)();
|
|
34
34
|
const token = nextHeaders.get("Authorization") || "";
|
|
35
35
|
if (!token) return void 0;
|
|
36
36
|
return new Headers({
|
|
37
|
-
Authorization: token
|
|
37
|
+
Authorization: token,
|
|
38
|
+
...headerOptions
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
async function setDebugResponseHeaders({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/index.ts","../../src/server/module.ts"],"sourcesContent":["export * from \"./module\";\n","\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString } from \"@uniai-fe/util-functions/api\";\n\n/**\n * 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.\n *\n * @remarks\n * - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.\n * - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.\n * - Authorization 헤더가 없으면 undefined를 반환합니다.\n *\n * @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined\n */\
|
|
1
|
+
{"version":3,"sources":["../../src/server/index.ts","../../src/server/module.ts"],"sourcesContent":["export * from \"./module\";\n","\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString } from \"@uniai-fe/util-functions/api\";\n\n/**\n * 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.\n *\n * @remarks\n * - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.\n * - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.\n * - Authorization 헤더가 없으면 undefined를 반환합니다.\n *\n * @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined\n */\nexport async function setTokenRequestHeaders(\n headerOptions?: HeadersInit,\n): Promise<HeadersInit | undefined> {\n const nextHeaders = await headers();\n const token = nextHeaders.get(\"Authorization\") || \"\";\n if (!token) return undefined;\n return new Headers({\n Authorization: token,\n ...headerOptions,\n });\n}\n\n/**\n * 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정\n * @util\n * @desc\n * 추가되는 헤더:\n * - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)\n * - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)\n * - Uniai-Native-Path: 호출된 API path (queryUrl)\n * - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)\n * @typeParam ResponseData - 응답 바디의 타입\n * @property {ResponseData} res - fetch 응답 데이터\n * @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등\n * @property {string} queryUrl - API 쿼리 URL\n * @property {string} [queryString] - 쿼리 스트링\n * @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체\n * @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용\n * @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }\n * @return {NextResponse<ResponseData>} 설정된 응답 객체\n */\nexport async function setDebugResponseHeaders<ResponseData>({\n res,\n domain,\n queryUrl,\n queryString,\n searchParams,\n fullUrl,\n options,\n}: {\n /**\n * fetch 응답 데이터\n */\n res: ResponseData;\n /**\n * API 도메인\n * - \"ai\"(ai-service), \"db\"(chickenmonger CRUD), \"uniai\"\n * - 커스텀 도메인을 쓰는 경우 string으로 직접 적용\n */\n domain: string;\n /**\n * API 엔드포인트 쿼리 path\n */\n queryUrl: string;\n} & Partial<{\n /**\n * 쿼리스트링\n */\n queryString: string;\n /**\n * URLSearchParams 객체\n */\n searchParams: URLSearchParams | object;\n /**\n * 전체 URL\n */\n fullUrl: string;\n /**\n * 응답 옵션\n */\n options: ResponseInit;\n}>): Promise<NextResponse<ResponseData>> {\n const response = NextResponse.json(res, options);\n\n response.headers.set(\"Uniai-Native-Domain-Env-Exist\", String(!!domain));\n response.headers.set(\"Uniai-Native-Domain\", domain);\n response.headers.set(\"Uniai-Native-Path\", queryUrl);\n\n const url =\n fullUrl ||\n `${domain || \"\"}${queryUrl || \"\"}${queryString || searchParams ? getQueryString(searchParams) : \"\"}`;\n response.headers.set(\"Uniai-Native-URL\", url);\n\n return response;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,qBAAwB;AACxB,oBAA6B;AAC7B,iBAA+B;AAY/B,eAAsB,uBACpB,eACkC;AAClC,QAAM,cAAc,UAAM,wBAAQ;AAClC,QAAM,QAAQ,YAAY,IAAI,eAAe,KAAK;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,IAAI,QAAQ;AAAA,IACjB,eAAe;AAAA,IACf,GAAG;AAAA,EACL,CAAC;AACH;AAqBA,eAAsB,wBAAsC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAgCyC;AACvC,QAAM,WAAW,2BAAa,KAAK,KAAK,OAAO;AAE/C,WAAS,QAAQ,IAAI,iCAAiC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtE,WAAS,QAAQ,IAAI,uBAAuB,MAAM;AAClD,WAAS,QAAQ,IAAI,qBAAqB,QAAQ;AAElD,QAAM,MACJ,WACA,GAAG,UAAU,EAAE,GAAG,YAAY,EAAE,GAAG,eAAe,mBAAe,2BAAe,YAAY,IAAI,EAAE;AACpG,WAAS,QAAQ,IAAI,oBAAoB,GAAG;AAE5C,SAAO;AACT;","names":[]}
|
package/dist/server/index.d.cts
CHANGED
|
@@ -10,7 +10,7 @@ import { NextResponse } from 'next/server';
|
|
|
10
10
|
*
|
|
11
11
|
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
12
|
*/
|
|
13
|
-
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
13
|
+
declare function setTokenRequestHeaders(headerOptions?: HeadersInit): Promise<HeadersInit | undefined>;
|
|
14
14
|
/**
|
|
15
15
|
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
16
|
* @util
|
package/dist/server/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { NextResponse } from 'next/server';
|
|
|
10
10
|
*
|
|
11
11
|
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
12
|
*/
|
|
13
|
-
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
13
|
+
declare function setTokenRequestHeaders(headerOptions?: HeadersInit): Promise<HeadersInit | undefined>;
|
|
14
14
|
/**
|
|
15
15
|
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
16
|
* @util
|
package/dist/server/index.mjs
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
import { headers } from "next/headers";
|
|
3
3
|
import { NextResponse } from "next/server";
|
|
4
4
|
import { getQueryString } from "@uniai-fe/util-functions/api";
|
|
5
|
-
async function setTokenRequestHeaders() {
|
|
5
|
+
async function setTokenRequestHeaders(headerOptions) {
|
|
6
6
|
const nextHeaders = await headers();
|
|
7
7
|
const token = nextHeaders.get("Authorization") || "";
|
|
8
8
|
if (!token) return void 0;
|
|
9
9
|
return new Headers({
|
|
10
|
-
Authorization: token
|
|
10
|
+
Authorization: token,
|
|
11
|
+
...headerOptions
|
|
11
12
|
});
|
|
12
13
|
}
|
|
13
14
|
async function setDebugResponseHeaders({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/module.ts"],"sourcesContent":["\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString } from \"@uniai-fe/util-functions/api\";\n\n/**\n * 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.\n *\n * @remarks\n * - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.\n * - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.\n * - Authorization 헤더가 없으면 undefined를 반환합니다.\n *\n * @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined\n */\
|
|
1
|
+
{"version":3,"sources":["../../src/server/module.ts"],"sourcesContent":["\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString } from \"@uniai-fe/util-functions/api\";\n\n/**\n * 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.\n *\n * @remarks\n * - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.\n * - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.\n * - Authorization 헤더가 없으면 undefined를 반환합니다.\n *\n * @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined\n */\nexport async function setTokenRequestHeaders(\n headerOptions?: HeadersInit,\n): Promise<HeadersInit | undefined> {\n const nextHeaders = await headers();\n const token = nextHeaders.get(\"Authorization\") || \"\";\n if (!token) return undefined;\n return new Headers({\n Authorization: token,\n ...headerOptions,\n });\n}\n\n/**\n * 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정\n * @util\n * @desc\n * 추가되는 헤더:\n * - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)\n * - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)\n * - Uniai-Native-Path: 호출된 API path (queryUrl)\n * - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)\n * @typeParam ResponseData - 응답 바디의 타입\n * @property {ResponseData} res - fetch 응답 데이터\n * @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등\n * @property {string} queryUrl - API 쿼리 URL\n * @property {string} [queryString] - 쿼리 스트링\n * @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체\n * @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용\n * @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }\n * @return {NextResponse<ResponseData>} 설정된 응답 객체\n */\nexport async function setDebugResponseHeaders<ResponseData>({\n res,\n domain,\n queryUrl,\n queryString,\n searchParams,\n fullUrl,\n options,\n}: {\n /**\n * fetch 응답 데이터\n */\n res: ResponseData;\n /**\n * API 도메인\n * - \"ai\"(ai-service), \"db\"(chickenmonger CRUD), \"uniai\"\n * - 커스텀 도메인을 쓰는 경우 string으로 직접 적용\n */\n domain: string;\n /**\n * API 엔드포인트 쿼리 path\n */\n queryUrl: string;\n} & Partial<{\n /**\n * 쿼리스트링\n */\n queryString: string;\n /**\n * URLSearchParams 객체\n */\n searchParams: URLSearchParams | object;\n /**\n * 전체 URL\n */\n fullUrl: string;\n /**\n * 응답 옵션\n */\n options: ResponseInit;\n}>): Promise<NextResponse<ResponseData>> {\n const response = NextResponse.json(res, options);\n\n response.headers.set(\"Uniai-Native-Domain-Env-Exist\", String(!!domain));\n response.headers.set(\"Uniai-Native-Domain\", domain);\n response.headers.set(\"Uniai-Native-Path\", queryUrl);\n\n const url =\n fullUrl ||\n `${domain || \"\"}${queryUrl || \"\"}${queryString || searchParams ? getQueryString(searchParams) : \"\"}`;\n response.headers.set(\"Uniai-Native-URL\", url);\n\n return response;\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAY/B,eAAsB,uBACpB,eACkC;AAClC,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,QAAQ,YAAY,IAAI,eAAe,KAAK;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,IAAI,QAAQ;AAAA,IACjB,eAAe;AAAA,IACf,GAAG;AAAA,EACL,CAAC;AACH;AAqBA,eAAsB,wBAAsC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAgCyC;AACvC,QAAM,WAAW,aAAa,KAAK,KAAK,OAAO;AAE/C,WAAS,QAAQ,IAAI,iCAAiC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtE,WAAS,QAAQ,IAAI,uBAAuB,MAAM;AAClD,WAAS,QAAQ,IAAI,qBAAqB,QAAQ;AAElD,QAAM,MACJ,WACA,GAAG,UAAU,EAAE,GAAG,YAAY,EAAE,GAAG,eAAe,eAAe,eAAe,YAAY,IAAI,EAAE;AACpG,WAAS,QAAQ,IAAI,oBAAoB,GAAG;AAE5C,SAAO;AACT;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uniai-fe/util-next",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Next.js Utilities for UNIAI FE Projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|
|
12
12
|
},
|
|
13
|
-
"packageManager": "pnpm@10.
|
|
13
|
+
"packageManager": "pnpm@10.28.2",
|
|
14
14
|
"engines": {
|
|
15
15
|
"node": ">=24",
|
|
16
16
|
"pnpm": ">=10"
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"module:typecheck": "pnpm typecheck",
|
|
35
35
|
"module:build": "pnpm build",
|
|
36
36
|
"util-next:build": "pnpm run build",
|
|
37
|
-
"util-next:dev": "pnpm run dev"
|
|
37
|
+
"util-next:dev": "pnpm run dev",
|
|
38
|
+
"publish:public": "bash ../../../scripts/npm-publish.sh"
|
|
38
39
|
},
|
|
39
40
|
"main": "./dist/index.cjs",
|
|
40
41
|
"module": "./dist/index.mjs",
|
|
@@ -68,8 +69,8 @@
|
|
|
68
69
|
"@uniai-fe/eslint-config": "workspace:*",
|
|
69
70
|
"@uniai-fe/tsconfig": "workspace:*",
|
|
70
71
|
"@uniai-fe/util-functions": "workspace:*",
|
|
71
|
-
"eslint": "^9.39.
|
|
72
|
-
"prettier": "^3.
|
|
72
|
+
"eslint": "^9.39.2",
|
|
73
|
+
"prettier": "^3.8.1",
|
|
73
74
|
"tsup": "^8.5.1",
|
|
74
75
|
"typescript": "~5.9.3"
|
|
75
76
|
}
|