@k-msg/provider 0.26.0 → 0.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aligo/index.js +3 -42
- package/dist/aligo/index.mjs +3 -42
- package/dist/index.js +3 -42
- package/dist/index.mjs +3 -42
- package/dist/iwinv/index.js +2 -41
- package/dist/iwinv/index.mjs +2 -41
- package/dist/solapi/index.js +2 -2
- package/dist/solapi/index.mjs +2 -2
- package/package.json +9 -6
- package/dist/aligo/index.js.map +0 -99
- package/dist/aligo/index.mjs.map +0 -99
- package/dist/index.js.map +0 -113
- package/dist/index.mjs.map +0 -113
- package/dist/iwinv/index.js.map +0 -104
- package/dist/iwinv/index.mjs.map +0 -104
- package/dist/solapi/index.js.map +0 -21
- package/dist/solapi/index.mjs.map +0 -21
package/dist/solapi/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var{defineProperty:j,getOwnPropertyNames:de,getOwnPropertyDescriptor:fe}=Object,ce=Object.prototype.hasOwnProperty;var Z=new WeakMap,ye=(e)=>{var t=Z.get(e),n;if(t)return t;if(t=j({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")de(e).map((r)=>!ce.call(t,r)&&j(t,r,{get:()=>e[r],enumerable:!(n=fe(e,r))||n.enumerable}));return Z.set(e,t),t};var ge=(e,t)=>{for(var n in t)j(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(r)=>t[n]=()=>r})};var Ke={};ge(Ke,{initializeSolapi:()=>ae,createSolapiProvider:()=>$,createDefaultSolapiProvider:()=>H,SolapiProviderFactory:()=>G,SolapiProvider:()=>x});module.exports=ye(Ke);var C;((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"})(C||={});var ue={["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"}},Fe=new Set(Object.values(C));var Q=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class a extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,n,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=n,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=Q(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=Q(r.retryAfterMs),this.attempt=Q(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,a)}getLocalizedMessage(e="ko"){let t=ue[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 R=(e)=>({isSuccess:!0,isFailure:!1,value:e}),O=(e)=>({isSuccess:!1,isFailure:!0,error:e});function Se(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function b(e){let t=Se()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}var ke=["PENDING","SENT","DELIVERED","FAILED","CANCELLED","UNKNOWN"],Ie=["DELIVERED","FAILED","CANCELLED","UNKNOWN"],be=["PENDING","SENT"],gt=new Set(ke),ut=new Set(Ie),ht=new Set(be);var Ae=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"],St=new Set(Ae);var oe=require("solapi");var z={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function ee(e){return z[e]}function jt(){return Object.values(z)}function m(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var k=require("solapi");function T(e,t){if(e instanceof a)return e;let n=m(e)?e:{};if(e instanceof k.ApiKeyError)return new a("AUTHENTICATION_FAILED",e.message,{providerId:t});if(e instanceof k.BadRequestError)return new a("INVALID_REQUEST",e.message,{providerId:t,validationErrors:n.validationErrors});if(e instanceof k.NetworkError)return new a("NETWORK_ERROR",e.message,{providerId:t,url:typeof n.url==="string"?n.url:void 0,method:typeof n.method==="string"?n.method:void 0,isRetryable:typeof n.isRetryable==="boolean"?n.isRetryable:!0});if(e instanceof k.ClientError){let r=typeof n.httpStatus==="number"?n.httpStatus:void 0,d=typeof r==="number"&&r>=400&&r<500;return new a(d?"INVALID_REQUEST":"PROVIDER_ERROR",e.message,{providerId:t,httpStatus:r,errorCode:n.errorCode,errorMessage:n.errorMessage,url:n.url})}if(e instanceof k.ServerError)return new a("PROVIDER_ERROR",e.message,{providerId:t,httpStatus:typeof n.httpStatus==="number"?n.httpStatus:void 0});if(e instanceof k.DefaultError)return new a("PROVIDER_ERROR",e.message,{providerId:t,errorCode:n.errorCode,errorMessage:n.errorMessage});return new a("UNKNOWN_ERROR",e instanceof Error?e.message:String(e),{providerId:t})}function te(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function W(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function U(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function F(e){let t={};if(!e)return t;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;t[n]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function ne(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!n)continue;if(n.type!=="WL")continue;if(!n.name||!n.urlMobile)continue;t.push({buttonName:n.name,buttonType:"WL",linkMo:n.urlMobile,linkPc:n.urlPc})}return t.length>0?t:void 0}function B(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let n=e.media?.image;if(!n)return;if("ref"in n){let r=n.ref.trim();return r.length>0?r:void 0}throw new a("INVALID_REQUEST","SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function _(e){return m(e)&&typeof e.fileId==="string"?e.fileId:void 0}function ie(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function re(e){let{providerId:t,client:n,query:r}=e,d=r.providerMessageId.trim();if(!d)return O(new a("INVALID_REQUEST","providerMessageId is required",{providerId:t}));try{let s=await n.getMessages({messageId:d,limit:1}),S=(m(s)?s:{}).messageList;if(!S||typeof S!=="object"||Array.isArray(S))return R(null);let p=S,P=p[d],q=Object.values(p).find((K)=>{if(!m(K))return!1;let E=K.messageId;return typeof E==="string"?E===d:!1}),I=m(P)?P:m(q)?q:void 0;if(!I)return R(null);let u=typeof I.statusCode==="string"?I.statusCode:void 0,M=te(u),w=W(I.dateSent),f=W(I.dateCompleted);return R({providerId:t,providerMessageId:d,status:M,statusCode:u,statusMessage:typeof I.statusMessage==="string"?I.statusMessage:void 0,sentAt:w,deliveredAt:f,raw:I})}catch(s){return O(T(s,t))}}function Ce(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function we(e){let{options:t,response:n,providerId:r,warnings:d}=e,s=m(n)?n:{},A=typeof s.messageId==="string"?s.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:A,status:"SENT",type:t.type,to:t.to,...Array.isArray(d)&&d.length>0?{warnings:d}:{},raw:n}}async function Re(e){let{options:t,providerId:n,config:r,client:d}=e,s=ie(t),A=t.options?.scheduledAt,S=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,p={to:U(t.to),type:s},P=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(P)p.country=P;let N=t.options?.customFields;if(N&&typeof N==="object"){let i={};for(let[o,l]of Object.entries(N)){if(l===void 0)continue;i[o]=typeof l==="string"?l:String(l)}if(Object.keys(i).length>0)p.customFields=i}if(A)p.scheduledDate=A;if(s==="SMS"||s==="LMS"||s==="MMS"||s==="VOICE"||s==="FAX"||String(s).startsWith("RCS_")){if(!S||S.length===0)throw new a("INVALID_REQUEST","from is required (options.from or config.defaultFrom)",{providerId:n,type:t.type});p.from=U(S)}else if(S)p.from=U(S);if(s==="SMS"||s==="LMS"||s==="MMS"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for SMS/LMS/MMS",{providerId:n,type:t.type});p.text=o;let l=i.subject;if(l)p.subject=l;if(s==="MMS"){let c=B({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!c)throw new a("INVALID_REQUEST","image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:n});let y=await d.uploadFile(c,"MMS"),g=_(y);if(typeof g==="string"&&g.length>0)p.imageId=g;else throw new a("PROVIDER_ERROR","Failed to upload MMS image",{providerId:n})}return p}if(s==="ATA"){let i=t,o=i.failover,l=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!l||l.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=typeof o?.fallbackContent==="string"&&o.fallbackContent.trim().length>0?o.fallbackContent.trim():void 0,y=typeof o?.fallbackTitle==="string"&&o.fallbackTitle.trim().length>0?o.fallbackTitle.trim():void 0,g=o?.enabled===!0?!1:o?.enabled===!1?!0:i.kakao?.disableSms;if(c)p.text=c;if(y)p.subject=y;return p.kakaoOptions={pfId:l,templateId:i.templateId,variables:F(i.variables),disableSms:g,adFlag:i.kakao?.adFlag,buttons:Array.isArray(i.kakao?.buttons)?i.kakao.buttons:void 0,imageId:i.kakao?.imageId},p}if(s==="CTA"||s==="CTI"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for FRIENDTALK",{providerId:n});let l=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!l||l.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=ne(i.buttons),y=Array.isArray(i.kakao?.buttons)?i.kakao.buttons:c,g=typeof i.kakao?.imageLink==="string"&&i.kakao.imageLink.length>0?i.kakao.imageLink:void 0,v=Array.isArray(y)&&y.length>0?y[0]:void 0,D=m(v)&&typeof v.linkMo==="string"?v.linkMo:void 0,J=g??D,Y;if(s==="CTI"){let X=B({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!X)throw new a("INVALID_REQUEST","image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:n});if(!J)throw new a("INVALID_REQUEST","imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:n});let le=await d.uploadFile(X,"KAKAO",void 0,J),V=_(le);if(typeof V==="string"&&V.length>0)Y=V;else throw new a("PROVIDER_ERROR","Failed to upload friendtalk image",{providerId:n})}return p.text=o,p.kakaoOptions={pfId:l,variables:F(i.variables),disableSms:i.kakao?.disableSms,adFlag:i.kakao?.adFlag,buttons:y,imageId:Y},p}if(s==="NSA"){let i=t,o=typeof i.naver?.talkId==="string"&&i.naver.talkId.length>0?i.naver.talkId:r.naverTalkId;if(!o||o.length===0)throw new a("INVALID_REQUEST","naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:n});let l=typeof i.naver?.templateId==="string"&&i.naver.templateId.length>0?i.naver.templateId:i.templateId,c={...F(i.variables),...F(i.naver?.variables)};return p.naverOptions={talkId:o,templateId:l,variables:c,disableSms:i.naver?.disableSms,buttons:Array.isArray(i.naver?.buttons)?i.naver.buttons:void 0},p}if(s==="VOICE"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for VOICE",{providerId:n});let l=i.voice?.voiceType,c=l==="FEMALE"||l==="MALE"?l:"FEMALE";return p.text=o,p.voiceOptions=i.voice?{...i.voice,voiceType:c}:{voiceType:c},p}if(s==="FAX"){let o=t.fax,c=Array.isArray(o?.fileIds)?o.fileIds.filter((y)=>typeof y==="string"&&y.length>0):[];if(c.length===0){let y=Array.isArray(o?.fileUrls)?o.fileUrls.filter((g)=>typeof g==="string"&&g.length>0):[];if(y.length===0)throw new a("INVALID_REQUEST","fax.fileIds or fax.fileUrls is required",{providerId:n});c=[];for(let g of y){let v=await d.uploadFile(g,"FAX"),D=_(v);if(typeof D==="string"&&D.length>0)c.push(D)}}if(c.length===0)throw new a("PROVIDER_ERROR","Failed to resolve fax fileIds",{providerId:n});return p.faxOptions={fileIds:c},p}let I=t,u=I.rcs,M=typeof u?.brandId==="string"&&u.brandId.length>0?u.brandId:r.rcsBrandId;if(!M||M.length===0)throw new a("INVALID_REQUEST","rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:n});let w={brandId:M,buttons:Array.isArray(u?.buttons)?u.buttons:void 0,copyAllowed:u?.copyAllowed,mmsType:u?.mmsType,commercialType:u?.commercialType,disableSms:u?.disableSms,variables:{...F(I.variables),...F(u?.variables)}};if(s==="RCS_TPL"||s==="RCS_ITPL"||s==="RCS_LTPL"){let i=t;w.templateId=typeof i.rcs?.templateId==="string"&&i.rcs.templateId.length>0?i.rcs.templateId:i.templateId}let f,K;if(s==="RCS_SMS"||s==="RCS_LMS"||s==="RCS_MMS"){let i=t;if(f=i.text,K=i.subject,!f||f.length===0)throw new a("INVALID_REQUEST","text is required for RCS text types",{providerId:n});if(p.text=f,K)p.subject=K}let E=u?.additionalBody,h=m(E)?E:void 0,pe=h&&typeof h.imageId==="string"&&h.imageId.length>0?h.imageId:h&&typeof h.imaggeId==="string"&&h.imaggeId.length>0?h.imaggeId:void 0,L=(i)=>{let o=h?{...h}:{},l=typeof o.title==="string"&&o.title.length>0?o.title:K||"RCS",c=typeof o.description==="string"&&o.description.length>0?o.description:f||"",y=pe??i,g={...o,title:l,description:c};if(typeof y==="string"&&y.length>0)g.imaggeId=y;return g};if(s==="RCS_MMS"){let i=t,o=B({imageUrl:i.imageUrl,media:i.media,providerId:n});if(o){let l=await d.uploadFile(o,"RCS"),c=_(l);if(typeof c==="string"&&c.length>0)w.additionalBody=L(c);else if(h)w.additionalBody=L(void 0)}else if(h)w.additionalBody=L(void 0)}else if(h)w.additionalBody=L(void 0);return p.rcsOptions=w,p}async function se(e){let{providerId:t,client:n,config:r,options:d}=e,s=Ce(d,t),A=await Re({options:d,providerId:t,config:r,client:n}),S=await n.sendOne(A,r.appId);return R(we({options:d,response:S,providerId:t,warnings:s}))}class x{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=ee(this.id);if(!e)throw new a("INVALID_REQUEST",`Onboarding spec missing for provider: ${this.id}`,{providerId:this.id});return e}constructor(e,t){if(!e||typeof e!=="object")throw new a("INVALID_REQUEST","SolapiProvider requires a config object",{providerId:this.id});if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new oe.SolapiMessageService(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(n){return e.push(n instanceof Error?n.message:String(n)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),n={...e,messageId:t};try{return await se({providerId:this.id,client:this.client,config:this.config,options:n})}catch(r){return O(T(r,this.id))}}async getDeliveryStatus(e){return re({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),n=t,r=[n.balance,n.point],d=Number.NaN;for(let s of r){if(typeof s==="number"&&Number.isFinite(s)){d=s;break}if(typeof s==="string"){let A=Number(s);if(Number.isFinite(A)){d=A;break}}}if(!Number.isFinite(d))return O(T(Error("Invalid balance response from SOLAPI"),this.id));return R({providerId:this.id,channel:e?.channel,amount:d,currency:"KRW",raw:t})}catch(t){return O(T(t,this.id))}}}var $=(e)=>new x(e),H=()=>{let e={apiKey:b("SOLAPI_API_KEY")||"",apiSecret:b("SOLAPI_API_SECRET")||"",baseUrl:b("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:b("SOLAPI_DEFAULT_FROM"),kakaoPfId:b("SOLAPI_KAKAO_PF_ID"),rcsBrandId:b("SOLAPI_RCS_BRAND_ID"),naverTalkId:b("SOLAPI_NAVER_TALK_ID"),appId:b("SOLAPI_APP_ID"),defaultCountry:b("SOLAPI_DEFAULT_COUNTRY"),debug:b("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return $(e)};class G{static create(e){return new x(e)}static createDefault(){return H()}}function ae(){}
|
|
1
|
+
var{defineProperty:j,getOwnPropertyNames:de,getOwnPropertyDescriptor:pe}=Object,fe=Object.prototype.hasOwnProperty;var J=new WeakMap,ce=(e)=>{var t=J.get(e),n;if(t)return t;if(t=j({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")de(e).map((r)=>!fe.call(t,r)&&j(t,r,{get:()=>e[r],enumerable:!(n=pe(e,r))||n.enumerable}));return J.set(e,t),t};var ue=(e,t)=>{for(var n in t)j(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(r)=>t[n]=()=>r})};var ye={};ue(ye,{initializeSolapi:()=>ae,createSolapiProvider:()=>W,createDefaultSolapiProvider:()=>X,SolapiProviderFactory:()=>z,SolapiProvider:()=>N});module.exports=ce(ye);var c=require("@k-msg/core"),oe=require("solapi");var Y={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function Z(e){return Y[e]}function ke(){return Object.values(Y)}var R=require("@k-msg/core");function S(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var g=require("@k-msg/core"),b=require("solapi");function T(e,t){if(e instanceof g.KMsgError)return e;let n=S(e)?e:{};if(e instanceof b.ApiKeyError)return new g.KMsgError(g.KMsgErrorCode.AUTHENTICATION_FAILED,e.message,{providerId:t});if(e instanceof b.BadRequestError)return new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,e.message,{providerId:t,validationErrors:n.validationErrors});if(e instanceof b.NetworkError)return new g.KMsgError(g.KMsgErrorCode.NETWORK_ERROR,e.message,{providerId:t,url:typeof n.url==="string"?n.url:void 0,method:typeof n.method==="string"?n.method:void 0,isRetryable:typeof n.isRetryable==="boolean"?n.isRetryable:!0});if(e instanceof b.ClientError){let r=typeof n.httpStatus==="number"?n.httpStatus:void 0,p=typeof r==="number"&&r>=400&&r<500;return new g.KMsgError(p?g.KMsgErrorCode.INVALID_REQUEST:g.KMsgErrorCode.PROVIDER_ERROR,e.message,{providerId:t,httpStatus:r,errorCode:n.errorCode,errorMessage:n.errorMessage,url:n.url})}if(e instanceof b.ServerError)return new g.KMsgError(g.KMsgErrorCode.PROVIDER_ERROR,e.message,{providerId:t,httpStatus:typeof n.httpStatus==="number"?n.httpStatus:void 0});if(e instanceof b.DefaultError)return new g.KMsgError(g.KMsgErrorCode.PROVIDER_ERROR,e.message,{providerId:t,errorCode:n.errorCode,errorMessage:n.errorMessage});return new g.KMsgError(g.KMsgErrorCode.UNKNOWN_ERROR,e instanceof Error?e.message:String(e),{providerId:t})}var F=require("@k-msg/core");function ee(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function Q(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function K(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function w(e){let t={};if(!e)return t;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;t[n]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function te(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!n)continue;if(n.type!=="WL")continue;if(!n.name||!n.urlMobile)continue;t.push({buttonName:n.name,buttonType:"WL",linkMo:n.urlMobile,linkPc:n.urlPc})}return t.length>0?t:void 0}function V(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let n=e.media?.image;if(!n)return;if("ref"in n){let r=n.ref.trim();return r.length>0?r:void 0}throw new F.KMsgError(F.KMsgErrorCode.INVALID_REQUEST,"SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function P(e){return S(e)&&typeof e.fileId==="string"?e.fileId:void 0}function ne(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function ie(e){let{providerId:t,client:n,query:r}=e,p=r.providerMessageId.trim();if(!p)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));try{let o=await n.getMessages({messageId:p,limit:1}),k=(S(o)?o:{}).messageList;if(!k||typeof k!=="object"||Array.isArray(k))return R.ok(null);let l=k,E=l[p],q=Object.values(l).find((v)=>{if(!S(v))return!1;let L=v.messageId;return typeof L==="string"?L===p:!1}),h=S(E)?E:S(q)?q:void 0;if(!h)return R.ok(null);let I=typeof h.statusCode==="string"?h.statusCode:void 0,_=ee(I),A=Q(h.dateSent),O=Q(h.dateCompleted);return R.ok({providerId:t,providerMessageId:p,status:_,statusCode:I,statusMessage:typeof h.statusMessage==="string"?h.statusMessage:void 0,sentAt:A,deliveredAt:O,raw:h})}catch(o){return R.fail(T(o,t))}}var s=require("@k-msg/core");function ge(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function me(e){let{options:t,response:n,providerId:r,warnings:p}=e,o=S(n)?n:{},M=typeof o.messageId==="string"?o.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:M,status:"SENT",type:t.type,to:t.to,...Array.isArray(p)&&p.length>0?{warnings:p}:{},raw:n}}async function Ie(e){let{options:t,providerId:n,config:r,client:p}=e,o=ne(t),M=t.options?.scheduledAt,k=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,l={to:K(t.to),type:o},E=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(E)l.country=E;let D=t.options?.customFields;if(D&&typeof D==="object"){let i={};for(let[a,d]of Object.entries(D)){if(d===void 0)continue;i[a]=typeof d==="string"?d:String(d)}if(Object.keys(i).length>0)l.customFields=i}if(M)l.scheduledDate=M;if(o==="SMS"||o==="LMS"||o==="MMS"||o==="VOICE"||o==="FAX"||String(o).startsWith("RCS_")){if(!k||k.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"from is required (options.from or config.defaultFrom)",{providerId:n,type:t.type});l.from=K(k)}else if(k)l.from=K(k);if(o==="SMS"||o==="LMS"||o==="MMS"){let i=t,a=i.text;if(a.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"text is required for SMS/LMS/MMS",{providerId:n,type:t.type});l.text=a;let d=i.subject;if(d)l.subject=d;if(o==="MMS"){let f=V({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!f)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:n});let u=await p.uploadFile(f,"MMS"),m=P(u);if(typeof m==="string"&&m.length>0)l.imageId=m;else throw new s.KMsgError(s.KMsgErrorCode.PROVIDER_ERROR,"Failed to upload MMS image",{providerId:n})}return l}if(o==="ATA"){let i=t,a=i.failover,d=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let f=typeof a?.fallbackContent==="string"&&a.fallbackContent.trim().length>0?a.fallbackContent.trim():void 0,u=typeof a?.fallbackTitle==="string"&&a.fallbackTitle.trim().length>0?a.fallbackTitle.trim():void 0,m=a?.enabled===!0?!1:a?.enabled===!1?!0:i.kakao?.disableSms;if(f)l.text=f;if(u)l.subject=u;return l.kakaoOptions={pfId:d,templateId:i.templateId,variables:w(i.variables),disableSms:m,adFlag:i.kakao?.adFlag,buttons:Array.isArray(i.kakao?.buttons)?i.kakao.buttons:void 0,imageId:i.kakao?.imageId},l}if(o==="CTA"||o==="CTI"){let i=t,a=i.text;if(a.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"text is required for FRIENDTALK",{providerId:n});let d=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let f=te(i.buttons),u=Array.isArray(i.kakao?.buttons)?i.kakao.buttons:f,m=typeof i.kakao?.imageLink==="string"&&i.kakao.imageLink.length>0?i.kakao.imageLink:void 0,C=Array.isArray(u)&&u.length>0?u[0]:void 0,x=S(C)&&typeof C.linkMo==="string"?C.linkMo:void 0,$=m??x,G;if(o==="CTI"){let H=V({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!H)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:n});if(!$)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:n});let le=await p.uploadFile(H,"KAKAO",void 0,$),B=P(le);if(typeof B==="string"&&B.length>0)G=B;else throw new s.KMsgError(s.KMsgErrorCode.PROVIDER_ERROR,"Failed to upload friendtalk image",{providerId:n})}return l.text=a,l.kakaoOptions={pfId:d,variables:w(i.variables),disableSms:i.kakao?.disableSms,adFlag:i.kakao?.adFlag,buttons:u,imageId:G},l}if(o==="NSA"){let i=t,a=typeof i.naver?.talkId==="string"&&i.naver.talkId.length>0?i.naver.talkId:r.naverTalkId;if(!a||a.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:n});let d=typeof i.naver?.templateId==="string"&&i.naver.templateId.length>0?i.naver.templateId:i.templateId,f={...w(i.variables),...w(i.naver?.variables)};return l.naverOptions={talkId:a,templateId:d,variables:f,disableSms:i.naver?.disableSms,buttons:Array.isArray(i.naver?.buttons)?i.naver.buttons:void 0},l}if(o==="VOICE"){let i=t,a=i.text;if(a.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"text is required for VOICE",{providerId:n});let d=i.voice?.voiceType,f=d==="FEMALE"||d==="MALE"?d:"FEMALE";return l.text=a,l.voiceOptions=i.voice?{...i.voice,voiceType:f}:{voiceType:f},l}if(o==="FAX"){let a=t.fax,f=Array.isArray(a?.fileIds)?a.fileIds.filter((u)=>typeof u==="string"&&u.length>0):[];if(f.length===0){let u=Array.isArray(a?.fileUrls)?a.fileUrls.filter((m)=>typeof m==="string"&&m.length>0):[];if(u.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"fax.fileIds or fax.fileUrls is required",{providerId:n});f=[];for(let m of u){let C=await p.uploadFile(m,"FAX"),x=P(C);if(typeof x==="string"&&x.length>0)f.push(x)}}if(f.length===0)throw new s.KMsgError(s.KMsgErrorCode.PROVIDER_ERROR,"Failed to resolve fax fileIds",{providerId:n});return l.faxOptions={fileIds:f},l}let h=t,I=h.rcs,_=typeof I?.brandId==="string"&&I.brandId.length>0?I.brandId:r.rcsBrandId;if(!_||_.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:n});let A={brandId:_,buttons:Array.isArray(I?.buttons)?I.buttons:void 0,copyAllowed:I?.copyAllowed,mmsType:I?.mmsType,commercialType:I?.commercialType,disableSms:I?.disableSms,variables:{...w(h.variables),...w(I?.variables)}};if(o==="RCS_TPL"||o==="RCS_ITPL"||o==="RCS_LTPL"){let i=t;A.templateId=typeof i.rcs?.templateId==="string"&&i.rcs.templateId.length>0?i.rcs.templateId:i.templateId}let O,v;if(o==="RCS_SMS"||o==="RCS_LMS"||o==="RCS_MMS"){let i=t;if(O=i.text,v=i.subject,!O||O.length===0)throw new s.KMsgError(s.KMsgErrorCode.INVALID_REQUEST,"text is required for RCS text types",{providerId:n});if(l.text=O,v)l.subject=v}let L=I?.additionalBody,y=S(L)?L:void 0,se=y&&typeof y.imageId==="string"&&y.imageId.length>0?y.imageId:y&&typeof y.imaggeId==="string"&&y.imaggeId.length>0?y.imaggeId:void 0,U=(i)=>{let a=y?{...y}:{},d=typeof a.title==="string"&&a.title.length>0?a.title:v||"RCS",f=typeof a.description==="string"&&a.description.length>0?a.description:O||"",u=se??i,m={...a,title:d,description:f};if(typeof u==="string"&&u.length>0)m.imaggeId=u;return m};if(o==="RCS_MMS"){let i=t,a=V({imageUrl:i.imageUrl,media:i.media,providerId:n});if(a){let d=await p.uploadFile(a,"RCS"),f=P(d);if(typeof f==="string"&&f.length>0)A.additionalBody=U(f);else if(y)A.additionalBody=U(void 0)}else if(y)A.additionalBody=U(void 0)}else if(y)A.additionalBody=U(void 0);return l.rcsOptions=A,l}async function re(e){let{providerId:t,client:n,config:r,options:p}=e,o=ge(p,t),M=await Ie({options:p,providerId:t,config:r,client:n}),k=await n.sendOne(M,r.appId);return s.ok(me({options:p,response:k,providerId:t,warnings:o}))}class N{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=Z(this.id);if(!e)throw new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,`Onboarding spec missing for provider: ${this.id}`,{providerId:this.id});return e}constructor(e,t){if(!e||typeof e!=="object")throw new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"SolapiProvider requires a config object",{providerId:this.id});if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new oe.SolapiMessageService(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(n){return e.push(n instanceof Error?n.message:String(n)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),n={...e,messageId:t};try{return await re({providerId:this.id,client:this.client,config:this.config,options:n})}catch(r){return c.fail(T(r,this.id))}}async getDeliveryStatus(e){return ie({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),n=t,r=[n.balance,n.point],p=Number.NaN;for(let o of r){if(typeof o==="number"&&Number.isFinite(o)){p=o;break}if(typeof o==="string"){let M=Number(o);if(Number.isFinite(M)){p=M;break}}}if(!Number.isFinite(p))return c.fail(T(Error("Invalid balance response from SOLAPI"),this.id));return c.ok({providerId:this.id,channel:e?.channel,amount:p,currency:"KRW",raw:t})}catch(t){return c.fail(T(t,this.id))}}}var W=(e)=>new N(e),X=()=>{let e={apiKey:c.readRuntimeEnv("SOLAPI_API_KEY")||"",apiSecret:c.readRuntimeEnv("SOLAPI_API_SECRET")||"",baseUrl:c.readRuntimeEnv("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:c.readRuntimeEnv("SOLAPI_DEFAULT_FROM"),kakaoPfId:c.readRuntimeEnv("SOLAPI_KAKAO_PF_ID"),rcsBrandId:c.readRuntimeEnv("SOLAPI_RCS_BRAND_ID"),naverTalkId:c.readRuntimeEnv("SOLAPI_NAVER_TALK_ID"),appId:c.readRuntimeEnv("SOLAPI_APP_ID"),defaultCountry:c.readRuntimeEnv("SOLAPI_DEFAULT_COUNTRY"),debug:c.readRuntimeEnv("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return W(e)};class z{static create(e){return new N(e)}static createDefault(){return X()}}function ae(){}
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=22D7FD78E1A81A5164756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/solapi/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var se=Object.defineProperty;var Re=(e,t)=>{for(var n in t)se(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(r)=>t[n]=()=>r})};var A;((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"})(A||={});var oe={["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"}},Oe=new Set(Object.values(A));var V=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class a extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,n,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=n,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=V(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=V(r.retryAfterMs),this.attempt=V(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,a)}getLocalizedMessage(e="ko"){let t=oe[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 w=(e)=>({isSuccess:!0,isFailure:!1,value:e}),K=(e)=>({isSuccess:!1,isFailure:!0,error:e});function le(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function I(e){let t=le()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}var de=["PENDING","SENT","DELIVERED","FAILED","CANCELLED","UNKNOWN"],fe=["DELIVERED","FAILED","CANCELLED","UNKNOWN"],ce=["PENDING","SENT"],yt=new Set(de),gt=new Set(fe),ut=new Set(ce);var ye=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"],mt=new Set(ye);import{SolapiMessageService as Ce}from"solapi";var H={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function G(e){return H[e]}function Vt(){return Object.values(H)}function m(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}import{ApiKeyError as ge,BadRequestError as ue,ClientError as he,DefaultError as me,NetworkError as Se,ServerError as ke}from"solapi";function F(e,t){if(e instanceof a)return e;let n=m(e)?e:{};if(e instanceof ge)return new a("AUTHENTICATION_FAILED",e.message,{providerId:t});if(e instanceof ue)return new a("INVALID_REQUEST",e.message,{providerId:t,validationErrors:n.validationErrors});if(e instanceof Se)return new a("NETWORK_ERROR",e.message,{providerId:t,url:typeof n.url==="string"?n.url:void 0,method:typeof n.method==="string"?n.method:void 0,isRetryable:typeof n.isRetryable==="boolean"?n.isRetryable:!0});if(e instanceof he){let r=typeof n.httpStatus==="number"?n.httpStatus:void 0,d=typeof r==="number"&&r>=400&&r<500;return new a(d?"INVALID_REQUEST":"PROVIDER_ERROR",e.message,{providerId:t,httpStatus:r,errorCode:n.errorCode,errorMessage:n.errorMessage,url:n.url})}if(e instanceof ke)return new a("PROVIDER_ERROR",e.message,{providerId:t,httpStatus:typeof n.httpStatus==="number"?n.httpStatus:void 0});if(e instanceof me)return new a("PROVIDER_ERROR",e.message,{providerId:t,errorCode:n.errorCode,errorMessage:n.errorMessage});return new a("UNKNOWN_ERROR",e instanceof Error?e.message:String(e),{providerId:t})}function J(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function j(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function N(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function O(e){let t={};if(!e)return t;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;t[n]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function Y(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!n)continue;if(n.type!=="WL")continue;if(!n.name||!n.urlMobile)continue;t.push({buttonName:n.name,buttonType:"WL",linkMo:n.urlMobile,linkPc:n.urlPc})}return t.length>0?t:void 0}function L(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let n=e.media?.image;if(!n)return;if("ref"in n){let r=n.ref.trim();return r.length>0?r:void 0}throw new a("INVALID_REQUEST","SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function D(e){return m(e)&&typeof e.fileId==="string"?e.fileId:void 0}function X(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function Z(e){let{providerId:t,client:n,query:r}=e,d=r.providerMessageId.trim();if(!d)return K(new a("INVALID_REQUEST","providerMessageId is required",{providerId:t}));try{let s=await n.getMessages({messageId:d,limit:1}),S=(m(s)?s:{}).messageList;if(!S||typeof S!=="object"||Array.isArray(S))return w(null);let p=S,T=p[d],B=Object.values(p).find((R)=>{if(!m(R))return!1;let M=R.messageId;return typeof M==="string"?M===d:!1}),k=m(T)?T:m(B)?B:void 0;if(!k)return w(null);let u=typeof k.statusCode==="string"?k.statusCode:void 0,P=J(u),C=j(k.dateSent),f=j(k.dateCompleted);return w({providerId:t,providerMessageId:d,status:P,statusCode:u,statusMessage:typeof k.statusMessage==="string"?k.statusMessage:void 0,sentAt:C,deliveredAt:f,raw:k})}catch(s){return K(F(s,t))}}function Ie(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function be(e){let{options:t,response:n,providerId:r,warnings:d}=e,s=m(n)?n:{},b=typeof s.messageId==="string"?s.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:b,status:"SENT",type:t.type,to:t.to,...Array.isArray(d)&&d.length>0?{warnings:d}:{},raw:n}}async function Ae(e){let{options:t,providerId:n,config:r,client:d}=e,s=X(t),b=t.options?.scheduledAt,S=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,p={to:N(t.to),type:s},T=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(T)p.country=T;let _=t.options?.customFields;if(_&&typeof _==="object"){let i={};for(let[o,l]of Object.entries(_)){if(l===void 0)continue;i[o]=typeof l==="string"?l:String(l)}if(Object.keys(i).length>0)p.customFields=i}if(b)p.scheduledDate=b;if(s==="SMS"||s==="LMS"||s==="MMS"||s==="VOICE"||s==="FAX"||String(s).startsWith("RCS_")){if(!S||S.length===0)throw new a("INVALID_REQUEST","from is required (options.from or config.defaultFrom)",{providerId:n,type:t.type});p.from=N(S)}else if(S)p.from=N(S);if(s==="SMS"||s==="LMS"||s==="MMS"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for SMS/LMS/MMS",{providerId:n,type:t.type});p.text=o;let l=i.subject;if(l)p.subject=l;if(s==="MMS"){let c=L({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!c)throw new a("INVALID_REQUEST","image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:n});let y=await d.uploadFile(c,"MMS"),g=D(y);if(typeof g==="string"&&g.length>0)p.imageId=g;else throw new a("PROVIDER_ERROR","Failed to upload MMS image",{providerId:n})}return p}if(s==="ATA"){let i=t,o=i.failover,l=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!l||l.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=typeof o?.fallbackContent==="string"&&o.fallbackContent.trim().length>0?o.fallbackContent.trim():void 0,y=typeof o?.fallbackTitle==="string"&&o.fallbackTitle.trim().length>0?o.fallbackTitle.trim():void 0,g=o?.enabled===!0?!1:o?.enabled===!1?!0:i.kakao?.disableSms;if(c)p.text=c;if(y)p.subject=y;return p.kakaoOptions={pfId:l,templateId:i.templateId,variables:O(i.variables),disableSms:g,adFlag:i.kakao?.adFlag,buttons:Array.isArray(i.kakao?.buttons)?i.kakao.buttons:void 0,imageId:i.kakao?.imageId},p}if(s==="CTA"||s==="CTI"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for FRIENDTALK",{providerId:n});let l=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!l||l.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=Y(i.buttons),y=Array.isArray(i.kakao?.buttons)?i.kakao.buttons:c,g=typeof i.kakao?.imageLink==="string"&&i.kakao.imageLink.length>0?i.kakao.imageLink:void 0,E=Array.isArray(y)&&y.length>0?y[0]:void 0,v=m(E)&&typeof E.linkMo==="string"?E.linkMo:void 0,Q=g??v,W;if(s==="CTI"){let $=L({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!$)throw new a("INVALID_REQUEST","image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:n});if(!Q)throw new a("INVALID_REQUEST","imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:n});let re=await d.uploadFile($,"KAKAO",void 0,Q),q=D(re);if(typeof q==="string"&&q.length>0)W=q;else throw new a("PROVIDER_ERROR","Failed to upload friendtalk image",{providerId:n})}return p.text=o,p.kakaoOptions={pfId:l,variables:O(i.variables),disableSms:i.kakao?.disableSms,adFlag:i.kakao?.adFlag,buttons:y,imageId:W},p}if(s==="NSA"){let i=t,o=typeof i.naver?.talkId==="string"&&i.naver.talkId.length>0?i.naver.talkId:r.naverTalkId;if(!o||o.length===0)throw new a("INVALID_REQUEST","naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:n});let l=typeof i.naver?.templateId==="string"&&i.naver.templateId.length>0?i.naver.templateId:i.templateId,c={...O(i.variables),...O(i.naver?.variables)};return p.naverOptions={talkId:o,templateId:l,variables:c,disableSms:i.naver?.disableSms,buttons:Array.isArray(i.naver?.buttons)?i.naver.buttons:void 0},p}if(s==="VOICE"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for VOICE",{providerId:n});let l=i.voice?.voiceType,c=l==="FEMALE"||l==="MALE"?l:"FEMALE";return p.text=o,p.voiceOptions=i.voice?{...i.voice,voiceType:c}:{voiceType:c},p}if(s==="FAX"){let o=t.fax,c=Array.isArray(o?.fileIds)?o.fileIds.filter((y)=>typeof y==="string"&&y.length>0):[];if(c.length===0){let y=Array.isArray(o?.fileUrls)?o.fileUrls.filter((g)=>typeof g==="string"&&g.length>0):[];if(y.length===0)throw new a("INVALID_REQUEST","fax.fileIds or fax.fileUrls is required",{providerId:n});c=[];for(let g of y){let E=await d.uploadFile(g,"FAX"),v=D(E);if(typeof v==="string"&&v.length>0)c.push(v)}}if(c.length===0)throw new a("PROVIDER_ERROR","Failed to resolve fax fileIds",{providerId:n});return p.faxOptions={fileIds:c},p}let k=t,u=k.rcs,P=typeof u?.brandId==="string"&&u.brandId.length>0?u.brandId:r.rcsBrandId;if(!P||P.length===0)throw new a("INVALID_REQUEST","rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:n});let C={brandId:P,buttons:Array.isArray(u?.buttons)?u.buttons:void 0,copyAllowed:u?.copyAllowed,mmsType:u?.mmsType,commercialType:u?.commercialType,disableSms:u?.disableSms,variables:{...O(k.variables),...O(u?.variables)}};if(s==="RCS_TPL"||s==="RCS_ITPL"||s==="RCS_LTPL"){let i=t;C.templateId=typeof i.rcs?.templateId==="string"&&i.rcs.templateId.length>0?i.rcs.templateId:i.templateId}let f,R;if(s==="RCS_SMS"||s==="RCS_LMS"||s==="RCS_MMS"){let i=t;if(f=i.text,R=i.subject,!f||f.length===0)throw new a("INVALID_REQUEST","text is required for RCS text types",{providerId:n});if(p.text=f,R)p.subject=R}let M=u?.additionalBody,h=m(M)?M:void 0,ie=h&&typeof h.imageId==="string"&&h.imageId.length>0?h.imageId:h&&typeof h.imaggeId==="string"&&h.imaggeId.length>0?h.imaggeId:void 0,x=(i)=>{let o=h?{...h}:{},l=typeof o.title==="string"&&o.title.length>0?o.title:R||"RCS",c=typeof o.description==="string"&&o.description.length>0?o.description:f||"",y=ie??i,g={...o,title:l,description:c};if(typeof y==="string"&&y.length>0)g.imaggeId=y;return g};if(s==="RCS_MMS"){let i=t,o=L({imageUrl:i.imageUrl,media:i.media,providerId:n});if(o){let l=await d.uploadFile(o,"RCS"),c=D(l);if(typeof c==="string"&&c.length>0)C.additionalBody=x(c);else if(h)C.additionalBody=x(void 0)}else if(h)C.additionalBody=x(void 0)}else if(h)C.additionalBody=x(void 0);return p.rcsOptions=C,p}async function z(e){let{providerId:t,client:n,config:r,options:d}=e,s=Ie(d,t),b=await Ae({options:d,providerId:t,config:r,client:n}),S=await n.sendOne(b,r.appId);return w(be({options:d,response:S,providerId:t,warnings:s}))}class U{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=G(this.id);if(!e)throw new a("INVALID_REQUEST",`Onboarding spec missing for provider: ${this.id}`,{providerId:this.id});return e}constructor(e,t){if(!e||typeof e!=="object")throw new a("INVALID_REQUEST","SolapiProvider requires a config object",{providerId:this.id});if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new Ce(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(n){return e.push(n instanceof Error?n.message:String(n)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),n={...e,messageId:t};try{return await z({providerId:this.id,client:this.client,config:this.config,options:n})}catch(r){return K(F(r,this.id))}}async getDeliveryStatus(e){return Z({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),n=t,r=[n.balance,n.point],d=Number.NaN;for(let s of r){if(typeof s==="number"&&Number.isFinite(s)){d=s;break}if(typeof s==="string"){let b=Number(s);if(Number.isFinite(b)){d=b;break}}}if(!Number.isFinite(d))return K(F(Error("Invalid balance response from SOLAPI"),this.id));return w({providerId:this.id,channel:e?.channel,amount:d,currency:"KRW",raw:t})}catch(t){return K(F(t,this.id))}}}var ee=(e)=>new U(e),te=()=>{let e={apiKey:I("SOLAPI_API_KEY")||"",apiSecret:I("SOLAPI_API_SECRET")||"",baseUrl:I("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:I("SOLAPI_DEFAULT_FROM"),kakaoPfId:I("SOLAPI_KAKAO_PF_ID"),rcsBrandId:I("SOLAPI_RCS_BRAND_ID"),naverTalkId:I("SOLAPI_NAVER_TALK_ID"),appId:I("SOLAPI_APP_ID"),defaultCountry:I("SOLAPI_DEFAULT_COUNTRY"),debug:I("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return ee(e)};class ne{static create(e){return new U(e)}static createDefault(){return te()}}function we(){}export{we as initializeSolapi,ee as createSolapiProvider,te as createDefaultSolapiProvider,ne as SolapiProviderFactory,U as SolapiProvider};
|
|
1
|
+
import{fail as Q,KMsgError as ne,KMsgErrorCode as ie,ok as Me,readRuntimeEnv as h}from"@k-msg/core";import{SolapiMessageService as Ae}from"solapi";var $={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function G(e){return $[e]}function ve(){return Object.values($)}import{fail as Z,KMsgError as ye,KMsgErrorCode as Se,ok as j}from"@k-msg/core";function y(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}import{KMsgError as M,KMsgErrorCode as A}from"@k-msg/core";import{ApiKeyError as de,BadRequestError as pe,ClientError as fe,DefaultError as ce,NetworkError as ue,ServerError as ge}from"solapi";function T(e,t){if(e instanceof M)return e;let n=y(e)?e:{};if(e instanceof de)return new M(A.AUTHENTICATION_FAILED,e.message,{providerId:t});if(e instanceof pe)return new M(A.INVALID_REQUEST,e.message,{providerId:t,validationErrors:n.validationErrors});if(e instanceof ue)return new M(A.NETWORK_ERROR,e.message,{providerId:t,url:typeof n.url==="string"?n.url:void 0,method:typeof n.method==="string"?n.method:void 0,isRetryable:typeof n.isRetryable==="boolean"?n.isRetryable:!0});if(e instanceof fe){let a=typeof n.httpStatus==="number"?n.httpStatus:void 0,d=typeof a==="number"&&a>=400&&a<500;return new M(d?A.INVALID_REQUEST:A.PROVIDER_ERROR,e.message,{providerId:t,httpStatus:a,errorCode:n.errorCode,errorMessage:n.errorMessage,url:n.url})}if(e instanceof ge)return new M(A.PROVIDER_ERROR,e.message,{providerId:t,httpStatus:typeof n.httpStatus==="number"?n.httpStatus:void 0});if(e instanceof ce)return new M(A.PROVIDER_ERROR,e.message,{providerId:t,errorCode:n.errorCode,errorMessage:n.errorMessage});return new M(A.UNKNOWN_ERROR,e instanceof Error?e.message:String(e),{providerId:t})}import{KMsgError as me,KMsgErrorCode as Ie}from"@k-msg/core";function H(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function B(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function U(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function w(e){let t={};if(!e)return t;for(let[n,a]of Object.entries(e)){if(a===void 0)continue;t[n]=a===null?"":a instanceof Date?a.toISOString():typeof a==="string"?a:String(a)}return t}function J(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!n)continue;if(n.type!=="WL")continue;if(!n.name||!n.urlMobile)continue;t.push({buttonName:n.name,buttonType:"WL",linkMo:n.urlMobile,linkPc:n.urlPc})}return t.length>0?t:void 0}function F(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let n=e.media?.image;if(!n)return;if("ref"in n){let a=n.ref.trim();return a.length>0?a:void 0}throw new me(Ie.INVALID_REQUEST,"SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function P(e){return y(e)&&typeof e.fileId==="string"?e.fileId:void 0}function Y(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function ee(e){let{providerId:t,client:n,query:a}=e,d=a.providerMessageId.trim();if(!d)return Z(new ye(Se.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));try{let r=await n.getMessages({messageId:d,limit:1}),S=(y(r)?r:{}).messageList;if(!S||typeof S!=="object"||Array.isArray(S))return j(null);let s=S,E=s[d],V=Object.values(s).find((v)=>{if(!y(v))return!1;let L=v.messageId;return typeof L==="string"?L===d:!1}),k=y(E)?E:y(V)?V:void 0;if(!k)return j(null);let m=typeof k.statusCode==="string"?k.statusCode:void 0,_=H(m),R=B(k.dateSent),O=B(k.dateCompleted);return j({providerId:t,providerMessageId:d,status:_,statusCode:m,statusMessage:typeof k.statusMessage==="string"?k.statusMessage:void 0,sentAt:R,deliveredAt:O,raw:k})}catch(r){return Z(T(r,t))}}import{KMsgError as c,KMsgErrorCode as u,ok as ke}from"@k-msg/core";function be(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function he(e){let{options:t,response:n,providerId:a,warnings:d}=e,r=y(n)?n:{},b=typeof r.messageId==="string"?r.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:a,providerMessageId:b,status:"SENT",type:t.type,to:t.to,...Array.isArray(d)&&d.length>0?{warnings:d}:{},raw:n}}async function Re(e){let{options:t,providerId:n,config:a,client:d}=e,r=Y(t),b=t.options?.scheduledAt,S=typeof t.from==="string"&&t.from.length>0?t.from:a.defaultFrom,s={to:U(t.to),type:r},E=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof a.defaultCountry==="string"?a.defaultCountry:void 0;if(E)s.country=E;let N=t.options?.customFields;if(N&&typeof N==="object"){let i={};for(let[o,l]of Object.entries(N)){if(l===void 0)continue;i[o]=typeof l==="string"?l:String(l)}if(Object.keys(i).length>0)s.customFields=i}if(b)s.scheduledDate=b;if(r==="SMS"||r==="LMS"||r==="MMS"||r==="VOICE"||r==="FAX"||String(r).startsWith("RCS_")){if(!S||S.length===0)throw new c(u.INVALID_REQUEST,"from is required (options.from or config.defaultFrom)",{providerId:n,type:t.type});s.from=U(S)}else if(S)s.from=U(S);if(r==="SMS"||r==="LMS"||r==="MMS"){let i=t,o=i.text;if(o.length===0)throw new c(u.INVALID_REQUEST,"text is required for SMS/LMS/MMS",{providerId:n,type:t.type});s.text=o;let l=i.subject;if(l)s.subject=l;if(r==="MMS"){let p=F({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!p)throw new c(u.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:n});let f=await d.uploadFile(p,"MMS"),g=P(f);if(typeof g==="string"&&g.length>0)s.imageId=g;else throw new c(u.PROVIDER_ERROR,"Failed to upload MMS image",{providerId:n})}return s}if(r==="ATA"){let i=t,o=i.failover,l=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:a.kakaoPfId;if(!l||l.length===0)throw new c(u.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let p=typeof o?.fallbackContent==="string"&&o.fallbackContent.trim().length>0?o.fallbackContent.trim():void 0,f=typeof o?.fallbackTitle==="string"&&o.fallbackTitle.trim().length>0?o.fallbackTitle.trim():void 0,g=o?.enabled===!0?!1:o?.enabled===!1?!0:i.kakao?.disableSms;if(p)s.text=p;if(f)s.subject=f;return s.kakaoOptions={pfId:l,templateId:i.templateId,variables:w(i.variables),disableSms:g,adFlag:i.kakao?.adFlag,buttons:Array.isArray(i.kakao?.buttons)?i.kakao.buttons:void 0,imageId:i.kakao?.imageId},s}if(r==="CTA"||r==="CTI"){let i=t,o=i.text;if(o.length===0)throw new c(u.INVALID_REQUEST,"text is required for FRIENDTALK",{providerId:n});let l=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:a.kakaoPfId;if(!l||l.length===0)throw new c(u.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let p=J(i.buttons),f=Array.isArray(i.kakao?.buttons)?i.kakao.buttons:p,g=typeof i.kakao?.imageLink==="string"&&i.kakao.imageLink.length>0?i.kakao.imageLink:void 0,C=Array.isArray(f)&&f.length>0?f[0]:void 0,x=y(C)&&typeof C.linkMo==="string"?C.linkMo:void 0,W=g??x,X;if(r==="CTI"){let z=F({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!z)throw new c(u.INVALID_REQUEST,"image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:n});if(!W)throw new c(u.INVALID_REQUEST,"imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:n});let le=await d.uploadFile(z,"KAKAO",void 0,W),q=P(le);if(typeof q==="string"&&q.length>0)X=q;else throw new c(u.PROVIDER_ERROR,"Failed to upload friendtalk image",{providerId:n})}return s.text=o,s.kakaoOptions={pfId:l,variables:w(i.variables),disableSms:i.kakao?.disableSms,adFlag:i.kakao?.adFlag,buttons:f,imageId:X},s}if(r==="NSA"){let i=t,o=typeof i.naver?.talkId==="string"&&i.naver.talkId.length>0?i.naver.talkId:a.naverTalkId;if(!o||o.length===0)throw new c(u.INVALID_REQUEST,"naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:n});let l=typeof i.naver?.templateId==="string"&&i.naver.templateId.length>0?i.naver.templateId:i.templateId,p={...w(i.variables),...w(i.naver?.variables)};return s.naverOptions={talkId:o,templateId:l,variables:p,disableSms:i.naver?.disableSms,buttons:Array.isArray(i.naver?.buttons)?i.naver.buttons:void 0},s}if(r==="VOICE"){let i=t,o=i.text;if(o.length===0)throw new c(u.INVALID_REQUEST,"text is required for VOICE",{providerId:n});let l=i.voice?.voiceType,p=l==="FEMALE"||l==="MALE"?l:"FEMALE";return s.text=o,s.voiceOptions=i.voice?{...i.voice,voiceType:p}:{voiceType:p},s}if(r==="FAX"){let o=t.fax,p=Array.isArray(o?.fileIds)?o.fileIds.filter((f)=>typeof f==="string"&&f.length>0):[];if(p.length===0){let f=Array.isArray(o?.fileUrls)?o.fileUrls.filter((g)=>typeof g==="string"&&g.length>0):[];if(f.length===0)throw new c(u.INVALID_REQUEST,"fax.fileIds or fax.fileUrls is required",{providerId:n});p=[];for(let g of f){let C=await d.uploadFile(g,"FAX"),x=P(C);if(typeof x==="string"&&x.length>0)p.push(x)}}if(p.length===0)throw new c(u.PROVIDER_ERROR,"Failed to resolve fax fileIds",{providerId:n});return s.faxOptions={fileIds:p},s}let k=t,m=k.rcs,_=typeof m?.brandId==="string"&&m.brandId.length>0?m.brandId:a.rcsBrandId;if(!_||_.length===0)throw new c(u.INVALID_REQUEST,"rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:n});let R={brandId:_,buttons:Array.isArray(m?.buttons)?m.buttons:void 0,copyAllowed:m?.copyAllowed,mmsType:m?.mmsType,commercialType:m?.commercialType,disableSms:m?.disableSms,variables:{...w(k.variables),...w(m?.variables)}};if(r==="RCS_TPL"||r==="RCS_ITPL"||r==="RCS_LTPL"){let i=t;R.templateId=typeof i.rcs?.templateId==="string"&&i.rcs.templateId.length>0?i.rcs.templateId:i.templateId}let O,v;if(r==="RCS_SMS"||r==="RCS_LMS"||r==="RCS_MMS"){let i=t;if(O=i.text,v=i.subject,!O||O.length===0)throw new c(u.INVALID_REQUEST,"text is required for RCS text types",{providerId:n});if(s.text=O,v)s.subject=v}let L=m?.additionalBody,I=y(L)?L:void 0,se=I&&typeof I.imageId==="string"&&I.imageId.length>0?I.imageId:I&&typeof I.imaggeId==="string"&&I.imaggeId.length>0?I.imaggeId:void 0,D=(i)=>{let o=I?{...I}:{},l=typeof o.title==="string"&&o.title.length>0?o.title:v||"RCS",p=typeof o.description==="string"&&o.description.length>0?o.description:O||"",f=se??i,g={...o,title:l,description:p};if(typeof f==="string"&&f.length>0)g.imaggeId=f;return g};if(r==="RCS_MMS"){let i=t,o=F({imageUrl:i.imageUrl,media:i.media,providerId:n});if(o){let l=await d.uploadFile(o,"RCS"),p=P(l);if(typeof p==="string"&&p.length>0)R.additionalBody=D(p);else if(I)R.additionalBody=D(void 0)}else if(I)R.additionalBody=D(void 0)}else if(I)R.additionalBody=D(void 0);return s.rcsOptions=R,s}async function te(e){let{providerId:t,client:n,config:a,options:d}=e,r=be(d,t),b=await Re({options:d,providerId:t,config:a,client:n}),S=await n.sendOne(b,a.appId);return ke(he({options:d,response:S,providerId:t,warnings:r}))}class K{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=G(this.id);if(!e)throw new ne(ie.INVALID_REQUEST,`Onboarding spec missing for provider: ${this.id}`,{providerId:this.id});return e}constructor(e,t){if(!e||typeof e!=="object")throw new ne(ie.INVALID_REQUEST,"SolapiProvider requires a config object",{providerId:this.id});if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new Ae(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(n){return e.push(n instanceof Error?n.message:String(n)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),n={...e,messageId:t};try{return await te({providerId:this.id,client:this.client,config:this.config,options:n})}catch(a){return Q(T(a,this.id))}}async getDeliveryStatus(e){return ee({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),n=t,a=[n.balance,n.point],d=Number.NaN;for(let r of a){if(typeof r==="number"&&Number.isFinite(r)){d=r;break}if(typeof r==="string"){let b=Number(r);if(Number.isFinite(b)){d=b;break}}}if(!Number.isFinite(d))return Q(T(Error("Invalid balance response from SOLAPI"),this.id));return Me({providerId:this.id,channel:e?.channel,amount:d,currency:"KRW",raw:t})}catch(t){return Q(T(t,this.id))}}}var re=(e)=>new K(e),oe=()=>{let e={apiKey:h("SOLAPI_API_KEY")||"",apiSecret:h("SOLAPI_API_SECRET")||"",baseUrl:h("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:h("SOLAPI_DEFAULT_FROM"),kakaoPfId:h("SOLAPI_KAKAO_PF_ID"),rcsBrandId:h("SOLAPI_RCS_BRAND_ID"),naverTalkId:h("SOLAPI_NAVER_TALK_ID"),appId:h("SOLAPI_APP_ID"),defaultCountry:h("SOLAPI_DEFAULT_COUNTRY"),debug:h("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return re(e)};class ae{static create(e){return new K(e)}static createDefault(){return oe()}}function Oe(){}export{Oe as initializeSolapi,re as createSolapiProvider,oe as createDefaultSolapiProvider,ae as SolapiProviderFactory,K as SolapiProvider};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=4D59987D42BF62D264756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@k-msg/provider",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.1",
|
|
4
4
|
"packageManager": "bun@1.3.8",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Complete provider system with adapters and implementations for K-Message platform",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"module": "./dist/index.mjs",
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
|
+
"sideEffects": false,
|
|
10
11
|
"exports": {
|
|
11
12
|
".": {
|
|
12
13
|
"types": "./dist/index.d.ts",
|
|
@@ -34,8 +35,8 @@
|
|
|
34
35
|
},
|
|
35
36
|
"scripts": {
|
|
36
37
|
"build": "bun run clean && bun run build:esm && bun run build:cjs && bun run build:types",
|
|
37
|
-
"build:esm": "bun build ./src/index.ts ./src/aligo/index.ts ./src/iwinv/index.ts ./src/solapi/index.ts --outdir ./dist --format esm --minify --sourcemap --entry-naming '[dir]/[name].mjs' --external 'bun:test' --external 'solapi'",
|
|
38
|
-
"build:cjs": "bun build ./src/index.ts ./src/aligo/index.ts ./src/iwinv/index.ts ./src/solapi/index.ts --outdir ./dist --format cjs --minify --sourcemap --entry-naming '[dir]/[name].js' --external 'bun:test' --external 'solapi'",
|
|
38
|
+
"build:esm": "bun build ./src/index.ts ./src/aligo/index.ts ./src/iwinv/index.ts ./src/solapi/index.ts --outdir ./dist --format esm --minify --sourcemap --entry-naming '[dir]/[name].mjs' --external 'bun:test' --external 'solapi' --external '@k-msg/*'",
|
|
39
|
+
"build:cjs": "bun build ./src/index.ts ./src/aligo/index.ts ./src/iwinv/index.ts ./src/solapi/index.ts --outdir ./dist --format cjs --minify --sourcemap --entry-naming '[dir]/[name].js' --external 'bun:test' --external 'solapi' --external '@k-msg/*'",
|
|
39
40
|
"build:types": "tsc",
|
|
40
41
|
"dev": "tsc --watch",
|
|
41
42
|
"test": "bun run test:unit",
|
|
@@ -50,8 +51,8 @@
|
|
|
50
51
|
"publish": "bun publish --access public"
|
|
51
52
|
},
|
|
52
53
|
"dependencies": {
|
|
53
|
-
"@k-msg/core": "0.
|
|
54
|
-
"@k-msg/template": "0.
|
|
54
|
+
"@k-msg/core": "0.27.1",
|
|
55
|
+
"@k-msg/template": "0.27.1"
|
|
55
56
|
},
|
|
56
57
|
"devDependencies": {
|
|
57
58
|
"@types/bun": "^1.3.9",
|
|
@@ -77,7 +78,9 @@
|
|
|
77
78
|
"adapter"
|
|
78
79
|
],
|
|
79
80
|
"files": [
|
|
80
|
-
"dist",
|
|
81
|
+
"dist/**/*.js",
|
|
82
|
+
"dist/**/*.mjs",
|
|
83
|
+
"dist/**/*.d.ts",
|
|
81
84
|
"README.md"
|
|
82
85
|
],
|
|
83
86
|
"repository": {
|