@uniai-fe/util-next 0.1.0 → 0.1.1

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 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/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
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
- Object.defineProperty(exports, "defaultApiLogger", {
36
- enumerable: true,
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
@@ -1 +1 @@
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"]}
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
- export { NextApiConfig, NextApiDomainMap, ResolveNextDomainResult, createNextApiClient, createNextDomainResolver, resolveNextDomainSources } from './infra/index.cjs';
2
- export { ApiLogger, CommonPostResponseType, InfraKey, defaultApiLogger } from '@uniai-fe/util-functions/api';
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
- export { NextApiConfig, NextApiDomainMap, ResolveNextDomainResult, createNextApiClient, createNextDomainResolver, resolveNextDomainSources } from './infra/index.js';
2
- export { ApiLogger, CommonPostResponseType, InfraKey, defaultApiLogger } from '@uniai-fe/util-functions/api';
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 { createBackendApiClient, defaultApiLogger } from '@uniai-fe/util-functions/api';
2
- export { defaultApiLogger } from '@uniai-fe/util-functions/api';
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/infra/index.ts
5
- var ENV_KEY_MAP = {
6
- ai: "AI_API_BASE",
7
- db: "DB_API_BASE",
8
- uniai: "UNIAI_API_BASE"
9
- };
10
- var resolveNextDomainSources = (infra, config) => {
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 { createNextApiClient, createNextDomainResolver, resolveNextDomainSources };
32
+ export { setDebugResponseHeaders, setTokenRequestHeaders };
35
33
  //# sourceMappingURL=index.mjs.map
36
34
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
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"]}
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"]}
@@ -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
- var import_headers = require("next/headers");
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
- setDebugResponseHeaders,
67
- setTokenRequestHeaders
21
+ ...require("./module")
68
22
  });
69
23
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString, type InfraKey } from \"@uniai-fe/util-functions/api\";\nimport {\n createNextDomainResolver,\n resolveNextDomainSources,\n type NextApiConfig,\n} from \"../infra\";\nimport type { SetDebugResponseHeadersParams } from \"./types\";\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\nexport type { SetDebugResponseHeadersParams };\n\nexport async function setDebugResponseHeaders<ResponseData>(\n params: SetDebugResponseHeadersParams<InfraKey, ResponseData>,\n): Promise<NextResponse<ResponseData>> {\n const {\n res,\n infra,\n queryUrl,\n config,\n domain,\n queryString,\n searchParams,\n fullUrl,\n options,\n } = params;\n\n const response = NextResponse.json(res, options);\n const sources = resolveNextDomainSources(infra, config);\n const resolvedDomain =\n typeof domain === \"string\" && domain.length > 0 ? domain : sources.domain;\n\n response.headers.set(\n \"Uniai-Native-Domain-Env-Exist\",\n String(sources.hasEnv),\n );\n response.headers.set(\"Uniai-Native-Domain\", resolvedDomain || infra);\n response.headers.set(\"Uniai-Native-Path\", queryUrl);\n\n const computedQuery =\n typeof queryString === \"string\"\n ? queryString\n : searchParams\n ? getQueryString(searchParams)\n : \"\";\n const url =\n fullUrl ||\n `${resolvedDomain || infra || \"\"}${queryUrl || \"\"}${computedQuery || \"\"}`;\n response.headers.set(\"Uniai-Native-URL\", url);\n\n return response;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAwB;AACxB,oBAA6B;AAC7B,iBAA8C;AAC9C,mBAIO;AAGP,eAAsB,yBAEpB;AACA,QAAM,cAAc,UAAM,wBAAQ;AAClC,QAAM,QAAQ,YAAY,IAAI,eAAe,KAAK;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,IAAI,QAAQ;AAAA,IACjB,eAAe;AAAA,EACjB,CAAC;AACH;AAIA,eAAsB,wBACpB,QACqC;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,2BAAa,KAAK,KAAK,OAAO;AAC/C,QAAM,cAAU,uCAAyB,OAAO,MAAM;AACtD,QAAM,iBACJ,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS,QAAQ;AAErE,WAAS,QAAQ;AAAA,IACf;AAAA,IACA,OAAO,QAAQ,MAAM;AAAA,EACvB;AACA,WAAS,QAAQ,IAAI,uBAAuB,kBAAkB,KAAK;AACnE,WAAS,QAAQ,IAAI,qBAAqB,QAAQ;AAElD,QAAM,gBACJ,OAAO,gBAAgB,WACnB,cACA,mBACE,2BAAe,YAAY,IAC3B;AACR,QAAM,MACJ,WACA,GAAG,kBAAkB,SAAS,EAAE,GAAG,YAAY,EAAE,GAAG,iBAAiB,EAAE;AACzE,WAAS,QAAQ,IAAI,oBAAoB,GAAG;AAE5C,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["export * from \"./module\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,2BAAc,qBAAd;","names":[]}
@@ -1,26 +1,67 @@
1
1
  import { NextResponse } from 'next/server';
2
- import { InfraKey } from '@uniai-fe/util-functions/api';
3
2
 
4
- type NextApiDomainMap = Partial<Record<InfraKey, string | undefined>>;
5
- type NextApiConfig = {
6
- env?: NextApiDomainMap;
7
- };
8
-
9
- type SetDebugResponseHeadersParams<Infra extends InfraKey, ResponseData> = {
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
- infra: Infra;
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
- config: NextApiConfig;
15
- domain: string;
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 { type SetDebugResponseHeadersParams, setDebugResponseHeaders, setTokenRequestHeaders };
67
+ export { setDebugResponseHeaders, setTokenRequestHeaders };
@@ -1,26 +1,67 @@
1
1
  import { NextResponse } from 'next/server';
2
- import { InfraKey } from '@uniai-fe/util-functions/api';
3
2
 
4
- type NextApiDomainMap = Partial<Record<InfraKey, string | undefined>>;
5
- type NextApiConfig = {
6
- env?: NextApiDomainMap;
7
- };
8
-
9
- type SetDebugResponseHeadersParams<Infra extends InfraKey, ResponseData> = {
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
- infra: Infra;
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
- config: NextApiConfig;
15
- domain: string;
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 { type SetDebugResponseHeadersParams, setDebugResponseHeaders, setTokenRequestHeaders };
67
+ export { setDebugResponseHeaders, setTokenRequestHeaders };
@@ -1,46 +1,2 @@
1
- "use server";
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":["\"use server\";\n\nimport { headers } from \"next/headers\";\nimport { NextResponse } from \"next/server\";\nimport { getQueryString, type InfraKey } from \"@uniai-fe/util-functions/api\";\nimport {\n createNextDomainResolver,\n resolveNextDomainSources,\n type NextApiConfig,\n} from \"../infra\";\nimport type { SetDebugResponseHeadersParams } from \"./types\";\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\nexport type { SetDebugResponseHeadersParams };\n\nexport async function setDebugResponseHeaders<ResponseData>(\n params: SetDebugResponseHeadersParams<InfraKey, ResponseData>,\n): Promise<NextResponse<ResponseData>> {\n const {\n res,\n infra,\n queryUrl,\n config,\n domain,\n queryString,\n searchParams,\n fullUrl,\n options,\n } = params;\n\n const response = NextResponse.json(res, options);\n const sources = resolveNextDomainSources(infra, config);\n const resolvedDomain =\n typeof domain === \"string\" && domain.length > 0 ? domain : sources.domain;\n\n response.headers.set(\n \"Uniai-Native-Domain-Env-Exist\",\n String(sources.hasEnv),\n );\n response.headers.set(\"Uniai-Native-Domain\", resolvedDomain || infra);\n response.headers.set(\"Uniai-Native-Path\", queryUrl);\n\n const computedQuery =\n typeof queryString === \"string\"\n ? queryString\n : searchParams\n ? getQueryString(searchParams)\n : \"\";\n const url =\n fullUrl ||\n `${resolvedDomain || infra || \"\"}${queryUrl || \"\"}${computedQuery || \"\"}`;\n response.headers.set(\"Uniai-Native-URL\", url);\n\n return response;\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,sBAAqC;AAC9C;AAAA,EAEE;AAAA,OAEK;AAGP,eAAsB,yBAEpB;AACA,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,QAAQ,YAAY,IAAI,eAAe,KAAK;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,IAAI,QAAQ;AAAA,IACjB,eAAe;AAAA,EACjB,CAAC;AACH;AAIA,eAAsB,wBACpB,QACqC;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,aAAa,KAAK,KAAK,OAAO;AAC/C,QAAM,UAAU,yBAAyB,OAAO,MAAM;AACtD,QAAM,iBACJ,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS,QAAQ;AAErE,WAAS,QAAQ;AAAA,IACf;AAAA,IACA,OAAO,QAAQ,MAAM;AAAA,EACvB;AACA,WAAS,QAAQ,IAAI,uBAAuB,kBAAkB,KAAK;AACnE,WAAS,QAAQ,IAAI,qBAAqB,QAAQ;AAElD,QAAM,gBACJ,OAAO,gBAAgB,WACnB,cACA,eACE,eAAe,YAAY,IAC3B;AACR,QAAM,MACJ,WACA,GAAG,kBAAkB,SAAS,EAAE,GAAG,YAAY,EAAE,GAAG,iBAAiB,EAAE;AACzE,WAAS,QAAQ,IAAI,oBAAoB,GAAG;AAE5C,SAAO;AACT;","names":[]}
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.0",
3
+ "version": "0.1.1",
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.20.0",
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,10 +45,10 @@
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": {
@@ -53,12 +58,12 @@
53
58
  "next": ">= 15"
54
59
  },
55
60
  "devDependencies": {
56
- "@types/node": "^22.15.30",
61
+ "@types/node": "^24.10.1",
57
62
  "@uniai-fe/eslint-config": "workspace:*",
58
63
  "@uniai-fe/tsconfig": "workspace:*",
59
- "eslint": "^9.38.0",
64
+ "eslint": "^9.39.1",
60
65
  "prettier": "^3.6.2",
61
- "tsup": "^8.5.0",
66
+ "tsup": "^8.5.1",
62
67
  "typescript": "~5.9.3"
63
68
  }
64
69
  }
@@ -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
@@ -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"]}
@@ -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 };
@@ -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 };
@@ -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
@@ -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"]}