sales-frontend-api 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/method.js CHANGED
@@ -5,102 +5,126 @@ var __defProp = Object.defineProperty;
5
5
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
6
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
7
 
8
- // src/http-client/abstract-http-client.ts
9
- var AbstractHttpClient = class {
8
+ // src/http-client/cookie/cookie-client.ts
9
+ var cookieClient = {
10
+ getCookie(name) {
11
+ if (typeof document === "undefined") {
12
+ return "";
13
+ }
14
+ const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));
15
+ return match ? decodeURIComponent(match[2] || "") : "";
16
+ },
17
+ setCookie(name, value, options = {}) {
18
+ if (typeof document === "undefined") {
19
+ return;
20
+ }
21
+ let cookieString = `${name}=${encodeURIComponent(value)}`;
22
+ if (options.expires) {
23
+ let expiresDate;
24
+ if (typeof options.expires === "number") {
25
+ expiresDate = /* @__PURE__ */ new Date();
26
+ expiresDate.setDate(expiresDate.getDate() + options.expires);
27
+ } else {
28
+ expiresDate = options.expires;
29
+ }
30
+ cookieString += `; expires=${expiresDate.toUTCString()}`;
31
+ }
32
+ cookieString += `; path=${options.path || "/"}`;
33
+ if (options.domain) {
34
+ cookieString += `; domain=${options.domain}`;
35
+ }
36
+ if (options.secure) {
37
+ cookieString += "; secure";
38
+ }
39
+ document.cookie = cookieString;
40
+ },
41
+ deleteCookie(name, options = {}) {
42
+ cookieClient.setCookie(name, "", { ...options, expires: -1 });
43
+ }
44
+ };
45
+
46
+ // src/http-client/header/header.types.ts
47
+ var customHeaderNames = [
48
+ "Accept-Language",
49
+ "DeviceId",
50
+ "LoginType",
51
+ "PlatformName",
52
+ "PlatformVersion",
53
+ "AppVersion",
54
+ "DeviceModel",
55
+ "FormFactor",
56
+ "LoginChannel"
57
+ ];
58
+ var AT = "AT";
59
+
60
+ // src/http-client/header/header-manager.ts
61
+ var HeaderManager = class {
62
+ constructor(getter, setter) {
63
+ __publicField(this, "getter");
64
+ __publicField(this, "setter");
65
+ this.getter = getter;
66
+ this.setter = setter;
67
+ }
68
+ /**
69
+ * 커스텀 헤더를 동기적으로 설정합니다.
70
+ */
71
+ setCustomHeaders() {
72
+ customHeaderNames.forEach((headerName) => {
73
+ const customHeaderKey = `X-Channel-${headerName}`;
74
+ const headerValue = this.getter(customHeaderKey);
75
+ if (headerValue) {
76
+ this.setter(customHeaderKey, headerValue);
77
+ }
78
+ });
79
+ }
80
+ /**
81
+ * 인증 토큰을 동기적으로 설정합니다.
82
+ */
83
+ setAuthToken() {
84
+ const token = this.getter(AT);
85
+ if (token) {
86
+ this.setter("Authorization", `Bearer ${token}`);
87
+ }
88
+ }
89
+ /**
90
+ * 모든 헤더를 동기적으로 설정합니다.
91
+ */
92
+ setAllHeaders() {
93
+ this.setCustomHeaders();
94
+ this.setAuthToken();
95
+ }
10
96
  };
11
97
 
12
98
  // src/http-client/axios/http-client-axios.ts
13
- var HttpClientAxios = class extends AbstractHttpClient {
14
- constructor(config) {
15
- super();
16
- /**
17
- * API연동 실패시, 공통 에러 핸들러
18
- * extends된 런타임 동작환경에 맞는 SSR,CSR 방식으로 에러핸들링처리
19
- */
20
- __publicField(this, "errorHandler");
21
- /**
22
- * AxiosRequestConfig 를 확장한 interface
23
- * axios create시 기본설정값 및 기타 필요한 정보들을 추가 가능
24
- */
99
+ var isRefreshed = true;
100
+ var axiosQueue = [];
101
+ var HttpClientAxios = class {
102
+ constructor(config = {}) {
25
103
  __publicField(this, "config");
104
+ __publicField(this, "headerManager");
26
105
  /**
27
106
  * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
28
107
  */
29
- __publicField(this, "headers");
108
+ __publicField(this, "headers", {});
30
109
  /**
31
110
  * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
32
111
  * 현재 버전에서는 axios를 사용하여 구현됨.
33
112
  */
34
113
  __publicField(this, "api");
35
- if (!this.headers) {
36
- this.headers = {};
37
- }
38
114
  this.config = config;
39
- this.errorHandler = null;
115
+ const getter = (key) => {
116
+ return cookieClient.getCookie(key);
117
+ };
118
+ const setter = (key, value) => {
119
+ if (config?.headers) {
120
+ config.headers[key] = value;
121
+ }
122
+ };
123
+ this.headerManager = new HeaderManager(getter, setter);
40
124
  this.api = axios.create({
41
- baseURL: "\uC804\uCCB4\uACF5\uD1B5URL\uC774 \uC788\uC73C\uBA74 \uC14B\uD305",
42
125
  withCredentials: true,
43
126
  ...config
44
127
  });
45
- this.api.interceptors.request.use(async (config2) => {
46
- const headerEntries = Object.entries(this.headers);
47
- headerEntries.forEach(([key, value]) => {
48
- config2.headers.set(key, value);
49
- });
50
- return config2;
51
- });
52
- }
53
- async put(url, data, config) {
54
- try {
55
- const res = await this.api.put(url, data, config);
56
- return res;
57
- } catch (e) {
58
- throw this.errorHandler && this.errorHandler(e);
59
- }
60
- }
61
- async get(url, config) {
62
- try {
63
- const res = await this.api.get(url, config);
64
- return res;
65
- } catch (e) {
66
- throw this.errorHandler && this.errorHandler(e);
67
- }
68
- }
69
- async delete(url, config) {
70
- try {
71
- const res = await this.api.delete(url, config);
72
- return res;
73
- } catch (e) {
74
- throw this.errorHandler && this.errorHandler(e);
75
- }
76
- }
77
- async post(url, data, config) {
78
- try {
79
- const res = await this.api.post(url, data, config);
80
- return res;
81
- } catch (e) {
82
- throw this.errorHandler && this.errorHandler(e);
83
- }
84
- }
85
- setHeader(key, value) {
86
- this.headers[key] = value;
87
- }
88
- };
89
-
90
- // src/http-client/axios/csr-http-client-axios.ts
91
- var isRefreshed = true;
92
- var axiosQueue = [];
93
- var initConfig = {
94
- baseURL: "",
95
- dialog: true
96
- };
97
- var CsrHttpClientAxios = class extends HttpClientAxios {
98
- constructor(config) {
99
- super({
100
- ...initConfig,
101
- ...config
102
- });
103
- __publicField(this, "csrErrorHandler", null);
104
128
  this.api.interceptors.request.use(
105
129
  async (config2) => {
106
130
  const authClient = new AuthClient();
@@ -108,6 +132,11 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
108
132
  if (accessToken) {
109
133
  config2.headers.Authorization = `Bearer ${accessToken}`;
110
134
  }
135
+ this.headerManager.setCustomHeaders();
136
+ const headerEntries = Object.entries(this.headers);
137
+ headerEntries.forEach(([key, value]) => {
138
+ config2.headers.set(key, value);
139
+ });
111
140
  if (!isRefreshed) {
112
141
  return new Promise((resolve, reject) => {
113
142
  axiosQueue.push({ resolve, reject, config: config2 });
@@ -121,6 +150,9 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
121
150
  );
122
151
  this.api.interceptors.response.use(
123
152
  (response) => {
153
+ if (response.data.isSuccess === false) {
154
+ return Promise.reject(response);
155
+ }
124
156
  return response;
125
157
  },
126
158
  async (error) => {
@@ -136,27 +168,25 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
136
168
  this.api(p.config).then((response) => p.resolve(response)).catch((err) => p.reject(err));
137
169
  }
138
170
  }
171
+ }).catch((error2) => {
172
+ return Promise.reject(error2);
139
173
  });
140
174
  return new Promise((resolve, reject) => {
141
- originalRequest && axiosQueue.push({ resolve, reject, config: originalRequest });
175
+ if (originalRequest) {
176
+ axiosQueue.push({ resolve, reject, config: originalRequest });
177
+ }
142
178
  });
143
179
  } else {
144
- throw this.csrErrorHandler?.do(error, this.config);
180
+ return Promise.reject(error);
145
181
  }
146
182
  }
147
183
  );
148
184
  }
149
- setCsrErrorHandler(csrErrorHandler) {
150
- this.csrErrorHandler = csrErrorHandler;
151
- this.errorHandler = csrErrorHandler.errorHandler;
152
- }
153
- /**
154
- * API 연동 실패시, 에러핸들러 셋팅 (특정페이지에서만 동작하는 개별 핸들러)
155
- * @param handler csrErrorHandler
156
- */
157
- setLocalErrorHandler(handler, global = false) {
158
- this.csrErrorHandler?.setLocalHandler(handler);
159
- this.csrErrorHandler?.setGlobalCheck(global);
185
+ setHeaders(headers) {
186
+ this.headers = {
187
+ ...this.headers,
188
+ ...headers
189
+ };
160
190
  }
161
191
  };
162
192
 
@@ -188,10 +218,8 @@ var AuthClient = class {
188
218
  if (this.isApp()) {
189
219
  return await bridge.callToNative("", "", "refreshToken", {});
190
220
  } else {
191
- const csrHttpClient = new CsrHttpClientAxios({
192
- baseURL: ""
193
- });
194
- const res = await csrHttpClient.get("/internal/api/auth/refresh");
221
+ const httpclient = new HttpClientAxios({});
222
+ const res = await httpclient.api.get("/internal/api/auth/refresh");
195
223
  return res?.data.accessToken;
196
224
  }
197
225
  }
@@ -200,14 +228,13 @@ var AuthClient = class {
200
228
  // src/http-methods/sample/sample.service.ts
201
229
  var getTestMethod = async ({ id, config, setupFn }) => {
202
230
  const testAPI = `https://jsonplaceholder.typicode.com/users/${id}`;
203
- const csrHttpClient = new CsrHttpClientAxios();
204
- setupFn && setupFn(csrHttpClient);
205
- const res = await csrHttpClient.get(testAPI, config);
231
+ const httpClient = new HttpClientAxios(config);
232
+ const res = await httpClient.api.get(testAPI);
206
233
  return res.data;
207
234
  };
208
235
 
209
236
  // src/http-methods/search-modal/address-search/address-search.service.ts
210
- var getAddressMethod = async ({ searchKeyword, config, setupFn }) => {
237
+ var getAddressMethod = async ({ searchKeyword, config }) => {
211
238
  const mockAddresses = [
212
239
  { zipCode: "07345", address: "\uC11C\uC6B8 \uC601\uB4F1\uD3EC\uAD6C \uAD6D\uC81C\uAE08\uC735\uB85C 10", oldAddress: " \uC11C\uC6B8\uD2B9\uBCC4\uC2DC \uC601\uB4F1\uD3EC\uAD6C \uC5EC\uC758\uB3C4\uB3D9 60" },
213
240
  {
@@ -219,7 +246,7 @@ var getAddressMethod = async ({ searchKeyword, config, setupFn }) => {
219
246
  ];
220
247
  return mockAddresses;
221
248
  };
222
- var useSearchModalAddressQuery = (params, options) => {
249
+ var useSearchModalAddressQuery = (params, options, config) => {
223
250
  return useQuery({
224
251
  enabled: true,
225
252
  retry: false,
@@ -227,11 +254,10 @@ var useSearchModalAddressQuery = (params, options) => {
227
254
  queryFn: () => {
228
255
  return getAddressMethod({
229
256
  searchKeyword: params.searchKeyword,
230
- config: options?.config,
231
- setupFn: options?.setupFn
257
+ config
232
258
  });
233
259
  },
234
- ...options?.useQuery
260
+ ...options
235
261
  });
236
262
  };
237
263
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http-client/abstract-http-client.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/axios/csr-http-client-axios.ts","../src/http-client/auth/auth-client.ts","../src/http-methods/sample/sample.service.ts","../src/http-methods/search-modal/address-search/address-search.service.ts","../src/http-methods/search-modal/address-search/useSearchAddressQuery.ts"],"names":["config"],"mappings":"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","file":"method.js","sourcesContent":["/**\n * HttpClientFetch, HttpClientAxios 에서 공통\n */\nexport abstract class AbstractHttpClient<configType, InstanceType, errorType> {\n protected abstract config: configType;\n protected abstract headers: Record<string, string>;\n protected abstract api: InstanceType;\n protected abstract errorHandler: null | ((e: errorType) => void);\n\n abstract put<dataType>(url: string, data?: any, config?: configType): Promise<dataType | undefined>;\n abstract get<dataType>(url: string, config?: configType): Promise<dataType | undefined>;\n abstract post<dataType>(url: string, data?: any, config?: configType): Promise<dataType | undefined>;\n abstract delete<dataType>(url: string, config?: configType): Promise<dataType | undefined>;\n abstract setHeader(key: string, value: string): void;\n}\n","import axios, { AxiosRequestConfig, AxiosResponse, type AxiosInstance } from 'axios';\n\nimport { AbstractHttpClient } from '../abstract-http-client';\n\nimport type { customConfig } from './types';\n\nexport class HttpClientAxios<errorType extends Error> extends AbstractHttpClient<\n customConfig,\n AxiosInstance,\n errorType\n> {\n /**\n * API연동 실패시, 공통 에러 핸들러\n * extends된 런타임 동작환경에 맞는 SSR,CSR 방식으로 에러핸들링처리\n */\n protected errorHandler: null | ((e: errorType) => void);\n\n /**\n * AxiosRequestConfig 를 확장한 interface\n * axios create시 기본설정값 및 기타 필요한 정보들을 추가 가능\n */\n protected config: customConfig;\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n protected headers!: Record<string, string>;\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n protected api: AxiosInstance;\n constructor(config: customConfig) {\n super();\n if (!this.headers) {\n this.headers = {};\n }\n\n this.config = config;\n this.errorHandler = null;\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n * @todo baseURL process.env.BaseURL ?\n */\n this.api = axios.create({\n baseURL: '전체공통URL이 있으면 셋팅',\n withCredentials: true,\n ...config\n });\n\n /**\n * @todo 이 부분도 추후 api스펙에따라 부분 셋팅필요.\n * request 헤더,token처리 interceptor 등록\n */\n this.api.interceptors.request.use(async (config) => {\n /**\n * @todo\n * x-channel-[] 공통헤더 추가\n */\n // this.setHeader('x-channel-adfaf', '');\n // this.setHeader('x-channel-adfaf', '');\n // this.setHeader('x-channel-adfaf', '');\n\n /**\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n config.headers.set(key, value);\n });\n\n return config;\n });\n }\n\n async put<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.put<T, R, D>(url, data, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.get<T, R, D>(url, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n async delete<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.delete<T, R, D>(url, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n async post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.post<T, R, D>(url, data, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n setHeader(key: string, value: string) {\n this.headers[key] = value;\n }\n}\n","import { AuthClient } from '../auth/auth-client';\n\nimport { HttpClientAxios } from './http-client-axios';\n\nimport type { ErrorHandler, errorHandler } from './error-handler';\nimport type { CustomError } from '../custom-error';\nimport type { customConfig } from './types';\nimport type { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\n\nlet isRefreshed = true;\nconst axiosQueue: {\n resolve: (value?: unknown) => void;\n reject: (reason?: unknown) => void;\n config: InternalAxiosRequestConfig;\n}[] = [];\n/**\n * @todo 추후 env. baseUrl 또는 getBaseUrl() 등으로 치환\n */\nconst initConfig: customConfig = {\n baseURL: '',\n dialog: true\n};\n\nexport class CsrHttpClientAxios extends HttpClientAxios<CustomError> {\n private csrErrorHandler: ErrorHandler | null = null;\n constructor(config?: customConfig) {\n super({\n ...initConfig,\n ...config\n });\n\n /**\n * 401에러 Queue처리 Request interceptor 등록\n */\n this.api.interceptors.request.use(\n async (config) => {\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const accessToken = await authClient.getAT();\n if (accessToken) {\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n */\n if (!isRefreshed) {\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n /**\n * 401에러 Queue처리 Response interceptor 등록\n */\n this.api.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n async (error: AxiosError) => {\n const originalRequest = error.config;\n\n // 401 에러가 발생한 경우 처리\n if (error.response?.status === 401) {\n isRefreshed = false;\n const client = new AuthClient();\n client.refreshToken().then(() => {\n /**\n * 토큰 갱신 성공, 플래그를 true로 설정\n */\n isRefreshed = true;\n\n /**\n * 큐에 쌓여있던 모든 요청 재시도\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n /**\n * api 인스턴스를 통해 요청을 재시도합니다. 따라서 재요청들은 다시 인터셉터를 타게 됩니다.\n * 신규토큰을 주입받고 정상처리\n * @todo 재시도후 reject시에는 로그인페이지로 보내는 브릿지 함수를 호출하도록 처리가 필요해보임.\n */\n this.api(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n });\n\n return new Promise((resolve, reject) => {\n originalRequest && axiosQueue.push({ resolve, reject, config: originalRequest });\n });\n } else {\n /**\n * api 연동 에러시 처리영역\n */\n throw this.csrErrorHandler?.do(error, this.config);\n }\n }\n );\n }\n\n setCsrErrorHandler(csrErrorHandler: ErrorHandler) {\n this.csrErrorHandler = csrErrorHandler;\n /**\n * csr global errorhandler 주입\n */\n this.errorHandler = csrErrorHandler.errorHandler;\n }\n\n /**\n * API 연동 실패시, 에러핸들러 셋팅 (특정페이지에서만 동작하는 개별 핸들러)\n * @param handler csrErrorHandler\n */\n setLocalErrorHandler(handler: errorHandler, global = false) {\n this.csrErrorHandler?.setLocalHandler(handler);\n this.csrErrorHandler?.setGlobalCheck(global);\n }\n}\n","// import { bridge } from '@/app/responsive/bridge/tmp-bridge';\nimport { CsrHttpClientAxios } from '../axios/csr-http-client-axios';\n\nexport class AuthClient {\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n const {userAgent} = navigator;\n\n /**\n * @todo utils package에서 추후 임포트\n */\n // return isUserAgentMobile(userAgent);\n return true;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // return await bridge.callToNative('', '', 'getAT', {});\n return '';\n } else {\n /**\n * pc인 경우는, middleware.ts 에서 요청헤더에 주입\n */\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n * @returns Promise<string> 액세스토큰\n */\n async refreshToken(): Promise<string> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // @ts-ignore\n return await bridge.callToNative('', '', 'refreshToken', {});\n } else {\n /**\n * @todo : 내부api호출\n */\n const csrHttpClient = new CsrHttpClientAxios({\n baseURL: ''\n });\n const res = await csrHttpClient.get('/internal/api/auth/refresh');\n\n return res?.data.accessToken;\n }\n }\n}\n//\n","import { AxiosRequestConfig } from 'axios';\n\nimport { CsrHttpClientAxios } from '../../client';\n\nimport { TestResponse } from './sample.dto';\n\ninterface TestRequest {\n id?: number;\n config?: AxiosRequestConfig;\n setupFn?: (httpClient: CsrHttpClientAxios) => void;\n}\nexport const getTestMethod = async ({ id, config, setupFn }: TestRequest) => {\n const testAPI = `https://jsonplaceholder.typicode.com/users/${id}`;\n\n const csrHttpClient = new CsrHttpClientAxios();\n setupFn && setupFn(csrHttpClient);\n\n const res = await csrHttpClient.get<TestResponse>(testAPI, config);\n\n return res.data;\n};\n","import { AxiosRequestConfig } from 'axios';\n\nimport { CsrHttpClientAxios } from '../../../client';\n\nimport { Address } from './address-search.dto';\n\ninterface AddressSearchParam {\n searchKeyword?: string;\n config?: AxiosRequestConfig;\n setupFn?: (httpClient: CsrHttpClientAxios) => void;\n}\n\nexport const getAddressMethod = async ({ searchKeyword, config, setupFn }: AddressSearchParam) => {\n /**\n * 테스트 더미 데이터\n */\n const mockAddresses: Address[] = [\n { zipCode: '07345', address: '서울 영등포구 국제금융로 10', oldAddress: ' 서울특별시 영등포구 여의도동 60' },\n {\n zipCode: '07345',\n address: '서울 영등포구 국제금융로 8길 001223456789',\n oldAddress: ' 서울특별시 영등포구 여의도동 60'\n },\n { zipCode: '07345', address: '서울 영등포구 의사당대로 971100', oldAddress: ' 서울특별시 영등포구 여의도동 60' }\n ];\n\n return mockAddresses;\n\n // const sampleAPI = `https://jsonplaceholder.typicode.com/users/${searchKeyword}`;\n\n // const csrDomainHttpClient = new CsrHttpClientAxios();\n // if (setupFn) {\n // setupFn(csrDomainHttpClient);\n // }\n\n // const res = await csrDomainHttpClient.get<Address[]>(sampleAPI, config);\n\n // return res.data;\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { getAddressMethod } from './address-search.service';\n\nimport type { Address } from './address-search.dto';\nimport type { Options } from '../../method.types';\n\nexport const useSearchModalAddressQuery = (params: { searchKeyword: string }, options?: Options<Address[]>) => {\n return useQuery({\n enabled: true,\n retry: false,\n queryKey: [params.searchKeyword],\n queryFn: () => {\n return getAddressMethod({\n searchKeyword: params.searchKeyword,\n config: options?.config,\n setupFn: options?.setupFn\n });\n },\n ...options?.useQuery\n });\n};\n"]}
1
+ {"version":3,"sources":["../src/http-client/cookie/cookie-client.ts","../src/http-client/header/header.types.ts","../src/http-client/header/header-manager.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/auth/auth-client.ts","../src/http-methods/sample/sample.service.ts","../src/http-methods/search-modal/address-search/address-search.service.ts","../src/http-methods/search-modal/address-search/useSearchAddressQuery.ts"],"names":["config","error"],"mappings":";;;;;;;;AAGO,IAAM,YAAe,GAAA;AAAA,EAC1B,UAAU,IAAsB,EAAA;AAC9B,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAO,OAAA,EAAA;AAAA;AAET,IAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,IAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AAAA,GACtD;AAAA,EAEA,SACE,CAAA,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACE,EAAA;AACN,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAA;AAAA;AAGF,IAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAI,IAAA,WAAA;AACJ,MAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,QAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,QAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,OACtD,MAAA;AACL,QAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,MAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,IAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,IAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AAAA,GACpB;AAAA,EACA,YAAa,CAAA,IAAA,EAAc,OAA8C,GAAA,EAAU,EAAA;AACjF,IAAa,YAAA,CAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AAAA;AAEhE,CAAA;;;ACpDO,IAAM,iBAAoB,GAAA;AAAA,EAC/B,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,EAAK,GAAA,IAAA;;;ACbX,IAAM,gBAAN,MAAoB;AAAA,EAIzB,WAAA,CAAY,QAAoB,MAAoB,EAAA;AAHpD,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAGN,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA;AAChB;AAAA;AAAA;AAAA,EAKA,gBAAyB,GAAA;AACvB,IAAkB,iBAAA,CAAA,OAAA,CAAQ,CAAC,UAAe,KAAA;AACxC,MAAM,MAAA,eAAA,GAAkB,aAAa,UAAU,CAAA,CAAA;AAC/C,MAAM,MAAA,WAAA,GAAc,IAAK,CAAA,MAAA,CAAO,eAAe,CAAA;AAC/C,MAAA,IAAI,WAAa,EAAA;AACf,QAAK,IAAA,CAAA,MAAA,CAAO,iBAAiB,WAAW,CAAA;AAAA;AAC1C,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,YAAqB,GAAA;AACnB,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,EAAE,CAAA;AAC5B,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,MAAO,CAAA,eAAA,EAAiB,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAChD;AACF;AAAA;AAAA;AAAA,EAKA,aAAsB,GAAA;AACpB,IAAA,IAAA,CAAK,gBAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,YAAa,EAAA;AAAA;AAEtB,CAAA;;;ACjCA,IAAI,WAAc,GAAA,IAAA;AAElB,IAAM,aAA+B,EAAC;AAO/B,IAAM,kBAAN,MAAsB;AAAA,EAc3B,WAAA,CAAY,MAA6B,GAAA,EAAI,EAAA;AAb7C,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAKA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAkC,EAAC,CAAA;AAMnC;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AAEE,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAKd,IAAM,MAAA,MAAA,GAAkC,CAAC,GAAQ,KAAA;AAC/C,MAAO,OAAA,YAAA,CAAa,UAAU,GAAG,CAAA;AAAA,KACnC;AACA,IAAM,MAAA,MAAA,GAAkC,CAAC,GAAA,EAAK,KAAU,KAAA;AACtD,MAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,QAAO,MAAA,CAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,KAAA;AAAA;AACxB,KACF;AACA,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,MAAA,EAAQ,MAAM,CAAA;AAMrD,IAAK,IAAA,CAAA,GAAA,GAAM,MAAM,MAAO,CAAA;AAAA,MACtB,eAAiB,EAAA,IAAA;AAAA,MACjB,GAAG;AAAA,KACJ,CAAA;AAKD,IAAK,IAAA,CAAA,GAAA,CAAI,aAAa,OAAQ,CAAA,GAAA;AAAA,MAC5B,OAAOA,OAAW,KAAA;AAIhB,QAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA;AAClC,QAAM,MAAA,WAAA,GAAc,MAAM,UAAA,CAAW,KAAM,EAAA;AAC3C,QAAA,IAAI,WAAa,EAAA;AACf,UAAAA,OAAO,CAAA,OAAA,CAAQ,aAAgB,GAAA,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA;AAMtD,QAAA,IAAA,CAAK,cAAc,gBAAiB,EAAA;AAKpC,QAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACjD,QAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACtC,UAAAA,OAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAAA,SAC9B,CAAA;AAOD,QAAA,IAAI,CAAC,WAAa,EAAA;AAChB,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,UAAA,CAAW,KAAK,EAAE,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAAA,SAAQ,CAAA;AAAA,WAC5C,CAAA,CAAE,IAAK,CAAA,MAAMA,OAAM,CAAA;AAAA;AAGtB,QAAOA,OAAAA,OAAAA;AAAA,OACT;AAAA,MACA,CAAC,KAAU,KAAA;AACT,QAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA;AAC7B,KACF;AAKA,IAAK,IAAA,CAAA,GAAA,CAAI,aAAa,QAAS,CAAA,GAAA;AAAA,MAC7B,CAAC,QAA4B,KAAA;AAC3B,QAAI,IAAA,QAAA,CAAS,IAAK,CAAA,SAAA,KAAc,KAAO,EAAA;AAIrC,UAAO,OAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA;AAGhC,QAAO,OAAA,QAAA;AAAA,OACT;AAAA,MACA,OAAO,KAAsB,KAAA;AAC3B,QAAA,MAAM,kBAAkB,KAAM,CAAA,MAAA;AAK9B,QAAI,IAAA,KAAA,CAAM,QAAU,EAAA,MAAA,KAAW,GAAK,EAAA;AAClC,UAAc,WAAA,GAAA,KAAA;AACd,UAAM,MAAA,MAAA,GAAS,IAAI,UAAW,EAAA;AAC9B,UACG,MAAA,CAAA,YAAA,EACA,CAAA,IAAA,CAAK,MAAM;AAIV,YAAc,WAAA,GAAA,IAAA;AAKd,YAAO,OAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AAC5B,cAAM,MAAA,CAAA,GAAI,WAAW,KAAM,EAAA;AAC3B,cAAA,IAAI,CAAG,EAAA;AAML,gBAAA,IAAA,CAAK,IAAI,CAAE,CAAA,MAAM,EACd,IAAK,CAAA,CAAC,aAAa,CAAE,CAAA,OAAA,CAAQ,QAAQ,CAAC,EACtC,KAAM,CAAA,CAAC,QAAQ,CAAE,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACjC;AACF,WACD,CAAA,CACA,KAAM,CAAA,CAACC,MAAU,KAAA;AAKhB,YAAO,OAAA,OAAA,CAAQ,OAAOA,MAAK,CAAA;AAAA,WAC5B,CAAA;AAEH,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,IAAI,eAAiB,EAAA;AACnB,cAAA,UAAA,CAAW,KAAK,EAAE,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAQ,iBAAiB,CAAA;AAAA;AAC9D,WACD,CAAA;AAAA,SACI,MAAA;AACL,UAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA;AAC7B;AACF,KACF;AAAA;AACF,EAEA,WAAW,OAAiC,EAAA;AAC1C,IAAA,IAAA,CAAK,OAAU,GAAA;AAAA,MACb,GAAG,IAAK,CAAA,OAAA;AAAA,MACR,GAAG;AAAA,KACL;AAAA;AAEJ,CAAA;;;AC1KO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,KAAQ,GAAA;AAON,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAqC,GAAA;AACzC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA;AAKhB,MAAO,OAAA,EAAA;AAAA;AAKT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAgC,GAAA;AACpC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA;AAKhB,MAAA,OAAO,MAAM,MAAO,CAAA,YAAA,CAAa,IAAI,EAAI,EAAA,cAAA,EAAgB,EAAE,CAAA;AAAA,KACtD,MAAA;AAIL,MAAA,MAAM,UAAa,GAAA,IAAI,eAAgB,CAAA,EAAE,CAAA;AACzC,MAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,GAAA,CAAI,IAAI,4BAA4B,CAAA;AAEjE,MAAA,OAAO,KAAK,IAAK,CAAA,WAAA;AAAA;AACnB;AAEJ,CAAA;;;ACnDO,IAAM,gBAAgB,OAAO,EAAE,EAAI,EAAA,MAAA,EAAQ,SAA2B,KAAA;AAC3E,EAAM,MAAA,OAAA,GAAU,8CAA8C,EAAE,CAAA,CAAA;AAEhE,EAAM,MAAA,UAAA,GAAa,IAAI,eAAA,CAAgB,MAAM,CAAA;AAE7C,EAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,GAAA,CAAI,IAAkB,OAAO,CAAA;AAE1D,EAAA,OAAO,GAAI,CAAA,IAAA;AACb;;;ACPO,IAAM,gBAAmB,GAAA,OAAO,EAAE,aAAA,EAAe,QAAiC,KAAA;AAIvF,EAAA,MAAM,aAA2B,GAAA;AAAA,IAC/B,EAAE,OAAS,EAAA,OAAA,EAAS,OAAS,EAAA,yEAAA,EAAoB,YAAY,sFAAsB,EAAA;AAAA,IACnF;AAAA,MACE,OAAS,EAAA,OAAA;AAAA,MACT,OAAS,EAAA,2FAAA;AAAA,MACT,UAAY,EAAA;AAAA,KACd;AAAA,IACA,EAAE,OAAS,EAAA,OAAA,EAAS,OAAS,EAAA,6EAAA,EAAwB,YAAY,sFAAsB;AAAA,GACzF;AAEA,EAAO,OAAA,aAAA;AAYT;AC7BO,IAAM,0BAA6B,GAAA,CACxC,MACA,EAAA,OAAA,EACA,MACG,KAAA;AACH,EAAA,OAAO,QAAS,CAAA;AAAA,IACd,OAAS,EAAA,IAAA;AAAA,IACT,KAAO,EAAA,KAAA;AAAA,IACP,QAAA,EAAU,CAAC,MAAA,CAAO,aAAa,CAAA;AAAA,IAC/B,SAAS,MAAM;AACb,MAAA,OAAO,gBAAiB,CAAA;AAAA,QACtB,eAAe,MAAO,CAAA,aAAA;AAAA,QACtB;AAAA,OACD,CAAA;AAAA,KACH;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH","file":"method.js","sourcesContent":["/**\n * 클라이언트용 쿠키 함수\n */\nexport const cookieClient = {\n getCookie(name: string): string {\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n },\n\n setCookie(\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n ): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n },\n deleteCookie(name: string, options: { path?: string; domain?: string } = {}): void {\n cookieClient.setCookie(name, '', { ...options, expires: -1 });\n }\n};\n","/**\n * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19\n */\nexport const customHeaderNames = [\n 'Accept-Language',\n 'DeviceId',\n 'LoginType',\n 'PlatformName',\n 'PlatformVersion',\n 'AppVersion',\n 'DeviceModel',\n 'FormFactor',\n 'LoginChannel'\n];\n\nexport const AT = 'AT';\nexport type GetterSync = (keyName: string) => string;\nexport type SetterSync = (keyName: string, value: string) => void;\n\nexport type GetterAsync = (keyName: string) => Promise<string> | string;\nexport type SetterAsync = (keyName: string, value: string) => Promise<void> | void;\n","import { AT, customHeaderNames, GetterSync, SetterSync } from './header.types';\n\nexport class HeaderManager {\n private getter: GetterSync;\n private setter: SetterSync;\n\n constructor(getter: GetterSync, setter: SetterSync) {\n this.getter = getter;\n this.setter = setter;\n }\n\n /**\n * 커스텀 헤더를 동기적으로 설정합니다.\n */\n setCustomHeaders(): void {\n customHeaderNames.forEach((headerName) => {\n const customHeaderKey = `X-Channel-${headerName}`;\n const headerValue = this.getter(customHeaderKey);\n if (headerValue) {\n this.setter(customHeaderKey, headerValue);\n }\n });\n }\n\n /**\n * 인증 토큰을 동기적으로 설정합니다.\n */\n setAuthToken(): void {\n const token = this.getter(AT);\n if (token) {\n this.setter('Authorization', `Bearer ${token}`);\n }\n }\n\n /**\n * 모든 헤더를 동기적으로 설정합니다.\n */\n setAllHeaders(): void {\n this.setCustomHeaders();\n this.setAuthToken();\n }\n}\n","import axios from 'axios';\n\nimport { AuthClient } from '../auth/auth-client';\nimport { cookieClient } from '../cookie/cookie-client';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType } from './types';\nimport type { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\nlet isRefreshed = true;\n\nconst axiosQueue: AxiosQueueType[] = [];\n\n/**\n * 전자청약\n * CSR용 http-client 입니다.\n * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.\n */\nexport class HttpClientAxios {\n config: AxiosRequestConfig;\n headerManager: HeaderManager;\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n headers: Record<string, string> = {};\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n api: AxiosInstance;\n constructor(config: AxiosRequestConfig = {}) {\n this.config = config;\n\n /**\n * 헤더매니저 셋팅\n */\n const getter: HeaderManager['getter'] = (key) => {\n return cookieClient.getCookie(key);\n };\n const setter: HeaderManager['setter'] = (key, value) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n };\n this.headerManager = new HeaderManager(getter, setter);\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n */\n this.api = axios.create({\n withCredentials: true,\n ...config\n });\n\n /**\n * 인터셉터 요청 처리\n */\n this.api.interceptors.request.use(\n async (config) => {\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const accessToken = await authClient.getAT();\n if (accessToken) {\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n\n /**\n * 커스텀헤더 주입\n */\n this.headerManager.setCustomHeaders();\n /**\n *\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n config.headers.set(key, value);\n });\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n * 401에러 Queue처리 Request interceptor 등록\n */\n if (!isRefreshed) {\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n /**\n * 인터셉터 응답 처리\n */\n this.api.interceptors.response.use(\n (response: AxiosResponse) => {\n if (response.data.isSuccess === false) {\n /**\n * 200 응답이라도 , isSuccess === false인 경우 에러로 reject\n */\n return Promise.reject(response);\n }\n\n return response;\n },\n async (error: AxiosError) => {\n const originalRequest = error.config;\n\n /**\n * 401에러 Queue처리\n */\n if (error.response?.status === 401) {\n isRefreshed = false;\n const client = new AuthClient();\n client\n .refreshToken()\n .then(() => {\n /**\n * 토큰 갱신 성공, 플래그를 true로 설정\n */\n isRefreshed = true;\n\n /**\n * 큐에 쌓여있던 모든 요청 재시도\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n /**\n * api 인스턴스를 통해 요청을 재시도합니다. 따라서 재요청들은 다시 인터셉터를 타게 됩니다.\n * 신규토큰을 주입받고 정상처리\n * @todo 재시도후 reject시에는 로그인페이지로 보내는 브릿지 함수를 호출하도록 처리가 필요해보임.\n */\n this.api(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n })\n .catch((error) => {\n /**\n * 토큰 재발행중 에러 발생한 경우 처리\n * @todo 로그인페이지 이동(?)\n */\n return Promise.reject(error);\n });\n\n return new Promise((resolve, reject) => {\n if (originalRequest) {\n axiosQueue.push({ resolve, reject, config: originalRequest });\n }\n });\n } else {\n return Promise.reject(error);\n }\n }\n );\n }\n\n setHeaders(headers: Record<string, string>) {\n this.headers = {\n ...this.headers,\n ...headers\n };\n }\n}\n","// import { bridge } from '@/app/responsive/bridge/tmp-bridge';\n// import { CsrHttpClientAxios } from '../axios/csr-http-client-axios';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\n\nexport class AuthClient {\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n const { userAgent } = navigator;\n\n /**\n * @todo utils package에서 추후 임포트\n */\n // return isUserAgentMobile(userAgent);\n return true;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // return await bridge.callToNative('', '', 'getAT', {});\n return '';\n } else {\n /**\n * pc인 경우는, middleware.ts 에서 요청헤더에 주입\n */\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n * @returns Promise<string> 액세스토큰\n */\n async refreshToken(): Promise<string> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // @ts-ignore\n return await bridge.callToNative('', '', 'refreshToken', {});\n } else {\n /**\n * @todo : 내부api호출\n */\n const httpclient = new HttpClientAxios({});\n const res = await httpclient.api.get('/internal/api/auth/refresh');\n\n return res?.data.accessToken;\n }\n }\n}\n//\n","import { HttpClientAxios } from '../../client';\n\nimport type { TestResponse } from './sample.dto';\nimport type { AxiosRequestConfig } from 'axios';\n\ninterface TestRequest {\n id?: number;\n config?: AxiosRequestConfig;\n setupFn?: (httpClient: HttpClientAxios) => void;\n}\nexport const getTestMethod = async ({ id, config, setupFn }: TestRequest) => {\n const testAPI = `https://jsonplaceholder.typicode.com/users/${id}`;\n\n const httpClient = new HttpClientAxios(config);\n\n const res = await httpClient.api.get<TestResponse>(testAPI);\n\n return res.data;\n};\n","import { AxiosRequestConfig } from 'axios';\n\nimport { HttpClientAxios } from '../../../client';\n\nimport { Address } from './address-search.dto';\n\ninterface AddressSearchParam {\n searchKeyword?: string;\n config?: AxiosRequestConfig;\n}\n\nexport const getAddressMethod = async ({ searchKeyword, config }: AddressSearchParam) => {\n /**\n * 테스트 더미 데이터\n */\n const mockAddresses: Address[] = [\n { zipCode: '07345', address: '서울 영등포구 국제금융로 10', oldAddress: ' 서울특별시 영등포구 여의도동 60' },\n {\n zipCode: '07345',\n address: '서울 영등포구 국제금융로 8길 001223456789',\n oldAddress: ' 서울특별시 영등포구 여의도동 60'\n },\n { zipCode: '07345', address: '서울 영등포구 의사당대로 971100', oldAddress: ' 서울특별시 영등포구 여의도동 60' }\n ];\n\n return mockAddresses;\n\n // const sampleAPI = `https://jsonplaceholder.typicode.com/users/${searchKeyword}`;\n\n // const csrDomainHttpClient = new CsrHttpClientAxios();\n // if (setupFn) {\n // setupFn(csrDomainHttpClient);\n // }\n\n // const res = await csrDomainHttpClient.get<Address[]>(sampleAPI, config);\n\n // return res.data;\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { getAddressMethod } from './address-search.service';\n\nimport type { Address } from './address-search.dto';\nimport type { CustomQueryOptions } from '../../method.types';\nimport type { AxiosRequestConfig } from 'axios';\n\nexport const useSearchModalAddressQuery = (\n params: { searchKeyword: string },\n options?: CustomQueryOptions<Address[]>,\n config?: AxiosRequestConfig\n) => {\n return useQuery({\n enabled: true,\n retry: false,\n queryKey: [params.searchKeyword],\n queryFn: () => {\n return getAddressMethod({\n searchKeyword: params.searchKeyword,\n config\n });\n },\n ...options\n });\n};\n"]}