@freik/passable
Version:
## A CMake auto formatter
14 lines (13 loc) • 18.1 kB
JavaScript
// @bun
import{readFileSync as ar,writeFileSync as er}from"fs";var{Glob:cf}=globalThis.Bun;function zf(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 cf(r)}return}function _f(f){return f.map((r)=>{let O=zf(r);return O?[...O.scanSync(".")]:r}).flat()}var Cf=Symbol.for("freik.typetag");function h(f){return f===void 0}function If(f){return!h(f)}function vf(f){return f===void 0||f===null}function Pf(f){return!vf(f)}function pf(f,r,O){return r(f)||O(f)}function Tf(f,r){return(O)=>pf(O,f,r)}function df(f,r,O){return r(f)&&O(f)}function tf(f,...r){return r.some((O)=>O(f))}function wf(...f){return(r)=>tf(r,...f)}function n(f){return df(f,gf,Pf)}function gf(f){return typeof f==="object"}function v(f){return Array.isArray(f)}function N(f){return typeof f==="string"}function P(f){return typeof f==="number"&&!isNaN(f-0)}var Iu=Tf(N,P);function Ff(f){return typeof f==="boolean"}function z(f){return typeof f==="function"}function nf(f){return f instanceof Map}function Kf(f,r){if(!v(f))return!1;for(let O of f)if(!r(O))return!1;return!0}function k(f){return(r)=>Kf(r,f)}function mf(f,...r){return v(f)&&f.length===r.length&&r.every((O,E)=>O(f[E]))}function lf(...f){return(r)=>mf(r,...f)}function sf(f,r,O){if(!nf(f))return!1;for(let[E,R]of f){if(!r(E))return!1;if(!O(R))return!1}return!0}function bf(f,r){return(O)=>sf(O,f,r)}function Uf(f){return typeof f==="symbol"}function Z(f,r){return n(f)&&r in f}function of(f,r,O){return Z(f,r)&&O(f[r])}var C=of;function Df(f,r){return C(f,r,N)}function kf(f,r,O,E){if(!n(r))return!1;let R=Object.keys(O).length,I=Object.keys(r),D=I.length;for(let K of I){if(!Z(r,K))continue;let H=r[K];if(h(H)||r[K]===null){delete r[K],D--;continue}if(C(E,K,z)){let j=E[K];if(!j(H))return!1;D--}else if(C(O,K,z)){let j=O[K];if(!j(H))return!1;R--,D--}}return R===0&&(D===0||!f)}function af(f,r={}){return(O)=>kf(!1,O,f,r)}function ef(f,r){if(!n(f))return!1;let O=Object.keys(f),E=O.length;for(let R of O){if(!Z(f,R))continue;let I=f[R];if(h(I)||f[R]===null){delete f[R],E--;continue}if(C(r,R,z)){let D=r[R];if(!D(I))return!1;E--}}return E===0}function a(f){return(r)=>ef(r,f)}function fr(f,r,O){if(!n(f))return!1;let E=Object.keys(f),R=E.length;for(let I of E){if(!Z(f,I))continue;let D=f[I];if(!r(I)||!O(D))return!1;R--}return R===0}function Vf(f,r){return(O)=>fr(O,f,r)}var rr=Function("try {return this===global;}catch(e){ return false;}"),ur=Function("try {return this===window;}catch(e){ return false;}");function Or(){return typeof globalThis<"u"}var jf=Symbol.for("freik.Set"),Jf=Symbol.for("freik.Map"),Af=Symbol.for("freik.Symbol"),Nf=Symbol.for("freik.RegExp"),hf=Symbol.for("freik.Date"),Hf=Symbol.for("freik.BigInt");function Er(f){return[...f.entries()]}function Rr(f){return Kf(f,lf(If,If))?new Map(f):void 0}function _r(f){return[...f]}function Ir(f){return v(f)?new Set(f):void 0}function wr(f){let r=Symbol.keyFor(f);if(r===void 0)throw Error("Unable to get a key for a symbol for pickling");return r}function br(f){return N(f)?Symbol.for(f):void 0}function Ur(f){return{source:f.source,flags:f.flags}}function Dr(f){if(Df(f,"source")&&Df(f,"flags"))return new RegExp(f.source,f.flags)}function Fr(f){return f.toJSON()}function Kr(f){try{return N(f)?new Date(f):void 0}catch{return}}function Vr(f){return f.toString()}function jr(f){try{return N(f)?BigInt(f):void 0}catch{return}}var Jr=new Map([[Jf,Er],[jf,_r],[Af,wr],[Nf,Ur],[hf,Fr],[Hf,Vr]]),Ar=new Map([[Jf,Rr],[jf,Ir],[Af,br],[Nf,Dr],[hf,Kr],[Hf,jr]]),Nr;((f)=>{f[f.Success=0]="Success",f[f.Already=1]="Already",f[f.Fail=2]="Fail",f[f.DetectionFailure=3]="DetectionFailure"})(Nr||={});var g=Cf;function o(f){if(!Z(f,g))return f[g]={to:Jr,from:Ar},0;if(!C(f,g,af({to:bf(wf(Uf,N),z),from:bf(wf(Uf,N),z)})))return 2;return 1}function hr(){if(Or())return o(globalThis);if(ur())return o(window);if(rr())return o(global);return 3}switch(hr()){case 2:throw Error(`Invalid <global>[${String(g)}] object`);case 3:throw Error("Unable to determine environment for pickling");default:break}import*as M from"fs";import*as y 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 Wf=Object.freeze({controlKeywords:[],indentAfter:-1,options:[]}),x={controlKeywords:new Set,indentAfter:-1,options:new Set},Wr=a({controlKeywords:k(N),indentAfter:P,options:k(N)}),Qf=a({useTabs:Ff,tabWidth:P,endOfLine:(f)=>f===`
`||f===`\r
`,printWidth:P,commands:Vf(N,Wr)}),ff=e;function rf(f){return f.endOfLine??ff.endOfLine}function Qr(){let f=process.cwd();while(y.dirname(f)!=f){let r=y.join(f,".passablerc.json");if(M.existsSync(r)){let E=M.readFileSync(r,"utf-8");try{let R=JSON.parse(E);return Qf(R)?R:{}}catch(R){console.error(`Error parsing ${r}:`,R)}}let O=y.join(f,"package.json");if(M.existsSync(O))try{let E=M.readFileSync(O,"utf-8"),R=JSON.parse(E);if(Z(R,"passable"))return Qf(R.passable)?R.passable:{}}catch(E){console.error(`Error reading ${O}:`,E)}f=y.dirname(f)}return}function Xf(){return Qr()||{}}function Yf(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 $f(f,r=e.commands){let O=new Map;for(let[E,R]of Object.entries(r))O.set(E.toLowerCase(),[E,Yf({...Wf,...R})]);for(let[E,R]of Object.entries(f))O.set(E.toLowerCase(),[E,Yf({...Wf,...R})]);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:(R,I)=>R===O&&(h(I)||I===E),isIdentifier:(R)=>{if(O!=="identifier")return!1;else if(h(R))return!0;else if(N(R))return R===E;else return!h(E)&&R.includes(E)},isOpenParen:()=>O==="paren"&&E==="(",isCloseParen:()=>O==="paren"&&E===")",isComment:()=>O==="comment"||O==="tail_comment"||O==="directive",toString:()=>`Token(${O}${h(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 Bf(f){return X("comment",f)}function Zf(){return X("eof","")}function yr(){return X("empty","")}function Gf(f){let r=[],O=[],E=0,R=0,I=0;function D(w){r.push(w),O.push({line:R,column:I})}function K(){return r.length===0?Zf():r[r.length-1]}function H(w){return r.slice(Math.max(0,E-w),E)}function j(){if(r.length<=E)throw Error("No tokens available");else return r[E]}function S(){return r[E++]}function Q(w,b){let F=S();if(F.is(w,b))return F;throw Error(`Expected
Token(${w}${b?`, ${b}`:""})
got
${F} at line ${O[E-1]?.line}, column ${O[E-1]?.column}`)}function c(w){return(h(w)?Q("identifier"):Q("identifier",w)).value}function Y(w){if(w.length>0)D(Sr(w));return""}function L(w,b,F,u=!1){let _=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]==="=")_++,b++;if(b<w.length&&w[b]===F)return[_,b];return[-1,-1]}function i(w,b){let[F,u]=L(w,b+1,"[",!0);if(F===-1){let _=w.substring(0,b).trim().length!==0,U=w.substring(b);if(_)D(Mr(U));else{let V=U.substring(1).trim();if(V.startsWith("@format-on")||V.startsWith("@format-off"))D(Lr(V));else D(Bf(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,_]=L(w,b,"[",!1);if(u===-1)return{state:p,linePos:b,curTok:F+w[b]};return{state:Xr(u),linePos:_,curTok:""}}function W(w,b,F,u){let[_,U]=L(b,F,"]",!1);if(_===w.equals){if(w.state===3)D(Bf(u+b.substring(F,U+1)));else D(Gr(u+b.substring(F,U-1-_),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(R=0;R<b.length;R++){let _=b[R];if(F.state===0){if(u=Y(u),_.trim().length===0){if(K().type!=="empty")D(yr());continue}}for(I=0;I<_.length;I++)switch(F.state){case 0:switch(_[I]){case"#":u=Y(u),{state:F,linePos:I,curTok:u}=i(_,I);continue;case'"':u=Y(u),F=Yr(),u="";continue;case"[":u=Y(u),{state:F,linePos:I,curTok:u}=m(_,I,u);continue;case"(":case")":u=Y(u),D(Br(_[I]));continue;case"\\":if(u+="\\",I+1<_.length)u+=_[I+1],I++;continue;case" ":case"\t":u=Y(u);continue;default:u+=_[I];continue}case 2:case 3:if(I===0)u+=`
`;if(_[I]==="]")({state:F,linePos:I,curTok:u}=W(F,_,I,u));else u+=_[I];continue;case 1:if(I===0)u+=`
`;if(_[I]==='"')D(Zr(u)),u="",F=p;else if(_[I]==="\\"){if(u+="\\",I+1<_.length)u+=_[I+1],I++}else u+=_[I];continue}}return D(Zf()),r}return l(f),{tokens:r,peek:j,consume:S,expect:Q,expectIdentifier:c,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 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,R,I,D){return{type:"ConditionalBlock",condition:f,body:r,elseifBlocks:O,elseBlock:E,endifArgs:R,ifTailComment:I,endifTailComment:D}}function Sf(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,R,I,D){return{type:"PairedCall",open:f,close:r,params:O,body:E,endArgs:R,startTailComment:I,endTailComment:D}}function Lf(f,r){let O={formatEnabled:!0,originalLines:r},E=[];while(!f.peek().is("eof"))E.push(d(f,O));return xr(E)}function d(f,r){let O=f.peek();if(O.isIdentifier())switch(O.value){case"if":return lr(f,r);case"macro":return T(f,r,"macro","endmacro");case"block":return T(f,r,"block","endblock");case"function":return T(f,r,"function","endfunction");case"while":return T(f,r,"while","endwhile");case"foreach":return T(f,r,"foreach","endforeach");default:return gr(f)}else if(O.is("comment"))return Sf(f.consume().value);else if(O.is("empty"))return f.consume(),pr();else if(O.is("directive"))return Tr(f.consume().value);throw Error(`Expected statement or comment, got ${O}`)}function gr(f){let r=f.expectIdentifier(),O=B(f),E=G(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(),Sf(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((R)=>R.toString()).join(" * ");throw Error(`Unexpected token in argument: ${r} -- ${E}`)}function G(f){return f.peek().is("tail_comment")?f.consume().value:void 0}function lr(f,r){f.expectIdentifier("if");let O=B(f),E=G(f),R=[],I=[],D;while(!0){let K=f.peek();if(K.isIdentifier())switch(K.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),j=G(f);return Pr(O,R,I,D,H,E,j)}else if(!K.isComment()&&!K.is("empty"))throw Error(`Unexpected token in conditional block: ${K}`);R.push(d(f,r))}}function sr(f,r){f.expectIdentifier("elseif");let O=B(f),E=G(f),R=[];while(!f.peek().isIdentifier(["elseif","else","endif"]))R.push(d(f,r));return dr(O,R,E)}function or(f,r){f.expectIdentifier("else");let O=B(f),E=G(f),R=[];while(!f.peek().isIdentifier("endif"))R.push(d(f,r));return ir(R,O,E)}function T(f,r,O,E){f.expectIdentifier(O);let R=B(f),I=G(f),D=[];while(!f.peek().isIdentifier(E))D.push(d(f,r));f.expectIdentifier(E);let K=B(f),H=G(f);return tr(O,E,R,D,K,I,H)}function kr(f,r){let O=[],E=0,R={...ff,...r},I=$f(R.commands),D=R.useTabs?"\t":" ".repeat(R.tabWidth);function K(u){let _=D.repeat(E);if(typeof u==="string")return _+u;return u.map((U)=>_+U)}function H(){return R.printWidth-R.tabWidth*E}function j(u,_=!1){if(!u)return"";return _?` ${u}${rf(r)}`:` ${u}`}function S(u,_){switch(u.type){case"BlockComment":return`${u.value}`;case"QuotedString":return`"${u.value}"`;case"UnquotedString":if(_.options.has(u.value.toUpperCase())||_.controlKeywords.has(u.value.toUpperCase()))return u.value.toUpperCase();return u.value;case"Group":return`(${c(u.value)})`;case"Bracketed":let U="=".repeat(u.equals);return`[${U}[${u.value}]${U}]`;default:throw Error(`Unknown argument type: ${u}`)}}function Q(u){if(u.prefixTailComment)return-1;let _=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 V=Q(U.value);if(V<0)return-1;_+=V}else _+=S(U,x).length;_++}return _===1?2:_}function c(u,_=x){let U="",V=!0;if(!h(u))for(let A of u.args){if(!V)U+=" ";else U+=j(u.prefixTailComment,!0),V=!1;U+=S(A,_)}return U}function Y(u,_=x){if(u.type==="Group")O.push(W("",u.value)+j(u.tailComment));else O.push(K(S(u,_)+(u.type==="BlockComment"?"":j(u.tailComment))))}function L(u,_){if(!u)return;let U=E,V=_??x;for(let A=0;A<u.args.length;A++){let J=u.args[A];if(J.type==="UnquotedString"&&V.options.has(J.value.toUpperCase()))J.value=J.value.toUpperCase();if(Y(J),A===V.indentAfter)E++}E=U}function i(u){return!h(u)&&v(u)&&u.length>=2&&u.length<=3}function m(u,_,U){let V=[];function A(){return V[V.length-1]}for(let J of u.args){if(J.type==="UnquotedString"){let $=J.value.toUpperCase();if(_.has($)){V.push([$,[],J.tailComment]);continue}else if(U.has($)){J.value=$,V.push(J);continue}}let t=A();if(i(t))t[1].push(J);else V.push(J)}return V}function W(u,_){let U=I.get(u),V=U?U[0]:u,A=U?U[1]:x,J=Q(_||{args:[]});if(J>0&&H()>=J+u.length)return K(`${V}(${c(_,A)})`);if(O.push(K(V+"("+j(_?.prefixTailComment))),E++,A.controlKeywords.size===0||h(_))L(_,A);else{let t=m(_,A.controlKeywords,A.options);for(let $ of t)if(i($)){let[xf,s,qf]=$;O.push(K(`${xf}`+j(qf))),E++;let Ef=Q({args:s});if(Ef>0&&H()>=Ef){let Rf=K(c({args:s}));if(Rf.trim().length>0)O.push(Rf)}else L({args:s},A);E--}else Y($)}return E--,K(")")}function l(u){let _=W(u.name,u.args);O.push(_+j(u.tailComment))}function w(u){O.push(W("if",u.condition)+j(u.ifTailComment)),E++,u.body.map(F),E--;for(let _ of u.elseifBlocks)O.push(W("elseif",_.condition)+j(_.tailComment)),E++,_.body.map(F),E--;if(u.elseBlock)O.push(W("else",u.elseBlock?.elseArgs)+j(u.elseBlock.tailComment)),E++,u.elseBlock.body.map(F),E--;O.push(W("endif",u.endifArgs)+j(u.endifTailComment))}function b(u){O.push(W(u.open,u.params)+j(u.startTailComment)),E++,u.body.map(F),E--,O.push(W(u.close,u.endArgs)+j(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(...K(u.value.split(`
`)));else O.push("");break;case"Directive":O.push(K(`# ${u.value}`));break}}return f.statements.forEach((u)=>F(u)),O}function Mf(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 yf="passable",Of=new Set(["-i","--in-place","-w","--write"]);function fu(){console.error(`Usage: ${yf} <files...>`),console.error(`or ${yf} (${[...Of].join("/")}) <files...>`),process.exit(1)}function ru(f,r){let O=ar(f,"utf-8"),E=Gf(O),R=Lf(E,O.split(`
`));return Mf(R,r)}if(process.argv.length<3||process.argv.length===3&&process.argv[2].startsWith("-")&&!Of.has(process.argv[2]))fu();var q=Of.has(process.argv[2]),uu=q?process.argv.slice(3):process.argv.slice(2),Ou=_f(uu);if(q)console.time("Total Formatting Time");var Eu=Xf();Ou.forEach((f)=>{if(q)console.time(`Formatting Time: ${f}`);let r=ru(f,Eu);if(q)er(f,r,"binary");else console.log(r);if(q)console.timeEnd(`Formatting Time: ${f}`)});if(q)console.timeEnd("Total Formatting Time");export{ru as printFullFile};