UNPKG

@freik/passable

Version:
14 lines (13 loc) 17.9 kB
#!/usr/bin/env bun // @bun import{readFileSync as ar,writeFileSync as er}from"fs";var{Glob:xf}=globalThis.Bun;function qf(f){if(f.indexOf("*")>=0||f.indexOf("?")>=0){let r=f;if(r=r.replaceAll("\\","\\\\"),r.startsWith("!"))r=`\\${r}`;return r=r.replaceAll("{","\\{"),r=r.replaceAll("}","\\}"),r=r.replaceAll("[","\\]"),r=r.replaceAll("]","\\]"),new xf(r)}return}function Rf(f){return f.map((r)=>{let O=qf(r);return O?[...O.scanSync(".")]:r}).flat()}var cf=Symbol.for("freik.typetag");function N(f){return f===void 0}function _f(f){return!N(f)}function zf(f){return f===void 0||f===null}function Cf(f){return!zf(f)}function vf(f,r,O){return r(f)||O(f)}function Pf(f,r){return(O)=>vf(O,f,r)}function pf(f,r,O){return r(f)&&O(f)}function Tf(f,...r){return r.some((O)=>O(f))}function If(...f){return(r)=>Tf(r,...f)}function g(f){return pf(f,df,Cf)}function df(f){return typeof f==="object"}function c(f){return Array.isArray(f)}function h(f){return typeof f==="string"}function z(f){return typeof f==="number"&&!isNaN(f-0)}var Iu=Pf(h,z);function Df(f){return typeof f==="boolean"}function x(f){return typeof f==="function"}function tf(f){return f instanceof Map}function Ff(f,r){if(!c(f))return!1;for(let O of f)if(!r(O))return!1;return!0}function k(f){return(r)=>Ff(r,f)}function gf(f,...r){return c(f)&&f.length===r.length&&r.every((O,E)=>O(f[E]))}function nf(...f){return(r)=>gf(r,...f)}function mf(f,r,O){if(!tf(f))return!1;for(let[E,_]of f){if(!r(E))return!1;if(!O(_))return!1}return!0}function wf(f,r){return(O)=>mf(O,f,r)}function bf(f){return typeof f==="symbol"}function C(f,r){return g(f)&&r in f}function lf(f,r,O){return C(f,r)&&O(f[r])}var q=lf;function Uf(f,r){return q(f,r,h)}function sf(f,r,O,E){if(!g(r))return!1;let _=Object.keys(O).length,I=Object.keys(r),D=I.length;for(let j of I){if(!C(r,j))continue;let H=r[j];if(N(H)||r[j]===null){delete r[j],D--;continue}if(q(E,j,x)){let V=E[j];if(!V(H))return!1;D--}else if(q(O,j,x)){let V=O[j];if(!V(H))return!1;_--,D--}}return _===0&&(D===0||!f)}function of(f,r={}){return(O)=>sf(!1,O,f,r)}function kf(f,r){if(!g(f))return!1;let O=Object.keys(f),E=O.length;for(let _ of O){if(!C(f,_))continue;let I=f[_];if(N(I)||f[_]===null){delete f[_],E--;continue}if(q(r,_,x)){let D=r[_];if(!D(I))return!1;E--}}return E===0}function a(f){return(r)=>kf(r,f)}function af(f,r,O){if(!g(f))return!1;let E=Object.keys(f),_=E.length;for(let I of E){if(!C(f,I))continue;let D=f[I];if(!r(I)||!O(D))return!1;_--}return _===0}function jf(f,r){return(O)=>af(O,f,r)}var ef=new Function("try {return this===global;}catch(e){ return false;}"),fr=new Function("try {return this===window;}catch(e){ return false;}");function rr(){return typeof globalThis!=="undefined"}var Kf=Symbol.for("freik.Set"),Vf=Symbol.for("freik.Map"),Jf=Symbol.for("freik.Symbol"),Af=Symbol.for("freik.RegExp"),hf=Symbol.for("freik.Date"),Nf=Symbol.for("freik.BigInt");function ur(f){return[...f.entries()]}function Or(f){return Ff(f,nf(_f,_f))?new Map(f):void 0}function Er(f){return[...f]}function Rr(f){return c(f)?new Set(f):void 0}function _r(f){let r=Symbol.keyFor(f);if(r===void 0)throw new Error("Unable to get a key for a symbol for pickling");return r}function Ir(f){return h(f)?Symbol.for(f):void 0}function wr(f){return{source:f.source,flags:f.flags}}function br(f){if(Uf(f,"source")&&Uf(f,"flags"))return new RegExp(f.source,f.flags)}function Ur(f){return f.toJSON()}function Dr(f){try{return h(f)?new Date(f):void 0}catch{return}}function Fr(f){return f.toString()}function jr(f){try{return h(f)?BigInt(f):void 0}catch{return}}var Kr=new Map([[Vf,ur],[Kf,Er],[Jf,_r],[Af,wr],[hf,Ur],[Nf,Fr]]),Vr=new Map([[Vf,Or],[Kf,Rr],[Jf,Ir],[Af,br],[hf,Dr],[Nf,jr]]),Jr;((f)=>{f[f.Success=0]="Success",f[f.Already=1]="Already",f[f.Fail=2]="Fail",f[f.DetectionFailure=3]="DetectionFailure"})(Jr||={});var t=cf;function o(f){if(!C(f,t))return f[t]={to:Kr,from:Vr},0;if(!q(f,t,of({to:wf(If(bf,h),x),from:wf(If(bf,h),x)})))return 2;return 1}function Ar(){if(rr())return o(globalThis);if(fr())return o(window);if(ef())return o(global);return 3}switch(Ar()){case 2:throw Error(`Invalid <global>[${String(t)}] object`);case 3:throw Error("Unable to determine environment for pickling");default:break}import*as n from"fs";import*as v from"path";var e={useTabs:!1,tabWidth:2,endOfLine:` `,printWidth:80,commands:{add_custom_target:{controlKeywords:["COMMAND","DEPENDS","BYPRODUCTS","WORKING_DIRECTORY","COMMENT","JOB_POOL","JOB_SERVER_AWARE","SOURCES"],options:["ALL","VERBATIM","USES_TERMINAL","COMMAND_EXPAND_LISTS"]},add_library:{controlKeywords:["STATIC","SHARED","MODULE","OBJECT","INTERFACE","UNKNOWN","ALIAS"],options:["GLOBAL","EXCLUDE_FROM_ALL","IMPORTED"]},add_executable:{options:["WIN32","MACOSX_BUNDLE","EXCLUDE_FROM_ALL","IMPORTED","ALIAS"]},block:{controlKeywords:["PROPAGATE"],options:["SCOPE_FOR","POLICIES","VARIABLES"]},execute_process:{controlKeywords:["COMMAND","WORKING_DIRECTORY","RESULT_VARIABLE","OUTPUT_VARIABLE","ERROR_VARIABLE","INPUT_FILE","OUTPUT_FILE","ERROR_FILE","TIMEOUT","ECHO_ERROR_VARIABLE","ECHO_OUTPUT_VARIABLE","ECHO_ERROR_VARIABLE","OUTPUT_STRIP_TRAILING_WHITESPACE"]},list:{controlKeywords:["APPEND","INSERT","REMOVE_AT","REMOVE_ITEM","FIND","LENGTH","GET","SUBLIST","SORT","UNIQUE"]},set_target_properties:{controlKeywords:["PROPERTIES"]},target_sources:{controlKeywords:["INTERFACE","PUBLIC","PRIVATE","FILE_SET","TYPE","BASE_DIRS","FILES"],options:["HEADERS","CXX_MODULES"]},target_precompile_headers:{controlKeywords:["INTERFACE","PUBLIC","PRIVATE","REUSE_FROM"]},target_compile_definitions:{controlKeywords:["INTERFACE","PUBLIC","PRIVATE"]},target_include_directories:{controlKeywords:["INTERFACE","PUBLIC","PRIVATE"]},target_link_libraries:{controlKeywords:["INTERFACE","PUBLIC","PRIVATE"]},if:{controlKeywords:["AND","OR"],options:["NOT"]},elseif:{controlKeywords:["AND","OR"],options:["NOT"]},while:{controlKeywords:["AND","OR"],options:["NOT"]},set:{indentAfter:0}}};var Hf=Object.freeze({controlKeywords:[],indentAfter:-1,options:[]}),L={controlKeywords:new Set,indentAfter:-1,options:new Set},Nr=a({controlKeywords:k(h),indentAfter:z,options:k(h)}),Hr=a({useTabs:Df,tabWidth:z,endOfLine:(f)=>f===` `||f===`\r `,printWidth:z,commands:jf(h,Nr)}),ff=e;function rf(f){return f.endOfLine??ff.endOfLine}function Wr(){let f=process.cwd();while(v.dirname(f)!=f){let r=v.join(f,".passablerc.json");if(n.existsSync(r))return r;f=v.dirname(f)}return}function Qr(f){try{let r=n.readFileSync(f,"utf-8"),O=JSON.parse(r);return Hr(O)?O:{}}catch(r){return console.error(`Error parsing config file at ${f}:`,r),{}}}function Qf(){let f=Wr();if(f)return Qr(f);return{}}function Wf(f){return{controlKeywords:new Set(f.controlKeywords.map((r)=>r.toUpperCase())),options:new Set(f.options.map((r)=>r.toUpperCase())),indentAfter:f.indentAfter??0}}function Yf(f,r=e.commands){let O=new Map;for(let[E,_]of Object.entries(r))O.set(E.toLowerCase(),[E,Wf({...Hf,..._})]);for(let[E,_]of Object.entries(f))O.set(E.toLowerCase(),[E,Wf({...Hf,..._})]);return O}var P={state:0},Yr=()=>({state:1,backslashCount:0}),Xr=(f)=>({state:2,equals:f}),$r=(f)=>({state:3,equals:f});function X(f,r){let O=f,E=r;return{type:O,value:E,is:(_,I)=>_===O&&(N(I)||I===E),isIdentifier:(_)=>{if(O!=="identifier")return!1;else if(N(_))return!0;else if(h(_))return _===E;else return!N(E)&&_.includes(E)},isOpenParen:()=>O==="paren"&&E==="(",isCloseParen:()=>O==="paren"&&E===")",isComment:()=>O==="comment"||O==="tail_comment"||O==="directive",toString:()=>`Token(${O}${N(E)?"":`, ${E}`})`}}function Br(f){return X("paren",f)}function Zr(f){return X("quoted",f)}function Gr(f,r){return X("bracketed",`${r}:${f}`)}function Sr(f){return X("identifier",f)}function Lr(f){return X("directive",f)}function Mr(f){return X("tail_comment",f)}function Xf(f){return X("comment",f)}function $f(){return X("eof","")}function yr(){return X("empty","")}function Bf(f){let r=[],O=[],E=0,_=0,I=0;function D(w){r.push(w),O.push({line:_,column:I})}function j(){return r.length===0?$f():r[r.length-1]}function H(w){return r.slice(Math.max(0,E-w),E)}function V(){if(r.length<=E)throw new Error("No tokens available");else return r[E]}function G(){return r[E++]}function Q(w,b){let F=G();if(F.is(w,b))return F;throw new Error(`Expected Token(${w}${b?`, ${b}`:""}) got ${F} at line ${O[E-1]?.line}, column ${O[E-1]?.column}`)}function y(w){return(N(w)?Q("identifier"):Q("identifier",w)).value}function Y(w){if(w.length>0)D(Sr(w));return""}function S(w,b,F,u=!1){let R=0;while(u&&b<w.length&&(w[b]===" "||w[b]==="\t"))b++;if(b>=w.length||w[b]!==F)return[-1,-1];b++;while(b<w.length&&w[b]==="=")R++,b++;if(b<w.length&&w[b]===F)return[R,b];return[-1,-1]}function d(w,b){let[F,u]=S(w,b+1,"[",!0);if(F===-1){let R=w.substring(0,b).trim().length!==0,U=w.substring(b);if(R)D(Mr(U));else{let K=U.substring(1).trim();if(K.startsWith("@format-on")||K.startsWith("@format-off"))D(Lr(K));else D(Xf(U))}return{state:P,linePos:w.length,curTok:""}}return{state:$r(F),linePos:u,curTok:w.substring(b,u+1)}}function m(w,b,F){let[u,R]=S(w,b,"[",!1);if(u===-1)return{state:P,linePos:b,curTok:F+w[b]};return{state:Xr(u),linePos:R,curTok:""}}function W(w,b,F,u){let[R,U]=S(b,F,"]",!1);if(R===w.equals){if(w.state===3)D(Xf(u+b.substring(F,U+1)));else D(Gr(u+b.substring(F,U-1-R),w.equals));return{state:P,linePos:U,curTok:""}}return{state:w,linePos:F,curTok:u+"]"}}function l(w){let b=w.split(/\r?\n/),F=P,u="";for(_=0;_<b.length;_++){let R=b[_];if(F.state===0){if(u=Y(u),R.trim().length===0){if(j().type!=="empty")D(yr());continue}}for(I=0;I<R.length;I++)switch(F.state){case 0:switch(R[I]){case"#":u=Y(u),{state:F,linePos:I,curTok:u}=d(R,I);continue;case'"':u=Y(u),F=Yr(),u="";continue;case"[":u=Y(u),{state:F,linePos:I,curTok:u}=m(R,I,u);continue;case"(":case")":u=Y(u),D(Br(R[I]));continue;case"\\":if(u+="\\",I+1<R.length)u+=R[I+1],I++;continue;case" ":case"\t":u=Y(u);continue;default:u+=R[I];continue}case 2:case 3:if(I===0)u+=` `;if(R[I]==="]")({state:F,linePos:I,curTok:u}=W(F,R,I,u));else u+=R[I];continue;case 1:if(I===0)u+=` `;if(R[I]==='"')D(Zr(u)),u="",F=P;else if(R[I]==="\\"){if(u+="\\",I+1<R.length)u+=R[I+1],I++}else u+=R[I];continue}}return D($f()),r}return l(f),{tokens:r,peek:V,consume:G,expect:Q,expectIdentifier:y,expectOpenParen:()=>Q("paren","(").isOpenParen(),expectCloseParen:()=>Q("paren",")").isCloseParen(),history:H,count:()=>r.length,reset:()=>{E=0}}}function xr(f){return{type:"CMakeFile",statements:f}}function qr(f,r,O){return{type:"CommandInvocation",name:f,args:r,tailComment:O}}function cr(f){return{type:"QuotedString",value:f}}function zr(f){return{type:"UnquotedString",value:f}}function Cr(f){let r=f.indexOf(":");if(r<1)throw new Error(`Invalid bracketed string value: ${f}`);let O=parseInt(f.substring(0,r),10),E=f.substring(r+1);return{type:"Bracketed",value:E,equals:O}}function vr(f){return{type:"Group",value:f}}function Pr(f,r,O,E,_,I,D){return{type:"ConditionalBlock",condition:f,body:r,elseifBlocks:O,elseBlock:E,endifArgs:_,ifTailComment:I,endifTailComment:D}}function Zf(f){return{type:"BlockComment",value:f,isBlank:!1}}function pr(){return{type:"BlockComment",value:"",isBlank:!0}}function Tr(f){return{type:"Directive",value:f}}function dr(f,r,O){return{type:"ElseIfBlock",condition:f,body:r,tailComment:O}}function ir(f,r,O){return{type:"ElseBlock",body:f,elseArgs:r,tailComment:O}}function tr(f,r,O,E,_,I,D){return{type:"PairedCall",open:f,close:r,params:O,body:E,endArgs:_,startTailComment:I,endTailComment:D}}function Gf(f,r){let O={formatEnabled:!0,originalLines:r},E=[];while(!f.peek().is("eof"))E.push(T(f,O));return xr(E)}function T(f,r){let O=f.peek();if(O.isIdentifier())switch(O.value){case"if":return lr(f,r);case"macro":return p(f,r,"macro","endmacro");case"block":return p(f,r,"block","endblock");case"function":return p(f,r,"function","endfunction");case"while":return p(f,r,"while","endwhile");case"foreach":return p(f,r,"foreach","endforeach");default:return gr(f)}else if(O.is("comment"))return Zf(f.consume().value);else if(O.is("empty"))return f.consume(),pr();else if(O.is("directive"))return Tr(f.consume().value);throw new Error(`Expected statement or comment, got ${O}`)}function gr(f){let r=f.expectIdentifier(),O=B(f),E=Z(f);return qr(r,O,E)}function B(f){let r=[];f.expectOpenParen();let O=f.peek().is("tail_comment")?f.consume().value:void 0;while(!f.peek().isCloseParen()){let E=mr(f);if(E!==void 0)r.push(E)}return f.expectCloseParen(),{args:r,prefixTailComment:O}}function uf(f,r){let O=f.peek();if(O.is("tail_comment"))return f.consume(),{...r,tailComment:O.value};return r}function nr(f){return vr(B(f))}function mr(f){let r=f.peek();switch(r.type){case"quoted":return f.consume(),uf(f,cr(r.value));case"identifier":return f.consume(),uf(f,zr(r.value));case"comment":return f.consume(),Zf(r.value);case"empty":f.consume();return;case"paren":return nr(f);case"bracketed":return f.consume(),uf(f,Cr(r.value))}let E=f.history(10).map((_)=>_.toString()).join(" * ");throw new Error(`Unexpected token in argument: ${r} -- ${E}`)}function Z(f){return f.peek().is("tail_comment")?f.consume().value:void 0}function lr(f,r){f.expectIdentifier("if");let O=B(f),E=Z(f),_=[],I=[],D;while(!0){let j=f.peek();if(j.isIdentifier())switch(j.value){case"elseif":I.push(sr(f,r));continue;case"else":D=or(f,r);continue;case"endif":f.expectIdentifier("endif");let H=B(f),V=Z(f);return Pr(O,_,I,D,H,E,V)}else if(!j.isComment()&&!j.is("empty"))throw new Error(`Unexpected token in conditional block: ${j}`);_.push(T(f,r))}}function sr(f,r){f.expectIdentifier("elseif");let O=B(f),E=Z(f),_=[];while(!f.peek().isIdentifier(["elseif","else","endif"]))_.push(T(f,r));return dr(O,_,E)}function or(f,r){f.expectIdentifier("else");let O=B(f),E=Z(f),_=[];while(!f.peek().isIdentifier("endif"))_.push(T(f,r));return ir(_,O,E)}function p(f,r,O,E){f.expectIdentifier(O);let _=B(f),I=Z(f),D=[];while(!f.peek().isIdentifier(E))D.push(T(f,r));f.expectIdentifier(E);let j=B(f),H=Z(f);return tr(O,E,_,D,j,I,H)}function kr(f,r){let O=[],E=0,_={...ff,...r},I=Yf(_.commands),D=_.useTabs?"\t":" ".repeat(_.tabWidth);function j(u){let R=D.repeat(E);if(typeof u==="string")return R+u;return u.map((U)=>R+U)}function H(){return _.printWidth-_.tabWidth*E}function V(u,R=!1){if(!u)return"";return R?` ${u}${rf(r)}`:` ${u}`}function G(u,R){switch(u.type){case"BlockComment":return`${u.value}`;case"QuotedString":return`"${u.value}"`;case"UnquotedString":if(R.options.has(u.value.toUpperCase())||R.controlKeywords.has(u.value.toUpperCase()))return u.value.toUpperCase();return u.value;case"Group":return`(${y(u.value)})`;case"Bracketed":let U="=".repeat(u.equals);return`[${U}[${u.value}]${U}]`;default:throw new Error(`Unknown argument type: ${u}`)}}function Q(u){if(u.prefixTailComment)return-1;let R=1;for(let U of u.args){if(U.type==="BlockComment")return-1;if(U.tailComment&&U.tailComment.length>0)return-1;if(U.type==="Group"){let K=Q(U.value);if(K<0)return-1;R+=K}else R+=G(U,L).length;R++}return R===1?2:R}function y(u,R=L){let U="",K=!0;if(!N(u))for(let A of u.args){if(!K)U+=" ";else U+=V(u.prefixTailComment,!0),K=!1;U+=G(A,R)}return U}function Y(u,R=L){if(u.type==="Group")O.push(W("",u.value)+V(u.tailComment));else O.push(j(G(u,R)+(u.type==="BlockComment"?"":V(u.tailComment))))}function S(u,R){if(!u)return;let U=E,K=R??L;for(let A=0;A<u.args.length;A++){let J=u.args[A];if(J.type==="UnquotedString"&&K.options.has(J.value.toUpperCase()))J.value=J.value.toUpperCase();if(Y(J),A===K.indentAfter)E++}E=U}function d(u){return!N(u)&&c(u)&&u.length>=2&&u.length<=3}function m(u,R,U){let K=[];function A(){return K[K.length-1]}for(let J of u.args){if(J.type==="UnquotedString"){let $=J.value.toUpperCase();if(R.has($)){K.push([$,[],J.tailComment]);continue}else if(U.has($)){J.value=$,K.push(J);continue}}let i=A();if(d(i))i[1].push(J);else K.push(J)}return K}function W(u,R){let U=I.get(u),K=U?U[0]:u,A=U?U[1]:L,J=Q(R||{args:[]});if(J>0&&H()>=J+u.length)return j(`${K}(${y(R,A)})`);if(O.push(j(K+"("+V(R?.prefixTailComment))),E++,A.controlKeywords.size===0||N(R))S(R,A);else{let i=m(R,A.controlKeywords,A.options);for(let $ of i)if(d($)){let[Mf,s,yf]=$;O.push(j(`${Mf}`+V(yf))),E++;let Of=Q({args:s});if(Of>0&&H()>=Of){let Ef=j(y({args:s}));if(Ef.trim().length>0)O.push(Ef)}else S({args:s},A);E--}else Y($)}return E--,j(")")}function l(u){let R=W(u.name,u.args);O.push(R+V(u.tailComment))}function w(u){O.push(W("if",u.condition)+V(u.ifTailComment)),E++,u.body.map(F),E--;for(let R of u.elseifBlocks)O.push(W("elseif",R.condition)+V(R.tailComment)),E++,R.body.map(F),E--;if(u.elseBlock)O.push(W("else",u.elseBlock?.elseArgs)+V(u.elseBlock.tailComment)),E++,u.elseBlock.body.map(F),E--;O.push(W("endif",u.endifArgs)+V(u.endifTailComment))}function b(u){O.push(W(u.open,u.params)+V(u.startTailComment)),E++,u.body.map(F),E--,O.push(W(u.close,u.endArgs)+V(u.endTailComment))}function F(u){switch(u.type){case"CommandInvocation":l(u);break;case"ConditionalBlock":w(u);break;case"PairedCall":b(u);break;case"BlockComment":if(!u.isBlank)O.push(...j(u.value.split(` `)));else O.push("");break;case"Directive":O.push(j(`# ${u.value}`));break}}return f.statements.forEach((u)=>F(u)),O}function Sf(f,r={}){let O=rf(r),E=kr(f,r).join(O);if(E.trim().length===0)return"";return E.endsWith(O)?E:E+O}var Lf="passable";function fu(){console.error(`Usage: ${Lf} <files...>`),console.error(`or ${Lf} (-i/--in-place) <files...>`),process.exit(1)}function ru(f,r){let O=ar(f,"utf-8"),E=Bf(O),_=Gf(E,O.split(` `));return Sf(_,r)}if(process.argv.length<3||process.argv.length===3&&(process.argv[2]==="-i"||process.argv[2]==="--in-place"))fu();var M=process.argv[2]==="-i"||process.argv[2]==="--in-place",uu=M?process.argv.slice(3):process.argv.slice(2),Ou=Rf(uu);if(M)console.time("Total Formatting Time");var Eu=Qf();Ou.forEach((f)=>{if(M)console.time(`Formatting Time: ${f}`);let r=ru(f,Eu);if(M)er(f,r,"binary");else console.log(r);if(M)console.timeEnd(`Formatting Time: ${f}`)});if(M)console.timeEnd("Total Formatting Time");export{ru as printFullFile};