@uniai-fe/util-next 0.1.0 → 0.1.2
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 +0 -19
- package/dist/index.cjs +29 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +67 -2
- package/dist/index.d.ts +67 -2
- package/dist/index.mjs +29 -31
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.cjs +3 -49
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +57 -16
- package/dist/server/index.d.ts +57 -16
- package/dist/server/index.mjs +1 -45
- package/dist/server/index.mjs.map +1 -1
- package/package.json +16 -11
- package/dist/infra/index.cjs +0 -39
- package/dist/infra/index.cjs.map +0 -1
- package/dist/infra/index.d.cts +0 -27
- package/dist/infra/index.d.ts +0 -27
- package/dist/infra/index.mjs +0 -35
- package/dist/infra/index.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
1
|
# util / next
|
|
2
2
|
|
|
3
3
|
Next.js 전용 API 도우미 모음입니다.
|
|
4
|
-
|
|
5
|
-
- `createNextApiClient`로 `@uniai-fe/util-functions`의 공용 API 유틸에 환경 설정을 주입합니다.
|
|
6
|
-
- `setTokenRequestHeaders`, `setDebugResponseHeaders` 등 서버 라우트에서 반복되는 패턴을 제공합니다.
|
|
7
|
-
- `api-infra.config.ts`처럼 프로젝트별 환경 구성을 받아 도메인을 해석하도록 설계되어 있습니다.
|
|
8
|
-
|
|
9
|
-
## 사용 방법
|
|
10
|
-
|
|
11
|
-
1. **환경 해석기 구성**
|
|
12
|
-
- 서비스 루트(예: `apps/factory/src/lib/server/api-infra.ts`)에서 `NextApiConfig`를 선언하고 `process.env`에 있는 API 베이스 URL을 `env` 맵으로 전달합니다.
|
|
13
|
-
- `createNextApiClient(config)`를 호출한 뒤 `generateBackendQueryUrl_GET`, `fetchBackendQuery`, `getQueryString` 등을 구조 분해하여 프로젝트 전역에서 재사용합니다.
|
|
14
|
-
2. **로거 · 도메인 유틸 노출**
|
|
15
|
-
- `apiClient.logger`를 그대로 export하면 `nextAPILog`처럼 어느 라우트에서도 동일한 로깅 포맷을 유지할 수 있습니다.
|
|
16
|
-
- `resolveNextDomainSources(infra, config)`를 감싼 `resolveInfraDomain` 헬퍼를 만들어 두면 env 접근 없이도 도메인 문자열을 얻을 수 있습니다.
|
|
17
|
-
3. **Next API 라우트에서 사용**
|
|
18
|
-
- `/app/api` 경로의 라우트에서 방금 만든 헬퍼를 import 하여 `generateBackendQueryUrl_GET`로 URL을 계산하고, 응답 시 `setDebugResponseHeaders`에 `infra`와 `queryUrl`을 넘겨 디버깅 헤더를 자동으로 채웁니다.
|
|
19
|
-
- POST/DELETE 요청이 필요한 경우에는 헬퍼에 정의한 `fetchWithBody`나 `fetchBackendQuery`를 호출해 동일한 로깅/대체 응답 로직을 공유하세요.
|
|
20
|
-
4. **추가 서버 유틸 통합**
|
|
21
|
-
- `setTokenRequestHeaders`를 사용하면 Server Action·Route Handler에서 Authorization 헤더를 안전하게 추출할 수 있습니다.
|
|
22
|
-
- 필요 시 `resolveNextDomainSources` 반환값의 `hasEnv`, `envKey`를 활용해 런타임 환경 구성 상태를 점검하거나 헤더에 노출할 수 있습니다.
|
package/dist/index.cjs
CHANGED
|
@@ -1,43 +1,37 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var headers = require('next/headers');
|
|
4
|
+
var server = require('next/server');
|
|
3
5
|
var api = require('@uniai-fe/util-functions/api');
|
|
4
6
|
|
|
5
|
-
// src/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const envKey = ENV_KEY_MAP[infra];
|
|
13
|
-
const configValue = config?.env?.[infra];
|
|
14
|
-
const envValue = typeof envKey === "string" && envKey in process.env ? process.env[envKey] : void 0;
|
|
15
|
-
const domain = configValue ?? envValue ?? (typeof infra === "string" && infra.length > 0 ? infra : "");
|
|
16
|
-
return {
|
|
17
|
-
domain,
|
|
18
|
-
envKey,
|
|
19
|
-
envValue: envValue ?? void 0,
|
|
20
|
-
configValue,
|
|
21
|
-
hasEnv: Boolean(configValue ?? envValue)
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
var createNextDomainResolver = (config) => {
|
|
25
|
-
return (infra) => resolveNextDomainSources(infra, config).domain;
|
|
26
|
-
};
|
|
27
|
-
var createNextApiClient = (config, options) => {
|
|
28
|
-
const resolveDomain = createNextDomainResolver(config);
|
|
29
|
-
return api.createBackendApiClient({
|
|
30
|
-
resolveDomain,
|
|
31
|
-
logger: options?.logger ?? api.defaultApiLogger
|
|
7
|
+
// src/server/module.ts
|
|
8
|
+
async function setTokenRequestHeaders() {
|
|
9
|
+
const nextHeaders = await headers.headers();
|
|
10
|
+
const token = nextHeaders.get("Authorization") || "";
|
|
11
|
+
if (!token) return void 0;
|
|
12
|
+
return new Headers({
|
|
13
|
+
Authorization: token
|
|
32
14
|
});
|
|
33
|
-
}
|
|
15
|
+
}
|
|
16
|
+
async function setDebugResponseHeaders({
|
|
17
|
+
res,
|
|
18
|
+
domain,
|
|
19
|
+
queryUrl,
|
|
20
|
+
queryString,
|
|
21
|
+
searchParams,
|
|
22
|
+
fullUrl,
|
|
23
|
+
options
|
|
24
|
+
}) {
|
|
25
|
+
const response = server.NextResponse.json(res, options);
|
|
26
|
+
response.headers.set("Uniai-Native-Domain-Env-Exist", String(!!domain));
|
|
27
|
+
response.headers.set("Uniai-Native-Domain", domain);
|
|
28
|
+
response.headers.set("Uniai-Native-Path", queryUrl);
|
|
29
|
+
const url = fullUrl || `${domain || ""}${queryUrl || ""}${queryString || searchParams ? api.getQueryString(searchParams) : ""}`;
|
|
30
|
+
response.headers.set("Uniai-Native-URL", url);
|
|
31
|
+
return response;
|
|
32
|
+
}
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
get: function () { return api.defaultApiLogger; }
|
|
38
|
-
});
|
|
39
|
-
exports.createNextApiClient = createNextApiClient;
|
|
40
|
-
exports.createNextDomainResolver = createNextDomainResolver;
|
|
41
|
-
exports.resolveNextDomainSources = resolveNextDomainSources;
|
|
34
|
+
exports.setDebugResponseHeaders = setDebugResponseHeaders;
|
|
35
|
+
exports.setTokenRequestHeaders = setTokenRequestHeaders;
|
|
42
36
|
//# sourceMappingURL=index.cjs.map
|
|
43
37
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
1
|
+
{"version":3,"sources":["../src/server/module.ts"],"names":["headers","NextResponse","getQueryString"],"mappings":";;;;;;;AAiBA,eAAsB,sBAAA,GAEpB;AACA,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;AAAA,GAChB,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","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 */\n\nexport async function setTokenRequestHeaders(): Promise<\n HeadersInit | undefined\n> {\n const nextHeaders = await headers();\n const token = nextHeaders.get(\"Authorization\") || \"\";\n if (!token) return undefined;\n return new Headers({\n Authorization: token,\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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,2 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.
|
|
8
|
+
* - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.
|
|
9
|
+
* - Authorization 헤더가 없으면 undefined를 반환합니다.
|
|
10
|
+
*
|
|
11
|
+
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
|
+
*/
|
|
13
|
+
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
14
|
+
/**
|
|
15
|
+
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
|
+
* @util
|
|
17
|
+
* @desc
|
|
18
|
+
* 추가되는 헤더:
|
|
19
|
+
* - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)
|
|
20
|
+
* - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)
|
|
21
|
+
* - Uniai-Native-Path: 호출된 API path (queryUrl)
|
|
22
|
+
* - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)
|
|
23
|
+
* @typeParam ResponseData - 응답 바디의 타입
|
|
24
|
+
* @property {ResponseData} res - fetch 응답 데이터
|
|
25
|
+
* @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등
|
|
26
|
+
* @property {string} queryUrl - API 쿼리 URL
|
|
27
|
+
* @property {string} [queryString] - 쿼리 스트링
|
|
28
|
+
* @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체
|
|
29
|
+
* @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용
|
|
30
|
+
* @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }
|
|
31
|
+
* @return {NextResponse<ResponseData>} 설정된 응답 객체
|
|
32
|
+
*/
|
|
33
|
+
declare function setDebugResponseHeaders<ResponseData>({ res, domain, queryUrl, queryString, searchParams, fullUrl, options, }: {
|
|
34
|
+
/**
|
|
35
|
+
* fetch 응답 데이터
|
|
36
|
+
*/
|
|
37
|
+
res: ResponseData;
|
|
38
|
+
/**
|
|
39
|
+
* API 도메인
|
|
40
|
+
* - "ai"(ai-service), "db"(chickenmonger CRUD), "uniai"
|
|
41
|
+
* - 커스텀 도메인을 쓰는 경우 string으로 직접 적용
|
|
42
|
+
*/
|
|
43
|
+
domain: string;
|
|
44
|
+
/**
|
|
45
|
+
* API 엔드포인트 쿼리 path
|
|
46
|
+
*/
|
|
47
|
+
queryUrl: string;
|
|
48
|
+
} & Partial<{
|
|
49
|
+
/**
|
|
50
|
+
* 쿼리스트링
|
|
51
|
+
*/
|
|
52
|
+
queryString: string;
|
|
53
|
+
/**
|
|
54
|
+
* URLSearchParams 객체
|
|
55
|
+
*/
|
|
56
|
+
searchParams: URLSearchParams | object;
|
|
57
|
+
/**
|
|
58
|
+
* 전체 URL
|
|
59
|
+
*/
|
|
60
|
+
fullUrl: string;
|
|
61
|
+
/**
|
|
62
|
+
* 응답 옵션
|
|
63
|
+
*/
|
|
64
|
+
options: ResponseInit;
|
|
65
|
+
}>): Promise<NextResponse<ResponseData>>;
|
|
66
|
+
|
|
67
|
+
export { setDebugResponseHeaders, setTokenRequestHeaders };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.
|
|
8
|
+
* - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.
|
|
9
|
+
* - Authorization 헤더가 없으면 undefined를 반환합니다.
|
|
10
|
+
*
|
|
11
|
+
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
|
+
*/
|
|
13
|
+
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
14
|
+
/**
|
|
15
|
+
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
|
+
* @util
|
|
17
|
+
* @desc
|
|
18
|
+
* 추가되는 헤더:
|
|
19
|
+
* - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)
|
|
20
|
+
* - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)
|
|
21
|
+
* - Uniai-Native-Path: 호출된 API path (queryUrl)
|
|
22
|
+
* - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)
|
|
23
|
+
* @typeParam ResponseData - 응답 바디의 타입
|
|
24
|
+
* @property {ResponseData} res - fetch 응답 데이터
|
|
25
|
+
* @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등
|
|
26
|
+
* @property {string} queryUrl - API 쿼리 URL
|
|
27
|
+
* @property {string} [queryString] - 쿼리 스트링
|
|
28
|
+
* @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체
|
|
29
|
+
* @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용
|
|
30
|
+
* @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }
|
|
31
|
+
* @return {NextResponse<ResponseData>} 설정된 응답 객체
|
|
32
|
+
*/
|
|
33
|
+
declare function setDebugResponseHeaders<ResponseData>({ res, domain, queryUrl, queryString, searchParams, fullUrl, options, }: {
|
|
34
|
+
/**
|
|
35
|
+
* fetch 응답 데이터
|
|
36
|
+
*/
|
|
37
|
+
res: ResponseData;
|
|
38
|
+
/**
|
|
39
|
+
* API 도메인
|
|
40
|
+
* - "ai"(ai-service), "db"(chickenmonger CRUD), "uniai"
|
|
41
|
+
* - 커스텀 도메인을 쓰는 경우 string으로 직접 적용
|
|
42
|
+
*/
|
|
43
|
+
domain: string;
|
|
44
|
+
/**
|
|
45
|
+
* API 엔드포인트 쿼리 path
|
|
46
|
+
*/
|
|
47
|
+
queryUrl: string;
|
|
48
|
+
} & Partial<{
|
|
49
|
+
/**
|
|
50
|
+
* 쿼리스트링
|
|
51
|
+
*/
|
|
52
|
+
queryString: string;
|
|
53
|
+
/**
|
|
54
|
+
* URLSearchParams 객체
|
|
55
|
+
*/
|
|
56
|
+
searchParams: URLSearchParams | object;
|
|
57
|
+
/**
|
|
58
|
+
* 전체 URL
|
|
59
|
+
*/
|
|
60
|
+
fullUrl: string;
|
|
61
|
+
/**
|
|
62
|
+
* 응답 옵션
|
|
63
|
+
*/
|
|
64
|
+
options: ResponseInit;
|
|
65
|
+
}>): Promise<NextResponse<ResponseData>>;
|
|
66
|
+
|
|
67
|
+
export { setDebugResponseHeaders, setTokenRequestHeaders };
|
package/dist/index.mjs
CHANGED
|
@@ -1,36 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { headers } from 'next/headers';
|
|
2
|
+
import { NextResponse } from 'next/server';
|
|
3
|
+
import { getQueryString } from '@uniai-fe/util-functions/api';
|
|
3
4
|
|
|
4
|
-
// src/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const envKey = ENV_KEY_MAP[infra];
|
|
12
|
-
const configValue = config?.env?.[infra];
|
|
13
|
-
const envValue = typeof envKey === "string" && envKey in process.env ? process.env[envKey] : void 0;
|
|
14
|
-
const domain = configValue ?? envValue ?? (typeof infra === "string" && infra.length > 0 ? infra : "");
|
|
15
|
-
return {
|
|
16
|
-
domain,
|
|
17
|
-
envKey,
|
|
18
|
-
envValue: envValue ?? void 0,
|
|
19
|
-
configValue,
|
|
20
|
-
hasEnv: Boolean(configValue ?? envValue)
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
var createNextDomainResolver = (config) => {
|
|
24
|
-
return (infra) => resolveNextDomainSources(infra, config).domain;
|
|
25
|
-
};
|
|
26
|
-
var createNextApiClient = (config, options) => {
|
|
27
|
-
const resolveDomain = createNextDomainResolver(config);
|
|
28
|
-
return createBackendApiClient({
|
|
29
|
-
resolveDomain,
|
|
30
|
-
logger: options?.logger ?? defaultApiLogger
|
|
5
|
+
// src/server/module.ts
|
|
6
|
+
async function setTokenRequestHeaders() {
|
|
7
|
+
const nextHeaders = await headers();
|
|
8
|
+
const token = nextHeaders.get("Authorization") || "";
|
|
9
|
+
if (!token) return void 0;
|
|
10
|
+
return new Headers({
|
|
11
|
+
Authorization: token
|
|
31
12
|
});
|
|
32
|
-
}
|
|
13
|
+
}
|
|
14
|
+
async function setDebugResponseHeaders({
|
|
15
|
+
res,
|
|
16
|
+
domain,
|
|
17
|
+
queryUrl,
|
|
18
|
+
queryString,
|
|
19
|
+
searchParams,
|
|
20
|
+
fullUrl,
|
|
21
|
+
options
|
|
22
|
+
}) {
|
|
23
|
+
const response = NextResponse.json(res, options);
|
|
24
|
+
response.headers.set("Uniai-Native-Domain-Env-Exist", String(!!domain));
|
|
25
|
+
response.headers.set("Uniai-Native-Domain", domain);
|
|
26
|
+
response.headers.set("Uniai-Native-Path", queryUrl);
|
|
27
|
+
const url = fullUrl || `${domain || ""}${queryUrl || ""}${queryString || searchParams ? getQueryString(searchParams) : ""}`;
|
|
28
|
+
response.headers.set("Uniai-Native-URL", url);
|
|
29
|
+
return response;
|
|
30
|
+
}
|
|
33
31
|
|
|
34
|
-
export {
|
|
32
|
+
export { setDebugResponseHeaders, setTokenRequestHeaders };
|
|
35
33
|
//# sourceMappingURL=index.mjs.map
|
|
36
34
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
1
|
+
{"version":3,"sources":["../src/server/module.ts"],"names":[],"mappings":";;;;;AAiBA,eAAsB,sBAAA,GAEpB;AACA,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;AAAA,GAChB,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","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 */\n\nexport async function setTokenRequestHeaders(): Promise<\n HeadersInit | undefined\n> {\n const nextHeaders = await headers();\n const token = nextHeaders.get(\"Authorization\") || \"\";\n if (!token) return undefined;\n return new Headers({\n Authorization: token,\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"]}
|
package/dist/server/index.cjs
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
"use server";
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
6
|
var __copyProps = (to, from, except, desc) => {
|
|
12
7
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
8
|
for (let key of __getOwnPropNames(from))
|
|
@@ -16,54 +11,13 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
11
|
}
|
|
17
12
|
return to;
|
|
18
13
|
};
|
|
14
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
19
15
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
16
|
var server_exports = {};
|
|
21
|
-
__export(server_exports, {
|
|
22
|
-
setDebugResponseHeaders: () => setDebugResponseHeaders,
|
|
23
|
-
setTokenRequestHeaders: () => setTokenRequestHeaders
|
|
24
|
-
});
|
|
25
17
|
module.exports = __toCommonJS(server_exports);
|
|
26
|
-
|
|
27
|
-
var import_server = require("next/server");
|
|
28
|
-
var import_api = require("@uniai-fe/util-functions/api");
|
|
29
|
-
var import_infra = require("../infra");
|
|
30
|
-
async function setTokenRequestHeaders() {
|
|
31
|
-
const nextHeaders = await (0, import_headers.headers)();
|
|
32
|
-
const token = nextHeaders.get("Authorization") || "";
|
|
33
|
-
if (!token) return void 0;
|
|
34
|
-
return new Headers({
|
|
35
|
-
Authorization: token
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
async function setDebugResponseHeaders(params) {
|
|
39
|
-
const {
|
|
40
|
-
res,
|
|
41
|
-
infra,
|
|
42
|
-
queryUrl,
|
|
43
|
-
config,
|
|
44
|
-
domain,
|
|
45
|
-
queryString,
|
|
46
|
-
searchParams,
|
|
47
|
-
fullUrl,
|
|
48
|
-
options
|
|
49
|
-
} = params;
|
|
50
|
-
const response = import_server.NextResponse.json(res, options);
|
|
51
|
-
const sources = (0, import_infra.resolveNextDomainSources)(infra, config);
|
|
52
|
-
const resolvedDomain = typeof domain === "string" && domain.length > 0 ? domain : sources.domain;
|
|
53
|
-
response.headers.set(
|
|
54
|
-
"Uniai-Native-Domain-Env-Exist",
|
|
55
|
-
String(sources.hasEnv)
|
|
56
|
-
);
|
|
57
|
-
response.headers.set("Uniai-Native-Domain", resolvedDomain || infra);
|
|
58
|
-
response.headers.set("Uniai-Native-Path", queryUrl);
|
|
59
|
-
const computedQuery = typeof queryString === "string" ? queryString : searchParams ? (0, import_api.getQueryString)(searchParams) : "";
|
|
60
|
-
const url = fullUrl || `${resolvedDomain || infra || ""}${queryUrl || ""}${computedQuery || ""}`;
|
|
61
|
-
response.headers.set("Uniai-Native-URL", url);
|
|
62
|
-
return response;
|
|
63
|
-
}
|
|
18
|
+
__reExport(server_exports, require("./module"), module.exports);
|
|
64
19
|
// Annotate the CommonJS export names for ESM import in node:
|
|
65
20
|
0 && (module.exports = {
|
|
66
|
-
|
|
67
|
-
setTokenRequestHeaders
|
|
21
|
+
...require("./module")
|
|
68
22
|
});
|
|
69
23
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["export * from \"./module\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,2BAAc,qBAAd;","names":[]}
|
package/dist/server/index.d.cts
CHANGED
|
@@ -1,26 +1,67 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
-
import { InfraKey } from '@uniai-fe/util-functions/api';
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
/**
|
|
4
|
+
* 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.
|
|
8
|
+
* - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.
|
|
9
|
+
* - Authorization 헤더가 없으면 undefined를 반환합니다.
|
|
10
|
+
*
|
|
11
|
+
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
|
+
*/
|
|
13
|
+
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
14
|
+
/**
|
|
15
|
+
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
|
+
* @util
|
|
17
|
+
* @desc
|
|
18
|
+
* 추가되는 헤더:
|
|
19
|
+
* - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)
|
|
20
|
+
* - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)
|
|
21
|
+
* - Uniai-Native-Path: 호출된 API path (queryUrl)
|
|
22
|
+
* - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)
|
|
23
|
+
* @typeParam ResponseData - 응답 바디의 타입
|
|
24
|
+
* @property {ResponseData} res - fetch 응답 데이터
|
|
25
|
+
* @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등
|
|
26
|
+
* @property {string} queryUrl - API 쿼리 URL
|
|
27
|
+
* @property {string} [queryString] - 쿼리 스트링
|
|
28
|
+
* @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체
|
|
29
|
+
* @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용
|
|
30
|
+
* @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }
|
|
31
|
+
* @return {NextResponse<ResponseData>} 설정된 응답 객체
|
|
32
|
+
*/
|
|
33
|
+
declare function setDebugResponseHeaders<ResponseData>({ res, domain, queryUrl, queryString, searchParams, fullUrl, options, }: {
|
|
34
|
+
/**
|
|
35
|
+
* fetch 응답 데이터
|
|
36
|
+
*/
|
|
10
37
|
res: ResponseData;
|
|
11
|
-
|
|
38
|
+
/**
|
|
39
|
+
* API 도메인
|
|
40
|
+
* - "ai"(ai-service), "db"(chickenmonger CRUD), "uniai"
|
|
41
|
+
* - 커스텀 도메인을 쓰는 경우 string으로 직접 적용
|
|
42
|
+
*/
|
|
43
|
+
domain: string;
|
|
44
|
+
/**
|
|
45
|
+
* API 엔드포인트 쿼리 path
|
|
46
|
+
*/
|
|
12
47
|
queryUrl: string;
|
|
13
48
|
} & Partial<{
|
|
14
|
-
|
|
15
|
-
|
|
49
|
+
/**
|
|
50
|
+
* 쿼리스트링
|
|
51
|
+
*/
|
|
16
52
|
queryString: string;
|
|
53
|
+
/**
|
|
54
|
+
* URLSearchParams 객체
|
|
55
|
+
*/
|
|
17
56
|
searchParams: URLSearchParams | object;
|
|
57
|
+
/**
|
|
58
|
+
* 전체 URL
|
|
59
|
+
*/
|
|
18
60
|
fullUrl: string;
|
|
61
|
+
/**
|
|
62
|
+
* 응답 옵션
|
|
63
|
+
*/
|
|
19
64
|
options: ResponseInit;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
23
|
-
|
|
24
|
-
declare function setDebugResponseHeaders<ResponseData>(params: SetDebugResponseHeadersParams<InfraKey, ResponseData>): Promise<NextResponse<ResponseData>>;
|
|
65
|
+
}>): Promise<NextResponse<ResponseData>>;
|
|
25
66
|
|
|
26
|
-
export {
|
|
67
|
+
export { setDebugResponseHeaders, setTokenRequestHeaders };
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,26 +1,67 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
-
import { InfraKey } from '@uniai-fe/util-functions/api';
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
/**
|
|
4
|
+
* 서버 환경의 현재 요청 헤더에서 Authorization 값을 읽어 fetch 요청에 사용할 Headers 객체로 반환합니다.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* - Next.js의 server environment(예: server actions, route handlers 등)에서 동작합니다.
|
|
8
|
+
* - 내부적으로 next/headers의 headers()를 호출하여 현재 요청 헤더를 조회합니다.
|
|
9
|
+
* - Authorization 헤더가 없으면 undefined를 반환합니다.
|
|
10
|
+
*
|
|
11
|
+
* @returns {Promise<HeadersInit | undefined>} Authorization 헤더가 설정된 Headers 객체 또는 Authorization 헤더가 없을 경우 undefined
|
|
12
|
+
*/
|
|
13
|
+
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
14
|
+
/**
|
|
15
|
+
* 유니아이 백엔드 디버깅을 위한 응답 헤더 커스텀 설정
|
|
16
|
+
* @util
|
|
17
|
+
* @desc
|
|
18
|
+
* 추가되는 헤더:
|
|
19
|
+
* - Uniai-Native-Domain-Env-Exist: 환경변수로 정의된 API 도메인 값 존재 여부 (boolean 문자열)
|
|
20
|
+
* - Uniai-Native-Domain: 사용된 API 도메인(환경변수 또는 infra 키)
|
|
21
|
+
* - Uniai-Native-Path: 호출된 API path (queryUrl)
|
|
22
|
+
* - Uniai-Native-URL: 최종 생성된 전체 URL (fullUrl이 주어지면 그 값을 사용, 그렇지 않으면 infra 도메인 + path + 쿼리스트링)
|
|
23
|
+
* @typeParam ResponseData - 응답 바디의 타입
|
|
24
|
+
* @property {ResponseData} res - fetch 응답 데이터
|
|
25
|
+
* @property {string} infra - API 도메인 키; ai(ai-service), db(chickenmonger CRUD), uniai 등
|
|
26
|
+
* @property {string} queryUrl - API 쿼리 URL
|
|
27
|
+
* @property {string} [queryString] - 쿼리 스트링
|
|
28
|
+
* @property {URLSearchParams | object} [searchParams] - 쿼리 파라미터 객체
|
|
29
|
+
* @property {string} [fullUrl] - 전체 url이 제공되면, Uniai-Native-URL 헤더에 우선적으로 적용
|
|
30
|
+
* @property {ResponseInit} [options] - fetch native 옵션 { headers, body, ... }
|
|
31
|
+
* @return {NextResponse<ResponseData>} 설정된 응답 객체
|
|
32
|
+
*/
|
|
33
|
+
declare function setDebugResponseHeaders<ResponseData>({ res, domain, queryUrl, queryString, searchParams, fullUrl, options, }: {
|
|
34
|
+
/**
|
|
35
|
+
* fetch 응답 데이터
|
|
36
|
+
*/
|
|
10
37
|
res: ResponseData;
|
|
11
|
-
|
|
38
|
+
/**
|
|
39
|
+
* API 도메인
|
|
40
|
+
* - "ai"(ai-service), "db"(chickenmonger CRUD), "uniai"
|
|
41
|
+
* - 커스텀 도메인을 쓰는 경우 string으로 직접 적용
|
|
42
|
+
*/
|
|
43
|
+
domain: string;
|
|
44
|
+
/**
|
|
45
|
+
* API 엔드포인트 쿼리 path
|
|
46
|
+
*/
|
|
12
47
|
queryUrl: string;
|
|
13
48
|
} & Partial<{
|
|
14
|
-
|
|
15
|
-
|
|
49
|
+
/**
|
|
50
|
+
* 쿼리스트링
|
|
51
|
+
*/
|
|
16
52
|
queryString: string;
|
|
53
|
+
/**
|
|
54
|
+
* URLSearchParams 객체
|
|
55
|
+
*/
|
|
17
56
|
searchParams: URLSearchParams | object;
|
|
57
|
+
/**
|
|
58
|
+
* 전체 URL
|
|
59
|
+
*/
|
|
18
60
|
fullUrl: string;
|
|
61
|
+
/**
|
|
62
|
+
* 응답 옵션
|
|
63
|
+
*/
|
|
19
64
|
options: ResponseInit;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
declare function setTokenRequestHeaders(): Promise<HeadersInit | undefined>;
|
|
23
|
-
|
|
24
|
-
declare function setDebugResponseHeaders<ResponseData>(params: SetDebugResponseHeadersParams<InfraKey, ResponseData>): Promise<NextResponse<ResponseData>>;
|
|
65
|
+
}>): Promise<NextResponse<ResponseData>>;
|
|
25
66
|
|
|
26
|
-
export {
|
|
67
|
+
export { setDebugResponseHeaders, setTokenRequestHeaders };
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,46 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { headers } from "next/headers";
|
|
3
|
-
import { NextResponse } from "next/server";
|
|
4
|
-
import { getQueryString } from "@uniai-fe/util-functions/api";
|
|
5
|
-
import {
|
|
6
|
-
resolveNextDomainSources
|
|
7
|
-
} from "../infra";
|
|
8
|
-
async function setTokenRequestHeaders() {
|
|
9
|
-
const nextHeaders = await headers();
|
|
10
|
-
const token = nextHeaders.get("Authorization") || "";
|
|
11
|
-
if (!token) return void 0;
|
|
12
|
-
return new Headers({
|
|
13
|
-
Authorization: token
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
async function setDebugResponseHeaders(params) {
|
|
17
|
-
const {
|
|
18
|
-
res,
|
|
19
|
-
infra,
|
|
20
|
-
queryUrl,
|
|
21
|
-
config,
|
|
22
|
-
domain,
|
|
23
|
-
queryString,
|
|
24
|
-
searchParams,
|
|
25
|
-
fullUrl,
|
|
26
|
-
options
|
|
27
|
-
} = params;
|
|
28
|
-
const response = NextResponse.json(res, options);
|
|
29
|
-
const sources = resolveNextDomainSources(infra, config);
|
|
30
|
-
const resolvedDomain = typeof domain === "string" && domain.length > 0 ? domain : sources.domain;
|
|
31
|
-
response.headers.set(
|
|
32
|
-
"Uniai-Native-Domain-Env-Exist",
|
|
33
|
-
String(sources.hasEnv)
|
|
34
|
-
);
|
|
35
|
-
response.headers.set("Uniai-Native-Domain", resolvedDomain || infra);
|
|
36
|
-
response.headers.set("Uniai-Native-Path", queryUrl);
|
|
37
|
-
const computedQuery = typeof queryString === "string" ? queryString : searchParams ? getQueryString(searchParams) : "";
|
|
38
|
-
const url = fullUrl || `${resolvedDomain || infra || ""}${queryUrl || ""}${computedQuery || ""}`;
|
|
39
|
-
response.headers.set("Uniai-Native-URL", url);
|
|
40
|
-
return response;
|
|
41
|
-
}
|
|
42
|
-
export {
|
|
43
|
-
setDebugResponseHeaders,
|
|
44
|
-
setTokenRequestHeaders
|
|
45
|
-
};
|
|
1
|
+
export * from "./module";
|
|
46
2
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["export * from \"./module\";\n"],"mappings":"AAAA,cAAc;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uniai-fe/util-next",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
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.22.0",
|
|
14
14
|
"engines": {
|
|
15
15
|
"node": ">=22",
|
|
16
16
|
"pnpm": ">=10"
|
|
@@ -24,8 +24,13 @@
|
|
|
24
24
|
"dist"
|
|
25
25
|
],
|
|
26
26
|
"scripts": {
|
|
27
|
+
"lint": "eslint . --max-warnings=0",
|
|
28
|
+
"typecheck": "tsc --project tsconfig.build.json --noEmit",
|
|
27
29
|
"build": "tsup",
|
|
28
|
-
"dev": "tsup --watch",
|
|
30
|
+
"dev": "node ../../../scripts/tsup-watch-filter.mjs --watch",
|
|
31
|
+
"module:lint": "pnpm lint",
|
|
32
|
+
"module:typecheck": "pnpm typecheck",
|
|
33
|
+
"module:build": "pnpm build",
|
|
29
34
|
"util-next:build": "pnpm run build",
|
|
30
35
|
"util-next:dev": "pnpm run dev"
|
|
31
36
|
},
|
|
@@ -40,25 +45,25 @@
|
|
|
40
45
|
"default": "./dist/index.mjs"
|
|
41
46
|
},
|
|
42
47
|
"./server": {
|
|
43
|
-
"types": "./dist/server.d.ts",
|
|
44
|
-
"import": "./dist/server.mjs",
|
|
45
|
-
"require": "./dist/server.cjs",
|
|
46
|
-
"default": "./dist/server.mjs"
|
|
48
|
+
"types": "./dist/server/index.d.ts",
|
|
49
|
+
"import": "./dist/server/index.mjs",
|
|
50
|
+
"require": "./dist/server/index.cjs",
|
|
51
|
+
"default": "./dist/server/index.mjs"
|
|
47
52
|
}
|
|
48
53
|
},
|
|
49
54
|
"dependencies": {
|
|
50
|
-
"@uniai-fe/util-functions": "
|
|
55
|
+
"@uniai-fe/util-functions": "^0.1.1"
|
|
51
56
|
},
|
|
52
57
|
"peerDependencies": {
|
|
53
58
|
"next": ">= 15"
|
|
54
59
|
},
|
|
55
60
|
"devDependencies": {
|
|
56
|
-
"@types/node": "^
|
|
61
|
+
"@types/node": "^24.10.1",
|
|
57
62
|
"@uniai-fe/eslint-config": "workspace:*",
|
|
58
63
|
"@uniai-fe/tsconfig": "workspace:*",
|
|
59
|
-
"eslint": "^9.
|
|
64
|
+
"eslint": "^9.39.1",
|
|
60
65
|
"prettier": "^3.6.2",
|
|
61
|
-
"tsup": "^8.5.
|
|
66
|
+
"tsup": "^8.5.1",
|
|
62
67
|
"typescript": "~5.9.3"
|
|
63
68
|
}
|
|
64
69
|
}
|
package/dist/infra/index.cjs
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var api = require('@uniai-fe/util-functions/api');
|
|
4
|
-
|
|
5
|
-
// src/infra/index.ts
|
|
6
|
-
var ENV_KEY_MAP = {
|
|
7
|
-
ai: "AI_API_BASE",
|
|
8
|
-
db: "DB_API_BASE",
|
|
9
|
-
uniai: "UNIAI_API_BASE"
|
|
10
|
-
};
|
|
11
|
-
var resolveNextDomainSources = (infra, config) => {
|
|
12
|
-
const envKey = ENV_KEY_MAP[infra];
|
|
13
|
-
const configValue = config?.env?.[infra];
|
|
14
|
-
const envValue = typeof envKey === "string" && envKey in process.env ? process.env[envKey] : void 0;
|
|
15
|
-
const domain = configValue ?? envValue ?? (typeof infra === "string" && infra.length > 0 ? infra : "");
|
|
16
|
-
return {
|
|
17
|
-
domain,
|
|
18
|
-
envKey,
|
|
19
|
-
envValue: envValue ?? void 0,
|
|
20
|
-
configValue,
|
|
21
|
-
hasEnv: Boolean(configValue ?? envValue)
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
var createNextDomainResolver = (config) => {
|
|
25
|
-
return (infra) => resolveNextDomainSources(infra, config).domain;
|
|
26
|
-
};
|
|
27
|
-
var createNextApiClient = (config, options) => {
|
|
28
|
-
const resolveDomain = createNextDomainResolver(config);
|
|
29
|
-
return api.createBackendApiClient({
|
|
30
|
-
resolveDomain,
|
|
31
|
-
logger: options?.logger ?? api.defaultApiLogger
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
exports.createNextApiClient = createNextApiClient;
|
|
36
|
-
exports.createNextDomainResolver = createNextDomainResolver;
|
|
37
|
-
exports.resolveNextDomainSources = resolveNextDomainSources;
|
|
38
|
-
//# sourceMappingURL=index.cjs.map
|
|
39
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/infra/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/infra/index.ts"],"names":["createBackendApiClient","defaultApiLogger"],"mappings":";;;;;AAaA,IAAM,WAAA,GAAiD;AAAA,EACrD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,KAAA,EAAO;AACT,CAAA;AAIO,IAAM,wBAAA,GAA2B,CACtC,KAAA,EACA,MAAA,KAC4B;AAC5B,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,GAAA,GAAM,KAAK,CAAA;AACvC,EAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,IAAU,QAAQ,GAAA,GAC5C,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAClB,MAAA;AAEN,EAAA,MAAM,MAAA,GACJ,eACA,QAAA,KACC,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,EAAA,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAU,QAAA,IAAY,MAAA;AAAA,IACtB,WAAA;AAAA,IACA,MAAA,EAAQ,OAAA,CAAQ,WAAA,IAAe,QAAQ;AAAA,GACzC;AACF;AAEO,IAAM,wBAAA,GAA2B,CACtC,MAAA,KACmB;AACnB,EAAA,OAAO,CAAC,KAAA,KAAoB,wBAAA,CAAyB,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA;AACtE;AAEO,IAAM,mBAAA,GAAsB,CACjC,MAAA,EACA,OAAA,KACG;AACH,EAAA,MAAM,aAAA,GAAgB,yBAAyB,MAAM,CAAA;AACrD,EAAA,OAAOA,0BAAA,CAAuB;AAAA,IAC5B,aAAA;AAAA,IACA,MAAA,EAAQ,SAAS,MAAA,IAAUC;AAAA,GAC5B,CAAA;AACH","file":"index.cjs","sourcesContent":["import {\n createBackendApiClient,\n defaultApiLogger,\n type ApiLogger,\n type DomainResolver,\n type InfraKey,\n} from \"@uniai-fe/util-functions/api\";\nimport type {\n NextApiConfig,\n NextApiDomainMap,\n ResolveNextDomainResult,\n} from \"./types\";\n\nconst ENV_KEY_MAP: Partial<Record<InfraKey, string>> = {\n ai: \"AI_API_BASE\",\n db: \"DB_API_BASE\",\n uniai: \"UNIAI_API_BASE\",\n};\n\nexport type { NextApiConfig, NextApiDomainMap, ResolveNextDomainResult };\n\nexport const resolveNextDomainSources = (\n infra: InfraKey,\n config?: NextApiConfig,\n): ResolveNextDomainResult => {\n const envKey = ENV_KEY_MAP[infra];\n const configValue = config?.env?.[infra];\n const envValue =\n typeof envKey === \"string\" && envKey in process.env\n ? process.env[envKey]\n : undefined;\n\n const domain =\n configValue ??\n envValue ??\n (typeof infra === \"string\" && infra.length > 0 ? infra : \"\");\n\n return {\n domain,\n envKey,\n envValue: envValue ?? undefined,\n configValue,\n hasEnv: Boolean(configValue ?? envValue),\n };\n};\n\nexport const createNextDomainResolver = (\n config?: NextApiConfig,\n): DomainResolver => {\n return (infra: InfraKey) => resolveNextDomainSources(infra, config).domain;\n};\n\nexport const createNextApiClient = (\n config?: NextApiConfig,\n options?: { logger?: ApiLogger },\n) => {\n const resolveDomain = createNextDomainResolver(config);\n return createBackendApiClient({\n resolveDomain,\n logger: options?.logger ?? defaultApiLogger,\n });\n};\n"]}
|
package/dist/infra/index.d.cts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import * as _uniai_fe_util_functions_api from '@uniai-fe/util-functions/api';
|
|
2
|
-
import { InfraKey, DomainResolver, ApiLogger } from '@uniai-fe/util-functions/api';
|
|
3
|
-
|
|
4
|
-
type NextApiDomainMap = Partial<Record<InfraKey, string | undefined>>;
|
|
5
|
-
type NextApiConfig = {
|
|
6
|
-
env?: NextApiDomainMap;
|
|
7
|
-
};
|
|
8
|
-
type ResolveNextDomainResult = {
|
|
9
|
-
domain: string;
|
|
10
|
-
envKey?: string;
|
|
11
|
-
envValue?: string;
|
|
12
|
-
configValue?: string;
|
|
13
|
-
hasEnv: boolean;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
declare const resolveNextDomainSources: (infra: InfraKey, config?: NextApiConfig) => ResolveNextDomainResult;
|
|
17
|
-
declare const createNextDomainResolver: (config?: NextApiConfig) => DomainResolver;
|
|
18
|
-
declare const createNextApiClient: (config?: NextApiConfig, options?: {
|
|
19
|
-
logger?: ApiLogger;
|
|
20
|
-
}) => {
|
|
21
|
-
getQueryString: (searchParams?: unknown) => string;
|
|
22
|
-
generateBackendQueryUrl_GET: ({ infra, domain, routeUrl, queryUrl, searchParams, log, logDisabled, logger, }: _uniai_fe_util_functions_api.GenerateBackendQueryUrlOptions<InfraKey>) => string;
|
|
23
|
-
fetchBackendQuery: <FetchRequestType extends object, FetchResponseType extends _uniai_fe_util_functions_api.CommonPostResponseType>({ infra, domain, routeUrl, queryUrl, method, headers, body, bodyOriginData, queryStringData, log, logDisabled, fetchDisabled, logger, }: _uniai_fe_util_functions_api.FetchBackendQueryOptions<InfraKey, FetchRequestType>) => Promise<FetchResponseType>;
|
|
24
|
-
logger: ApiLogger;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export { type NextApiConfig, type NextApiDomainMap, type ResolveNextDomainResult, createNextApiClient, createNextDomainResolver, resolveNextDomainSources };
|
package/dist/infra/index.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import * as _uniai_fe_util_functions_api from '@uniai-fe/util-functions/api';
|
|
2
|
-
import { InfraKey, DomainResolver, ApiLogger } from '@uniai-fe/util-functions/api';
|
|
3
|
-
|
|
4
|
-
type NextApiDomainMap = Partial<Record<InfraKey, string | undefined>>;
|
|
5
|
-
type NextApiConfig = {
|
|
6
|
-
env?: NextApiDomainMap;
|
|
7
|
-
};
|
|
8
|
-
type ResolveNextDomainResult = {
|
|
9
|
-
domain: string;
|
|
10
|
-
envKey?: string;
|
|
11
|
-
envValue?: string;
|
|
12
|
-
configValue?: string;
|
|
13
|
-
hasEnv: boolean;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
declare const resolveNextDomainSources: (infra: InfraKey, config?: NextApiConfig) => ResolveNextDomainResult;
|
|
17
|
-
declare const createNextDomainResolver: (config?: NextApiConfig) => DomainResolver;
|
|
18
|
-
declare const createNextApiClient: (config?: NextApiConfig, options?: {
|
|
19
|
-
logger?: ApiLogger;
|
|
20
|
-
}) => {
|
|
21
|
-
getQueryString: (searchParams?: unknown) => string;
|
|
22
|
-
generateBackendQueryUrl_GET: ({ infra, domain, routeUrl, queryUrl, searchParams, log, logDisabled, logger, }: _uniai_fe_util_functions_api.GenerateBackendQueryUrlOptions<InfraKey>) => string;
|
|
23
|
-
fetchBackendQuery: <FetchRequestType extends object, FetchResponseType extends _uniai_fe_util_functions_api.CommonPostResponseType>({ infra, domain, routeUrl, queryUrl, method, headers, body, bodyOriginData, queryStringData, log, logDisabled, fetchDisabled, logger, }: _uniai_fe_util_functions_api.FetchBackendQueryOptions<InfraKey, FetchRequestType>) => Promise<FetchResponseType>;
|
|
24
|
-
logger: ApiLogger;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export { type NextApiConfig, type NextApiDomainMap, type ResolveNextDomainResult, createNextApiClient, createNextDomainResolver, resolveNextDomainSources };
|
package/dist/infra/index.mjs
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { createBackendApiClient, defaultApiLogger } from '@uniai-fe/util-functions/api';
|
|
2
|
-
|
|
3
|
-
// src/infra/index.ts
|
|
4
|
-
var ENV_KEY_MAP = {
|
|
5
|
-
ai: "AI_API_BASE",
|
|
6
|
-
db: "DB_API_BASE",
|
|
7
|
-
uniai: "UNIAI_API_BASE"
|
|
8
|
-
};
|
|
9
|
-
var resolveNextDomainSources = (infra, config) => {
|
|
10
|
-
const envKey = ENV_KEY_MAP[infra];
|
|
11
|
-
const configValue = config?.env?.[infra];
|
|
12
|
-
const envValue = typeof envKey === "string" && envKey in process.env ? process.env[envKey] : void 0;
|
|
13
|
-
const domain = configValue ?? envValue ?? (typeof infra === "string" && infra.length > 0 ? infra : "");
|
|
14
|
-
return {
|
|
15
|
-
domain,
|
|
16
|
-
envKey,
|
|
17
|
-
envValue: envValue ?? void 0,
|
|
18
|
-
configValue,
|
|
19
|
-
hasEnv: Boolean(configValue ?? envValue)
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
var createNextDomainResolver = (config) => {
|
|
23
|
-
return (infra) => resolveNextDomainSources(infra, config).domain;
|
|
24
|
-
};
|
|
25
|
-
var createNextApiClient = (config, options) => {
|
|
26
|
-
const resolveDomain = createNextDomainResolver(config);
|
|
27
|
-
return createBackendApiClient({
|
|
28
|
-
resolveDomain,
|
|
29
|
-
logger: options?.logger ?? defaultApiLogger
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
export { createNextApiClient, createNextDomainResolver, resolveNextDomainSources };
|
|
34
|
-
//# sourceMappingURL=index.mjs.map
|
|
35
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/infra/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/infra/index.ts"],"names":[],"mappings":";;;AAaA,IAAM,WAAA,GAAiD;AAAA,EACrD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,KAAA,EAAO;AACT,CAAA;AAIO,IAAM,wBAAA,GAA2B,CACtC,KAAA,EACA,MAAA,KAC4B;AAC5B,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,GAAA,GAAM,KAAK,CAAA;AACvC,EAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,IAAU,QAAQ,GAAA,GAC5C,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAClB,MAAA;AAEN,EAAA,MAAM,MAAA,GACJ,eACA,QAAA,KACC,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,EAAA,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAU,QAAA,IAAY,MAAA;AAAA,IACtB,WAAA;AAAA,IACA,MAAA,EAAQ,OAAA,CAAQ,WAAA,IAAe,QAAQ;AAAA,GACzC;AACF;AAEO,IAAM,wBAAA,GAA2B,CACtC,MAAA,KACmB;AACnB,EAAA,OAAO,CAAC,KAAA,KAAoB,wBAAA,CAAyB,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA;AACtE;AAEO,IAAM,mBAAA,GAAsB,CACjC,MAAA,EACA,OAAA,KACG;AACH,EAAA,MAAM,aAAA,GAAgB,yBAAyB,MAAM,CAAA;AACrD,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,aAAA;AAAA,IACA,MAAA,EAAQ,SAAS,MAAA,IAAU;AAAA,GAC5B,CAAA;AACH","file":"index.mjs","sourcesContent":["import {\n createBackendApiClient,\n defaultApiLogger,\n type ApiLogger,\n type DomainResolver,\n type InfraKey,\n} from \"@uniai-fe/util-functions/api\";\nimport type {\n NextApiConfig,\n NextApiDomainMap,\n ResolveNextDomainResult,\n} from \"./types\";\n\nconst ENV_KEY_MAP: Partial<Record<InfraKey, string>> = {\n ai: \"AI_API_BASE\",\n db: \"DB_API_BASE\",\n uniai: \"UNIAI_API_BASE\",\n};\n\nexport type { NextApiConfig, NextApiDomainMap, ResolveNextDomainResult };\n\nexport const resolveNextDomainSources = (\n infra: InfraKey,\n config?: NextApiConfig,\n): ResolveNextDomainResult => {\n const envKey = ENV_KEY_MAP[infra];\n const configValue = config?.env?.[infra];\n const envValue =\n typeof envKey === \"string\" && envKey in process.env\n ? process.env[envKey]\n : undefined;\n\n const domain =\n configValue ??\n envValue ??\n (typeof infra === \"string\" && infra.length > 0 ? infra : \"\");\n\n return {\n domain,\n envKey,\n envValue: envValue ?? undefined,\n configValue,\n hasEnv: Boolean(configValue ?? envValue),\n };\n};\n\nexport const createNextDomainResolver = (\n config?: NextApiConfig,\n): DomainResolver => {\n return (infra: InfraKey) => resolveNextDomainSources(infra, config).domain;\n};\n\nexport const createNextApiClient = (\n config?: NextApiConfig,\n options?: { logger?: ApiLogger },\n) => {\n const resolveDomain = createNextDomainResolver(config);\n return createBackendApiClient({\n resolveDomain,\n logger: options?.logger ?? defaultApiLogger,\n });\n};\n"]}
|