@ienlab/cloud-functions-library 1.0.0-dev.15 → 1.0.0-dev.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require("firebase-admin/firestore"),u=require("firebase-functions/v2/https");var d=[`ko`,`en`],f=null;function p(e){f=e}var m={get(e,t=`ko`){let n=f?.();return e[d.includes(n)?n:t]??e[t]},ko(e){return e.ko}};function h(e){return{...e.data(),id:e.id}}function g(e,t,n){let r=e.headers.origin;return r&&n.includes(r)&&(t.set(`Access-Control-Allow-Origin`,r),t.set(`Vary`,`Origin`)),t.set(`Access-Control-Allow-Methods`,`POST, OPTIONS`),t.set(`Access-Control-Allow-Headers`,`Content-Type, Authorization`),e.method===`OPTIONS`?(t.status(204).send(),!1):e.method===`POST`?!0:(t.status(405).send({error:`Method Not Allowed`}),!1)}var _=o(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self).dayjs=r()})(e,(function(){"use strict";var e=1e3,t=6e4,n=36e5,r=`millisecond`,i=`second`,a=`minute`,o=`hour`,s=`day`,c=`week`,l=`month`,u=`quarter`,d=`year`,f=`date`,p=`Invalid Date`,m=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,h=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,g={name:`en`,weekdays:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),ordinal:function(e){var t=[`th`,`st`,`nd`,`rd`],n=e%100;return`[`+e+(t[(n-20)%10]||t[n]||t[0])+`]`}},_=function(e,t,n){var r=String(e);return!r||r.length>=t?e:``+Array(t+1-r.length).join(n)+e},v={s:_,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),i=n%60;return(t<=0?`+`:`-`)+_(r,2,`0`)+`:`+_(i,2,`0`)},m:function e(t,n){if(t.date()<n.date())return-e(n,t);var r=12*(n.year()-t.year())+(n.month()-t.month()),i=t.clone().add(r,l),a=n-i<0,o=t.clone().add(r+(a?-1:1),l);return+(-(r+(n-i)/(a?i-o:o-i))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(e){return{M:l,y:d,w:c,d:s,D:f,h:o,m:a,s:i,ms:r,Q:u}[e]||String(e||``).toLowerCase().replace(/s$/,``)},u:function(e){return e===void 0}},y=`en`,b={};b[y]=g;var x=`$isDayjsObject`,S=function(e){return e instanceof E||!(!e||!e[x])},C=function e(t,n,r){var i;if(!t)return y;if(typeof t==`string`){var a=t.toLowerCase();b[a]&&(i=a),n&&(b[a]=n,i=a);var o=t.split(`-`);if(!i&&o.length>1)return e(o[0])}else{var s=t.name;b[s]=t,i=s}return!r&&i&&(y=i),i||!r&&y},w=function(e,t){if(S(e))return e.clone();var n=typeof t==`object`?t:{};return n.date=e,n.args=arguments,new E(n)},T=v;T.l=C,T.i=S,T.w=function(e,t){return w(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var E=function(){function g(e){this.$L=C(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[x]=!0}var _=g.prototype;return _.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(t===null)return new Date(NaN);if(T.u(t))return new Date;if(t instanceof Date)return new Date(t);if(typeof t==`string`&&!/Z$/i.test(t)){var r=t.match(m);if(r){var i=r[2]-1||0,a=(r[7]||`0`).substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,a)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,a)}}return new Date(t)}(e),this.init()},_.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},_.$utils=function(){return T},_.isValid=function(){return this.$d.toString()!==p},_.isSame=function(e,t){var n=w(e);return this.startOf(t)<=n&&n<=this.endOf(t)},_.isAfter=function(e,t){return w(e)<this.startOf(t)},_.isBefore=function(e,t){return this.endOf(t)<w(e)},_.$g=function(e,t,n){return T.u(e)?this[t]:this.set(n,e)},_.unix=function(){return Math.floor(this.valueOf()/1e3)},_.valueOf=function(){return this.$d.getTime()},_.startOf=function(e,t){var n=this,r=!!T.u(t)||t,u=T.p(e),p=function(e,t){var i=T.w(n.$u?Date.UTC(n.$y,t,e):new Date(n.$y,t,e),n);return r?i:i.endOf(s)},m=function(e,t){return T.w(n.toDate()[e].apply(n.toDate(`s`),(r?[0,0,0,0]:[23,59,59,999]).slice(t)),n)},h=this.$W,g=this.$M,_=this.$D,v=`set`+(this.$u?`UTC`:``);switch(u){case d:return r?p(1,0):p(31,11);case l:return r?p(1,g):p(0,g+1);case c:var y=this.$locale().weekStart||0,b=(h<y?h+7:h)-y;return p(r?_-b:_+(6-b),g);case s:case f:return m(v+`Hours`,0);case o:return m(v+`Minutes`,1);case a:return m(v+`Seconds`,2);case i:return m(v+`Milliseconds`,3);default:return this.clone()}},_.endOf=function(e){return this.startOf(e,!1)},_.$set=function(e,t){var n,c=T.p(e),u=`set`+(this.$u?`UTC`:``),p=(n={},n[s]=u+`Date`,n[f]=u+`Date`,n[l]=u+`Month`,n[d]=u+`FullYear`,n[o]=u+`Hours`,n[a]=u+`Minutes`,n[i]=u+`Seconds`,n[r]=u+`Milliseconds`,n)[c],m=c===s?this.$D+(t-this.$W):t;if(c===l||c===d){var h=this.clone().set(f,1);h.$d[p](m),h.init(),this.$d=h.set(f,Math.min(this.$D,h.daysInMonth())).$d}else p&&this.$d[p](m);return this.init(),this},_.set=function(e,t){return this.clone().$set(e,t)},_.get=function(e){return this[T.p(e)]()},_.add=function(r,u){var f,p=this;r=Number(r);var m=T.p(u),h=function(e){var t=w(p);return T.w(t.date(t.date()+Math.round(e*r)),p)};if(m===l)return this.set(l,this.$M+r);if(m===d)return this.set(d,this.$y+r);if(m===s)return h(1);if(m===c)return h(7);var g=(f={},f[a]=t,f[o]=n,f[i]=e,f)[m]||1,_=this.$d.getTime()+r*g;return T.w(_,this)},_.subtract=function(e,t){return this.add(-1*e,t)},_.format=function(e){var t=this,n=this.$locale();if(!this.isValid())return n.invalidDate||p;var r=e||`YYYY-MM-DDTHH:mm:ssZ`,i=T.z(this),a=this.$H,o=this.$m,s=this.$M,c=n.weekdays,l=n.months,u=n.meridiem,d=function(e,n,i,a){return e&&(e[n]||e(t,r))||i[n].slice(0,a)},f=function(e){return T.s(a%12||12,e,`0`)},m=u||function(e,t,n){var r=e<12?`AM`:`PM`;return n?r.toLowerCase():r};return r.replace(h,(function(e,r){return r||function(e){switch(e){case`YY`:return String(t.$y).slice(-2);case`YYYY`:return T.s(t.$y,4,`0`);case`M`:return s+1;case`MM`:return T.s(s+1,2,`0`);case`MMM`:return d(n.monthsShort,s,l,3);case`MMMM`:return d(l,s);case`D`:return t.$D;case`DD`:return T.s(t.$D,2,`0`);case`d`:return String(t.$W);case`dd`:return d(n.weekdaysMin,t.$W,c,2);case`ddd`:return d(n.weekdaysShort,t.$W,c,3);case`dddd`:return c[t.$W];case`H`:return String(a);case`HH`:return T.s(a,2,`0`);case`h`:return f(1);case`hh`:return f(2);case`a`:return m(a,o,!0);case`A`:return m(a,o,!1);case`m`:return String(o);case`mm`:return T.s(o,2,`0`);case`s`:return String(t.$s);case`ss`:return T.s(t.$s,2,`0`);case`SSS`:return T.s(t.$ms,3,`0`);case`Z`:return i}return null}(e)||i.replace(`:`,``)}))},_.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},_.diff=function(r,f,p){var m,h=this,g=T.p(f),_=w(r),v=(_.utcOffset()-this.utcOffset())*t,y=this-_,b=function(){return T.m(h,_)};switch(g){case d:m=b()/12;break;case l:m=b();break;case u:m=b()/3;break;case c:m=(y-v)/6048e5;break;case s:m=(y-v)/864e5;break;case o:m=y/n;break;case a:m=y/t;break;case i:m=y/e;break;default:m=y}return p?m:T.a(m)},_.daysInMonth=function(){return this.endOf(l).$D},_.$locale=function(){return b[this.$L]},_.locale=function(e,t){if(!e)return this.$L;var n=this.clone(),r=C(e,t,!0);return r&&(n.$L=r),n},_.clone=function(){return T.w(this.$d,this)},_.toDate=function(){return new Date(this.valueOf())},_.toJSON=function(){return this.isValid()?this.toISOString():null},_.toISOString=function(){return this.$d.toISOString()},_.toString=function(){return this.$d.toUTCString()},g}(),D=E.prototype;return w.prototype=D,[[`$ms`,r],[`$s`,i],[`$m`,a],[`$H`,o],[`$W`,s],[`$M`,l],[`$y`,d],[`$D`,f]].forEach((function(e){D[e[1]]=function(t){return this.$g(t,e[0],e[1])}})),w.extend=function(e,t){return e.$i||=(e(t,E,w),!0),w},w.locale=C,w.isDayjs=S,w.unix=function(e){return w(1e3*e)},w.en=b[y],w.Ls=b,w.p={},w}))})),v=o(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r(_()):typeof define==`function`&&define.amd?define([`dayjs`],r):(n=typeof globalThis<`u`?globalThis:n||self).dayjs_locale_ko=r(n.dayjs)})(e,(function(e){"use strict";function t(e){return e&&typeof e==`object`&&`default`in e?e:{default:e}}var n=t(e),r={name:`ko`,weekdays:`일요일_월요일_화요일_수요일_목요일_금요일_토요일`.split(`_`),weekdaysShort:`일_월_화_수_목_금_토`.split(`_`),weekdaysMin:`일_월_화_수_목_금_토`.split(`_`),months:`1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월`.split(`_`),monthsShort:`1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월`.split(`_`),ordinal:function(e){return e+`일`},formats:{LT:`A h:mm`,LTS:`A h:mm:ss`,L:`YYYY.MM.DD.`,LL:`YYYY년 MMMM D일`,LLL:`YYYY년 MMMM D일 A h:mm`,LLLL:`YYYY년 MMMM D일 dddd A h:mm`,l:`YYYY.MM.DD.`,ll:`YYYY년 MMMM D일`,lll:`YYYY년 MMMM D일 A h:mm`,llll:`YYYY년 MMMM D일 dddd A h:mm`},meridiem:function(e){return e<12?`오전`:`오후`},relativeTime:{future:`%s 후`,past:`%s 전`,s:`몇 초`,m:`1분`,mm:`%d분`,h:`한 시간`,hh:`%d시간`,d:`하루`,dd:`%d일`,M:`한 달`,MM:`%d달`,y:`일 년`,yy:`%d년`}};return n.default.locale(r,null,!0),r}))})),y=c(_());v();var b={ko:{date_format:{default:`YYYY년 M월 D일 dddd`,no_year:`M월 D일 dddd`,no_year_short:`M월 D일`,short:`YYYY년 M월 D일`},date_time_format:{default:{no_sec:`YYYY년 M월 D일 A h:mm`,sec:`YYYY년 M월 D일 A h:mm:ss`},no_year:{no_sec:`M월 D일 A h:mm`,sec:`M월 D일 A h:mm:ss`,short:{no_sec:`M월 D일 A h:mm`,sec:`M월 D일 A h:mm:ss`}},short:{no_sec:`YYYY년 M월 D일 A h:mm`,sec:`YYYY년 M월 D일 A h:mm:ss`}},time_format:{apm:`A`,f12:{no_sec:`A h:mm`,sec:`A h:mm:ss`},f12_no_apm:{no_sec:`h:mm`,sec:`h:mm:ss`},f24:{no_sec:`HH:mm`,sec:`HH:mm:ss`},f24_short:{no_sec:`H:mm`,sec:`H:mm:ss`}}},en:{date_format:{default:`dddd, MMMM D, YYYY`,no_year:`dddd, MMMM D`,no_year_short:`MMM D`,short:`MMM D, YYYY`},date_time_format:{default:{no_sec:`MMMM D, YYYY, h:mm A`,sec:`MMMM D, YYYY, h:mm:ss A`},no_year:{no_sec:`MMM D, h:mm A`,sec:`MMM D, h:mm:ss A`,short:{no_sec:`MMM D, h:mm A`,sec:`MMM D, h:mm:ss A`}},short:{no_sec:`MMM D, YYYY h:mm A`,sec:`MMM D, YYYY h:mm:ss A`}},time_format:{apm:`A`,f12:{no_sec:`h:mm A`,sec:`h:mm:ss A`},f12_no_apm:{no_sec:`h:mm`,sec:`h:mm:ss`},f24:{no_sec:`HH:mm`,sec:`HH:mm:ss`},f24_short:{no_sec:`H:mm`,sec:`H:mm:ss`}}}};function x(e,t,n=`ko`){let r=e instanceof Date?(0,y.default)(e):e;if(!e||!r.isValid())return``;let i=n===`en`||n===`ko`?n:`ko`;return r.locale(i).format(t)}function S(e=`ko`){let t=e===`en`||e===`ko`?e:`ko`,n=b[t].date_format;return{dateFormat:e=>x(e,n.default,t),dateFormatNoYear:e=>x(e,n.no_year,t),dateFormatShort:e=>x(e,n.short,t),dateFormatNoYearShort:e=>x(e,n.no_year_short,t)}}function C(e){return e===`en`||e===`ko`?e:`ko`}function w(e=`ko`){let t=C(e),n=b[t].date_time_format;return{dateTimeFormat:(e,r=!1)=>x(e,r?n.default.sec:n.default.no_sec,t),dateTimeFormatShort:(e,r=!1)=>x(e,r?n.short.sec:n.short.no_sec,t),dateTimeFormatNoYear:(e,r=!1)=>x(e,r?n.no_year.sec:n.no_year.no_sec,t),dateTimeFormatNoYearShort:(e,r=!1)=>x(e,r?n.no_year.short.sec:n.no_year.short.no_sec,t)}}var T={ko:{day:`일`,hour:{default:`시간`,short:`시간`},minute:{default:`분`,short:`분`},zero:{default:`0분`,short:`0분`}},en:{day:`d`,hour:{default:`hr`,short:`h`},minute:{default:`min`,short:`m`},zero:{default:`0min`,short:`0m`}}};function E(e){return e===`en`||e===`ko`?e:`ko`}function D(e=`ko`){let t=E(e),n=b[t].time_format;return{timeFormat24:(e,r=!1)=>x(e,r?n.f24.sec:n.f24.no_sec,t),timeFormat24Short:(e,r=!1)=>x(e,r?n.f24_short.sec:n.f24_short.no_sec,t),timeFormat12:(e,r=!1)=>x(e,r?n.f12.sec:n.f12.no_sec,t),timeFormat12NoApm:(e,r=!1)=>x(e,r?n.f12_no_apm.sec:n.f12_no_apm.no_sec,t),apmFormat:e=>x(e,n.apm,t)}}function O(e=`ko`){let t=T[E(e)];function n(e){if(isNaN(e)||!isFinite(e))return{day:0,hour:0,minute:0};let t=Math.round(e*60);return{day:Math.floor(t/86400),hour:Math.floor(t%86400/3600),minute:Math.floor(t%3600/60)}}return{minFormat:e=>{let{day:r,hour:i,minute:a}=n(e),o=[];return r!==0&&o.push(`${r}${t.day}`),i!==0&&o.push(`${i}${t.hour.default}`),a!==0&&o.push(`${a}${t.minute.default}`),o.length===0&&o.push(t.zero.default),o.join(` `)},minFormatShort:e=>{let{day:r,hour:i,minute:a}=n(e),o=[];return r!==0&&o.push(`${r}${t.day}`),i!==0&&o.push(`${i}${t.hour.short}`),a!==0&&o.push(`${a}${t.minute.short}`),o.length===0&&o.push(t.zero.short),o.join(` `)}}}var k=()=>({updateAt:l.FieldValue.serverTimestamp(),deletedAt:l.FieldValue.serverTimestamp()}),A=()=>({updateAt:l.FieldValue.serverTimestamp(),deletedAt:null});function j(e){let{spaUrl:t,defaultOG:n,resolvers:r,region:i=`asia-northeast3`}=e,a=null,o=0;function s(){let e=Date.now();return(!a||e-o>18e5)&&(o=e,a=fetch(t,{signal:AbortSignal.timeout(5e3)}).then(async e=>{if(!e.ok)throw a=null,o=0,Error(`Failed to fetch template: ${e.status}`);return e.text()}).catch(e=>{throw a=null,o=0,e})),a}function c(e){return e?String(e).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#039;`):``}function l(e,t,n,r){let i=c(r),a=RegExp(`(<meta\\s+[^>]*${t}=["']${n}["'][^>]*>)`,`gi`),o=!1,s=e.replace(a,e=>(o=!0,/\bcontent=/i.test(e)?e.replace(/\bcontent=(["'])(.*?)\1/i,`content=$1${i}$1`):e.replace(/(\/?>)$/,` content="${i}"$1`)));if(!o){let e=`<meta ${t}="${n}" content="${i}">`;return s.replace(/(<\/head>)/i,`${e}\n$1`)}return s}function d(e,t,n,r){let i=c(t),a=e;return a=/<title>.*<\/title>/i.test(a)?a.replace(/(<title>)[^<]*(<\/title>)/i,`$1${i}$2`):a.replace(/(<\/head>)/i,`<title>${i}</title>\n$1`),a=l(a,`name`,`description`,n),a=l(a,`property`,`og:title`,t),a=l(a,`property`,`og:description`,n),a=l(a,`property`,`og:image`,r),a=l(a,`property`,`og:type`,`website`),a=l(a,`name`,`twitter:card`,`summary_large_image`),a=l(a,`name`,`twitter:title`,t),a=l(a,`name`,`twitter:description`,n),a=l(a,`name`,`twitter:image`,r),a}return(0,u.onRequest)({region:i},async(e,i)=>{let a=Date.now(),o=e.path,c=new URL(e.url,t),l=c.searchParams;try{let t=n;for(let n of r){let r=o.match(n.pattern);if(!r)continue;let i=r[1]??r[0];try{let a=await n.resolve(i,{req:e,pathname:o,searchParams:l,match:r});if(a){t=a;break}}catch(e){console.error(`[SSRDynamicOG] Failed to resolve "${o}${c.search}" with pattern ${n.pattern}:`,e)}}let u=d(await s(),t.title,t.description,t.image);console.log(`[SSRDynamicOG] ${o}${c.search} → ${t.title} (${Date.now()-a}ms)`),i.setHeader(`Content-Type`,`text/html; charset=utf-8`),i.status(200).send(u)}catch(e){console.error(`[SSRDynamicOG] error:`,e),i.redirect(302,t)}})}exports.DATE_TIME_FORMATS=b,exports.Localized=m,exports.SUPPORTED_LOCALES=d,exports.applyCors=g,exports.createDateFormatters=S,exports.createDateTimeFormatters=w,exports.createDurationFormatter=O,exports.createSSRDynamicOG=j,exports.createTimeFormatters=D,exports.del=k,exports.formatBaseDateTime=x,exports.setLocalizedLocaleResolver=p,exports.snapshotToData=h,exports.undel=A;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require("firebase-admin/firestore"),u=require("firebase-functions/v2/https");var d=[`ko`,`en`],f=null;function p(e){f=e}var m={get(e,t=`ko`){let n=f?.();return e[d.includes(n)?n:t]??e[t]},ko(e){return e.ko}};function h(e,t,n,r){return(0,u.onCall)(r??{},async e=>{let t=e.data;return n(t,e)})}function g(e){return{...e.data(),id:e.id}}function _(e,t,n){let r=e.headers.origin;return r&&n.includes(r)&&(t.set(`Access-Control-Allow-Origin`,r),t.set(`Vary`,`Origin`)),t.set(`Access-Control-Allow-Methods`,`POST, OPTIONS`),t.set(`Access-Control-Allow-Headers`,`Content-Type, Authorization`),e.method===`OPTIONS`?(t.status(204).send(),!1):e.method===`POST`?!0:(t.status(405).send({error:`Method Not Allowed`}),!1)}var v=o(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self).dayjs=r()})(e,(function(){"use strict";var e=1e3,t=6e4,n=36e5,r=`millisecond`,i=`second`,a=`minute`,o=`hour`,s=`day`,c=`week`,l=`month`,u=`quarter`,d=`year`,f=`date`,p=`Invalid Date`,m=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,h=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,g={name:`en`,weekdays:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),ordinal:function(e){var t=[`th`,`st`,`nd`,`rd`],n=e%100;return`[`+e+(t[(n-20)%10]||t[n]||t[0])+`]`}},_=function(e,t,n){var r=String(e);return!r||r.length>=t?e:``+Array(t+1-r.length).join(n)+e},v={s:_,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),i=n%60;return(t<=0?`+`:`-`)+_(r,2,`0`)+`:`+_(i,2,`0`)},m:function e(t,n){if(t.date()<n.date())return-e(n,t);var r=12*(n.year()-t.year())+(n.month()-t.month()),i=t.clone().add(r,l),a=n-i<0,o=t.clone().add(r+(a?-1:1),l);return+(-(r+(n-i)/(a?i-o:o-i))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(e){return{M:l,y:d,w:c,d:s,D:f,h:o,m:a,s:i,ms:r,Q:u}[e]||String(e||``).toLowerCase().replace(/s$/,``)},u:function(e){return e===void 0}},y=`en`,b={};b[y]=g;var x=`$isDayjsObject`,S=function(e){return e instanceof E||!(!e||!e[x])},C=function e(t,n,r){var i;if(!t)return y;if(typeof t==`string`){var a=t.toLowerCase();b[a]&&(i=a),n&&(b[a]=n,i=a);var o=t.split(`-`);if(!i&&o.length>1)return e(o[0])}else{var s=t.name;b[s]=t,i=s}return!r&&i&&(y=i),i||!r&&y},w=function(e,t){if(S(e))return e.clone();var n=typeof t==`object`?t:{};return n.date=e,n.args=arguments,new E(n)},T=v;T.l=C,T.i=S,T.w=function(e,t){return w(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var E=function(){function g(e){this.$L=C(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[x]=!0}var _=g.prototype;return _.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(t===null)return new Date(NaN);if(T.u(t))return new Date;if(t instanceof Date)return new Date(t);if(typeof t==`string`&&!/Z$/i.test(t)){var r=t.match(m);if(r){var i=r[2]-1||0,a=(r[7]||`0`).substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,a)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,a)}}return new Date(t)}(e),this.init()},_.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},_.$utils=function(){return T},_.isValid=function(){return this.$d.toString()!==p},_.isSame=function(e,t){var n=w(e);return this.startOf(t)<=n&&n<=this.endOf(t)},_.isAfter=function(e,t){return w(e)<this.startOf(t)},_.isBefore=function(e,t){return this.endOf(t)<w(e)},_.$g=function(e,t,n){return T.u(e)?this[t]:this.set(n,e)},_.unix=function(){return Math.floor(this.valueOf()/1e3)},_.valueOf=function(){return this.$d.getTime()},_.startOf=function(e,t){var n=this,r=!!T.u(t)||t,u=T.p(e),p=function(e,t){var i=T.w(n.$u?Date.UTC(n.$y,t,e):new Date(n.$y,t,e),n);return r?i:i.endOf(s)},m=function(e,t){return T.w(n.toDate()[e].apply(n.toDate(`s`),(r?[0,0,0,0]:[23,59,59,999]).slice(t)),n)},h=this.$W,g=this.$M,_=this.$D,v=`set`+(this.$u?`UTC`:``);switch(u){case d:return r?p(1,0):p(31,11);case l:return r?p(1,g):p(0,g+1);case c:var y=this.$locale().weekStart||0,b=(h<y?h+7:h)-y;return p(r?_-b:_+(6-b),g);case s:case f:return m(v+`Hours`,0);case o:return m(v+`Minutes`,1);case a:return m(v+`Seconds`,2);case i:return m(v+`Milliseconds`,3);default:return this.clone()}},_.endOf=function(e){return this.startOf(e,!1)},_.$set=function(e,t){var n,c=T.p(e),u=`set`+(this.$u?`UTC`:``),p=(n={},n[s]=u+`Date`,n[f]=u+`Date`,n[l]=u+`Month`,n[d]=u+`FullYear`,n[o]=u+`Hours`,n[a]=u+`Minutes`,n[i]=u+`Seconds`,n[r]=u+`Milliseconds`,n)[c],m=c===s?this.$D+(t-this.$W):t;if(c===l||c===d){var h=this.clone().set(f,1);h.$d[p](m),h.init(),this.$d=h.set(f,Math.min(this.$D,h.daysInMonth())).$d}else p&&this.$d[p](m);return this.init(),this},_.set=function(e,t){return this.clone().$set(e,t)},_.get=function(e){return this[T.p(e)]()},_.add=function(r,u){var f,p=this;r=Number(r);var m=T.p(u),h=function(e){var t=w(p);return T.w(t.date(t.date()+Math.round(e*r)),p)};if(m===l)return this.set(l,this.$M+r);if(m===d)return this.set(d,this.$y+r);if(m===s)return h(1);if(m===c)return h(7);var g=(f={},f[a]=t,f[o]=n,f[i]=e,f)[m]||1,_=this.$d.getTime()+r*g;return T.w(_,this)},_.subtract=function(e,t){return this.add(-1*e,t)},_.format=function(e){var t=this,n=this.$locale();if(!this.isValid())return n.invalidDate||p;var r=e||`YYYY-MM-DDTHH:mm:ssZ`,i=T.z(this),a=this.$H,o=this.$m,s=this.$M,c=n.weekdays,l=n.months,u=n.meridiem,d=function(e,n,i,a){return e&&(e[n]||e(t,r))||i[n].slice(0,a)},f=function(e){return T.s(a%12||12,e,`0`)},m=u||function(e,t,n){var r=e<12?`AM`:`PM`;return n?r.toLowerCase():r};return r.replace(h,(function(e,r){return r||function(e){switch(e){case`YY`:return String(t.$y).slice(-2);case`YYYY`:return T.s(t.$y,4,`0`);case`M`:return s+1;case`MM`:return T.s(s+1,2,`0`);case`MMM`:return d(n.monthsShort,s,l,3);case`MMMM`:return d(l,s);case`D`:return t.$D;case`DD`:return T.s(t.$D,2,`0`);case`d`:return String(t.$W);case`dd`:return d(n.weekdaysMin,t.$W,c,2);case`ddd`:return d(n.weekdaysShort,t.$W,c,3);case`dddd`:return c[t.$W];case`H`:return String(a);case`HH`:return T.s(a,2,`0`);case`h`:return f(1);case`hh`:return f(2);case`a`:return m(a,o,!0);case`A`:return m(a,o,!1);case`m`:return String(o);case`mm`:return T.s(o,2,`0`);case`s`:return String(t.$s);case`ss`:return T.s(t.$s,2,`0`);case`SSS`:return T.s(t.$ms,3,`0`);case`Z`:return i}return null}(e)||i.replace(`:`,``)}))},_.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},_.diff=function(r,f,p){var m,h=this,g=T.p(f),_=w(r),v=(_.utcOffset()-this.utcOffset())*t,y=this-_,b=function(){return T.m(h,_)};switch(g){case d:m=b()/12;break;case l:m=b();break;case u:m=b()/3;break;case c:m=(y-v)/6048e5;break;case s:m=(y-v)/864e5;break;case o:m=y/n;break;case a:m=y/t;break;case i:m=y/e;break;default:m=y}return p?m:T.a(m)},_.daysInMonth=function(){return this.endOf(l).$D},_.$locale=function(){return b[this.$L]},_.locale=function(e,t){if(!e)return this.$L;var n=this.clone(),r=C(e,t,!0);return r&&(n.$L=r),n},_.clone=function(){return T.w(this.$d,this)},_.toDate=function(){return new Date(this.valueOf())},_.toJSON=function(){return this.isValid()?this.toISOString():null},_.toISOString=function(){return this.$d.toISOString()},_.toString=function(){return this.$d.toUTCString()},g}(),D=E.prototype;return w.prototype=D,[[`$ms`,r],[`$s`,i],[`$m`,a],[`$H`,o],[`$W`,s],[`$M`,l],[`$y`,d],[`$D`,f]].forEach((function(e){D[e[1]]=function(t){return this.$g(t,e[0],e[1])}})),w.extend=function(e,t){return e.$i||=(e(t,E,w),!0),w},w.locale=C,w.isDayjs=S,w.unix=function(e){return w(1e3*e)},w.en=b[y],w.Ls=b,w.p={},w}))})),y=o(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r(v()):typeof define==`function`&&define.amd?define([`dayjs`],r):(n=typeof globalThis<`u`?globalThis:n||self).dayjs_locale_ko=r(n.dayjs)})(e,(function(e){"use strict";function t(e){return e&&typeof e==`object`&&`default`in e?e:{default:e}}var n=t(e),r={name:`ko`,weekdays:`일요일_월요일_화요일_수요일_목요일_금요일_토요일`.split(`_`),weekdaysShort:`일_월_화_수_목_금_토`.split(`_`),weekdaysMin:`일_월_화_수_목_금_토`.split(`_`),months:`1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월`.split(`_`),monthsShort:`1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월`.split(`_`),ordinal:function(e){return e+`일`},formats:{LT:`A h:mm`,LTS:`A h:mm:ss`,L:`YYYY.MM.DD.`,LL:`YYYY년 MMMM D일`,LLL:`YYYY년 MMMM D일 A h:mm`,LLLL:`YYYY년 MMMM D일 dddd A h:mm`,l:`YYYY.MM.DD.`,ll:`YYYY년 MMMM D일`,lll:`YYYY년 MMMM D일 A h:mm`,llll:`YYYY년 MMMM D일 dddd A h:mm`},meridiem:function(e){return e<12?`오전`:`오후`},relativeTime:{future:`%s 후`,past:`%s 전`,s:`몇 초`,m:`1분`,mm:`%d분`,h:`한 시간`,hh:`%d시간`,d:`하루`,dd:`%d일`,M:`한 달`,MM:`%d달`,y:`일 년`,yy:`%d년`}};return n.default.locale(r,null,!0),r}))})),b=c(v());y();var x={ko:{date_format:{default:`YYYY년 M월 D일 dddd`,no_year:`M월 D일 dddd`,no_year_short:`M월 D일`,short:`YYYY년 M월 D일`},date_time_format:{default:{no_sec:`YYYY년 M월 D일 A h:mm`,sec:`YYYY년 M월 D일 A h:mm:ss`},no_year:{no_sec:`M월 D일 A h:mm`,sec:`M월 D일 A h:mm:ss`,short:{no_sec:`M월 D일 A h:mm`,sec:`M월 D일 A h:mm:ss`}},short:{no_sec:`YYYY년 M월 D일 A h:mm`,sec:`YYYY년 M월 D일 A h:mm:ss`}},time_format:{apm:`A`,f12:{no_sec:`A h:mm`,sec:`A h:mm:ss`},f12_no_apm:{no_sec:`h:mm`,sec:`h:mm:ss`},f24:{no_sec:`HH:mm`,sec:`HH:mm:ss`},f24_short:{no_sec:`H:mm`,sec:`H:mm:ss`}}},en:{date_format:{default:`dddd, MMMM D, YYYY`,no_year:`dddd, MMMM D`,no_year_short:`MMM D`,short:`MMM D, YYYY`},date_time_format:{default:{no_sec:`MMMM D, YYYY, h:mm A`,sec:`MMMM D, YYYY, h:mm:ss A`},no_year:{no_sec:`MMM D, h:mm A`,sec:`MMM D, h:mm:ss A`,short:{no_sec:`MMM D, h:mm A`,sec:`MMM D, h:mm:ss A`}},short:{no_sec:`MMM D, YYYY h:mm A`,sec:`MMM D, YYYY h:mm:ss A`}},time_format:{apm:`A`,f12:{no_sec:`h:mm A`,sec:`h:mm:ss A`},f12_no_apm:{no_sec:`h:mm`,sec:`h:mm:ss`},f24:{no_sec:`HH:mm`,sec:`HH:mm:ss`},f24_short:{no_sec:`H:mm`,sec:`H:mm:ss`}}}};function S(e,t,n=`ko`){let r=e instanceof Date?(0,b.default)(e):e;if(!e||!r.isValid())return``;let i=n===`en`||n===`ko`?n:`ko`;return r.locale(i).format(t)}function C(e=`ko`){let t=e===`en`||e===`ko`?e:`ko`,n=x[t].date_format;return{dateFormat:e=>S(e,n.default,t),dateFormatNoYear:e=>S(e,n.no_year,t),dateFormatShort:e=>S(e,n.short,t),dateFormatNoYearShort:e=>S(e,n.no_year_short,t)}}function w(e){return e===`en`||e===`ko`?e:`ko`}function T(e=`ko`){let t=w(e),n=x[t].date_time_format;return{dateTimeFormat:(e,r=!1)=>S(e,r?n.default.sec:n.default.no_sec,t),dateTimeFormatShort:(e,r=!1)=>S(e,r?n.short.sec:n.short.no_sec,t),dateTimeFormatNoYear:(e,r=!1)=>S(e,r?n.no_year.sec:n.no_year.no_sec,t),dateTimeFormatNoYearShort:(e,r=!1)=>S(e,r?n.no_year.short.sec:n.no_year.short.no_sec,t)}}var E={ko:{day:`일`,hour:{default:`시간`,short:`시간`},minute:{default:`분`,short:`분`},zero:{default:`0분`,short:`0분`}},en:{day:`d`,hour:{default:`hr`,short:`h`},minute:{default:`min`,short:`m`},zero:{default:`0min`,short:`0m`}}};function D(e){return e===`en`||e===`ko`?e:`ko`}function O(e=`ko`){let t=D(e),n=x[t].time_format;return{timeFormat24:(e,r=!1)=>S(e,r?n.f24.sec:n.f24.no_sec,t),timeFormat24Short:(e,r=!1)=>S(e,r?n.f24_short.sec:n.f24_short.no_sec,t),timeFormat12:(e,r=!1)=>S(e,r?n.f12.sec:n.f12.no_sec,t),timeFormat12NoApm:(e,r=!1)=>S(e,r?n.f12_no_apm.sec:n.f12_no_apm.no_sec,t),apmFormat:e=>S(e,n.apm,t)}}function k(e=`ko`){let t=E[D(e)];function n(e){if(isNaN(e)||!isFinite(e))return{day:0,hour:0,minute:0};let t=Math.round(e*60);return{day:Math.floor(t/86400),hour:Math.floor(t%86400/3600),minute:Math.floor(t%3600/60)}}return{minFormat:e=>{let{day:r,hour:i,minute:a}=n(e),o=[];return r!==0&&o.push(`${r}${t.day}`),i!==0&&o.push(`${i}${t.hour.default}`),a!==0&&o.push(`${a}${t.minute.default}`),o.length===0&&o.push(t.zero.default),o.join(` `)},minFormatShort:e=>{let{day:r,hour:i,minute:a}=n(e),o=[];return r!==0&&o.push(`${r}${t.day}`),i!==0&&o.push(`${i}${t.hour.short}`),a!==0&&o.push(`${a}${t.minute.short}`),o.length===0&&o.push(t.zero.short),o.join(` `)}}}var A=()=>({updateAt:l.FieldValue.serverTimestamp(),deletedAt:l.FieldValue.serverTimestamp()}),j=()=>({updateAt:l.FieldValue.serverTimestamp(),deletedAt:null});function M(e){let{spaUrl:t,defaultOG:n,resolvers:r,region:i=`asia-northeast3`}=e,a=null,o=0;function s(){let e=Date.now();return(!a||e-o>18e5)&&(o=e,a=fetch(t,{signal:AbortSignal.timeout(5e3)}).then(async e=>{if(!e.ok)throw a=null,o=0,Error(`Failed to fetch template: ${e.status}`);return e.text()}).catch(e=>{throw a=null,o=0,e})),a}function c(e){return e?String(e).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#039;`):``}function l(e,t,n,r){let i=c(r),a=RegExp(`(<meta\\s+[^>]*${t}=["']${n}["'][^>]*>)`,`gi`),o=!1,s=e.replace(a,e=>(o=!0,/\bcontent=/i.test(e)?e.replace(/\bcontent=(["'])(.*?)\1/i,`content=$1${i}$1`):e.replace(/(\/?>)$/,` content="${i}"$1`)));if(!o){let e=`<meta ${t}="${n}" content="${i}">`;return s.replace(/(<\/head>)/i,`${e}\n$1`)}return s}function d(e,t,n,r){let i=c(t),a=e;return a=/<title>.*<\/title>/i.test(a)?a.replace(/(<title>)[^<]*(<\/title>)/i,`$1${i}$2`):a.replace(/(<\/head>)/i,`<title>${i}</title>\n$1`),a=l(a,`name`,`description`,n),a=l(a,`property`,`og:title`,t),a=l(a,`property`,`og:description`,n),a=l(a,`property`,`og:image`,r),a=l(a,`property`,`og:type`,`website`),a=l(a,`name`,`twitter:card`,`summary_large_image`),a=l(a,`name`,`twitter:title`,t),a=l(a,`name`,`twitter:description`,n),a=l(a,`name`,`twitter:image`,r),a}return(0,u.onRequest)({region:i},async(e,i)=>{let a=Date.now(),o=e.path,c=new URL(e.url,t),l=c.searchParams;try{let t=n;for(let n of r){let r=o.match(n.pattern);if(!r)continue;let i=r[1]??r[0];try{let a=await n.resolve(i,{req:e,pathname:o,searchParams:l,match:r});if(a){t=a;break}}catch(e){console.error(`[SSRDynamicOG] Failed to resolve "${o}${c.search}" with pattern ${n.pattern}:`,e)}}let u=d(await s(),t.title,t.description,t.image);console.log(`[SSRDynamicOG] ${o}${c.search} → ${t.title} (${Date.now()-a}ms)`),i.setHeader(`Content-Type`,`text/html; charset=utf-8`),i.status(200).send(u)}catch(e){console.error(`[SSRDynamicOG] error:`,e),i.redirect(302,t)}})}exports.DATE_TIME_FORMATS=x,exports.Localized=m,exports.SUPPORTED_LOCALES=d,exports.applyCors=_,exports.createDateFormatters=C,exports.createDateTimeFormatters=T,exports.createDurationFormatter=k,exports.createSSRDynamicOG=M,exports.createTimeFormatters=O,exports.defineCallable=h,exports.del=A,exports.formatBaseDateTime=S,exports.setLocalizedLocaleResolver=p,exports.snapshotToData=g,exports.undel=j;
package/dist/index.mjs CHANGED
@@ -1,31 +1,39 @@
1
1
  import { FieldValue as e } from "firebase-admin/firestore";
2
- import { onRequest as t } from "firebase-functions/v2/https";
2
+ import { onCall as t, onRequest as n } from "firebase-functions/v2/https";
3
3
  //#region \0rolldown/runtime.js
4
- var n = Object.create, r = Object.defineProperty, i = Object.getOwnPropertyDescriptor, a = Object.getOwnPropertyNames, o = Object.getPrototypeOf, s = Object.prototype.hasOwnProperty, c = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), l = (e, t, n, o) => {
5
- if (t && typeof t == "object" || typeof t == "function") for (var c = a(t), l = 0, u = c.length, d; l < u; l++) d = c[l], !s.call(e, d) && d !== n && r(e, d, {
4
+ var r = Object.create, i = Object.defineProperty, a = Object.getOwnPropertyDescriptor, o = Object.getOwnPropertyNames, s = Object.getPrototypeOf, c = Object.prototype.hasOwnProperty, l = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), u = (e, t, n, r) => {
5
+ if (t && typeof t == "object" || typeof t == "function") for (var s = o(t), l = 0, u = s.length, d; l < u; l++) d = s[l], !c.call(e, d) && d !== n && i(e, d, {
6
6
  get: ((e) => t[e]).bind(null, d),
7
- enumerable: !(o = i(t, d)) || o.enumerable
7
+ enumerable: !(r = a(t, d)) || r.enumerable
8
8
  });
9
9
  return e;
10
- }, u = (e, t, i) => (i = e == null ? {} : n(o(e)), l(t || !e || !e.__esModule ? r(i, "default", {
10
+ }, d = (e, t, n) => (n = e == null ? {} : r(s(e)), u(t || !e || !e.__esModule ? i(n, "default", {
11
11
  value: e,
12
12
  enumerable: !0
13
- }) : i, e)), d = ["ko", "en"], f = null;
14
- function p(e) {
15
- f = e;
13
+ }) : n, e)), f = ["ko", "en"], p = null;
14
+ function m(e) {
15
+ p = e;
16
16
  }
17
- var m = {
17
+ var h = {
18
18
  get(e, t = "ko") {
19
- let n = f?.();
20
- return e[d.includes(n) ? n : t] ?? e[t];
19
+ let n = p?.();
20
+ return e[f.includes(n) ? n : t] ?? e[t];
21
21
  },
22
22
  ko(e) {
23
23
  return e.ko;
24
24
  }
25
25
  };
26
26
  //#endregion
27
+ //#region src/types/firebase-functions.ts
28
+ function g(e, n, r, i) {
29
+ return t(i ?? {}, async (e) => {
30
+ let t = e.data;
31
+ return r(t, e);
32
+ });
33
+ }
34
+ //#endregion
27
35
  //#region src/utils/firestore.ts
28
- function h(e) {
36
+ function _(e) {
29
37
  return {
30
38
  ...e.data(),
31
39
  id: e.id
@@ -33,13 +41,13 @@ function h(e) {
33
41
  }
34
42
  //#endregion
35
43
  //#region src/utils/cors.ts
36
- function g(e, t, n) {
44
+ function v(e, t, n) {
37
45
  let r = e.headers.origin;
38
46
  return r && n.includes(r) && (t.set("Access-Control-Allow-Origin", r), t.set("Vary", "Origin")), t.set("Access-Control-Allow-Methods", "POST, OPTIONS"), t.set("Access-Control-Allow-Headers", "Content-Type, Authorization"), e.method === "OPTIONS" ? (t.status(204).send(), !1) : e.method === "POST" ? !0 : (t.status(405).send({ error: "Method Not Allowed" }), !1);
39
47
  }
40
48
  //#endregion
41
49
  //#region node_modules/dayjs/dayjs.min.js
42
- var _ = /* @__PURE__ */ c(((e, t) => {
50
+ var y = /* @__PURE__ */ l(((e, t) => {
43
51
  (function(n, r) {
44
52
  typeof e == "object" && t !== void 0 ? t.exports = r() : typeof define == "function" && define.amd ? define(r) : (n = typeof globalThis < "u" ? globalThis : n || self).dayjs = r();
45
53
  })(e, (function() {
@@ -333,9 +341,9 @@ var _ = /* @__PURE__ */ c(((e, t) => {
333
341
  return w(1e3 * e);
334
342
  }, w.en = b[y], w.Ls = b, w.p = {}, w;
335
343
  }));
336
- })), v = /* @__PURE__ */ c(((e, t) => {
344
+ })), b = /* @__PURE__ */ l(((e, t) => {
337
345
  (function(n, r) {
338
- typeof e == "object" && t !== void 0 ? t.exports = r(_()) : typeof define == "function" && define.amd ? define(["dayjs"], r) : (n = typeof globalThis < "u" ? globalThis : n || self).dayjs_locale_ko = r(n.dayjs);
346
+ typeof e == "object" && t !== void 0 ? t.exports = r(y()) : typeof define == "function" && define.amd ? define(["dayjs"], r) : (n = typeof globalThis < "u" ? globalThis : n || self).dayjs_locale_ko = r(n.dayjs);
339
347
  })(e, (function(e) {
340
348
  function t(e) {
341
349
  return e && typeof e == "object" && "default" in e ? e : { default: e };
@@ -383,9 +391,9 @@ var _ = /* @__PURE__ */ c(((e, t) => {
383
391
  };
384
392
  return n.default.locale(r, null, !0), r;
385
393
  }));
386
- })), y = /* @__PURE__ */ u(_());
387
- v();
388
- var b = {
394
+ })), x = /* @__PURE__ */ d(y());
395
+ b();
396
+ var S = {
389
397
  ko: {
390
398
  date_format: {
391
399
  default: "YYYY년 M월 D일 dddd",
@@ -477,40 +485,40 @@ var b = {
477
485
  }
478
486
  }
479
487
  };
480
- function x(e, t, n = "ko") {
481
- let r = e instanceof Date ? (0, y.default)(e) : e;
488
+ function C(e, t, n = "ko") {
489
+ let r = e instanceof Date ? (0, x.default)(e) : e;
482
490
  if (!e || !r.isValid()) return "";
483
491
  let i = n === "en" || n === "ko" ? n : "ko";
484
492
  return r.locale(i).format(t);
485
493
  }
486
494
  //#endregion
487
495
  //#region src/utils/datetime/date.ts
488
- function S(e = "ko") {
489
- let t = e === "en" || e === "ko" ? e : "ko", n = b[t].date_format;
496
+ function w(e = "ko") {
497
+ let t = e === "en" || e === "ko" ? e : "ko", n = S[t].date_format;
490
498
  return {
491
- dateFormat: (e) => x(e, n.default, t),
492
- dateFormatNoYear: (e) => x(e, n.no_year, t),
493
- dateFormatShort: (e) => x(e, n.short, t),
494
- dateFormatNoYearShort: (e) => x(e, n.no_year_short, t)
499
+ dateFormat: (e) => C(e, n.default, t),
500
+ dateFormatNoYear: (e) => C(e, n.no_year, t),
501
+ dateFormatShort: (e) => C(e, n.short, t),
502
+ dateFormatNoYearShort: (e) => C(e, n.no_year_short, t)
495
503
  };
496
504
  }
497
505
  //#endregion
498
506
  //#region src/utils/datetime/datetime.ts
499
- function C(e) {
507
+ function T(e) {
500
508
  return e === "en" || e === "ko" ? e : "ko";
501
509
  }
502
- function w(e = "ko") {
503
- let t = C(e), n = b[t].date_time_format;
510
+ function E(e = "ko") {
511
+ let t = T(e), n = S[t].date_time_format;
504
512
  return {
505
- dateTimeFormat: (e, r = !1) => x(e, r ? n.default.sec : n.default.no_sec, t),
506
- dateTimeFormatShort: (e, r = !1) => x(e, r ? n.short.sec : n.short.no_sec, t),
507
- dateTimeFormatNoYear: (e, r = !1) => x(e, r ? n.no_year.sec : n.no_year.no_sec, t),
508
- dateTimeFormatNoYearShort: (e, r = !1) => x(e, r ? n.no_year.short.sec : n.no_year.short.no_sec, t)
513
+ dateTimeFormat: (e, r = !1) => C(e, r ? n.default.sec : n.default.no_sec, t),
514
+ dateTimeFormatShort: (e, r = !1) => C(e, r ? n.short.sec : n.short.no_sec, t),
515
+ dateTimeFormatNoYear: (e, r = !1) => C(e, r ? n.no_year.sec : n.no_year.no_sec, t),
516
+ dateTimeFormatNoYearShort: (e, r = !1) => C(e, r ? n.no_year.short.sec : n.no_year.short.no_sec, t)
509
517
  };
510
518
  }
511
519
  //#endregion
512
520
  //#region src/utils/datetime/time.ts
513
- var T = {
521
+ var D = {
514
522
  ko: {
515
523
  day: "일",
516
524
  hour: {
@@ -542,21 +550,21 @@ var T = {
542
550
  }
543
551
  }
544
552
  };
545
- function E(e) {
553
+ function O(e) {
546
554
  return e === "en" || e === "ko" ? e : "ko";
547
555
  }
548
- function D(e = "ko") {
549
- let t = E(e), n = b[t].time_format;
556
+ function k(e = "ko") {
557
+ let t = O(e), n = S[t].time_format;
550
558
  return {
551
- timeFormat24: (e, r = !1) => x(e, r ? n.f24.sec : n.f24.no_sec, t),
552
- timeFormat24Short: (e, r = !1) => x(e, r ? n.f24_short.sec : n.f24_short.no_sec, t),
553
- timeFormat12: (e, r = !1) => x(e, r ? n.f12.sec : n.f12.no_sec, t),
554
- timeFormat12NoApm: (e, r = !1) => x(e, r ? n.f12_no_apm.sec : n.f12_no_apm.no_sec, t),
555
- apmFormat: (e) => x(e, n.apm, t)
559
+ timeFormat24: (e, r = !1) => C(e, r ? n.f24.sec : n.f24.no_sec, t),
560
+ timeFormat24Short: (e, r = !1) => C(e, r ? n.f24_short.sec : n.f24_short.no_sec, t),
561
+ timeFormat12: (e, r = !1) => C(e, r ? n.f12.sec : n.f12.no_sec, t),
562
+ timeFormat12NoApm: (e, r = !1) => C(e, r ? n.f12_no_apm.sec : n.f12_no_apm.no_sec, t),
563
+ apmFormat: (e) => C(e, n.apm, t)
556
564
  };
557
565
  }
558
- function O(e = "ko") {
559
- let t = T[E(e)];
566
+ function A(e = "ko") {
567
+ let t = D[O(e)];
560
568
  function n(e) {
561
569
  if (isNaN(e) || !isFinite(e)) return {
562
570
  day: 0,
@@ -583,20 +591,20 @@ function O(e = "ko") {
583
591
  }
584
592
  //#endregion
585
593
  //#region src/constant/firestore.ts
586
- var k = () => ({
594
+ var j = () => ({
587
595
  updateAt: e.serverTimestamp(),
588
596
  deletedAt: e.serverTimestamp()
589
- }), A = () => ({
597
+ }), M = () => ({
590
598
  updateAt: e.serverTimestamp(),
591
599
  deletedAt: null
592
600
  });
593
601
  //#endregion
594
602
  //#region src/handlers/ssr-dynamic-og.ts
595
- function j(e) {
596
- let { spaUrl: n, defaultOG: r, resolvers: i, region: a = "asia-northeast3" } = e, o = null, s = 0;
603
+ function N(e) {
604
+ let { spaUrl: t, defaultOG: r, resolvers: i, region: a = "asia-northeast3" } = e, o = null, s = 0;
597
605
  function c() {
598
606
  let e = Date.now();
599
- return (!o || e - s > 18e5) && (s = e, o = fetch(n, { signal: AbortSignal.timeout(5e3) }).then(async (e) => {
607
+ return (!o || e - s > 18e5) && (s = e, o = fetch(t, { signal: AbortSignal.timeout(5e3) }).then(async (e) => {
600
608
  if (!e.ok) throw o = null, s = 0, Error(`Failed to fetch template: ${e.status}`);
601
609
  return e.text();
602
610
  }).catch((e) => {
@@ -618,35 +626,35 @@ function j(e) {
618
626
  let i = l(t), a = e;
619
627
  return a = /<title>.*<\/title>/i.test(a) ? a.replace(/(<title>)[^<]*(<\/title>)/i, `$1${i}$2`) : a.replace(/(<\/head>)/i, `<title>${i}</title>\n$1`), a = u(a, "name", "description", n), a = u(a, "property", "og:title", t), a = u(a, "property", "og:description", n), a = u(a, "property", "og:image", r), a = u(a, "property", "og:type", "website"), a = u(a, "name", "twitter:card", "summary_large_image"), a = u(a, "name", "twitter:title", t), a = u(a, "name", "twitter:description", n), a = u(a, "name", "twitter:image", r), a;
620
628
  }
621
- return t({ region: a }, async (e, t) => {
622
- let a = Date.now(), o = e.path, s = new URL(e.url, n), l = s.searchParams;
629
+ return n({ region: a }, async (e, n) => {
630
+ let a = Date.now(), o = e.path, s = new URL(e.url, t), l = s.searchParams;
623
631
  try {
624
- let n = r;
625
- for (let t of i) {
626
- let r = o.match(t.pattern);
632
+ let t = r;
633
+ for (let n of i) {
634
+ let r = o.match(n.pattern);
627
635
  if (!r) continue;
628
636
  let i = r[1] ?? r[0];
629
637
  try {
630
- let a = await t.resolve(i, {
638
+ let a = await n.resolve(i, {
631
639
  req: e,
632
640
  pathname: o,
633
641
  searchParams: l,
634
642
  match: r
635
643
  });
636
644
  if (a) {
637
- n = a;
645
+ t = a;
638
646
  break;
639
647
  }
640
648
  } catch (e) {
641
- console.error(`[SSRDynamicOG] Failed to resolve "${o}${s.search}" with pattern ${t.pattern}:`, e);
649
+ console.error(`[SSRDynamicOG] Failed to resolve "${o}${s.search}" with pattern ${n.pattern}:`, e);
642
650
  }
643
651
  }
644
- let u = d(await c(), n.title, n.description, n.image);
645
- console.log(`[SSRDynamicOG] ${o}${s.search} → ${n.title} (${Date.now() - a}ms)`), t.setHeader("Content-Type", "text/html; charset=utf-8"), t.status(200).send(u);
652
+ let u = d(await c(), t.title, t.description, t.image);
653
+ console.log(`[SSRDynamicOG] ${o}${s.search} → ${t.title} (${Date.now() - a}ms)`), n.setHeader("Content-Type", "text/html; charset=utf-8"), n.status(200).send(u);
646
654
  } catch (e) {
647
- console.error("[SSRDynamicOG] error:", e), t.redirect(302, n);
655
+ console.error("[SSRDynamicOG] error:", e), n.redirect(302, t);
648
656
  }
649
657
  });
650
658
  }
651
659
  //#endregion
652
- export { b as DATE_TIME_FORMATS, m as Localized, d as SUPPORTED_LOCALES, g as applyCors, S as createDateFormatters, w as createDateTimeFormatters, O as createDurationFormatter, j as createSSRDynamicOG, D as createTimeFormatters, k as del, x as formatBaseDateTime, p as setLocalizedLocaleResolver, h as snapshotToData, A as undel };
660
+ export { S as DATE_TIME_FORMATS, h as Localized, f as SUPPORTED_LOCALES, v as applyCors, w as createDateFormatters, E as createDateTimeFormatters, A as createDurationFormatter, N as createSSRDynamicOG, k as createTimeFormatters, g as defineCallable, j as del, C as formatBaseDateTime, m as setLocalizedLocaleResolver, _ as snapshotToData, M as undel };
@@ -0,0 +1,44 @@
1
+ import { CallableOptions, CallableRequest } from 'firebase-functions/v2/https';
2
+ export type PrimitiveMap = {
3
+ string: string;
4
+ number: number;
5
+ boolean: boolean;
6
+ null: null;
7
+ };
8
+ /**
9
+ * "string" | "number | null" 같은 문자열을 실제 타입으로 변환
10
+ */
11
+ export type ParseType<T extends string> = T extends keyof PrimitiveMap ? PrimitiveMap[T] : T extends `${infer A} | ${infer B}` ? ParseType<A> | ParseType<B> : never;
12
+ export type SchemaRecord = {
13
+ /** 실제 Cloud Function 이름 (배포되는 이름) */
14
+ name: string;
15
+ /** params 각 필드의 타입 정의 ("string", "number | null" 등) */
16
+ params: Record<string, string>;
17
+ /** result 각 필드의 타입 정의 */
18
+ result: Record<string, string>;
19
+ };
20
+ export type FnSchemaLike = Record<string, SchemaRecord>;
21
+ export type FnKey<TSchema extends FnSchemaLike> = keyof TSchema;
22
+ export type FnCallableName<TSchema extends FnSchemaLike, K extends FnKey<TSchema>> = TSchema[K]["name"];
23
+ /** "string" -> string, "number | null" -> number | null 로 바꿔줌 */
24
+ export type ToRuntimeType<T extends Record<string, string>> = {
25
+ [K in keyof T]: ParseType<T[K]>;
26
+ };
27
+ /** 스키마에서 params 타입 뽑기 */
28
+ export type FnParams<TSchema extends FnSchemaLike, K extends FnKey<TSchema>> = ToRuntimeType<TSchema[K]["params"]>;
29
+ /** 스키마에서 result 타입 뽑기 */
30
+ export type FnResult<TSchema extends FnSchemaLike, K extends FnKey<TSchema>> = ToRuntimeType<TSchema[K]["result"]>;
31
+ /**
32
+ * 서버에서 callable 함수 정의할 때 쓰는 헬퍼
33
+ *
34
+ * 사용 예)
35
+ * export const getUserProfile = defineCallable(
36
+ * fnSchema,
37
+ * "getUserProfile",
38
+ * async (data, req) => {
39
+ * // data: FnParams<typeof fnSchema, "getUserProfile">
40
+ * // return: FnResult<typeof fnSchema, "getUserProfile">
41
+ * },
42
+ * )
43
+ */
44
+ export declare function defineCallable<TSchema extends FnSchemaLike, K extends FnKey<TSchema>>(_schema: TSchema, _key: K, handler: (data: FnParams<TSchema, K>, req: CallableRequest<FnParams<TSchema, K>>) => FnResult<TSchema, K> | Promise<FnResult<TSchema, K>>, options?: CallableOptions<FnParams<TSchema, K>>): import('firebase-functions/v2/https').CallableFunction<ToRuntimeType<TSchema[K]["params"]>, any, unknown>;
@@ -1,2 +1,3 @@
1
1
  export * from './firestore';
2
2
  export * from './localized';
3
+ export * from './firebase-functions';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ienlab/cloud-functions-library",
3
- "version": "1.0.0-dev.15",
3
+ "version": "1.0.0-dev.17",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",