-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtreeSitterFormatter.js
More file actions
15 lines (15 loc) · 11.4 KB
/
Copy pathtreeSitterFormatter.js
File metadata and controls
15 lines (15 loc) · 11.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env node
var ae=[".git",".svn",".hg","node_modules","__pycache__"],C=ae.map(t=>`**/${t}/**`);function I(t){return{debug(e){t&&console.warn(`[debug] ${e}`)}}}function j(t){return t==="crlf"?`\r
`:`
`}function R(t,e){return t?" ":" ".repeat(e??4)}var y="Syntax error",d=class extends Error{constructor(r){let n=fe(r);super(ce(n));this.point=r;this.name="SyntaxError",this.location=n}location;getFileMessage(r){return this.location!=null?`${r}(${this.location}): ${y}`:`${r}: ${y}`}};function F(t){return t instanceof d}function ce(t){return t!=null?`${y} at ${t}.`:y}function fe(t){return t!=null?`${t.row+1}:${t.column+1}`:void 0}var b=class extends d{constructor(e){super(k(e)?.startPosition),this.name="SyntaxTreeError"}};function k(t){if(t.isError||t.isMissing)return t;for(let e of t.children){if(!e.hasError)continue;let r=k(e);if(r!=null)return r}return null}function D(t,e={},r=!1){if(t.hasError)throw new b(t);let n=R(e.indentTabs,e.indentSize),i=j(e.endOfLine);return new _(n,i,e.insertFinalNewline??!0,r).getText(t)}var _=class{constructor(e,r,n,i){this.indentation=e;this.eol=r;this.insertFinalNewline=n;this.logger=I(i)}lastRow=0;logger;getText(e){let r=this.getNodeText(e,0);return r.length===0?"":this.insertFinalNewline?r+this.eol:r}getNodeText(e,r){let n=e.startPosition.row>this.lastRow+1?this.eol:"";this.lastRow=e.endPosition.row;let i=this.getNodeTextInternal(e,r);return this.lastRow=e.endPosition.row,`${n}${i}`}getNamedNodeText(e,r){let n=e.children.findIndex(s=>s.type===")"),i=e.children.slice(0,2).map(s=>s.text).join(""),a=e.children.slice(n).map(s=>this.getNodeText(s,0)).join(""),o=e.children.slice(2,n).map(s=>this.getNodeText(s,r+1));return o.length===0?`${this.getIndent(r)}${i}${a}`:[`${this.getIndent(r)}${i}`,...o,`${this.getIndent(r)}${a}`].join(this.eol)}getListText(e,r){let n=e.children.findIndex(s=>s.type==="]"),i=e.children[0].text,a=e.children.slice(n).map(s=>s.text).join(" ");return[`${this.getIndent(r)}${i}`,...e.children.slice(1,n).map(s=>this.getNodeText(s,r+1)),`${this.getIndent(r)}${a}`].join(this.eol)}getPredicateText(e,r){let n=e.children[0].text,i=e.children[e.children.length-1].text,a=[e.children.slice(1,4).map(o=>o.text).join(""),...e.children[e.children.length-2].children.map(o=>o.text)];if(e.startPosition.row===e.endPosition.row){let o=`${n}${a.join(" ")}${i}`;return`${this.getIndent(r)}${o}`}return[`${this.getIndent(r)}${n}${a[0]}`,...a.slice(1).map(o=>`${this.getIndent(r+1)}${o}`),`${this.getIndent(r)}${i}`].join(this.eol)}getFieldDefinitionText(e,r){return r===0?["(_",this.getFieldDefinitionText(e,1),")"].join(this.eol):[this.getIndent(r),e.children[0].text,e.children[1].text," ",this.getNodeText(e.children[2],r).trimStart()].join("")}getNodeTextInternal(e,r){switch(e.type){case"program":return this.joinLines(e.children,0);case"grouping":return this.joinLines(e.children,r+1);case"list":return this.getListText(e,r);case"named_node":return this.getNamedNodeText(e,r);case"predicate":return this.getPredicateText(e,r);case"field_definition":return this.getFieldDefinitionText(e,r);case"anonymous_node":return this.getIndent(r)+e.children.map(n=>this.getNodeText(n,r+1)).join("");case"comment":return`${this.getIndent(r)}${e.text.trimEnd()}`;case".":case"negated_field":return`${this.getIndent(r)}${e.text}`;case"(":case")":return`${this.getIndent(r-1)}${e.text}`;case"capture":return` ${e.text}`;case"#":case"_":case"predicate_type":case"identifier":case"quantifier":case"string":return e.text;case"parameters":return` ${e.children.map(i=>i.text).join(" ")}`;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}joinLines(e,r){if(e.length===0)return"";let n=e[e.length-1].type==="quantifier",a=(n?e.slice(0,-1):e).map(o=>this.getNodeText(o,r)).join(this.eol);return n?`${a}${e[e.length-1].text}`:a}getIndent(e){return e<1?"":new Array(e).fill(this.indentation).join("")}};import*as K from"node:fs";import*as h from"node:path";import{fileURLToPath as pe}from"node:url";import{Language as ue,Parser as z}from"web-tree-sitter";var M,U=new Map,W=h.dirname(pe(import.meta.url));function me(){return M??=z.init(),M}function de(t){let e=U.get(t);if(e==null){let r=he(t);e=ue.load(r),U.set(t,e)}return e}function he(t){let e=`${t}.wasm`,r=[h.join(W,"../../node_modules/@cursorless/tree-sitter-wasms/out",e),h.join(W,"../node_modules/@cursorless/tree-sitter-wasms/out",e)].find(n=>K.existsSync(n));if(r==null)throw new Error(`Could not find ${e}`);return r}async function X(t,e){await me();let r=await de(e),n=new z;n.setLanguage(r);let i=n.parse(t);if(i==null)throw new Error("Failed to parse text");return i.rootNode}import Se from"get-stdin";import*as L from"node:fs/promises";import*as N from"node:path";import*as f from"node:process";function T(t){return t instanceof Error?t.message:String(t)}import*as p from"node:process";var xe="\x1B[0m",ye="\x1B[33m",be="\x1B[31m",we="[warn]",Ee="[error]";function S(t=!1){return Le(p.stdout,p.stderr,t)}function Le(t,e,r=!1){let n=Ne(e)?(o,s)=>`${s}${o}${xe}`:(o,s)=>o,i,a;return r?(i=()=>{},a=()=>{}):(i=o=>{t.write(`${o}
`)},a=o=>{e.write(`${n(we,ye)} ${o}
`)}),{log:i,warn:a,error(o){e.write(`${n(Ee,be)} ${o}
`)}}}function Ne(t){return"NO_COLOR"in p.env?!1:t.isTTY===!0}var u=class extends Error{constructor(r){super(`One or more file pattern errors occurred:
${r.join(`
`)}`);this.messages=r}name="FilePatternError"};import*as G from"editorconfig";async function $(t){let e=await G.parse(t),r={};return e.indent_style==="tab"?r.indentTabs=!0:e.indent_style==="space"&&(r.indentTabs=!1),typeof e.indent_size=="number"?r.indentSize=e.indent_size:e.indent_size==="tab"&&typeof e.tab_width=="number"&&(r.indentSize=e.tab_width),typeof e.max_line_length=="number"&&(r.maxLineLength=e.max_line_length),typeof e.column_width=="number"&&(r.columnWidth=e.column_width),typeof e.insert_final_newline=="boolean"&&(r.insertFinalNewline=e.insert_final_newline),typeof e.preserve_multiline=="boolean"&&(r.preserveMultiline=e.preserve_multiline),e.end_of_line!=null&&e.end_of_line!=="unset"&&(r.endOfLine=e.end_of_line),r}function w(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}import*as q from"node:path";var E=q.sep==="\\"?t=>t.replaceAll("\\","/"):t=>t;function H(){return{filePatterns:[],help:!1,version:!1,quiet:!1,debug:!1,check:!1}}function J(t){let e=H();for(let r=0;r<t.length;r++){let n=t[r];if(n==="--"){e.filePatterns.push(...t.slice(r+1));break}if(!Pe(e,n)){if(n.startsWith("--"))throw new Error(`Unknown argument: ${n}`);e.filePatterns.push(n)}}return e}function Pe(t,e){switch(e){case"--help":return t.help=!0,!0;case"--version":return t.version=!0,!0;case"--quiet":return t.quiet=!0,!0;case"--check":return t.check=!0,!0;case"--debug":return t.debug=!0,!0;default:return!1}}import V from"fast-glob";import*as m from"node:path";import*as Y from"node:fs/promises";async function B(t){try{return await Y.lstat(t)}catch(e){if(w(e))return;throw e}}async function Q(t,e){let r=new Set,n=Fe(t.fileEndings),i=[],a={dot:!0,followSymbolicLinks:!1,ignore:C};for(let o of e){let s=m.resolve(o),l=await B(s);if(l!=null){if(l.isSymbolicLink()){i.push(`Specified pattern is a symbolic link: ${o}`);continue}if(l.isFile()){r.add(s);continue}if(l.isDirectory()){let c=await V(`**/*.${n}`,{...a,cwd:s});c.length===0&&i.push(`No matching files were found in the directory: ${o}`);for(let se of c)r.add(m.resolve(s,se));continue}}let P=E(o),g=(await V(P,a)).filter(c=>_e(c,t.fileEndings));g.length===0&&i.push(`No files matching the pattern were found: ${o}`);for(let c of g)r.add(m.resolve(c))}if(i.length>0)throw new u(i);return Array.from(r).sort((o,s)=>o.localeCompare(s))}function Fe(t){return t.length===1?t[0]:`{${t.join(",")}}`}function _e(t,e){let r=m.extname(t).slice(1);return e.includes(r)}var Z=["--help","--version","--quiet","--check","--debug"];function ee(t){process.stdout.write(`Usage: ${t.binName} [options] [file/dir/glob ...]
`),process.stdout.write(`
`),process.stdout.write(`Options:
`);for(let e of Z)process.stdout.write(` ${e}
`)}var te={name:"@cursorless/talon-tools",version:"0.10.2",description:"Linting and formatting tools for Talon and Cursorless",author:"Cursorless Dev",license:"MIT",type:"module",files:["dist","!dist/test","!dist/build.*"],types:"./dist/lib.d.ts",exports:{".":{types:"./dist/lib.d.ts",default:"./dist/lib.js"},"./node":{types:"./dist/node/libNode.d.ts",default:"./dist/libNode.js"}},bin:{"snippet-fmt":"dist/snippetFormatter.js","talon-fmt":"dist/talonFormatter.js","tree-sitter-fmt":"dist/treeSitterFormatter.js"},repository:{type:"git",url:"git+https://github.com/cursorless-dev/talon-tools.git"},funding:"https://github.com/sponsors/cursorless-dev",sponsor:{url:"https://github.com/sponsors/cursorless-dev"},scripts:{build:"npm run clean && tsc -p . && tsx ./src/build.ts",clean:"rm -rf dist/*",lint:"npm run lint:ts &&npm run lint:fmt","lint:ts":"tsc -p . --noEmit && eslint src","lint:fmt":"prettier --check .",fix:"npm run fix:ts && npm run fix:fmt","fix:ts":"eslint src --fix","fix:fmt":"prettier --write --list-different .",test:"tsx src/test/runAllTests.ts","test:subset":"tsx src/test/runAllTests.ts --subset"},dependencies:{"@cursorless/tree-sitter-wasms":"^0.7.0",editorconfig:"^3.0.2","fast-glob":"^3.3.3","get-stdin":"^10.0.0","web-tree-sitter":"^0.26.7"},devDependencies:{"@eslint/js":"^9.39.4","@types/mocha":"^10.0.10","@types/node":"^24.12.0",esbuild:"^0.27.4","eslint-config-prettier":"^10.1.8","eslint-plugin-import":"^2.32.0",eslint:"^9.39.4",jiti:"^2.6.1",mocha:"^11.7.5",prettier:"^3.8.1",tsx:"^4.21.0","typescript-eslint":"^8.57.1",typescript:"^5.9.3"}};function re(){process.stdout.write(`${te.version}
`)}function v(t){Reflect.set(process,"exitCode",t)}async function ie(t){let e=S();try{let r=J(f.argv.slice(2));e=S(r.quiet);let n=await $e({cli:t,args:r,logger:e});v(n)}catch(r){if(r instanceof u)for(let n of r.messages)e.error(n);else e.error(T(r));v(2)}}async function $e({cli:t,args:e,logger:r}){if(e.help)return ee(t),0;if(e.version)return re(),0;if(e.filePatterns.length>0)return ve({cli:t,logger:r,check:e.check,debug:e.debug,filePatterns:e.filePatterns});if(!f.stdin.isTTY)return Ce({cli:t,logger:r,stdin:f.stdin,check:e.check,debug:e.debug});throw new Error("No input files specified. Use --help for usage information.")}async function ve({cli:t,logger:e,check:r,debug:n,filePatterns:i}){r&&e.log("Checking formatting...");let a=await Q(t,i),[o,s]=await Ae({cli:t,logger:e,check:r,debug:n,filePaths:a});if(r){if(o>0&&(e.warn(`Code style issues found in ${o} file(s).`),!s))return 1;s||e.log("All matched files use correct code style!")}return s?2:0}async function Ae({cli:t,logger:e,check:r,debug:n,filePaths:i}){let a=0,o=!1;for(let s of i)try{await Oe({cli:t,logger:e,check:r,debug:n,filePath:s})&&a++}catch(l){F(l)?e.error(l.getFileMessage(A(s))):e.error(`${A(s)}: ${T(l)}`),o=!0}return[a,o]}async function Oe({cli:t,logger:e,check:r,debug:n,filePath:i}){try{let a=await $(i),o=await L.readFile(i,"utf8"),s=await t.format(o,a,i,n);return s===o?!1:(e.log(A(i)),r||await L.writeFile(i,s,"utf8"),!0)}catch(a){if(w(a))return!1;throw a}}function A(t){return E(N.relative(f.cwd(),t))}async function Ce({cli:t,logger:e,stdin:r,check:n,debug:i}){let a=await Se({stdin:r}),s=`stdin.${t.getStdinFileEnding(a)}`,l=N.resolve(s),P=await $(l),g;try{g=await t.format(a,P,l,i)}catch(c){if(F(c))return e.error(c.getFileMessage("stdin")),2;throw c}return n?a!==g?(e.warn("Code style issues found in stdin."),1):0:(f.stdout.write(g),0)}var oe="scm";ie({binName:"tree-sitter-fmt",fileEndings:[oe],getStdinFileEnding(){return oe},format:async(t,e,r,n)=>{let i=await X(t,"tree-sitter-query");return D(i,e,n)}});
//# sourceMappingURL=treeSitterFormatter.js.map