@01.software/sdk 0.0.1-251008.100408

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import {stringify}from'qs-esm';import {isServer,QueryClientProvider,useQuery,useInfiniteQuery,QueryClient,defaultShouldDehydrateQuery}from'@tanstack/react-query';import {z}from'zod';var u=class n extends Error{code;status;details;constructor(e,t,r,i){super(t),this.name="SDKError",this.code=e,this.status=r,this.details=i,Error.captureStackTrace&&Error.captureStackTrace(this,n);}toJSON(){return {name:this.name,code:this.code,message:this.message,status:this.status,details:this.details}}},f=class extends u{constructor(e,t,r){super("NETWORK_ERROR",e,t,r),this.name="NetworkError";}},m=class extends u{constructor(e,t){super("VALIDATION_ERROR",e,400,t),this.name="ValidationError";}},g=class extends u{constructor(e,t,r){super("API_ERROR",e,t,r),this.name="ApiError";}},C=class extends u{constructor(e,t){super("CONFIG_ERROR",e,void 0,t),this.name="ConfigError";}},d=class extends u{constructor(e="\uC694\uCCAD\uC774 \uC2DC\uAC04 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",t){super("TIMEOUT_ERROR",e,408,t),this.name="TimeoutError";}},_=n=>n instanceof u,k=n=>n instanceof f,B=n=>n instanceof m,U=n=>n instanceof g,M=n=>n instanceof C,j=n=>n instanceof d,T=(n,e,t)=>new f(n,e,t),Q=(n,e)=>new m(n,e),P=(n,e,t)=>new g(n,e,t),V=(n,e)=>new C(n,e),L=(n,e)=>new d(n,e);var q=process.env.NEXT_PUBLIC_API_URL||"https://01.software",p=async(n,e)=>{let{clientKey:t,secretKey:r,timeout:i=3e4,...o}=e||{},s=new Headers(o.headers);t&&s.set("X-Client-Key",t),r&&s.set("X-Secret-Key",r),!s.has("Content-Type")&&o.body&&s.set("Content-Type","application/json");let c=new AbortController,l=setTimeout(()=>c.abort(),i);try{let a=await fetch(`${q}${n}`,{...o,headers:s,signal:c.signal});if(clearTimeout(l),!a.ok)throw T(`HTTP ${a.status}: ${a.statusText}`,a.status,{url:n,method:o.method||"GET"});return a}catch(a){throw clearTimeout(l),a instanceof Error&&a.name==="AbortError"?new d(`\uC694\uCCAD\uC774 ${i}ms \uD6C4 \uD0C0\uC784\uC544\uC6C3\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`,{url:n,timeout:i}):a instanceof TypeError?T("\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC778\uD130\uB137 \uC5F0\uACB0\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.",void 0,{url:n,originalError:a.message}):a instanceof f||a instanceof d?a:T(a instanceof Error?a.message:"\uC54C \uC218 \uC5C6\uB294 \uB124\uD2B8\uC6CC\uD06C \uC5D0\uB7EC\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",void 0,{url:n,originalError:a})}};var w=class{clientKey;secretKey;defaultOptions;constructor(e,t){if(!e)throw Q("clientKey\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");this.clientKey=e,this.secretKey=t,this.defaultOptions={clientKey:e,secretKey:t};}async get(e,t){let r=this.buildUrl(e,t),i=await p(r,{...this.defaultOptions,method:"GET"});return this.parseResponse(i)}async post(e,t,r){let i=await p(e,{...this.defaultOptions,...r,method:"POST",body:t?JSON.stringify(t):void 0});return this.parseResponse(i)}async put(e,t,r){let i=await p(e,{...this.defaultOptions,...r,method:"PUT",body:t?JSON.stringify(t):void 0});return this.parseResponse(i)}async patch(e,t,r){let i=await p(e,{...this.defaultOptions,...r,method:"PATCH",body:t?JSON.stringify(t):void 0});return this.parseResponse(i)}async delete(e,t){let r=await p(e,{...this.defaultOptions,...t,method:"DELETE"});return this.parseResponse(r)}buildUrl(e,t){if(!t)return e;let r=stringify(t,{addQueryPrefix:true});return r?`${e}${r}`:e}async parseResponse(e){let t=e.headers.get("content-type");try{if(t&&t.includes("application/json")){let i=await e.json();if(i.docs!==void 0){let o={page:i.page||1,limit:i.limit||20,totalDocs:i.totalDocs||0,totalPages:i.totalPages||0,hasNextPage:i.hasNextPage||!1,hasPrevPage:i.hasPrevPage||!1};return {data:i.docs,success:!0,pagination:o}}return {data:i,success:!0}}return {data:await e.text(),success:!0}}catch(r){throw P("\uC751\uB2F5 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.",e.status,{contentType:t,error:r instanceof Error?r.message:r})}}handleError(e){throw e instanceof g||e instanceof m?e:P(e.message||"Unknown API error",e.status||500,e)}};var h=class extends w{from(e){return new E(e,this)}async getCollection(e,t){try{return await this.get(`/api/${e}`,t)}catch(r){return this.handleError(r)}}async getDocument(e,t,r){try{return await this.get(`/api/${e}/${t}`,r)}catch(i){return this.handleError(i)}}async createDocument(e,t){try{return await this.post(`/api/${e}`,t)}catch(r){return this.handleError(r)}}async updateDocument(e,t,r){try{return await this.patch(`/api/${e}/${t}`,r)}catch(i){return this.handleError(i)}}async deleteDocument(e,t){try{return await this.delete(`/api/${e}/${t}`)}catch(r){return this.handleError(r)}}},E=class{collection;api;queryOptions={};constructor(e,t){this.collection=e,this.api=t;}async find(e){return this.api.getCollection(this.collection,e)}async findById(e){return this.api.getDocument(this.collection,e,this.queryOptions)}async create(e){return this.api.createDocument(this.collection,e)}async update(e,t){return this.api.updateDocument(this.collection,e,t)}async delete(e){return this.api.deleteDocument(this.collection,e)}};function K(){return new QueryClient({defaultOptions:{queries:{staleTime:Number.POSITIVE_INFINITY,refetchOnWindowFocus:false},dehydrate:{shouldDehydrateQuery:n=>defaultShouldDehydrateQuery(n)||n.state.status==="pending",shouldRedactErrors:n=>false}}})}var R;function x(){return isServer?K():(R||(R=K()),R)}function se({children:n}){let e=x();return React.createElement(QueryClientProvider,{client:e},n)}var A=class{queryClient;collectionsApi;constructor(e,t){this.queryClient=e,this.collectionsApi=new h(t?.brandKey||"",t?.brandSecret||"");}useCollection(e,t){let r=t;return useQuery({queryKey:[e,"list",r],queryFn:async()=>(await this.collectionsApi.getCollection(e,r)).data,enabled:r?.enabled!==false,...r})}useCollectionSingle(e,t){let r=t;return useQuery({queryKey:[e,"detail",r],queryFn:async()=>{let o=await this.collectionsApi.getCollection(e,r);return o.data.length===0?null:o.data[0]},enabled:r?.enabled!==false,...r})}useCollectionInfinite(e,t){let r=t,i=[e,"list","infinite",r],o=r?.limit||20;return useInfiniteQuery({queryKey:i,queryFn:async({pageParam:s=1})=>{let c={...r,page:s,limit:o};return (await this.collectionsApi.getCollection(e,c)).data},initialPageParam:1,getNextPageParam:(s,c,l)=>!Array.isArray(s)||s.length<o?null:l+1,enabled:r?.enabled!==false,select:s=>s.pages.flatMap(c=>c)})}useById(e,t,r){return useQuery({queryKey:[e,"detail",t],queryFn:async()=>(await this.collectionsApi.getDocument(e,t,r)).data,enabled:r?.enabled!==false&&!!t,...r})}useSearch(e,t,r){let i=[e,"search",t,r],o=r?.limit||20;return useInfiniteQuery({queryKey:i,queryFn:async({pageParam:s=1})=>{let l={...r,where:{or:[{title:{contains:t}},{description:{contains:t}}]},limit:o,page:s,sort:r?.sort||"-createdAt"};return (await this.collectionsApi.getCollection(e,l)).data},initialPageParam:1,getNextPageParam:(s,c,l)=>!Array.isArray(s)||s.length<o?null:l+1,enabled:r?.enabled!==false&&!!t&&t.length>0,select:s=>({pages:s.pages,pageParams:s.pageParams,items:s.pages.flatMap(c=>c)})})}async prefetchQuery(e,t){let r=[e,"list",t];return this.queryClient.prefetchQuery({queryKey:r,queryFn:async()=>(await this.collectionsApi.getCollection(e,t)).data})}async prefetchCollectionSingle(e,t){let r=[e,"detail",t];return this.queryClient.prefetchQuery({queryKey:r,queryFn:async()=>{let i=await this.collectionsApi.getCollection(e,t);return i.data.length===0?null:i.data[0]}})}async prefetchInfiniteQuery(e,t){let r=[e,"list","infinite",t],i=t?.limit||20;return this.queryClient.prefetchInfiniteQuery({queryKey:r,queryFn:async({pageParam:o=1})=>{let s={...t,page:o,limit:i};return (await this.collectionsApi.getCollection(e,s)).data},initialPageParam:1,getNextPageParam:(o,s,c)=>!Array.isArray(o)||o.length<i?null:c+1,pages:2})}invalidateQueries(e,t){let r=t?[e,t]:[e];return this.queryClient.invalidateQueries({queryKey:r})}getQueryData(e,t,...r){let i=[e,t,...r.filter(o=>o!==void 0)];return this.queryClient.getQueryData(i)}setQueryData(e,t,r,...i){let o=[e,t,...i.filter(s=>s!==void 0)];return this.queryClient.setQueryData(o,r)}};var b=class{query;collections;queryClient;state;config;fetch;constructor(e){if(!e.clientKey)throw new Error("clientKey is required.");this.config={environment:"production",debug:false,...e};let t={version:"1.0.0",environment:this.config.environment,timestamp:Date.now(),userAgent:typeof window<"u"?window.navigator?.userAgent:"Node.js"};this.state={metadata:t,isReady:false},this.fetch=p,this.queryClient=x(),this.query=new A(this.queryClient,{brandKey:this.config.clientKey}),this.collections=new h(this.config.clientKey),this.state.isReady=true;}async getSettings(){let{data:e}=await this.from("brand-settings").find({where:{"brand.clientKey":{equals:this.config.clientKey}}});return e.length>0?e[0]:null}from(e){return this.collections.from(e)}getState(){return {...this.state}}getConfig(){return this.config}getClientInfo(){return {clientKey:this.config.clientKey,version:this.state.metadata.version,environment:this.config.environment}}destroy(){this.state.isReady=false;}},$=n=>new b(n);var Ae=()=>{let n=new Date().getFullYear().toString().slice(-2),e=new Date().getMonth().toString().padStart(2,"0"),t=new Date().getDate().toString().padStart(2,"0"),r=Math.floor(Math.random()*1e6).toString().padStart(6,"0");return `${n}${e}${t}${r}`};var Pe=n=>typeof n=="number"?null:n;var Oe=z.object({name:z.string().min(1),email:z.string().email(),shippingPhone:z.string().min(1),shippingPostalCode:z.string().min(1),shippingAddress:z.string().min(1),shippingAddressDetail:z.string().min(1),shippingMessage:z.string().min(1).optional()});
2
+ export{g as ApiError,C as ConfigError,f as NetworkError,se as QueryProvider,u as SDKError,d as TimeoutError,A as UnifiedQueryClient,m as ValidationError,P as createApiError,$ as createBrowserClient,V as createConfigError,T as createNetworkError,L as createTimeoutError,Q as createValidationError,Ae as generateOrderNumber,x as getQueryClient,U as isApiError,M as isConfigError,k as isNetworkError,_ as isSDKError,j as isTimeoutError,B as isValidationError,Pe as objectFor,Oe as orderSchema};//# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/internal/utils/index.ts","../src/collection/base.ts","../src/collection/index.ts","../src/query/get-query-client.ts","../src/queryProvider.tsx","../src/query/index.ts","../src/client/index.ts","../src/utils/order/generateOrderNumber.ts","../src/utils/types.ts","../src/zod/orderSchema.ts"],"names":["SDKError","_SDKError","code","message","status","details","NetworkError","ValidationError","ApiError","ConfigError","TimeoutError","isSDKError","error","isNetworkError","isValidationError","isApiError","isConfigError","isTimeoutError","createNetworkError","createValidationError","createApiError","createConfigError","createTimeoutError","API_URL","_fetch","url","options","clientKey","secretKey","timeout","requestInit","headers","controller","timeoutId","response","BaseApiClient","endpoint","data","queryString","stringify","contentType","jsonData","pagination","CollectionsApi","collection","CollectionQueryBuilder","id","api","makeQueryClient","QueryClient","query","defaultShouldDehydrateQuery","_","browserQueryClient","getQueryClient","isServer","QueryProvider","children","queryClient","QueryClientProvider","UnifiedQueryClient","queryOptions","useQuery","queryKey","pageSize","useInfiniteQuery","pageParam","queryOpts","lastPage","lastPageParams","page","searchQuery","searchOptions","operation","params","p","BrowserClient","metadata","createBrowserClient","generateOrderNumber","year","month","day","random","objectFor","orderSchema","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SDK 에러 처리 시스템\n *\n * 다양한 에러 상황에 대한 구조화된 에러 클래스들을 제공합니다.\n */\n\n/**\n * SDK의 기본 에러 클래스\n * 모든 SDK 관련 에러의 베이스 클래스입니다.\n */\nexport class SDKError extends Error {\n public readonly code: string\n public readonly status?: number\n public readonly details?: any\n\n constructor(code: string, message: string, status?: number, details?: any) {\n super(message)\n this.name = 'SDKError'\n this.code = code\n this.status = status\n this.details = details\n\n // Error 스택 트레이스 보정\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SDKError)\n }\n }\n\n /**\n * 에러를 JSON 형태로 직렬화합니다.\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n }\n }\n}\n\n/**\n * 네트워크 관련 에러\n * API 호출 실패, 연결 문제 등에 사용됩니다.\n */\nexport class NetworkError extends SDKError {\n constructor(message: string, status?: number, details?: any) {\n super('NETWORK_ERROR', message, status, details)\n this.name = 'NetworkError'\n }\n}\n\n/**\n * 데이터 검증 에러\n * 잘못된 파라미터나 스키마 검증 실패 시 사용됩니다.\n */\nexport class ValidationError extends SDKError {\n constructor(message: string, details?: any) {\n super('VALIDATION_ERROR', message, 400, details)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * API 응답 에러\n * 서버에서 반환된 에러 응답을 처리합니다.\n */\nexport class ApiError extends SDKError {\n constructor(message: string, status: number, details?: any) {\n super('API_ERROR', message, status, details)\n this.name = 'ApiError'\n }\n}\n\n/**\n * 설정 에러\n * 클라이언트 설정이 잘못되었을 때 사용됩니다.\n */\nexport class ConfigError extends SDKError {\n constructor(message: string, details?: any) {\n super('CONFIG_ERROR', message, undefined, details)\n this.name = 'ConfigError'\n }\n}\n\n/**\n * 타임아웃 에러\n * 요청이 시간 초과되었을 때 사용됩니다.\n */\nexport class TimeoutError extends SDKError {\n constructor(message: string = '요청이 시간 초과되었습니다.', details?: any) {\n super('TIMEOUT_ERROR', message, 408, details)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * 에러 타입 가드 함수들\n */\nexport const isSDKError = (error: any): error is SDKError => {\n return error instanceof SDKError\n}\n\nexport const isNetworkError = (error: any): error is NetworkError => {\n return error instanceof NetworkError\n}\n\nexport const isValidationError = (error: any): error is ValidationError => {\n return error instanceof ValidationError\n}\n\nexport const isApiError = (error: any): error is ApiError => {\n return error instanceof ApiError\n}\n\nexport const isConfigError = (error: any): error is ConfigError => {\n return error instanceof ConfigError\n}\n\nexport const isTimeoutError = (error: any): error is TimeoutError => {\n return error instanceof TimeoutError\n}\n\n/**\n * 에러 생성 헬퍼 함수들\n */\nexport const createNetworkError = (message: string, status?: number, details?: any) => {\n return new NetworkError(message, status, details)\n}\n\nexport const createValidationError = (message: string, details?: any) => {\n return new ValidationError(message, details)\n}\n\nexport const createApiError = (message: string, status: number, details?: any) => {\n return new ApiError(message, status, details)\n}\n\nexport const createConfigError = (message: string, details?: any) => {\n return new ConfigError(message, details)\n}\n\nexport const createTimeoutError = (message?: string, details?: any) => {\n return new TimeoutError(message, details)\n}\n","import { createNetworkError, TimeoutError, NetworkError } from '../../errors'\n\nconst API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://01.software'\n\n/**\n * Fetch 요청 옵션 인터페이스\n *\n * @interface FetchOptions\n * @extends RequestInit\n */\nexport interface FetchOptions extends RequestInit {\n /** 클라이언트 키 (브랜드 식별용) */\n clientKey?: string\n /** 시크릿 키 (서버 사이드 인증용) */\n secretKey?: string\n /** 요청 타임아웃 (밀리초, 기본값: 30초) */\n timeout?: number\n}\n\n/**\n * 향상된 fetch 함수\n *\n * 클라이언트 키, 시크릿 키 헤더 자동 설정 및 에러 처리를 제공합니다.\n *\n * @param url - 요청할 URL (상대 경로)\n * @param options - Fetch 옵션\n * @returns Promise<Response>\n *\n * @throws {NetworkError} 네트워크 연결 실패 시\n * @throws {TimeoutError} 요청 타임아웃 시\n *\n * @example\n * ```typescript\n * const response = await _fetch('/api/products', {\n * clientKey: 'your-client-key',\n * method: 'GET'\n * })\n * ```\n */\nexport const _fetch = async (url: string, options?: FetchOptions): Promise<Response> => {\n const { clientKey, secretKey, timeout = 30000, ...requestInit } = options || {}\n\n // 헤더 설정\n const headers = new Headers(requestInit.headers)\n\n if (clientKey) {\n headers.set('X-Client-Key', clientKey)\n }\n\n if (secretKey) {\n headers.set('X-Secret-Key', secretKey)\n }\n\n if (!headers.has('Content-Type') && requestInit.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n // AbortController를 사용한 타임아웃 처리\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(`${API_URL}${url}`, {\n ...requestInit,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // HTTP 에러 상태 체크\n if (!response.ok) {\n throw createNetworkError(`HTTP ${response.status}: ${response.statusText}`, response.status, {\n url,\n method: requestInit.method || 'GET',\n })\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n // AbortError (타임아웃)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(`요청이 ${timeout}ms 후 타임아웃되었습니다.`, { url, timeout })\n }\n\n // 네트워크 에러\n if (error instanceof TypeError) {\n throw createNetworkError(\n '네트워크 연결에 실패했습니다. 인터넷 연결을 확인해주세요.',\n undefined,\n { url, originalError: error.message },\n )\n }\n\n // 이미 SDK 에러인 경우 그대로 throw\n if (error instanceof NetworkError || error instanceof TimeoutError) {\n throw error\n }\n\n // 기타 에러\n throw createNetworkError(\n error instanceof Error ? error.message : '알 수 없는 네트워크 에러가 발생했습니다.',\n undefined,\n { url, originalError: error },\n )\n }\n}\n","/**\n * API 클라이언트 기본 클래스\n *\n * 모든 API 클라이언트의 베이스 클래스로, 공통적인 HTTP 메서드들과\n * 에러 처리, 응답 파싱 기능을 제공합니다.\n */\n\nimport { _fetch, FetchOptions } from '../internal/utils'\nimport { ApiResponse, PaginationMeta, QueryOptions } from '../client/types'\nimport { ApiError, ValidationError, createApiError, createValidationError } from '../errors'\nimport { stringify } from 'qs-esm'\n\n/**\n * API 클라이언트 기본 클래스\n *\n * @class BaseApiClient\n */\nexport class BaseApiClient {\n protected clientKey: string\n protected secretKey?: string\n protected defaultOptions: FetchOptions\n\n /**\n * BaseApiClient 생성자\n *\n * @param clientKey - 클라이언트 키 (필수)\n * @param secretKey - 시크릿 키 (선택, 서버 사이드에서만 사용)\n *\n * @example\n * ```typescript\n * const client = new BaseApiClient('your-client-key', 'your-secret-key')\n * ```\n */\n constructor(clientKey: string, secretKey?: string) {\n if (!clientKey) {\n throw createValidationError('clientKey는 필수입니다.')\n }\n\n this.clientKey = clientKey\n this.secretKey = secretKey\n this.defaultOptions = {\n clientKey: clientKey,\n secretKey: secretKey,\n }\n }\n\n /**\n * GET 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param options - 쿼리 옵션 (페이지네이션, 필터링 등)\n * @returns Promise<ApiResponse<T>>\n *\n * @example\n * ```typescript\n * const response = await client.get<Product[]>('/api/products', {\n * page: 1,\n * limit: 10,\n * where: { status: 'published' }\n * })\n * ```\n */\n protected async get<T = any>(endpoint: string, options?: QueryOptions): Promise<ApiResponse<T>> {\n const url = this.buildUrl(endpoint, options)\n\n const response = await _fetch(url, {\n ...this.defaultOptions,\n method: 'GET',\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * POST 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n *\n * @example\n * ```typescript\n * const response = await client.post<Product>('/api/products', {\n * title: '새 제품',\n * price: 10000\n * })\n * ```\n */\n protected async post<T = any>(\n endpoint: string,\n data?: any,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'POST',\n body: data ? JSON.stringify(data) : undefined,\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * PUT 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n */\n protected async put<T = any>(\n endpoint: string,\n data?: any,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'PUT',\n body: data ? JSON.stringify(data) : undefined,\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * PATCH 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n */\n protected async patch<T = any>(\n endpoint: string,\n data?: any,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'PATCH',\n body: data ? JSON.stringify(data) : undefined,\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * DELETE 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n */\n protected async delete<T = any>(\n endpoint: string,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'DELETE',\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * URL 빌드 (쿼리 파라미터 포함)\n *\n * @param endpoint - 기본 엔드포인트\n * @param options - 쿼리 옵션\n * @returns 완성된 URL\n *\n * @private\n */\n protected buildUrl(endpoint: string, options?: QueryOptions): string {\n if (!options) return endpoint\n\n const queryString = stringify(options, { addQueryPrefix: true })\n\n return queryString ? `${endpoint}${queryString}` : endpoint\n }\n\n /**\n * HTTP 응답을 파싱하여 ApiResponse 형태로 변환합니다.\n *\n * Payload CMS의 응답 형식을 자동으로 감지하고 처리합니다.\n *\n * @template T - 응답 데이터 타입\n * @param response - HTTP Response 객체\n * @returns Promise<ApiResponse<T>>\n *\n * @throws {ApiError} JSON 파싱 실패 시\n *\n * @private\n */\n protected async parseResponse<T>(response: Response): Promise<ApiResponse<T>> {\n const contentType = response.headers.get('content-type')\n\n try {\n if (contentType && contentType.includes('application/json')) {\n const jsonData = await response.json()\n\n // Payload CMS 응답 형식 처리 (컬렉션 목록)\n if (jsonData.docs !== undefined) {\n const pagination: PaginationMeta = {\n page: jsonData.page || 1,\n limit: jsonData.limit || 20,\n totalDocs: jsonData.totalDocs || 0,\n totalPages: jsonData.totalPages || 0,\n hasNextPage: jsonData.hasNextPage || false,\n hasPrevPage: jsonData.hasPrevPage || false,\n }\n\n return {\n data: jsonData.docs,\n success: true,\n pagination,\n }\n }\n\n // 단일 문서 응답\n return {\n data: jsonData,\n success: true,\n }\n }\n\n // 텍스트 응답\n const textData = await response.text()\n return {\n data: textData as T,\n success: true,\n }\n } catch (error) {\n throw createApiError('응답 파싱에 실패했습니다.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n /**\n * 에러를 SDK 표준 에러 형태로 변환합니다.\n *\n * @param error - 원본 에러\n * @throws {ApiError} 변환된 에러\n *\n * @deprecated 이 메서드는 더 이상 사용되지 않습니다.\n * 에러는 _fetch 함수에서 자동으로 처리됩니다.\n *\n * @private\n */\n protected handleError(error: any): never {\n // 이미 SDK 에러인 경우 그대로 throw\n if (error instanceof ApiError || error instanceof ValidationError) {\n throw error\n }\n\n // 기타 에러를 ApiError로 변환\n throw createApiError(error.message || 'Unknown API error', error.status || 500, error)\n }\n}\n","/**\n * 범용 컬렉션 API 클라이언트\n * Supabase 스타일의 from() 메서드를 구현\n */\n\nimport { BaseApiClient } from './base'\nimport { Config } from '../types'\nimport { QueryOptions, ApiResponse, Collection } from '../client/types'\n\nexport class CollectionsApi extends BaseApiClient {\n /**\n * Supabase 스타일의 컬렉션 접근\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return new CollectionQueryBuilder<T>(collection, this)\n }\n\n /**\n * 내부 API 호출 메서드들\n */\n async getCollection<T extends Collection>(\n collection: T,\n options?: QueryOptions,\n ): Promise<ApiResponse<Config['collections'][T][]>> {\n try {\n return await this.get<Config['collections'][T][]>(`/api/${collection}`, options)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async getDocument<T extends Collection>(\n collection: T,\n id: number | string,\n options?: QueryOptions,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n try {\n return await this.get<Config['collections'][T]>(`/api/${collection}/${id}`, options)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async createDocument<T extends Collection>(\n collection: T,\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n try {\n return await this.post<Config['collections'][T]>(`/api/${collection}`, data)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async updateDocument<T extends Collection>(\n collection: T,\n id: number | string,\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n try {\n return await this.patch<Config['collections'][T]>(`/api/${collection}/${id}`, data)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async deleteDocument<T extends Collection>(\n collection: T,\n id: number | string,\n ): Promise<ApiResponse<void>> {\n try {\n return await this.delete<void>(`/api/${collection}/${id}`)\n } catch (error) {\n return this.handleError(error)\n }\n }\n}\n\nexport class CollectionQueryBuilder<T extends Collection> {\n private collection: T\n private api: CollectionsApi\n private queryOptions: QueryOptions = {}\n\n constructor(collection: T, api: CollectionsApi) {\n this.collection = collection\n this.api = api\n }\n\n async find(options?: QueryOptions): Promise<ApiResponse<Config['collections'][T][]>> {\n return this.api.getCollection(this.collection, options)\n }\n\n /**\n * 특정 ID로 문서 조회\n */\n async findById(id: number | string): Promise<ApiResponse<Config['collections'][T]>> {\n return this.api.getDocument(this.collection, id, this.queryOptions)\n }\n\n /**\n * 문서 생성\n */\n async create(\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n return this.api.createDocument(this.collection, data)\n }\n\n /**\n * 문서 업데이트\n */\n async update(\n id: number | string,\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n return this.api.updateDocument(this.collection, id, data)\n }\n\n /**\n * 문서 삭제\n */\n async delete(id: number | string): Promise<ApiResponse<void>> {\n return this.api.deleteDocument(this.collection, id)\n }\n}\n","import { isServer, QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query'\n\nfunction makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: Number.POSITIVE_INFINITY,\n refetchOnWindowFocus: false,\n },\n dehydrate: {\n // include pending queries in dehydration\n shouldDehydrateQuery: (query) =>\n defaultShouldDehydrateQuery(query) || query.state.status === 'pending',\n shouldRedactErrors: (_) => {\n // We should not catch Next.js server errors\n // as that's how Next.js detects dynamic pages\n // so we cannot redact them.\n // Next.js also automatically redacts errors for us\n // with better digests.\n return false\n },\n },\n },\n })\n}\n\nlet browserQueryClient: QueryClient | undefined = undefined\n\nexport function getQueryClient() {\n if (isServer) {\n // Server: always make a new query client\n return makeQueryClient()\n }\n // Browser: make a new query client if we don't already have one\n // This is very important, so we don't re-make a new client if React\n // suspends during the initial render. This may not be needed if we\n // have a suspense boundary BELOW the creation of the query client\n if (!browserQueryClient) browserQueryClient = makeQueryClient()\n return browserQueryClient\n}\n","'use client'\n\nimport { QueryClientProvider } from '@tanstack/react-query'\nimport { getQueryClient } from './query/get-query-client'\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools'\n\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n // NOTE: Avoid useState when initializing the query client if you don't\n // have a suspense boundary between this and the code that may\n // suspend because React will throw away the client on the initial\n // render if it suspends and there is no boundary\n const queryClient = getQueryClient()\n\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n {/* <ReactQueryDevtools initialIsOpen={false} /> */}\n </QueryClientProvider>\n )\n}\n","import { QueryClient, useQuery, useInfiniteQuery } from '@tanstack/react-query'\nimport { Collection, QueryOptions } from '../client/types'\nimport { Where } from 'payload'\nimport { CollectionsApi } from '../collection'\n\nexport * from '../queryProvider'\nexport * from './get-query-client'\n\nexport interface UnifiedQueryOptions {\n brandKey?: string\n brandSecret?: string\n baseUrl?: string\n}\n\n/**\n * 통합 쿼리 클라이언트\n */\nexport class UnifiedQueryClient {\n private queryClient: QueryClient\n private collectionsApi: CollectionsApi\n\n constructor(queryClient: QueryClient, options?: UnifiedQueryOptions) {\n this.queryClient = queryClient\n this.collectionsApi = new CollectionsApi(\n options?.brandKey || '',\n options?.brandSecret || '',\n )\n }\n\n useCollection<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', options]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n options,\n )\n return response.data\n },\n enabled: options?.enabled !== false,\n ...options,\n })\n }\n\n useCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: Omit<QueryOptions, 'limit'>,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'detail', options]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n options,\n )\n if (response.data.length === 0) return null\n return response.data[0]\n },\n enabled: options?.enabled !== false,\n ...options,\n })\n }\n\n useCollectionInfinite<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', 'infinite', options]\n const pageSize = options?.limit || 20\n\n return useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const queryOpts = { ...options, page: pageParam, limit: pageSize }\n const response = await this.collectionsApi.getCollection(\n collection,\n queryOpts,\n )\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: unknown[],\n _: unknown,\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n enabled: options?.enabled !== false,\n select: (data) => data.pages.flatMap((page) => page),\n })\n }\n\n useById<T extends Collection>(\n collection: T,\n id: string | number,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'detail', id]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getDocument(\n collection,\n id,\n queryOptions,\n )\n return response.data\n },\n enabled: queryOptions?.enabled !== false && !!id,\n ...queryOptions,\n })\n }\n\n useSearch<T extends Collection>(\n collection: T,\n searchQuery: string,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'search', searchQuery, queryOptions]\n const pageSize = queryOptions?.limit || 20\n\n return useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const where: Where = {\n or: [\n { title: { contains: searchQuery } },\n { description: { contains: searchQuery } },\n ],\n }\n\n const searchOptions = {\n ...queryOptions,\n where,\n limit: pageSize,\n page: pageParam,\n sort: queryOptions?.sort || '-createdAt',\n }\n\n const response = await this.collectionsApi.getCollection(\n collection,\n searchOptions,\n )\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: unknown[],\n _: unknown,\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n enabled:\n queryOptions?.enabled !== false &&\n !!searchQuery &&\n searchQuery.length > 0,\n select: (data) => ({\n pages: data.pages,\n pageParams: data.pageParams,\n items: data.pages.flatMap((page) => page),\n }),\n })\n }\n\n /**\n * 컬렉션별 프리페치\n * @example await client.query.prefetchQuery('products', { where: { status: 'published' } })\n */\n async prefetchQuery<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'list', queryOptions]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n queryOptions,\n )\n return response.data\n },\n })\n }\n\n /**\n * 컬렉션별 단일 쿼리 프리페치\n * @example await client.query.prefetchCollectionSingle('products', { limit: 1 })\n */\n async prefetchCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'detail', queryOptions]\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n queryOptions,\n )\n if (response.data.length === 0) return null\n return response.data[0]\n },\n })\n }\n\n /**\n * 컬렉션별 무한 쿼리 프리페치\n * @example await client.query.prefetchInfiniteQuery('products', { limit: 20 })\n */\n async prefetchInfiniteQuery<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'list', 'infinite', queryOptions]\n const pageSize = queryOptions?.limit || 20\n\n return this.queryClient.prefetchInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const options = { ...queryOptions, page: pageParam, limit: pageSize }\n const response = await this.collectionsApi.getCollection(\n collection,\n options,\n )\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: unknown[],\n _: unknown,\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n pages: 2,\n })\n }\n\n /**\n * 캐시 조작 메서드들\n */\n invalidateQueries(collection: Collection, operation?: string) {\n const queryKey = operation ? [collection, operation] : [collection]\n return this.queryClient.invalidateQueries({ queryKey })\n }\n\n getQueryData<T>(\n collection: Collection,\n operation: string,\n ...params: (string | number)[]\n ): T | undefined {\n const queryKey = [\n collection,\n operation,\n ...params.filter((p) => p !== undefined),\n ]\n return this.queryClient.getQueryData<T>(queryKey)\n }\n\n setQueryData<T>(\n collection: Collection,\n operation: string,\n data: T,\n ...params: (string | number)[]\n ) {\n const queryKey = [\n collection,\n operation,\n ...params.filter((p) => p !== undefined),\n ]\n return this.queryClient.setQueryData<T>(queryKey, data)\n }\n}\n","import { _fetch } from '../internal/utils'\nimport { Config } from '../types'\nimport {\n CollectionQueryBuilder,\n CollectionsApi,\n CollectionsApi as CollectionsApiClass,\n} from '../collection'\nimport { getQueryClient } from '../query/get-query-client'\nimport { QueryClient } from '@tanstack/react-query'\nimport { UnifiedQueryClient } from '../query'\nimport {\n ClientBrowserConfig,\n ClientState,\n ClientMetadata,\n Collection,\n} from './types'\n\nexport type ClientOptions = ClientBrowserConfig\n\n// 기본 타입들 export\nexport type * from './types'\n\n/**\n * 01Works SDK를 위한 브라우저 클라이언트\n *\n * Supabase Client와 유사한 구조로 설계된 통합 클라이언트입니다.\n * 브라우저 환경에서 API 호출, 쿼리 관리, 유틸리티 기능을 제공합니다.\n *\n * @template _Database - 데이터베이스 스키마 타입 (기본값: Config)\n *\n * @example\n * ```typescript\n * import { createBrowserClient } from '@your-org/sdk'\n *\n * const client = createBrowserClient({\n * clientKey: 'your-client-key'\n * })\n *\n * // 제품 목록 조회\n * const products = await client.from('products').find({\n * where: { status: 'published' }\n * })\n *\n * // React Query 훅 사용\n * const { data } = client.query.useCollection('products')\n * ```\n */\nexport default class BrowserClient<_Database = Config> {\n /**\n * 통합 Query 클라이언트\n *\n * React Query 기반의 데이터 페칭 훅들을 제공합니다.\n *\n * @example\n * ```typescript\n * const { data, isLoading } = client.query.useCollection('products')\n * const { data: product } = client.query.useById('products', '123')\n * ```\n */\n query: UnifiedQueryClient\n\n /**\n * 범용 컬렉션 API 클라이언트 (Supabase 스타일)\n *\n * 모든 컬렉션에 대한 CRUD 작업을 제공합니다.\n *\n * @example\n * ```typescript\n * const products = await client.collections.from('products').find()\n * ```\n */\n collections: CollectionsApiClass\n\n /**\n * React Query 클라이언트 인스턴스\n *\n * 직접적인 쿼리 캐시 조작이 필요한 경우 사용합니다.\n */\n queryClient: QueryClient\n\n // 클라이언트 상태\n protected state: ClientState\n protected config: ClientBrowserConfig\n protected fetch: typeof _fetch\n\n /**\n * BrowserClient 인스턴스를 생성합니다.\n *\n * @param options - 클라이언트 설정 옵션\n * @throws {ValidationError} clientKey가 제공되지 않은 경우\n *\n * @example\n * ```typescript\n * const client = new BrowserClient({\n * clientKey: 'your-client-key',\n * environment: 'production',\n * debug: false\n * })\n * ```\n */\n constructor(options: ClientOptions) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n\n // 설정 초기화\n this.config = {\n environment: 'production',\n debug: false,\n ...options,\n }\n\n // 상태 초기화\n const metadata: ClientMetadata = {\n version: '1.0.0',\n environment: this.config.environment!,\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = {\n metadata,\n isReady: false,\n }\n\n // Fetch 설정\n this.fetch = _fetch\n\n // Query 클라이언트 초기화\n this.queryClient = getQueryClient()\n\n // 통합 쿼리 클라이언트 초기화\n this.query = new UnifiedQueryClient(this.queryClient, {\n brandKey: this.config.clientKey,\n })\n\n this.collections = new CollectionsApi(this.config.clientKey)\n\n // 클라이언트 준비 완료\n this.state.isReady = true\n }\n\n /**\n * 현재 브랜드의 설정을 가져옵니다.\n *\n * @returns Promise<BrandSetting | null> 브랜드 설정 또는 null\n *\n * @example\n * ```typescript\n * const settings = await client.getSettings()\n * if (settings) {\n * console.log('브랜드 제목:', settings.title)\n * }\n * ```\n */\n async getSettings() {\n const { data } = await this.from('brand-settings').find({\n where: {\n 'brand.clientKey': {\n equals: this.config.clientKey,\n },\n },\n })\n\n return data.length > 0 ? data[0] : null\n }\n\n /**\n * Collection에 대한 쿼리 빌더를 생성합니다. (Supabase 스타일)\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns CollectionQueryBuilder<T>\n *\n * @example\n * ```typescript\n * // 제품 목록 조회\n * const { data: products } = await client.from('products').find({\n * where: { status: 'published' },\n * limit: 10\n * })\n *\n * // 특정 제품 조회\n * const { data: product } = await client.from('products').findById('123')\n *\n * // 제품 생성\n * const { data: newProduct } = await client.from('products').create({\n * title: '새 제품',\n * price: 10000\n * })\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n /**\n * 클라이언트의 현재 상태를 반환합니다.\n *\n * @returns ClientState 클라이언트 상태 복사본\n */\n getState(): ClientState {\n return { ...this.state }\n }\n\n /**\n * 클라이언트 설정을 반환합니다.\n *\n * 민감한 정보(시크릿 키 등)는 제외됩니다.\n *\n * @returns ClientBrowserConfig 클라이언트 설정\n */\n getConfig(): ClientBrowserConfig {\n return this.config as ClientBrowserConfig\n }\n\n /**\n * 클라이언트 기본 정보를 반환합니다.\n *\n * @returns 클라이언트 정보 객체\n *\n * @example\n * ```typescript\n * const info = client.getClientInfo()\n * console.log(`SDK 버전: ${info.version}`)\n * console.log(`환경: ${info.environment}`)\n * ```\n */\n getClientInfo() {\n return {\n clientKey: this.config.clientKey,\n version: this.state.metadata.version,\n environment: this.config.environment,\n }\n }\n\n /**\n * 클라이언트를 정리하고 리소스를 해제합니다.\n *\n * 이 메서드를 호출한 후에는 클라이언트를 사용할 수 없습니다.\n *\n * @example\n * ```typescript\n * // 컴포넌트 언마운트 시\n * useEffect(() => {\n * return () => {\n * client.destroy()\n * }\n * }, [])\n * ```\n */\n destroy() {\n this.state.isReady = false\n }\n}\n\n/**\n * BrowserClient 인스턴스를 생성하는 헬퍼 함수\n *\n * @param options - 클라이언트 설정 옵션\n * @returns BrowserClient 인스턴스\n *\n * @example\n * ```typescript\n * import { createBrowserClient } from '@your-org/sdk'\n *\n * const client = createBrowserClient({\n * clientKey: process.env.NEXT_PUBLIC_CLIENT_KEY!,\n * environment: 'production'\n * })\n *\n * export default client\n * ```\n */\nexport const createBrowserClient = (options: ClientOptions): BrowserClient => {\n return new BrowserClient(options)\n}\n\nexport * from './index.server'\n","export const generateOrderNumber = () => {\n // YYMMDDRRRRRR\n const year = new Date().getFullYear().toString().slice(-2)\n const month = new Date().getMonth().toString().padStart(2, '0')\n const day = new Date().getDate().toString().padStart(2, '0')\n const random = Math.floor(Math.random() * 1000000)\n .toString()\n .padStart(6, '0')\n\n return `${year}${month}${day}${random}`\n}\n","export const objectFor = <T>(data: T | number | null | undefined) => {\n if (typeof data === 'number') {\n return null\n }\n\n return data\n}\n","import { z } from 'zod'\n\nexport const orderSchema = z.object({\n // 주문자 정보\n name: z.string().min(1),\n email: z.string().email(),\n\n // 배송 정보\n shippingPhone: z.string().min(1),\n shippingPostalCode: z.string().min(1),\n shippingAddress: z.string().min(1),\n shippingAddressDetail: z.string().min(1),\n shippingMessage: z.string().min(1).optional(),\n})\n"]}
@@ -0,0 +1,3 @@
1
+ 'use strict';var qsEsm=require('qs-esm'),reactQuery=require('@tanstack/react-query'),zod=require('zod');var u=class n extends Error{code;status;details;constructor(e,t,r,i){super(t),this.name="SDKError",this.code=e,this.status=r,this.details=i,Error.captureStackTrace&&Error.captureStackTrace(this,n);}toJSON(){return {name:this.name,code:this.code,message:this.message,status:this.status,details:this.details}}},m=class extends u{constructor(e,t,r){super("NETWORK_ERROR",e,t,r),this.name="NetworkError";}},f=class extends u{constructor(e,t){super("VALIDATION_ERROR",e,400,t),this.name="ValidationError";}},g=class extends u{constructor(e,t,r){super("API_ERROR",e,t,r),this.name="ApiError";}},T=class extends u{constructor(e,t){super("CONFIG_ERROR",e,void 0,t),this.name="ConfigError";}},y=class extends u{constructor(e="\uC694\uCCAD\uC774 \uC2DC\uAC04 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",t){super("TIMEOUT_ERROR",e,408,t),this.name="TimeoutError";}},j=n=>n instanceof u,J=n=>n instanceof m,V=n=>n instanceof f,B=n=>n instanceof g,L=n=>n instanceof T,z=n=>n instanceof y,x=(n,e,t)=>new m(n,e,t),Q=(n,e)=>new f(n,e),b=(n,e,t)=>new g(n,e,t),W=(n,e)=>new T(n,e),G=(n,e)=>new y(n,e);var I=process.env.NEXT_PUBLIC_API_URL||"https://01.software",l=async(n,e)=>{let{clientKey:t,secretKey:r,timeout:i=3e4,...s}=e||{},o=new Headers(s.headers);t&&o.set("X-Client-Key",t),r&&o.set("X-Secret-Key",r),!o.has("Content-Type")&&s.body&&o.set("Content-Type","application/json");let c=new AbortController,p=setTimeout(()=>c.abort(),i);try{let a=await fetch(`${I}${n}`,{...s,headers:o,signal:c.signal});if(clearTimeout(p),!a.ok)throw x(`HTTP ${a.status}: ${a.statusText}`,a.status,{url:n,method:s.method||"GET"});return a}catch(a){throw clearTimeout(p),a instanceof Error&&a.name==="AbortError"?new y(`\uC694\uCCAD\uC774 ${i}ms \uD6C4 \uD0C0\uC784\uC544\uC6C3\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`,{url:n,timeout:i}):a instanceof TypeError?x("\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC778\uD130\uB137 \uC5F0\uACB0\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.",void 0,{url:n,originalError:a.message}):a instanceof m||a instanceof y?a:x(a instanceof Error?a.message:"\uC54C \uC218 \uC5C6\uB294 \uB124\uD2B8\uC6CC\uD06C \uC5D0\uB7EC\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",void 0,{url:n,originalError:a})}};var S=async({paymentId:n,orderNumber:e,orderProducts:t,email:r,shippingAddress:i,totalAmount:s,secretKey:o,clientKey:c})=>await(await l("/api/orders/create",{method:"POST",body:JSON.stringify({clientKey:c,secretKey:o,paymentId:n,orderNumber:e,orderProducts:t,email:r,shippingAddress:i,totalAmount:s})})).json();var v=async({paymentId:n,status:e,secretKey:t,clientKey:r})=>await(await l("/api/orders/update",{method:"POST",body:JSON.stringify({clientKey:r,secretKey:t,paymentId:n,status:e})})).json();var q=async({paymentId:n,status:e,paymentMethod:t,receiptUrl:r,secretKey:i,clientKey:s})=>await(await l("/api/transactions/update",{method:"POST",body:JSON.stringify({clientKey:s,secretKey:i,paymentId:n,status:e,paymentMethod:t,receiptUrl:r})})).json();var O=class{clientKey;secretKey;constructor(e){this.clientKey=e.clientKey,this.secretKey=e.secretKey;}createOrder(e){return S({...e,clientKey:this.clientKey,secretKey:this.secretKey})}updateOrder(e){return v({...e,clientKey:this.clientKey,secretKey:this.secretKey})}updateTransaction(e){return q({...e,clientKey:this.clientKey,secretKey:this.secretKey})}};var w=class{clientKey;secretKey;defaultOptions;constructor(e,t){if(!e)throw Q("clientKey\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");this.clientKey=e,this.secretKey=t,this.defaultOptions={clientKey:e,secretKey:t};}async get(e,t){let r=this.buildUrl(e,t),i=await l(r,{...this.defaultOptions,method:"GET"});return this.parseResponse(i)}async post(e,t,r){let i=await l(e,{...this.defaultOptions,...r,method:"POST",body:t?JSON.stringify(t):void 0});return this.parseResponse(i)}async put(e,t,r){let i=await l(e,{...this.defaultOptions,...r,method:"PUT",body:t?JSON.stringify(t):void 0});return this.parseResponse(i)}async patch(e,t,r){let i=await l(e,{...this.defaultOptions,...r,method:"PATCH",body:t?JSON.stringify(t):void 0});return this.parseResponse(i)}async delete(e,t){let r=await l(e,{...this.defaultOptions,...t,method:"DELETE"});return this.parseResponse(r)}buildUrl(e,t){if(!t)return e;let r=qsEsm.stringify(t,{addQueryPrefix:true});return r?`${e}${r}`:e}async parseResponse(e){let t=e.headers.get("content-type");try{if(t&&t.includes("application/json")){let i=await e.json();if(i.docs!==void 0){let s={page:i.page||1,limit:i.limit||20,totalDocs:i.totalDocs||0,totalPages:i.totalPages||0,hasNextPage:i.hasNextPage||!1,hasPrevPage:i.hasPrevPage||!1};return {data:i.docs,success:!0,pagination:s}}return {data:i,success:!0}}return {data:await e.text(),success:!0}}catch(r){throw b("\uC751\uB2F5 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.",e.status,{contentType:t,error:r instanceof Error?r.message:r})}}handleError(e){throw e instanceof g||e instanceof f?e:b(e.message||"Unknown API error",e.status||500,e)}};var h=class extends w{from(e){return new K(e,this)}async getCollection(e,t){try{return await this.get(`/api/${e}`,t)}catch(r){return this.handleError(r)}}async getDocument(e,t,r){try{return await this.get(`/api/${e}/${t}`,r)}catch(i){return this.handleError(i)}}async createDocument(e,t){try{return await this.post(`/api/${e}`,t)}catch(r){return this.handleError(r)}}async updateDocument(e,t,r){try{return await this.patch(`/api/${e}/${t}`,r)}catch(i){return this.handleError(i)}}async deleteDocument(e,t){try{return await this.delete(`/api/${e}/${t}`)}catch(r){return this.handleError(r)}}},K=class{collection;api;queryOptions={};constructor(e,t){this.collection=e,this.api=t;}async find(e){return this.api.getCollection(this.collection,e)}async findById(e){return this.api.getDocument(this.collection,e,this.queryOptions)}async create(e){return this.api.createDocument(this.collection,e)}async update(e,t){return this.api.updateDocument(this.collection,e,t)}async delete(e){return this.api.deleteDocument(this.collection,e)}};function D(){return new reactQuery.QueryClient({defaultOptions:{queries:{staleTime:Number.POSITIVE_INFINITY,refetchOnWindowFocus:false},dehydrate:{shouldDehydrateQuery:n=>reactQuery.defaultShouldDehydrateQuery(n)||n.state.status==="pending",shouldRedactErrors:n=>false}}})}var E;function P(){return reactQuery.isServer?D():(E||(E=D()),E)}function Ae({children:n}){let e=P();return React.createElement(reactQuery.QueryClientProvider,{client:e},n)}var A=class{queryClient;collectionsApi;constructor(e,t){this.queryClient=e,this.collectionsApi=new h(t?.brandKey||"",t?.brandSecret||"");}useCollection(e,t){let r=t;return reactQuery.useQuery({queryKey:[e,"list",r],queryFn:async()=>(await this.collectionsApi.getCollection(e,r)).data,enabled:r?.enabled!==false,...r})}useCollectionSingle(e,t){let r=t;return reactQuery.useQuery({queryKey:[e,"detail",r],queryFn:async()=>{let s=await this.collectionsApi.getCollection(e,r);return s.data.length===0?null:s.data[0]},enabled:r?.enabled!==false,...r})}useCollectionInfinite(e,t){let r=t,i=[e,"list","infinite",r],s=r?.limit||20;return reactQuery.useInfiniteQuery({queryKey:i,queryFn:async({pageParam:o=1})=>{let c={...r,page:o,limit:s};return (await this.collectionsApi.getCollection(e,c)).data},initialPageParam:1,getNextPageParam:(o,c,p)=>!Array.isArray(o)||o.length<s?null:p+1,enabled:r?.enabled!==false,select:o=>o.pages.flatMap(c=>c)})}useById(e,t,r){return reactQuery.useQuery({queryKey:[e,"detail",t],queryFn:async()=>(await this.collectionsApi.getDocument(e,t,r)).data,enabled:r?.enabled!==false&&!!t,...r})}useSearch(e,t,r){let i=[e,"search",t,r],s=r?.limit||20;return reactQuery.useInfiniteQuery({queryKey:i,queryFn:async({pageParam:o=1})=>{let p={...r,where:{or:[{title:{contains:t}},{description:{contains:t}}]},limit:s,page:o,sort:r?.sort||"-createdAt"};return (await this.collectionsApi.getCollection(e,p)).data},initialPageParam:1,getNextPageParam:(o,c,p)=>!Array.isArray(o)||o.length<s?null:p+1,enabled:r?.enabled!==false&&!!t&&t.length>0,select:o=>({pages:o.pages,pageParams:o.pageParams,items:o.pages.flatMap(c=>c)})})}async prefetchQuery(e,t){let r=[e,"list",t];return this.queryClient.prefetchQuery({queryKey:r,queryFn:async()=>(await this.collectionsApi.getCollection(e,t)).data})}async prefetchCollectionSingle(e,t){let r=[e,"detail",t];return this.queryClient.prefetchQuery({queryKey:r,queryFn:async()=>{let i=await this.collectionsApi.getCollection(e,t);return i.data.length===0?null:i.data[0]}})}async prefetchInfiniteQuery(e,t){let r=[e,"list","infinite",t],i=t?.limit||20;return this.queryClient.prefetchInfiniteQuery({queryKey:r,queryFn:async({pageParam:s=1})=>{let o={...t,page:s,limit:i};return (await this.collectionsApi.getCollection(e,o)).data},initialPageParam:1,getNextPageParam:(s,o,c)=>!Array.isArray(s)||s.length<i?null:c+1,pages:2})}invalidateQueries(e,t){let r=t?[e,t]:[e];return this.queryClient.invalidateQueries({queryKey:r})}getQueryData(e,t,...r){let i=[e,t,...r.filter(s=>s!==void 0)];return this.queryClient.getQueryData(i)}setQueryData(e,t,r,...i){let s=[e,t,...i.filter(o=>o!==void 0)];return this.queryClient.setQueryData(s,r)}};var C=class{api;query;collections;queryClient;state;config;fetch;constructor(e){this.config={environment:"production",debug:false,...e};let t={version:"1.0.0",environment:this.config.environment,timestamp:Date.now(),userAgent:typeof window<"u"?window.navigator?.userAgent:"Node.js"};this.state={metadata:t,isReady:false},this.fetch=l,this.api=new O({clientKey:this.config.clientKey,secretKey:this.config.secretKey}),this.queryClient=P(),this.query=new A(this.queryClient,{brandKey:this.config.clientKey,brandSecret:this.config.secretKey}),this.collections=new h(this.config.clientKey,this.config.secretKey),this.state.isReady=true;}async getSettings(){let{data:e}=await this.from("brand-settings").find({where:{"brand.clientKey":{equals:this.config.clientKey}}});return e.length>0?e[0]:null}from(e){return this.collections.from(e)}getState(){return {...this.state}}getConfig(){let{secretKey:e,...t}=this.config;return t}getClientInfo(){return {clientKey:this.config.clientKey,version:this.state.metadata.version,environment:this.config.environment}}destroy(){this.state.isReady=false;}},M=n=>new C(n);var ke=()=>{let n=new Date().getFullYear().toString().slice(-2),e=new Date().getMonth().toString().padStart(2,"0"),t=new Date().getDate().toString().padStart(2,"0"),r=Math.floor(Math.random()*1e6).toString().padStart(6,"0");return `${n}${e}${t}${r}`};var je=n=>typeof n=="number"?null:n;var Be=zod.z.object({name:zod.z.string().min(1),email:zod.z.string().email(),shippingPhone:zod.z.string().min(1),shippingPostalCode:zod.z.string().min(1),shippingAddress:zod.z.string().min(1),shippingAddressDetail:zod.z.string().min(1),shippingMessage:zod.z.string().min(1).optional()});
2
+ exports.ApiClient=O;exports.ApiError=g;exports.CollectionQueryBuilder=K;exports.CollectionsApi=h;exports.ConfigError=T;exports.NetworkError=m;exports.QueryProvider=Ae;exports.SDKError=u;exports.ServerClient=C;exports.TimeoutError=y;exports.UnifiedQueryClient=A;exports.ValidationError=f;exports.createApiError=b;exports.createConfigError=W;exports.createNetworkError=x;exports.createOrder=S;exports.createServerClient=M;exports.createTimeoutError=G;exports.createValidationError=Q;exports.generateOrderNumber=ke;exports.getQueryClient=P;exports.isApiError=B;exports.isConfigError=L;exports.isNetworkError=J;exports.isSDKError=j;exports.isTimeoutError=z;exports.isValidationError=V;exports.objectFor=je;exports.orderSchema=Be;//# sourceMappingURL=server.cjs.map
3
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/internal/utils/index.ts","../src/api/createOrder.ts","../src/api/updateOrder.ts","../src/api/updateTransaction.ts","../src/api/index.ts","../src/collection/base.ts","../src/collection/index.ts","../src/query/get-query-client.ts","../src/queryProvider.tsx","../src/query/index.ts","../src/client/index.server.ts","../src/utils/order/generateOrderNumber.ts","../src/utils/types.ts","../src/zod/orderSchema.ts"],"names":["SDKError","_SDKError","code","message","status","details","NetworkError","ValidationError","ApiError","ConfigError","TimeoutError","isSDKError","error","isNetworkError","isValidationError","isApiError","isConfigError","isTimeoutError","createNetworkError","createValidationError","createApiError","createConfigError","createTimeoutError","API_URL","_fetch","url","options","clientKey","secretKey","timeout","requestInit","headers","controller","timeoutId","response","createOrder","paymentId","orderNumber","orderProducts","email","shippingAddress","totalAmount","updateOrder","updateTransaction","paymentMethod","receiptUrl","ApiClient","params","BaseApiClient","endpoint","data","queryString","stringify","contentType","jsonData","pagination","CollectionsApi","collection","CollectionQueryBuilder","id","api","makeQueryClient","QueryClient","query","defaultShouldDehydrateQuery","_","browserQueryClient","getQueryClient","isServer","QueryProvider","children","queryClient","QueryClientProvider","UnifiedQueryClient","queryOptions","useQuery","queryKey","pageSize","useInfiniteQuery","pageParam","queryOpts","lastPage","lastPageParams","page","searchQuery","searchOptions","operation","p","ServerClient","metadata","safeConfig","createServerClient","generateOrderNumber","year","month","day","random","objectFor","orderSchema","z"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * SDK 에러 처리 시스템\n *\n * 다양한 에러 상황에 대한 구조화된 에러 클래스들을 제공합니다.\n */\n\n/**\n * SDK의 기본 에러 클래스\n * 모든 SDK 관련 에러의 베이스 클래스입니다.\n */\nexport class SDKError extends Error {\n public readonly code: string\n public readonly status?: number\n public readonly details?: any\n\n constructor(code: string, message: string, status?: number, details?: any) {\n super(message)\n this.name = 'SDKError'\n this.code = code\n this.status = status\n this.details = details\n\n // Error 스택 트레이스 보정\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SDKError)\n }\n }\n\n /**\n * 에러를 JSON 형태로 직렬화합니다.\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n }\n }\n}\n\n/**\n * 네트워크 관련 에러\n * API 호출 실패, 연결 문제 등에 사용됩니다.\n */\nexport class NetworkError extends SDKError {\n constructor(message: string, status?: number, details?: any) {\n super('NETWORK_ERROR', message, status, details)\n this.name = 'NetworkError'\n }\n}\n\n/**\n * 데이터 검증 에러\n * 잘못된 파라미터나 스키마 검증 실패 시 사용됩니다.\n */\nexport class ValidationError extends SDKError {\n constructor(message: string, details?: any) {\n super('VALIDATION_ERROR', message, 400, details)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * API 응답 에러\n * 서버에서 반환된 에러 응답을 처리합니다.\n */\nexport class ApiError extends SDKError {\n constructor(message: string, status: number, details?: any) {\n super('API_ERROR', message, status, details)\n this.name = 'ApiError'\n }\n}\n\n/**\n * 설정 에러\n * 클라이언트 설정이 잘못되었을 때 사용됩니다.\n */\nexport class ConfigError extends SDKError {\n constructor(message: string, details?: any) {\n super('CONFIG_ERROR', message, undefined, details)\n this.name = 'ConfigError'\n }\n}\n\n/**\n * 타임아웃 에러\n * 요청이 시간 초과되었을 때 사용됩니다.\n */\nexport class TimeoutError extends SDKError {\n constructor(message: string = '요청이 시간 초과되었습니다.', details?: any) {\n super('TIMEOUT_ERROR', message, 408, details)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * 에러 타입 가드 함수들\n */\nexport const isSDKError = (error: any): error is SDKError => {\n return error instanceof SDKError\n}\n\nexport const isNetworkError = (error: any): error is NetworkError => {\n return error instanceof NetworkError\n}\n\nexport const isValidationError = (error: any): error is ValidationError => {\n return error instanceof ValidationError\n}\n\nexport const isApiError = (error: any): error is ApiError => {\n return error instanceof ApiError\n}\n\nexport const isConfigError = (error: any): error is ConfigError => {\n return error instanceof ConfigError\n}\n\nexport const isTimeoutError = (error: any): error is TimeoutError => {\n return error instanceof TimeoutError\n}\n\n/**\n * 에러 생성 헬퍼 함수들\n */\nexport const createNetworkError = (message: string, status?: number, details?: any) => {\n return new NetworkError(message, status, details)\n}\n\nexport const createValidationError = (message: string, details?: any) => {\n return new ValidationError(message, details)\n}\n\nexport const createApiError = (message: string, status: number, details?: any) => {\n return new ApiError(message, status, details)\n}\n\nexport const createConfigError = (message: string, details?: any) => {\n return new ConfigError(message, details)\n}\n\nexport const createTimeoutError = (message?: string, details?: any) => {\n return new TimeoutError(message, details)\n}\n","import { createNetworkError, TimeoutError, NetworkError } from '../../errors'\n\nconst API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://01.software'\n\n/**\n * Fetch 요청 옵션 인터페이스\n *\n * @interface FetchOptions\n * @extends RequestInit\n */\nexport interface FetchOptions extends RequestInit {\n /** 클라이언트 키 (브랜드 식별용) */\n clientKey?: string\n /** 시크릿 키 (서버 사이드 인증용) */\n secretKey?: string\n /** 요청 타임아웃 (밀리초, 기본값: 30초) */\n timeout?: number\n}\n\n/**\n * 향상된 fetch 함수\n *\n * 클라이언트 키, 시크릿 키 헤더 자동 설정 및 에러 처리를 제공합니다.\n *\n * @param url - 요청할 URL (상대 경로)\n * @param options - Fetch 옵션\n * @returns Promise<Response>\n *\n * @throws {NetworkError} 네트워크 연결 실패 시\n * @throws {TimeoutError} 요청 타임아웃 시\n *\n * @example\n * ```typescript\n * const response = await _fetch('/api/products', {\n * clientKey: 'your-client-key',\n * method: 'GET'\n * })\n * ```\n */\nexport const _fetch = async (url: string, options?: FetchOptions): Promise<Response> => {\n const { clientKey, secretKey, timeout = 30000, ...requestInit } = options || {}\n\n // 헤더 설정\n const headers = new Headers(requestInit.headers)\n\n if (clientKey) {\n headers.set('X-Client-Key', clientKey)\n }\n\n if (secretKey) {\n headers.set('X-Secret-Key', secretKey)\n }\n\n if (!headers.has('Content-Type') && requestInit.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n // AbortController를 사용한 타임아웃 처리\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(`${API_URL}${url}`, {\n ...requestInit,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // HTTP 에러 상태 체크\n if (!response.ok) {\n throw createNetworkError(`HTTP ${response.status}: ${response.statusText}`, response.status, {\n url,\n method: requestInit.method || 'GET',\n })\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n // AbortError (타임아웃)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(`요청이 ${timeout}ms 후 타임아웃되었습니다.`, { url, timeout })\n }\n\n // 네트워크 에러\n if (error instanceof TypeError) {\n throw createNetworkError(\n '네트워크 연결에 실패했습니다. 인터넷 연결을 확인해주세요.',\n undefined,\n { url, originalError: error.message },\n )\n }\n\n // 이미 SDK 에러인 경우 그대로 throw\n if (error instanceof NetworkError || error instanceof TimeoutError) {\n throw error\n }\n\n // 기타 에러\n throw createNetworkError(\n error instanceof Error ? error.message : '알 수 없는 네트워크 에러가 발생했습니다.',\n undefined,\n { url, originalError: error },\n )\n }\n}\n","import { Order, OrderProduct } from '../types'\nimport { _fetch } from '../internal/utils'\nimport { ApiClientOptions } from '.'\n\nexport type CreateOrderParams = {\n paymentId: string\n orderNumber: string\n email: string\n shippingAddress: Order['shippingAddress']\n orderProducts: Omit<\n OrderProduct,\n 'id' | 'createdAt' | 'updatedAt' | 'order' | 'status'\n >[]\n totalAmount: number\n}\n\nexport const createOrder = async ({\n paymentId,\n orderNumber,\n orderProducts,\n email,\n shippingAddress,\n totalAmount,\n secretKey,\n clientKey,\n}: CreateOrderParams & ApiClientOptions) => {\n const response = await _fetch(`/api/orders/create`, {\n method: 'POST',\n body: JSON.stringify({\n clientKey,\n secretKey,\n paymentId,\n orderNumber,\n orderProducts,\n email,\n shippingAddress,\n totalAmount,\n }),\n })\n\n const order = await response.json()\n\n return order\n}\n","import { Order } from '../types'\nimport { _fetch } from '../internal/utils'\nimport { ApiClientOptions } from '.'\n\nexport type UpdateOrderParams = {\n paymentId: string\n status: Order['status']\n}\n\nexport const updateOrder = async ({\n paymentId,\n status,\n secretKey,\n clientKey,\n}: UpdateOrderParams & ApiClientOptions) => {\n const response = await _fetch(`/api/orders/update`, {\n method: 'POST',\n body: JSON.stringify({\n clientKey,\n secretKey,\n paymentId,\n status,\n }),\n })\n\n const order = await response.json()\n\n return order\n}\n","import { Transaction } from '../types'\nimport { _fetch } from '../internal/utils'\nimport { ApiClientOptions } from '.'\n\nexport type UpdateTransactionParams = {\n paymentId: string\n status: Transaction['status']\n paymentMethod: Transaction['paymentMethod']\n receiptUrl: Transaction['receiptUrl']\n}\n\nexport const updateTransaction = async ({\n paymentId,\n status,\n paymentMethod,\n receiptUrl,\n secretKey,\n clientKey,\n}: UpdateTransactionParams & ApiClientOptions) => {\n const response = await _fetch(`/api/transactions/update`, {\n method: 'POST',\n body: JSON.stringify({\n clientKey,\n secretKey,\n paymentId,\n status,\n paymentMethod,\n receiptUrl,\n }),\n })\n\n const transaction = await response.json()\n\n return transaction\n}\n","export * from './createOrder'\nimport { CreateOrderParams, createOrder } from './createOrder'\nimport { UpdateOrderParams, updateOrder } from './updateOrder'\nimport { UpdateTransactionParams, updateTransaction } from './updateTransaction'\n\nexport interface ApiClientOptions {\n clientKey: string\n secretKey: string\n}\n\nexport class ApiClient {\n private clientKey: string\n private secretKey: string\n\n constructor(options: ApiClientOptions) {\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n }\n\n createOrder(params: CreateOrderParams) {\n return createOrder({\n ...params,\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n })\n }\n\n updateOrder(params: UpdateOrderParams) {\n return updateOrder({\n ...params,\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n })\n }\n\n updateTransaction(params: UpdateTransactionParams) {\n return updateTransaction({\n ...params,\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n })\n }\n}\n","/**\n * API 클라이언트 기본 클래스\n *\n * 모든 API 클라이언트의 베이스 클래스로, 공통적인 HTTP 메서드들과\n * 에러 처리, 응답 파싱 기능을 제공합니다.\n */\n\nimport { _fetch, FetchOptions } from '../internal/utils'\nimport { ApiResponse, PaginationMeta, QueryOptions } from '../client/types'\nimport { ApiError, ValidationError, createApiError, createValidationError } from '../errors'\nimport { stringify } from 'qs-esm'\n\n/**\n * API 클라이언트 기본 클래스\n *\n * @class BaseApiClient\n */\nexport class BaseApiClient {\n protected clientKey: string\n protected secretKey?: string\n protected defaultOptions: FetchOptions\n\n /**\n * BaseApiClient 생성자\n *\n * @param clientKey - 클라이언트 키 (필수)\n * @param secretKey - 시크릿 키 (선택, 서버 사이드에서만 사용)\n *\n * @example\n * ```typescript\n * const client = new BaseApiClient('your-client-key', 'your-secret-key')\n * ```\n */\n constructor(clientKey: string, secretKey?: string) {\n if (!clientKey) {\n throw createValidationError('clientKey는 필수입니다.')\n }\n\n this.clientKey = clientKey\n this.secretKey = secretKey\n this.defaultOptions = {\n clientKey: clientKey,\n secretKey: secretKey,\n }\n }\n\n /**\n * GET 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param options - 쿼리 옵션 (페이지네이션, 필터링 등)\n * @returns Promise<ApiResponse<T>>\n *\n * @example\n * ```typescript\n * const response = await client.get<Product[]>('/api/products', {\n * page: 1,\n * limit: 10,\n * where: { status: 'published' }\n * })\n * ```\n */\n protected async get<T = any>(endpoint: string, options?: QueryOptions): Promise<ApiResponse<T>> {\n const url = this.buildUrl(endpoint, options)\n\n const response = await _fetch(url, {\n ...this.defaultOptions,\n method: 'GET',\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * POST 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n *\n * @example\n * ```typescript\n * const response = await client.post<Product>('/api/products', {\n * title: '새 제품',\n * price: 10000\n * })\n * ```\n */\n protected async post<T = any>(\n endpoint: string,\n data?: any,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'POST',\n body: data ? JSON.stringify(data) : undefined,\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * PUT 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n */\n protected async put<T = any>(\n endpoint: string,\n data?: any,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'PUT',\n body: data ? JSON.stringify(data) : undefined,\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * PATCH 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n */\n protected async patch<T = any>(\n endpoint: string,\n data?: any,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'PATCH',\n body: data ? JSON.stringify(data) : undefined,\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * DELETE 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param options - 추가 fetch 옵션\n * @returns Promise<ApiResponse<T>>\n */\n protected async delete<T = any>(\n endpoint: string,\n options?: FetchOptions,\n ): Promise<ApiResponse<T>> {\n const response = await _fetch(endpoint, {\n ...this.defaultOptions,\n ...options,\n method: 'DELETE',\n })\n\n return this.parseResponse<T>(response)\n }\n\n /**\n * URL 빌드 (쿼리 파라미터 포함)\n *\n * @param endpoint - 기본 엔드포인트\n * @param options - 쿼리 옵션\n * @returns 완성된 URL\n *\n * @private\n */\n protected buildUrl(endpoint: string, options?: QueryOptions): string {\n if (!options) return endpoint\n\n const queryString = stringify(options, { addQueryPrefix: true })\n\n return queryString ? `${endpoint}${queryString}` : endpoint\n }\n\n /**\n * HTTP 응답을 파싱하여 ApiResponse 형태로 변환합니다.\n *\n * Payload CMS의 응답 형식을 자동으로 감지하고 처리합니다.\n *\n * @template T - 응답 데이터 타입\n * @param response - HTTP Response 객체\n * @returns Promise<ApiResponse<T>>\n *\n * @throws {ApiError} JSON 파싱 실패 시\n *\n * @private\n */\n protected async parseResponse<T>(response: Response): Promise<ApiResponse<T>> {\n const contentType = response.headers.get('content-type')\n\n try {\n if (contentType && contentType.includes('application/json')) {\n const jsonData = await response.json()\n\n // Payload CMS 응답 형식 처리 (컬렉션 목록)\n if (jsonData.docs !== undefined) {\n const pagination: PaginationMeta = {\n page: jsonData.page || 1,\n limit: jsonData.limit || 20,\n totalDocs: jsonData.totalDocs || 0,\n totalPages: jsonData.totalPages || 0,\n hasNextPage: jsonData.hasNextPage || false,\n hasPrevPage: jsonData.hasPrevPage || false,\n }\n\n return {\n data: jsonData.docs,\n success: true,\n pagination,\n }\n }\n\n // 단일 문서 응답\n return {\n data: jsonData,\n success: true,\n }\n }\n\n // 텍스트 응답\n const textData = await response.text()\n return {\n data: textData as T,\n success: true,\n }\n } catch (error) {\n throw createApiError('응답 파싱에 실패했습니다.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n /**\n * 에러를 SDK 표준 에러 형태로 변환합니다.\n *\n * @param error - 원본 에러\n * @throws {ApiError} 변환된 에러\n *\n * @deprecated 이 메서드는 더 이상 사용되지 않습니다.\n * 에러는 _fetch 함수에서 자동으로 처리됩니다.\n *\n * @private\n */\n protected handleError(error: any): never {\n // 이미 SDK 에러인 경우 그대로 throw\n if (error instanceof ApiError || error instanceof ValidationError) {\n throw error\n }\n\n // 기타 에러를 ApiError로 변환\n throw createApiError(error.message || 'Unknown API error', error.status || 500, error)\n }\n}\n","/**\n * 범용 컬렉션 API 클라이언트\n * Supabase 스타일의 from() 메서드를 구현\n */\n\nimport { BaseApiClient } from './base'\nimport { Config } from '../types'\nimport { QueryOptions, ApiResponse, Collection } from '../client/types'\n\nexport class CollectionsApi extends BaseApiClient {\n /**\n * Supabase 스타일의 컬렉션 접근\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return new CollectionQueryBuilder<T>(collection, this)\n }\n\n /**\n * 내부 API 호출 메서드들\n */\n async getCollection<T extends Collection>(\n collection: T,\n options?: QueryOptions,\n ): Promise<ApiResponse<Config['collections'][T][]>> {\n try {\n return await this.get<Config['collections'][T][]>(`/api/${collection}`, options)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async getDocument<T extends Collection>(\n collection: T,\n id: number | string,\n options?: QueryOptions,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n try {\n return await this.get<Config['collections'][T]>(`/api/${collection}/${id}`, options)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async createDocument<T extends Collection>(\n collection: T,\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n try {\n return await this.post<Config['collections'][T]>(`/api/${collection}`, data)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async updateDocument<T extends Collection>(\n collection: T,\n id: number | string,\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n try {\n return await this.patch<Config['collections'][T]>(`/api/${collection}/${id}`, data)\n } catch (error) {\n return this.handleError(error)\n }\n }\n\n async deleteDocument<T extends Collection>(\n collection: T,\n id: number | string,\n ): Promise<ApiResponse<void>> {\n try {\n return await this.delete<void>(`/api/${collection}/${id}`)\n } catch (error) {\n return this.handleError(error)\n }\n }\n}\n\nexport class CollectionQueryBuilder<T extends Collection> {\n private collection: T\n private api: CollectionsApi\n private queryOptions: QueryOptions = {}\n\n constructor(collection: T, api: CollectionsApi) {\n this.collection = collection\n this.api = api\n }\n\n async find(options?: QueryOptions): Promise<ApiResponse<Config['collections'][T][]>> {\n return this.api.getCollection(this.collection, options)\n }\n\n /**\n * 특정 ID로 문서 조회\n */\n async findById(id: number | string): Promise<ApiResponse<Config['collections'][T]>> {\n return this.api.getDocument(this.collection, id, this.queryOptions)\n }\n\n /**\n * 문서 생성\n */\n async create(\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n return this.api.createDocument(this.collection, data)\n }\n\n /**\n * 문서 업데이트\n */\n async update(\n id: number | string,\n data: Partial<Config['collections'][T]>,\n ): Promise<ApiResponse<Config['collections'][T]>> {\n return this.api.updateDocument(this.collection, id, data)\n }\n\n /**\n * 문서 삭제\n */\n async delete(id: number | string): Promise<ApiResponse<void>> {\n return this.api.deleteDocument(this.collection, id)\n }\n}\n","import { isServer, QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query'\n\nfunction makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: Number.POSITIVE_INFINITY,\n refetchOnWindowFocus: false,\n },\n dehydrate: {\n // include pending queries in dehydration\n shouldDehydrateQuery: (query) =>\n defaultShouldDehydrateQuery(query) || query.state.status === 'pending',\n shouldRedactErrors: (_) => {\n // We should not catch Next.js server errors\n // as that's how Next.js detects dynamic pages\n // so we cannot redact them.\n // Next.js also automatically redacts errors for us\n // with better digests.\n return false\n },\n },\n },\n })\n}\n\nlet browserQueryClient: QueryClient | undefined = undefined\n\nexport function getQueryClient() {\n if (isServer) {\n // Server: always make a new query client\n return makeQueryClient()\n }\n // Browser: make a new query client if we don't already have one\n // This is very important, so we don't re-make a new client if React\n // suspends during the initial render. This may not be needed if we\n // have a suspense boundary BELOW the creation of the query client\n if (!browserQueryClient) browserQueryClient = makeQueryClient()\n return browserQueryClient\n}\n","'use client'\n\nimport { QueryClientProvider } from '@tanstack/react-query'\nimport { getQueryClient } from './query/get-query-client'\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools'\n\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n // NOTE: Avoid useState when initializing the query client if you don't\n // have a suspense boundary between this and the code that may\n // suspend because React will throw away the client on the initial\n // render if it suspends and there is no boundary\n const queryClient = getQueryClient()\n\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n {/* <ReactQueryDevtools initialIsOpen={false} /> */}\n </QueryClientProvider>\n )\n}\n","import { QueryClient, useQuery, useInfiniteQuery } from '@tanstack/react-query'\nimport { Collection, QueryOptions } from '../client/types'\nimport { Where } from 'payload'\nimport { CollectionsApi } from '../collection'\n\nexport * from '../queryProvider'\nexport * from './get-query-client'\n\nexport interface UnifiedQueryOptions {\n brandKey?: string\n brandSecret?: string\n baseUrl?: string\n}\n\n/**\n * 통합 쿼리 클라이언트\n */\nexport class UnifiedQueryClient {\n private queryClient: QueryClient\n private collectionsApi: CollectionsApi\n\n constructor(queryClient: QueryClient, options?: UnifiedQueryOptions) {\n this.queryClient = queryClient\n this.collectionsApi = new CollectionsApi(\n options?.brandKey || '',\n options?.brandSecret || '',\n )\n }\n\n useCollection<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', options]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n options,\n )\n return response.data\n },\n enabled: options?.enabled !== false,\n ...options,\n })\n }\n\n useCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: Omit<QueryOptions, 'limit'>,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'detail', options]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n options,\n )\n if (response.data.length === 0) return null\n return response.data[0]\n },\n enabled: options?.enabled !== false,\n ...options,\n })\n }\n\n useCollectionInfinite<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', 'infinite', options]\n const pageSize = options?.limit || 20\n\n return useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const queryOpts = { ...options, page: pageParam, limit: pageSize }\n const response = await this.collectionsApi.getCollection(\n collection,\n queryOpts,\n )\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: unknown[],\n _: unknown,\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n enabled: options?.enabled !== false,\n select: (data) => data.pages.flatMap((page) => page),\n })\n }\n\n useById<T extends Collection>(\n collection: T,\n id: string | number,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'detail', id]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getDocument(\n collection,\n id,\n queryOptions,\n )\n return response.data\n },\n enabled: queryOptions?.enabled !== false && !!id,\n ...queryOptions,\n })\n }\n\n useSearch<T extends Collection>(\n collection: T,\n searchQuery: string,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'search', searchQuery, queryOptions]\n const pageSize = queryOptions?.limit || 20\n\n return useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const where: Where = {\n or: [\n { title: { contains: searchQuery } },\n { description: { contains: searchQuery } },\n ],\n }\n\n const searchOptions = {\n ...queryOptions,\n where,\n limit: pageSize,\n page: pageParam,\n sort: queryOptions?.sort || '-createdAt',\n }\n\n const response = await this.collectionsApi.getCollection(\n collection,\n searchOptions,\n )\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: unknown[],\n _: unknown,\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n enabled:\n queryOptions?.enabled !== false &&\n !!searchQuery &&\n searchQuery.length > 0,\n select: (data) => ({\n pages: data.pages,\n pageParams: data.pageParams,\n items: data.pages.flatMap((page) => page),\n }),\n })\n }\n\n /**\n * 컬렉션별 프리페치\n * @example await client.query.prefetchQuery('products', { where: { status: 'published' } })\n */\n async prefetchQuery<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'list', queryOptions]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n queryOptions,\n )\n return response.data\n },\n })\n }\n\n /**\n * 컬렉션별 단일 쿼리 프리페치\n * @example await client.query.prefetchCollectionSingle('products', { limit: 1 })\n */\n async prefetchCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'detail', queryOptions]\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi.getCollection(\n collection,\n queryOptions,\n )\n if (response.data.length === 0) return null\n return response.data[0]\n },\n })\n }\n\n /**\n * 컬렉션별 무한 쿼리 프리페치\n * @example await client.query.prefetchInfiniteQuery('products', { limit: 20 })\n */\n async prefetchInfiniteQuery<T extends Collection>(\n collection: T,\n queryOptions?: QueryOptions,\n ) {\n const queryKey = [collection, 'list', 'infinite', queryOptions]\n const pageSize = queryOptions?.limit || 20\n\n return this.queryClient.prefetchInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const options = { ...queryOptions, page: pageParam, limit: pageSize }\n const response = await this.collectionsApi.getCollection(\n collection,\n options,\n )\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: unknown[],\n _: unknown,\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n pages: 2,\n })\n }\n\n /**\n * 캐시 조작 메서드들\n */\n invalidateQueries(collection: Collection, operation?: string) {\n const queryKey = operation ? [collection, operation] : [collection]\n return this.queryClient.invalidateQueries({ queryKey })\n }\n\n getQueryData<T>(\n collection: Collection,\n operation: string,\n ...params: (string | number)[]\n ): T | undefined {\n const queryKey = [\n collection,\n operation,\n ...params.filter((p) => p !== undefined),\n ]\n return this.queryClient.getQueryData<T>(queryKey)\n }\n\n setQueryData<T>(\n collection: Collection,\n operation: string,\n data: T,\n ...params: (string | number)[]\n ) {\n const queryKey = [\n collection,\n operation,\n ...params.filter((p) => p !== undefined),\n ]\n return this.queryClient.setQueryData<T>(queryKey, data)\n }\n}\n","import { _fetch } from '../internal/utils'\nimport { Config } from '../types'\nimport { ApiClient } from '../api'\nimport {\n CollectionQueryBuilder,\n CollectionsApi,\n CollectionsApi as CollectionsApiClass,\n} from '../collection'\nimport { getQueryClient } from '../query/get-query-client'\nimport { QueryClient } from '@tanstack/react-query'\nimport { UnifiedQueryClient } from '../query'\nimport {\n ClientState,\n ClientMetadata,\n Collection,\n ClientServerConfig,\n} from './types'\n\nexport type ClientOptions = ClientServerConfig\n\n// 기본 타입들 export\nexport type * from './types'\n\n/**\n * ComClient - 01Works SDK를 위한 중앙 클라이언트\n *\n * Supabase Client와 유사한 구조로 설계된 통합 클라이언트입니다.\n * API 호출, 쿼리 관리, 유틸리티 기능을 포함합니다.\n */\nexport default class ServerClient<_Database = Config> {\n /**\n * API 클라이언트 - REST API 호출을 위한 메서드들\n */\n api: ApiClient\n\n /**\n * 통합 Query 클라이언트 - 새로운 인터페이스\n */\n query: UnifiedQueryClient\n\n /**\n * 범용 컬렉션 API 클라이언트 (Supabase 스타일)\n */\n collections: CollectionsApiClass\n\n /**\n * React Query 클라이언트\n */\n queryClient: QueryClient\n\n // 클라이언트 상태\n protected state: ClientState\n protected config: ClientServerConfig\n protected fetch: typeof _fetch\n\n /**\n * 새로운 01Client 인스턴스를 생성합니다.\n *\n * @param options - 클라이언트 설정 옵션\n */\n constructor(options: ClientOptions) {\n // 설정 초기화\n this.config = {\n environment: 'production',\n debug: false,\n ...options,\n }\n\n // 상태 초기화\n const metadata: ClientMetadata = {\n version: '1.0.0',\n environment: this.config.environment!,\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = {\n metadata,\n isReady: false,\n }\n\n // Fetch 설정\n this.fetch = _fetch\n\n // API 클라이언트 초기화\n this.api = new ApiClient({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n })\n\n // Query 클라이언트 초기화\n this.queryClient = getQueryClient()\n\n // 통합 쿼리 클라이언트 초기화\n this.query = new UnifiedQueryClient(this.queryClient, {\n brandKey: this.config.clientKey,\n brandSecret: this.config.secretKey,\n })\n\n this.collections = new CollectionsApi(\n this.config.clientKey,\n this.config.secretKey,\n )\n\n // 클라이언트 준비 완료\n this.state.isReady = true\n }\n\n /**\n * 브랜드 설정을 가져옵니다.\n */\n async getSettings() {\n const { data } = await this.from('brand-settings').find({\n where: {\n 'brand.clientKey': {\n equals: this.config.clientKey,\n },\n },\n })\n\n return data.length > 0 ? data[0] : null\n }\n\n /**\n * Collection에 대한 쿼리 빌더를 생성합니다. (Supabase 스타일)\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n /**\n * 클라이언트 상태 반환\n */\n getState(): ClientState {\n return { ...this.state }\n }\n\n /**\n * 클라이언트 설정 반환\n */\n getConfig(): ClientServerConfig {\n // 민감한 정보 제외하고 반환\n const { secretKey: _, ...safeConfig } = this.config\n return safeConfig as ClientServerConfig\n }\n\n /**\n * 클라이언트 정보 반환 (호환성)\n */\n getClientInfo() {\n return {\n clientKey: this.config.clientKey,\n version: this.state.metadata.version,\n environment: this.config.environment,\n }\n }\n\n /**\n * 클라이언트 정리\n */\n destroy() {\n this.state.isReady = false\n }\n}\n\n/**\n * 01Client 인스턴스를 생성하는 헬퍼 함수\n */\nexport const createServerClient = (options: ClientOptions): ServerClient => {\n return new ServerClient(options)\n}\n","export const generateOrderNumber = () => {\n // YYMMDDRRRRRR\n const year = new Date().getFullYear().toString().slice(-2)\n const month = new Date().getMonth().toString().padStart(2, '0')\n const day = new Date().getDate().toString().padStart(2, '0')\n const random = Math.floor(Math.random() * 1000000)\n .toString()\n .padStart(6, '0')\n\n return `${year}${month}${day}${random}`\n}\n","export const objectFor = <T>(data: T | number | null | undefined) => {\n if (typeof data === 'number') {\n return null\n }\n\n return data\n}\n","import { z } from 'zod'\n\nexport const orderSchema = z.object({\n // 주문자 정보\n name: z.string().min(1),\n email: z.string().email(),\n\n // 배송 정보\n shippingPhone: z.string().min(1),\n shippingPostalCode: z.string().min(1),\n shippingAddress: z.string().min(1),\n shippingAddressDetail: z.string().min(1),\n shippingMessage: z.string().min(1).optional(),\n})\n"]}