micro-stacks
Version:
Tiny libraries for building Stacks apps.
61 lines (47 loc) • 6.67 kB
JavaScript
function z(r){return r=f(r),r=u(r),a(r)}function f(r){let n=/(^|[^\\]);.*/g;return r.replace(n,function(e,t){return t||""})}function u(r){let n=[],e=/\([\s\S]*?\)/gim,t=e.exec(r);for(;t!==null;){let i=t[0].replace(/\s+/gm," ");n.push({match:t,replacement:i}),t=e.exec(r);}let s=r.split("");for(let i of n){let{match:o,replacement:c}=i;s.splice(o.index,o[0].length,c);}return s.join("").replace(/\(|\)/gim," ")}function a(r){let n={},e=r.split(`
`);for(let t of e){if(!t||!t.trim())continue;let s=t.toUpperCase();/\s+TXT\s+/.test(s)?(n.txt=n.txt||[],n.txt.push(h(t))):s.indexOf("$ORIGIN")===0?n.$origin=t.split(/\s+/g)[1]:s.indexOf("$TTL")===0?n.$ttl=parseInt(t.split(/\s+/g)[1],10):/\s+SOA\s+/.test(s)?n.soa=l(t):/\s+NS\s+/.test(s)?(n.ns=n.ns||[],n.ns.push(g(t))):/\s+A\s+/.test(s)?(n.a=n.a||[],n.a.push(T(t,n.a))):/\s+AAAA\s+/.test(s)?(n.aaaa=n.aaaa||[],n.aaaa.push(m(t))):/\s+CNAME\s+/.test(s)?(n.cname=n.cname||[],n.cname.push(y(t))):/\s+MX\s+/.test(s)?(n.mx=n.mx||[],n.mx.push(N(t))):/\s+PTR\s+/.test(s)?(n.ptr=n.ptr||[],n.ptr.push(d(t,n.ptr,n.$origin))):/\s+SRV\s+/.test(s)?(n.srv=n.srv||[],n.srv.push(I(t))):/\s+SPF\s+/.test(s)?(n.spf=n.spf||[],n.spf.push(A(t))):/\s+URI\s+/.test(s)&&(n.uri=n.uri||[],n.uri.push(R(t)));}return n}function l(r){let n={},e=r.trim().split(/\s+/g),t=e.length;return n.name=e[0],n.minimum=parseInt(e[t-1],10),n.expire=parseInt(e[t-2],10),n.retry=parseInt(e[t-3],10),n.refresh=parseInt(e[t-4],10),n.serial=parseInt(e[t-5],10),n.rname=e[t-6],n.mname=e[t-7],isNaN(e[1])||(n.ttl=parseInt(e[1],10)),n}function g(r){let n=r.trim().split(/\s+/g),e=n.length,t={name:n[0],host:n[e-1]};return isNaN(n[1])||(t.ttl=parseInt(n[1],10)),t}function T(r,n){let e=r.trim().split(/\s+/g),t=r.trim().toUpperCase().split(/\s+/g),s=e.length,i={name:e[0],ip:e[s-1]};return t.lastIndexOf("A")===0&&(n.length?i.name=n[n.length-1].name:i.name="@"),isNaN(e[1])||(i.ttl=parseInt(e[1],10)),i}function m(r){let n=r.trim().split(/\s+/g),e=n.length,t={name:n[0],ip:n[e-1]};return isNaN(n[1])||(t.ttl=parseInt(n[1],10)),t}function y(r){let n=r.trim().split(/\s+/g),e=n.length,t={name:n[0],alias:n[e-1]};return isNaN(n[1])||(t.ttl=parseInt(n[1],10)),t}function N(r){let n=r.trim().split(/\s+/g),e=n.length,t={name:n[0],preference:parseInt(n[e-2],10),host:n[e-1]};return isNaN(n[1])||(t.ttl=parseInt(n[1],10)),t}function h(r){let n=r.trim().match(/[^\s"']+|"[^"]*"|'[^']*'/g);if(!n)throw new Error("Failure to tokenize TXT record");let e=n.length,t=n.indexOf("TXT");function s(c){return c.indexOf('"')>-1&&(c=c.split('"')[1]),c}let i;e-t-1>1?i=[...n.slice(t+1).map(s)]:i=s(n[e-1]);let o={name:n[0],txt:i};return isNaN(n[1])||(o.ttl=parseInt(n[1],10)),o}function d(r,n,e){let t=r.trim().split(/\s+/g);r.trim().toUpperCase().split(/\s+/g).lastIndexOf("PTR")===0&&n[n.length-1]&&t.unshift(n[n.length-1].name);let i=t.length,o={name:t[0],fullname:`${t[0]}.${e}`,host:t[i-1]};return isNaN(t[1])||(o.ttl=parseInt(t[1],10)),o}function I(r){let n=r.trim().split(/\s+/g),e=n.length,t={name:n[0],target:n[e-1],priority:parseInt(n[e-4],10),weight:parseInt(n[e-3],10),port:parseInt(n[e-2],10)};return isNaN(n[1])||(t.ttl=parseInt(n[1],10)),t}function A(r){let n=r.trim().split(/\s+/g),e={name:n[0],data:""},t=n.length;for(;t-- >4;)e.data=n[t]+" "+e.data.trim();return isNaN(n[1])||(e.ttl=parseInt(n[1],10)),e}function R(r){let n=r.trim().split(/\s+/g),e=n.length,t={name:n[0],target:n[e-1].replace(/"/g,""),priority:parseInt(n[e-3],10),weight:parseInt(n[e-2],10)};return isNaN(n[1])||(t.ttl=parseInt(n[1],10)),t}function p(){return `{$origin}
{$ttl}
; SOA Record
{name} {ttl} IN SOA {mname}{rname}(
{serial} ;serial
{refresh} ;refresh
{retry} ;retry
{expire} ;expire
{minimum} ;minimum ttl
)
; NS Records
{ns}
; MX Records
{mx}
; A Records
{a}
; AAAA Records
{aaaa}
; CNAME Records
{cname}
; PTR Records
{ptr}
; TXT Records
{txt}
; SRV Records
{srv}
; SPF Records
{spf}
; URI Records
{uri}
`}function G(r,n){if(!n.includes("://"))throw new Error("Invalid token file url");let e=n.split("://")[0],t=n.split("://")[1].split("/"),s=t[0],i=`/${t.slice(1).join("/")}`,o={$origin:r,$ttl:3600,uri:[{name:"_http._tcp",priority:10,weight:1,target:`${e}://${s}${i}`}]};return S(o,`{$origin}
{$ttl}
{uri}
`)}function S(r,n=p()){return n=k(r.$origin,n),n=x(r.$ttl,n),n=$(r.soa,n),n=w(r.ns,n),n=X(r.a,n),n=O(r.aaaa,n),n=M(r.cname,n),n=b(r.mx,n),n=P(r.ptr,n),n=C(r.txt,n),n=E(r.srv,n),n=U(r.spf,n),n=V(r.uri,n),n=v(r,n),n.replace(/\n{2,}/gim,`
`)}function k(r,n){let e="";return typeof r<"u"&&(e+="$ORIGIN "+r),n.replace("{$origin}",e)}function x(r,n){let e="";return typeof r<"u"&&(e+="$TTL "+r),n.replace("{$ttl}",e)}function $(r,n){let e=n;if(typeof r<"u"){r.name=r.name||"@",r.ttl=r.ttl||"";for(let t in r){let s=r[t];e=e.replace("{"+t+"}",s+" ");}}return e}function w(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN NS "+t.host+`
`;return n.replace("{ns}",e)}function X(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN A "+t.ip+`
`;return n.replace("{a}",e)}function O(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN AAAA "+t.ip+`
`;return n.replace("{aaaa}",e)}function M(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN CNAME "+t.alias+`
`;return n.replace("{cname}",e)}function b(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN MX "+t.preference+" "+t.host+`
`;return n.replace("{mx}",e)}function P(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN PTR "+t.host+`
`;return n.replace("{ptr}",e)}function C(r,n){let e="";if(r)for(let t of r){e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN TXT ";let s=t.txt;typeof s=="string"?e+='"'+s+'"':s instanceof Array&&(e+=s.map(function(i){return '"'+i+'"'}).join(" ")),e+=`
`;}return n.replace("{txt}",e)}function E(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN SRV "+t.priority+" ",e+=t.weight+" ",e+=t.port+" ",e+=t.target+`
`;return n.replace("{srv}",e)}function U(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN SPF "+t.data+`
`;return n.replace("{spf}",e)}function V(r,n){let e="";if(r)for(let t of r)e+=(t.name||"@")+" ",t.ttl&&(e+=t.ttl+" "),e+="IN URI "+t.priority+" ",e+=t.weight+" ",e+='"'+t.target+`"
`;return n.replace("{uri}",e)}function v(r,n){n=n.replace("{zone}",r.$origin||(r.soa?r.soa.name:!1)||""),n=n.replace("{datetime}",new Date().toISOString());let e=Math.round(Date.now()/1e3);return n.replace("{time}",`${e}`)}
export { p as getZoneFileTemplate, G as makeProfileZoneFile, S as makeZoneFile, z as parseZoneFile };