jsx-slack
Version:
Build JSON object for Slack Block Kit surfaces from JSX
2 lines (1 loc) • 2.37 kB
JavaScript
import q from"../date.mjs";import{JSXSlackError as w}from"../error.mjs";import{JSXSlack as d}from"../jsx.mjs";import{createComponent as E}from"../jsx-internals.mjs";import{detectSpecialLink as j}from"../utils.mjs";import{escapeChars as k,escapeEntity as g,escapeEverythingContents as h,escapeReplacers as m}from"./escape.mjs";const p=(t,r=!0)=>{let i="";for(const n of Object.keys(t))if(t[n]!=null&&["number","bigint","boolean","string","symbol"].includes(typeof t[n])){let c=t[n].toString();r&&(c=g(c)),i+=` ${n}="${c.replace(/"/g,""")}"`}return i},v=(t,r,i,n)=>{var c;const e=()=>i.join(""),l=(...a)=>n.length>0&&a.some(s=>s===n[n.length-1]),o=(...a)=>a.some(s=>n.includes(s));if(t==="br")return"<br />";if(l("pre","code")&&!["a","time"].includes(t))return e();switch(t){case"b":case"strong":return o("b","strong","time")?e():`<b>${m.bold(e())}</b>`;case"i":case"em":return o("i","em","time")?e():`<i>${k(e(),m.italic)}</i>`;case"s":case"strike":case"del":return o("s","strike","del","time")?e():`<s>${m.strikethrough(e())}</s>`;case"code":return o("time")?e():`<code>${m.code(e())}</code>`;case"p":return o("p")?e():`<p>${e()}</p>`;case"blockquote":return o("blockquote","ul","ol","time")?e():`<blockquote>${m.blockquote(e())}</blockquote>`;case"pre":return o("ul","ol","time")?e():`<pre>${h(e().replace(/`{3}/g,"``\u02CB"))}</pre>`;case"a":{if(o("a","time"))return e();let a=e();return!a&&r.href&&j(r.href)&&(a="specialLink"),`<a${p(r)}>${a}</a>`}case"time":{const a=(c=r.dateTime)!=null?c:r.datetime,s=Number.parseInt(a,10),u=new Date(Number.isNaN(s)?a:s*1e3),f=Math.floor(u.getTime()/1e3),$=e().replace(/\|/g,"\u01C0"),S=p({datetime:f}),C=r.fallback?p({"data-fallback":r.fallback.replace(/\|/g,"\u01C0")}):p({"data-fallback":q(u,$)},!1);return`<time${S}${C}>${h($)}</time>`}case"small":case"span":case"ul":return`<${t}>${e()}</${t}>`;case"ol":case"li":return`<${t}${p(r)}>${e()}</${t}>`;default:throw new w(`Unknown HTML-like element: ${t}`,r.__source)}},y=E("Escape",d.Fragment.bind(null)),b=(t,r,i=!1)=>{var n;return((n=d.Children.map(t,c=>c))==null?void 0:n.reduce((c,e)=>{if(d.isValidElement(e)){const{type:l,props:o,children:a}=e.$$jsxslack;if(typeof l=="string"){const f=b(a,[...r,l]);return[...c,v(l,o||{},f,r)]}const s=!i&&l===y,u=b(a,r,s);return c.concat(s?k(u.join("")):u)}return[...c,g(e.toString())]},[]))||[]};export{y as Escape,b as parseJSX};