@k-msg/template 0.29.9 → 0.31.0

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.
@@ -0,0 +1,4 @@
1
+ var{defineProperty:b,getOwnPropertyNames:_,getOwnPropertyDescriptor:v}=Object,P=Object.prototype.hasOwnProperty;function I(e){return this[e]}var M=(e)=>{var r=(A??=new WeakMap).get(e),t;if(r)return r;if(r=b({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var n of _(e))if(!P.call(r,n))b(r,n,{get:I.bind(e,n),enumerable:!(t=v(e,n))||t.enumerable})}return A.set(e,r),r},A;var O=(e)=>e;function N(e,r){this[e]=O.bind(null,r)}var w=(e,r)=>{for(var t in r)b(e,t,{get:r[t],enumerable:!0,configurable:!0,set:N.bind(r,t)})};var x={};w(x,{TemplateLifecycleService:()=>k});module.exports=M(x);var g;((s)=>{s.INVALID_REQUEST="INVALID_REQUEST";s.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";s.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";s.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";s.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";s.NETWORK_ERROR="NETWORK_ERROR";s.NETWORK_TIMEOUT="NETWORK_TIMEOUT";s.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";s.REQUEST_ABORTED="REQUEST_ABORTED";s.PROVIDER_ERROR="PROVIDER_ERROR";s.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";s.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";s.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";s.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";s.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";s.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";s.UNKNOWN_ERROR="UNKNOWN_ERROR"})(g||={});var L={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["REQUEST_ABORTED"]:{ko:"요청이 취소되었습니다",en:"Request aborted"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},q=new Set(Object.values(g));var C=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class l extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,r,t,n={}){super(r);if(this.name="KMsgError",this.code=e,this.details=t,this.providerErrorCode=n.providerErrorCode,this.providerErrorText=n.providerErrorText,this.httpStatus=C(n.httpStatus),this.requestId=typeof n.requestId==="string"?n.requestId:void 0,this.retryAfterMs=C(n.retryAfterMs),this.attempt=C(n.attempt),Array.isArray(n.causeChain))this.causeChain=n.causeChain;else if(n.causeChain!==void 0)this.causeChain=[n.causeChain];let o=Error.captureStackTrace;if(o)o(this,l)}getLocalizedMessage(e="ko"){let r=L[this.code];if(r?.[e])return r[e];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var c=(e)=>({isSuccess:!0,isFailure:!1,value:e}),i=(e)=>({isSuccess:!1,isFailure:!0,error:e});class u{static validateButtons(e){let r=[];if(e.length>5)r.push("Maximum 5 buttons are allowed");for(let t=0;t<e.length;t++){let n=e[t],o=t+1;if(!n.name||n.name.trim().length===0)r.push(`Button ${o}: name is required`);else if(n.name.length>14)r.push(`Button ${o}: name cannot exceed 14 characters`);u.validateButtonByType(n,o,r)}return{isValid:r.length===0,errors:r}}static validateButtonByType(e,r,t){switch(e.type){case"WL":u.validateWebLinkButton(e,r,t);break;case"AL":u.validateAppLinkButton(e,r,t);break;case"DS":u.validateDeliveryButton(e,r,t);break;case"BK":u.validateBotKeywordButton(e,r,t);break;case"MD":u.validateMessageDeliveryButton(e,r,t);break;default:t.push(`Button ${r}: invalid button type '${e.type}'`)}}static validateWebLinkButton(e,r,t){if(!e.linkMobile&&!e.linkPc)t.push(`Button ${r}: web link button must have at least mobile or PC link`);if(e.linkMobile&&!u.isValidUrl(e.linkMobile))t.push(`Button ${r}: invalid mobile link URL`);if(e.linkPc&&!u.isValidUrl(e.linkPc))t.push(`Button ${r}: invalid PC link URL`)}static validateAppLinkButton(e,r,t){if(!(e.linkIos||e.linkAndroid||e.schemeIos||e.schemeAndroid))t.push(`Button ${r}: app link button must have at least one app link or scheme`);if(e.linkIos&&!u.isValidUrl(e.linkIos))t.push(`Button ${r}: invalid iOS link URL`);if(e.linkAndroid&&!u.isValidUrl(e.linkAndroid))t.push(`Button ${r}: invalid Android link URL`)}static validateDeliveryButton(e,r,t){}static validateBotKeywordButton(e,r,t){}static validateMessageDeliveryButton(e,r,t){}static isValidUrl(e){try{return new URL(e),!0}catch{return!1}}static serializeButtons(e){let r=e.map((t)=>({name:t.name,type:t.type,url_mobile:t.linkMobile,url_pc:t.linkPc,url_ios:t.linkIos,url_android:t.linkAndroid,scheme_ios:t.schemeIos,scheme_android:t.schemeAndroid}));return JSON.stringify(r)}static deserializeButtons(e){try{return JSON.parse(e).map((t)=>({name:t.name,type:t.type,linkMobile:t.url_mobile,linkPc:t.url_pc,linkIos:t.url_ios,linkAndroid:t.url_android,schemeIos:t.scheme_ios,schemeAndroid:t.scheme_android}))}catch(r){throw Error(`Failed to parse buttons JSON: ${r}`)}}}var K=new Set(["WL","AL","DS","BK","MD"]);function d(e){return new l("INVALID_REQUEST",e)}function S(e){if(!e||typeof e!=="object"||Array.isArray(e))return;return e}function B(e){try{return c(JSON.parse(e))}catch(r){return i(d(`Invalid JSON for buttons: ${r instanceof Error?r.message:String(r)}`))}}function p(e,r,t){for(let n of r){if(!(n in e))continue;let o=e[n];if(o===null||o===void 0||o==="")return c(void 0);if(typeof o!=="string")return i(d(`buttons.${t} must be a string`));return c(o)}return c(void 0)}function D(e,r){let t=S(e);if(!t)return i(d(`buttons[${r}] must be an object with type/name`));let n=t.type;if(typeof n!=="string"||!K.has(n))return i(d(`buttons[${r}].type must be one of WL, AL, DS, BK, MD`));let o=n,a=t.name;if(typeof a!=="string"||a.trim().length===0)return i(d(`buttons[${r}].name is required`));let y=p(t,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(y.isFailure)return y;let f=p(t,["linkPc","url_pc","urlPc"],"linkPc");if(f.isFailure)return f;let m=p(t,["linkIos","url_ios","urlIos"],"linkIos");if(m.isFailure)return m;let E=p(t,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(E.isFailure)return E;let R=p(t,["schemeIos","scheme_ios"],"schemeIos");if(R.isFailure)return R;let T=p(t,["schemeAndroid","scheme_android"],"schemeAndroid");if(T.isFailure)return T;return c({type:o,name:a,...y.value?{linkMobile:y.value}:{},...f.value?{linkPc:f.value}:{},...m.value?{linkIos:m.value}:{},...E.value?{linkAndroid:E.value}:{},...R.value?{schemeIos:R.value}:{},...T.value?{schemeAndroid:T.value}:{}})}function F(e){if(e===void 0||e===null)return c(void 0);let r=e;if(typeof r==="string"){let a=B(r);if(a.isFailure)return a;r=a.value}let t=S(r);if(t&&Array.isArray(t.button))r=t.button;if(!Array.isArray(r))return i(d("buttons must be a JSON array"));let n=[];for(let[a,y]of r.entries()){let f=D(y,a);if(f.isFailure)return f;n.push(f.value)}let o=u.validateButtons(n);if(!o.isValid)return i(d(`Invalid template buttons: ${o.errors.join(", ")}`));return c(n)}function h(e,r={}){let t=r.requireName??!0,n=r.requireContent??!0,o={};if(e.name===void 0||e.name===null){if(t)return i(d("name is required"))}else if(typeof e.name!=="string"||e.name.trim().length===0)return i(d(t?"name is required":"name must be a non-empty string"));else o.name=e.name.trim();if(e.content===void 0||e.content===null){if(n)return i(d("content is required"))}else if(typeof e.content!=="string"||e.content.trim().length===0)return i(d(n?"content is required":"content must be a non-empty string"));else o.content=e.content;let a=F(e.buttons);if(a.isFailure)return a;if(a.value!==void 0)o.buttons=a.value;return c(o)}function U(e,r){if(r)return r;let t=e;if(typeof t.requestTemplateInspection==="function")return{requestTemplateInspection:t.requestTemplateInspection.bind(e)};return}class k{provider;inspectionProvider;constructor(e,r){this.provider=e;this.inspectionProvider=U(e,r)}async create(e,r){let t=h(e,{requireName:!0,requireContent:!0});if(t.isFailure)return t;let n={...e,...t.value.name?{name:t.value.name}:{},...t.value.content?{content:t.value.content}:{},...t.value.buttons!==void 0?{buttons:t.value.buttons}:{}};return this.provider.createTemplate(n,r)}async update(e,r,t){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));let n=h(r,{requireName:!1,requireContent:!1});if(n.isFailure)return n;let o={...r,...n.value.name!==void 0?{name:n.value.name}:{},...n.value.content!==void 0?{content:n.value.content}:{},...n.value.buttons!==void 0?{buttons:n.value.buttons}:{}};return this.provider.updateTemplate(e,o,t)}async delete(e,r){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));return this.provider.deleteTemplate(e,r)}async get(e,r){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));return this.provider.getTemplate(e,r)}async list(e,r){return this.provider.listTemplates(e,r)}async requestInspection(e,r){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));if(!this.inspectionProvider)return i(new l("INVALID_REQUEST","Template inspection is not supported by this provider"));return this.inspectionProvider.requestTemplateInspection(e,r)}}
2
+
3
+ //# debugId=56B83023956CAD4064756E2164756E21
4
+ //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- var O=Object.defineProperty;var g=(f,q)=>{for(var k in q)O(f,k,{get:q[k],enumerable:!0,configurable:!0,set:(A)=>q[k]=()=>A})};var U;((F)=>{F.INVALID_REQUEST="INVALID_REQUEST";F.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";F.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";F.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";F.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";F.NETWORK_ERROR="NETWORK_ERROR";F.NETWORK_TIMEOUT="NETWORK_TIMEOUT";F.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";F.PROVIDER_ERROR="PROVIDER_ERROR";F.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";F.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";F.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";F.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";F.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";F.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";F.UNKNOWN_ERROR="UNKNOWN_ERROR"})(U||={});var S={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},z=new Set(Object.values(U));var j=(f)=>{if(typeof f!=="number"||Number.isNaN(f)||!Number.isFinite(f))return;return Math.trunc(f)};class W extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(f,q,k,A={}){super(q);if(this.name="KMsgError",this.code=f,this.details=k,this.providerErrorCode=A.providerErrorCode,this.providerErrorText=A.providerErrorText,this.httpStatus=j(A.httpStatus),this.requestId=typeof A.requestId==="string"?A.requestId:void 0,this.retryAfterMs=j(A.retryAfterMs),this.attempt=j(A.attempt),Array.isArray(A.causeChain))this.causeChain=A.causeChain;else if(A.causeChain!==void 0)this.causeChain=[A.causeChain];let $=Error.captureStackTrace;if($)$(this,W)}getLocalizedMessage(f="ko"){let q=S[this.code];if(q?.[f])return q[f];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var w=(f)=>({isSuccess:!0,isFailure:!1,value:f}),T=(f)=>({isSuccess:!1,isFailure:!0,error:f});class J{static validateButtons(f){let q=[];if(f.length>5)q.push("Maximum 5 buttons are allowed");for(let k=0;k<f.length;k++){let A=f[k],$=k+1;if(!A.name||A.name.trim().length===0)q.push(`Button ${$}: name is required`);else if(A.name.length>14)q.push(`Button ${$}: name cannot exceed 14 characters`);J.validateButtonByType(A,$,q)}return{isValid:q.length===0,errors:q}}static validateButtonByType(f,q,k){switch(f.type){case"WL":J.validateWebLinkButton(f,q,k);break;case"AL":J.validateAppLinkButton(f,q,k);break;case"DS":J.validateDeliveryButton(f,q,k);break;case"BK":J.validateBotKeywordButton(f,q,k);break;case"MD":J.validateMessageDeliveryButton(f,q,k);break;default:k.push(`Button ${q}: invalid button type '${f.type}'`)}}static validateWebLinkButton(f,q,k){if(!f.linkMobile&&!f.linkPc)k.push(`Button ${q}: web link button must have at least mobile or PC link`);if(f.linkMobile&&!J.isValidUrl(f.linkMobile))k.push(`Button ${q}: invalid mobile link URL`);if(f.linkPc&&!J.isValidUrl(f.linkPc))k.push(`Button ${q}: invalid PC link URL`)}static validateAppLinkButton(f,q,k){if(!(f.linkIos||f.linkAndroid||f.schemeIos||f.schemeAndroid))k.push(`Button ${q}: app link button must have at least one app link or scheme`);if(f.linkIos&&!J.isValidUrl(f.linkIos))k.push(`Button ${q}: invalid iOS link URL`);if(f.linkAndroid&&!J.isValidUrl(f.linkAndroid))k.push(`Button ${q}: invalid Android link URL`)}static validateDeliveryButton(f,q,k){}static validateBotKeywordButton(f,q,k){}static validateMessageDeliveryButton(f,q,k){}static isValidUrl(f){try{return new URL(f),!0}catch{return!1}}static serializeButtons(f){let q=f.map((k)=>({name:k.name,type:k.type,url_mobile:k.linkMobile,url_pc:k.linkPc,url_ios:k.linkIos,url_android:k.linkAndroid,scheme_ios:k.schemeIos,scheme_android:k.schemeAndroid}));return JSON.stringify(q)}static deserializeButtons(f){try{return JSON.parse(f).map((k)=>({name:k.name,type:k.type,linkMobile:k.url_mobile,linkPc:k.url_pc,linkIos:k.url_ios,linkAndroid:k.url_android,schemeIos:k.scheme_ios,schemeAndroid:k.scheme_android}))}catch(q){throw Error(`Failed to parse buttons JSON: ${q}`)}}}var P=new Set(["WL","AL","DS","BK","MD"]);function Q(f){return new W("INVALID_REQUEST",f)}function L(f){if(!f||typeof f!=="object"||Array.isArray(f))return;return f}function R(f){try{return w(JSON.parse(f))}catch(q){return T(Q(`Invalid JSON for buttons: ${q instanceof Error?q.message:String(q)}`))}}function Z(f,q,k){for(let A of q){if(!(A in f))continue;let $=f[A];if($===null||$===void 0||$==="")return w(void 0);if(typeof $!=="string")return T(Q(`buttons.${k} must be a string`));return w($)}return w(void 0)}function K(f,q){let k=L(f);if(!k)return T(Q(`buttons[${q}] must be an object with type/name`));let A=k.type;if(typeof A!=="string"||!P.has(A))return T(Q(`buttons[${q}].type must be one of WL, AL, DS, BK, MD`));let $=A,V=k.name;if(typeof V!=="string"||V.trim().length===0)return T(Q(`buttons[${q}].name is required`));let X=Z(k,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(X.isFailure)return X;let D=Z(k,["linkPc","url_pc","urlPc"],"linkPc");if(D.isFailure)return D;let G=Z(k,["linkIos","url_ios","urlIos"],"linkIos");if(G.isFailure)return G;let Y=Z(k,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(Y.isFailure)return Y;let H=Z(k,["schemeIos","scheme_ios"],"schemeIos");if(H.isFailure)return H;let _=Z(k,["schemeAndroid","scheme_android"],"schemeAndroid");if(_.isFailure)return _;return w({type:$,name:V,...X.value?{linkMobile:X.value}:{},...D.value?{linkPc:D.value}:{},...G.value?{linkIos:G.value}:{},...Y.value?{linkAndroid:Y.value}:{},...H.value?{schemeIos:H.value}:{},..._.value?{schemeAndroid:_.value}:{}})}function I(f){if(f===void 0||f===null)return w(void 0);let q=f;if(typeof q==="string"){let V=R(q);if(V.isFailure)return V;q=V.value}let k=L(q);if(k&&Array.isArray(k.button))q=k.button;if(!Array.isArray(q))return T(Q("buttons must be a JSON array"));let A=[];for(let[V,X]of q.entries()){let D=K(X,V);if(D.isFailure)return D;A.push(D.value)}let $=J.validateButtons(A);if(!$.isValid)return T(Q(`Invalid template buttons: ${$.errors.join(", ")}`));return w(A)}function N(f,q={}){let k=q.requireName??!0,A=q.requireContent??!0,$={};if(f.name===void 0||f.name===null){if(k)return T(Q("name is required"))}else if(typeof f.name!=="string"||f.name.trim().length===0)return T(Q(k?"name is required":"name must be a non-empty string"));else $.name=f.name.trim();if(f.content===void 0||f.content===null){if(A)return T(Q("content is required"))}else if(typeof f.content!=="string"||f.content.trim().length===0)return T(Q(A?"content is required":"content must be a non-empty string"));else $.content=f.content;let V=I(f.buttons);if(V.isFailure)return V;if(V.value!==void 0)$.buttons=V.value;return w($)}function M(f,q){if(q)return q;let k=f;if(typeof k.requestTemplateInspection==="function")return{requestTemplateInspection:k.requestTemplateInspection.bind(f)};return}class B{provider;inspectionProvider;constructor(f,q){this.provider=f;this.inspectionProvider=M(f,q)}async create(f,q){let k=N(f,{requireName:!0,requireContent:!0});if(k.isFailure)return k;let A={...f,...k.value.name?{name:k.value.name}:{},...k.value.content?{content:k.value.content}:{},...k.value.buttons!==void 0?{buttons:k.value.buttons}:{}};return this.provider.createTemplate(A,q)}async update(f,q,k){if(!f||f.trim().length===0)return T(new W("INVALID_REQUEST","Template code is required"));let A=N(q,{requireName:!1,requireContent:!1});if(A.isFailure)return A;let $={...q,...A.value.name!==void 0?{name:A.value.name}:{},...A.value.content!==void 0?{content:A.value.content}:{},...A.value.buttons!==void 0?{buttons:A.value.buttons}:{}};return this.provider.updateTemplate(f,$,k)}async delete(f,q){if(!f||f.trim().length===0)return T(new W("INVALID_REQUEST","Template code is required"));return this.provider.deleteTemplate(f,q)}async get(f,q){if(!f||f.trim().length===0)return T(new W("INVALID_REQUEST","Template code is required"));return this.provider.getTemplate(f,q)}async list(f,q){return this.provider.listTemplates(f,q)}async requestInspection(f,q){if(!f||f.trim().length===0)return T(new W("INVALID_REQUEST","Template code is required"));if(!this.inspectionProvider)return T(new W("INVALID_REQUEST","Template inspection is not supported by this provider"));return this.inspectionProvider.requestTemplateInspection(f,q)}}export{B as TemplateLifecycleService};
1
+ var g;((s)=>{s.INVALID_REQUEST="INVALID_REQUEST";s.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";s.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";s.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";s.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";s.NETWORK_ERROR="NETWORK_ERROR";s.NETWORK_TIMEOUT="NETWORK_TIMEOUT";s.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";s.REQUEST_ABORTED="REQUEST_ABORTED";s.PROVIDER_ERROR="PROVIDER_ERROR";s.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";s.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";s.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";s.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";s.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";s.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";s.UNKNOWN_ERROR="UNKNOWN_ERROR"})(g||={});var A={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["REQUEST_ABORTED"]:{ko:"요청이 취소되었습니다",en:"Request aborted"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},M=new Set(Object.values(g));var b=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class l extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,r,n={}){super(t);if(this.name="KMsgError",this.code=e,this.details=r,this.providerErrorCode=n.providerErrorCode,this.providerErrorText=n.providerErrorText,this.httpStatus=b(n.httpStatus),this.requestId=typeof n.requestId==="string"?n.requestId:void 0,this.retryAfterMs=b(n.retryAfterMs),this.attempt=b(n.attempt),Array.isArray(n.causeChain))this.causeChain=n.causeChain;else if(n.causeChain!==void 0)this.causeChain=[n.causeChain];let o=Error.captureStackTrace;if(o)o(this,l)}getLocalizedMessage(e="ko"){let t=A[this.code];if(t?.[e])return t[e];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var c=(e)=>({isSuccess:!0,isFailure:!1,value:e}),i=(e)=>({isSuccess:!1,isFailure:!0,error:e});class u{static validateButtons(e){let t=[];if(e.length>5)t.push("Maximum 5 buttons are allowed");for(let r=0;r<e.length;r++){let n=e[r],o=r+1;if(!n.name||n.name.trim().length===0)t.push(`Button ${o}: name is required`);else if(n.name.length>14)t.push(`Button ${o}: name cannot exceed 14 characters`);u.validateButtonByType(n,o,t)}return{isValid:t.length===0,errors:t}}static validateButtonByType(e,t,r){switch(e.type){case"WL":u.validateWebLinkButton(e,t,r);break;case"AL":u.validateAppLinkButton(e,t,r);break;case"DS":u.validateDeliveryButton(e,t,r);break;case"BK":u.validateBotKeywordButton(e,t,r);break;case"MD":u.validateMessageDeliveryButton(e,t,r);break;default:r.push(`Button ${t}: invalid button type '${e.type}'`)}}static validateWebLinkButton(e,t,r){if(!e.linkMobile&&!e.linkPc)r.push(`Button ${t}: web link button must have at least mobile or PC link`);if(e.linkMobile&&!u.isValidUrl(e.linkMobile))r.push(`Button ${t}: invalid mobile link URL`);if(e.linkPc&&!u.isValidUrl(e.linkPc))r.push(`Button ${t}: invalid PC link URL`)}static validateAppLinkButton(e,t,r){if(!(e.linkIos||e.linkAndroid||e.schemeIos||e.schemeAndroid))r.push(`Button ${t}: app link button must have at least one app link or scheme`);if(e.linkIos&&!u.isValidUrl(e.linkIos))r.push(`Button ${t}: invalid iOS link URL`);if(e.linkAndroid&&!u.isValidUrl(e.linkAndroid))r.push(`Button ${t}: invalid Android link URL`)}static validateDeliveryButton(e,t,r){}static validateBotKeywordButton(e,t,r){}static validateMessageDeliveryButton(e,t,r){}static isValidUrl(e){try{return new URL(e),!0}catch{return!1}}static serializeButtons(e){let t=e.map((r)=>({name:r.name,type:r.type,url_mobile:r.linkMobile,url_pc:r.linkPc,url_ios:r.linkIos,url_android:r.linkAndroid,scheme_ios:r.schemeIos,scheme_android:r.schemeAndroid}));return JSON.stringify(t)}static deserializeButtons(e){try{return JSON.parse(e).map((r)=>({name:r.name,type:r.type,linkMobile:r.url_mobile,linkPc:r.url_pc,linkIos:r.url_ios,linkAndroid:r.url_android,schemeIos:r.scheme_ios,schemeAndroid:r.scheme_android}))}catch(t){throw Error(`Failed to parse buttons JSON: ${t}`)}}}var S=new Set(["WL","AL","DS","BK","MD"]);function d(e){return new l("INVALID_REQUEST",e)}function h(e){if(!e||typeof e!=="object"||Array.isArray(e))return;return e}function _(e){try{return c(JSON.parse(e))}catch(t){return i(d(`Invalid JSON for buttons: ${t instanceof Error?t.message:String(t)}`))}}function p(e,t,r){for(let n of t){if(!(n in e))continue;let o=e[n];if(o===null||o===void 0||o==="")return c(void 0);if(typeof o!=="string")return i(d(`buttons.${r} must be a string`));return c(o)}return c(void 0)}function v(e,t){let r=h(e);if(!r)return i(d(`buttons[${t}] must be an object with type/name`));let n=r.type;if(typeof n!=="string"||!S.has(n))return i(d(`buttons[${t}].type must be one of WL, AL, DS, BK, MD`));let o=n,a=r.name;if(typeof a!=="string"||a.trim().length===0)return i(d(`buttons[${t}].name is required`));let y=p(r,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(y.isFailure)return y;let f=p(r,["linkPc","url_pc","urlPc"],"linkPc");if(f.isFailure)return f;let m=p(r,["linkIos","url_ios","urlIos"],"linkIos");if(m.isFailure)return m;let E=p(r,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(E.isFailure)return E;let R=p(r,["schemeIos","scheme_ios"],"schemeIos");if(R.isFailure)return R;let T=p(r,["schemeAndroid","scheme_android"],"schemeAndroid");if(T.isFailure)return T;return c({type:o,name:a,...y.value?{linkMobile:y.value}:{},...f.value?{linkPc:f.value}:{},...m.value?{linkIos:m.value}:{},...E.value?{linkAndroid:E.value}:{},...R.value?{schemeIos:R.value}:{},...T.value?{schemeAndroid:T.value}:{}})}function P(e){if(e===void 0||e===null)return c(void 0);let t=e;if(typeof t==="string"){let a=_(t);if(a.isFailure)return a;t=a.value}let r=h(t);if(r&&Array.isArray(r.button))t=r.button;if(!Array.isArray(t))return i(d("buttons must be a JSON array"));let n=[];for(let[a,y]of t.entries()){let f=v(y,a);if(f.isFailure)return f;n.push(f.value)}let o=u.validateButtons(n);if(!o.isValid)return i(d(`Invalid template buttons: ${o.errors.join(", ")}`));return c(n)}function C(e,t={}){let r=t.requireName??!0,n=t.requireContent??!0,o={};if(e.name===void 0||e.name===null){if(r)return i(d("name is required"))}else if(typeof e.name!=="string"||e.name.trim().length===0)return i(d(r?"name is required":"name must be a non-empty string"));else o.name=e.name.trim();if(e.content===void 0||e.content===null){if(n)return i(d("content is required"))}else if(typeof e.content!=="string"||e.content.trim().length===0)return i(d(n?"content is required":"content must be a non-empty string"));else o.content=e.content;let a=P(e.buttons);if(a.isFailure)return a;if(a.value!==void 0)o.buttons=a.value;return c(o)}function I(e,t){if(t)return t;let r=e;if(typeof r.requestTemplateInspection==="function")return{requestTemplateInspection:r.requestTemplateInspection.bind(e)};return}class k{provider;inspectionProvider;constructor(e,t){this.provider=e;this.inspectionProvider=I(e,t)}async create(e,t){let r=C(e,{requireName:!0,requireContent:!0});if(r.isFailure)return r;let n={...e,...r.value.name?{name:r.value.name}:{},...r.value.content?{content:r.value.content}:{},...r.value.buttons!==void 0?{buttons:r.value.buttons}:{}};return this.provider.createTemplate(n,t)}async update(e,t,r){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));let n=C(t,{requireName:!1,requireContent:!1});if(n.isFailure)return n;let o={...t,...n.value.name!==void 0?{name:n.value.name}:{},...n.value.content!==void 0?{content:n.value.content}:{},...n.value.buttons!==void 0?{buttons:n.value.buttons}:{}};return this.provider.updateTemplate(e,o,r)}async delete(e,t){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));return this.provider.deleteTemplate(e,t)}async get(e,t){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));return this.provider.getTemplate(e,t)}async list(e,t){return this.provider.listTemplates(e,t)}async requestInspection(e,t){if(!e||e.trim().length===0)return i(new l("INVALID_REQUEST","Template code is required"));if(!this.inspectionProvider)return i(new l("INVALID_REQUEST","Template inspection is not supported by this provider"));return this.inspectionProvider.requestTemplateInspection(e,t)}}export{k as TemplateLifecycleService};
2
2
 
3
- //# debugId=15648F8E304974D364756E2164756E21
3
+ //# debugId=ACD4986ACDAB56E264756E2164756E21
4
4
  //# sourceMappingURL=index.mjs.map
@@ -11,6 +11,12 @@ export interface TemplatePersonalizerOptions {
11
11
  enableConditionals: boolean;
12
12
  enableLoops: boolean;
13
13
  maxRecursionDepth: number;
14
+ /**
15
+ * IANA time zone for the date, datetime, time, and `date:` formatters.
16
+ * Defaults to Korea Standard Time, the time the Korean recipients of
17
+ * these messages read, whatever timezone the host runs in.
18
+ */
19
+ timeZone: string;
14
20
  }
15
21
  export interface TemplateVariableInfo {
16
22
  name: string;
@@ -0,0 +1,4 @@
1
+ var{defineProperty:b,getOwnPropertyNames:M,getOwnPropertyDescriptor:P}=Object,O=Object.prototype.hasOwnProperty;function I(e){return this[e]}var v=(e)=>{var r=(A??=new WeakMap).get(e),t;if(r)return r;if(r=b({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var n of M(e))if(!O.call(r,n))b(r,n,{get:I.bind(e,n),enumerable:!(t=P(e,n))||t.enumerable})}return A.set(e,r),r},A;var N=(e)=>e;function w(e,r){this[e]=N.bind(null,r)}var L=(e,r)=>{for(var t in r)b(e,t,{get:r[t],enumerable:!0,configurable:!0,set:w.bind(r,t)})};var U={};L(U,{ButtonParser:()=>s,interpolate:()=>h,parseTemplateButtons:()=>k,validateTemplatePayload:()=>_});module.exports=v(U);function h(e,r){if(!e)return"";if(!r)return e;return e.replace(/#\{([^}]+)\}/g,(t,n)=>{let o=r[n];if(o===void 0||o===null)return t;return String(o)})}class s{static validateButtons(e){let r=[];if(e.length>5)r.push("Maximum 5 buttons are allowed");for(let t=0;t<e.length;t++){let n=e[t],o=t+1;if(!n.name||n.name.trim().length===0)r.push(`Button ${o}: name is required`);else if(n.name.length>14)r.push(`Button ${o}: name cannot exceed 14 characters`);s.validateButtonByType(n,o,r)}return{isValid:r.length===0,errors:r}}static validateButtonByType(e,r,t){switch(e.type){case"WL":s.validateWebLinkButton(e,r,t);break;case"AL":s.validateAppLinkButton(e,r,t);break;case"DS":s.validateDeliveryButton(e,r,t);break;case"BK":s.validateBotKeywordButton(e,r,t);break;case"MD":s.validateMessageDeliveryButton(e,r,t);break;default:t.push(`Button ${r}: invalid button type '${e.type}'`)}}static validateWebLinkButton(e,r,t){if(!e.linkMobile&&!e.linkPc)t.push(`Button ${r}: web link button must have at least mobile or PC link`);if(e.linkMobile&&!s.isValidUrl(e.linkMobile))t.push(`Button ${r}: invalid mobile link URL`);if(e.linkPc&&!s.isValidUrl(e.linkPc))t.push(`Button ${r}: invalid PC link URL`)}static validateAppLinkButton(e,r,t){if(!(e.linkIos||e.linkAndroid||e.schemeIos||e.schemeAndroid))t.push(`Button ${r}: app link button must have at least one app link or scheme`);if(e.linkIos&&!s.isValidUrl(e.linkIos))t.push(`Button ${r}: invalid iOS link URL`);if(e.linkAndroid&&!s.isValidUrl(e.linkAndroid))t.push(`Button ${r}: invalid Android link URL`)}static validateDeliveryButton(e,r,t){}static validateBotKeywordButton(e,r,t){}static validateMessageDeliveryButton(e,r,t){}static isValidUrl(e){try{return new URL(e),!0}catch{return!1}}static serializeButtons(e){let r=e.map((t)=>({name:t.name,type:t.type,url_mobile:t.linkMobile,url_pc:t.linkPc,url_ios:t.linkIos,url_android:t.linkAndroid,scheme_ios:t.schemeIos,scheme_android:t.schemeAndroid}));return JSON.stringify(r)}static deserializeButtons(e){try{return JSON.parse(e).map((t)=>({name:t.name,type:t.type,linkMobile:t.url_mobile,linkPc:t.url_pc,linkIos:t.url_ios,linkAndroid:t.url_android,schemeIos:t.scheme_ios,schemeAndroid:t.scheme_android}))}catch(r){throw Error(`Failed to parse buttons JSON: ${r}`)}}}var C;((i)=>{i.INVALID_REQUEST="INVALID_REQUEST";i.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";i.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";i.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";i.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";i.NETWORK_ERROR="NETWORK_ERROR";i.NETWORK_TIMEOUT="NETWORK_TIMEOUT";i.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";i.REQUEST_ABORTED="REQUEST_ABORTED";i.PROVIDER_ERROR="PROVIDER_ERROR";i.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";i.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";i.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";i.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";i.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";i.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";i.UNKNOWN_ERROR="UNKNOWN_ERROR"})(C||={});var B={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["REQUEST_ABORTED"]:{ko:"요청이 취소되었습니다",en:"Request aborted"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},Y=new Set(Object.values(C));var T=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class g extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,r,t,n={}){super(r);if(this.name="KMsgError",this.code=e,this.details=t,this.providerErrorCode=n.providerErrorCode,this.providerErrorText=n.providerErrorText,this.httpStatus=T(n.httpStatus),this.requestId=typeof n.requestId==="string"?n.requestId:void 0,this.retryAfterMs=T(n.retryAfterMs),this.attempt=T(n.attempt),Array.isArray(n.causeChain))this.causeChain=n.causeChain;else if(n.causeChain!==void 0)this.causeChain=[n.causeChain];let o=Error.captureStackTrace;if(o)o(this,g)}getLocalizedMessage(e="ko"){let r=B[this.code];if(r?.[e])return r[e];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var l=(e)=>({isSuccess:!0,isFailure:!1,value:e}),u=(e)=>({isSuccess:!1,isFailure:!0,error:e});var K=new Set(["WL","AL","DS","BK","MD"]);function d(e){return new g("INVALID_REQUEST",e)}function S(e){if(!e||typeof e!=="object"||Array.isArray(e))return;return e}function F(e){try{return l(JSON.parse(e))}catch(r){return u(d(`Invalid JSON for buttons: ${r instanceof Error?r.message:String(r)}`))}}function y(e,r,t){for(let n of r){if(!(n in e))continue;let o=e[n];if(o===null||o===void 0||o==="")return l(void 0);if(typeof o!=="string")return u(d(`buttons.${t} must be a string`));return l(o)}return l(void 0)}function D(e,r){let t=S(e);if(!t)return u(d(`buttons[${r}] must be an object with type/name`));let n=t.type;if(typeof n!=="string"||!K.has(n))return u(d(`buttons[${r}].type must be one of WL, AL, DS, BK, MD`));let o=n,a=t.name;if(typeof a!=="string"||a.trim().length===0)return u(d(`buttons[${r}].name is required`));let f=y(t,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(f.isFailure)return f;let c=y(t,["linkPc","url_pc","urlPc"],"linkPc");if(c.isFailure)return c;let E=y(t,["linkIos","url_ios","urlIos"],"linkIos");if(E.isFailure)return E;let p=y(t,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(p.isFailure)return p;let m=y(t,["schemeIos","scheme_ios"],"schemeIos");if(m.isFailure)return m;let R=y(t,["schemeAndroid","scheme_android"],"schemeAndroid");if(R.isFailure)return R;return l({type:o,name:a,...f.value?{linkMobile:f.value}:{},...c.value?{linkPc:c.value}:{},...E.value?{linkIos:E.value}:{},...p.value?{linkAndroid:p.value}:{},...m.value?{schemeIos:m.value}:{},...R.value?{schemeAndroid:R.value}:{}})}function k(e){if(e===void 0||e===null)return l(void 0);let r=e;if(typeof r==="string"){let a=F(r);if(a.isFailure)return a;r=a.value}let t=S(r);if(t&&Array.isArray(t.button))r=t.button;if(!Array.isArray(r))return u(d("buttons must be a JSON array"));let n=[];for(let[a,f]of r.entries()){let c=D(f,a);if(c.isFailure)return c;n.push(c.value)}let o=s.validateButtons(n);if(!o.isValid)return u(d(`Invalid template buttons: ${o.errors.join(", ")}`));return l(n)}function _(e,r={}){let t=r.requireName??!0,n=r.requireContent??!0,o={};if(e.name===void 0||e.name===null){if(t)return u(d("name is required"))}else if(typeof e.name!=="string"||e.name.trim().length===0)return u(d(t?"name is required":"name must be a non-empty string"));else o.name=e.name.trim();if(e.content===void 0||e.content===null){if(n)return u(d("content is required"))}else if(typeof e.content!=="string"||e.content.trim().length===0)return u(d(n?"content is required":"content must be a non-empty string"));else o.content=e.content;let a=k(e.buttons);if(a.isFailure)return a;if(a.value!==void 0)o.buttons=a.value;return l(o)}
2
+
3
+ //# debugId=E8C7E7D07B2309D264756E2164756E21
4
+ //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- var B=Object.defineProperty;var M=(f,q)=>{for(var T in q)B(f,T,{get:q[T],enumerable:!0,configurable:!0,set:(A)=>q[T]=()=>A})};function L(f,q){if(!f)return"";if(!q)return f;return f.replace(/#\{([^}]+)\}/g,(T,A)=>{let $=q[A];if($===void 0||$===null)return T;return String($)})}class V{static validateButtons(f){let q=[];if(f.length>5)q.push("Maximum 5 buttons are allowed");for(let T=0;T<f.length;T++){let A=f[T],$=T+1;if(!A.name||A.name.trim().length===0)q.push(`Button ${$}: name is required`);else if(A.name.length>14)q.push(`Button ${$}: name cannot exceed 14 characters`);V.validateButtonByType(A,$,q)}return{isValid:q.length===0,errors:q}}static validateButtonByType(f,q,T){switch(f.type){case"WL":V.validateWebLinkButton(f,q,T);break;case"AL":V.validateAppLinkButton(f,q,T);break;case"DS":V.validateDeliveryButton(f,q,T);break;case"BK":V.validateBotKeywordButton(f,q,T);break;case"MD":V.validateMessageDeliveryButton(f,q,T);break;default:T.push(`Button ${q}: invalid button type '${f.type}'`)}}static validateWebLinkButton(f,q,T){if(!f.linkMobile&&!f.linkPc)T.push(`Button ${q}: web link button must have at least mobile or PC link`);if(f.linkMobile&&!V.isValidUrl(f.linkMobile))T.push(`Button ${q}: invalid mobile link URL`);if(f.linkPc&&!V.isValidUrl(f.linkPc))T.push(`Button ${q}: invalid PC link URL`)}static validateAppLinkButton(f,q,T){if(!(f.linkIos||f.linkAndroid||f.schemeIos||f.schemeAndroid))T.push(`Button ${q}: app link button must have at least one app link or scheme`);if(f.linkIos&&!V.isValidUrl(f.linkIos))T.push(`Button ${q}: invalid iOS link URL`);if(f.linkAndroid&&!V.isValidUrl(f.linkAndroid))T.push(`Button ${q}: invalid Android link URL`)}static validateDeliveryButton(f,q,T){}static validateBotKeywordButton(f,q,T){}static validateMessageDeliveryButton(f,q,T){}static isValidUrl(f){try{return new URL(f),!0}catch{return!1}}static serializeButtons(f){let q=f.map((T)=>({name:T.name,type:T.type,url_mobile:T.linkMobile,url_pc:T.linkPc,url_ios:T.linkIos,url_android:T.linkAndroid,scheme_ios:T.schemeIos,scheme_android:T.schemeAndroid}));return JSON.stringify(q)}static deserializeButtons(f){try{return JSON.parse(f).map((T)=>({name:T.name,type:T.type,linkMobile:T.url_mobile,linkPc:T.url_pc,linkIos:T.url_ios,linkAndroid:T.url_android,schemeIos:T.scheme_ios,schemeAndroid:T.scheme_android}))}catch(q){throw Error(`Failed to parse buttons JSON: ${q}`)}}}var P;((k)=>{k.INVALID_REQUEST="INVALID_REQUEST";k.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";k.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";k.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";k.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";k.NETWORK_ERROR="NETWORK_ERROR";k.NETWORK_TIMEOUT="NETWORK_TIMEOUT";k.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";k.PROVIDER_ERROR="PROVIDER_ERROR";k.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";k.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";k.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";k.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";k.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";k.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";k.UNKNOWN_ERROR="UNKNOWN_ERROR"})(P||={});var O={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},h=new Set(Object.values(P));var U=(f)=>{if(typeof f!=="number"||Number.isNaN(f)||!Number.isFinite(f))return;return Math.trunc(f)};class _ extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(f,q,T,A={}){super(q);if(this.name="KMsgError",this.code=f,this.details=T,this.providerErrorCode=A.providerErrorCode,this.providerErrorText=A.providerErrorText,this.httpStatus=U(A.httpStatus),this.requestId=typeof A.requestId==="string"?A.requestId:void 0,this.retryAfterMs=U(A.retryAfterMs),this.attempt=U(A.attempt),Array.isArray(A.causeChain))this.causeChain=A.causeChain;else if(A.causeChain!==void 0)this.causeChain=[A.causeChain];let $=Error.captureStackTrace;if($)$(this,_)}getLocalizedMessage(f="ko"){let q=O[this.code];if(q?.[f])return q[f];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var W=(f)=>({isSuccess:!0,isFailure:!1,value:f}),J=(f)=>({isSuccess:!1,isFailure:!0,error:f});var S=new Set(["WL","AL","DS","BK","MD"]);function Q(f){return new _("INVALID_REQUEST",f)}function j(f){if(!f||typeof f!=="object"||Array.isArray(f))return;return f}function R(f){try{return W(JSON.parse(f))}catch(q){return J(Q(`Invalid JSON for buttons: ${q instanceof Error?q.message:String(q)}`))}}function X(f,q,T){for(let A of q){if(!(A in f))continue;let $=f[A];if($===null||$===void 0||$==="")return W(void 0);if(typeof $!=="string")return J(Q(`buttons.${T} must be a string`));return W($)}return W(void 0)}function K(f,q){let T=j(f);if(!T)return J(Q(`buttons[${q}] must be an object with type/name`));let A=T.type;if(typeof A!=="string"||!S.has(A))return J(Q(`buttons[${q}].type must be one of WL, AL, DS, BK, MD`));let $=A,F=T.name;if(typeof F!=="string"||F.trim().length===0)return J(Q(`buttons[${q}].name is required`));let D=X(T,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(D.isFailure)return D;let w=X(T,["linkPc","url_pc","urlPc"],"linkPc");if(w.isFailure)return w;let Z=X(T,["linkIos","url_ios","urlIos"],"linkIos");if(Z.isFailure)return Z;let G=X(T,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(G.isFailure)return G;let Y=X(T,["schemeIos","scheme_ios"],"schemeIos");if(Y.isFailure)return Y;let H=X(T,["schemeAndroid","scheme_android"],"schemeAndroid");if(H.isFailure)return H;return W({type:$,name:F,...D.value?{linkMobile:D.value}:{},...w.value?{linkPc:w.value}:{},...Z.value?{linkIos:Z.value}:{},...G.value?{linkAndroid:G.value}:{},...Y.value?{schemeIos:Y.value}:{},...H.value?{schemeAndroid:H.value}:{}})}function N(f){if(f===void 0||f===null)return W(void 0);let q=f;if(typeof q==="string"){let F=R(q);if(F.isFailure)return F;q=F.value}let T=j(q);if(T&&Array.isArray(T.button))q=T.button;if(!Array.isArray(q))return J(Q("buttons must be a JSON array"));let A=[];for(let[F,D]of q.entries()){let w=K(D,F);if(w.isFailure)return w;A.push(w.value)}let $=V.validateButtons(A);if(!$.isValid)return J(Q(`Invalid template buttons: ${$.errors.join(", ")}`));return W(A)}function y(f,q={}){let T=q.requireName??!0,A=q.requireContent??!0,$={};if(f.name===void 0||f.name===null){if(T)return J(Q("name is required"))}else if(typeof f.name!=="string"||f.name.trim().length===0)return J(Q(T?"name is required":"name must be a non-empty string"));else $.name=f.name.trim();if(f.content===void 0||f.content===null){if(A)return J(Q("content is required"))}else if(typeof f.content!=="string"||f.content.trim().length===0)return J(Q(A?"content is required":"content must be a non-empty string"));else $.content=f.content;let F=N(f.buttons);if(F.isFailure)return F;if(F.value!==void 0)$.buttons=F.value;return W($)}export{y as validateTemplatePayload,N as parseTemplateButtons,L as interpolate,V as ButtonParser};
1
+ function A(e,t){if(!e)return"";if(!t)return e;return e.replace(/#\{([^}]+)\}/g,(r,n)=>{let o=t[n];if(o===void 0||o===null)return r;return String(o)})}class a{static validateButtons(e){let t=[];if(e.length>5)t.push("Maximum 5 buttons are allowed");for(let r=0;r<e.length;r++){let n=e[r],o=r+1;if(!n.name||n.name.trim().length===0)t.push(`Button ${o}: name is required`);else if(n.name.length>14)t.push(`Button ${o}: name cannot exceed 14 characters`);a.validateButtonByType(n,o,t)}return{isValid:t.length===0,errors:t}}static validateButtonByType(e,t,r){switch(e.type){case"WL":a.validateWebLinkButton(e,t,r);break;case"AL":a.validateAppLinkButton(e,t,r);break;case"DS":a.validateDeliveryButton(e,t,r);break;case"BK":a.validateBotKeywordButton(e,t,r);break;case"MD":a.validateMessageDeliveryButton(e,t,r);break;default:r.push(`Button ${t}: invalid button type '${e.type}'`)}}static validateWebLinkButton(e,t,r){if(!e.linkMobile&&!e.linkPc)r.push(`Button ${t}: web link button must have at least mobile or PC link`);if(e.linkMobile&&!a.isValidUrl(e.linkMobile))r.push(`Button ${t}: invalid mobile link URL`);if(e.linkPc&&!a.isValidUrl(e.linkPc))r.push(`Button ${t}: invalid PC link URL`)}static validateAppLinkButton(e,t,r){if(!(e.linkIos||e.linkAndroid||e.schemeIos||e.schemeAndroid))r.push(`Button ${t}: app link button must have at least one app link or scheme`);if(e.linkIos&&!a.isValidUrl(e.linkIos))r.push(`Button ${t}: invalid iOS link URL`);if(e.linkAndroid&&!a.isValidUrl(e.linkAndroid))r.push(`Button ${t}: invalid Android link URL`)}static validateDeliveryButton(e,t,r){}static validateBotKeywordButton(e,t,r){}static validateMessageDeliveryButton(e,t,r){}static isValidUrl(e){try{return new URL(e),!0}catch{return!1}}static serializeButtons(e){let t=e.map((r)=>({name:r.name,type:r.type,url_mobile:r.linkMobile,url_pc:r.linkPc,url_ios:r.linkIos,url_android:r.linkAndroid,scheme_ios:r.schemeIos,scheme_android:r.schemeAndroid}));return JSON.stringify(t)}static deserializeButtons(e){try{return JSON.parse(e).map((r)=>({name:r.name,type:r.type,linkMobile:r.url_mobile,linkPc:r.url_pc,linkIos:r.url_ios,linkAndroid:r.url_android,schemeIos:r.scheme_ios,schemeAndroid:r.scheme_android}))}catch(t){throw Error(`Failed to parse buttons JSON: ${t}`)}}}var T;((i)=>{i.INVALID_REQUEST="INVALID_REQUEST";i.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";i.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";i.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";i.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";i.NETWORK_ERROR="NETWORK_ERROR";i.NETWORK_TIMEOUT="NETWORK_TIMEOUT";i.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";i.REQUEST_ABORTED="REQUEST_ABORTED";i.PROVIDER_ERROR="PROVIDER_ERROR";i.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";i.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";i.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";i.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";i.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";i.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";i.UNKNOWN_ERROR="UNKNOWN_ERROR"})(T||={});var h={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["REQUEST_ABORTED"]:{ko:"요청이 취소되었습니다",en:"Request aborted"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},v=new Set(Object.values(T));var b=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class g extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,r,n={}){super(t);if(this.name="KMsgError",this.code=e,this.details=r,this.providerErrorCode=n.providerErrorCode,this.providerErrorText=n.providerErrorText,this.httpStatus=b(n.httpStatus),this.requestId=typeof n.requestId==="string"?n.requestId:void 0,this.retryAfterMs=b(n.retryAfterMs),this.attempt=b(n.attempt),Array.isArray(n.causeChain))this.causeChain=n.causeChain;else if(n.causeChain!==void 0)this.causeChain=[n.causeChain];let o=Error.captureStackTrace;if(o)o(this,g)}getLocalizedMessage(e="ko"){let t=h[this.code];if(t?.[e])return t[e];return this.message}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var l=(e)=>({isSuccess:!0,isFailure:!1,value:e}),u=(e)=>({isSuccess:!1,isFailure:!0,error:e});var S=new Set(["WL","AL","DS","BK","MD"]);function d(e){return new g("INVALID_REQUEST",e)}function C(e){if(!e||typeof e!=="object"||Array.isArray(e))return;return e}function _(e){try{return l(JSON.parse(e))}catch(t){return u(d(`Invalid JSON for buttons: ${t instanceof Error?t.message:String(t)}`))}}function y(e,t,r){for(let n of t){if(!(n in e))continue;let o=e[n];if(o===null||o===void 0||o==="")return l(void 0);if(typeof o!=="string")return u(d(`buttons.${r} must be a string`));return l(o)}return l(void 0)}function M(e,t){let r=C(e);if(!r)return u(d(`buttons[${t}] must be an object with type/name`));let n=r.type;if(typeof n!=="string"||!S.has(n))return u(d(`buttons[${t}].type must be one of WL, AL, DS, BK, MD`));let o=n,s=r.name;if(typeof s!=="string"||s.trim().length===0)return u(d(`buttons[${t}].name is required`));let f=y(r,["linkMobile","url_mobile","urlMobile"],"linkMobile");if(f.isFailure)return f;let c=y(r,["linkPc","url_pc","urlPc"],"linkPc");if(c.isFailure)return c;let E=y(r,["linkIos","url_ios","urlIos"],"linkIos");if(E.isFailure)return E;let p=y(r,["linkAndroid","url_android","urlAndroid"],"linkAndroid");if(p.isFailure)return p;let m=y(r,["schemeIos","scheme_ios"],"schemeIos");if(m.isFailure)return m;let R=y(r,["schemeAndroid","scheme_android"],"schemeAndroid");if(R.isFailure)return R;return l({type:o,name:s,...f.value?{linkMobile:f.value}:{},...c.value?{linkPc:c.value}:{},...E.value?{linkIos:E.value}:{},...p.value?{linkAndroid:p.value}:{},...m.value?{schemeIos:m.value}:{},...R.value?{schemeAndroid:R.value}:{}})}function k(e){if(e===void 0||e===null)return l(void 0);let t=e;if(typeof t==="string"){let s=_(t);if(s.isFailure)return s;t=s.value}let r=C(t);if(r&&Array.isArray(r.button))t=r.button;if(!Array.isArray(t))return u(d("buttons must be a JSON array"));let n=[];for(let[s,f]of t.entries()){let c=M(f,s);if(c.isFailure)return c;n.push(c.value)}let o=a.validateButtons(n);if(!o.isValid)return u(d(`Invalid template buttons: ${o.errors.join(", ")}`));return l(n)}function P(e,t={}){let r=t.requireName??!0,n=t.requireContent??!0,o={};if(e.name===void 0||e.name===null){if(r)return u(d("name is required"))}else if(typeof e.name!=="string"||e.name.trim().length===0)return u(d(r?"name is required":"name must be a non-empty string"));else o.name=e.name.trim();if(e.content===void 0||e.content===null){if(n)return u(d("content is required"))}else if(typeof e.content!=="string"||e.content.trim().length===0)return u(d(n?"content is required":"content must be a non-empty string"));else o.content=e.content;let s=k(e.buttons);if(s.isFailure)return s;if(s.value!==void 0)o.buttons=s.value;return l(o)}export{a as ButtonParser,A as interpolate,k as parseTemplateButtons,P as validateTemplatePayload};
2
2
 
3
- //# debugId=6B774B31893F8FBC64756E2164756E21
3
+ //# debugId=D3077C1AF6D7B40364756E2164756E21
4
4
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,4 @@
1
+ var{defineProperty:f,getOwnPropertyNames:B,getOwnPropertyDescriptor:w}=Object,V=Object.prototype.hasOwnProperty;function S(e){return this[e]}var x=(e)=>{var t=(A??=new WeakMap).get(e),a;if(t)return t;if(t=f({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var i of B(e))if(!V.call(t,i))f(t,i,{get:S.bind(e,i),enumerable:!(a=w(e,i))||a.enumerable})}return A.set(e,t),t},A;var R=(e)=>e;function C(e,t){this[e]=R.bind(null,t)}var D=(e,t)=>{for(var a in t)f(e,a,{get:t[a],enumerable:!0,configurable:!0,set:C.bind(t,a)})};var P={};D(P,{InMemoryTemplateStore:()=>y,TemplateBuilder:()=>g,TemplateBuilders:()=>k,TemplateRegistry:()=>v});module.exports=x(P);class m{static validateButtons(e){let t=[];if(e.length>5)t.push("Maximum 5 buttons are allowed");for(let a=0;a<e.length;a++){let i=e[a],r=a+1;if(!i.name||i.name.trim().length===0)t.push(`Button ${r}: name is required`);else if(i.name.length>14)t.push(`Button ${r}: name cannot exceed 14 characters`);m.validateButtonByType(i,r,t)}return{isValid:t.length===0,errors:t}}static validateButtonByType(e,t,a){switch(e.type){case"WL":m.validateWebLinkButton(e,t,a);break;case"AL":m.validateAppLinkButton(e,t,a);break;case"DS":m.validateDeliveryButton(e,t,a);break;case"BK":m.validateBotKeywordButton(e,t,a);break;case"MD":m.validateMessageDeliveryButton(e,t,a);break;default:a.push(`Button ${t}: invalid button type '${e.type}'`)}}static validateWebLinkButton(e,t,a){if(!e.linkMobile&&!e.linkPc)a.push(`Button ${t}: web link button must have at least mobile or PC link`);if(e.linkMobile&&!m.isValidUrl(e.linkMobile))a.push(`Button ${t}: invalid mobile link URL`);if(e.linkPc&&!m.isValidUrl(e.linkPc))a.push(`Button ${t}: invalid PC link URL`)}static validateAppLinkButton(e,t,a){if(!(e.linkIos||e.linkAndroid||e.schemeIos||e.schemeAndroid))a.push(`Button ${t}: app link button must have at least one app link or scheme`);if(e.linkIos&&!m.isValidUrl(e.linkIos))a.push(`Button ${t}: invalid iOS link URL`);if(e.linkAndroid&&!m.isValidUrl(e.linkAndroid))a.push(`Button ${t}: invalid Android link URL`)}static validateDeliveryButton(e,t,a){}static validateBotKeywordButton(e,t,a){}static validateMessageDeliveryButton(e,t,a){}static isValidUrl(e){try{return new URL(e),!0}catch{return!1}}static serializeButtons(e){let t=e.map((a)=>({name:a.name,type:a.type,url_mobile:a.linkMobile,url_pc:a.linkPc,url_ios:a.linkIos,url_android:a.linkAndroid,scheme_ios:a.schemeIos,scheme_android:a.schemeAndroid}));return JSON.stringify(t)}static deserializeButtons(e){try{return JSON.parse(e).map((a)=>({name:a.name,type:a.type,linkMobile:a.url_mobile,linkPc:a.url_pc,linkIos:a.url_ios,linkAndroid:a.url_android,schemeIos:a.scheme_ios,schemeAndroid:a.scheme_android}))}catch(t){throw Error(`Failed to parse buttons JSON: ${t}`)}}}class d{static VARIABLE_PATTERN=/#{([^}]+)}/g;static extractVariables(e){let t=[],a=e.matchAll(d.VARIABLE_PATTERN);for(let i of a){let r=i[1].trim();if(r&&!t.includes(r))t.push(r)}return t}static replaceVariables(e,t){return e.replace(d.VARIABLE_PATTERN,(a,i)=>{let r=t[i.trim()];if(r===void 0||r===null)return a;if(r instanceof Date)return r.toISOString();return String(r)})}static validateVariables(e,t){let a=[];for(let i of e){let r=t[i.name];if(i.required&&(r===void 0||r===null)){a.push(`Required variable '${i.name}' is missing`);continue}if(r===void 0||r===null)continue;if(!d.validateVariableType(r,i.type))a.push(`Variable '${i.name}' has invalid type. Expected: ${i.type}`);if(i.maxLength&&String(r).length>i.maxLength)a.push(`Variable '${i.name}' exceeds maximum length of ${i.maxLength}`);if(i.format&&!new RegExp(i.format).test(String(r)))a.push(`Variable '${i.name}' does not match required format: ${i.format}`)}return{isValid:a.length===0,errors:a}}static validateVariableType(e,t){switch(t){case"string":return typeof e==="string";case"number":return typeof e==="number"&&!isNaN(e);case"date":return e instanceof Date||!isNaN(Date.parse(e));case"custom":return!0;default:return!1}}static validateTemplateVariables(e,t){let a=d.extractVariables(e),i=t.map((s)=>s.name),r=[];for(let s of a)if(!i.includes(s))r.push(`Variable '${s}' is used in template but not defined`);for(let s of t)if(s.required&&!a.includes(s.name))r.push(`Required variable '${s.name}' is defined but not used in template`);return{isValid:r.length===0,errors:r}}}class o{static validate(e){let t=[],a=[];o.validateBasicFields(e,t),o.validateContent(e,t,a);let i=d.validateTemplateVariables(e.content,e.variables||[]);if(t.push(...i.errors),e.buttons&&e.buttons.length>0){let r=m.validateButtons(e.buttons);t.push(...r.errors)}return o.validateByCategory(e,t,a),{isValid:t.length===0,errors:t,warnings:a}}static validateBasicFields(e,t){if(!e.name||e.name.trim().length===0)t.push("Template name is required");if(!e.code||e.code.trim().length===0)t.push("Template code is required");if(!e.provider||e.provider.trim().length===0)t.push("Provider is required")}static validateContent(e,t,a){if(!e.content||e.content.trim().length===0){t.push("Template content is required");return}let i=e.content;if(i.length>1000)t.push("Template content cannot exceed 1000 characters");if(o.containsProhibitedCharacters(i))t.push("Template content contains prohibited characters");if((i.match(/\n/g)||[]).length>20)a.push("Template content has many line breaks, which may affect readability");o.validateUrlsInContent(i,a)}static containsProhibitedCharacters(e){return/[<>]/.test(e)}static validateUrlsInContent(e,t){let a=/https?:\/\/[^\s]+/g,i=e.match(a)||[];for(let r of i)try{new URL(r)}catch{t.push(`Invalid URL found in content: ${r}`)}}static validateByCategory(e,t,a){switch(e.category){case"AUTHENTICATION":o.validateAuthenticationTemplate(e,t,a);break;case"PROMOTION":o.validatePromotionTemplate(e,t,a);break;case"PAYMENT":o.validatePaymentTemplate(e,t,a);break;case"INFORMATION":case"NOTIFICATION":case"RESERVATION":case"SHIPPING":break}}static validateAuthenticationTemplate(e,t,a){if(!(e.variables||[]).some((r)=>r.name.includes("인증")||r.name.includes("코드")||r.name.includes("번호")))a.push("Authentication template should include an authentication code variable");if(e.buttons&&e.buttons.length>0)a.push("Authentication templates typically should not have buttons")}static validatePromotionTemplate(e,t,a){if(!e.buttons||e.buttons.length===0)a.push("Promotion templates typically should have action buttons")}static validatePaymentTemplate(e,t,a){if(!(e.variables||[]).some((r)=>r.name.includes("금액")||r.name.includes("가격")||r.name.includes("원")))a.push("Payment template should include an amount variable")}static quickValidate(e){let t=[];if(!e.name)t.push("Name is required");if(!e.content)t.push("Content is required");if(!e.category)t.push("Category is required");if(!e.provider)t.push("Provider is required");return{isValid:t.length===0,errors:t,warnings:[]}}}class g{template={variables:[],buttons:[],status:"DRAFT",metadata:{createdAt:new Date,updatedAt:new Date,usage:{sent:0,delivered:0,failed:0}}};name(e){return this.template.name=e,this}code(e){return this.template.code=e,this}content(e){this.template.content=e;let t=d.extractVariables(e),a=(this.template.variables||[]).map((i)=>i.name);for(let i of t)if(!a.includes(i))this.variable(i,"string",!0);return this}category(e){return this.template.category=e,this}provider(e){return this.template.provider=e,this}status(e){return this.template.status=e,this}variable(e,t="string",a=!0,i={}){if(!this.template.variables)this.template.variables=[];this.template.variables=this.template.variables.filter((s)=>s.name!==e);let r={name:e,type:t,required:a,...i};return this.template.variables.push(r),this}variables(e){for(let t of e)this.variable(t.name,t.type||"string",t.required??!0,{maxLength:t.maxLength,format:t.format,description:t.description,example:t.example});return this}webLinkButton(e,t,a){return this.button({type:"WL",name:e,linkMobile:t,linkPc:a})}appLinkButton(e,t){return this.button({type:"AL",name:e,linkIos:t.iosUrl,linkAndroid:t.androidUrl,schemeIos:t.iosScheme,schemeAndroid:t.androidScheme})}deliveryButton(e){return this.button({type:"DS",name:e})}botKeywordButton(e){return this.button({type:"BK",name:e})}messageDeliveryButton(e){return this.button({type:"MD",name:e})}button(e){if(!this.template.buttons)this.template.buttons=[];if(this.template.buttons.length>=5)throw Error("Maximum 5 buttons are allowed per template");return this.template.buttons.push(e),this}clearButtons(){return this.template.buttons=[],this}metadata(e){let t=this.template.metadata??{createdAt:new Date,updatedAt:new Date,usage:{sent:0,delivered:0,failed:0}};return this.template.metadata={...t,...e,updatedAt:new Date},this}validate(){let e=o.quickValidate(this.template);if(!e.isValid)return e;try{let t=this.build();return o.validate(t)}catch(t){return{isValid:!1,errors:[t instanceof Error?t.message:"Unknown validation error"],warnings:[]}}}preview(e={}){if(!this.template.content)throw Error("Template content is required for preview");let t={...this.generateSampleVariables(),...e};return d.replaceVariables(this.template.content,t)}generateSampleVariables(){let e={};for(let t of this.template.variables||[])if(t.example)e[t.name]=t.example;else switch(t.type){case"string":e[t.name]=t.name.includes("name")||t.name.includes("이름")?"홍길동":t.name.includes("code")||t.name.includes("코드")?"123456":`샘플${t.name}`;break;case"number":e[t.name]=t.name.includes("amount")||t.name.includes("금액")?1e4:t.name.includes("count")||t.name.includes("개수")?1:123;break;case"date":e[t.name]=new Date;break;default:e[t.name]="샘플값"}return e}clone(){let e=new g;return e.template=structuredClone(this.template),e}reset(){return this.template={variables:[],buttons:[],status:"DRAFT",metadata:{createdAt:new Date,updatedAt:new Date,usage:{sent:0,delivered:0,failed:0}}},this}build(){if(!this.template.name)throw Error("Template name is required");if(!this.template.code)throw Error("Template code is required");if(!this.template.content)throw Error("Template content is required");if(!this.template.category)throw Error("Template category is required");if(!this.template.provider)throw Error("Template provider is required");let e={id:this.template.id||this.generateTemplateId(),name:this.template.name,code:this.template.code,content:this.template.content,variables:this.template.variables||[],buttons:this.template.buttons,category:this.template.category,status:this.template.status||"DRAFT",provider:this.template.provider,metadata:{...this.template.metadata,updatedAt:new Date}},t=o.validate(e);if(!t.isValid)throw Error(`Template validation failed: ${t.errors.join(", ")}`);return e}generateTemplateId(){return`tpl_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}}var k={authentication(e,t){return new g().name(e).category("AUTHENTICATION").provider(t).variable("code","string",!0,{maxLength:10,description:"Authentication code",example:"123456"})},notification(e,t){return new g().name(e).category("NOTIFICATION").provider(t).variable("name","string",!0,{description:"Recipient name",example:"홍길동"})},promotion(e,t){return new g().name(e).category("PROMOTION").provider(t).variable("name","string",!0,{description:"Customer name",example:"홍길동"}).variable("discount","number",!1,{description:"Discount percentage",example:"20"})},payment(e,t){return new g().name(e).category("PAYMENT").provider(t).variable("name","string",!0,{description:"Customer name",example:"홍길동"}).variable("amount","number",!0,{description:"Payment amount",example:"10000"})}};class T{listenersMap=new Map;on(e,t){let a=this.listenersMap.get(e)??new Set;return a.add(t),this.listenersMap.set(e,a),this}addListener(e,t){return this.on(e,t)}off(e,t){let a=this.listenersMap.get(e);if(!a)return this;if(a.delete(t),a.size===0)this.listenersMap.delete(e);return this}removeListener(e,t){return this.off(e,t)}once(e,t){let a=(...i)=>{this.off(e,a),t(...i)};return this.on(e,a)}emit(e,...t){let a=this.listenersMap.get(e);if(!a||a.size===0)return!1;for(let i of[...a])i(...t);return!0}removeAllListeners(e){if(e)return this.listenersMap.delete(e),this;return this.listenersMap.clear(),this}}class v extends T{templates=new Map;templatesByCode=new Map;templatesByProvider=new Map;templatesByCategory=new Map;templateHistories=new Map;usageStats=new Map;backupTimer;defaultOptions={enableVersioning:!0,maxVersionsPerTemplate:10,enableUsageTracking:!0,enableAutoBackup:!1,backupInterval:3600000,enableValidationOnRegister:!0};options;constructor(e={}){super();if(this.options={...this.defaultOptions,...e},this.options.enableAutoBackup)this.startAutoBackup()}async register(e){if(this.options.enableValidationOnRegister){let a=o.validate(e);if(!a.isValid)throw Error(`Template validation failed: ${a.errors.join(", ")}`)}let t=this.getByCode(e.code,e.provider);if(t&&t.id!==e.id)throw Error(`Template with code '${e.code}' already exists for provider '${e.provider}'`);if(this.templates.set(e.id,e),this.templatesByCode.set(`${e.provider}:${e.code}`,e),this.updateIndexes(e),this.options.enableVersioning)this.initializeVersionHistory(e);if(this.options.enableUsageTracking)this.initializeUsageStats(e);this.emit("template:registered",{template:e})}async update(e,t){let a=this.templates.get(e);if(!a)throw Error(`Template ${e} not found`);let i={...a,...t,id:e,metadata:{...a.metadata,...t.metadata,updatedAt:new Date}};if(this.options.enableValidationOnRegister){let r=o.validate(i);if(!r.isValid)throw Error(`Template validation failed: ${r.errors.join(", ")}`)}if(this.options.enableVersioning)this.addVersionToHistory(a,i);return this.templates.set(e,i),this.templatesByCode.set(`${i.provider}:${i.code}`,i),this.updateIndexes(i),this.emit("template:updated",{oldTemplate:a,newTemplate:i}),i}get(e){return this.templates.get(e)||null}getByCode(e,t){return this.templatesByCode.get(`${t}:${e}`)||null}search(e={},t={}){let a=Array.from(this.templates.values());if(e.provider)a=a.filter((n)=>n.provider===e.provider);if(e.category)a=a.filter((n)=>n.category===e.category);if(e.status)a=a.filter((n)=>n.status===e.status);if(e.nameContains){let n=e.nameContains.toLowerCase();a=a.filter((l)=>l.name.toLowerCase().includes(n))}if(e.codeContains){let n=e.codeContains.toLowerCase();a=a.filter((l)=>l.code.toLowerCase().includes(n))}if(e.createdAfter){let n=e.createdAfter;a=a.filter((l)=>l.metadata.createdAt>=n)}if(e.createdBefore){let n=e.createdBefore;a=a.filter((l)=>l.metadata.createdAt<=n)}if(e.usageMin!==void 0){let n=e.usageMin;a=a.filter((l)=>l.metadata.usage.sent>=n)}if(e.usageMax!==void 0){let n=e.usageMax;a=a.filter((l)=>l.metadata.usage.sent<=n)}let i=t.sortBy||"createdAt",r=t.sortOrder||"desc";a.sort((n,l)=>{let u=0,c=0;switch(i){case"name":u=n.name,c=l.name;break;case"code":u=n.code,c=l.code;break;case"createdAt":u=n.metadata.createdAt.getTime(),c=l.metadata.createdAt.getTime();break;case"updatedAt":u=n.metadata.updatedAt.getTime(),c=l.metadata.updatedAt.getTime();break;case"usage":u=n.metadata.usage.sent,c=l.metadata.usage.sent;break;default:u=n.metadata.createdAt.getTime(),c=l.metadata.createdAt.getTime()}if(r==="asc")return u<c?-1:u>c?1:0;else return u>c?-1:u<c?1:0});let s=t.page||1,p=t.limit||20,h=(s-1)*p,b=h+p;return{templates:a.slice(h,b),total:a.length,page:s,limit:p,hasMore:b<a.length}}getByProvider(e){let t=this.templatesByProvider.get(e)||new Set;return Array.from(t).map((a)=>this.templates.get(a)).filter((a)=>a!==void 0)}getByCategory(e){let t=this.templatesByCategory.get(e)||new Set;return Array.from(t).map((a)=>this.templates.get(a)).filter((a)=>a!==void 0)}async delete(e){let t=this.templates.get(e);if(!t)return!1;this.templates.delete(e),this.templatesByCode.delete(`${t.provider}:${t.code}`);let a=this.templatesByProvider.get(t.provider);if(a){if(a.delete(e),a.size===0)this.templatesByProvider.delete(t.provider)}let i=this.templatesByCategory.get(t.category);if(i){if(i.delete(e),i.size===0)this.templatesByCategory.delete(t.category)}return this.templateHistories.delete(e),this.usageStats.delete(e),this.emit("template:deleted",{template:t}),!0}getHistory(e){return this.templateHistories.get(e)||null}getVersion(e,t){let a=this.templateHistories.get(e);if(!a)return null;let i=a.versions.find((r)=>r.version===t);return i?i.template:null}async restoreVersion(e,t){let a=this.getVersion(e,t);if(!a)throw Error(`Version ${t} not found for template ${e}`);return this.update(e,{...a,metadata:{...a.metadata,updatedAt:new Date}})}getUsageStats(e){return this.usageStats.get(e)||null}updateUsageStats(e,t){let a=this.templates.get(e);if(!a)return;if(t.sent)a.metadata.usage.sent+=t.sent;if(t.delivered)a.metadata.usage.delivered+=t.delivered;if(t.failed)a.metadata.usage.failed+=t.failed;if(this.options.enableUsageTracking){let i=this.usageStats.get(e);if(i){if(t.sent)i.totalSent+=t.sent;if(t.delivered)i.totalDelivered+=t.delivered;if(t.failed)i.totalFailed+=t.failed;i.deliveryRate=i.totalSent>0?i.totalDelivered/i.totalSent*100:0,i.failureRate=i.totalSent>0?i.totalFailed/i.totalSent*100:0,i.lastUsed=new Date;let r=new Date().toISOString().split("T")[0],s=i.usageByDay.find((p)=>p.date===r);if(!s)s={date:r,sent:0,delivered:0,failed:0},i.usageByDay.push(s),i.usageByDay=i.usageByDay.sort((p,h)=>h.date.localeCompare(p.date)).slice(0,30);if(t.sent)s.sent+=t.sent;if(t.delivered)s.delivered+=t.delivered;if(t.failed)s.failed+=t.failed}}this.emit("usage:updated",{templateId:e,stats:t})}getStats(){let e=Array.from(this.templates.values()),t={},a={},i={};for(let r of e)t[r.provider]=(t[r.provider]||0)+1,a[r.category]=(a[r.category]||0)+1,i[r.status]=(i[r.status]||0)+1;return{totalTemplates:e.length,byProvider:t,byCategory:a,byStatus:i}}export(e){let t=this.search(e,{limit:1e4});return JSON.stringify({templates:t.templates,exportedAt:new Date().toISOString(),total:t.total},null,2)}async import(e,t={}){let a={imported:0,skipped:0,errors:[]};try{let r=JSON.parse(e).templates||[];for(let s of r)try{if(this.get(s.id)&&!t.overwrite){a.skipped++;continue}await this.register(s),a.imported++}catch(p){a.errors.push(`Template ${s.id}: ${p instanceof Error?p.message:"Unknown error"}`)}}catch(i){a.errors.push(`Invalid JSON format: ${i instanceof Error?i.message:"Unknown error"}`)}return a}clear(){this.templates.clear(),this.templatesByCode.clear(),this.templatesByProvider.clear(),this.templatesByCategory.clear(),this.templateHistories.clear(),this.usageStats.clear(),this.emit("registry:cleared")}destroy(){if(this.backupTimer)clearInterval(this.backupTimer),this.backupTimer=void 0;this.removeAllListeners(),this.emit("registry:destroyed")}updateIndexes(e){if(!this.templatesByProvider.has(e.provider))this.templatesByProvider.set(e.provider,new Set);let t=this.templatesByProvider.get(e.provider);if(t)t.add(e.id);if(!this.templatesByCategory.has(e.category))this.templatesByCategory.set(e.category,new Set);let a=this.templatesByCategory.get(e.category);if(a)a.add(e.id)}initializeVersionHistory(e){let t={templateId:e.id,versions:[{version:1,template:JSON.parse(JSON.stringify(e)),changes:["Initial version"],createdAt:new Date}],currentVersion:1};this.templateHistories.set(e.id,t)}addVersionToHistory(e,t){let a=this.templateHistories.get(t.id);if(!a)return;let i=[];if(e.name!==t.name)i.push("Name changed");if(e.content!==t.content)i.push("Content changed");if(e.category!==t.category)i.push("Category changed");if(e.status!==t.status)i.push("Status changed");if(JSON.stringify(e.variables)!==JSON.stringify(t.variables))i.push("Variables changed");if(JSON.stringify(e.buttons)!==JSON.stringify(t.buttons))i.push("Buttons changed");if(i.length===0)return;let r={version:a.currentVersion+1,template:JSON.parse(JSON.stringify(t)),changes:i,createdAt:new Date};a.versions.push(r),a.currentVersion=r.version;let s=this.options.maxVersionsPerTemplate;if(a.versions.length>s)a.versions=a.versions.slice(-s)}initializeUsageStats(e){let t={templateId:e.id,totalSent:e.metadata.usage.sent,totalDelivered:e.metadata.usage.delivered,totalFailed:e.metadata.usage.failed,deliveryRate:0,failureRate:0,usageByDay:[]};if(t.totalSent>0)t.deliveryRate=t.totalDelivered/t.totalSent*100,t.failureRate=t.totalFailed/t.totalSent*100;this.usageStats.set(e.id,t)}startAutoBackup(){let e=this.options.backupInterval;this.backupTimer=setInterval(()=>{this.emit("backup:requested",{data:this.export(),timestamp:new Date})},e)}}class y{templates=new Map;async createTemplate(e){let t=d.extractVariables(e.content),a={...e,id:this.generateTemplateId(),variables:t.map((r)=>({name:r,type:"string",required:!0})),metadata:{createdAt:new Date,updatedAt:new Date,usage:{sent:0,delivered:0,failed:0}}},i=o.validate(a);if(!i.isValid)throw Error(`Template validation failed: ${i.errors.join(", ")}`);return this.templates.set(a.id,a),a}async getTemplate(e){return this.templates.get(e)||null}async updateTemplate(e,t){let a=this.templates.get(e);if(!a)throw Error(`Template ${e} not found`);let i=new Date;if(i.getTime()<=a.metadata.updatedAt.getTime())i.setTime(a.metadata.updatedAt.getTime()+1);let r={...a,...t,metadata:{...a.metadata,updatedAt:i}};return this.templates.set(e,r),r}async deleteTemplate(e){this.templates.delete(e)}async renderTemplate(e,t){let a=this.templates.get(e);if(!a)throw Error(`Template ${e} not found`);let i=d.validateVariables(a.variables||[],t);if(!i.isValid)throw Error(`Variable validation failed: ${i.errors.join(", ")}`);return d.replaceVariables(a.content,t)}generateTemplateId(){return`tpl_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}}
2
+
3
+ //# debugId=DE9FB193C507ED5864756E2164756E21
4
+ //# sourceMappingURL=index.cjs.map