@01.software/sdk 0.0.1-251121.35939 → 0.0.1-260102065059
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.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +324 -25
- package/dist/index.d.ts +324 -25
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +10 -9
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';var jose=require('jose'),qsEsm=require('qs-esm'),reactQuery=require('@tanstack/react-query'),ie=require('react'),react=require('@payloadcms/richtext-lexical/react');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ie__default=/*#__PURE__*/_interopDefault(ie);var j=Object.defineProperty,L=Object.defineProperties;var X=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var U=(n,e,t)=>e in n?j(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t,c=(n,e)=>{for(var t in e||(e={}))k.call(e,t)&&U(n,t,e[t]);if(w)for(var t of w(e))I.call(e,t)&&U(n,t,e[t]);return n},y=(n,e)=>L(n,X(e));var P=(n,e)=>{var t={};for(var r in n)k.call(n,r)&&e.indexOf(r)<0&&(t[r]=n[r]);if(n!=null&&w)for(var r of w(n))e.indexOf(r)<0&&I.call(n,r)&&(t[r]=n[r]);return t};var o=(n,e,t)=>new Promise((r,i)=>{var s=l=>{try{p(t.next(l));}catch(m){i(m);}},a=l=>{try{p(t.throw(l));}catch(m){i(m);}},p=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);p((t=t.apply(n,e)).next());});var g=class n extends Error{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}}},h=class extends g{constructor(e,t,r){super("NETWORK_ERROR",e,t,r),this.name="NetworkError";}},E=class extends g{constructor(e,t){super("VALIDATION_ERROR",e,400,t),this.name="ValidationError";}},v=class extends g{constructor(e,t,r){super("API_ERROR",e,t,r),this.name="ApiError";}};var C=class extends g{constructor(e="\uC694\uCCAD\uC774 \uC2DC\uAC04 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",t){super("TIMEOUT_ERROR",e,408,t),this.name="TimeoutError";}};var S=(n,e,t)=>new h(n,e,t),B=(n,e)=>new E(n,e),$=(n,e,t)=>new v(n,e,t);var H="https://01.software",V=(n,e)=>o(null,null,function*(){if(!n||!e)throw new Error("clientKey\uC640 secretKey\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");let t=new TextEncoder().encode(e);return yield new jose.SignJWT({clientKey:n}).setProtectedHeader({alg:"HS256"}).setIssuedAt().setExpirationTime("1h").sign(t)}),d=(n,e)=>o(null,null,function*(){let O=e||{},{clientKey:t,secretKey:r,timeout:i=3e4,baseUrl:s=H}=O,a=P(O,["clientKey","secretKey","timeout","baseUrl"]),p=new Headers(a.headers);if(t&&p.set("X-Client-Key",t),r&&t){let u=yield V(t,r);p.set("Authorization",`Bearer ${u}`);}!p.has("Content-Type")&&a.body&&p.set("Content-Type","application/json");let l=new AbortController,m=setTimeout(()=>l.abort(),i);try{let u=yield fetch(`${s}${n}`,y(c({},a),{headers:p,signal:l.signal}));if(clearTimeout(m),!u.ok)throw S(`HTTP ${u.status}: ${u.statusText}`,u.status,{url:n,method:a.method||"GET"});return u}catch(u){throw clearTimeout(m),u instanceof Error&&u.name==="AbortError"?new C(`\uC694\uCCAD\uC774 ${i}ms \uD6C4 \uD0C0\uC784\uC544\uC6C3\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`,{url:n,timeout:i}):u instanceof TypeError?S("\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:u.message}):u instanceof h||u instanceof C?u:S(u instanceof Error?u.message:"\uC54C \uC218 \uC5C6\uB294 \uB124\uD2B8\uC6CC\uD06C \uC5D0\uB7EC\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",void 0,{url:n,originalError:u})}});var b=class{constructor(e,t){this.api=e;this.collection=t;}find(e){return o(this,null,function*(){return this.api.requestGet(`/api/${String(this.collection)}`,e)})}findById(e,t){return o(this,null,function*(){return this.api.requestGet(`/api/${String(this.collection)}/${String(e)}`,t)})}create(e){return o(this,null,function*(){return this.api.requestPost(`/api/${String(this.collection)}`,e)})}update(e,t){return o(this,null,function*(){return this.api.requestPatch(`/api/${String(this.collection)}/${String(e)}`,t)})}remove(e){return o(this,null,function*(){return this.api.requestDelete(`/api/${String(this.collection)}/${String(e)}`)})}};var K=class{constructor(e,t,r){if(!e)throw B("clientKey\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");this.clientKey=e,this.secretKey=t,this.baseUrl=r,this.defaultOptions={clientKey:e,secretKey:t,baseUrl:r};}get(e,t){return o(this,null,function*(){let r=this.buildUrl(e,t),i=yield d(r,y(c({},this.defaultOptions),{method:"GET"}));return this.parseResponse(i)})}post(e,t,r){return o(this,null,function*(){let i=yield d(e,y(c(c({},this.defaultOptions),r),{method:"POST",body:t?JSON.stringify(t):void 0}));return this.parseResponse(i)})}patch(e,t,r){return o(this,null,function*(){let i=yield d(e,y(c(c({},this.defaultOptions),r),{method:"PATCH",body:t?JSON.stringify(t):void 0}));return this.parseResponse(i)})}delete(e,t){return o(this,null,function*(){let r=yield d(e,y(c(c({},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}parseResponse(e){return o(this,null,function*(){let t=e.headers.get("content-type");try{if(t&&t.includes("application/json")){let i=yield 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:yield e.text(),success:!0}}catch(r){throw $("\uC751\uB2F5 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.",e.status,{contentType:t,error:r instanceof Error?r.message:r})}})}};var f=class extends K{constructor(e,t,r){super(e,t,r);}from(e){return new b(this,e)}requestGet(e,t){return this.get(e,t)}requestPost(e,t){return this.post(e,t)}requestPatch(e,t){return this.patch(e,t)}requestDelete(e){return this.delete(e)}};function F(){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 Q;function _(){return reactQuery.isServer?F():(Q||(Q=F()),Q)}var q=class{constructor(e,t){this.queryClient=e,this.collectionsApi=new f((t==null?void 0:t.brandKey)||"",t==null?void 0:t.brandSecret,t==null?void 0:t.baseUrl);}useCollection(e,t,r){let i=t;return reactQuery.useQuery({queryKey:[e,"list",i],queryFn:()=>o(this,null,function*(){return (yield this.collectionsApi.from(e).find(i)).data}),placeholderData:r!=null&&r.keepPreviousData?reactQuery.keepPreviousData:void 0})}useCollectionSingle(e,t,r){let i=t;return reactQuery.useQuery({queryKey:[e,"detail",i],queryFn:()=>o(this,null,function*(){var p;let a=yield this.collectionsApi.from(e).find(i);return a.data.length===0?null:(p=a.data[0])!=null?p:null}),placeholderData:r!=null&&r.keepPreviousData?reactQuery.keepPreviousData:void 0})}useCollectionInfinite(e,t,r){let i=t,s=[e,"list","infinite",i],a=(i==null?void 0:i.limit)||20;return reactQuery.useInfiniteQuery({queryKey:s,queryFn:l=>o(this,[l],function*({pageParam:p=1}){let m=y(c({},i),{page:p,limit:a});return (yield this.collectionsApi.from(e).find(m)).data}),initialPageParam:1,getNextPageParam:(p,l,m)=>!Array.isArray(p)||p.length<a?null:m+1,select:p=>p.pages.flatMap(l=>l),placeholderData:r!=null&&r.keepPreviousData?reactQuery.keepPreviousData:void 0})}useById(e,t,r,i){return reactQuery.useQuery({queryKey:[e,"detail",t],queryFn:()=>o(this,null,function*(){var p;return (p=(yield this.collectionsApi.from(e).findById(t,r)).data)!=null?p:null}),placeholderData:i!=null&&i.keepPreviousData?reactQuery.keepPreviousData:void 0})}prefetchCollection(e,t){return o(this,null,function*(){let r=t,i=[e,"list",r];return this.queryClient.prefetchQuery({queryKey:i,queryFn:()=>o(this,null,function*(){return (yield this.collectionsApi.from(e).find(r)).data})})})}prefetchCollectionSingle(e,t){return o(this,null,function*(){let r=t,i=[e,"detail",r];return this.queryClient.prefetchQuery({queryKey:i,queryFn:()=>o(this,null,function*(){let s=yield this.collectionsApi.from(e).find(r);return s.data.length===0?null:s.data[0]})})})}prefetchCollectionInfinite(e,t){return o(this,null,function*(){let r=t,i=[e,"list","infinite",r],s=(r==null?void 0:r.limit)||20;return this.queryClient.prefetchInfiniteQuery({queryKey:i,queryFn:p=>o(this,[p],function*({pageParam:a=1}){let l=y(c({},r),{page:a,limit:s});return (yield this.collectionsApi.from(e).find(l)).data}),initialPageParam:1,getNextPageParam:(a,p,l)=>!Array.isArray(a)||a.length<s?null:l+1,pages:2})})}prefetchById(e,t,r){return o(this,null,function*(){let i=[e,"detail",t];return this.queryClient.prefetchQuery({queryKey:i,queryFn:()=>o(this,null,function*(){var a;return (a=(yield this.collectionsApi.from(e).findById(t,r)).data)!=null?a:null})})})}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(a=>a!==void 0)];return this.queryClient.setQueryData(s,r)}};var T=class{constructor(e){var r;if(!e.clientKey)throw new Error("clientKey is required.");this.config=c({},e);let t={timestamp:Date.now(),userAgent:typeof window!="undefined"?(r=window.navigator)==null?void 0:r.userAgent:"Node.js"};this.state={metadata:t},this.fetch=d,this.queryClient=_(),this.query=new q(this.queryClient,{brandKey:this.config.clientKey,baseUrl:this.config.baseUrl}),this.collections=new f(this.config.clientKey,void 0,this.config.baseUrl);}getSettings(){return o(this,null,function*(){let{data:e}=yield 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 c({},this.state)}},re=n=>new T(n);var z=m=>o(null,[m],function*({paymentId:n,orderNumber:e,orderProducts:t,email:r,shippingAddress:i,totalAmount:s,secretKey:a,clientKey:p,baseUrl:l}){return (yield d("/api/orders/create",{method:"POST",baseUrl:l,clientKey:p,secretKey:a,body:JSON.stringify({paymentId:n,orderNumber:e,orderProducts:t,email:r,shippingAddress:i,totalAmount:s})})).json()});var J=s=>o(null,[s],function*({orderNumber:n,status:e,secretKey:t,clientKey:r,baseUrl:i}){return (yield d("/api/orders/update",{method:"POST",baseUrl:i,clientKey:r,secretKey:t,body:JSON.stringify({orderNumber:n,status:e})})).json()});var M=p=>o(null,[p],function*({paymentId:n,status:e,paymentMethod:t,receiptUrl:r,secretKey:i,clientKey:s,baseUrl:a}){return (yield d("/api/transactions/update",{method:"POST",baseUrl:a,clientKey:s,secretKey:i,body:JSON.stringify({paymentId:n,status:e,paymentMethod:t,receiptUrl:r})})).json()});var A=class{constructor(e){if(!e.clientKey)throw new Error("clientKey is required.");if(!e.secretKey)throw new Error("secretKey is required.");this.clientKey=e.clientKey,this.secretKey=e.secretKey,this.baseUrl=e.baseUrl;}getCommonOptions(){return {clientKey:this.clientKey,secretKey:this.secretKey,baseUrl:this.baseUrl}}createOrder(e){return z(c(c({},e),this.getCommonOptions()))}updateOrder(e){return J(c(c({},e),this.getCommonOptions()))}updateTransaction(e){return M(c(c({},e),this.getCommonOptions()))}};var x=class{constructor(e){var r;if(!e.clientKey)throw new Error("clientKey is required.");if(!e.secretKey)throw new Error("secretKey is required.");this.config=c({},e);let t={timestamp:Date.now(),userAgent:typeof window!="undefined"?(r=window.navigator)==null?void 0:r.userAgent:"Node.js"};this.state={metadata:t},this.fetch=d,this.api=new A({clientKey:this.config.clientKey,secretKey:this.config.secretKey,baseUrl:this.config.baseUrl}),this.collections=new f(this.config.clientKey,this.config.secretKey,this.config.baseUrl);}getSettings(){return o(this,null,function*(){let{data:e}=yield 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 c({},this.state)}getConfig(){let r=this.config,{secretKey:e}=r;return P(r,["secretKey"])}},ne=n=>new x(n);var gt=()=>{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 D=n=>typeof n=="number"?null:n;var At=n=>{var t,r,i,s;let e=n.length;return e===1?((r=D((t=n==null?void 0:n[0])==null?void 0:t.product))==null?void 0:r.title)||"":`${(s=D((i=n.at(0))==null?void 0:i.product))==null?void 0:s.title} \uC678 ${e-1}\uAC74`};function St({data:n,className:e,internalDocToHref:t,blocks:r}){return ie__default.default.createElement(react.RichText,{data:n,className:e,converters:y(c(c({},react.defaultJSXConverters),react.LinkJSXConverter({internalDocToHref:t})),{blocks:r||void 0})})}
|
|
2
|
-
exports.BrowserClient=T;exports.RichTextContent=
|
|
1
|
+
'use strict';var jose=require('jose'),qsEsm=require('qs-esm'),reactQuery=require('@tanstack/react-query'),se=require('react'),react=require('@payloadcms/richtext-lexical/react');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var se__default=/*#__PURE__*/_interopDefault(se);var z=Object.defineProperty,L=Object.defineProperties;var M=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var B=(n,e,t)=>e in n?z(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t,c=(n,e)=>{for(var t in e||(e={}))$.call(e,t)&&B(n,t,e[t]);if(w)for(var t of w(e))F.call(e,t)&&B(n,t,e[t]);return n},y=(n,e)=>L(n,M(e));var P=(n,e)=>{var t={};for(var r in n)$.call(n,r)&&e.indexOf(r)<0&&(t[r]=n[r]);if(n!=null&&w)for(var r of w(n))e.indexOf(r)<0&&F.call(n,r)&&(t[r]=n[r]);return t};var i=(n,e,t)=>new Promise((r,o)=>{var s=l=>{try{p(t.next(l));}catch(m){o(m);}},a=l=>{try{p(t.throw(l));}catch(m){o(m);}},p=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);p((t=t.apply(n,e)).next());});var g=class n extends Error{constructor(e,t,r,o){super(t),this.name="SDKError",this.code=e,this.status=r,this.details=o,Error.captureStackTrace&&Error.captureStackTrace(this,n);}toJSON(){return {name:this.name,code:this.code,message:this.message,status:this.status,details:this.details}}},h=class extends g{constructor(e,t,r){super("NETWORK_ERROR",e,t,r),this.name="NetworkError";}},K=class extends g{constructor(e,t){super("VALIDATION_ERROR",e,400,t),this.name="ValidationError";}},q=class extends g{constructor(e,t,r){super("API_ERROR",e,t,r),this.name="ApiError";}};var C=class extends g{constructor(e="\uC694\uCCAD\uC774 \uC2DC\uAC04 \uCD08\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",t){super("TIMEOUT_ERROR",e,408,t),this.name="TimeoutError";}};var S=(n,e,t)=>new h(n,e,t),W=(n,e)=>new K(n,e),_=(n,e,t)=>new q(n,e,t);var V="https://01.software",X=(n,e)=>i(null,null,function*(){if(!n||!e)throw new Error("clientKey\uC640 secretKey\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");let t=new TextEncoder().encode(e);return yield new jose.SignJWT({clientKey:n}).setProtectedHeader({alg:"HS256"}).setIssuedAt().setExpirationTime("1h").sign(t)}),d=(n,e)=>i(null,null,function*(){let b=e||{},{clientKey:t,secretKey:r,timeout:o=3e4,baseUrl:s=V}=b,a=P(b,["clientKey","secretKey","timeout","baseUrl"]),p=new Headers(a.headers);if(t&&p.set("X-Client-Key",t),r&&t){let u=yield X(t,r);p.set("Authorization",`Bearer ${u}`);}!p.has("Content-Type")&&a.body&&p.set("Content-Type","application/json");let l=new AbortController,m=setTimeout(()=>l.abort(),o);try{let u=yield fetch(`${s}${n}`,y(c({},a),{headers:p,signal:l.signal}));if(clearTimeout(m),!u.ok)throw S(`HTTP ${u.status}: ${u.statusText}`,u.status,{url:n,method:a.method||"GET"});return u}catch(u){throw clearTimeout(m),u instanceof Error&&u.name==="AbortError"?new C(`\uC694\uCCAD\uC774 ${o}ms \uD6C4 \uD0C0\uC784\uC544\uC6C3\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`,{url:n,timeout:o}):u instanceof TypeError?S("\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:u.message}):u instanceof h||u instanceof C?u:S(u instanceof Error?u.message:"\uC54C \uC218 \uC5C6\uB294 \uB124\uD2B8\uC6CC\uD06C \uC5D0\uB7EC\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",void 0,{url:n,originalError:u})}});var T=class{constructor(e,t){this.api=e;this.collection=t;}find(e){return i(this,null,function*(){return this.api.requestGet(`/api/${String(this.collection)}`,e)})}findById(e,t){return i(this,null,function*(){return this.api.requestGet(`/api/${String(this.collection)}/${String(e)}`,t)})}create(e){return i(this,null,function*(){return this.api.requestPost(`/api/${String(this.collection)}`,e)})}update(e,t){return i(this,null,function*(){return this.api.requestPatch(`/api/${String(this.collection)}/${String(e)}`,t)})}remove(e){return i(this,null,function*(){return this.api.requestDelete(`/api/${String(this.collection)}/${String(e)}`)})}};var E=class{constructor(e,t,r){if(!e)throw W("clientKey\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");this.clientKey=e,this.secretKey=t,this.baseUrl=r,this.defaultOptions={clientKey:e,secretKey:t,baseUrl:r};}get(e,t){return i(this,null,function*(){let r=this.buildUrl(e,t),o=yield d(r,y(c({},this.defaultOptions),{method:"GET"}));return this.parseResponse(o)})}post(e,t,r){return i(this,null,function*(){let o=yield d(e,y(c(c({},this.defaultOptions),r),{method:"POST",body:t?JSON.stringify(t):void 0}));return this.parseResponse(o)})}patch(e,t,r){return i(this,null,function*(){let o=yield d(e,y(c(c({},this.defaultOptions),r),{method:"PATCH",body:t?JSON.stringify(t):void 0}));return this.parseResponse(o)})}delete(e,t){return i(this,null,function*(){let r=yield d(e,y(c(c({},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}parseResponse(e){return i(this,null,function*(){let t=e.headers.get("content-type");try{if(t&&t.includes("application/json")){let o=yield e.json();if(o.docs!==void 0){let s={page:o.page||1,limit:o.limit||20,totalDocs:o.totalDocs||0,totalPages:o.totalPages||0,hasNextPage:o.hasNextPage||!1,hasPrevPage:o.hasPrevPage||!1};return {data:o.docs,success:!0,pagination:s}}return {data:o,success:!0}}return {data:yield e.text(),success:!0}}catch(r){throw _("\uC751\uB2F5 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.",e.status,{contentType:t,error:r instanceof Error?r.message:r})}})}};var f=class extends E{constructor(e,t,r){super(e,t,r);}from(e){return new T(this,e)}requestGet(e,t){return this.get(e,t)}requestPost(e,t){return this.post(e,t)}requestPatch(e,t){return this.patch(e,t)}requestDelete(e){return this.delete(e)}};var Y=["brands","brand-logos","brand-og-images","brand-settings","brand-secret-keys","products","product-variants","product-options","product-categories","product-tags","product-images","orders","order-products","returns","return-products","transactions","links","link-images","playlists","playlist-images","musics","posts","post-categories","post-tags","post-images","documents","document-images","entities","entity-categories","entity-tags","entity-images","nodes","galleries","gallery-images","forms"];function j(){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 k;function J(){return reactQuery.isServer?j():(k||(k=j()),k)}var v=class{constructor(e,t){this.queryClient=e,this.collectionsApi=new f((t==null?void 0:t.brandKey)||"",t==null?void 0:t.brandSecret,t==null?void 0:t.baseUrl);}useCollection(e,t,r){let o=t;return reactQuery.useQuery({queryKey:[e,"list",o],queryFn:()=>i(this,null,function*(){return (yield this.collectionsApi.from(e).find(o)).data}),placeholderData:r!=null&&r.keepPreviousData?reactQuery.keepPreviousData:void 0})}useCollectionSingle(e,t,r){let o=t;return reactQuery.useQuery({queryKey:[e,"detail",o],queryFn:()=>i(this,null,function*(){var p;let a=yield this.collectionsApi.from(e).find(o);return a.data.length===0?null:(p=a.data[0])!=null?p:null}),placeholderData:r!=null&&r.keepPreviousData?reactQuery.keepPreviousData:void 0})}useCollectionInfinite(e,t,r){let o=t,s=[e,"list","infinite",o],a=(o==null?void 0:o.limit)||20;return reactQuery.useInfiniteQuery({queryKey:s,queryFn:l=>i(this,[l],function*({pageParam:p=1}){let m=y(c({},o),{page:p,limit:a});return (yield this.collectionsApi.from(e).find(m)).data}),initialPageParam:1,getNextPageParam:(p,l,m)=>!Array.isArray(p)||p.length<a?null:m+1,select:p=>p.pages.flatMap(l=>l),placeholderData:r!=null&&r.keepPreviousData?reactQuery.keepPreviousData:void 0})}useById(e,t,r,o){return reactQuery.useQuery({queryKey:[e,"detail",t],queryFn:()=>i(this,null,function*(){var p;return (p=(yield this.collectionsApi.from(e).findById(t,r)).data)!=null?p:null}),placeholderData:o!=null&&o.keepPreviousData?reactQuery.keepPreviousData:void 0})}prefetchCollection(e,t){return i(this,null,function*(){let r=t,o=[e,"list",r];return this.queryClient.prefetchQuery({queryKey:o,queryFn:()=>i(this,null,function*(){return (yield this.collectionsApi.from(e).find(r)).data})})})}prefetchCollectionSingle(e,t){return i(this,null,function*(){let r=t,o=[e,"detail",r];return this.queryClient.prefetchQuery({queryKey:o,queryFn:()=>i(this,null,function*(){let s=yield this.collectionsApi.from(e).find(r);return s.data.length===0?null:s.data[0]})})})}prefetchCollectionInfinite(e,t){return i(this,null,function*(){let r=t,o=[e,"list","infinite",r],s=(r==null?void 0:r.limit)||20;return this.queryClient.prefetchInfiniteQuery({queryKey:o,queryFn:p=>i(this,[p],function*({pageParam:a=1}){let l=y(c({},r),{page:a,limit:s});return (yield this.collectionsApi.from(e).find(l)).data}),initialPageParam:1,getNextPageParam:(a,p,l)=>!Array.isArray(a)||a.length<s?null:l+1,pages:2})})}prefetchById(e,t,r){return i(this,null,function*(){let o=[e,"detail",t];return this.queryClient.prefetchQuery({queryKey:o,queryFn:()=>i(this,null,function*(){var a;return (a=(yield this.collectionsApi.from(e).findById(t,r)).data)!=null?a:null})})})}invalidateQueries(e,t){let r=t?[e,t]:[e];return this.queryClient.invalidateQueries({queryKey:r})}getQueryData(e,t,...r){let o=[e,t,...r.filter(s=>s!==void 0)];return this.queryClient.getQueryData(o)}setQueryData(e,t,r,...o){let s=[e,t,...o.filter(a=>a!==void 0)];return this.queryClient.setQueryData(s,r)}};var x=class{constructor(e){var r;if(!e.clientKey)throw new Error("clientKey is required.");this.config=c({},e);let t={timestamp:Date.now(),userAgent:typeof window!="undefined"?(r=window.navigator)==null?void 0:r.userAgent:"Node.js"};this.state={metadata:t},this.fetch=d,this.queryClient=J(),this.query=new v(this.queryClient,{brandKey:this.config.clientKey,baseUrl:this.config.baseUrl}),this.collections=new f(this.config.clientKey,void 0,this.config.baseUrl);}getSettings(){return i(this,null,function*(){let{data:e}=yield 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 c({},this.state)}},ne=n=>new x(n);var Q=m=>i(null,[m],function*({paymentId:n,orderNumber:e,orderProducts:t,email:r,shippingAddress:o,totalAmount:s,secretKey:a,clientKey:p,baseUrl:l}){return (yield d("/api/orders/create",{method:"POST",baseUrl:l,clientKey:p,secretKey:a,body:JSON.stringify({paymentId:n,orderNumber:e,orderProducts:t,email:r,shippingAddress:o,totalAmount:s})})).json()});var D=s=>i(null,[s],function*({orderNumber:n,status:e,secretKey:t,clientKey:r,baseUrl:o}){return (yield d("/api/orders/update",{method:"POST",baseUrl:o,clientKey:r,secretKey:t,body:JSON.stringify({orderNumber:n,status:e})})).json()});var U=p=>i(null,[p],function*({paymentId:n,status:e,paymentMethod:t,receiptUrl:r,secretKey:o,clientKey:s,baseUrl:a}){return (yield d("/api/transactions/update",{method:"POST",baseUrl:a,clientKey:s,secretKey:o,body:JSON.stringify({paymentId:n,status:e,paymentMethod:t,receiptUrl:r})})).json()});var O=class{constructor(e){if(!e.clientKey)throw new Error("clientKey is required.");if(!e.secretKey)throw new Error("secretKey is required.");this.clientKey=e.clientKey,this.secretKey=e.secretKey,this.baseUrl=e.baseUrl;}getCommonOptions(){return {clientKey:this.clientKey,secretKey:this.secretKey,baseUrl:this.baseUrl}}createOrder(e){return Q(c(c({},e),this.getCommonOptions()))}updateOrder(e){return D(c(c({},e),this.getCommonOptions()))}updateTransaction(e){return U(c(c({},e),this.getCommonOptions()))}};var A=class{constructor(e){var r;if(!e.clientKey)throw new Error("clientKey is required.");if(!e.secretKey)throw new Error("secretKey is required.");this.config=c({},e);let t={timestamp:Date.now(),userAgent:typeof window!="undefined"?(r=window.navigator)==null?void 0:r.userAgent:"Node.js"};this.state={metadata:t},this.fetch=d,this.api=new O({clientKey:this.config.clientKey,secretKey:this.config.secretKey,baseUrl:this.config.baseUrl}),this.collections=new f(this.config.clientKey,this.config.secretKey,this.config.baseUrl);}getSettings(){return i(this,null,function*(){let{data:e}=yield 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 c({},this.state)}getConfig(){let r=this.config,{secretKey:e}=r;return P(r,["secretKey"])}},oe=n=>new A(n);function wt(n,e){return i(this,null,function*(){try{let t=yield n.json();return ie(t)?(yield e(t),new Response(JSON.stringify({success:!0,message:"Webhook processed"}),{status:200,headers:{"Content-Type":"application/json"}})):new Response(JSON.stringify({error:"Invalid webhook event format"}),{status:400,headers:{"Content-Type":"application/json"}})}catch(t){return console.error("Webhook processing error:",t),new Response(JSON.stringify({error:"Internal server error",message:t instanceof Error?t.message:"Unknown error"}),{status:500,headers:{"Content-Type":"application/json"}})}})}function ie(n){return typeof n=="object"&&n!==null&&typeof n.collection=="string"&&(n.operation==="create"||n.operation==="update")&&typeof n.data=="object"&&n.data!==null}function Pt(n,e){return t=>i(null,null,function*(){if(t.collection!==n)throw new Error(`Expected collection "${n}", got "${t.collection}"`);return e(t)})}var Rt=()=>{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 I=n=>typeof n=="number"?null:n;var kt=n=>{var t,r,o,s;let e=n.length;return e===1?((r=I((t=n==null?void 0:n[0])==null?void 0:t.product))==null?void 0:r.title)||"":`${(s=I((o=n.at(0))==null?void 0:o.product))==null?void 0:s.title} \uC678 ${e-1}\uAC74`};function It({data:n,className:e,internalDocToHref:t,blocks:r}){return se__default.default.createElement(react.RichText,{data:n,className:e,converters:y(c(c({},react.defaultJSXConverters),react.LinkJSXConverter({internalDocToHref:t})),{blocks:r||void 0})})}
|
|
2
|
+
exports.ApiClient=O;exports.BrowserClient=x;exports.COLLECTIONS=Y;exports.CollectionQueryBuilder=T;exports.CollectionsApi=f;exports.RichTextContent=It;exports.ServerClient=A;exports.UnifiedQueryClient=v;exports.createBrowserClient=ne;exports.createOrder=Q;exports.createServerClient=oe;exports.createTypedWebhookHandler=Pt;exports.formatOrderName=kt;exports.generateOrderNumber=Rt;exports.getQueryClient=J;exports.handleWebhook=wt;exports.isValidWebhookEvent=ie;exports.objectFor=I;exports.updateOrder=D;exports.updateTransaction=U;//# sourceMappingURL=index.cjs.map
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/internal/errors/index.ts","../src/core/internal/utils/index.ts","../src/core/collection/query-builder.ts","../src/core/collection/base.ts","../src/core/collection/collections-api.ts","../src/core/query/get-query-client.ts","../src/core/query/UnifiedQuery.ts","../src/core/client/client.ts","../src/core/api/createOrder.ts","../src/core/api/updateOrder.ts","../src/core/api/updateTransaction.ts","../src/core/api/api-client.ts","../src/core/client/client.server.ts","../src/utils/order/generateOrderNumber.ts","../src/utils/types.ts","../src/utils/order/formatOrderName.ts","../src/components/RichTextContent/index.tsx"],"names":["SDKError","_SDKError","code","message","status","details","NetworkError","ValidationError","ApiError","TimeoutError","createNetworkError","createValidationError","createApiError","API_URL","createServerToken","clientKey","secretKey","__async","secret","SignJWT","_fetch","url","options","_a","timeout","baseUrl","requestInit","__objRest","headers","token","controller","timeoutId","response","__spreadProps","__spreadValues","error","CollectionQueryBuilder","api","collection","id","data","BaseApiClient","endpoint","queryString","stringify","contentType","jsonData","pagination","CollectionsApi","makeQueryClient","QueryClient","query","defaultShouldDehydrateQuery","_","browserQueryClient","getQueryClient","isServer","UnifiedQueryClient","queryClient","queryOptions","reactQueryOptions","useQuery","keepPreviousData","queryKey","pageSize","useInfiniteQuery","_0","pageParam","queryOpts","lastPage","pages","lastPageParams","page","allPages","operation","params","p","BrowserClient","metadata","createBrowserClient","createOrder","paymentId","orderNumber","orderProducts","email","shippingAddress","totalAmount","updateOrder","updateTransaction","paymentMethod","receiptUrl","ApiClient","ServerClient","createServerClient","generateOrderNumber","year","month","day","random","objectFor","formatOrderName","_b","_c","_d","optionLength","RichTextContent","className","internalDocToHref","blocks","React","RichText","defaultJSXConverters","LinkJSXConverter"],"mappings":"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","file":"index.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'\nimport { SignJWT } from 'jose'\n\nconst API_URL = 'https://01.software'\n\n/**\n * 서버 사이드 JWT 토큰 생성 함수\n *\n * clientKey와 secretKey를 사용하여 JWT 토큰을 생성합니다.\n * 토큰은 1시간 동안 유효합니다.\n *\n * @param clientKey - 클라이언트 키\n * @param secretKey - 시크릿 키 (서명에 사용)\n * @returns Promise<string> JWT 토큰\n *\n * @example\n * ```typescript\n * const token = await createServerToken('client-key', 'secret-key')\n * ```\n */\nexport const createServerToken = async (\n clientKey: string,\n secretKey: string,\n): Promise<string> => {\n if (!clientKey || !secretKey) {\n throw new Error('clientKey와 secretKey는 필수입니다.')\n }\n\n const secret = new TextEncoder().encode(secretKey)\n\n const token = await new SignJWT({ clientKey })\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuedAt()\n .setExpirationTime('1h')\n .sign(secret)\n\n return token\n}\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 /** 기본 API URL (기본값: https://01.software) */\n baseUrl?: string\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 (\n url: string,\n options?: FetchOptions,\n): Promise<Response> => {\n const {\n clientKey,\n secretKey,\n timeout = 30000,\n baseUrl = API_URL,\n ...requestInit\n } = options || {}\n\n // 헤더 설정\n const headers = new Headers(requestInit.headers)\n\n if (clientKey) {\n headers.set('X-Client-Key', clientKey)\n }\n\n // secretKey가 있으면 JWT 토큰을 생성하여 Authorization 헤더로 전송\n if (secretKey && clientKey) {\n const token = await createServerToken(clientKey, secretKey)\n headers.set('Authorization', `Bearer ${token}`)\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(`${baseUrl}${url}`, {\n ...requestInit,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // HTTP 에러 상태 체크\n if (!response.ok) {\n throw createNetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n {\n url,\n method: requestInit.method || 'GET',\n },\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 후 타임아웃되었습니다.`, {\n url,\n timeout,\n })\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\n ? error.message\n : '알 수 없는 네트워크 에러가 발생했습니다.',\n undefined,\n { url, originalError: error },\n )\n }\n}\n","/**\n * 컬렉션 쿼리 빌더\n *\n * 타입 안전한 컬렉션 쿼리 빌더를 제공합니다.\n */\n\nimport { ApiQueryOptions, ApiResponse, Collection } from '../client/types'\nimport { CollectionsApi } from './collections-api'\nimport type { CollectionType } from './types'\n\n/**\n * 타입 안전한 컬렉션 쿼리 빌더\n *\n * 특정 컬렉션 타입에 대한 정확한 타입 추론을 제공합니다.\n *\n * @template T - 선택된 컬렉션 타입\n *\n * @example\n * ```typescript\n * const builder = api.from('products')\n * // builder의 모든 메서드는 Product 타입을 반환\n *\n * const products = await builder.find() // Product[]\n * const product = await builder.findById('123') // Product\n * ```\n */\nexport class CollectionQueryBuilder<T extends Collection> {\n constructor(\n private api: CollectionsApi,\n private collection: T,\n ) {}\n\n /**\n * 컬렉션 목록 조회\n *\n * @param options - 쿼리 옵션 (선택)\n * @returns Promise<ApiResponse<CollectionType<T>[]>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').find({ page: 1, limit: 20 })\n * // data는 Product[] 타입\n * ```\n */\n async find(\n options?: ApiQueryOptions,\n ): Promise<ApiResponse<CollectionType<T>[]>> {\n return this.api.requestGet<CollectionType<T>[]>(\n `/api/${String(this.collection)}`,\n options,\n ) as Promise<ApiResponse<CollectionType<T>[]>>\n }\n\n /**\n * ID로 특정 문서 조회\n *\n * @param id - 문서 ID\n * @param options - 쿼리 옵션 (선택)\n * @returns Promise<ApiResponse<CollectionType<T>>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').findById('123')\n * // data는 Product 타입\n * ```\n */\n async findById(\n id: number | string,\n options?: ApiQueryOptions,\n ): Promise<ApiResponse<CollectionType<T>>> {\n return this.api.requestGet<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n options,\n ) as Promise<ApiResponse<CollectionType<T>>>\n }\n\n /**\n * 문서 생성\n *\n * @param data - 생성할 문서 데이터\n * @returns Promise<ApiResponse<CollectionType<T>>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').create({ title: '새 제품' })\n * // data는 Product 타입\n * ```\n */\n async create(\n data: Partial<CollectionType<T>>,\n ): Promise<ApiResponse<CollectionType<T>>> {\n return this.api.requestPost<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n data,\n ) as Promise<ApiResponse<CollectionType<T>>>\n }\n\n /**\n * 문서 업데이트\n *\n * @param id - 문서 ID\n * @param data - 업데이트할 문서 데이터\n * @returns Promise<ApiResponse<CollectionType<T>>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').update('123', { title: '수정된 제품' })\n * // data는 Product 타입\n * ```\n */\n async update(\n id: number | string,\n data: Partial<CollectionType<T>>,\n ): Promise<ApiResponse<CollectionType<T>>> {\n return this.api.requestPatch<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n data,\n ) as Promise<ApiResponse<CollectionType<T>>>\n }\n\n /**\n * 문서 삭제\n *\n * @param id - 문서 ID\n * @returns Promise<ApiResponse<void>>\n *\n * @example\n * ```typescript\n * await api.from('products').remove('123')\n * ```\n */\n async remove(id: number | string): Promise<ApiResponse<void>> {\n return this.api.requestDelete<void>(\n `/api/${String(this.collection)}/${String(id)}`,\n )\n }\n}\n","/**\n * API 클라이언트 기본 클래스\n *\n * 모든 API 클라이언트의 베이스 클래스로, 공통적인 HTTP 메서드들과\n * 에러 처리, 응답 파싱 기능을 제공합니다.\n */\n\nimport { stringify } from 'qs-esm'\nimport { _fetch, FetchOptions } from '../internal/utils'\nimport { ApiResponse, PaginationMeta, ApiQueryOptions } from '../client/types'\nimport { createApiError, createValidationError } from '../internal/errors'\n\n/**\n * API 클라이언트 기본 클래스\n *\n * @class BaseApiClient\n */\nexport class BaseApiClient {\n protected clientKey: string\n protected secretKey?: string\n protected baseUrl?: string\n protected defaultOptions: FetchOptions\n\n /**\n * BaseApiClient 생성자\n *\n * @param clientKey - 클라이언트 키 (필수)\n * @param secretKey - 시크릿 키 (선택, 서버 사이드에서만 사용)\n * @param baseUrl - 기본 API URL (선택, 기본값: https://01.software)\n *\n * @example\n * ```typescript\n * const client = new BaseApiClient('your-client-key', 'your-secret-key')\n * ```\n */\n constructor(clientKey: string, secretKey?: string, baseUrl?: string) {\n if (!clientKey) {\n throw createValidationError('clientKey는 필수입니다.')\n }\n\n this.clientKey = clientKey\n this.secretKey = secretKey\n this.baseUrl = baseUrl\n this.defaultOptions = {\n clientKey,\n secretKey,\n baseUrl,\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>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): 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 * 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?: ApiQueryOptions): string {\n if (!options) return endpoint\n\n const queryString = stringify(options, { addQueryPrefix: true })\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>(\n response: Response,\n ): 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 * 컬렉션 API 클라이언트\n *\n * BaseApiClient를 상속하여 기본 HTTP 메서드를 사용하고,\n * Supabase 스타일의 쿼리 빌더를 제공합니다.\n */\n\nimport { BaseApiClient } from './base'\nimport { ApiQueryOptions, ApiResponse, Collection } from '../client/types'\nimport { CollectionQueryBuilder } from './query-builder'\n\n/**\n * 통합 컬렉션 API 클라이언트\n *\n * BaseApiClient를 상속하여 기본 HTTP 메서드를 사용하고,\n * Supabase 스타일의 쿼리 빌더를 제공합니다.\n *\n * @example\n * ```typescript\n * const api = new CollectionsApi('client-key', 'secret-key')\n *\n * // 목록 조회 - Product[] 타입 반환\n * const { data: products } = await api.from('products').find({ page: 1 })\n *\n * // 단일 조회 - Product 타입 반환\n * const { data: product } = await api.from('products').findById('123')\n *\n * // 생성 - Product 타입 반환\n * const { data: newProduct } = await api.from('products').create({ title: '새 제품' })\n *\n * // 업데이트 - Product 타입 반환\n * const { data: updated } = await api.from('products').update('123', { title: '수정된 제품' })\n *\n * // 삭제\n * await api.from('products').remove('123')\n * ```\n */\nexport class CollectionsApi extends BaseApiClient {\n constructor(clientKey: string, secretKey?: string, baseUrl?: string) {\n super(clientKey, secretKey, baseUrl)\n }\n\n /**\n * 컬렉션 선택\n * 선택한 컬렉션 타입에 맞는 타입 안전한 빌더를 반환합니다.\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns 타입 안전한 컬렉션 쿼리 빌더\n *\n * @example\n * ```typescript\n * // 'products'를 선택하면 Product 타입이 반환됨\n * const builder = api.from('products')\n * const { data } = await builder.findById('123') // data는 Product 타입\n *\n * // 'orders'를 선택하면 Order 타입이 반환됨\n * const { data: orders } = await api.from('orders').find() // orders는 Order[] 타입\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return new CollectionQueryBuilder(this, collection)\n }\n\n /**\n * GET 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param options - 쿼리 옵션\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestGet<T = any>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<ApiResponse<T>> {\n return this.get<T>(endpoint, options)\n }\n\n /**\n * POST 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestPost<T = any>(endpoint: string, data?: any): Promise<ApiResponse<T>> {\n return this.post<T>(endpoint, data)\n }\n\n /**\n * PATCH 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestPatch<T = any>(endpoint: string, data?: any): Promise<ApiResponse<T>> {\n return this.patch<T>(endpoint, data)\n }\n\n /**\n * DELETE 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestDelete<T = any>(endpoint: string): Promise<ApiResponse<T>> {\n return this.delete<T>(endpoint)\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","import {\n QueryClient,\n useQuery,\n useInfiniteQuery,\n UseQueryOptions,\n keepPreviousData,\n} from '@tanstack/react-query'\nimport {\n Collection,\n ApiQueryOptions,\n ApiQueryReactOptions,\n} from '../client/types'\nimport { CollectionsApi, CollectionType } from '../collection'\n\nexport interface UnifiedQueryOptions {\n brandKey?: string\n brandSecret?: string\n baseUrl?: string\n}\n\n/**\n * 통합 쿼리 클라이언트\n * React Query를 사용한 데이터 페칭 및 캐싱 관리\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 options?.baseUrl,\n )\n }\n\n // ===== Query Hooks =====\n\n /**\n * 컬렉션 리스트 조회 훅\n * @example const { data } = useCollection('products', { where: { status: 'published' } })\n */\n useCollection<T extends Collection>(\n collection: T,\n queryOptions?: ApiQueryOptions,\n reactQueryOptions?: ApiQueryReactOptions,\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\n .from(collection)\n .find(options)\n return response.data\n },\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n /**\n * 컬렉션 단일 항목 조회 훅\n * @example const { data } = useCollectionSingle('products', { where: { featured: true } })\n */\n useCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'limit'>,\n reactQueryOptions?: ApiQueryReactOptions,\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\n .from(collection)\n .find(options)\n if (response.data.length === 0) return null\n return response.data[0] ?? null\n },\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n /**\n * 컬렉션 무한 스크롤 조회 훅\n * @example const { data, fetchNextPage } = useCollectionInfinite('products', { limit: 20 })\n */\n useCollectionInfinite<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'page'>,\n reactQueryOptions?: ApiQueryReactOptions,\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\n .from(collection)\n .find(queryOpts)\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: CollectionType<T>[],\n pages: CollectionType<T>[][],\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n select: (data) => data.pages.flatMap((page) => page),\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n /**\n * ID로 특정 항목 조회 훅\n * @example const { data } = useById('products', '123')\n */\n useById<T extends Collection>(\n collection: T,\n id: string | number,\n queryOptions?: ApiQueryOptions,\n reactQueryOptions?: ApiQueryReactOptions,\n ) {\n const queryKey = [collection, 'detail', id]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .findById(id, queryOptions)\n return response.data ?? null\n },\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n // ===== Prefetch Methods =====\n\n /**\n * 컬렉션 리스트 프리페치 (useCollection에 대응)\n * @example await client.query.prefetchCollection('products', { where: { status: 'published' } })\n */\n async prefetchCollection<T extends Collection>(\n collection: T,\n queryOptions?: ApiQueryOptions,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', options]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .find(options)\n return response.data\n },\n })\n }\n\n /**\n * 컬렉션 단일 항목 프리페치 (useCollectionSingle에 대응)\n * @example await client.query.prefetchCollectionSingle('products', { where: { featured: true } })\n */\n async prefetchCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'limit'>,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'detail', options]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .find(options)\n if (response.data.length === 0) return null\n return response.data[0]\n },\n })\n }\n\n /**\n * 컬렉션 무한 쿼리 프리페치 (useCollectionInfinite에 대응)\n * @example await client.query.prefetchCollectionInfinite('products', { limit: 20 })\n */\n async prefetchCollectionInfinite<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'page'>,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', 'infinite', options]\n const pageSize = options?.limit || 20\n\n return this.queryClient.prefetchInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const queryOpts = { ...options, page: pageParam, limit: pageSize }\n const response = await this.collectionsApi\n .from(collection)\n .find(queryOpts)\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: CollectionType<T>[],\n allPages: CollectionType<T>[][],\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 * ID로 특정 항목 프리페치 (useById에 대응)\n * @example await client.query.prefetchById('products', '123')\n */\n async prefetchById<T extends Collection>(\n collection: T,\n id: string | number,\n queryOptions?: ApiQueryOptions,\n ) {\n const queryKey = [collection, 'detail', id]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .findById(id, queryOptions)\n return response.data ?? null\n },\n })\n }\n\n /**\n * 캐시 조작 메서드들\n */\n\n /**\n * 쿼리 무효화\n * @example client.invalidateQueries('products') // 모든 products 쿼리 무효화\n * @example client.invalidateQueries('products', 'list') // products list 쿼리만 무효화\n */\n invalidateQueries(collection: Collection, operation?: string) {\n const queryKey = operation ? [collection, operation] : [collection]\n return this.queryClient.invalidateQueries({ queryKey })\n }\n\n /**\n * 쿼리 데이터 조회\n * @example const data = client.getQueryData('products', 'list')\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 /**\n * 쿼리 데이터 설정\n * @example client.setQueryData('products', 'list', newData)\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 { QueryClient } from '@tanstack/react-query'\nimport { _fetch } from '../internal/utils'\nimport { Config } from '../../payload-types'\nimport {\n CollectionsApi,\n CollectionsApi as CollectionsApiClass,\n CollectionQueryBuilder,\n} from '../collection'\nimport { getQueryClient } from '../query/get-query-client'\nimport { UnifiedQueryClient } from '../query/UnifiedQuery'\nimport {\n ClientBrowserConfig,\n ClientState,\n ClientMetadata,\n Collection,\n} from './types'\n\n/**\n * 브라우저 클라이언트\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\n /** 클라이언트 설정 */\n protected config: ClientBrowserConfig\n\n /** Fetch 함수 인스턴스 */\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: ClientBrowserConfig) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n\n this.config = { ...options }\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = { metadata }\n this.fetch = _fetch\n this.queryClient = getQueryClient()\n\n this.query = new UnifiedQueryClient(this.queryClient, {\n brandKey: this.config.clientKey,\n baseUrl: this.config.baseUrl,\n })\n\n this.collections = new CollectionsApi(\n this.config.clientKey,\n undefined,\n this.config.baseUrl,\n )\n }\n\n /**\n * 현재 브랜드의 설정을 조회합니다.\n *\n * 클라이언트 키와 일치하는 브랜드 설정을 반환합니다.\n *\n * @returns 브랜드 설정 객체 또는 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에 대한 쿼리 빌더를 생성합니다.\n *\n * Supabase 스타일의 메서드 체이닝을 제공하며,\n * 선택한 컬렉션 타입에 맞는 정확한 타입 추론을 제공합니다.\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns 타입 안전한 컬렉션 쿼리 빌더\n *\n * @example\n * ```typescript\n * // 제품 목록 조회 - Product[] 타입 반환\n * const { data: products } = await client.from('products').find({\n * where: { status: 'published' },\n * limit: 10\n * })\n * // products는 Product[] 타입\n *\n * // 특정 제품 조회 - Product 타입 반환\n * const { data: product } = await client.from('products').findById('123')\n * // product는 Product 타입\n *\n * // 제품 생성 - Product 타입 반환\n * const { data: newProduct } = await client.from('products').create({\n * title: '새 제품',\n * price: 10000\n * })\n * // newProduct는 Product 타입\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n /**\n * 클라이언트의 현재 상태를 반환합니다.\n *\n * @returns 클라이언트 상태의 복사본\n */\n getState(): ClientState {\n return { ...this.state }\n }\n}\n\n/**\n * BrowserClient 인스턴스를 생성하는 헬퍼 함수\n *\n * @param options - 클라이언트 설정 옵션\n * @returns BrowserClient 인스턴스\n *\n * @example\n * ```typescript\n * import { createBrowserClient } from '@01.software/sdk'\n *\n * export const client = createBrowserClient({\n * clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n * })\n * ```\n */\nexport const createBrowserClient = (\n options: ClientBrowserConfig,\n): BrowserClient => {\n return new BrowserClient(options)\n}\n","'use server'\n\nimport type { Order, OrderProduct } from '../../payload-types'\nimport { _fetch } from '../internal/utils'\nimport type { ApiClientOptions } from './types'\n\n/**\n * 주문 생성 파라미터\n */\nexport type CreateOrderParams = {\n /** 결제 ID */\n paymentId: string\n /** 주문 번호 */\n orderNumber: string\n /** 고객 이메일 */\n email: string\n /** 배송 주소 */\n shippingAddress: Order['shippingAddress']\n /** 주문 상품 목록 */\n orderProducts: Omit<\n OrderProduct,\n 'id' | 'brand' | 'createdAt' | 'updatedAt' | 'order' | 'status'\n >[]\n /** 총 주문 금액 */\n totalAmount: number\n}\n\n/**\n * 주문을 생성합니다.\n *\n * @param params - 주문 생성 파라미터 및 클라이언트 옵션\n * @returns 생성된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await createOrder({\n * paymentId: 'pay_123',\n * orderNumber: 'ORD-001',\n * email: 'user@example.com',\n * orderProducts: [...],\n * totalAmount: 10000,\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n * ```\n */\nexport const createOrder = async ({\n paymentId,\n orderNumber,\n orderProducts,\n email,\n shippingAddress,\n totalAmount,\n secretKey,\n clientKey,\n baseUrl,\n}: CreateOrderParams & ApiClientOptions): Promise<Order> => {\n const response = await _fetch('/api/orders/create', {\n method: 'POST',\n baseUrl,\n clientKey,\n secretKey,\n body: JSON.stringify({\n paymentId,\n orderNumber,\n orderProducts,\n email,\n shippingAddress,\n totalAmount,\n }),\n })\n\n return response.json()\n}\n","'use server'\n\nimport type { Order } from '../../payload-types'\nimport { _fetch } from '../internal/utils'\nimport type { ApiClientOptions } from './types'\n\n/**\n * 주문 업데이트 파라미터\n */\nexport type UpdateOrderParams = {\n /** 주문 번호 */\n orderNumber: string\n /** 주문 상태 */\n status: Order['status']\n}\n\n/**\n * 주문을 업데이트합니다.\n *\n * @param params - 주문 업데이트 파라미터 및 클라이언트 옵션\n * @returns 업데이트된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await updateOrder({\n * orderNumber: 'ORD-001',\n * status: 'completed',\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n * ```\n */\nexport const updateOrder = async ({\n orderNumber,\n status,\n secretKey,\n clientKey,\n baseUrl,\n}: UpdateOrderParams & ApiClientOptions): Promise<Order> => {\n const response = await _fetch('/api/orders/update', {\n method: 'POST',\n baseUrl,\n clientKey,\n secretKey,\n body: JSON.stringify({\n orderNumber,\n status,\n }),\n })\n\n return response.json()\n}\n","'use server'\n\nimport type { Transaction } from '../../payload-types'\nimport { _fetch } from '../internal/utils'\nimport type { ApiClientOptions } from './types'\n\n/**\n * 트랜잭션 업데이트 파라미터\n */\nexport type UpdateTransactionParams = {\n /** 결제 ID */\n paymentId: string\n /** 트랜잭션 상태 */\n status: Transaction['status']\n /** 결제 방법 */\n paymentMethod: Transaction['paymentMethod']\n /** 영수증 URL */\n receiptUrl: Transaction['receiptUrl']\n}\n\n/**\n * 트랜잭션을 업데이트합니다.\n *\n * @param params - 트랜잭션 업데이트 파라미터 및 클라이언트 옵션\n * @returns 업데이트된 트랜잭션 객체\n *\n * @example\n * ```typescript\n * const transaction = await updateTransaction({\n * paymentId: 'pay_123',\n * status: 'completed',\n * paymentMethod: 'card',\n * receiptUrl: 'https://receipt.example.com/123',\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n * ```\n */\nexport const updateTransaction = async ({\n paymentId,\n status,\n paymentMethod,\n receiptUrl,\n secretKey,\n clientKey,\n baseUrl,\n}: UpdateTransactionParams & ApiClientOptions): Promise<Transaction> => {\n const response = await _fetch('/api/transactions/update', {\n method: 'POST',\n baseUrl,\n clientKey,\n secretKey,\n body: JSON.stringify({\n paymentId,\n status,\n paymentMethod,\n receiptUrl,\n }),\n })\n\n return response.json()\n}\n","/**\n * API 클라이언트\n *\n * 주문 및 트랜잭션 관련 API 메서드를 제공하는 클라이언트입니다.\n */\n\nimport { createOrder, type CreateOrderParams } from './createOrder'\nimport { updateOrder, type UpdateOrderParams } from './updateOrder'\nimport {\n updateTransaction,\n type UpdateTransactionParams,\n} from './updateTransaction'\nimport type { ApiClientOptions } from './types'\n\n/**\n * API 클라이언트\n *\n * 주문 및 트랜잭션 관련 API 메서드를 제공하는 클라이언트입니다.\n * 서버 사이드에서만 사용해야 합니다.\n *\n * @example\n * ```typescript\n * const apiClient = new ApiClient({\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key',\n * baseUrl: 'https://api.example.com'\n * })\n *\n * const order = await apiClient.createOrder({ ... })\n * ```\n */\nexport class ApiClient {\n private readonly clientKey: string\n private readonly secretKey: string\n private readonly baseUrl?: string\n\n constructor(options: ApiClientOptions) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n if (!options.secretKey) {\n throw new Error('secretKey is required.')\n }\n\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n this.baseUrl = options.baseUrl\n }\n\n /**\n * 공통 옵션을 생성합니다.\n *\n * @private\n */\n private getCommonOptions(): ApiClientOptions {\n return {\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n baseUrl: this.baseUrl,\n }\n }\n\n /**\n * 주문을 생성합니다.\n *\n * @param params - 주문 생성 파라미터\n * @returns 생성된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await apiClient.createOrder({\n * paymentId: 'pay_123',\n * orderNumber: 'ORD-001',\n * email: 'user@example.com',\n * orderProducts: [...],\n * totalAmount: 10000\n * })\n * ```\n */\n createOrder(params: CreateOrderParams) {\n return createOrder({\n ...params,\n ...this.getCommonOptions(),\n })\n }\n\n /**\n * 주문을 업데이트합니다.\n *\n * @param params - 주문 업데이트 파라미터\n * @returns 업데이트된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await apiClient.updateOrder({\n * paymentId: 'pay_123',\n * status: 'completed'\n * })\n * ```\n */\n updateOrder(params: UpdateOrderParams) {\n return updateOrder({\n ...params,\n ...this.getCommonOptions(),\n })\n }\n\n /**\n * 트랜잭션을 업데이트합니다.\n *\n * @param params - 트랜잭션 업데이트 파라미터\n * @returns 업데이트된 트랜잭션 객체\n *\n * @example\n * ```typescript\n * const transaction = await apiClient.updateTransaction({\n * paymentId: 'pay_123',\n * status: 'completed',\n * paymentMethod: 'card',\n * receiptUrl: 'https://receipt.example.com/123'\n * })\n * ```\n */\n updateTransaction(params: UpdateTransactionParams) {\n return updateTransaction({\n ...params,\n ...this.getCommonOptions(),\n })\n }\n}\n","import { _fetch } from '../internal/utils'\nimport { Config } from '../../payload-types'\nimport { ApiClient } from '../api'\nimport {\n CollectionsApi,\n CollectionsApi as CollectionsApiClass,\n CollectionQueryBuilder,\n} from '../collection'\nimport {\n ClientServerConfig,\n ClientState,\n ClientMetadata,\n Collection,\n} from './types'\n\n/**\n * 서버 클라이언트\n *\n * Supabase Client와 유사한 구조로 설계된 통합 클라이언트입니다.\n * 서버 환경에서 API 호출과 컬렉션 관리를 제공합니다.\n * 시크릿 키를 사용하여 인증된 요청을 수행할 수 있습니다.\n *\n * @template _Database - 데이터베이스 스키마 타입 (기본값: Config)\n *\n * @example\n * ```typescript\n * import { createServerClient } from '@01.software/sdk'\n *\n * const client = createServerClient({\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n *\n * // 제품 목록 조회\n * const products = await client.from('products').find()\n * ```\n */\nexport default class ServerClient<_Database = Config> {\n /**\n * API 클라이언트\n *\n * REST API 호출을 위한 메서드들을 제공합니다.\n */\n api: ApiClient\n\n /**\n * 범용 컬렉션 API 클라이언트\n *\n * Supabase 스타일의 쿼리 빌더를 제공합니다.\n * 모든 컬렉션에 대한 CRUD 작업을 지원합니다.\n */\n collections: CollectionsApiClass\n\n /** 클라이언트 내부 상태 */\n protected state: ClientState\n\n /** 클라이언트 설정 */\n protected config: ClientServerConfig\n\n /** Fetch 함수 인스턴스 */\n protected fetch: typeof _fetch\n\n /**\n * ServerClient 인스턴스를 생성합니다.\n *\n * @param options - 클라이언트 설정 옵션\n * @throws {Error} clientKey 또는 secretKey가 제공되지 않은 경우\n *\n * @example\n * ```typescript\n * const client = new ServerClient({\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key',\n * baseUrl: 'https://api.example.com'\n * })\n * ```\n */\n constructor(options: ClientServerConfig) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n if (!options.secretKey) {\n throw new Error('secretKey is required.')\n }\n\n this.config = { ...options }\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = { metadata }\n this.fetch = _fetch\n\n this.api = new ApiClient({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.config.baseUrl,\n })\n\n this.collections = new CollectionsApi(\n this.config.clientKey,\n this.config.secretKey,\n this.config.baseUrl,\n )\n }\n\n /**\n * 현재 브랜드의 설정을 조회합니다.\n *\n * 클라이언트 키와 일치하는 브랜드 설정을 반환합니다.\n *\n * @returns 브랜드 설정 객체 또는 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에 대한 쿼리 빌더를 생성합니다.\n *\n * Supabase 스타일의 메서드 체이닝을 제공하며,\n * 선택한 컬렉션 타입에 맞는 정확한 타입 추론을 제공합니다.\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns 타입 안전한 컬렉션 쿼리 빌더\n *\n * @example\n * ```typescript\n * // 제품 목록 조회 - Product[] 타입 반환\n * const { data: products } = await client.from('products').find()\n * // products는 Product[] 타입\n *\n * // 특정 제품 조회 - Product 타입 반환\n * const { data: product } = await client.from('products').findById('123')\n * // product는 Product 타입\n *\n * // 제품 생성 - Product 타입 반환\n * const { data: newProduct } = await client.from('products').create({\n * title: '새 제품'\n * })\n * // newProduct는 Product 타입\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n /**\n * 클라이언트의 현재 상태를 반환합니다.\n *\n * @returns 클라이언트 상태의 복사본\n */\n getState(): ClientState {\n return { ...this.state }\n }\n\n /**\n * 클라이언트 설정을 반환합니다.\n *\n * 보안을 위해 시크릿 키는 제외하고 반환합니다.\n *\n * @returns 시크릿 키가 제외된 클라이언트 설정\n */\n getConfig(): ClientServerConfig {\n const { secretKey: _, ...safeConfig } = this.config\n return safeConfig as ClientServerConfig\n }\n}\n\n/**\n * ServerClient 인스턴스를 생성하는 헬퍼 함수\n *\n * @param options - 클라이언트 설정 옵션\n * @returns ServerClient 인스턴스\n *\n * @example\n * ```typescript\n * import { createServerClient } from '@01.software/sdk'\n *\n * export const client = createServerClient({\n * clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n * secretKey: process.env.SOFTWARE_SECRET_KEY!,\n * })\n * ```\n */\nexport const createServerClient = (\n options: ClientServerConfig,\n): 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 { ProductOption } from '../../payload-types'\nimport { objectFor } from '../types'\n\nexport const formatOrderName = (options: ProductOption[]) => {\n const optionLength = options.length\n\n return optionLength === 1\n ? objectFor(options?.[0]?.product)?.title || ''\n : `${objectFor(options.at(0)?.product)?.title} 외 ${optionLength - 1}건`\n}\n","'use client'\n\nimport React from 'react'\nimport {\n SerializedBlockNode,\n SerializedLinkNode,\n} from '@payloadcms/richtext-lexical'\nimport {\n SerializedEditorState,\n SerializedLexicalNode,\n} from '@payloadcms/richtext-lexical/lexical'\nimport {\n defaultJSXConverters,\n JSXConverter,\n LinkJSXConverter,\n RichText,\n} from '@payloadcms/richtext-lexical/react'\n\nexport type RichTextData = SerializedEditorState<SerializedLexicalNode>\n\nexport interface RichTextContentProps {\n data: RichTextData\n className?: string\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n blocks?: {\n Iframe?: JSXConverter<\n SerializedBlockNode<{\n blockName?: string | null\n blockType: string\n url: string\n }>\n >\n Player?: JSXConverter<\n SerializedBlockNode<{\n blockName?: string | null\n blockType: string\n url: string\n }>\n >\n }\n}\n\nexport function RichTextContent({\n data,\n className,\n internalDocToHref,\n blocks,\n}: RichTextContentProps) {\n return (\n <RichText\n data={data}\n className={className}\n converters={{\n ...defaultJSXConverters,\n ...LinkJSXConverter({\n internalDocToHref,\n }),\n blocks: blocks\n ? (blocks as Record<\n string,\n JSXConverter<\n SerializedBlockNode<{\n blockName?: string | null\n blockType: string\n }>\n >\n >)\n : undefined,\n }}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/internal/errors/index.ts","../src/core/internal/utils/index.ts","../src/core/collection/query-builder.ts","../src/core/collection/base.ts","../src/core/collection/collections-api.ts","../src/core/collection/const.ts","../src/core/query/get-query-client.ts","../src/core/query/UnifiedQuery.ts","../src/core/client/client.ts","../src/core/api/createOrder.ts","../src/core/api/updateOrder.ts","../src/core/api/updateTransaction.ts","../src/core/api/api-client.ts","../src/core/client/client.server.ts","../src/core/webhook/index.tsx","../src/utils/order/generateOrderNumber.ts","../src/utils/types.ts","../src/utils/order/formatOrderName.ts","../src/components/RichTextContent/index.tsx"],"names":["SDKError","_SDKError","code","message","status","details","NetworkError","ValidationError","ApiError","TimeoutError","createNetworkError","createValidationError","createApiError","API_URL","createServerToken","clientKey","secretKey","__async","secret","SignJWT","_fetch","url","options","_a","timeout","baseUrl","requestInit","__objRest","headers","token","controller","timeoutId","response","__spreadProps","__spreadValues","error","CollectionQueryBuilder","api","collection","id","data","BaseApiClient","endpoint","queryString","stringify","contentType","jsonData","pagination","CollectionsApi","COLLECTIONS","makeQueryClient","QueryClient","query","defaultShouldDehydrateQuery","_","browserQueryClient","getQueryClient","isServer","UnifiedQueryClient","queryClient","queryOptions","reactQueryOptions","useQuery","keepPreviousData","queryKey","pageSize","useInfiniteQuery","_0","pageParam","queryOpts","lastPage","pages","lastPageParams","page","allPages","operation","params","p","BrowserClient","metadata","createBrowserClient","createOrder","paymentId","orderNumber","orderProducts","email","shippingAddress","totalAmount","updateOrder","updateTransaction","paymentMethod","receiptUrl","ApiClient","ServerClient","createServerClient","handleWebhook","request","handler","body","isValidWebhookEvent","createTypedWebhookHandler","event","generateOrderNumber","year","month","day","random","objectFor","formatOrderName","_b","_c","_d","optionLength","RichTextContent","className","internalDocToHref","blocks","React","RichText","defaultJSXConverters","LinkJSXConverter"],"mappings":"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","file":"index.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'\nimport { SignJWT } from 'jose'\n\nconst API_URL = 'https://01.software'\n\n/**\n * 서버 사이드 JWT 토큰 생성 함수\n *\n * clientKey와 secretKey를 사용하여 JWT 토큰을 생성합니다.\n * 토큰은 1시간 동안 유효합니다.\n *\n * @param clientKey - 클라이언트 키\n * @param secretKey - 시크릿 키 (서명에 사용)\n * @returns Promise<string> JWT 토큰\n *\n * @example\n * ```typescript\n * const token = await createServerToken('client-key', 'secret-key')\n * ```\n */\nexport const createServerToken = async (\n clientKey: string,\n secretKey: string,\n): Promise<string> => {\n if (!clientKey || !secretKey) {\n throw new Error('clientKey와 secretKey는 필수입니다.')\n }\n\n const secret = new TextEncoder().encode(secretKey)\n\n const token = await new SignJWT({ clientKey })\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuedAt()\n .setExpirationTime('1h')\n .sign(secret)\n\n return token\n}\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 /** 기본 API URL (기본값: https://01.software) */\n baseUrl?: string\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 (\n url: string,\n options?: FetchOptions,\n): Promise<Response> => {\n const {\n clientKey,\n secretKey,\n timeout = 30000,\n baseUrl = API_URL,\n ...requestInit\n } = options || {}\n\n // 헤더 설정\n const headers = new Headers(requestInit.headers)\n\n if (clientKey) {\n headers.set('X-Client-Key', clientKey)\n }\n\n // secretKey가 있으면 JWT 토큰을 생성하여 Authorization 헤더로 전송\n if (secretKey && clientKey) {\n const token = await createServerToken(clientKey, secretKey)\n headers.set('Authorization', `Bearer ${token}`)\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(`${baseUrl}${url}`, {\n ...requestInit,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // HTTP 에러 상태 체크\n if (!response.ok) {\n throw createNetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n {\n url,\n method: requestInit.method || 'GET',\n },\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 후 타임아웃되었습니다.`, {\n url,\n timeout,\n })\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\n ? error.message\n : '알 수 없는 네트워크 에러가 발생했습니다.',\n undefined,\n { url, originalError: error },\n )\n }\n}\n","/**\n * 컬렉션 쿼리 빌더\n *\n * 타입 안전한 컬렉션 쿼리 빌더를 제공합니다.\n */\n\nimport { ApiQueryOptions, ApiResponse, Collection } from '../client/types'\nimport { CollectionsApi } from './collections-api'\nimport type { CollectionType } from './types'\n\n/**\n * 타입 안전한 컬렉션 쿼리 빌더\n *\n * 특정 컬렉션 타입에 대한 정확한 타입 추론을 제공합니다.\n *\n * @template T - 선택된 컬렉션 타입\n *\n * @example\n * ```typescript\n * const builder = api.from('products')\n * // builder의 모든 메서드는 Product 타입을 반환\n *\n * const products = await builder.find() // Product[]\n * const product = await builder.findById('123') // Product\n * ```\n */\nexport class CollectionQueryBuilder<T extends Collection> {\n constructor(\n private api: CollectionsApi,\n private collection: T,\n ) {}\n\n /**\n * 컬렉션 목록 조회\n *\n * @param options - 쿼리 옵션 (선택)\n * @returns Promise<ApiResponse<CollectionType<T>[]>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').find({ page: 1, limit: 20 })\n * // data는 Product[] 타입\n * ```\n */\n async find(\n options?: ApiQueryOptions,\n ): Promise<ApiResponse<CollectionType<T>[]>> {\n return this.api.requestGet<CollectionType<T>[]>(\n `/api/${String(this.collection)}`,\n options,\n ) as Promise<ApiResponse<CollectionType<T>[]>>\n }\n\n /**\n * ID로 특정 문서 조회\n *\n * @param id - 문서 ID\n * @param options - 쿼리 옵션 (선택)\n * @returns Promise<ApiResponse<CollectionType<T>>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').findById('123')\n * // data는 Product 타입\n * ```\n */\n async findById(\n id: number | string,\n options?: ApiQueryOptions,\n ): Promise<ApiResponse<CollectionType<T>>> {\n return this.api.requestGet<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n options,\n ) as Promise<ApiResponse<CollectionType<T>>>\n }\n\n /**\n * 문서 생성\n *\n * @param data - 생성할 문서 데이터\n * @returns Promise<ApiResponse<CollectionType<T>>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').create({ title: '새 제품' })\n * // data는 Product 타입\n * ```\n */\n async create(\n data: Partial<CollectionType<T>>,\n ): Promise<ApiResponse<CollectionType<T>>> {\n return this.api.requestPost<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n data,\n ) as Promise<ApiResponse<CollectionType<T>>>\n }\n\n /**\n * 문서 업데이트\n *\n * @param id - 문서 ID\n * @param data - 업데이트할 문서 데이터\n * @returns Promise<ApiResponse<CollectionType<T>>>\n *\n * @example\n * ```typescript\n * const { data } = await api.from('products').update('123', { title: '수정된 제품' })\n * // data는 Product 타입\n * ```\n */\n async update(\n id: number | string,\n data: Partial<CollectionType<T>>,\n ): Promise<ApiResponse<CollectionType<T>>> {\n return this.api.requestPatch<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n data,\n ) as Promise<ApiResponse<CollectionType<T>>>\n }\n\n /**\n * 문서 삭제\n *\n * @param id - 문서 ID\n * @returns Promise<ApiResponse<void>>\n *\n * @example\n * ```typescript\n * await api.from('products').remove('123')\n * ```\n */\n async remove(id: number | string): Promise<ApiResponse<void>> {\n return this.api.requestDelete<void>(\n `/api/${String(this.collection)}/${String(id)}`,\n )\n }\n}\n","/**\n * API 클라이언트 기본 클래스\n *\n * 모든 API 클라이언트의 베이스 클래스로, 공통적인 HTTP 메서드들과\n * 에러 처리, 응답 파싱 기능을 제공합니다.\n */\n\nimport { stringify } from 'qs-esm'\nimport { _fetch, FetchOptions } from '../internal/utils'\nimport { ApiResponse, PaginationMeta, ApiQueryOptions } from '../client/types'\nimport { createApiError, createValidationError } from '../internal/errors'\n\n/**\n * API 클라이언트 기본 클래스\n *\n * @class BaseApiClient\n */\nexport class BaseApiClient {\n protected clientKey: string\n protected secretKey?: string\n protected baseUrl?: string\n protected defaultOptions: FetchOptions\n\n /**\n * BaseApiClient 생성자\n *\n * @param clientKey - 클라이언트 키 (필수)\n * @param secretKey - 시크릿 키 (선택, 서버 사이드에서만 사용)\n * @param baseUrl - 기본 API URL (선택, 기본값: https://01.software)\n *\n * @example\n * ```typescript\n * const client = new BaseApiClient('your-client-key', 'your-secret-key')\n * ```\n */\n constructor(clientKey: string, secretKey?: string, baseUrl?: string) {\n if (!clientKey) {\n throw createValidationError('clientKey는 필수입니다.')\n }\n\n this.clientKey = clientKey\n this.secretKey = secretKey\n this.baseUrl = baseUrl\n this.defaultOptions = {\n clientKey,\n secretKey,\n baseUrl,\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>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): 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 * 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?: ApiQueryOptions): string {\n if (!options) return endpoint\n\n const queryString = stringify(options, { addQueryPrefix: true })\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>(\n response: Response,\n ): 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 * 컬렉션 API 클라이언트\n *\n * BaseApiClient를 상속하여 기본 HTTP 메서드를 사용하고,\n * Supabase 스타일의 쿼리 빌더를 제공합니다.\n */\n\nimport { BaseApiClient } from './base'\nimport { ApiQueryOptions, ApiResponse, Collection } from '../client/types'\nimport { CollectionQueryBuilder } from './query-builder'\n\n/**\n * 통합 컬렉션 API 클라이언트\n *\n * BaseApiClient를 상속하여 기본 HTTP 메서드를 사용하고,\n * Supabase 스타일의 쿼리 빌더를 제공합니다.\n *\n * @example\n * ```typescript\n * const api = new CollectionsApi('client-key', 'secret-key')\n *\n * // 목록 조회 - Product[] 타입 반환\n * const { data: products } = await api.from('products').find({ page: 1 })\n *\n * // 단일 조회 - Product 타입 반환\n * const { data: product } = await api.from('products').findById('123')\n *\n * // 생성 - Product 타입 반환\n * const { data: newProduct } = await api.from('products').create({ title: '새 제품' })\n *\n * // 업데이트 - Product 타입 반환\n * const { data: updated } = await api.from('products').update('123', { title: '수정된 제품' })\n *\n * // 삭제\n * await api.from('products').remove('123')\n * ```\n */\nexport class CollectionsApi extends BaseApiClient {\n constructor(clientKey: string, secretKey?: string, baseUrl?: string) {\n super(clientKey, secretKey, baseUrl)\n }\n\n /**\n * 컬렉션 선택\n * 선택한 컬렉션 타입에 맞는 타입 안전한 빌더를 반환합니다.\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns 타입 안전한 컬렉션 쿼리 빌더\n *\n * @example\n * ```typescript\n * // 'products'를 선택하면 Product 타입이 반환됨\n * const builder = api.from('products')\n * const { data } = await builder.findById('123') // data는 Product 타입\n *\n * // 'orders'를 선택하면 Order 타입이 반환됨\n * const { data: orders } = await api.from('orders').find() // orders는 Order[] 타입\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return new CollectionQueryBuilder(this, collection)\n }\n\n /**\n * GET 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param options - 쿼리 옵션\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestGet<T = any>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<ApiResponse<T>> {\n return this.get<T>(endpoint, options)\n }\n\n /**\n * POST 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestPost<T = any>(endpoint: string, data?: any): Promise<ApiResponse<T>> {\n return this.post<T>(endpoint, data)\n }\n\n /**\n * PATCH 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @param data - 전송할 데이터\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestPatch<T = any>(endpoint: string, data?: any): Promise<ApiResponse<T>> {\n return this.patch<T>(endpoint, data)\n }\n\n /**\n * DELETE 요청을 수행합니다.\n *\n * @template T - 응답 데이터 타입\n * @param endpoint - API 엔드포인트\n * @returns Promise<ApiResponse<T>>\n *\n * @internal\n */\n requestDelete<T = any>(endpoint: string): Promise<ApiResponse<T>> {\n return this.delete<T>(endpoint)\n }\n}\n","export const COLLECTIONS = [\n 'brands',\n 'brand-logos',\n 'brand-og-images',\n 'brand-settings',\n 'brand-secret-keys',\n 'products',\n 'product-variants',\n 'product-options',\n 'product-categories',\n 'product-tags',\n 'product-images',\n 'orders',\n 'order-products',\n 'returns',\n 'return-products',\n 'transactions',\n 'links',\n 'link-images',\n 'playlists',\n 'playlist-images',\n 'musics',\n 'posts',\n 'post-categories',\n 'post-tags',\n 'post-images',\n 'documents',\n 'document-images',\n 'entities',\n 'entity-categories',\n 'entity-tags',\n 'entity-images',\n 'nodes',\n 'galleries',\n 'gallery-images',\n 'forms',\n] as const\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","import {\n QueryClient,\n useQuery,\n useInfiniteQuery,\n UseQueryOptions,\n keepPreviousData,\n} from '@tanstack/react-query'\nimport {\n Collection,\n ApiQueryOptions,\n ApiQueryReactOptions,\n} from '../client/types'\nimport { CollectionsApi, CollectionType } from '../collection'\n\nexport interface UnifiedQueryOptions {\n brandKey?: string\n brandSecret?: string\n baseUrl?: string\n}\n\n/**\n * 통합 쿼리 클라이언트\n * React Query를 사용한 데이터 페칭 및 캐싱 관리\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 options?.baseUrl,\n )\n }\n\n // ===== Query Hooks =====\n\n /**\n * 컬렉션 리스트 조회 훅\n * @example const { data } = useCollection('products', { where: { status: 'published' } })\n */\n useCollection<T extends Collection>(\n collection: T,\n queryOptions?: ApiQueryOptions,\n reactQueryOptions?: ApiQueryReactOptions,\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\n .from(collection)\n .find(options)\n return response.data\n },\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n /**\n * 컬렉션 단일 항목 조회 훅\n * @example const { data } = useCollectionSingle('products', { where: { featured: true } })\n */\n useCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'limit'>,\n reactQueryOptions?: ApiQueryReactOptions,\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\n .from(collection)\n .find(options)\n if (response.data.length === 0) return null\n return response.data[0] ?? null\n },\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n /**\n * 컬렉션 무한 스크롤 조회 훅\n * @example const { data, fetchNextPage } = useCollectionInfinite('products', { limit: 20 })\n */\n useCollectionInfinite<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'page'>,\n reactQueryOptions?: ApiQueryReactOptions,\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\n .from(collection)\n .find(queryOpts)\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: CollectionType<T>[],\n pages: CollectionType<T>[][],\n lastPageParams: number,\n ) => {\n if (!Array.isArray(lastPage) || lastPage.length < pageSize) return null\n return lastPageParams + 1\n },\n select: (data) => data.pages.flatMap((page) => page),\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n /**\n * ID로 특정 항목 조회 훅\n * @example const { data } = useById('products', '123')\n */\n useById<T extends Collection>(\n collection: T,\n id: string | number,\n queryOptions?: ApiQueryOptions,\n reactQueryOptions?: ApiQueryReactOptions,\n ) {\n const queryKey = [collection, 'detail', id]\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .findById(id, queryOptions)\n return response.data ?? null\n },\n placeholderData: reactQueryOptions?.keepPreviousData\n ? keepPreviousData\n : undefined,\n })\n }\n\n // ===== Prefetch Methods =====\n\n /**\n * 컬렉션 리스트 프리페치 (useCollection에 대응)\n * @example await client.query.prefetchCollection('products', { where: { status: 'published' } })\n */\n async prefetchCollection<T extends Collection>(\n collection: T,\n queryOptions?: ApiQueryOptions,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', options]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .find(options)\n return response.data\n },\n })\n }\n\n /**\n * 컬렉션 단일 항목 프리페치 (useCollectionSingle에 대응)\n * @example await client.query.prefetchCollectionSingle('products', { where: { featured: true } })\n */\n async prefetchCollectionSingle<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'limit'>,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'detail', options]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .find(options)\n if (response.data.length === 0) return null\n return response.data[0]\n },\n })\n }\n\n /**\n * 컬렉션 무한 쿼리 프리페치 (useCollectionInfinite에 대응)\n * @example await client.query.prefetchCollectionInfinite('products', { limit: 20 })\n */\n async prefetchCollectionInfinite<T extends Collection>(\n collection: T,\n queryOptions?: Omit<ApiQueryOptions, 'page'>,\n ) {\n const options = queryOptions\n const queryKey = [collection, 'list', 'infinite', options]\n const pageSize = options?.limit || 20\n\n return this.queryClient.prefetchInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = 1 }) => {\n const queryOpts = { ...options, page: pageParam, limit: pageSize }\n const response = await this.collectionsApi\n .from(collection)\n .find(queryOpts)\n return response.data\n },\n initialPageParam: 1,\n getNextPageParam: (\n lastPage: CollectionType<T>[],\n allPages: CollectionType<T>[][],\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 * ID로 특정 항목 프리페치 (useById에 대응)\n * @example await client.query.prefetchById('products', '123')\n */\n async prefetchById<T extends Collection>(\n collection: T,\n id: string | number,\n queryOptions?: ApiQueryOptions,\n ) {\n const queryKey = [collection, 'detail', id]\n\n return this.queryClient.prefetchQuery({\n queryKey,\n queryFn: async () => {\n const response = await this.collectionsApi\n .from(collection)\n .findById(id, queryOptions)\n return response.data ?? null\n },\n })\n }\n\n /**\n * 캐시 조작 메서드들\n */\n\n /**\n * 쿼리 무효화\n * @example client.invalidateQueries('products') // 모든 products 쿼리 무효화\n * @example client.invalidateQueries('products', 'list') // products list 쿼리만 무효화\n */\n invalidateQueries(collection: Collection, operation?: string) {\n const queryKey = operation ? [collection, operation] : [collection]\n return this.queryClient.invalidateQueries({ queryKey })\n }\n\n /**\n * 쿼리 데이터 조회\n * @example const data = client.getQueryData('products', 'list')\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 /**\n * 쿼리 데이터 설정\n * @example client.setQueryData('products', 'list', newData)\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 { QueryClient } from '@tanstack/react-query'\nimport { _fetch } from '../internal/utils'\nimport { Config } from '../../payload-types'\nimport {\n CollectionsApi,\n CollectionsApi as CollectionsApiClass,\n CollectionQueryBuilder,\n} from '../collection'\nimport { getQueryClient } from '../query/get-query-client'\nimport { UnifiedQueryClient } from '../query/UnifiedQuery'\nimport {\n ClientBrowserConfig,\n ClientState,\n ClientMetadata,\n Collection,\n} from './types'\n\n/**\n * 브라우저 클라이언트\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\n /** 클라이언트 설정 */\n protected config: ClientBrowserConfig\n\n /** Fetch 함수 인스턴스 */\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: ClientBrowserConfig) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n\n this.config = { ...options }\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = { metadata }\n this.fetch = _fetch\n this.queryClient = getQueryClient()\n\n this.query = new UnifiedQueryClient(this.queryClient, {\n brandKey: this.config.clientKey,\n baseUrl: this.config.baseUrl,\n })\n\n this.collections = new CollectionsApi(\n this.config.clientKey,\n undefined,\n this.config.baseUrl,\n )\n }\n\n /**\n * 현재 브랜드의 설정을 조회합니다.\n *\n * 클라이언트 키와 일치하는 브랜드 설정을 반환합니다.\n *\n * @returns 브랜드 설정 객체 또는 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에 대한 쿼리 빌더를 생성합니다.\n *\n * Supabase 스타일의 메서드 체이닝을 제공하며,\n * 선택한 컬렉션 타입에 맞는 정확한 타입 추론을 제공합니다.\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns 타입 안전한 컬렉션 쿼리 빌더\n *\n * @example\n * ```typescript\n * // 제품 목록 조회 - Product[] 타입 반환\n * const { data: products } = await client.from('products').find({\n * where: { status: 'published' },\n * limit: 10\n * })\n * // products는 Product[] 타입\n *\n * // 특정 제품 조회 - Product 타입 반환\n * const { data: product } = await client.from('products').findById('123')\n * // product는 Product 타입\n *\n * // 제품 생성 - Product 타입 반환\n * const { data: newProduct } = await client.from('products').create({\n * title: '새 제품',\n * price: 10000\n * })\n * // newProduct는 Product 타입\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n /**\n * 클라이언트의 현재 상태를 반환합니다.\n *\n * @returns 클라이언트 상태의 복사본\n */\n getState(): ClientState {\n return { ...this.state }\n }\n}\n\n/**\n * BrowserClient 인스턴스를 생성하는 헬퍼 함수\n *\n * @param options - 클라이언트 설정 옵션\n * @returns BrowserClient 인스턴스\n *\n * @example\n * ```typescript\n * import { createBrowserClient } from '@01.software/sdk'\n *\n * export const client = createBrowserClient({\n * clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n * })\n * ```\n */\nexport const createBrowserClient = (\n options: ClientBrowserConfig,\n): BrowserClient => {\n return new BrowserClient(options)\n}\n","'use server'\n\nimport type { Order, OrderProduct } from '../../payload-types'\nimport { _fetch } from '../internal/utils'\nimport type { ApiClientOptions } from './types'\n\n/**\n * 주문 생성 파라미터\n */\nexport type CreateOrderParams = {\n /** 결제 ID */\n paymentId: string\n /** 주문 번호 */\n orderNumber: string\n /** 고객 이메일 */\n email: string\n /** 배송 주소 */\n shippingAddress: Order['shippingAddress']\n /** 주문 상품 목록 */\n orderProducts: Omit<\n OrderProduct,\n 'id' | 'brand' | 'createdAt' | 'updatedAt' | 'order' | 'status'\n >[]\n /** 총 주문 금액 */\n totalAmount: number\n}\n\n/**\n * 주문을 생성합니다.\n *\n * @param params - 주문 생성 파라미터 및 클라이언트 옵션\n * @returns 생성된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await createOrder({\n * paymentId: 'pay_123',\n * orderNumber: 'ORD-001',\n * email: 'user@example.com',\n * orderProducts: [...],\n * totalAmount: 10000,\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n * ```\n */\nexport const createOrder = async ({\n paymentId,\n orderNumber,\n orderProducts,\n email,\n shippingAddress,\n totalAmount,\n secretKey,\n clientKey,\n baseUrl,\n}: CreateOrderParams & ApiClientOptions): Promise<Order> => {\n const response = await _fetch('/api/orders/create', {\n method: 'POST',\n baseUrl,\n clientKey,\n secretKey,\n body: JSON.stringify({\n paymentId,\n orderNumber,\n orderProducts,\n email,\n shippingAddress,\n totalAmount,\n }),\n })\n\n return response.json()\n}\n","'use server'\n\nimport type { Order } from '../../payload-types'\nimport { _fetch } from '../internal/utils'\nimport type { ApiClientOptions } from './types'\n\n/**\n * 주문 업데이트 파라미터\n */\nexport type UpdateOrderParams = {\n /** 주문 번호 */\n orderNumber: string\n /** 주문 상태 */\n status: Order['status']\n}\n\n/**\n * 주문을 업데이트합니다.\n *\n * @param params - 주문 업데이트 파라미터 및 클라이언트 옵션\n * @returns 업데이트된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await updateOrder({\n * orderNumber: 'ORD-001',\n * status: 'completed',\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n * ```\n */\nexport const updateOrder = async ({\n orderNumber,\n status,\n secretKey,\n clientKey,\n baseUrl,\n}: UpdateOrderParams & ApiClientOptions): Promise<Order> => {\n const response = await _fetch('/api/orders/update', {\n method: 'POST',\n baseUrl,\n clientKey,\n secretKey,\n body: JSON.stringify({\n orderNumber,\n status,\n }),\n })\n\n return response.json()\n}\n","'use server'\n\nimport type { Transaction } from '../../payload-types'\nimport { _fetch } from '../internal/utils'\nimport type { ApiClientOptions } from './types'\n\n/**\n * 트랜잭션 업데이트 파라미터\n */\nexport type UpdateTransactionParams = {\n /** 결제 ID */\n paymentId: string\n /** 트랜잭션 상태 */\n status: Transaction['status']\n /** 결제 방법 */\n paymentMethod: Transaction['paymentMethod']\n /** 영수증 URL */\n receiptUrl: Transaction['receiptUrl']\n}\n\n/**\n * 트랜잭션을 업데이트합니다.\n *\n * @param params - 트랜잭션 업데이트 파라미터 및 클라이언트 옵션\n * @returns 업데이트된 트랜잭션 객체\n *\n * @example\n * ```typescript\n * const transaction = await updateTransaction({\n * paymentId: 'pay_123',\n * status: 'completed',\n * paymentMethod: 'card',\n * receiptUrl: 'https://receipt.example.com/123',\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n * ```\n */\nexport const updateTransaction = async ({\n paymentId,\n status,\n paymentMethod,\n receiptUrl,\n secretKey,\n clientKey,\n baseUrl,\n}: UpdateTransactionParams & ApiClientOptions): Promise<Transaction> => {\n const response = await _fetch('/api/transactions/update', {\n method: 'POST',\n baseUrl,\n clientKey,\n secretKey,\n body: JSON.stringify({\n paymentId,\n status,\n paymentMethod,\n receiptUrl,\n }),\n })\n\n return response.json()\n}\n","/**\n * API 클라이언트\n *\n * 주문 및 트랜잭션 관련 API 메서드를 제공하는 클라이언트입니다.\n */\n\nimport { createOrder, type CreateOrderParams } from './createOrder'\nimport { updateOrder, type UpdateOrderParams } from './updateOrder'\nimport {\n updateTransaction,\n type UpdateTransactionParams,\n} from './updateTransaction'\nimport type { ApiClientOptions } from './types'\n\n/**\n * API 클라이언트\n *\n * 주문 및 트랜잭션 관련 API 메서드를 제공하는 클라이언트입니다.\n * 서버 사이드에서만 사용해야 합니다.\n *\n * @example\n * ```typescript\n * const apiClient = new ApiClient({\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key',\n * baseUrl: 'https://api.example.com'\n * })\n *\n * const order = await apiClient.createOrder({ ... })\n * ```\n */\nexport class ApiClient {\n private readonly clientKey: string\n private readonly secretKey: string\n private readonly baseUrl?: string\n\n constructor(options: ApiClientOptions) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n if (!options.secretKey) {\n throw new Error('secretKey is required.')\n }\n\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n this.baseUrl = options.baseUrl\n }\n\n /**\n * 공통 옵션을 생성합니다.\n *\n * @private\n */\n private getCommonOptions(): ApiClientOptions {\n return {\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n baseUrl: this.baseUrl,\n }\n }\n\n /**\n * 주문을 생성합니다.\n *\n * @param params - 주문 생성 파라미터\n * @returns 생성된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await apiClient.createOrder({\n * paymentId: 'pay_123',\n * orderNumber: 'ORD-001',\n * email: 'user@example.com',\n * orderProducts: [...],\n * totalAmount: 10000\n * })\n * ```\n */\n createOrder(params: CreateOrderParams) {\n return createOrder({\n ...params,\n ...this.getCommonOptions(),\n })\n }\n\n /**\n * 주문을 업데이트합니다.\n *\n * @param params - 주문 업데이트 파라미터\n * @returns 업데이트된 주문 객체\n *\n * @example\n * ```typescript\n * const order = await apiClient.updateOrder({\n * paymentId: 'pay_123',\n * status: 'completed'\n * })\n * ```\n */\n updateOrder(params: UpdateOrderParams) {\n return updateOrder({\n ...params,\n ...this.getCommonOptions(),\n })\n }\n\n /**\n * 트랜잭션을 업데이트합니다.\n *\n * @param params - 트랜잭션 업데이트 파라미터\n * @returns 업데이트된 트랜잭션 객체\n *\n * @example\n * ```typescript\n * const transaction = await apiClient.updateTransaction({\n * paymentId: 'pay_123',\n * status: 'completed',\n * paymentMethod: 'card',\n * receiptUrl: 'https://receipt.example.com/123'\n * })\n * ```\n */\n updateTransaction(params: UpdateTransactionParams) {\n return updateTransaction({\n ...params,\n ...this.getCommonOptions(),\n })\n }\n}\n","import { _fetch } from '../internal/utils'\nimport { Config } from '../../payload-types'\nimport { ApiClient } from '../api'\nimport {\n CollectionsApi,\n CollectionsApi as CollectionsApiClass,\n CollectionQueryBuilder,\n} from '../collection'\nimport {\n ClientServerConfig,\n ClientState,\n ClientMetadata,\n Collection,\n} from './types'\n\n/**\n * 서버 클라이언트\n *\n * Supabase Client와 유사한 구조로 설계된 통합 클라이언트입니다.\n * 서버 환경에서 API 호출과 컬렉션 관리를 제공합니다.\n * 시크릿 키를 사용하여 인증된 요청을 수행할 수 있습니다.\n *\n * @template _Database - 데이터베이스 스키마 타입 (기본값: Config)\n *\n * @example\n * ```typescript\n * import { createServerClient } from '@01.software/sdk'\n *\n * const client = createServerClient({\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key'\n * })\n *\n * // 제품 목록 조회\n * const products = await client.from('products').find()\n * ```\n */\nexport default class ServerClient<_Database = Config> {\n /**\n * API 클라이언트\n *\n * REST API 호출을 위한 메서드들을 제공합니다.\n */\n api: ApiClient\n\n /**\n * 범용 컬렉션 API 클라이언트\n *\n * Supabase 스타일의 쿼리 빌더를 제공합니다.\n * 모든 컬렉션에 대한 CRUD 작업을 지원합니다.\n */\n collections: CollectionsApiClass\n\n /** 클라이언트 내부 상태 */\n protected state: ClientState\n\n /** 클라이언트 설정 */\n protected config: ClientServerConfig\n\n /** Fetch 함수 인스턴스 */\n protected fetch: typeof _fetch\n\n /**\n * ServerClient 인스턴스를 생성합니다.\n *\n * @param options - 클라이언트 설정 옵션\n * @throws {Error} clientKey 또는 secretKey가 제공되지 않은 경우\n *\n * @example\n * ```typescript\n * const client = new ServerClient({\n * clientKey: 'your-client-key',\n * secretKey: 'your-secret-key',\n * baseUrl: 'https://api.example.com'\n * })\n * ```\n */\n constructor(options: ClientServerConfig) {\n if (!options.clientKey) {\n throw new Error('clientKey is required.')\n }\n if (!options.secretKey) {\n throw new Error('secretKey is required.')\n }\n\n this.config = { ...options }\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = { metadata }\n this.fetch = _fetch\n\n this.api = new ApiClient({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.config.baseUrl,\n })\n\n this.collections = new CollectionsApi(\n this.config.clientKey,\n this.config.secretKey,\n this.config.baseUrl,\n )\n }\n\n /**\n * 현재 브랜드의 설정을 조회합니다.\n *\n * 클라이언트 키와 일치하는 브랜드 설정을 반환합니다.\n *\n * @returns 브랜드 설정 객체 또는 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에 대한 쿼리 빌더를 생성합니다.\n *\n * Supabase 스타일의 메서드 체이닝을 제공하며,\n * 선택한 컬렉션 타입에 맞는 정확한 타입 추론을 제공합니다.\n *\n * @template T - 컬렉션 타입\n * @param collection - 컬렉션 이름\n * @returns 타입 안전한 컬렉션 쿼리 빌더\n *\n * @example\n * ```typescript\n * // 제품 목록 조회 - Product[] 타입 반환\n * const { data: products } = await client.from('products').find()\n * // products는 Product[] 타입\n *\n * // 특정 제품 조회 - Product 타입 반환\n * const { data: product } = await client.from('products').findById('123')\n * // product는 Product 타입\n *\n * // 제품 생성 - Product 타입 반환\n * const { data: newProduct } = await client.from('products').create({\n * title: '새 제품'\n * })\n * // newProduct는 Product 타입\n * ```\n */\n from<T extends Collection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n /**\n * 클라이언트의 현재 상태를 반환합니다.\n *\n * @returns 클라이언트 상태의 복사본\n */\n getState(): ClientState {\n return { ...this.state }\n }\n\n /**\n * 클라이언트 설정을 반환합니다.\n *\n * 보안을 위해 시크릿 키는 제외하고 반환합니다.\n *\n * @returns 시크릿 키가 제외된 클라이언트 설정\n */\n getConfig(): ClientServerConfig {\n const { secretKey: _, ...safeConfig } = this.config\n return safeConfig as ClientServerConfig\n }\n}\n\n/**\n * ServerClient 인스턴스를 생성하는 헬퍼 함수\n *\n * @param options - 클라이언트 설정 옵션\n * @returns ServerClient 인스턴스\n *\n * @example\n * ```typescript\n * import { createServerClient } from '@01.software/sdk'\n *\n * export const client = createServerClient({\n * clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n * secretKey: process.env.SOFTWARE_SECRET_KEY!,\n * })\n * ```\n */\nexport const createServerClient = (\n options: ClientServerConfig,\n): ServerClient => {\n return new ServerClient(options)\n}\n","/**\n * Webhook 모듈\n *\n * Next.js 프로젝트에서 webhook을 받을 때 사용하는 함수 모음입니다.\n * 서버 사이드에서만 사용됩니다.\n */\n\nimport { Config } from '../../payload-types'\nimport { Collection } from '../client/types'\nimport { CollectionType } from '../collection/types'\n\n/**\n * Webhook 작업 타입\n *\n * Payload CMS의 afterChange 훅에서 전송되는 작업 타입입니다.\n */\nexport type WebhookOperation = 'create' | 'update'\n\n/**\n * Webhook 이벤트 타입\n *\n * @template T - 컬렉션 이름\n */\nexport interface WebhookEvent<T extends Collection = Collection> {\n /** 컬렉션 이름 */\n collection: T\n /** 작업 타입 (create 또는 update) */\n operation: WebhookOperation\n /** 변경된 데이터 */\n data: CollectionType<T>\n}\n\n/**\n * Webhook 핸들러 함수 타입\n *\n * @template T - 컬렉션 이름\n */\nexport type WebhookHandler<T extends Collection = Collection> = (\n event: WebhookEvent<T>,\n) => Promise<void> | void\n\n/**\n * Next.js API Route에서 webhook 요청을 처리하는 헬퍼 함수\n *\n * @param request - Next.js Request 객체\n * @param handler - Webhook 이벤트 핸들러 함수\n * @returns Promise<Response>\n *\n * @example\n * ```typescript\n * // app/api/webhook/route.ts\n * import { handleWebhook } from '@01.software/sdk/webhook'\n *\n * export async function POST(request: Request) {\n * return handleWebhook(request, async (event) => {\n * if (event.collection === 'orders' && event.operation === 'create') {\n * console.log('New order:', event.data)\n * // 주문 처리 로직\n * }\n * })\n * }\n * ```\n */\nexport async function handleWebhook<T extends Collection = Collection>(\n request: Request,\n handler: WebhookHandler<T>,\n): Promise<Response> {\n try {\n // 요청 본문 파싱\n const body = await request.json()\n\n // Webhook 이벤트 검증\n if (!isValidWebhookEvent(body)) {\n return new Response(\n JSON.stringify({ error: 'Invalid webhook event format' }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n )\n }\n\n // 핸들러 실행\n await handler(body as WebhookEvent<T>)\n\n return new Response(\n JSON.stringify({ success: true, message: 'Webhook processed' }),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n },\n )\n } catch (error) {\n console.error('Webhook processing error:', error)\n\n return new Response(\n JSON.stringify({\n error: 'Internal server error',\n message: error instanceof Error ? error.message : 'Unknown error',\n }),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n },\n )\n }\n}\n\n/**\n * Webhook 이벤트 유효성 검증 함수\n *\n * @param data - 검증할 데이터\n * @returns boolean\n */\nexport function isValidWebhookEvent(data: any): data is WebhookEvent {\n return (\n typeof data === 'object' &&\n data !== null &&\n typeof data.collection === 'string' &&\n (data.operation === 'create' || data.operation === 'update') &&\n typeof data.data === 'object' &&\n data.data !== null\n )\n}\n\n/**\n * 컬렉션별 타입 안전한 Webhook 핸들러 생성 함수\n *\n * @template T - 컬렉션 이름\n * @param collection - 컬렉션 이름\n * @param handler - Webhook 핸들러 함수\n * @returns WebhookHandler\n *\n * @example\n * ```typescript\n * const orderHandler = createTypedWebhookHandler('orders', async (event) => {\n * // event.data는 Order 타입으로 추론됨\n * console.log('Order ID:', event.data.id)\n * })\n * ```\n */\nexport function createTypedWebhookHandler<T extends Collection>(\n collection: T,\n handler: (event: WebhookEvent<T>) => Promise<void> | void,\n): WebhookHandler<T> {\n return async (event: WebhookEvent<T>) => {\n if (event.collection !== collection) {\n throw new Error(\n `Expected collection \"${collection}\", got \"${event.collection}\"`,\n )\n }\n return handler(event)\n }\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 { ProductOption } from '../../payload-types'\nimport { objectFor } from '../types'\n\nexport const formatOrderName = (options: ProductOption[]) => {\n const optionLength = options.length\n\n return optionLength === 1\n ? objectFor(options?.[0]?.product)?.title || ''\n : `${objectFor(options.at(0)?.product)?.title} 외 ${optionLength - 1}건`\n}\n","'use client'\n\nimport React from 'react'\nimport {\n SerializedBlockNode,\n SerializedLinkNode,\n} from '@payloadcms/richtext-lexical'\nimport {\n SerializedEditorState,\n SerializedLexicalNode,\n} from '@payloadcms/richtext-lexical/lexical'\nimport {\n defaultJSXConverters,\n JSXConverter,\n LinkJSXConverter,\n RichText,\n} from '@payloadcms/richtext-lexical/react'\n\nexport type RichTextData = SerializedEditorState<SerializedLexicalNode>\n\nexport interface RichTextContentProps {\n data: RichTextData\n className?: string\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n blocks?: {\n Iframe?: JSXConverter<\n SerializedBlockNode<{\n blockName?: string | null\n blockType: string\n url: string\n }>\n >\n Player?: JSXConverter<\n SerializedBlockNode<{\n blockName?: string | null\n blockType: string\n url: string\n }>\n >\n }\n}\n\nexport function RichTextContent({\n data,\n className,\n internalDocToHref,\n blocks,\n}: RichTextContentProps) {\n return (\n <RichText\n data={data}\n className={className}\n converters={{\n ...defaultJSXConverters,\n ...LinkJSXConverter({\n internalDocToHref,\n }),\n blocks: blocks\n ? (blocks as Record<\n string,\n JSXConverter<\n SerializedBlockNode<{\n blockName?: string | null\n blockType: string\n }>\n >\n >)\n : undefined,\n }}\n />\n )\n}\n"]}
|