From 5b9e2b89acfc994feec5fb64360fa0cdbfbd58b7 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 3 May 2026 10:43:21 +0200 Subject: [PATCH] Added for and if statements support to Talon formatter --- README.md | 4 +- dist/build.d.ts | 2 +- dist/lib.js | 4 +- dist/lib.js.map | 6 +- dist/libNode.js.map | 4 +- dist/node/cli.d.ts | 2 +- dist/snippet/index.d.ts | 8 +- dist/snippetFormatter.js | 18 +- dist/snippetFormatter.js.map | 8 +- dist/talonFormatter.js | 14 +- dist/talonFormatter.js.map | 8 +- dist/treeSitterFormatter.js | 18 +- dist/treeSitterFormatter.js.map | 8 +- dist/types.d.ts | 1 + dist/util/SyntaxError.d.ts | 2 +- package-lock.json | 402 +++++++++++------------ package.json | 12 +- src/node/FilePatternError.ts | 4 +- src/snippet/serializeSnippetFile.ts | 4 +- src/talon/talonFormatter.ts | 29 +- src/test/talonFixtures/For statement.txt | 5 + src/test/talonFixtures/If statement.txt | 5 + src/test/talonFormatter.test.ts | 6 +- src/treeSitterFormatter.ts | 4 +- src/util/SyntaxError.ts | 4 +- src/util/SyntaxTreeError.ts | 2 +- 26 files changed, 306 insertions(+), 278 deletions(-) create mode 100644 src/test/talonFixtures/For statement.txt create mode 100644 src/test/talonFixtures/If statement.txt diff --git a/README.md b/README.md index bea5207..853ba3d 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ foo bar baz: "foo bar baz" ```yaml repos: - repo: https://github.com/cursorless-dev/talon-tools - rev: v0.10.0 + rev: v0.11.0 hooks: - id: talon-fmt - id: snippet-fmt @@ -148,5 +148,3 @@ When creating a new release do the following: - Update version in [`package.json`](./package.json) - Update version in [`README.md`](./README.md#pre-commit) - Run build: `npm run build` -- Add new tag eg `git tag v1.2.0` -- Publish lib: `npm publish --access public` diff --git a/dist/build.d.ts b/dist/build.d.ts index a4b5d35..cb0ff5c 100644 --- a/dist/build.d.ts +++ b/dist/build.d.ts @@ -1 +1 @@ -export declare function build(): Promise; +export {}; diff --git a/dist/lib.js b/dist/lib.js index d9bfe57..51e21a9 100644 --- a/dist/lib.js +++ b/dist/lib.js @@ -1,4 +1,4 @@ -function T(n){let e=n.split(/^---$/m),t={snippets:[]};for(let i of e){let o=i.match(/^-$/m),r=o!=null?i.slice(0,o.index):i,s=o!=null?i.slice(o.index+o[0].length):null,a=s?D(s):null,c=k(r);if(a!=null){c==null&&(c={variables:[]});let{variables:u,...I}=c;t.snippets.push({...I,body:a,variables:u})}else if(c!=null){if(t.header!=null||t.snippets.length!==0)throw Error("Header snippet must be first in file");t.header=c}}return t}function k(n){let e={variables:[]},t=j(n);if(Object.keys(t).length===0)return;let i={};for(let[o,r]of Object.entries(t))switch(o){case"name":e.name=r;break;case"description":e.description=r;break;case"phrase":e.phrases=g(r);break;case"insertionScope":e.insertionScopes=g(r);break;case"language":e.languages=g(r);break;default:if(!o.startsWith("$"))throw Error(`Invalid key '${o}'`);i[o]=r}return e.variables=R(i),e}function j(n){let e=n.split(/\r?\n/).map(i=>i.trim()).filter(Boolean),t={};for(let i of e){let o=i.split(":");if(o.length!==2)throw Error(`Invalid line '${i}'`);let r=o[0].trim(),s=o[1].trim();if(r.length===0||s.length===0)throw Error(`Invalid line '${i}'`);if(t[r]!=null)throw Error(`Duplicate key '${r}' in '${n}'`);t[r]=s}return t}function R(n){let e={},t=i=>(e[i]==null&&(e[i]={name:i}),e[i]);for(let[i,o]of Object.entries(n)){let r=i.split(".");if(r.length!==2)throw Error(`Invalid variable key '${i}'`);let s=r[0].slice(1);switch(r[1]){case"insertionFormatter":t(s).insertionFormatters=g(o);break;case"wrapperPhrase":t(s).wrapperPhrases=g(o);break;case"wrapperScope":t(s).wrapperScope=o;break;default:throw Error(`Invalid variable key '${i}'`)}}return Object.values(e)}function D(n){let e=n.match(/^[ \t]*\S/m);if(e?.index!=null)return n.slice(e.index).trimEnd().split(/\r?\n/).map(t=>t.trimEnd())}function g(n){return n.split("|").map(e=>e.trim())}var S=[".git",".svn",".hg","node_modules","__pycache__"],P=S.map(n=>`**/${n}/**`);function l(n){return n==="crlf"?`\r +function $(n){let e=n.split(/^---$/m),t={snippets:[]};for(let i of e){let o=/^-$/m.exec(i),r=o!=null?i.slice(0,o.index):i,s=o!=null?i.slice(o.index+o[0].length):null,a=s!=null?D(s):null,l=k(r);if(a!=null){l??={variables:[]};let{variables:g,...I}=l;t.snippets.push({...I,body:a,variables:g})}else if(l!=null){if(t.header!=null||t.snippets.length>0)throw new Error("Header snippet must be first in file");t.header=l}}return t}function k(n){let e={variables:[]},t=j(n);if(Object.keys(t).length===0)return;let i={};for(let[o,r]of Object.entries(t))switch(o){case"name":e.name=r;break;case"description":e.description=r;break;case"phrase":e.phrases=u(r);break;case"insertionScope":e.insertionScopes=u(r);break;case"language":e.languages=u(r);break;default:if(!o.startsWith("$"))throw new Error(`Invalid key '${o}'`);i[o]=r}return e.variables=R(i),e}function j(n){let e=n.split(/\r?\n/).map(i=>i.trim()).filter(Boolean),t={};for(let i of e){let o=i.split(":");if(o.length!==2)throw new Error(`Invalid line '${i}'`);let r=o[0].trim(),s=o[1].trim();if(r.length===0||s.length===0)throw new Error(`Invalid line '${i}'`);if(t[r]!=null)throw new Error(`Duplicate key '${r}' in '${n}'`);t[r]=s}return t}function R(n){let e={},t=i=>(e[i]??={name:i},e[i]);for(let[i,o]of Object.entries(n)){let r=i.split(".");if(r.length!==2)throw new Error(`Invalid variable key '${i}'`);let s=r[0].slice(1);switch(r[1]){case"insertionFormatter":t(s).insertionFormatters=u(o);break;case"wrapperPhrase":t(s).wrapperPhrases=u(o);break;case"wrapperScope":t(s).wrapperScope=o;break;default:throw new Error(`Invalid variable key '${i}'`)}}return Object.values(e)}function D(n){let e=/^[ \t]*\S/m.exec(n);if(e?.index!=null)return n.slice(e.index).trimEnd().split(/\r?\n/).map(t=>t.trimEnd())}function u(n){return n.split("|").map(e=>e.trim())}var E=[".git",".svn",".hg","node_modules","__pycache__"],P=E.map(n=>`**/${n}/**`);function c(n){return n==="crlf"?`\r `:` -`}function E(n,e={}){let t=l(e.endOfLine);return new L(t,e.insertFinalNewline??!0).getText(n)}var L=class{constructor(e,t){this.eol=e;this.insertFinalNewline=t}getText(e){let i=[];e.header!=null&&i.push(this.getDocumentText(e.header)),i.push(...e.snippets.map(this.getDocumentText.bind(this)));let o=i.filter(r=>r.length>0).join(`${this.eol}---${this.eol}${this.eol}`);return o.length===0?"":this.insertFinalNewline?o+`${this.eol}---${this.eol}`:o+`${this.eol}---`}getDocumentText(e){let t=[p("name",e.name),p("description",e.description),p("language",e.languages),p("phrase",e.phrases),p("insertionScope",e.insertionScopes)].filter(Boolean);return e.variables.length>0&&(t.length>0&&t.push(""),t.push(...W(e.variables))),"body"in e&&t.push("-",...e.body),t.join(this.eol)}};function W(n){let e=n.slice();return e.sort(A),e.flatMap(t=>[p(`$${t.name}.insertionFormatter`,t.insertionFormatters),p(`$${t.name}.wrapperPhrase`,t.wrapperPhrases),p(`$${t.name}.wrapperScope`,t.wrapperScope)]).filter(t=>t.length>0)}function p(n,e){return e==null?"":Array.isArray(e)?`${n}: ${e.join(" | ")}`:`${n}: ${e}`}function A(n,e){return n.name==="0"?1:e.name==="0"?-1:n.name.localeCompare(e.name)}function re(n,e){let t=T(n);return E(t,e)}function f(n){return{debug(e){n&&console.warn(`[debug] ${e}`)}}}function m(n){let e=n.match(/# fmt: columnWidth=(\d+)/);if(e!=null)return parseInt(e[1],10)}function x(n,e){return n?" ":" ".repeat(e??4)}var y="Syntax error",N=class extends Error{constructor(t){let i=U(t);super(V(i));this.point=t;this.name="SyntaxError",this.location=i}location;getFileMessage(t){return this.location!=null?`${t}(${this.location}): ${y}`:`${t}: ${y}`}};function V(n){return n!=null?`${y} at ${n}.`:y}function U(n){return n!=null?`${n.row+1}:${n.column+1}`:void 0}var h=class extends N{constructor(e){super(w(e)?.startPosition),this.name="SyntaxTreeError"}};function w(n){if(n.isError||n.isMissing)return n;for(let e of n.children){if(!e.hasError)continue;let t=w(e);if(t!=null)return t}return null}function b(n){return n.length>0&&n[0]==="'"&&n[n.length-1]==="'"&&!n.includes('"')?`"${n.slice(1,-1).replaceAll("\\'","'")}"`:n}function M(n,e={},t=!1){if(n.hasError)throw new h(n);let i=m(n.text)??e.columnWidth,o=x(e.indentTabs,e.indentSize),r=l(e.endOfLine);return new $(o,r,e.maxLineLength??80,i,e.insertFinalNewline??!0,e.preserveMultiline??!1,t).getText(n)}var $=class{constructor(e,t,i,o,r,s,a){this.indent=e;this.eol=t;this.maxLineLength=i;this.columnWidth=o;this.insertFinalNewline=r;this.preserveMultiline=s;this.logger=f(a)}lines=[];lastRow=0;logger;getText(e){this.addNode(e);let t=this.lines.join(this.eol).trimEnd();return t.length===0?"":this.insertFinalNewline?t+this.eol:t}addNL(){this.lines[this.lines.length-1]!==""&&this.lines.push("")}addNode(e,t=!1){e.startPosition.row>this.lastRow+1&&this.addNL(),this.lastRow=e.endPosition.row,this.addNodeHelper(e,t),this.lastRow=e.endPosition.row}addNodeHelper(e,t=!1){switch(e.type){case"source_file":for(let i of e.children)this.addNode(i);break;case"matches":{if(e.children.length>1||!G(e)){for(let i of e.children)this.addNode(i);this.addNL()}break}case"declarations":for(let i of e.children)this.addNode(i);break;case"block":for(let i of e.children)this.addNode(i,!0);break;case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":this.addLeftRightNode(e,!1);break;case"settings_declaration":this.lines.length>0&&!this.lines[this.lines.length-1].startsWith("#")&&this.addNL(),this.addLeftRightNode(e,!0),this.addNL();break;case"comment":{let i=e.text.trimEnd(),o=t||e.startPosition.column>0?`${this.indent}${i}`:i;this.lines.push(o);break}default:{let i=this.getNodeText(e);this.lines.push(t?`${this.indent}${i}`:i)}}}getNodeText(e){switch(e.type){case"source_file":case"matches":case"declarations":case"block":case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":case"settings_declaration":case"comment":throw new Error(`Node type '${e.type}' should be handled in addNode, not getNodeText`);case"parenthesized_rule":return this.pairWithChildren(e,e.parent!=null&&v(e,e.parent));case"optional":return this.pairWithChildren(e);case"expression_statement":case"assignment_statement":case"seq":case"choice":return e.children.map(t=>this.getNodeText(t)).join(" ");case"rule":case"action":case"key_action":case"sleep_action":case"argument_list":case"key_binding":case"face_binding":case"gamepad_binding":case"parrot_binding":case"noise_binding":case"deck_binding":case"tag_import_declaration":case"match":return e.children.map(t=>this.getNodeText(t)).join("");case"string":return X(e);case"match_modifier":case":":case",":return`${e.text} `;case"implicit_string":return e.text.trim();case"tag_binding":case"settings_binding":case"capture":case"list":case"key(":case"sleep(":case"gamepad(":case"face(":case"parrot(":case"noise(":case"identifier":case"variable":case"word":case"binary_operator":case"integer":case"float":case"start_anchor":case"end_anchor":case"repeat":case"deck(":case"repeat1":case"(":case")":case"=":case"-":case"|":return e.text;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}pairWithChildren(e,t=!1){let{children:i}=e,o=i.slice(1,-1).map(a=>this.getNodeText(a)).join(" ");if(t)return o;let r=i[0].text,s=i[i.length-1].text;return`${r}${o}${s}`}addLeftRightNode(e,t){let[i,o,...r]=e.children,s=this.getNodeText(i);if(!t&&r.length===1&&(!this.preserveMultiline||z(i,r))){let a=r[0];if(a.children.length===1){let c=this.getNodeText(a.children[0]),u=this.columnWidth!=null?`${s}: `.padEnd(this.columnWidth):`${s}: `;if(u.length+c.length<=this.maxLineLength){this.lines.push(u+c);return}}}this.lines.push(`${s}:`);for(let a of r)this.addNode(a,!0)}};function z(n,e){return n.endPosition.row===e[e.length-1].startPosition.row}function v(n,e){return n.startPosition.row===e.startPosition.row&&n.startPosition.column===e.startPosition.column&&n.endPosition.row===e.endPosition.row&&n.endPosition.column===e.endPosition.column}function G(n){return n.id===n.parent?.children?.[0]?.id}function X(n){let e=b(n.text);return n.parent?.type==="expression_statement"&&n.parent.parent?.type==="block"&&v(n,n.parent)&&n.parent.parent.children.length>1?`insert(${e})`:e}function O(n){let e=n.split(/\r?\n/).map(s=>s.trim()),t=e.indexOf("-");if(t===-1)throw Error("Separator not found in talon list");let i=e.slice(0,t),o=B(e.slice(t+1)),r={headers:[],items:[]};for(let s of i){if(s.length===0)continue;if(s.startsWith("#")){r.headers.push({type:"comment",text:s});continue}let[a,c]=F(s);if(c==null)throw Error("Header value missing");r.headers.push({type:"header",key:a,value:c})}for(let s of o){if(s.length===0){r.items.push({type:"empty"});continue}if(s.startsWith("#")){r.items.push({type:"comment",text:s});continue}let[a,c]=F(s);r.items.push({type:"item",key:a,value:c})}return r}function F(n){let e=n.indexOf(":");return e===-1?[n,void 0]:[n.substring(0,e).trimEnd(),n.substring(e+1).trimStart()]}function B(n){let e=n.findIndex(i=>i.length>0);if(e<0)return[];let t=n.findLastIndex(i=>i.length>0);return n.slice(e,t+1)}function q(n,e={}){let t=m(n)??e.columnWidth,i=l(e.endOfLine),o=O(n);o.headers.sort((s,a)=>s.type==="header"&&s.key==="list"?-1:0);let r=[];for(let s of o.headers){if(s.type==="comment"){r.push(s.text);continue}r.push(`${s.key}: ${s.value}`)}r.push("-","");for(let s of o.items){if(s.type==="empty"){r.push("");continue}if(s.type==="comment"){r.push(s.text);continue}if(s.value!=null){let a=t!=null?`${s.key}: `.padEnd(t):`${s.key}: `,c=b(s.value);r.push(`${a}${c}`)}else r.push(s.key)}return r.length===0?"":((e.insertFinalNewline??!0)&&r.push(""),r.join(i))}function Q(n,e={},t=!1){if(n.hasError)throw new h(n);let i=x(e.indentTabs,e.indentSize),o=l(e.endOfLine);return new _(i,o,e.insertFinalNewline??!0,t).getText(n)}var _=class{constructor(e,t,i,o){this.indentation=e;this.eol=t;this.insertFinalNewline=i;this.logger=f(o)}lastRow=0;logger;getText(e){let t=this.getNodeText(e,0);return t.length===0?"":this.insertFinalNewline?t+this.eol:t}getNodeText(e,t){let i=e.startPosition.row>this.lastRow+1?this.eol:"";this.lastRow=e.endPosition.row;let o=this.getNodeTextInternal(e,t);return this.lastRow=e.endPosition.row,`${i}${o}`}getNamedNodeText(e,t){let i=e.children.findIndex(a=>a.type===")"),o=e.children.slice(0,2).map(a=>a.text).join(""),r=e.children.slice(i).map(a=>this.getNodeText(a,0)).join(""),s=e.children.slice(2,i).map(a=>this.getNodeText(a,t+1));return s.length===0?`${this.getIndent(t)}${o}${r}`:[`${this.getIndent(t)}${o}`,...s,`${this.getIndent(t)}${r}`].join(this.eol)}getListText(e,t){let i=e.children.findIndex(a=>a.type==="]"),o=e.children[0].text,r=e.children.slice(i).map(a=>a.text).join(" ");return[`${this.getIndent(t)}${o}`,...e.children.slice(1,i).map(a=>this.getNodeText(a,t+1)),`${this.getIndent(t)}${r}`].join(this.eol)}getPredicateText(e,t){let i=e.children[0].text,o=e.children[e.children.length-1].text,r=[e.children.slice(1,4).map(s=>s.text).join(""),...e.children[e.children.length-2].children.map(s=>s.text)];if(e.startPosition.row===e.endPosition.row){let s=`${i}${r.join(" ")}${o}`;return`${this.getIndent(t)}${s}`}return[`${this.getIndent(t)}${i}${r[0]}`,...r.slice(1).map(s=>`${this.getIndent(t+1)}${s}`),`${this.getIndent(t)}${o}`].join(this.eol)}getFieldDefinitionText(e,t){return t===0?["(_",this.getFieldDefinitionText(e,1),")"].join(this.eol):[this.getIndent(t),e.children[0].text,e.children[1].text," ",this.getNodeText(e.children[2],t).trimStart()].join("")}getNodeTextInternal(e,t){switch(e.type){case"program":return this.joinLines(e.children,0);case"grouping":return this.joinLines(e.children,t+1);case"list":return this.getListText(e,t);case"named_node":return this.getNamedNodeText(e,t);case"predicate":return this.getPredicateText(e,t);case"field_definition":return this.getFieldDefinitionText(e,t);case"anonymous_node":return this.getIndent(t)+e.children.map(i=>this.getNodeText(i,t+1)).join("");case"comment":return`${this.getIndent(t)}${e.text.trimEnd()}`;case".":case"negated_field":return`${this.getIndent(t)}${e.text}`;case"(":case")":return`${this.getIndent(t-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(o=>o.text).join(" ")}`;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}joinLines(e,t){if(e.length===0)return"";let i=e[e.length-1].type==="quantifier",r=(i?e.slice(0,-1):e).map(s=>this.getNodeText(s,t)).join(this.eol);return i?`${r}${e[e.length-1].text}`:r}getIndent(e){return e<1?"":new Array(e).fill(this.indentation).join("")}};export{P as GLOB_IGNORE_PATTERNS,S as IGNORE_FOLDERS,T as parseSnippetFile,E as serializeSnippetFile,re as snippetFormatter,M as talonFormatter,q as talonListFormatter,Q as treeSitterFormatter}; +`}function _(n,e={}){let t=c(e.endOfLine);return new L(t,e.insertFinalNewline??!0).getText(n)}var L=class{constructor(e,t){this.eol=e;this.insertFinalNewline=t}eol;insertFinalNewline;getText(e){let i=[];e.header!=null&&i.push(this.getDocumentText(e.header)),i.push(...e.snippets.map(this.getDocumentText.bind(this)));let o=i.filter(r=>r.length>0).join(`${this.eol}---${this.eol}${this.eol}`);return o.length===0?"":this.insertFinalNewline?`${o}${this.eol}---${this.eol}`:`${o}${this.eol}---`}getDocumentText(e){let t=[p("name",e.name),p("description",e.description),p("language",e.languages),p("phrase",e.phrases),p("insertionScope",e.insertionScopes)].filter(Boolean);return e.variables.length>0&&(t.length>0&&t.push(""),t.push(...W(e.variables))),"body"in e&&t.push("-",...e.body),t.join(this.eol)}};function W(n){let e=n.slice();return e.sort(A),e.flatMap(t=>[p(`$${t.name}.insertionFormatter`,t.insertionFormatters),p(`$${t.name}.wrapperPhrase`,t.wrapperPhrases),p(`$${t.name}.wrapperScope`,t.wrapperScope)]).filter(t=>t.length>0)}function p(n,e){return e==null?"":Array.isArray(e)?`${n}: ${e.join(" | ")}`:`${n}: ${e}`}function A(n,e){return n.name==="0"?1:e.name==="0"?-1:n.name.localeCompare(e.name)}function C(n,e){let t=$(n);return _(t,e)}function f(n){return{debug(e){n&&console.warn(`[debug] ${e}`)}}}function m(n){let e=/# fmt: columnWidth=(\d+)/.exec(n);if(e!=null)return Number.parseInt(e[1],10)}function x(n,e){return n?" ":" ".repeat(e??4)}var y="Syntax error",N=class extends Error{constructor(t){let i=U(t);super(M(i));this.point=t;this.name="SyntaxError",this.location=i}point;location;getFileMessage(t){return this.location!=null?`${t}(${this.location}): ${y}`:`${t}: ${y}`}};function M(n){return n!=null?`${y} at ${n}.`:y}function U(n){return n!=null?`${n.row+1}:${n.column+1}`:void 0}var h=class extends N{constructor(e){super(w(e)?.startPosition),this.name="SyntaxTreeError"}};function w(n){if(n.isError||n.isMissing)return n;for(let e of n.children){if(!e.hasError)continue;let t=w(e);if(t!=null)return t}return null}function b(n){return n.length>0&&n.startsWith("'")&&n.endsWith("'")&&!n.includes('"')?`"${n.slice(1,-1).replaceAll(String.raw`\'`,"'")}"`:n}function z(n,e={},t=!1){if(n.hasError)throw new h(n);let i=m(n.text)??e.columnWidth,o=x(e.indentTabs,e.indentSize),r=c(e.endOfLine);return new S(o,r,e.maxLineLength??80,i,e.insertFinalNewline??!0,e.preserveMultiline??!1,t).getText(n)}var S=class{constructor(e,t,i,o,r,s,a){this.indent=e;this.eol=t;this.maxLineLength=i;this.columnWidth=o;this.insertFinalNewline=r;this.preserveMultiline=s;this.logger=f(a)}indent;eol;maxLineLength;columnWidth;insertFinalNewline;preserveMultiline;lines=[];lastRow=0;logger;getText(e){this.addNode(e);let t=this.lines.join(this.eol).trimEnd();return t.length===0?"":this.insertFinalNewline?t+this.eol:t}addNL(){this.lines[this.lines.length-1]!==""&&this.lines.push("")}addNode(e,t=!1){e.startPosition.row>this.lastRow+1&&this.addNL(),this.lastRow=e.endPosition.row,this.addNodeHelper(e,t),this.lastRow=e.endPosition.row}addNodeHelper(e,t=!1){switch(e.type){case"source_file":for(let i of e.children)this.addNode(i);break;case"matches":{if(e.children.length>1||!B(e)){for(let i of e.children)this.addNode(i);this.addNL()}break}case"declarations":for(let i of e.children)this.addNode(i);break;case"block":for(let i of e.children)this.addNode(i,!0);break;case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":this.addLeftRightNode(e,!1);break;case"settings_declaration":this.lines.length>0&&!this.lines[this.lines.length-1].startsWith("#")&&this.addNL(),this.addLeftRightNode(e,!0),this.addNL();break;case"comment":{let i=e.text.trimEnd(),o=t||e.startPosition.column>0?`${this.indent}${i}`:i;this.lines.push(o);break}default:{let i=this.getNodeText(e);this.lines.push(t?`${this.indent}${i}`:i)}}}getNodeText(e){switch(e.type){case"source_file":case"matches":case"declarations":case"block":case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":case"settings_declaration":case"comment":throw new Error(`Node type '${e.type}' should be handled in addNode, not getNodeText`);case"parenthesized_rule":return this.pairWithChildren(e,e.parent!=null&&F(e,e.parent));case"optional":return this.pairWithChildren(e);case"expression_statement":case"assignment_statement":case"seq":case"choice":return e.children.map(t=>this.getNodeText(t)).join(" ");case"rule":case"action":case"key_action":case"sleep_action":case"argument_list":case"key_binding":case"face_binding":case"gamepad_binding":case"parrot_binding":case"noise_binding":case"deck_binding":case"tag_import_declaration":case"match":case"for_statement":case"if_statement":return e.children.map(t=>this.getNodeText(t)).join("");case"string":return q(e);case"match_modifier":case"for":case"if":case":":case",":return`${e.text} `;case"in":return` ${e.text} `;case"implicit_string":return e.text.trim();case"tag_binding":case"settings_binding":case"capture":case"list":case"key(":case"sleep(":case"gamepad(":case"face(":case"parrot(":case"noise(":case"identifier":case"variable":case"word":case"binary_operator":case"integer":case"float":case"start_anchor":case"end_anchor":case"repeat":case"deck(":case"repeat1":case"(":case")":case"=":case"-":case"|":return e.text;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}pairWithChildren(e,t=!1){let{children:i}=e,o=i.slice(1,-1).map(a=>this.getNodeText(a)).join(" ");if(t)return o;let r=i[0].text,s=i[i.length-1].text;return`${r}${o}${s}`}addLeftRightNode(e,t){let[i,o,...r]=e.children,s=this.getNodeText(i);if(!t&&r.length===1&&(!this.preserveMultiline||X(i,r))){let a=r[0];if(a.children.length===1&&!G(a.children[0])){let l=this.getNodeText(a.children[0]),g=this.columnWidth!=null?`${s}: `.padEnd(this.columnWidth):`${s}: `;if(g.length+l.length<=this.maxLineLength){this.lines.push(g+l);return}}}this.lines.push(`${s}:`);for(let a of r)this.addNode(a,!0)}};function G(n){switch(n.type){case"if_statement":case"for_statement":return!0;default:return!1}}function X(n,e){return n.endPosition.row===e[e.length-1].startPosition.row}function F(n,e){return n.startPosition.row===e.startPosition.row&&n.startPosition.column===e.startPosition.column&&n.endPosition.row===e.endPosition.row&&n.endPosition.column===e.endPosition.column}function B(n){return n.id===n.parent?.children[0].id}function q(n){let e=b(n.text);return n.parent?.type==="expression_statement"&&n.parent.parent?.type==="block"&&F(n,n.parent)&&n.parent.parent.children.length>1?`insert(${e})`:e}function O(n){let e=n.split(/\r?\n/).map(s=>s.trim()),t=e.indexOf("-");if(t===-1)throw new Error("Separator not found in talon list");let i=e.slice(0,t),o=Q(e.slice(t+1)),r={headers:[],items:[]};for(let s of i){if(s.length===0)continue;if(s.startsWith("#")){r.headers.push({type:"comment",text:s});continue}let[a,l]=v(s);if(l==null)throw new Error("Header value missing");r.headers.push({type:"header",key:a,value:l})}for(let s of o){if(s.length===0){r.items.push({type:"empty"});continue}if(s.startsWith("#")){r.items.push({type:"comment",text:s});continue}let[a,l]=v(s);r.items.push({type:"item",key:a,value:l})}return r}function v(n){let e=n.indexOf(":");return e===-1?[n,void 0]:[n.slice(0,e).trimEnd(),n.slice(e+1).trimStart()]}function Q(n){let e=n.findIndex(i=>i.length>0);if(e===-1)return[];let t=n.findLastIndex(i=>i.length>0);return n.slice(e,t+1)}function K(n,e={}){let t=m(n)??e.columnWidth,i=c(e.endOfLine),o=O(n);o.headers.sort((s,a)=>s.type==="header"&&s.key==="list"?-1:0);let r=[];for(let s of o.headers){if(s.type==="comment"){r.push(s.text);continue}r.push(`${s.key}: ${s.value}`)}r.push("-","");for(let s of o.items){if(s.type==="empty"){r.push("");continue}if(s.type==="comment"){r.push(s.text);continue}if(s.value!=null){let a=t!=null?`${s.key}: `.padEnd(t):`${s.key}: `,l=b(s.value);r.push(`${a}${l}`)}else r.push(s.key)}return r.length===0?"":((e.insertFinalNewline??!0)&&r.push(""),r.join(i))}function J(n,e={},t=!1){if(n.hasError)throw new h(n);let i=x(e.indentTabs,e.indentSize),o=c(e.endOfLine);return new T(i,o,e.insertFinalNewline??!0,t).getText(n)}var T=class{constructor(e,t,i,o){this.indentation=e;this.eol=t;this.insertFinalNewline=i;this.logger=f(o)}indentation;eol;insertFinalNewline;lastRow=0;logger;getText(e){let t=this.getNodeText(e,0);return t.length===0?"":this.insertFinalNewline?t+this.eol:t}getNodeText(e,t){let i=e.startPosition.row>this.lastRow+1?this.eol:"";this.lastRow=e.endPosition.row;let o=this.getNodeTextInternal(e,t);return this.lastRow=e.endPosition.row,`${i}${o}`}getNamedNodeText(e,t){let i=e.children.findIndex(a=>a.type===")"),o=e.children.slice(0,2).map(a=>a.text).join(""),r=e.children.slice(i).map(a=>this.getNodeText(a,0)).join(""),s=e.children.slice(2,i).map(a=>this.getNodeText(a,t+1));return s.length===0?`${this.getIndent(t)}${o}${r}`:[`${this.getIndent(t)}${o}`,...s,`${this.getIndent(t)}${r}`].join(this.eol)}getListText(e,t){let i=e.children.findIndex(a=>a.type==="]"),o=e.children[0].text,r=e.children.slice(i).map(a=>a.text).join(" ");return[`${this.getIndent(t)}${o}`,...e.children.slice(1,i).map(a=>this.getNodeText(a,t+1)),`${this.getIndent(t)}${r}`].join(this.eol)}getPredicateText(e,t){let i=e.children[0].text,o=e.children[e.children.length-1].text,r=[e.children.slice(1,4).map(s=>s.text).join(""),...e.children[e.children.length-2].children.map(s=>s.text)];if(e.startPosition.row===e.endPosition.row){let s=`${i}${r.join(" ")}${o}`;return`${this.getIndent(t)}${s}`}return[`${this.getIndent(t)}${i}${r[0]}`,...r.slice(1).map(s=>`${this.getIndent(t+1)}${s}`),`${this.getIndent(t)}${o}`].join(this.eol)}getFieldDefinitionText(e,t){return t===0?["(_",this.getFieldDefinitionText(e,1),")"].join(this.eol):[this.getIndent(t),e.children[0].text,e.children[1].text," ",this.getNodeText(e.children[2],t).trimStart()].join("")}getNodeTextInternal(e,t){switch(e.type){case"program":return this.joinLines(e.children,0);case"grouping":return this.joinLines(e.children,t+1);case"list":return this.getListText(e,t);case"named_node":return this.getNamedNodeText(e,t);case"predicate":return this.getPredicateText(e,t);case"field_definition":return this.getFieldDefinitionText(e,t);case"anonymous_node":return this.getIndent(t)+e.children.map(i=>this.getNodeText(i,t+1)).join("");case"comment":return`${this.getIndent(t)}${e.text.trimEnd()}`;case".":case"negated_field":return`${this.getIndent(t)}${e.text}`;case"(":case")":return`${this.getIndent(t-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(o=>o.text).join(" ")}`;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}joinLines(e,t){if(e.length===0)return"";let i=e[e.length-1].type==="quantifier",r=(i?e.slice(0,-1):e).map(s=>this.getNodeText(s,t)).join(this.eol);return i?`${r}${e[e.length-1].text}`:r}getIndent(e){return e<1?"":Array.from({length:e},()=>this.indentation).join("")}};export{P as GLOB_IGNORE_PATTERNS,E as IGNORE_FOLDERS,$ as parseSnippetFile,_ as serializeSnippetFile,C as snippetFormatter,z as talonFormatter,K as talonListFormatter,J as treeSitterFormatter}; //# sourceMappingURL=lib.js.map diff --git a/dist/lib.js.map b/dist/lib.js.map index 48b29a0..0791e96 100644 --- a/dist/lib.js.map +++ b/dist/lib.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/snippet/parseSnippetFile.ts", "../src/util/constants.ts", "../src/util/getEndOfLine.ts", "../src/snippet/serializeSnippetFile.ts", "../src/snippet/snippetFormatter.ts", "../src/util/createDebugLogger.ts", "../src/util/getColumnWidth.ts", "../src/util/getIndentation.ts", "../src/util/SyntaxError.ts", "../src/util/SyntaxTreeError.ts", "../src/talon/convertQuotes.ts", "../src/talon/talonFormatter.ts", "../src/talon/parseTalonList.ts", "../src/talon/talonListFormatter.ts", "../src/treeSitterFormatter.ts"], - "sourcesContent": ["import type { Snippet, SnippetFile, SnippetVariable } from \"./snippetTypes.js\";\n\nexport function parseSnippetFile(content: string): SnippetFile {\n const documentContents = content.split(/^---$/m);\n const file: SnippetFile = { snippets: [] };\n\n for (const text of documentContents) {\n const match = text.match(/^-$/m);\n const contextText = match != null ? text.slice(0, match.index) : text;\n const bodyText =\n match != null ? text.slice(match.index! + match[0].length) : null;\n const body = bodyText ? parseBody(bodyText) : null;\n let context = parseContext(contextText);\n\n // Snippet with body\n if (body != null) {\n if (context == null) {\n context = { variables: [] };\n }\n const { variables, ...rest } = context;\n file.snippets.push({ ...rest, body, variables });\n }\n // Header without body\n else if (context != null) {\n if (file.header != null || file.snippets.length !== 0) {\n throw Error(\"Header snippet must be first in file\");\n }\n file.header = context;\n }\n }\n\n return file;\n}\n\ntype Context = Omit;\n\nfunction parseContext(text: string): Context | undefined {\n const document: Context = { variables: [] };\n const pairs = parseContextPairs(text);\n\n if (Object.keys(pairs).length === 0) {\n return undefined;\n }\n\n const variables: Record = {};\n\n for (const [key, value] of Object.entries(pairs)) {\n switch (key) {\n case \"name\":\n document.name = value;\n break;\n case \"description\":\n document.description = value;\n break;\n case \"phrase\":\n document.phrases = parseVectorValue(value);\n break;\n case \"insertionScope\":\n document.insertionScopes = parseVectorValue(value);\n break;\n case \"language\":\n document.languages = parseVectorValue(value);\n break;\n default:\n if (!key.startsWith(\"$\")) {\n throw Error(`Invalid key '${key}'`);\n }\n variables[key] = value;\n }\n }\n\n document.variables = parseVariables(variables);\n\n return document;\n}\n\nfunction parseContextPairs(text: string): Record {\n const lines = text\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const pairs: Record = {};\n\n for (const line of lines) {\n const parts = line.split(\":\");\n if (parts.length !== 2) {\n throw Error(`Invalid line '${line}'`);\n }\n const key = parts[0].trim();\n const value = parts[1].trim();\n if (key.length === 0 || value.length === 0) {\n throw Error(`Invalid line '${line}'`);\n }\n if (pairs[key] != null) {\n throw Error(`Duplicate key '${key}' in '${text}'`);\n }\n pairs[key] = value;\n }\n\n return pairs;\n}\n\nfunction parseVariables(variables: Record): SnippetVariable[] {\n const variablesMap: Record = {};\n\n const getVariable = (name: string): SnippetVariable => {\n if (variablesMap[name] == null) {\n variablesMap[name] = { name };\n }\n return variablesMap[name];\n };\n\n for (const [key, value] of Object.entries(variables)) {\n const parts = key.split(\".\");\n if (parts.length !== 2) {\n throw Error(`Invalid variable key '${key}'`);\n }\n const name = parts[0].slice(1);\n const field = parts[1];\n switch (field) {\n case \"insertionFormatter\":\n getVariable(name).insertionFormatters = parseVectorValue(value);\n break;\n case \"wrapperPhrase\":\n getVariable(name).wrapperPhrases = parseVectorValue(value);\n break;\n case \"wrapperScope\":\n getVariable(name).wrapperScope = value;\n break;\n default:\n throw Error(`Invalid variable key '${key}'`);\n }\n }\n\n return Object.values(variablesMap);\n}\n\nfunction parseBody(text: string): string[] | undefined {\n // Find first line that is not empty. Preserve indentation.\n const matchLeading = text.match(/^[ \\t]*\\S/m);\n if (matchLeading?.index == null) {\n return undefined;\n }\n return text\n .slice(matchLeading.index)\n .trimEnd()\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd());\n}\n\nfunction parseVectorValue(value: string): string[] {\n return value.split(\"|\").map((v) => v.trim());\n}\n", "// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport type {\n Snippet,\n SnippetFile,\n SnippetHeader,\n SnippetVariable,\n} from \"./snippetTypes.js\";\n\nexport type Options = FormatterOptions<\"endOfLine\" | \"insertFinalNewline\">;\n\nexport function serializeSnippetFile(\n snippetFile: SnippetFile,\n options: Options = {},\n): string {\n const eol = getEndOfLine(options.endOfLine);\n const serializer = new SnippetSerializer(\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n );\n return serializer.getText(snippetFile);\n}\n\nclass SnippetSerializer {\n constructor(\n private eol: string,\n private insertFinalNewline: boolean,\n ) {}\n\n getText(snippetFile: SnippetFile): string {\n const docDelimiter = \"---\";\n const documents: string[] = [];\n\n if (snippetFile.header != null) {\n documents.push(this.getDocumentText(snippetFile.header));\n }\n\n documents.push(\n ...snippetFile.snippets.map(this.getDocumentText.bind(this)),\n );\n\n const result = documents\n .filter((d) => d.length > 0)\n .join(`${this.eol}${docDelimiter}${this.eol}${this.eol}`);\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return result + `${this.eol}${docDelimiter}${this.eol}`;\n }\n\n return result + `${this.eol}${docDelimiter}`;\n }\n\n private getDocumentText(document: SnippetHeader | Snippet): string {\n const lines: string[] = [\n getOptionalPairString(\"name\", document.name),\n getOptionalPairString(\"description\", document.description),\n getOptionalPairString(\"language\", document.languages),\n getOptionalPairString(\"phrase\", document.phrases),\n getOptionalPairString(\"insertionScope\", document.insertionScopes),\n ].filter(Boolean);\n\n if (document.variables.length > 0) {\n if (lines.length > 0) {\n lines.push(\"\");\n }\n lines.push(...getSortedVariables(document.variables));\n }\n\n if (\"body\" in document) {\n lines.push(\"-\", ...document.body);\n }\n\n return lines.join(this.eol);\n }\n}\n\nfunction getSortedVariables(variables: SnippetVariable[]): string[] {\n const result = variables.slice();\n result.sort(compareVariables);\n return result\n .flatMap((variable) => [\n getOptionalPairString(\n `$${variable.name}.insertionFormatter`,\n variable.insertionFormatters,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperPhrase`,\n variable.wrapperPhrases,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperScope`,\n variable.wrapperScope,\n ),\n ])\n .filter((v) => v.length > 0);\n}\n\nfunction getOptionalPairString(\n key: string,\n value: string | string[] | undefined,\n): string {\n if (value == null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return `${key}: ${value.join(\" | \")}`;\n }\n return `${key}: ${value}`;\n}\n\nfunction compareVariables(a: SnippetVariable, b: SnippetVariable): number {\n if (a.name === \"0\") {\n return 1;\n }\n if (b.name === \"0\") {\n return -1;\n }\n return a.name.localeCompare(b.name);\n}\n", "import { parseSnippetFile } from \"./parseSnippetFile.js\";\nimport { serializeSnippetFile } from \"./serializeSnippetFile.js\";\nimport type { Options } from \"./serializeSnippetFile.js\";\n\nexport function snippetFormatter(text: string, options?: Options): string {\n const snippetFile = parseSnippetFile(text);\n return serializeSnippetFile(snippetFile, options);\n}\n", "import type { DebugLogger } from \"../types.js\";\n\nexport function createDebugLogger(debug: boolean): DebugLogger {\n return {\n debug(message: string) {\n if (debug) {\n console.warn(`[debug] ${message}`);\n }\n },\n };\n}\n", "export function getColumnWidth(text: string): number | undefined {\n const match = text.match(/# fmt: columnWidth=(\\d+)/);\n\n if (match != null) {\n return parseInt(match[1], 10);\n }\n\n return undefined;\n}\n", "import { DEFAULT_INDENT_WIDTH } from \"./constants.js\";\n\nexport function getIndentation(\n indentTabs: boolean | undefined,\n indentSize: number | undefined,\n): string {\n return indentTabs ? \"\\t\" : \" \".repeat(indentSize ?? DEFAULT_INDENT_WIDTH);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n constructor(private point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import type { SyntaxNode } from \"../types.js\";\nimport { SyntaxError } from \"./SyntaxError.js\";\n\nexport class SyntaxTreeError extends SyntaxError {\n constructor(rootNode: SyntaxNode) {\n super(findFirstProblemNode(rootNode)?.startPosition);\n this.name = \"SyntaxTreeError\";\n }\n}\n\nfunction findFirstProblemNode(node: SyntaxNode): SyntaxNode | null {\n if (node.isError || node.isMissing) {\n return node;\n }\n for (const child of node.children) {\n if (!child.hasError) {\n continue;\n }\n const errorNode = findFirstProblemNode(child);\n if (errorNode != null) {\n return errorNode;\n }\n }\n return null;\n}\n", "export function convertQuotes(text: string): string {\n // Convert single quotes to double quotes\n if (\n text.length > 0 &&\n text[0] === \"'\" &&\n text[text.length - 1] === \"'\" &&\n !text.includes('\"')\n ) {\n const innerText = text.slice(1, -1).replaceAll(\"\\\\'\", \"'\");\n return `\"${innerText}\"`;\n }\n\n return text;\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"../types.js\";\nimport {\n DEFAULT_INSERT_FINAL_NEWLINE,\n DEFAULT_MAX_LINE_LENGTH,\n} from \"../util/constants.js\";\nimport { createDebugLogger } from \"../util/createDebugLogger.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { getIndentation } from \"../util/getIndentation.js\";\nimport { SyntaxTreeError } from \"../util/SyntaxTreeError.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\n\nexport type Options = FormatterOptions<\n | \"endOfLine\"\n | \"indentTabs\"\n | \"indentSize\"\n | \"maxLineLength\"\n | \"columnWidth\"\n | \"insertFinalNewline\"\n | \"preserveMultiline\"\n>;\n\nexport function talonFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug: boolean = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const columnWidth = getColumnWidth(node.text) ?? options.columnWidth;\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TalonFormatter(\n indentation,\n eol,\n options.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH,\n columnWidth,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n options.preserveMultiline ?? false,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TalonFormatter {\n private lines: string[] = [];\n private lastRow = 0;\n private logger: DebugLogger;\n\n constructor(\n private indent: string,\n private eol: string,\n private maxLineLength: number,\n private columnWidth: number | undefined,\n private insertFinalNewline: boolean,\n private preserveMultiline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n getText(node: SyntaxNode): string {\n this.addNode(node);\n\n const result = this.lines.join(this.eol).trimEnd();\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return result + this.eol;\n }\n\n return result;\n }\n\n private addNL(): void {\n if (this.lines[this.lines.length - 1] !== \"\") {\n this.lines.push(\"\");\n }\n }\n\n private addNode(node: SyntaxNode, isIndented = false): void {\n if (node.startPosition.row > this.lastRow + 1) {\n this.addNL();\n }\n this.lastRow = node.endPosition.row;\n this.addNodeHelper(node, isIndented);\n this.lastRow = node.endPosition.row;\n }\n\n private addNodeHelper(node: SyntaxNode, isIndented = false): void {\n switch (node.type) {\n case \"source_file\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"matches\": {\n // There are match nodes or there is a comment before\n if (node.children.length > 1 || !isFirstChild(node)) {\n for (const n of node.children) {\n this.addNode(n);\n }\n this.addNL();\n }\n break;\n }\n\n case \"declarations\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"block\":\n for (const n of node.children) {\n this.addNode(n, true);\n }\n break;\n\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n this.addLeftRightNode(node, false);\n break;\n\n case \"settings_declaration\":\n if (\n this.lines.length > 0 &&\n !this.lines[this.lines.length - 1].startsWith(\"#\")\n ) {\n this.addNL();\n }\n this.addLeftRightNode(node, true);\n this.addNL();\n break;\n\n case \"comment\": {\n // When using crlf eol comments have a trailing `\\r`\n const text = node.text.trimEnd();\n const nodeText =\n isIndented || node.startPosition.column > 0\n ? `${this.indent}${text}`\n : text;\n this.lines.push(nodeText);\n break;\n }\n\n default: {\n const nodeText = this.getNodeText(node);\n this.lines.push(\n isIndented ? `${this.indent}${nodeText}` : nodeText,\n );\n }\n }\n }\n\n private getNodeText(node: SyntaxNode): string {\n switch (node.type) {\n case \"source_file\":\n case \"matches\":\n case \"declarations\":\n case \"block\":\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n case \"settings_declaration\":\n case \"comment\":\n throw new Error(\n `Node type '${node.type}' should be handled in addNode, not getNodeText`,\n );\n\n case \"parenthesized_rule\":\n return this.pairWithChildren(\n node,\n node.parent != null && rangeEqual(node, node.parent),\n );\n\n case \"optional\":\n return this.pairWithChildren(node);\n\n case \"expression_statement\":\n case \"assignment_statement\":\n case \"seq\":\n case \"choice\":\n return node.children.map((n) => this.getNodeText(n)).join(\" \");\n\n case \"rule\":\n case \"action\":\n case \"key_action\":\n case \"sleep_action\":\n case \"argument_list\":\n case \"key_binding\":\n case \"face_binding\":\n case \"gamepad_binding\":\n case \"parrot_binding\":\n case \"noise_binding\":\n case \"deck_binding\":\n case \"tag_import_declaration\":\n case \"match\":\n return node.children.map((n) => this.getNodeText(n)).join(\"\");\n\n case \"string\":\n return formatString(node);\n\n case \"match_modifier\":\n case \":\":\n case \",\":\n return `${node.text} `;\n\n case \"implicit_string\":\n return node.text.trim();\n\n case \"tag_binding\":\n case \"settings_binding\":\n case \"capture\":\n case \"list\":\n case \"key(\":\n case \"sleep(\":\n case \"gamepad(\":\n case \"face(\":\n case \"parrot(\":\n case \"noise(\":\n case \"identifier\":\n case \"variable\":\n case \"word\":\n case \"binary_operator\":\n case \"integer\":\n case \"float\":\n case \"start_anchor\":\n case \"end_anchor\":\n case \"repeat\":\n case \"deck(\":\n case \"repeat1\":\n case \"(\":\n case \")\":\n case \"=\":\n case \"-\":\n case \"|\":\n return node.text;\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private pairWithChildren(\n node: SyntaxNode,\n unwrap: boolean = false,\n ): string {\n const { children } = node;\n const middle = children\n .slice(1, -1)\n .map((n) => this.getNodeText(n))\n .join(\" \");\n if (unwrap) {\n return middle;\n }\n const pre = children[0].text;\n const post = children[children.length - 1].text;\n return `${pre}${middle}${post}`;\n }\n\n private addLeftRightNode(node: SyntaxNode, forceMultiline: boolean): void {\n const [leftNode, _colonNode, ...rightNodes] = node.children;\n const left = this.getNodeText(leftNode);\n\n if (!forceMultiline && rightNodes.length === 1) {\n if (\n !this.preserveMultiline ||\n isLeftRightSingleLine(leftNode, rightNodes)\n ) {\n const rightNode = rightNodes[0];\n if (rightNode.children.length === 1) {\n const right = this.getNodeText(rightNode.children[0]);\n const leftWithPadding =\n this.columnWidth != null\n ? `${left}: `.padEnd(this.columnWidth)\n : `${left}: `;\n if (\n leftWithPadding.length + right.length <=\n this.maxLineLength\n ) {\n this.lines.push(leftWithPadding + right);\n return;\n }\n }\n }\n }\n\n this.lines.push(`${left}:`);\n\n for (const n of rightNodes) {\n this.addNode(n, true);\n }\n }\n}\n\nfunction isLeftRightSingleLine(\n left: SyntaxNode,\n rights: SyntaxNode[],\n): boolean {\n return left.endPosition.row === rights[rights.length - 1].startPosition.row;\n}\n\nfunction rangeEqual(a: SyntaxNode, b: SyntaxNode): boolean {\n return (\n a.startPosition.row === b.startPosition.row &&\n a.startPosition.column === b.startPosition.column &&\n a.endPosition.row === b.endPosition.row &&\n a.endPosition.column === b.endPosition.column\n );\n}\n\nfunction isFirstChild(node: SyntaxNode): boolean {\n return node.id === node.parent?.children?.[0]?.id;\n}\n\nfunction formatString(node: SyntaxNode): string {\n // Convert single quotes to double quotes\n const text = convertQuotes(node.text);\n\n // A single string literal is allowed as syntactic sugar for the insert\n // action, but not in combination with other sibling statements.\n if (\n node.parent?.type === \"expression_statement\" &&\n node.parent.parent?.type === \"block\" &&\n rangeEqual(node, node.parent) &&\n node.parent.parent.children.length > 1\n ) {\n return `insert(${text})`;\n }\n\n return text;\n}\n", "interface TalonListHeader {\n type: \"header\";\n key: string;\n value: string;\n}\n\ninterface TalonListItem {\n type: \"item\";\n key: string;\n value?: string;\n}\n\ninterface EmptyLine {\n type: \"empty\";\n}\n\ninterface CommentLine {\n type: \"comment\";\n text: string;\n}\n\nexport interface TalonList {\n headers: (TalonListHeader | CommentLine)[];\n items: (TalonListItem | CommentLine | EmptyLine)[];\n}\n\nexport function parseTalonList(text: string): TalonList {\n const lines = text.split(/\\r?\\n/).map((l) => l.trim());\n const separatorIndex = lines.indexOf(\"-\");\n\n if (separatorIndex === -1) {\n throw Error(\"Separator not found in talon list\");\n }\n\n const headerLines = lines.slice(0, separatorIndex);\n const bodyLines = trim(lines.slice(separatorIndex + 1));\n\n const result: TalonList = {\n headers: [],\n items: [],\n };\n\n for (const line of headerLines) {\n if (line.length === 0) {\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.headers.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n if (value == null) {\n throw Error(\"Header value missing\");\n }\n result.headers.push({ type: \"header\", key, value });\n }\n\n for (const line of bodyLines) {\n if (line.length === 0) {\n result.items.push({ type: \"empty\" });\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.items.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n result.items.push({ type: \"item\", key, value });\n }\n\n return result;\n}\n\nfunction splitLine(line: string): [string, string | undefined] {\n const index = line.indexOf(\":\");\n if (index === -1) {\n return [line, undefined];\n }\n return [\n line.substring(0, index).trimEnd(),\n line.substring(index + 1).trimStart(),\n ];\n}\n\nfunction trim(list: string[]): string[] {\n const startIndex = list.findIndex((l) => l.length > 0);\n if (startIndex < 0) {\n return [];\n }\n const endIndex = list.findLastIndex((l) => l.length > 0);\n return list.slice(startIndex, endIndex + 1);\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\nimport { parseTalonList } from \"./parseTalonList.js\";\n\ntype Options = FormatterOptions<\n \"endOfLine\" | \"columnWidth\" | \"insertFinalNewline\"\n>;\n\nexport function talonListFormatter(\n text: string,\n options: Options = {},\n): string {\n const columnWidth = getColumnWidth(text) ?? options.columnWidth;\n const eol = getEndOfLine(options.endOfLine);\n const talonList = parseTalonList(text);\n talonList.headers.sort((a, _b) =>\n a.type === \"header\" && a.key === \"list\" ? -1 : 0,\n );\n const lines: string[] = [];\n\n for (const header of talonList.headers) {\n if (header.type === \"comment\") {\n lines.push(header.text);\n continue;\n }\n lines.push(`${header.key}: ${header.value}`);\n }\n\n lines.push(\"-\", \"\");\n\n for (const item of talonList.items) {\n if (item.type === \"empty\") {\n lines.push(\"\");\n continue;\n }\n if (item.type === \"comment\") {\n lines.push(item.text);\n continue;\n }\n if (item.value != null) {\n const keyWithColon =\n columnWidth != null\n ? `${item.key}: `.padEnd(columnWidth)\n : `${item.key}: `;\n const value = convertQuotes(item.value);\n lines.push(`${keyWithColon}${value}`);\n } else {\n lines.push(item.key);\n }\n }\n\n if (lines.length === 0) {\n return \"\";\n }\n\n if (options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE) {\n lines.push(\"\");\n }\n\n return lines.join(eol);\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"./types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"./util/constants.js\";\nimport { createDebugLogger } from \"./util/createDebugLogger.js\";\nimport { getEndOfLine } from \"./util/getEndOfLine.js\";\nimport { getIndentation } from \"./util/getIndentation.js\";\nimport { SyntaxTreeError } from \"./util/SyntaxTreeError.js\";\n\nexport type Options = FormatterOptions<\n \"endOfLine\" | \"indentTabs\" | \"indentSize\" | \"insertFinalNewline\"\n>;\n\nexport function treeSitterFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug: boolean = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TreeSitterFormatter(\n indentation,\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TreeSitterFormatter {\n private lastRow = 0;\n private logger: DebugLogger;\n\n constructor(\n private indentation: string,\n private eol: string,\n private insertFinalNewline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n getText(node: SyntaxNode): string {\n const nodeText = this.getNodeText(node, 0);\n\n if (nodeText.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return nodeText + this.eol;\n }\n\n return nodeText;\n }\n\n private getNodeText(node: SyntaxNode, numIndents: number): string {\n const nl = node.startPosition.row > this.lastRow + 1 ? this.eol : \"\";\n this.lastRow = node.endPosition.row;\n const text = this.getNodeTextInternal(node, numIndents);\n this.lastRow = node.endPosition.row;\n return `${nl}${text}`;\n }\n\n private getNamedNodeText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \")\");\n const first = node.children\n .slice(0, 2)\n .map((n) => n.text)\n .join(\"\");\n const last = node.children\n .slice(index)\n .map((n) => this.getNodeText(n, 0))\n .join(\"\");\n const interior = node.children\n .slice(2, index)\n .map((n) => this.getNodeText(n, numIndents + 1));\n // Inline node\n if (interior.length === 0) {\n return `${this.getIndent(numIndents)}${first}${last}`;\n }\n // Multiline node\n return [\n `${this.getIndent(numIndents)}${first}`,\n ...interior,\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getListText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \"]\");\n const first = node.children[0].text;\n const last = node.children\n .slice(index)\n .map((n) => n.text)\n .join(\" \");\n const parts = [\n `${this.getIndent(numIndents)}${first}`,\n ...node.children\n .slice(1, index)\n .map((n) => this.getNodeText(n, numIndents + 1)),\n `${this.getIndent(numIndents)}${last}`,\n ];\n return parts.join(this.eol);\n }\n\n private getPredicateText(node: SyntaxNode, numIndents: number): string {\n const first = node.children[0].text;\n const last = node.children[node.children.length - 1].text;\n const parts = [\n node.children\n .slice(1, 4)\n .map((n) => n.text)\n .join(\"\"),\n ...node.children[node.children.length - 2].children.map(\n (n) => n.text,\n ),\n ];\n // Inline predicate\n if (node.startPosition.row === node.endPosition.row) {\n const text = `${first}${parts.join(\" \")}${last}`;\n return `${this.getIndent(numIndents)}${text}`;\n }\n // Multiline predicate\n return [\n `${this.getIndent(numIndents)}${first}${parts[0]}`,\n ...parts\n .slice(1)\n .map((s) => `${this.getIndent(numIndents + 1)}${s}`),\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getFieldDefinitionText(\n node: SyntaxNode,\n numIndents: number,\n ): string {\n // Field definition directly in document root\n if (numIndents === 0) {\n return [\"(_\", this.getFieldDefinitionText(node, 1), \")\"].join(\n this.eol,\n );\n }\n // [lhs, \":\", rhs]\n return [\n this.getIndent(numIndents),\n node.children[0].text,\n node.children[1].text,\n \" \",\n this.getNodeText(node.children[2], numIndents).trimStart(),\n ].join(\"\");\n }\n\n private getNodeTextInternal(node: SyntaxNode, numIndents: number): string {\n switch (node.type) {\n case \"program\":\n return this.joinLines(node.children, 0);\n\n case \"grouping\":\n return this.joinLines(node.children, numIndents + 1);\n\n case \"list\":\n return this.getListText(node, numIndents);\n\n case \"named_node\":\n return this.getNamedNodeText(node, numIndents);\n\n case \"predicate\":\n return this.getPredicateText(node, numIndents);\n\n case \"field_definition\":\n return this.getFieldDefinitionText(node, numIndents);\n\n case \"anonymous_node\":\n return (\n this.getIndent(numIndents) +\n node.children\n .map((n) => this.getNodeText(n, numIndents + 1))\n .join(\"\")\n );\n\n case \"comment\":\n return `${this.getIndent(numIndents)}${node.text.trimEnd()}`;\n\n case \".\":\n case \"negated_field\":\n return `${this.getIndent(numIndents)}${node.text}`;\n\n case \"(\":\n case \")\":\n return `${this.getIndent(numIndents - 1)}${node.text}`;\n\n case \"capture\":\n return ` ${node.text}`;\n\n case \"#\":\n case \"_\":\n case \"predicate_type\":\n case \"identifier\":\n case \"quantifier\":\n case \"string\":\n return node.text;\n\n case \"parameters\": {\n const text = node.children.map((n) => n.text).join(\" \");\n return ` ${text}`;\n }\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private joinLines(nodes: SyntaxNode[], numIndents: number): string {\n if (nodes.length === 0) {\n return \"\";\n }\n const lastIsQuantifier = nodes[nodes.length - 1].type === \"quantifier\";\n const nodesToUse = lastIsQuantifier ? nodes.slice(0, -1) : nodes;\n const text = nodesToUse\n .map((n) => this.getNodeText(n, numIndents))\n .join(this.eol);\n return lastIsQuantifier\n ? `${text}${nodes[nodes.length - 1].text}`\n : text;\n }\n\n private getIndent(length: number): string {\n return length < 1\n ? \"\"\n : new Array(length).fill(this.indentation).join(\"\");\n }\n}\n"], - "mappings": "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", - "names": ["parseSnippetFile", "content", "documentContents", "file", "text", "match", "contextText", "bodyText", "body", "parseBody", "context", "parseContext", "variables", "rest", "document", "pairs", "parseContextPairs", "key", "value", "parseVectorValue", "parseVariables", "lines", "l", "line", "parts", "variablesMap", "getVariable", "name", "matchLeading", "v", "IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "getEndOfLine", "eof", "serializeSnippetFile", "snippetFile", "options", "eol", "getEndOfLine", "SnippetSerializer", "insertFinalNewline", "documents", "result", "d", "document", "lines", "getOptionalPairString", "getSortedVariables", "variables", "compareVariables", "variable", "v", "key", "value", "a", "b", "snippetFormatter", "text", "options", "snippetFile", "parseSnippetFile", "serializeSnippetFile", "createDebugLogger", "debug", "message", "getColumnWidth", "text", "match", "getIndentation", "indentTabs", "indentSize", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "getMessage", "location", "shortMessage", "getLocation", "point", "SyntaxTreeError", "SyntaxError", "rootNode", "findFirstProblemNode", "node", "child", "errorNode", "convertQuotes", "text", "talonFormatter", "node", "options", "debug", "SyntaxTreeError", "columnWidth", "getColumnWidth", "indentation", "getIndentation", "eol", "getEndOfLine", "TalonFormatter", "indent", "maxLineLength", "insertFinalNewline", "preserveMultiline", "createDebugLogger", "result", "isIndented", "n", "isFirstChild", "text", "nodeText", "rangeEqual", "formatString", "unwrap", "children", "middle", "pre", "post", "forceMultiline", "leftNode", "_colonNode", "rightNodes", "left", "isLeftRightSingleLine", "rightNode", "right", "leftWithPadding", "rights", "a", "b", "convertQuotes", "parseTalonList", "text", "lines", "l", "separatorIndex", "headerLines", "bodyLines", "trim", "result", "line", "key", "value", "splitLine", "index", "list", "startIndex", "endIndex", "talonListFormatter", "text", "options", "columnWidth", "getColumnWidth", "eol", "getEndOfLine", "talonList", "parseTalonList", "a", "_b", "lines", "header", "item", "keyWithColon", "value", "convertQuotes", "treeSitterFormatter", "node", "options", "debug", "SyntaxTreeError", "indentation", "getIndentation", "eol", "getEndOfLine", "TreeSitterFormatter", "insertFinalNewline", "createDebugLogger", "nodeText", "numIndents", "nl", "text", "index", "n", "first", "last", "interior", "parts", "nodes", "lastIsQuantifier", "length"] + "sourcesContent": ["import type { Snippet, SnippetFile, SnippetVariable } from \"./snippetTypes.js\";\n\nexport function parseSnippetFile(content: string): SnippetFile {\n const documentContents = content.split(/^---$/m);\n const file: SnippetFile = { snippets: [] };\n\n for (const text of documentContents) {\n const match = /^-$/m.exec(text);\n const contextText = match != null ? text.slice(0, match.index) : text;\n const bodyText =\n match != null ? text.slice(match.index + match[0].length) : null;\n const body = bodyText != null ? parseBody(bodyText) : null;\n let context = parseContext(contextText);\n\n // Snippet with body\n if (body != null) {\n context ??= { variables: [] };\n const { variables, ...rest } = context;\n file.snippets.push({ ...rest, body, variables });\n }\n // Header without body\n else if (context != null) {\n if (file.header != null || file.snippets.length > 0) {\n throw new Error(\"Header snippet must be first in file\");\n }\n file.header = context;\n }\n }\n\n return file;\n}\n\ntype Context = Omit;\n\nfunction parseContext(text: string): Context | undefined {\n const document: Context = { variables: [] };\n const pairs = parseContextPairs(text);\n\n if (Object.keys(pairs).length === 0) {\n return undefined;\n }\n\n const variables: Record = {};\n\n for (const [key, value] of Object.entries(pairs)) {\n switch (key) {\n case \"name\":\n document.name = value;\n break;\n case \"description\":\n document.description = value;\n break;\n case \"phrase\":\n document.phrases = parseVectorValue(value);\n break;\n case \"insertionScope\":\n document.insertionScopes = parseVectorValue(value);\n break;\n case \"language\":\n document.languages = parseVectorValue(value);\n break;\n default:\n if (!key.startsWith(\"$\")) {\n throw new Error(`Invalid key '${key}'`);\n }\n variables[key] = value;\n }\n }\n\n document.variables = parseVariables(variables);\n\n return document;\n}\n\nfunction parseContextPairs(text: string): Record {\n const lines = text\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const pairs: Record = {};\n\n for (const line of lines) {\n const parts = line.split(\":\");\n if (parts.length !== 2) {\n throw new Error(`Invalid line '${line}'`);\n }\n const key = parts[0].trim();\n const value = parts[1].trim();\n if (key.length === 0 || value.length === 0) {\n throw new Error(`Invalid line '${line}'`);\n }\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (pairs[key] != null) {\n throw new Error(`Duplicate key '${key}' in '${text}'`);\n }\n pairs[key] = value;\n }\n\n return pairs;\n}\n\nfunction parseVariables(variables: Record): SnippetVariable[] {\n const variablesMap: Record = {};\n\n const getVariable = (name: string): SnippetVariable => {\n variablesMap[name] ??= { name };\n return variablesMap[name];\n };\n\n for (const [key, value] of Object.entries(variables)) {\n const parts = key.split(\".\");\n if (parts.length !== 2) {\n throw new Error(`Invalid variable key '${key}'`);\n }\n const name = parts[0].slice(1);\n const field = parts[1];\n switch (field) {\n case \"insertionFormatter\":\n getVariable(name).insertionFormatters = parseVectorValue(value);\n break;\n case \"wrapperPhrase\":\n getVariable(name).wrapperPhrases = parseVectorValue(value);\n break;\n case \"wrapperScope\":\n getVariable(name).wrapperScope = value;\n break;\n default:\n throw new Error(`Invalid variable key '${key}'`);\n }\n }\n\n return Object.values(variablesMap);\n}\n\nfunction parseBody(text: string): string[] | undefined {\n // Find first line that is not empty. Preserve indentation.\n const matchLeading = /^[ \\t]*\\S/m.exec(text);\n if (matchLeading?.index == null) {\n return undefined;\n }\n return text\n .slice(matchLeading.index)\n .trimEnd()\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd());\n}\n\nfunction parseVectorValue(value: string): string[] {\n return value.split(\"|\").map((v) => v.trim());\n}\n", "// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport type {\n Snippet,\n SnippetFile,\n SnippetHeader,\n SnippetVariable,\n} from \"./snippetTypes.js\";\n\nexport type Options = FormatterOptions<\"endOfLine\" | \"insertFinalNewline\">;\n\nexport function serializeSnippetFile(\n snippetFile: SnippetFile,\n options: Options = {},\n): string {\n const eol = getEndOfLine(options.endOfLine);\n const serializer = new SnippetSerializer(\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n );\n return serializer.getText(snippetFile);\n}\n\nclass SnippetSerializer {\n public constructor(\n private readonly eol: string,\n private readonly insertFinalNewline: boolean,\n ) {}\n\n public getText(snippetFile: SnippetFile): string {\n const docDelimiter = \"---\";\n const documents: string[] = [];\n\n if (snippetFile.header != null) {\n documents.push(this.getDocumentText(snippetFile.header));\n }\n\n documents.push(\n ...snippetFile.snippets.map(this.getDocumentText.bind(this)),\n );\n\n const result = documents\n .filter((d) => d.length > 0)\n .join(`${this.eol}${docDelimiter}${this.eol}${this.eol}`);\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return `${result}${this.eol}${docDelimiter}${this.eol}`;\n }\n\n return `${result}${this.eol}${docDelimiter}`;\n }\n\n private getDocumentText(document: SnippetHeader | Snippet): string {\n const lines: string[] = [\n getOptionalPairString(\"name\", document.name),\n getOptionalPairString(\"description\", document.description),\n getOptionalPairString(\"language\", document.languages),\n getOptionalPairString(\"phrase\", document.phrases),\n getOptionalPairString(\"insertionScope\", document.insertionScopes),\n ].filter(Boolean);\n\n if (document.variables.length > 0) {\n if (lines.length > 0) {\n lines.push(\"\");\n }\n lines.push(...getSortedVariables(document.variables));\n }\n\n if (\"body\" in document) {\n lines.push(\"-\", ...document.body);\n }\n\n return lines.join(this.eol);\n }\n}\n\nfunction getSortedVariables(variables: SnippetVariable[]): string[] {\n const result = variables.slice();\n result.sort(compareVariables);\n return result\n .flatMap((variable) => [\n getOptionalPairString(\n `$${variable.name}.insertionFormatter`,\n variable.insertionFormatters,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperPhrase`,\n variable.wrapperPhrases,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperScope`,\n variable.wrapperScope,\n ),\n ])\n .filter((v) => v.length > 0);\n}\n\nfunction getOptionalPairString(\n key: string,\n value: string | string[] | undefined,\n): string {\n if (value == null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return `${key}: ${value.join(\" | \")}`;\n }\n return `${key}: ${value}`;\n}\n\nfunction compareVariables(a: SnippetVariable, b: SnippetVariable): number {\n if (a.name === \"0\") {\n return 1;\n }\n if (b.name === \"0\") {\n return -1;\n }\n return a.name.localeCompare(b.name);\n}\n", "import { parseSnippetFile } from \"./parseSnippetFile.js\";\nimport { serializeSnippetFile } from \"./serializeSnippetFile.js\";\nimport type { Options } from \"./serializeSnippetFile.js\";\n\nexport function snippetFormatter(text: string, options?: Options): string {\n const snippetFile = parseSnippetFile(text);\n return serializeSnippetFile(snippetFile, options);\n}\n", "import type { DebugLogger } from \"../types.js\";\n\nexport function createDebugLogger(debug: boolean): DebugLogger {\n return {\n debug(message: string) {\n if (debug) {\n console.warn(`[debug] ${message}`);\n }\n },\n };\n}\n", "export function getColumnWidth(text: string): number | undefined {\n const match = /# fmt: columnWidth=(\\d+)/.exec(text);\n\n if (match != null) {\n return Number.parseInt(match[1], 10);\n }\n\n return undefined;\n}\n", "import { DEFAULT_INDENT_WIDTH } from \"./constants.js\";\n\nexport function getIndentation(\n indentTabs: boolean | undefined,\n indentSize: number | undefined,\n): string {\n return indentTabs ? \"\\t\" : \" \".repeat(indentSize ?? DEFAULT_INDENT_WIDTH);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n public constructor(private readonly point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n public getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import type { SyntaxNode } from \"../types.js\";\nimport { SyntaxError } from \"./SyntaxError.js\";\n\nexport class SyntaxTreeError extends SyntaxError {\n public constructor(rootNode: SyntaxNode) {\n super(findFirstProblemNode(rootNode)?.startPosition);\n this.name = \"SyntaxTreeError\";\n }\n}\n\nfunction findFirstProblemNode(node: SyntaxNode): SyntaxNode | null {\n if (node.isError || node.isMissing) {\n return node;\n }\n for (const child of node.children) {\n if (!child.hasError) {\n continue;\n }\n const errorNode = findFirstProblemNode(child);\n if (errorNode != null) {\n return errorNode;\n }\n }\n return null;\n}\n", "export function convertQuotes(text: string): string {\n // Convert single quotes to double quotes\n if (\n text.length > 0 &&\n text.startsWith(\"'\") &&\n text.endsWith(\"'\") &&\n !text.includes('\"')\n ) {\n const innerText = text.slice(1, -1).replaceAll(String.raw`\\'`, \"'\");\n return `\"${innerText}\"`;\n }\n\n return text;\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"../types.js\";\nimport {\n DEFAULT_INSERT_FINAL_NEWLINE,\n DEFAULT_MAX_LINE_LENGTH,\n} from \"../util/constants.js\";\nimport { createDebugLogger } from \"../util/createDebugLogger.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { getIndentation } from \"../util/getIndentation.js\";\nimport { SyntaxTreeError } from \"../util/SyntaxTreeError.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\n\nexport type Options = FormatterOptions<\n | \"endOfLine\"\n | \"indentTabs\"\n | \"indentSize\"\n | \"maxLineLength\"\n | \"columnWidth\"\n | \"insertFinalNewline\"\n | \"preserveMultiline\"\n>;\n\nexport function talonFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const columnWidth = getColumnWidth(node.text) ?? options.columnWidth;\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TalonFormatter(\n indentation,\n eol,\n options.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH,\n columnWidth,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n options.preserveMultiline ?? false,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TalonFormatter {\n private readonly lines: string[] = [];\n private lastRow = 0;\n private readonly logger: DebugLogger;\n\n public constructor(\n private readonly indent: string,\n private readonly eol: string,\n private readonly maxLineLength: number,\n private readonly columnWidth: number | undefined,\n private readonly insertFinalNewline: boolean,\n private readonly preserveMultiline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n public getText(node: SyntaxNode): string {\n this.addNode(node);\n\n const result = this.lines.join(this.eol).trimEnd();\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return result + this.eol;\n }\n\n return result;\n }\n\n private addNL(): void {\n if (this.lines[this.lines.length - 1] !== \"\") {\n this.lines.push(\"\");\n }\n }\n\n private addNode(node: SyntaxNode, isIndented = false): void {\n if (node.startPosition.row > this.lastRow + 1) {\n this.addNL();\n }\n this.lastRow = node.endPosition.row;\n this.addNodeHelper(node, isIndented);\n this.lastRow = node.endPosition.row;\n }\n\n private addNodeHelper(node: SyntaxNode, isIndented = false): void {\n switch (node.type) {\n case \"source_file\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"matches\": {\n // There are match nodes or there is a comment before\n if (node.children.length > 1 || !isFirstChild(node)) {\n for (const n of node.children) {\n this.addNode(n);\n }\n this.addNL();\n }\n break;\n }\n\n case \"declarations\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"block\":\n for (const n of node.children) {\n this.addNode(n, true);\n }\n break;\n\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n this.addLeftRightNode(node, false);\n break;\n\n case \"settings_declaration\":\n if (\n this.lines.length > 0 &&\n !this.lines[this.lines.length - 1].startsWith(\"#\")\n ) {\n this.addNL();\n }\n this.addLeftRightNode(node, true);\n this.addNL();\n break;\n\n case \"comment\": {\n // When using crlf eol comments have a trailing `\\r`\n const text = node.text.trimEnd();\n const nodeText =\n isIndented || node.startPosition.column > 0\n ? `${this.indent}${text}`\n : text;\n this.lines.push(nodeText);\n break;\n }\n\n default: {\n const nodeText = this.getNodeText(node);\n this.lines.push(\n isIndented ? `${this.indent}${nodeText}` : nodeText,\n );\n }\n }\n }\n\n private getNodeText(node: SyntaxNode): string {\n switch (node.type) {\n case \"source_file\":\n case \"matches\":\n case \"declarations\":\n case \"block\":\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n case \"settings_declaration\":\n case \"comment\":\n throw new Error(\n `Node type '${node.type}' should be handled in addNode, not getNodeText`,\n );\n\n case \"parenthesized_rule\":\n return this.pairWithChildren(\n node,\n node.parent != null && rangeEqual(node, node.parent),\n );\n\n case \"optional\":\n return this.pairWithChildren(node);\n\n case \"expression_statement\":\n case \"assignment_statement\":\n case \"seq\":\n case \"choice\":\n return node.children.map((n) => this.getNodeText(n)).join(\" \");\n\n case \"rule\":\n case \"action\":\n case \"key_action\":\n case \"sleep_action\":\n case \"argument_list\":\n case \"key_binding\":\n case \"face_binding\":\n case \"gamepad_binding\":\n case \"parrot_binding\":\n case \"noise_binding\":\n case \"deck_binding\":\n case \"tag_import_declaration\":\n case \"match\":\n case \"for_statement\":\n case \"if_statement\":\n return node.children.map((n) => this.getNodeText(n)).join(\"\");\n\n case \"string\":\n return formatString(node);\n\n case \"match_modifier\":\n case \"for\":\n case \"if\":\n case \":\":\n case \",\":\n return `${node.text} `;\n\n case \"in\":\n return ` ${node.text} `;\n\n case \"implicit_string\":\n return node.text.trim();\n\n case \"tag_binding\":\n case \"settings_binding\":\n case \"capture\":\n case \"list\":\n case \"key(\":\n case \"sleep(\":\n case \"gamepad(\":\n case \"face(\":\n case \"parrot(\":\n case \"noise(\":\n case \"identifier\":\n case \"variable\":\n case \"word\":\n case \"binary_operator\":\n case \"integer\":\n case \"float\":\n case \"start_anchor\":\n case \"end_anchor\":\n case \"repeat\":\n case \"deck(\":\n case \"repeat1\":\n case \"(\":\n case \")\":\n case \"=\":\n case \"-\":\n case \"|\":\n return node.text;\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private pairWithChildren(node: SyntaxNode, unwrap = false): string {\n const { children } = node;\n const middle = children\n .slice(1, -1)\n .map((n) => this.getNodeText(n))\n .join(\" \");\n if (unwrap) {\n return middle;\n }\n const pre = children[0].text;\n const post = children[children.length - 1].text;\n return `${pre}${middle}${post}`;\n }\n\n private addLeftRightNode(node: SyntaxNode, forceMultiline: boolean): void {\n const [leftNode, _colonNode, ...rightNodes] = node.children;\n const left = this.getNodeText(leftNode);\n\n if (!forceMultiline && rightNodes.length === 1) {\n if (\n !this.preserveMultiline ||\n isLeftRightSingleLine(leftNode, rightNodes)\n ) {\n const rightNode = rightNodes[0];\n if (\n rightNode.children.length === 1 &&\n !forceMultilineBody(rightNode.children[0])\n ) {\n const right = this.getNodeText(rightNode.children[0]);\n const leftWithPadding =\n this.columnWidth != null\n ? `${left}: `.padEnd(this.columnWidth)\n : `${left}: `;\n if (\n leftWithPadding.length + right.length <=\n this.maxLineLength\n ) {\n this.lines.push(leftWithPadding + right);\n return;\n }\n }\n }\n }\n\n this.lines.push(`${left}:`);\n\n for (const n of rightNodes) {\n this.addNode(n, true);\n }\n }\n}\n\n// Returns true if the node should remain in the declaration block instead of\n// being inlined after the command colon.\nfunction forceMultilineBody(node: SyntaxNode): boolean {\n switch (node.type) {\n case \"if_statement\":\n case \"for_statement\":\n return true;\n default:\n return false;\n }\n}\n\n// Returns true if the left and right nodes are on the same line, allowing them to be formatted on a single line.\nfunction isLeftRightSingleLine(\n left: SyntaxNode,\n rights: SyntaxNode[],\n): boolean {\n return left.endPosition.row === rights[rights.length - 1].startPosition.row;\n}\n\nfunction rangeEqual(a: SyntaxNode, b: SyntaxNode): boolean {\n return (\n a.startPosition.row === b.startPosition.row &&\n a.startPosition.column === b.startPosition.column &&\n a.endPosition.row === b.endPosition.row &&\n a.endPosition.column === b.endPosition.column\n );\n}\n\nfunction isFirstChild(node: SyntaxNode): boolean {\n return node.id === node.parent?.children[0].id;\n}\n\nfunction formatString(node: SyntaxNode): string {\n // Convert single quotes to double quotes\n const text = convertQuotes(node.text);\n\n // A single string literal is allowed as syntactic sugar for the insert\n // action, but not in combination with other sibling statements.\n if (\n node.parent?.type === \"expression_statement\" &&\n node.parent.parent?.type === \"block\" &&\n rangeEqual(node, node.parent) &&\n node.parent.parent.children.length > 1\n ) {\n return `insert(${text})`;\n }\n\n return text;\n}\n", "interface TalonListHeader {\n type: \"header\";\n key: string;\n value: string;\n}\n\ninterface TalonListItem {\n type: \"item\";\n key: string;\n value?: string;\n}\n\ninterface EmptyLine {\n type: \"empty\";\n}\n\ninterface CommentLine {\n type: \"comment\";\n text: string;\n}\n\nexport interface TalonList {\n headers: (TalonListHeader | CommentLine)[];\n items: (TalonListItem | CommentLine | EmptyLine)[];\n}\n\nexport function parseTalonList(text: string): TalonList {\n const lines = text.split(/\\r?\\n/).map((l) => l.trim());\n const separatorIndex = lines.indexOf(\"-\");\n\n if (separatorIndex === -1) {\n throw new Error(\"Separator not found in talon list\");\n }\n\n const headerLines = lines.slice(0, separatorIndex);\n const bodyLines = trim(lines.slice(separatorIndex + 1));\n\n const result: TalonList = {\n headers: [],\n items: [],\n };\n\n for (const line of headerLines) {\n if (line.length === 0) {\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.headers.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n if (value == null) {\n throw new Error(\"Header value missing\");\n }\n result.headers.push({ type: \"header\", key, value });\n }\n\n for (const line of bodyLines) {\n if (line.length === 0) {\n result.items.push({ type: \"empty\" });\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.items.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n result.items.push({ type: \"item\", key, value });\n }\n\n return result;\n}\n\nfunction splitLine(line: string): [string, string | undefined] {\n const index = line.indexOf(\":\");\n if (index === -1) {\n return [line, undefined];\n }\n return [line.slice(0, index).trimEnd(), line.slice(index + 1).trimStart()];\n}\n\nfunction trim(list: string[]): string[] {\n const startIndex = list.findIndex((l) => l.length > 0);\n if (startIndex === -1) {\n return [];\n }\n const endIndex = list.findLastIndex((l) => l.length > 0);\n return list.slice(startIndex, endIndex + 1);\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\nimport { parseTalonList } from \"./parseTalonList.js\";\n\ntype Options = FormatterOptions<\n \"endOfLine\" | \"columnWidth\" | \"insertFinalNewline\"\n>;\n\nexport function talonListFormatter(\n text: string,\n options: Options = {},\n): string {\n const columnWidth = getColumnWidth(text) ?? options.columnWidth;\n const eol = getEndOfLine(options.endOfLine);\n const talonList = parseTalonList(text);\n talonList.headers.sort((a, _b) =>\n a.type === \"header\" && a.key === \"list\" ? -1 : 0,\n );\n const lines: string[] = [];\n\n for (const header of talonList.headers) {\n if (header.type === \"comment\") {\n lines.push(header.text);\n continue;\n }\n lines.push(`${header.key}: ${header.value}`);\n }\n\n lines.push(\"-\", \"\");\n\n for (const item of talonList.items) {\n if (item.type === \"empty\") {\n lines.push(\"\");\n continue;\n }\n if (item.type === \"comment\") {\n lines.push(item.text);\n continue;\n }\n if (item.value != null) {\n const keyWithColon =\n columnWidth != null\n ? `${item.key}: `.padEnd(columnWidth)\n : `${item.key}: `;\n const value = convertQuotes(item.value);\n lines.push(`${keyWithColon}${value}`);\n } else {\n lines.push(item.key);\n }\n }\n\n if (lines.length === 0) {\n return \"\";\n }\n\n if (options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE) {\n lines.push(\"\");\n }\n\n return lines.join(eol);\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"./types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"./util/constants.js\";\nimport { createDebugLogger } from \"./util/createDebugLogger.js\";\nimport { getEndOfLine } from \"./util/getEndOfLine.js\";\nimport { getIndentation } from \"./util/getIndentation.js\";\nimport { SyntaxTreeError } from \"./util/SyntaxTreeError.js\";\n\nexport type Options = FormatterOptions<\n \"endOfLine\" | \"indentTabs\" | \"indentSize\" | \"insertFinalNewline\"\n>;\n\nexport function treeSitterFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TreeSitterFormatter(\n indentation,\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TreeSitterFormatter {\n private lastRow = 0;\n private readonly logger: DebugLogger;\n\n public constructor(\n private readonly indentation: string,\n private readonly eol: string,\n private readonly insertFinalNewline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n public getText(node: SyntaxNode): string {\n const nodeText = this.getNodeText(node, 0);\n\n if (nodeText.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return nodeText + this.eol;\n }\n\n return nodeText;\n }\n\n private getNodeText(node: SyntaxNode, numIndents: number): string {\n const nl = node.startPosition.row > this.lastRow + 1 ? this.eol : \"\";\n this.lastRow = node.endPosition.row;\n const text = this.getNodeTextInternal(node, numIndents);\n this.lastRow = node.endPosition.row;\n return `${nl}${text}`;\n }\n\n private getNamedNodeText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \")\");\n const first = node.children\n .slice(0, 2)\n .map((n) => n.text)\n .join(\"\");\n const last = node.children\n .slice(index)\n .map((n) => this.getNodeText(n, 0))\n .join(\"\");\n const interior = node.children\n .slice(2, index)\n .map((n) => this.getNodeText(n, numIndents + 1));\n // Inline node\n if (interior.length === 0) {\n return `${this.getIndent(numIndents)}${first}${last}`;\n }\n // Multiline node\n return [\n `${this.getIndent(numIndents)}${first}`,\n ...interior,\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getListText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \"]\");\n const first = node.children[0].text;\n const last = node.children\n .slice(index)\n .map((n) => n.text)\n .join(\" \");\n const parts = [\n `${this.getIndent(numIndents)}${first}`,\n ...node.children\n .slice(1, index)\n .map((n) => this.getNodeText(n, numIndents + 1)),\n `${this.getIndent(numIndents)}${last}`,\n ];\n return parts.join(this.eol);\n }\n\n private getPredicateText(node: SyntaxNode, numIndents: number): string {\n const first = node.children[0].text;\n const last = node.children[node.children.length - 1].text;\n const parts = [\n node.children\n .slice(1, 4)\n .map((n) => n.text)\n .join(\"\"),\n ...node.children[node.children.length - 2].children.map(\n (n) => n.text,\n ),\n ];\n // Inline predicate\n if (node.startPosition.row === node.endPosition.row) {\n const text = `${first}${parts.join(\" \")}${last}`;\n return `${this.getIndent(numIndents)}${text}`;\n }\n // Multiline predicate\n return [\n `${this.getIndent(numIndents)}${first}${parts[0]}`,\n ...parts\n .slice(1)\n .map((s) => `${this.getIndent(numIndents + 1)}${s}`),\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getFieldDefinitionText(\n node: SyntaxNode,\n numIndents: number,\n ): string {\n // Field definition directly in document root\n if (numIndents === 0) {\n return [\"(_\", this.getFieldDefinitionText(node, 1), \")\"].join(\n this.eol,\n );\n }\n // [lhs, \":\", rhs]\n return [\n this.getIndent(numIndents),\n node.children[0].text,\n node.children[1].text,\n \" \",\n this.getNodeText(node.children[2], numIndents).trimStart(),\n ].join(\"\");\n }\n\n private getNodeTextInternal(node: SyntaxNode, numIndents: number): string {\n switch (node.type) {\n case \"program\":\n return this.joinLines(node.children, 0);\n\n case \"grouping\":\n return this.joinLines(node.children, numIndents + 1);\n\n case \"list\":\n return this.getListText(node, numIndents);\n\n case \"named_node\":\n return this.getNamedNodeText(node, numIndents);\n\n case \"predicate\":\n return this.getPredicateText(node, numIndents);\n\n case \"field_definition\":\n return this.getFieldDefinitionText(node, numIndents);\n\n case \"anonymous_node\":\n return (\n this.getIndent(numIndents) +\n node.children\n .map((n) => this.getNodeText(n, numIndents + 1))\n .join(\"\")\n );\n\n case \"comment\":\n return `${this.getIndent(numIndents)}${node.text.trimEnd()}`;\n\n case \".\":\n case \"negated_field\":\n return `${this.getIndent(numIndents)}${node.text}`;\n\n case \"(\":\n case \")\":\n return `${this.getIndent(numIndents - 1)}${node.text}`;\n\n case \"capture\":\n return ` ${node.text}`;\n\n case \"#\":\n case \"_\":\n case \"predicate_type\":\n case \"identifier\":\n case \"quantifier\":\n case \"string\":\n return node.text;\n\n case \"parameters\": {\n const text = node.children.map((n) => n.text).join(\" \");\n return ` ${text}`;\n }\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private joinLines(nodes: SyntaxNode[], numIndents: number): string {\n if (nodes.length === 0) {\n return \"\";\n }\n const lastIsQuantifier = nodes[nodes.length - 1].type === \"quantifier\";\n const nodesToUse = lastIsQuantifier ? nodes.slice(0, -1) : nodes;\n const text = nodesToUse\n .map((n) => this.getNodeText(n, numIndents))\n .join(this.eol);\n return lastIsQuantifier\n ? `${text}${nodes[nodes.length - 1].text}`\n : text;\n }\n\n private getIndent(length: number): string {\n return length < 1\n ? \"\"\n : Array.from({ length }, () => this.indentation).join(\"\");\n }\n}\n"], + "mappings": "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", + "names": ["parseSnippetFile", "content", "documentContents", "file", "text", "match", "contextText", "bodyText", "body", "parseBody", "context", "parseContext", "variables", "rest", "document", "pairs", "parseContextPairs", "key", "value", "parseVectorValue", "parseVariables", "lines", "l", "line", "parts", "variablesMap", "getVariable", "name", "matchLeading", "v", "IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "getEndOfLine", "eof", "serializeSnippetFile", "snippetFile", "options", "eol", "getEndOfLine", "SnippetSerializer", "insertFinalNewline", "documents", "result", "d", "document", "lines", "getOptionalPairString", "getSortedVariables", "variables", "compareVariables", "variable", "v", "key", "value", "a", "b", "snippetFormatter", "text", "options", "snippetFile", "parseSnippetFile", "serializeSnippetFile", "createDebugLogger", "debug", "message", "getColumnWidth", "text", "match", "getIndentation", "indentTabs", "indentSize", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "getMessage", "location", "shortMessage", "getLocation", "point", "SyntaxTreeError", "SyntaxError", "rootNode", "findFirstProblemNode", "node", "child", "errorNode", "convertQuotes", "text", "talonFormatter", "node", "options", "debug", "SyntaxTreeError", "columnWidth", "getColumnWidth", "indentation", "getIndentation", "eol", "getEndOfLine", "TalonFormatter", "indent", "maxLineLength", "insertFinalNewline", "preserveMultiline", "createDebugLogger", "result", "isIndented", "n", "isFirstChild", "text", "nodeText", "rangeEqual", "formatString", "unwrap", "children", "middle", "pre", "post", "forceMultiline", "leftNode", "_colonNode", "rightNodes", "left", "isLeftRightSingleLine", "rightNode", "forceMultilineBody", "right", "leftWithPadding", "rights", "a", "b", "convertQuotes", "parseTalonList", "text", "lines", "l", "separatorIndex", "headerLines", "bodyLines", "trim", "result", "line", "key", "value", "splitLine", "index", "list", "startIndex", "endIndex", "talonListFormatter", "text", "options", "columnWidth", "getColumnWidth", "eol", "getEndOfLine", "talonList", "parseTalonList", "a", "_b", "lines", "header", "item", "keyWithColon", "value", "convertQuotes", "treeSitterFormatter", "node", "options", "debug", "SyntaxTreeError", "indentation", "getIndentation", "eol", "getEndOfLine", "TreeSitterFormatter", "insertFinalNewline", "createDebugLogger", "nodeText", "numIndents", "nl", "text", "index", "n", "first", "last", "interior", "parts", "nodes", "lastIsQuantifier", "length"] } diff --git a/dist/libNode.js.map b/dist/libNode.js.map index db0f79c..dd2f5c3 100644 --- a/dist/libNode.js.map +++ b/dist/libNode.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/node/getOptionsFromConfig.ts"], - "sourcesContent": ["import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n"], - "mappings": "AAAA,UAAYA,MAAkB,eAG9B,eAAsBC,EAAqBC,EAAoC,CAC3E,IAAMC,EAAU,MAAmB,QAAMD,CAAQ,EAE3CE,EAAmB,CAAC,EAE1B,OAAID,EAAO,eAAiB,MACxBC,EAAQ,WAAa,GACdD,EAAO,eAAiB,UAC/BC,EAAQ,WAAa,IAGrB,OAAOD,EAAO,aAAgB,SAC9BC,EAAQ,WAAaD,EAAO,YAE5BA,EAAO,cAAgB,OACvB,OAAOA,EAAO,WAAc,WAE5BC,EAAQ,WAAaD,EAAO,WAG5B,OAAOA,EAAO,iBAAoB,WAClCC,EAAQ,cAAgBD,EAAO,iBAG/B,OAAOA,EAAO,cAAiB,WAC/BC,EAAQ,YAAcD,EAAO,cAG7B,OAAOA,EAAO,sBAAyB,YACvCC,EAAQ,mBAAqBD,EAAO,sBAGpC,OAAOA,EAAO,oBAAuB,YACrCC,EAAQ,kBAAoBD,EAAO,oBAGnCA,EAAO,aAAe,MAAQA,EAAO,cAAgB,UACrDC,EAAQ,UAAYD,EAAO,aAGxBC,CACX", + "sourcesContent": ["import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n"], + "mappings": "AAAA,UAAYA,MAAkB,eAG9B,eAAsBC,EAAqBC,EAAoC,CAE3E,IAAMC,EAAU,MAAmB,QAAMD,CAAQ,EAE3CE,EAAmB,CAAC,EAE1B,OAAID,EAAO,eAAiB,MACxBC,EAAQ,WAAa,GACdD,EAAO,eAAiB,UAC/BC,EAAQ,WAAa,IAGrB,OAAOD,EAAO,aAAgB,SAC9BC,EAAQ,WAAaD,EAAO,YAE5BA,EAAO,cAAgB,OACvB,OAAOA,EAAO,WAAc,WAE5BC,EAAQ,WAAaD,EAAO,WAG5B,OAAOA,EAAO,iBAAoB,WAClCC,EAAQ,cAAgBD,EAAO,iBAG/B,OAAOA,EAAO,cAAiB,WAC/BC,EAAQ,YAAcD,EAAO,cAG7B,OAAOA,EAAO,sBAAyB,YACvCC,EAAQ,mBAAqBD,EAAO,sBAGpC,OAAOA,EAAO,oBAAuB,YACrCC,EAAQ,kBAAoBD,EAAO,oBAGnCA,EAAO,aAAe,MAAQA,EAAO,cAAgB,UACrDC,EAAQ,UAAYD,EAAO,aAGxBC,CACX", "names": ["editorconfig", "getOptionsFromConfig", "filePath", "config", "options"] } diff --git a/dist/node/cli.d.ts b/dist/node/cli.d.ts index 70f5c8a..5b7eacf 100644 --- a/dist/node/cli.d.ts +++ b/dist/node/cli.d.ts @@ -1,6 +1,6 @@ import type { Readable } from "node:stream"; import type { CLI, Logger } from "../types.js"; -import { type ExitCode } from "../util/constants.js"; +import type { ExitCode } from "../util/constants.js"; export declare function main(cli: CLI): Promise; interface FormatFilesArgs { cli: CLI; diff --git a/dist/snippet/index.d.ts b/dist/snippet/index.d.ts index ad29da0..529f086 100644 --- a/dist/snippet/index.d.ts +++ b/dist/snippet/index.d.ts @@ -1,4 +1,4 @@ -export * from "./parseSnippetFile.js"; -export * from "./serializeSnippetFile.js"; -export * from "./snippetFormatter.js"; -export * from "./snippetTypes.js"; +export { parseSnippetFile } from "./parseSnippetFile.js"; +export { serializeSnippetFile } from "./serializeSnippetFile.js"; +export { snippetFormatter } from "./snippetFormatter.js"; +export type * from "./snippetTypes.js"; diff --git a/dist/snippetFormatter.js b/dist/snippetFormatter.js index 2d78251..45efa16 100644 --- a/dist/snippetFormatter.js +++ b/dist/snippetFormatter.js @@ -1,15 +1,15 @@ #!/usr/bin/env node -function C(t){let e=t.split(/^---$/m),r={snippets:[]};for(let n of e){let i=n.match(/^-$/m),o=i!=null?n.slice(0,i.index):n,s=i!=null?n.slice(i.index+i[0].length):null,a=s?ne(s):null,l=ee(o);if(a!=null){l==null&&(l={variables:[]});let{variables:h,...f}=l;r.snippets.push({...f,body:a,variables:h})}else if(l!=null){if(r.header!=null||r.snippets.length!==0)throw Error("Header snippet must be first in file");r.header=l}}return r}function ee(t){let e={variables:[]},r=te(t);if(Object.keys(r).length===0)return;let n={};for(let[i,o]of Object.entries(r))switch(i){case"name":e.name=o;break;case"description":e.description=o;break;case"phrase":e.phrases=b(o);break;case"insertionScope":e.insertionScopes=b(o);break;case"language":e.languages=b(o);break;default:if(!i.startsWith("$"))throw Error(`Invalid key '${i}'`);n[i]=o}return e.variables=re(n),e}function te(t){let e=t.split(/\r?\n/).map(n=>n.trim()).filter(Boolean),r={};for(let n of e){let i=n.split(":");if(i.length!==2)throw Error(`Invalid line '${n}'`);let o=i[0].trim(),s=i[1].trim();if(o.length===0||s.length===0)throw Error(`Invalid line '${n}'`);if(r[o]!=null)throw Error(`Duplicate key '${o}' in '${t}'`);r[o]=s}return r}function re(t){let e={},r=n=>(e[n]==null&&(e[n]={name:n}),e[n]);for(let[n,i]of Object.entries(t)){let o=n.split(".");if(o.length!==2)throw Error(`Invalid variable key '${n}'`);let s=o[0].slice(1);switch(o[1]){case"insertionFormatter":r(s).insertionFormatters=b(i);break;case"wrapperPhrase":r(s).wrapperPhrases=b(i);break;case"wrapperScope":r(s).wrapperScope=i;break;default:throw Error(`Invalid variable key '${n}'`)}}return Object.values(e)}function ne(t){let e=t.match(/^[ \t]*\S/m);if(e?.index!=null)return t.slice(e.index).trimEnd().split(/\r?\n/).map(r=>r.trimEnd())}function b(t){return t.split("|").map(e=>e.trim())}var ie=[".git",".svn",".hg","node_modules","__pycache__"],I=ie.map(t=>`**/${t}/**`);function k(t){return t==="crlf"?`\r +function I(t){let e=t.split(/^---$/m),r={snippets:[]};for(let n of e){let i=/^-$/m.exec(n),o=i!=null?n.slice(0,i.index):n,s=i!=null?n.slice(i.index+i[0].length):null,a=s!=null?oe(s):null,l=re(o);if(a!=null){l??={variables:[]};let{variables:b,...f}=l;r.snippets.push({...f,body:a,variables:b})}else if(l!=null){if(r.header!=null||r.snippets.length>0)throw new Error("Header snippet must be first in file");r.header=l}}return r}function re(t){let e={variables:[]},r=ne(t);if(Object.keys(r).length===0)return;let n={};for(let[i,o]of Object.entries(r))switch(i){case"name":e.name=o;break;case"description":e.description=o;break;case"phrase":e.phrases=y(o);break;case"insertionScope":e.insertionScopes=y(o);break;case"language":e.languages=y(o);break;default:if(!i.startsWith("$"))throw new Error(`Invalid key '${i}'`);n[i]=o}return e.variables=ie(n),e}function ne(t){let e=t.split(/\r?\n/).map(n=>n.trim()).filter(Boolean),r={};for(let n of e){let i=n.split(":");if(i.length!==2)throw new Error(`Invalid line '${n}'`);let o=i[0].trim(),s=i[1].trim();if(o.length===0||s.length===0)throw new Error(`Invalid line '${n}'`);if(r[o]!=null)throw new Error(`Duplicate key '${o}' in '${t}'`);r[o]=s}return r}function ie(t){let e={},r=n=>(e[n]??={name:n},e[n]);for(let[n,i]of Object.entries(t)){let o=n.split(".");if(o.length!==2)throw new Error(`Invalid variable key '${n}'`);let s=o[0].slice(1);switch(o[1]){case"insertionFormatter":r(s).insertionFormatters=y(i);break;case"wrapperPhrase":r(s).wrapperPhrases=y(i);break;case"wrapperScope":r(s).wrapperScope=i;break;default:throw new Error(`Invalid variable key '${n}'`)}}return Object.values(e)}function oe(t){let e=/^[ \t]*\S/m.exec(t);if(e?.index!=null)return t.slice(e.index).trimEnd().split(/\r?\n/).map(r=>r.trimEnd())}function y(t){return t.split("|").map(e=>e.trim())}var se=[".git",".svn",".hg","node_modules","__pycache__"],R=se.map(t=>`**/${t}/**`);function j(t){return t==="crlf"?`\r `:` -`}function R(t,e={}){let r=k(e.endOfLine);return new L(r,e.insertFinalNewline??!0).getText(t)}var L=class{constructor(e,r){this.eol=e;this.insertFinalNewline=r}getText(e){let n=[];e.header!=null&&n.push(this.getDocumentText(e.header)),n.push(...e.snippets.map(this.getDocumentText.bind(this)));let i=n.filter(o=>o.length>0).join(`${this.eol}---${this.eol}${this.eol}`);return i.length===0?"":this.insertFinalNewline?i+`${this.eol}---${this.eol}`:i+`${this.eol}---`}getDocumentText(e){let r=[g("name",e.name),g("description",e.description),g("language",e.languages),g("phrase",e.phrases),g("insertionScope",e.insertionScopes)].filter(Boolean);return e.variables.length>0&&(r.length>0&&r.push(""),r.push(...se(e.variables))),"body"in e&&r.push("-",...e.body),r.join(this.eol)}};function se(t){let e=t.slice();return e.sort(ae),e.flatMap(r=>[g(`$${r.name}.insertionFormatter`,r.insertionFormatters),g(`$${r.name}.wrapperPhrase`,r.wrapperPhrases),g(`$${r.name}.wrapperScope`,r.wrapperScope)]).filter(r=>r.length>0)}function g(t,e){return e==null?"":Array.isArray(e)?`${t}: ${e.join(" | ")}`:`${t}: ${e}`}function ae(t,e){return t.name==="0"?1:e.name==="0"?-1:t.name.localeCompare(e.name)}function j(t,e){let r=C(t);return R(r,e)}import we from"get-stdin";import*as F from"node:fs/promises";import*as S from"node:path";import*as c from"node:process";function _(t){return t instanceof Error?t.message:String(t)}var x="Syntax error",P=class extends Error{constructor(r){let n=pe(r);super(le(n));this.point=r;this.name="SyntaxError",this.location=n}location;getFileMessage(r){return this.location!=null?`${r}(${this.location}): ${x}`:`${r}: ${x}`}};function O(t){return t instanceof P}function le(t){return t!=null?`${x} at ${t}.`:x}function pe(t){return t!=null?`${t.row+1}:${t.column+1}`:void 0}import*as u from"node:process";var ce="\x1B[0m",fe="\x1B[33m",ge="\x1B[31m",ue="[warn]",me="[error]";function $(t=!1){return de(u.stdout,u.stderr,t)}function de(t,e,r=!1){let n=he(e)?(s,a)=>`${a}${s}${ce}`:(s,a)=>s,i,o;return r?(i=()=>{},o=()=>{}):(i=s=>{t.write(`${s} -`)},o=s=>{e.write(`${n(ue,fe)} ${s} -`)}),{log:i,warn:o,error(s){e.write(`${n(me,ge)} ${s} -`)}}}function he(t){return"NO_COLOR"in u.env?!1:t.isTTY===!0}var m=class extends Error{constructor(r){super(`One or more file pattern errors occurred: +`}function M(t,e={}){let r=j(e.endOfLine);return new _(r,e.insertFinalNewline??!0).getText(t)}var _=class{constructor(e,r){this.eol=e;this.insertFinalNewline=r}eol;insertFinalNewline;getText(e){let n=[];e.header!=null&&n.push(this.getDocumentText(e.header)),n.push(...e.snippets.map(this.getDocumentText.bind(this)));let i=n.filter(o=>o.length>0).join(`${this.eol}---${this.eol}${this.eol}`);return i.length===0?"":this.insertFinalNewline?`${i}${this.eol}---${this.eol}`:`${i}${this.eol}---`}getDocumentText(e){let r=[c("name",e.name),c("description",e.description),c("language",e.languages),c("phrase",e.phrases),c("insertionScope",e.insertionScopes)].filter(Boolean);return e.variables.length>0&&(r.length>0&&r.push(""),r.push(...le(e.variables))),"body"in e&&r.push("-",...e.body),r.join(this.eol)}};function le(t){let e=t.slice();return e.sort(pe),e.flatMap(r=>[c(`$${r.name}.insertionFormatter`,r.insertionFormatters),c(`$${r.name}.wrapperPhrase`,r.wrapperPhrases),c(`$${r.name}.wrapperScope`,r.wrapperScope)]).filter(r=>r.length>0)}function c(t,e){return e==null?"":Array.isArray(e)?`${t}: ${e.join(" | ")}`:`${t}: ${e}`}function pe(t,e){return t.name==="0"?1:e.name==="0"?-1:t.name.localeCompare(e.name)}function D(t,e){let r=I(t);return M(r,e)}import*as S from"node:fs/promises";import*as L from"node:path";import*as p from"node:process";import Se from"get-stdin";function P(t){return t instanceof Error?t.message:String(t)}var w="Syntax error",$=class extends Error{constructor(r){let n=fe(r);super(ce(n));this.point=r;this.name="SyntaxError",this.location=n}point;location;getFileMessage(r){return this.location!=null?`${r}(${this.location}): ${w}`:`${r}: ${w}`}};function O(t){return t instanceof $}function ce(t){return t!=null?`${w} at ${t}.`:w}function fe(t){return t!=null?`${t.row+1}:${t.column+1}`:void 0}import*as m from"node:process";var ge="\x1B[0m",ue="\x1B[33m",me="\x1B[31m",de="[warn]",he="[error]";function v(t=!1){return be(m.stdout,m.stderr,t)}function be(t,e,r=!1){let n=ye(e)?(s,a)=>`${a}${s}${ge}`:(s,a)=>s,i,o;return r?(i=()=>{},o=()=>{}):(i=s=>{t.write(`${s} +`)},o=s=>{e.write(`${n(de,ue)} ${s} +`)}),{log:i,warn:o,error(s){e.write(`${n(he,me)} ${s} +`)}}}function ye(t){return"NO_COLOR"in m.env?!1:t.isTTY===!0}var d=class extends Error{constructor(r){super(`One or more file pattern errors occurred: ${r.join(` -`)}`);this.messages=r}name="FilePatternError"};import*as M from"editorconfig";async function v(t){let e=await M.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 E(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}import*as D from"node:path";var w=D.sep==="\\"?t=>t.replaceAll("\\","/"):t=>t;function W(){return{filePatterns:[],help:!1,version:!1,quiet:!1,debug:!1,check:!1}}function z(t){let e=W();for(let r=0;rxe(p,t.fileEndings));f.length===0&&i.push(`No files matching the pattern were found: ${s}`);for(let p of f)r.add(d.resolve(p))}if(i.length>0)throw new m(i);return Array.from(r).sort((s,a)=>s.localeCompare(a))}function ye(t){return t.length===1?t[0]:`{${t.join(",")}}`}function xe(t,e){let r=d.extname(t).slice(1);return e.includes(r)}var G=["--help","--version","--quiet","--check","--debug"];function H(t){process.stdout.write(`Usage: ${t.binName} [options] [file/dir/glob ...] +`)}`);this.messages=r}messages;name="FilePatternError"};import*as K from"editorconfig";async function A(t){let e=await K.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 E(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}import*as W from"node:path";var F=W.sep==="\\"?t=>t.replaceAll("\\","/"):t=>t;var T=["--help","--version","--quiet","--check","--debug"];function z(t){return T.includes(t)}function V(){return{filePatterns:[],help:!1,version:!1,quiet:!1,debug:!1,check:!1}}function U(t){let e=V();for(let r=0;rEe(u,t.fileEndings));g.length===0&&i.push(`No files matching the pattern were found: ${s}`);for(let u of g)r.add(h.resolve(u))}if(i.length>0)throw new d(i);return Array.from(r).toSorted((s,a)=>s.localeCompare(a))}function we(t){return t.length===1?t[0]:`{${t.join(",")}}`}function Ee(t,e){let r=h.extname(t).slice(1);return e.includes(r)}function q(t){process.stdout.write(`Usage: ${t.binName} [options] [file/dir/glob ...] `),process.stdout.write(` `),process.stdout.write(`Options: -`);for(let e of G)process.stdout.write(` ${e} -`)}var q={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 B(){process.stdout.write(`${q.version} -`)}function T(t){Reflect.set(process,"exitCode",t)}async function Y(t){let e=$();try{let r=z(c.argv.slice(2));e=$(r.quiet);let n=await Fe({cli:t,args:r,logger:e});T(n)}catch(r){if(r instanceof m)for(let n of r.messages)e.error(n);else e.error(_(r));T(2)}}async function Fe({cli:t,args:e,logger:r}){if(e.help)return H(t),0;if(e.version)return B(),0;if(e.filePatterns.length>0)return Se({cli:t,logger:r,check:e.check,debug:e.debug,filePatterns:e.filePatterns});if(!c.stdin.isTTY)return Pe({cli:t,logger:r,stdin:c.stdin,check:e.check,debug:e.debug});throw new Error("No input files specified. Use --help for usage information.")}async function Se({cli:t,logger:e,check:r,debug:n,filePatterns:i}){r&&e.log("Checking formatting...");let o=await X(t,i),[s,a]=await Le({cli:t,logger:e,check:r,debug:n,filePaths:o});if(r){if(s>0&&(e.warn(`Code style issues found in ${s} file(s).`),!a))return 1;a||e.log("All matched files use correct code style!")}return a?2:0}async function Le({cli:t,logger:e,check:r,debug:n,filePaths:i}){let o=0,s=!1;for(let a of i)try{await _e({cli:t,logger:e,check:r,debug:n,filePath:a})&&o++}catch(l){O(l)?e.error(l.getFileMessage(A(a))):e.error(`${A(a)}: ${_(l)}`),s=!0}return[o,s]}async function _e({cli:t,logger:e,check:r,debug:n,filePath:i}){try{let o=await v(i),s=await F.readFile(i,"utf8"),a=await t.format(s,o,i,n);return a===s?!1:(e.log(A(i)),r||await F.writeFile(i,a,"utf8"),!0)}catch(o){if(E(o))return!1;throw o}}function A(t){return w(S.relative(c.cwd(),t))}async function Pe({cli:t,logger:e,stdin:r,check:n,debug:i}){let o=await we({stdin:r}),a=`stdin.${t.getStdinFileEnding(o)}`,l=S.resolve(a),h=await v(l),f;try{f=await t.format(o,h,l,i)}catch(p){if(O(p))return e.error(p.getFileMessage("stdin")),2;throw p}return n?o!==f?(e.warn("Code style issues found in stdin."),1):0:(c.stdout.write(f),0)}var Q="snippet";Y({binName:"snippet-fmt",fileEndings:[Q],getStdinFileEnding(){return Q},format:async(t,e)=>{let r=j(t,e);return Promise.resolve(r)}}); +`);for(let e of T)process.stdout.write(` ${e} +`)}var J={name:"@cursorless/talon-tools",version:"0.11.0",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 typecheck && npm run lint:ts && npm run lint:fmt",typecheck:"tsc -p . --noEmit","lint:ts":"oxlint -c oxlint.config.mts --deny-warnings .","lint:fmt":"oxfmt --check .",fix:"npm run fix:ts && npm run fix:fmt","fix:ts":"oxlint -c oxlint.config.mts --fix .","fix:fmt":"oxfmt .",test:"tsx src/test/runAllTests.ts","test:subset":"tsx src/test/runAllTests.ts --subset"},dependencies:{"@cursorless/tree-sitter-wasms":"^0.9.0",editorconfig:"^3.0.2","fast-glob":"^3.3.3","get-stdin":"^10.0.0","web-tree-sitter":"^0.26.8"},devDependencies:{"@types/mocha":"^10.0.10","@types/node":"^24.12.2",esbuild:"^0.28.0",mocha:"^11.7.5",oxfmt:"^0.47.0","oxlint-tsgolint":"^0.22.1",oxlint:"^1.62.0",tsx:"^4.21.0",typescript:"^6.0.3"}};function Y(){process.stdout.write(`${J.version} +`)}function N(t){Reflect.set(process,"exitCode",t)}async function Z(t){let e=v();try{let r=U(p.argv.slice(2));e=v(r.quiet);let n=await Le({cli:t,args:r,logger:e});N(n)}catch(r){if(r instanceof d)for(let n of r.messages)e.error(n);else e.error(P(r));N(2)}}function Le({cli:t,args:e,logger:r}){if(e.help)return q(t),Promise.resolve(0);if(e.version)return Y(),Promise.resolve(0);if(e.filePatterns.length>0)return _e({cli:t,logger:r,check:e.check,debug:e.debug,filePatterns:e.filePatterns});if(!p.stdin.isTTY)return Oe({cli:t,logger:r,stdin:p.stdin,check:e.check,debug:e.debug});throw new Error("No input files specified. Use --help for usage information.")}async function _e({cli:t,logger:e,check:r,debug:n,filePatterns:i}){r&&e.log("Checking formatting...");let o=await H(t,i),[s,a]=await Pe({cli:t,logger:e,check:r,debug:n,filePaths:o});if(r){if(s>0&&(e.warn(`Code style issues found in ${s} file(s).`),!a))return 1;a||e.log("All matched files use correct code style!")}return a?2:0}async function Pe({cli:t,logger:e,check:r,debug:n,filePaths:i}){let o=0,s=!1;for(let a of i)try{await $e({cli:t,logger:e,check:r,debug:n,filePath:a})&&o++}catch(l){O(l)?e.error(l.getFileMessage(C(a))):e.error(`${C(a)}: ${P(l)}`),s=!0}return[o,s]}async function $e({cli:t,logger:e,check:r,debug:n,filePath:i}){try{let o=await A(i),s=await S.readFile(i,"utf8"),a=await t.format(s,o,i,n);return a===s?!1:(e.log(C(i)),r||await S.writeFile(i,a,"utf8"),!0)}catch(o){if(E(o))return!1;throw o}}function C(t){return F(L.relative(p.cwd(),t))}async function Oe({cli:t,logger:e,stdin:r,check:n,debug:i}){let o=await Se({stdin:r}),a=`stdin.${t.getStdinFileEnding(o)}`,l=L.resolve(a),b=await A(l),f;try{f=await t.format(o,b,l,i)}catch(g){if(O(g))return e.error(g.getFileMessage("stdin")),2;throw g}return n?o!==f?(e.warn("Code style issues found in stdin."),1):0:(p.stdout.write(f),0)}var ee="snippet";Z({binName:"snippet-fmt",fileEndings:[ee],getStdinFileEnding(){return ee},format:(t,e)=>{let r=D(t,e);return Promise.resolve(r)}}); //# sourceMappingURL=snippetFormatter.js.map diff --git a/dist/snippetFormatter.js.map b/dist/snippetFormatter.js.map index 2f2c7d1..92cc885 100644 --- a/dist/snippetFormatter.js.map +++ b/dist/snippetFormatter.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/snippet/parseSnippetFile.ts", "../src/util/constants.ts", "../src/util/getEndOfLine.ts", "../src/snippet/serializeSnippetFile.ts", "../src/snippet/snippetFormatter.ts", "../src/node/cli.ts", "../src/util/getErrorMessage.ts", "../src/util/SyntaxError.ts", "../src/node/createLogger.ts", "../src/node/FilePatternError.ts", "../src/node/getOptionsFromConfig.ts", "../src/node/isMissingFileError.ts", "../src/node/normalizeToPosix.ts", "../src/node/getDefaultArguments.ts", "../src/node/parseArgs.ts", "../src/node/parseFilePatterns.ts", "../src/node/lstatSafe.ts", "../src/types.ts", "../src/node/printHelp.ts", "../package.json", "../src/node/printVersion.ts", "../src/node/setExitCode.ts", "../src/node/snippetFormatter.ts"], - "sourcesContent": ["import type { Snippet, SnippetFile, SnippetVariable } from \"./snippetTypes.js\";\n\nexport function parseSnippetFile(content: string): SnippetFile {\n const documentContents = content.split(/^---$/m);\n const file: SnippetFile = { snippets: [] };\n\n for (const text of documentContents) {\n const match = text.match(/^-$/m);\n const contextText = match != null ? text.slice(0, match.index) : text;\n const bodyText =\n match != null ? text.slice(match.index! + match[0].length) : null;\n const body = bodyText ? parseBody(bodyText) : null;\n let context = parseContext(contextText);\n\n // Snippet with body\n if (body != null) {\n if (context == null) {\n context = { variables: [] };\n }\n const { variables, ...rest } = context;\n file.snippets.push({ ...rest, body, variables });\n }\n // Header without body\n else if (context != null) {\n if (file.header != null || file.snippets.length !== 0) {\n throw Error(\"Header snippet must be first in file\");\n }\n file.header = context;\n }\n }\n\n return file;\n}\n\ntype Context = Omit;\n\nfunction parseContext(text: string): Context | undefined {\n const document: Context = { variables: [] };\n const pairs = parseContextPairs(text);\n\n if (Object.keys(pairs).length === 0) {\n return undefined;\n }\n\n const variables: Record = {};\n\n for (const [key, value] of Object.entries(pairs)) {\n switch (key) {\n case \"name\":\n document.name = value;\n break;\n case \"description\":\n document.description = value;\n break;\n case \"phrase\":\n document.phrases = parseVectorValue(value);\n break;\n case \"insertionScope\":\n document.insertionScopes = parseVectorValue(value);\n break;\n case \"language\":\n document.languages = parseVectorValue(value);\n break;\n default:\n if (!key.startsWith(\"$\")) {\n throw Error(`Invalid key '${key}'`);\n }\n variables[key] = value;\n }\n }\n\n document.variables = parseVariables(variables);\n\n return document;\n}\n\nfunction parseContextPairs(text: string): Record {\n const lines = text\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const pairs: Record = {};\n\n for (const line of lines) {\n const parts = line.split(\":\");\n if (parts.length !== 2) {\n throw Error(`Invalid line '${line}'`);\n }\n const key = parts[0].trim();\n const value = parts[1].trim();\n if (key.length === 0 || value.length === 0) {\n throw Error(`Invalid line '${line}'`);\n }\n if (pairs[key] != null) {\n throw Error(`Duplicate key '${key}' in '${text}'`);\n }\n pairs[key] = value;\n }\n\n return pairs;\n}\n\nfunction parseVariables(variables: Record): SnippetVariable[] {\n const variablesMap: Record = {};\n\n const getVariable = (name: string): SnippetVariable => {\n if (variablesMap[name] == null) {\n variablesMap[name] = { name };\n }\n return variablesMap[name];\n };\n\n for (const [key, value] of Object.entries(variables)) {\n const parts = key.split(\".\");\n if (parts.length !== 2) {\n throw Error(`Invalid variable key '${key}'`);\n }\n const name = parts[0].slice(1);\n const field = parts[1];\n switch (field) {\n case \"insertionFormatter\":\n getVariable(name).insertionFormatters = parseVectorValue(value);\n break;\n case \"wrapperPhrase\":\n getVariable(name).wrapperPhrases = parseVectorValue(value);\n break;\n case \"wrapperScope\":\n getVariable(name).wrapperScope = value;\n break;\n default:\n throw Error(`Invalid variable key '${key}'`);\n }\n }\n\n return Object.values(variablesMap);\n}\n\nfunction parseBody(text: string): string[] | undefined {\n // Find first line that is not empty. Preserve indentation.\n const matchLeading = text.match(/^[ \\t]*\\S/m);\n if (matchLeading?.index == null) {\n return undefined;\n }\n return text\n .slice(matchLeading.index)\n .trimEnd()\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd());\n}\n\nfunction parseVectorValue(value: string): string[] {\n return value.split(\"|\").map((v) => v.trim());\n}\n", "// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport type {\n Snippet,\n SnippetFile,\n SnippetHeader,\n SnippetVariable,\n} from \"./snippetTypes.js\";\n\nexport type Options = FormatterOptions<\"endOfLine\" | \"insertFinalNewline\">;\n\nexport function serializeSnippetFile(\n snippetFile: SnippetFile,\n options: Options = {},\n): string {\n const eol = getEndOfLine(options.endOfLine);\n const serializer = new SnippetSerializer(\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n );\n return serializer.getText(snippetFile);\n}\n\nclass SnippetSerializer {\n constructor(\n private eol: string,\n private insertFinalNewline: boolean,\n ) {}\n\n getText(snippetFile: SnippetFile): string {\n const docDelimiter = \"---\";\n const documents: string[] = [];\n\n if (snippetFile.header != null) {\n documents.push(this.getDocumentText(snippetFile.header));\n }\n\n documents.push(\n ...snippetFile.snippets.map(this.getDocumentText.bind(this)),\n );\n\n const result = documents\n .filter((d) => d.length > 0)\n .join(`${this.eol}${docDelimiter}${this.eol}${this.eol}`);\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return result + `${this.eol}${docDelimiter}${this.eol}`;\n }\n\n return result + `${this.eol}${docDelimiter}`;\n }\n\n private getDocumentText(document: SnippetHeader | Snippet): string {\n const lines: string[] = [\n getOptionalPairString(\"name\", document.name),\n getOptionalPairString(\"description\", document.description),\n getOptionalPairString(\"language\", document.languages),\n getOptionalPairString(\"phrase\", document.phrases),\n getOptionalPairString(\"insertionScope\", document.insertionScopes),\n ].filter(Boolean);\n\n if (document.variables.length > 0) {\n if (lines.length > 0) {\n lines.push(\"\");\n }\n lines.push(...getSortedVariables(document.variables));\n }\n\n if (\"body\" in document) {\n lines.push(\"-\", ...document.body);\n }\n\n return lines.join(this.eol);\n }\n}\n\nfunction getSortedVariables(variables: SnippetVariable[]): string[] {\n const result = variables.slice();\n result.sort(compareVariables);\n return result\n .flatMap((variable) => [\n getOptionalPairString(\n `$${variable.name}.insertionFormatter`,\n variable.insertionFormatters,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperPhrase`,\n variable.wrapperPhrases,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperScope`,\n variable.wrapperScope,\n ),\n ])\n .filter((v) => v.length > 0);\n}\n\nfunction getOptionalPairString(\n key: string,\n value: string | string[] | undefined,\n): string {\n if (value == null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return `${key}: ${value.join(\" | \")}`;\n }\n return `${key}: ${value}`;\n}\n\nfunction compareVariables(a: SnippetVariable, b: SnippetVariable): number {\n if (a.name === \"0\") {\n return 1;\n }\n if (b.name === \"0\") {\n return -1;\n }\n return a.name.localeCompare(b.name);\n}\n", "import { parseSnippetFile } from \"./parseSnippetFile.js\";\nimport { serializeSnippetFile } from \"./serializeSnippetFile.js\";\nimport type { Options } from \"./serializeSnippetFile.js\";\n\nexport function snippetFormatter(text: string, options?: Options): string {\n const snippetFile = parseSnippetFile(text);\n return serializeSnippetFile(snippetFile, options);\n}\n", "import getStdin from \"get-stdin\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as process from \"node:process\";\nimport type { Readable } from \"node:stream\";\nimport type { CLI, Logger, ParsedArgs } from \"../types.js\";\nimport {\n EXIT_ERROR,\n EXIT_FAIL,\n EXIT_OK,\n type ExitCode,\n} from \"../util/constants.js\";\nimport { getErrorMessage } from \"../util/getErrorMessage.js\";\nimport { isSyntaxError } from \"../util/SyntaxError.js\";\nimport { createLogger } from \"./createLogger.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { getOptionsFromConfig } from \"./getOptionsFromConfig.js\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\nimport { parseArgs } from \"./parseArgs.js\";\nimport { parseFilePatterns } from \"./parseFilePatterns.js\";\nimport { printHelp } from \"./printHelp.js\";\nimport { printVersion } from \"./printVersion.js\";\nimport { setExitCode } from \"./setExitCode.js\";\n\nexport async function main(cli: CLI): Promise {\n let logger = createLogger();\n\n try {\n const args = parseArgs(process.argv.slice(2));\n logger = createLogger(args.quiet);\n const exitCode = await mainUnsafe({ cli, args, logger });\n setExitCode(exitCode);\n } catch (error) {\n if (error instanceof FilePatternError) {\n for (const message of error.messages) {\n logger.error(message);\n }\n } else {\n logger.error(getErrorMessage(error));\n }\n setExitCode(EXIT_ERROR);\n }\n}\n\ninterface MainUnsafeArgs {\n cli: CLI;\n args: ParsedArgs;\n logger: Logger;\n}\n\nasync function mainUnsafe({\n cli,\n args,\n logger,\n}: MainUnsafeArgs): Promise {\n if (args.help) {\n printHelp(cli);\n return EXIT_OK;\n }\n\n if (args.version) {\n printVersion();\n return EXIT_OK;\n }\n\n const hasFilePatterns = args.filePatterns.length > 0;\n\n if (hasFilePatterns) {\n return mainFormatFiles({\n cli,\n logger,\n check: args.check,\n debug: args.debug,\n filePatterns: args.filePatterns,\n });\n }\n\n // If no file patterns are provided, check if there's input from stdin.\n // If stdin TTY it's an interactive terminal, so we shouldn't read from it.\n if (!process.stdin.isTTY) {\n return mainFormatStdin({\n cli,\n logger,\n stdin: process.stdin,\n check: args.check,\n debug: args.debug,\n });\n }\n\n throw new Error(\n \"No input files specified. Use --help for usage information.\",\n );\n}\n\ninterface MainFormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePatterns: string[];\n}\n\nasync function mainFormatFiles({\n cli,\n logger,\n check,\n debug,\n filePatterns,\n}: MainFormatFilesArgs): Promise {\n if (check) {\n logger.log(\"Checking formatting...\");\n }\n\n const filePaths = await parseFilePatterns(cli, filePatterns);\n const [changedFileCount, hasError] = await formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n });\n\n if (check) {\n if (changedFileCount > 0) {\n logger.warn(\n `Code style issues found in ${changedFileCount} file(s).`,\n );\n if (!hasError) {\n return EXIT_FAIL;\n }\n }\n\n if (!hasError) {\n logger.log(\"All matched files use correct code style!\");\n }\n }\n\n if (hasError) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\ninterface FormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePaths: string[];\n}\n\nexport async function formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n}: FormatFilesArgs): Promise<[number, boolean]> {\n let changedFileCount = 0;\n let hasError = false;\n\n for (const filePath of filePaths) {\n try {\n const fileWasChanged = await formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n });\n if (fileWasChanged) {\n changedFileCount++;\n }\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(getDisplayPath(filePath)));\n } else {\n logger.error(\n `${getDisplayPath(filePath)}: ${getErrorMessage(error)}`,\n );\n }\n hasError = true;\n }\n }\n\n return [changedFileCount, hasError];\n}\n\ninterface FormatFileArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePath: string;\n}\n\nexport async function formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n}: FormatFileArgs): Promise {\n try {\n const options = await getOptionsFromConfig(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const formatted = await cli.format(content, options, filePath, debug);\n\n if (formatted === content) {\n return false;\n }\n\n logger.log(getDisplayPath(filePath));\n\n if (!check) {\n await fs.writeFile(filePath, formatted, \"utf8\");\n }\n\n return true;\n } catch (error) {\n if (isMissingFileError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction getDisplayPath(filePath: string): string {\n return normalizeToPosix(path.relative(process.cwd(), filePath));\n}\n\ninterface MainFormatStdinArgs {\n cli: CLI;\n logger: Logger;\n stdin: Readable;\n check: boolean;\n debug: boolean;\n}\n\nexport async function mainFormatStdin({\n cli,\n logger,\n stdin,\n check,\n debug,\n}: MainFormatStdinArgs): Promise {\n const input = await getStdin({ stdin });\n const fileEnding = cli.getStdinFileEnding(input);\n const fauxFileName = `stdin.${fileEnding}`;\n const fauxFilePath = path.resolve(fauxFileName);\n const options = await getOptionsFromConfig(fauxFilePath);\n let formatted: string;\n\n try {\n formatted = await cli.format(input, options, fauxFilePath, debug);\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(\"stdin\"));\n return EXIT_ERROR;\n }\n throw error;\n }\n\n if (check) {\n if (input !== formatted) {\n logger.warn(\"Code style issues found in stdin.\");\n return EXIT_FAIL;\n }\n\n return EXIT_OK;\n }\n\n process.stdout.write(formatted);\n\n return EXIT_OK;\n}\n", "export function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n constructor(private point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import * as process from \"node:process\";\nimport type { WriteStream } from \"node:tty\";\nimport type { Logger, LoggerEntry, TestLogger } from \"../types.js\";\n\ntype LogCallback = (message: string) => void;\ntype ColorizeCallback = (message: string, color: string) => string;\ntype LoggerStream = Pick & Partial;\n\nconst ANSI_RESET = \"\\u001b[0m\";\nconst ANSI_YELLOW = \"\\u001b[33m\";\nconst ANSI_RED = \"\\u001b[31m\";\nconst WARN_PREFIX = \"[warn]\";\nconst ERROR_PREFIX = \"[error]\";\n\nexport function createLogger(quiet: boolean = false): Logger {\n return createLoggerFromStreams(process.stdout, process.stderr, quiet);\n}\n\nexport function createLoggerFromStreams(\n stdout: LoggerStream,\n stderr: LoggerStream,\n quiet: boolean = false,\n): Logger {\n const colorize: ColorizeCallback = shouldUseColor(stderr)\n ? (message, color) => `${color}${message}${ANSI_RESET}`\n : (message, _color) => message;\n\n let log: LogCallback;\n let warn: LogCallback;\n\n if (quiet) {\n log = () => {};\n warn = () => {};\n } else {\n log = (message: string) => {\n stdout.write(`${message}\\n`);\n };\n warn = (message: string) => {\n stderr.write(`${colorize(WARN_PREFIX, ANSI_YELLOW)} ${message}\\n`);\n };\n }\n\n return {\n log,\n warn,\n error(message: string) {\n stderr.write(`${colorize(ERROR_PREFIX, ANSI_RED)} ${message}\\n`);\n },\n };\n}\n\nexport function createTestLogger(): TestLogger {\n const entries: LoggerEntry[] = [];\n\n return {\n log(message: string) {\n entries.push({ level: \"log\", message });\n },\n warn(message: string) {\n entries.push({ level: \"warn\", message });\n },\n error(message: string) {\n entries.push({ level: \"error\", message });\n },\n getEntries() {\n return entries;\n },\n };\n}\n\nfunction shouldUseColor(stream: LoggerStream): boolean {\n if (\"NO_COLOR\" in process.env) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n", "export class FilePatternError extends Error {\n name = \"FilePatternError\";\n\n constructor(public messages: string[]) {\n super(\n `One or more file pattern errors occurred:\\n${messages.join(\"\\n\")}`,\n );\n }\n}\n", "import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n", "export function isMissingFileError(\n error: unknown,\n): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import * as path from \"node:path\";\n\n/**\n * Replace `\\` with `/` on Windows\n * @param {string} filepath\n * @returns {string}\n */\nexport const normalizeToPosix =\n path.sep === \"\\\\\"\n ? (filepath: string) => filepath.replaceAll(\"\\\\\", \"/\")\n : (filepath: string) => filepath;\n", "import type { ParsedArgs } from \"../types.js\";\n\nexport function getDefaultArguments(): ParsedArgs {\n return {\n filePatterns: [],\n help: false,\n version: false,\n quiet: false,\n debug: false,\n check: false,\n };\n}\n", "import type { KnownArgument, ParsedArgs } from \"../types.js\";\nimport { getDefaultArguments } from \"./getDefaultArguments.js\";\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result = getDefaultArguments();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === \"--\") {\n // All following arguments are treated as file patterns, even if they start with \"--\"\n result.filePatterns.push(...argv.slice(i + 1));\n break;\n }\n\n if (parseKnownArgument(result, arg as KnownArgument)) {\n continue;\n }\n\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n result.filePatterns.push(arg);\n }\n\n return result;\n}\n\nfunction parseKnownArgument(result: ParsedArgs, arg: KnownArgument): boolean {\n switch (arg) {\n case \"--help\":\n result.help = true;\n return true;\n case \"--version\":\n result.version = true;\n return true;\n case \"--quiet\":\n result.quiet = true;\n return true;\n case \"--check\":\n result.check = true;\n return true;\n case \"--debug\":\n result.debug = true;\n return true;\n default:\n return false;\n }\n}\n", "import type { Options } from \"fast-glob\";\nimport fastGlob from \"fast-glob\";\nimport * as path from \"node:path\";\nimport type { CLI } from \"../types.js\";\nimport { GLOB_IGNORE_PATTERNS } from \"../util/constants.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { lstatSafe } from \"./lstatSafe.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\n\nexport async function parseFilePatterns(\n cli: CLI,\n filePatterns: string[],\n): Promise {\n const seen: Set = new Set();\n const globFileEndingPattern = getGlobFileEndingsPattern(cli.fileEndings);\n const errorMessages: string[] = [];\n\n const globOptions: Options = {\n dot: true,\n followSymbolicLinks: false,\n ignore: GLOB_IGNORE_PATTERNS,\n };\n\n for (const pattern of filePatterns) {\n const absolutePath = path.resolve(pattern);\n const stat = await lstatSafe(absolutePath);\n\n if (stat != null) {\n if (stat.isSymbolicLink()) {\n errorMessages.push(\n `Specified pattern is a symbolic link: ${pattern}`,\n );\n continue;\n }\n\n if (stat.isFile()) {\n seen.add(absolutePath);\n continue;\n }\n\n if (stat.isDirectory()) {\n const files = await fastGlob(`**/*.${globFileEndingPattern}`, {\n ...globOptions,\n cwd: absolutePath,\n });\n if (files.length === 0) {\n errorMessages.push(\n `No matching files were found in the directory: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(absolutePath, file));\n }\n continue;\n }\n }\n\n const glob = normalizeToPosix(pattern);\n const files = (await fastGlob(glob, globOptions)).filter((file) =>\n hasSupportedFileEnding(file, cli.fileEndings),\n );\n if (files.length === 0) {\n errorMessages.push(\n `No files matching the pattern were found: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(file));\n }\n }\n\n if (errorMessages.length > 0) {\n throw new FilePatternError(errorMessages);\n }\n\n return Array.from(seen).sort((a, b) => a.localeCompare(b));\n}\n\nfunction getGlobFileEndingsPattern(fileEndings: readonly string[]): string {\n return fileEndings.length === 1\n ? fileEndings[0]\n : `{${fileEndings.join(\",\")}}`;\n}\n\nfunction hasSupportedFileEnding(\n file: string,\n fileEndings: readonly string[],\n): boolean {\n const extension = path.extname(file).slice(1);\n return fileEndings.includes(extension);\n}\n", "import type { Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\n\nexport async function lstatSafe(filePath: string): Promise {\n try {\n return await fs.lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import type { KnownProps } from \"editorconfig\";\n\nexport const KNOWN_ARGUMENTS = [\n \"--help\",\n \"--version\",\n \"--quiet\",\n \"--check\",\n \"--debug\",\n] as const;\n\nexport type KnownArgument = (typeof KNOWN_ARGUMENTS)[number];\n\nexport interface CLI {\n binName: \"snippet-fmt\" | \"talon-fmt\" | \"tree-sitter-fmt\";\n fileEndings: readonly string[];\n\n getStdinFileEnding(text: string): string;\n format(\n text: string,\n options: Options,\n filePath: string,\n debug: boolean,\n ): Promise;\n}\n\nexport type EndOfLine = \"lf\" | \"crlf\";\n\nexport interface Options {\n endOfLine?: EndOfLine;\n indentTabs?: boolean;\n indentSize?: number;\n maxLineLength?: number;\n columnWidth?: number;\n insertFinalNewline?: boolean;\n preserveMultiline?: boolean;\n}\n\nexport type FormatterOptions = Pick;\n\nexport interface ParsedArgs {\n filePatterns: string[];\n help: boolean;\n version: boolean;\n check: boolean;\n quiet: boolean;\n debug: boolean;\n}\n\nexport interface LoggerEntry {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface Logger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface TestLogger extends Logger {\n getEntries(): readonly LoggerEntry[];\n}\n\nexport interface DebugLogger {\n debug(message: string): void;\n}\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport interface EditorConfigOptions extends KnownProps {\n max_line_length?: number | \"unset\";\n column_width?: number | \"unset\";\n preserve_multiline?: boolean | \"unset\";\n}\n\nexport interface Point {\n row: number;\n column: number;\n}\n\n/**\n * Internal representation of the Tree sitter node. Used so that our api doesn't\n * need to export or expose clients to Tree sitter types. Also makes it simple\n * to write tests internally.\n */\nexport interface SyntaxNode {\n id: number;\n text: string;\n type: string;\n startPosition: Point;\n endPosition: Point;\n hasError: boolean;\n isError: boolean;\n isMissing: boolean;\n parent: SyntaxNode | null;\n children: SyntaxNode[];\n}\n", "import type { CLI } from \"../types.js\";\nimport { KNOWN_ARGUMENTS } from \"../types.js\";\n\nexport function printHelp(cli: CLI) {\n process.stdout.write(\n `Usage: ${cli.binName} [options] [file/dir/glob ...]\\n`,\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(\"Options:\\n\");\n\n for (const option of KNOWN_ARGUMENTS) {\n process.stdout.write(` ${option}\\n`);\n }\n}\n", "{\n \"name\": \"@cursorless/talon-tools\",\n \"version\": \"0.10.2\",\n \"description\": \"Linting and formatting tools for Talon and Cursorless\",\n \"author\": \"Cursorless Dev\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"!dist/test\",\n \"!dist/build.*\"\n ],\n \"types\": \"./dist/lib.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/lib.d.ts\",\n \"default\": \"./dist/lib.js\"\n },\n \"./node\": {\n \"types\": \"./dist/node/libNode.d.ts\",\n \"default\": \"./dist/libNode.js\"\n }\n },\n \"bin\": {\n \"snippet-fmt\": \"dist/snippetFormatter.js\",\n \"talon-fmt\": \"dist/talonFormatter.js\",\n \"tree-sitter-fmt\": \"dist/treeSitterFormatter.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cursorless-dev/talon-tools.git\"\n },\n \"funding\": \"https://github.com/sponsors/cursorless-dev\",\n \"sponsor\": {\n \"url\": \"https://github.com/sponsors/cursorless-dev\"\n },\n \"scripts\": {\n \"build\": \"npm run clean && tsc -p . && tsx ./src/build.ts\",\n \"clean\": \"rm -rf dist/*\",\n \"lint\": \"npm run lint:ts &&npm run lint:fmt\",\n \"lint:ts\": \"tsc -p . --noEmit && eslint src\",\n \"lint:fmt\": \"prettier --check .\",\n \"fix\": \"npm run fix:ts && npm run fix:fmt\",\n \"fix:ts\": \"eslint src --fix\",\n \"fix:fmt\": \"prettier --write --list-different .\",\n \"test\": \"tsx src/test/runAllTests.ts\",\n \"test:subset\": \"tsx src/test/runAllTests.ts --subset\"\n },\n \"dependencies\": {\n \"@cursorless/tree-sitter-wasms\": \"^0.7.0\",\n \"editorconfig\": \"^3.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"get-stdin\": \"^10.0.0\",\n \"web-tree-sitter\": \"^0.26.7\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.4\",\n \"@types/mocha\": \"^10.0.10\",\n \"@types/node\": \"^24.12.0\",\n \"esbuild\": \"^0.27.4\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-import\": \"^2.32.0\",\n \"eslint\": \"^9.39.4\",\n \"jiti\": \"^2.6.1\",\n \"mocha\": \"^11.7.5\",\n \"prettier\": \"^3.8.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript-eslint\": \"^8.57.1\",\n \"typescript\": \"^5.9.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function printVersion() {\n process.stdout.write(`${packageJson.version}\\n`);\n}\n", "export function setExitCode(code: number): void {\n Reflect.set(process, \"exitCode\", code);\n}\n", "#!/usr/bin/env node\n\nimport { snippetFormatter } from \"../snippet/snippetFormatter.js\";\nimport { main } from \"./cli.js\";\n\nconst fileEnding = \"snippet\";\n\nvoid main({\n binName: \"snippet-fmt\",\n fileEndings: [fileEnding],\n\n getStdinFileEnding() {\n return fileEnding;\n },\n\n format: async (text, options) => {\n const updated = snippetFormatter(text, options);\n return Promise.resolve(updated);\n },\n});\n"], - "mappings": ";AAEO,SAASA,EAAiBC,EAA8B,CAC3D,IAAMC,EAAmBD,EAAQ,MAAM,QAAQ,EACzCE,EAAoB,CAAE,SAAU,CAAC,CAAE,EAEzC,QAAWC,KAAQF,EAAkB,CACjC,IAAMG,EAAQD,EAAK,MAAM,MAAM,EACzBE,EAAcD,GAAS,KAAOD,EAAK,MAAM,EAAGC,EAAM,KAAK,EAAID,EAC3DG,EACFF,GAAS,KAAOD,EAAK,MAAMC,EAAM,MAASA,EAAM,CAAC,EAAE,MAAM,EAAI,KAC3DG,EAAOD,EAAWE,GAAUF,CAAQ,EAAI,KAC1CG,EAAUC,GAAaL,CAAW,EAGtC,GAAIE,GAAQ,KAAM,CACVE,GAAW,OACXA,EAAU,CAAE,UAAW,CAAC,CAAE,GAE9B,GAAM,CAAE,UAAAE,EAAW,GAAGC,CAAK,EAAIH,EAC/BP,EAAK,SAAS,KAAK,CAAE,GAAGU,EAAM,KAAAL,EAAM,UAAAI,CAAU,CAAC,CACnD,SAESF,GAAW,KAAM,CACtB,GAAIP,EAAK,QAAU,MAAQA,EAAK,SAAS,SAAW,EAChD,MAAM,MAAM,sCAAsC,EAEtDA,EAAK,OAASO,CAClB,CACJ,CAEA,OAAOP,CACX,CAIA,SAASQ,GAAaP,EAAmC,CACrD,IAAMU,EAAoB,CAAE,UAAW,CAAC,CAAE,EACpCC,EAAQC,GAAkBZ,CAAI,EAEpC,GAAI,OAAO,KAAKW,CAAK,EAAE,SAAW,EAC9B,OAGJ,IAAMH,EAAoC,CAAC,EAE3C,OAAW,CAACK,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAK,EAC3C,OAAQE,EAAK,CACT,IAAK,OACDH,EAAS,KAAOI,EAChB,MACJ,IAAK,cACDJ,EAAS,YAAcI,EACvB,MACJ,IAAK,SACDJ,EAAS,QAAUK,EAAiBD,CAAK,EACzC,MACJ,IAAK,iBACDJ,EAAS,gBAAkBK,EAAiBD,CAAK,EACjD,MACJ,IAAK,WACDJ,EAAS,UAAYK,EAAiBD,CAAK,EAC3C,MACJ,QACI,GAAI,CAACD,EAAI,WAAW,GAAG,EACnB,MAAM,MAAM,gBAAgBA,CAAG,GAAG,EAEtCL,EAAUK,CAAG,EAAIC,CACzB,CAGJ,OAAAJ,EAAS,UAAYM,GAAeR,CAAS,EAEtCE,CACX,CAEA,SAASE,GAAkBZ,EAAsC,CAC7D,IAAMiB,EAAQjB,EACT,MAAM,OAAO,EACb,IAAKkB,GAAMA,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACbP,EAAgC,CAAC,EAEvC,QAAWQ,KAAQF,EAAO,CACtB,IAAMG,EAAQD,EAAK,MAAM,GAAG,EAC5B,GAAIC,EAAM,SAAW,EACjB,MAAM,MAAM,iBAAiBD,CAAI,GAAG,EAExC,IAAMN,EAAMO,EAAM,CAAC,EAAE,KAAK,EACpBN,EAAQM,EAAM,CAAC,EAAE,KAAK,EAC5B,GAAIP,EAAI,SAAW,GAAKC,EAAM,SAAW,EACrC,MAAM,MAAM,iBAAiBK,CAAI,GAAG,EAExC,GAAIR,EAAME,CAAG,GAAK,KACd,MAAM,MAAM,kBAAkBA,CAAG,SAASb,CAAI,GAAG,EAErDW,EAAME,CAAG,EAAIC,CACjB,CAEA,OAAOH,CACX,CAEA,SAASK,GAAeR,EAAsD,CAC1E,IAAMa,EAAgD,CAAC,EAEjDC,EAAeC,IACbF,EAAaE,CAAI,GAAK,OACtBF,EAAaE,CAAI,EAAI,CAAE,KAAAA,CAAK,GAEzBF,EAAaE,CAAI,GAG5B,OAAW,CAACV,EAAKC,CAAK,IAAK,OAAO,QAAQN,CAAS,EAAG,CAClD,IAAMY,EAAQP,EAAI,MAAM,GAAG,EAC3B,GAAIO,EAAM,SAAW,EACjB,MAAM,MAAM,yBAAyBP,CAAG,GAAG,EAE/C,IAAMU,EAAOH,EAAM,CAAC,EAAE,MAAM,CAAC,EAE7B,OADcA,EAAM,CAAC,EACN,CACX,IAAK,qBACDE,EAAYC,CAAI,EAAE,oBAAsBR,EAAiBD,CAAK,EAC9D,MACJ,IAAK,gBACDQ,EAAYC,CAAI,EAAE,eAAiBR,EAAiBD,CAAK,EACzD,MACJ,IAAK,eACDQ,EAAYC,CAAI,EAAE,aAAeT,EACjC,MACJ,QACI,MAAM,MAAM,yBAAyBD,CAAG,GAAG,CACnD,CACJ,CAEA,OAAO,OAAO,OAAOQ,CAAY,CACrC,CAEA,SAAShB,GAAUL,EAAoC,CAEnD,IAAMwB,EAAexB,EAAK,MAAM,YAAY,EAC5C,GAAIwB,GAAc,OAAS,KAG3B,OAAOxB,EACF,MAAMwB,EAAa,KAAK,EACxB,QAAQ,EACR,MAAM,OAAO,EACb,IAAKN,GAAMA,EAAE,QAAQ,CAAC,CAC/B,CAEA,SAASH,EAAiBD,EAAyB,CAC/C,OAAOA,EAAM,MAAM,GAAG,EAAE,IAAKW,GAAMA,EAAE,KAAK,CAAC,CAC/C,CC3IO,IAAMC,GAAiB,CAC1B,OACA,OACA,MACA,eACA,aACJ,EAEaC,EAAuBD,GAAe,IAC9CE,GAAY,MAAMA,CAAO,KAC9B,ECrBO,SAASC,EAAaC,EAAyB,CAClD,OAAOA,IAAQ,OAAS;AAAA,EAAS;AAAA,CACrC,CCQO,SAASC,EACZC,EACAC,EAAmB,CAAC,EACd,CACN,IAAMC,EAAMC,EAAaF,EAAQ,SAAS,EAK1C,OAJmB,IAAIG,EACnBF,EACAD,EAAQ,oBAAsB,EAClC,EACkB,QAAQD,CAAW,CACzC,CAEA,IAAMI,EAAN,KAAwB,CACpB,YACYF,EACAG,EACV,CAFU,SAAAH,EACA,wBAAAG,CACT,CAEH,QAAQL,EAAkC,CAEtC,IAAMM,EAAsB,CAAC,EAEzBN,EAAY,QAAU,MACtBM,EAAU,KAAK,KAAK,gBAAgBN,EAAY,MAAM,CAAC,EAG3DM,EAAU,KACN,GAAGN,EAAY,SAAS,IAAI,KAAK,gBAAgB,KAAK,IAAI,CAAC,CAC/D,EAEA,IAAMO,EAASD,EACV,OAAQE,GAAMA,EAAE,OAAS,CAAC,EAC1B,KAAK,GAAG,KAAK,GAAG,MAAkB,KAAK,GAAG,GAAG,KAAK,GAAG,EAAE,EAE5D,OAAID,EAAO,SAAW,EACX,GAGP,KAAK,mBACEA,EAAS,GAAG,KAAK,GAAG,MAAkB,KAAK,GAAG,GAGlDA,EAAS,GAAG,KAAK,GAAG,KAC/B,CAEQ,gBAAgBE,EAA2C,CAC/D,IAAMC,EAAkB,CACpBC,EAAsB,OAAQF,EAAS,IAAI,EAC3CE,EAAsB,cAAeF,EAAS,WAAW,EACzDE,EAAsB,WAAYF,EAAS,SAAS,EACpDE,EAAsB,SAAUF,EAAS,OAAO,EAChDE,EAAsB,iBAAkBF,EAAS,eAAe,CACpE,EAAE,OAAO,OAAO,EAEhB,OAAIA,EAAS,UAAU,OAAS,IACxBC,EAAM,OAAS,GACfA,EAAM,KAAK,EAAE,EAEjBA,EAAM,KAAK,GAAGE,GAAmBH,EAAS,SAAS,CAAC,GAGpD,SAAUA,GACVC,EAAM,KAAK,IAAK,GAAGD,EAAS,IAAI,EAG7BC,EAAM,KAAK,KAAK,GAAG,CAC9B,CACJ,EAEA,SAASE,GAAmBC,EAAwC,CAChE,IAAMN,EAASM,EAAU,MAAM,EAC/B,OAAAN,EAAO,KAAKO,EAAgB,EACrBP,EACF,QAASQ,GAAa,CACnBJ,EACI,IAAII,EAAS,IAAI,sBACjBA,EAAS,mBACb,EACAJ,EACI,IAAII,EAAS,IAAI,iBACjBA,EAAS,cACb,EACAJ,EACI,IAAII,EAAS,IAAI,gBACjBA,EAAS,YACb,CACJ,CAAC,EACA,OAAQC,GAAMA,EAAE,OAAS,CAAC,CACnC,CAEA,SAASL,EACLM,EACAC,EACM,CACN,OAAIA,GAAS,KACF,GAEP,MAAM,QAAQA,CAAK,EACZ,GAAGD,CAAG,KAAKC,EAAM,KAAK,KAAK,CAAC,GAEhC,GAAGD,CAAG,KAAKC,CAAK,EAC3B,CAEA,SAASJ,GAAiBK,EAAoBC,EAA4B,CACtE,OAAID,EAAE,OAAS,IACJ,EAEPC,EAAE,OAAS,IACJ,GAEJD,EAAE,KAAK,cAAcC,EAAE,IAAI,CACtC,CCvHO,SAASC,EAAiBC,EAAcC,EAA2B,CACtE,IAAMC,EAAcC,EAAiBH,CAAI,EACzC,OAAOI,EAAqBF,EAAaD,CAAO,CACpD,CCPA,OAAOI,OAAc,YACrB,UAAYC,MAAQ,mBACpB,UAAYC,MAAU,YACtB,UAAYC,MAAa,eCHlB,SAASC,EAAgBC,EAAwB,CACpD,OAAOA,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAChE,CCAA,IAAMC,EAAe,eAERC,EAAN,cAA0B,KAAM,CAGnC,YAAoBC,EAAe,CAC/B,IAAMC,EAAWC,GAAYF,CAAK,EAClC,MAAMG,GAAWF,CAAQ,CAAC,EAFV,WAAAD,EAGhB,KAAK,KAAO,cACZ,KAAK,SAAWC,CACpB,CAPiB,SASjB,eAAeG,EAAsB,CACjC,OAAO,KAAK,UAAY,KAClB,GAAGA,CAAI,IAAI,KAAK,QAAQ,MAAMN,CAAY,GAC1C,GAAGM,CAAI,KAAKN,CAAY,EAClC,CACJ,EAEO,SAASO,EAAcC,EAAsC,CAChE,OAAOA,aAAiBP,CAC5B,CAEA,SAASI,GAAWF,EAAsC,CACtD,OAAOA,GAAY,KAAO,GAAGH,CAAY,OAAOG,CAAQ,IAAMH,CAClE,CAEA,SAASI,GAAYF,EAA8C,CAC/D,OAAOA,GAAS,KAAO,GAAGA,EAAM,IAAM,CAAC,IAAIA,EAAM,OAAS,CAAC,GAAK,MACpE,CC/BA,UAAYO,MAAa,eAQzB,IAAMC,GAAa,UACbC,GAAc,WACdC,GAAW,WACXC,GAAc,SACdC,GAAe,UAEd,SAASC,EAAaC,EAAiB,GAAe,CACzD,OAAOC,GAAgC,SAAgB,SAAQD,CAAK,CACxE,CAEO,SAASC,GACZC,EACAC,EACAH,EAAiB,GACX,CACN,IAAMI,EAA6BC,GAAeF,CAAM,EAClD,CAACG,EAASC,IAAU,GAAGA,CAAK,GAAGD,CAAO,GAAGZ,EAAU,GACnD,CAACY,EAASE,IAAWF,EAEvBG,EACAC,EAEJ,OAAIV,GACAS,EAAM,IAAM,CAAC,EACbC,EAAO,IAAM,CAAC,IAEdD,EAAOH,GAAoB,CACvBJ,EAAO,MAAM,GAAGI,CAAO;AAAA,CAAI,CAC/B,EACAI,EAAQJ,GAAoB,CACxBH,EAAO,MAAM,GAAGC,EAASP,GAAaF,EAAW,CAAC,IAAIW,CAAO;AAAA,CAAI,CACrE,GAGG,CACH,IAAAG,EACA,KAAAC,EACA,MAAMJ,EAAiB,CACnBH,EAAO,MAAM,GAAGC,EAASN,GAAcF,EAAQ,CAAC,IAAIU,CAAO;AAAA,CAAI,CACnE,CACJ,CACJ,CAqBA,SAASK,GAAeC,EAA+B,CACnD,MAAI,aAAsB,MACf,GAGJA,EAAO,QAAU,EAC5B,CC5EO,IAAMC,EAAN,cAA+B,KAAM,CAGxC,YAAmBC,EAAoB,CACnC,MACI;AAAA,EAA8CA,EAAS,KAAK;AAAA,CAAI,CAAC,EACrE,EAHe,cAAAA,CAInB,CANA,KAAO,kBAOX,ECRA,UAAYC,MAAkB,eAG9B,eAAsBC,EAAqBC,EAAoC,CAC3E,IAAMC,EAAU,MAAmB,QAAMD,CAAQ,EAE3CE,EAAmB,CAAC,EAE1B,OAAID,EAAO,eAAiB,MACxBC,EAAQ,WAAa,GACdD,EAAO,eAAiB,UAC/BC,EAAQ,WAAa,IAGrB,OAAOD,EAAO,aAAgB,SAC9BC,EAAQ,WAAaD,EAAO,YAE5BA,EAAO,cAAgB,OACvB,OAAOA,EAAO,WAAc,WAE5BC,EAAQ,WAAaD,EAAO,WAG5B,OAAOA,EAAO,iBAAoB,WAClCC,EAAQ,cAAgBD,EAAO,iBAG/B,OAAOA,EAAO,cAAiB,WAC/BC,EAAQ,YAAcD,EAAO,cAG7B,OAAOA,EAAO,sBAAyB,YACvCC,EAAQ,mBAAqBD,EAAO,sBAGpC,OAAOA,EAAO,oBAAuB,YACrCC,EAAQ,kBAAoBD,EAAO,oBAGnCA,EAAO,aAAe,MAAQA,EAAO,cAAgB,UACrDC,EAAQ,UAAYD,EAAO,aAGxBC,CACX,CC5CO,SAASC,EACZC,EAC8B,CAC9B,OAAOA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QACvE,CCJA,UAAYC,MAAU,YAOf,IAAMC,EACJ,QAAQ,KACNC,GAAqBA,EAAS,WAAW,KAAM,GAAG,EAClDA,GAAqBA,ECRzB,SAASC,GAAkC,CAC9C,MAAO,CACH,aAAc,CAAC,EACf,KAAM,GACN,QAAS,GACT,MAAO,GACP,MAAO,GACP,MAAO,EACX,CACJ,CCRO,SAASC,EAAUC,EAA4B,CAClD,IAAMC,EAASC,EAAoB,EAEnC,QAASC,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAAK,CAClC,IAAMC,EAAMJ,EAAKG,CAAC,EAElB,GAAIC,IAAQ,KAAM,CAEdH,EAAO,aAAa,KAAK,GAAGD,EAAK,MAAMG,EAAI,CAAC,CAAC,EAC7C,KACJ,CAEA,GAAI,CAAAE,GAAmBJ,EAAQG,CAAoB,EAInD,IAAIA,EAAI,WAAW,IAAI,EACnB,MAAM,IAAI,MAAM,qBAAqBA,CAAG,EAAE,EAG9CH,EAAO,aAAa,KAAKG,CAAG,EAChC,CAEA,OAAOH,CACX,CAEA,SAASI,GAAmBJ,EAAoBG,EAA6B,CACzE,OAAQA,EAAK,CACT,IAAK,SACD,OAAAH,EAAO,KAAO,GACP,GACX,IAAK,YACD,OAAAA,EAAO,QAAU,GACV,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,QACI,MAAO,EACf,CACJ,CChDA,OAAOK,MAAc,YACrB,UAAYC,MAAU,YCDtB,UAAYC,MAAQ,mBAGpB,eAAsBC,EAAUC,EAA8C,CAC1E,GAAI,CACA,OAAO,MAAS,QAAMA,CAAQ,CAClC,OAASC,EAAO,CACZ,GAAIC,EAAmBD,CAAK,EACxB,OAGJ,MAAMA,CACV,CACJ,CDLA,eAAsBE,EAClBC,EACAC,EACiB,CACjB,IAAMC,EAAoB,IAAI,IACxBC,EAAwBC,GAA0BJ,EAAI,WAAW,EACjEK,EAA0B,CAAC,EAE3BC,EAAuB,CACzB,IAAK,GACL,oBAAqB,GACrB,OAAQC,CACZ,EAEA,QAAWC,KAAWP,EAAc,CAChC,IAAMQ,EAAoB,UAAQD,CAAO,EACnCE,EAAO,MAAMC,EAAUF,CAAY,EAEzC,GAAIC,GAAQ,KAAM,CACd,GAAIA,EAAK,eAAe,EAAG,CACvBL,EAAc,KACV,yCAAyCG,CAAO,EACpD,EACA,QACJ,CAEA,GAAIE,EAAK,OAAO,EAAG,CACfR,EAAK,IAAIO,CAAY,EACrB,QACJ,CAEA,GAAIC,EAAK,YAAY,EAAG,CACpB,IAAME,EAAQ,MAAMC,EAAS,QAAQV,CAAqB,GAAI,CAC1D,GAAGG,EACH,IAAKG,CACT,CAAC,EACGG,EAAM,SAAW,GACjBP,EAAc,KACV,kDAAkDG,CAAO,EAC7D,EAEJ,QAAWM,KAAQF,EACfV,EAAK,IAAS,UAAQO,EAAcK,CAAI,CAAC,EAE7C,QACJ,CACJ,CAEA,IAAMC,EAAOC,EAAiBR,CAAO,EAC/BI,GAAS,MAAMC,EAASE,EAAMT,CAAW,GAAG,OAAQQ,GACtDG,GAAuBH,EAAMd,EAAI,WAAW,CAChD,EACIY,EAAM,SAAW,GACjBP,EAAc,KACV,6CAA6CG,CAAO,EACxD,EAEJ,QAAWM,KAAQF,EACfV,EAAK,IAAS,UAAQY,CAAI,CAAC,CAEnC,CAEA,GAAIT,EAAc,OAAS,EACvB,MAAM,IAAIa,EAAiBb,CAAa,EAG5C,OAAO,MAAM,KAAKH,CAAI,EAAE,KAAK,CAACiB,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,CAC7D,CAEA,SAAShB,GAA0BiB,EAAwC,CACvE,OAAOA,EAAY,SAAW,EACxBA,EAAY,CAAC,EACb,IAAIA,EAAY,KAAK,GAAG,CAAC,GACnC,CAEA,SAASJ,GACLH,EACAO,EACO,CACP,IAAMC,EAAiB,UAAQR,CAAI,EAAE,MAAM,CAAC,EAC5C,OAAOO,EAAY,SAASC,CAAS,CACzC,CExFO,IAAMC,EAAkB,CAC3B,SACA,YACA,UACA,UACA,SACJ,ECLO,SAASC,EAAUC,EAAU,CAChC,QAAQ,OAAO,MACX,UAAUA,EAAI,OAAO;AAAA,CACzB,EACA,QAAQ,OAAO,MAAM;AAAA,CAAI,EACzB,QAAQ,OAAO,MAAM;AAAA,CAAY,EAEjC,QAAWC,KAAUC,EACjB,QAAQ,OAAO,MAAM,KAAKD,CAAM;AAAA,CAAI,CAE5C,CCbA,IAAAE,EAAA,CACI,KAAQ,0BACR,QAAW,SACX,YAAe,wDACf,OAAU,iBACV,QAAW,MACX,KAAQ,SACR,MAAS,CACL,OACA,aACA,eACJ,EACA,MAAS,kBACT,QAAW,CACP,IAAK,CACD,MAAS,kBACT,QAAW,eACf,EACA,SAAU,CACN,MAAS,2BACT,QAAW,mBACf,CACJ,EACA,IAAO,CACH,cAAe,2BACf,YAAa,yBACb,kBAAmB,6BACvB,EACA,WAAc,CACV,KAAQ,MACR,IAAO,uDACX,EACA,QAAW,6CACX,QAAW,CACP,IAAO,4CACX,EACA,QAAW,CACP,MAAS,kDACT,MAAS,gBACT,KAAQ,qCACR,UAAW,kCACX,WAAY,qBACZ,IAAO,oCACP,SAAU,mBACV,UAAW,sCACX,KAAQ,8BACR,cAAe,sCACnB,EACA,aAAgB,CACZ,gCAAiC,SACjC,aAAgB,SAChB,YAAa,SACb,YAAa,UACb,kBAAmB,SACvB,EACA,gBAAmB,CACf,aAAc,UACd,eAAgB,WAChB,cAAe,WACf,QAAW,UACX,yBAA0B,UAC1B,uBAAwB,UACxB,OAAU,UACV,KAAQ,SACR,MAAS,UACT,SAAY,SACZ,IAAO,UACP,oBAAqB,UACrB,WAAc,QAClB,CACJ,ECpEO,SAASC,GAAe,CAC3B,QAAQ,OAAO,MAAM,GAAGC,EAAY,OAAO;AAAA,CAAI,CACnD,CCJO,SAASC,EAAYC,EAAoB,CAC5C,QAAQ,IAAI,QAAS,WAAYA,CAAI,CACzC,ChBuBA,eAAsBC,EAAKC,EAAyB,CAChD,IAAIC,EAASC,EAAa,EAE1B,GAAI,CACA,IAAMC,EAAOC,EAAkB,OAAK,MAAM,CAAC,CAAC,EAC5CH,EAASC,EAAaC,EAAK,KAAK,EAChC,IAAME,EAAW,MAAMC,GAAW,CAAE,IAAAN,EAAK,KAAAG,EAAM,OAAAF,CAAO,CAAC,EACvDM,EAAYF,CAAQ,CACxB,OAASG,EAAO,CACZ,GAAIA,aAAiBC,EACjB,QAAWC,KAAWF,EAAM,SACxBP,EAAO,MAAMS,CAAO,OAGxBT,EAAO,MAAMU,EAAgBH,CAAK,CAAC,EAEvCD,EAAY,CAAU,CAC1B,CACJ,CAQA,eAAeD,GAAW,CACtB,IAAAN,EACA,KAAAG,EACA,OAAAF,CACJ,EAAsC,CAClC,GAAIE,EAAK,KACL,OAAAS,EAAUZ,CAAG,EACN,EAGX,GAAIG,EAAK,QACL,OAAAU,EAAa,EACN,EAKX,GAFwBV,EAAK,aAAa,OAAS,EAG/C,OAAOW,GAAgB,CACnB,IAAAd,EACA,OAAAC,EACA,MAAOE,EAAK,MACZ,MAAOA,EAAK,MACZ,aAAcA,EAAK,YACvB,CAAC,EAKL,GAAI,CAAS,QAAM,MACf,OAAOY,GAAgB,CACnB,IAAAf,EACA,OAAAC,EACA,MAAe,QACf,MAAOE,EAAK,MACZ,MAAOA,EAAK,KAChB,CAAC,EAGL,MAAM,IAAI,MACN,6DACJ,CACJ,CAUA,eAAeW,GAAgB,CAC3B,IAAAd,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,aAAAC,CACJ,EAA2C,CACnCF,GACAf,EAAO,IAAI,wBAAwB,EAGvC,IAAMkB,EAAY,MAAMC,EAAkBpB,EAAKkB,CAAY,EACrD,CAACG,EAAkBC,CAAQ,EAAI,MAAMC,GAAY,CACnD,IAAAvB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,UAAAE,CACJ,CAAC,EAED,GAAIH,EAAO,CACP,GAAIK,EAAmB,IACnBpB,EAAO,KACH,8BAA8BoB,CAAgB,WAClD,EACI,CAACC,GACD,MAAO,GAIVA,GACDrB,EAAO,IAAI,2CAA2C,CAE9D,CAEA,OAAIqB,EACO,EAGJ,CACX,CAUA,eAAsBC,GAAY,CAC9B,IAAAvB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,UAAAE,CACJ,EAAgD,CAC5C,IAAIE,EAAmB,EACnBC,EAAW,GAEf,QAAWE,KAAYL,EACnB,GAAI,CACuB,MAAMM,GAAW,CACpC,IAAAzB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,SAAAO,CACJ,CAAC,GAEGH,GAER,OAASb,EAAO,CACRkB,EAAclB,CAAK,EACnBP,EAAO,MAAMO,EAAM,eAAemB,EAAeH,CAAQ,CAAC,CAAC,EAE3DvB,EAAO,MACH,GAAG0B,EAAeH,CAAQ,CAAC,KAAKb,EAAgBH,CAAK,CAAC,EAC1D,EAEJc,EAAW,EACf,CAGJ,MAAO,CAACD,EAAkBC,CAAQ,CACtC,CAUA,eAAsBG,GAAW,CAC7B,IAAAzB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,SAAAO,CACJ,EAAqC,CACjC,GAAI,CACA,IAAMI,EAAU,MAAMC,EAAqBL,CAAQ,EAC7CM,EAAU,MAAS,WAASN,EAAU,MAAM,EAC5CO,EAAY,MAAM/B,EAAI,OAAO8B,EAASF,EAASJ,EAAUP,CAAK,EAEpE,OAAIc,IAAcD,EACP,IAGX7B,EAAO,IAAI0B,EAAeH,CAAQ,CAAC,EAE9BR,GACD,MAAS,YAAUQ,EAAUO,EAAW,MAAM,EAG3C,GACX,OAASvB,EAAO,CACZ,GAAIwB,EAAmBxB,CAAK,EACxB,MAAO,GAGX,MAAMA,CACV,CACJ,CAEA,SAASmB,EAAeH,EAA0B,CAC9C,OAAOS,EAAsB,WAAiB,MAAI,EAAGT,CAAQ,CAAC,CAClE,CAUA,eAAsBT,GAAgB,CAClC,IAAAf,EACA,OAAAC,EACA,MAAAiC,EACA,MAAAlB,EACA,MAAAC,CACJ,EAA2C,CACvC,IAAMkB,EAAQ,MAAMC,GAAS,CAAE,MAAAF,CAAM,CAAC,EAEhCG,EAAe,SADFrC,EAAI,mBAAmBmC,CAAK,CACP,GAClCG,EAAoB,UAAQD,CAAY,EACxCT,EAAU,MAAMC,EAAqBS,CAAY,EACnDP,EAEJ,GAAI,CACAA,EAAY,MAAM/B,EAAI,OAAOmC,EAAOP,EAASU,EAAcrB,CAAK,CACpE,OAAST,EAAO,CACZ,GAAIkB,EAAclB,CAAK,EACnB,OAAAP,EAAO,MAAMO,EAAM,eAAe,OAAO,CAAC,EACnC,EAEX,MAAMA,CACV,CAEA,OAAIQ,EACImB,IAAUJ,GACV9B,EAAO,KAAK,mCAAmC,EACxC,GAGJ,GAGH,SAAO,MAAM8B,CAAS,EAEvB,EACX,CiBjRA,IAAMQ,EAAa,UAEdC,EAAK,CACN,QAAS,cACT,YAAa,CAACD,CAAU,EAExB,oBAAqB,CACjB,OAAOA,CACX,EAEA,OAAQ,MAAOE,EAAMC,IAAY,CAC7B,IAAMC,EAAUC,EAAiBH,EAAMC,CAAO,EAC9C,OAAO,QAAQ,QAAQC,CAAO,CAClC,CACJ,CAAC", - "names": ["parseSnippetFile", "content", "documentContents", "file", "text", "match", "contextText", "bodyText", "body", "parseBody", "context", "parseContext", "variables", "rest", "document", "pairs", "parseContextPairs", "key", "value", "parseVectorValue", "parseVariables", "lines", "l", "line", "parts", "variablesMap", "getVariable", "name", "matchLeading", "v", "IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "getEndOfLine", "eof", "serializeSnippetFile", "snippetFile", "options", "eol", "getEndOfLine", "SnippetSerializer", "insertFinalNewline", "documents", "result", "d", "document", "lines", "getOptionalPairString", "getSortedVariables", "variables", "compareVariables", "variable", "v", "key", "value", "a", "b", "snippetFormatter", "text", "options", "snippetFile", "parseSnippetFile", "serializeSnippetFile", "getStdin", "fs", "path", "process", "getErrorMessage", "error", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "isSyntaxError", "error", "process", "ANSI_RESET", "ANSI_YELLOW", "ANSI_RED", "WARN_PREFIX", "ERROR_PREFIX", "createLogger", "quiet", "createLoggerFromStreams", "stdout", "stderr", "colorize", "shouldUseColor", "message", "color", "_color", "log", "warn", "shouldUseColor", "stream", "FilePatternError", "messages", "editorconfig", "getOptionsFromConfig", "filePath", "config", "options", "isMissingFileError", "error", "path", "normalizeToPosix", "filepath", "getDefaultArguments", "parseArgs", "argv", "result", "getDefaultArguments", "i", "arg", "parseKnownArgument", "fastGlob", "path", "fs", "lstatSafe", "filePath", "error", "isMissingFileError", "parseFilePatterns", "cli", "filePatterns", "seen", "globFileEndingPattern", "getGlobFileEndingsPattern", "errorMessages", "globOptions", "GLOB_IGNORE_PATTERNS", "pattern", "absolutePath", "stat", "lstatSafe", "files", "fastGlob", "file", "glob", "normalizeToPosix", "hasSupportedFileEnding", "FilePatternError", "a", "b", "fileEndings", "extension", "KNOWN_ARGUMENTS", "printHelp", "cli", "option", "KNOWN_ARGUMENTS", "package_default", "printVersion", "package_default", "setExitCode", "code", "main", "cli", "logger", "createLogger", "args", "parseArgs", "exitCode", "mainUnsafe", "setExitCode", "error", "FilePatternError", "message", "getErrorMessage", "printHelp", "printVersion", "mainFormatFiles", "mainFormatStdin", "check", "debug", "filePatterns", "filePaths", "parseFilePatterns", "changedFileCount", "hasError", "formatFiles", "filePath", "formatFile", "isSyntaxError", "getDisplayPath", "options", "getOptionsFromConfig", "content", "formatted", "isMissingFileError", "normalizeToPosix", "stdin", "input", "getStdin", "fauxFileName", "fauxFilePath", "fileEnding", "main", "text", "options", "updated", "snippetFormatter"] + "sources": ["../src/snippet/parseSnippetFile.ts", "../src/util/constants.ts", "../src/util/getEndOfLine.ts", "../src/snippet/serializeSnippetFile.ts", "../src/snippet/snippetFormatter.ts", "../src/node/cli.ts", "../src/util/getErrorMessage.ts", "../src/util/SyntaxError.ts", "../src/node/createLogger.ts", "../src/node/FilePatternError.ts", "../src/node/getOptionsFromConfig.ts", "../src/node/isMissingFileError.ts", "../src/node/normalizeToPosix.ts", "../src/types.ts", "../src/node/getDefaultArguments.ts", "../src/node/parseArgs.ts", "../src/node/parseFilePatterns.ts", "../src/node/lstatSafe.ts", "../src/node/printHelp.ts", "../package.json", "../src/node/printVersion.ts", "../src/node/setExitCode.ts", "../src/node/snippetFormatter.ts"], + "sourcesContent": ["import type { Snippet, SnippetFile, SnippetVariable } from \"./snippetTypes.js\";\n\nexport function parseSnippetFile(content: string): SnippetFile {\n const documentContents = content.split(/^---$/m);\n const file: SnippetFile = { snippets: [] };\n\n for (const text of documentContents) {\n const match = /^-$/m.exec(text);\n const contextText = match != null ? text.slice(0, match.index) : text;\n const bodyText =\n match != null ? text.slice(match.index + match[0].length) : null;\n const body = bodyText != null ? parseBody(bodyText) : null;\n let context = parseContext(contextText);\n\n // Snippet with body\n if (body != null) {\n context ??= { variables: [] };\n const { variables, ...rest } = context;\n file.snippets.push({ ...rest, body, variables });\n }\n // Header without body\n else if (context != null) {\n if (file.header != null || file.snippets.length > 0) {\n throw new Error(\"Header snippet must be first in file\");\n }\n file.header = context;\n }\n }\n\n return file;\n}\n\ntype Context = Omit;\n\nfunction parseContext(text: string): Context | undefined {\n const document: Context = { variables: [] };\n const pairs = parseContextPairs(text);\n\n if (Object.keys(pairs).length === 0) {\n return undefined;\n }\n\n const variables: Record = {};\n\n for (const [key, value] of Object.entries(pairs)) {\n switch (key) {\n case \"name\":\n document.name = value;\n break;\n case \"description\":\n document.description = value;\n break;\n case \"phrase\":\n document.phrases = parseVectorValue(value);\n break;\n case \"insertionScope\":\n document.insertionScopes = parseVectorValue(value);\n break;\n case \"language\":\n document.languages = parseVectorValue(value);\n break;\n default:\n if (!key.startsWith(\"$\")) {\n throw new Error(`Invalid key '${key}'`);\n }\n variables[key] = value;\n }\n }\n\n document.variables = parseVariables(variables);\n\n return document;\n}\n\nfunction parseContextPairs(text: string): Record {\n const lines = text\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const pairs: Record = {};\n\n for (const line of lines) {\n const parts = line.split(\":\");\n if (parts.length !== 2) {\n throw new Error(`Invalid line '${line}'`);\n }\n const key = parts[0].trim();\n const value = parts[1].trim();\n if (key.length === 0 || value.length === 0) {\n throw new Error(`Invalid line '${line}'`);\n }\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (pairs[key] != null) {\n throw new Error(`Duplicate key '${key}' in '${text}'`);\n }\n pairs[key] = value;\n }\n\n return pairs;\n}\n\nfunction parseVariables(variables: Record): SnippetVariable[] {\n const variablesMap: Record = {};\n\n const getVariable = (name: string): SnippetVariable => {\n variablesMap[name] ??= { name };\n return variablesMap[name];\n };\n\n for (const [key, value] of Object.entries(variables)) {\n const parts = key.split(\".\");\n if (parts.length !== 2) {\n throw new Error(`Invalid variable key '${key}'`);\n }\n const name = parts[0].slice(1);\n const field = parts[1];\n switch (field) {\n case \"insertionFormatter\":\n getVariable(name).insertionFormatters = parseVectorValue(value);\n break;\n case \"wrapperPhrase\":\n getVariable(name).wrapperPhrases = parseVectorValue(value);\n break;\n case \"wrapperScope\":\n getVariable(name).wrapperScope = value;\n break;\n default:\n throw new Error(`Invalid variable key '${key}'`);\n }\n }\n\n return Object.values(variablesMap);\n}\n\nfunction parseBody(text: string): string[] | undefined {\n // Find first line that is not empty. Preserve indentation.\n const matchLeading = /^[ \\t]*\\S/m.exec(text);\n if (matchLeading?.index == null) {\n return undefined;\n }\n return text\n .slice(matchLeading.index)\n .trimEnd()\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd());\n}\n\nfunction parseVectorValue(value: string): string[] {\n return value.split(\"|\").map((v) => v.trim());\n}\n", "// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport type {\n Snippet,\n SnippetFile,\n SnippetHeader,\n SnippetVariable,\n} from \"./snippetTypes.js\";\n\nexport type Options = FormatterOptions<\"endOfLine\" | \"insertFinalNewline\">;\n\nexport function serializeSnippetFile(\n snippetFile: SnippetFile,\n options: Options = {},\n): string {\n const eol = getEndOfLine(options.endOfLine);\n const serializer = new SnippetSerializer(\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n );\n return serializer.getText(snippetFile);\n}\n\nclass SnippetSerializer {\n public constructor(\n private readonly eol: string,\n private readonly insertFinalNewline: boolean,\n ) {}\n\n public getText(snippetFile: SnippetFile): string {\n const docDelimiter = \"---\";\n const documents: string[] = [];\n\n if (snippetFile.header != null) {\n documents.push(this.getDocumentText(snippetFile.header));\n }\n\n documents.push(\n ...snippetFile.snippets.map(this.getDocumentText.bind(this)),\n );\n\n const result = documents\n .filter((d) => d.length > 0)\n .join(`${this.eol}${docDelimiter}${this.eol}${this.eol}`);\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return `${result}${this.eol}${docDelimiter}${this.eol}`;\n }\n\n return `${result}${this.eol}${docDelimiter}`;\n }\n\n private getDocumentText(document: SnippetHeader | Snippet): string {\n const lines: string[] = [\n getOptionalPairString(\"name\", document.name),\n getOptionalPairString(\"description\", document.description),\n getOptionalPairString(\"language\", document.languages),\n getOptionalPairString(\"phrase\", document.phrases),\n getOptionalPairString(\"insertionScope\", document.insertionScopes),\n ].filter(Boolean);\n\n if (document.variables.length > 0) {\n if (lines.length > 0) {\n lines.push(\"\");\n }\n lines.push(...getSortedVariables(document.variables));\n }\n\n if (\"body\" in document) {\n lines.push(\"-\", ...document.body);\n }\n\n return lines.join(this.eol);\n }\n}\n\nfunction getSortedVariables(variables: SnippetVariable[]): string[] {\n const result = variables.slice();\n result.sort(compareVariables);\n return result\n .flatMap((variable) => [\n getOptionalPairString(\n `$${variable.name}.insertionFormatter`,\n variable.insertionFormatters,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperPhrase`,\n variable.wrapperPhrases,\n ),\n getOptionalPairString(\n `$${variable.name}.wrapperScope`,\n variable.wrapperScope,\n ),\n ])\n .filter((v) => v.length > 0);\n}\n\nfunction getOptionalPairString(\n key: string,\n value: string | string[] | undefined,\n): string {\n if (value == null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return `${key}: ${value.join(\" | \")}`;\n }\n return `${key}: ${value}`;\n}\n\nfunction compareVariables(a: SnippetVariable, b: SnippetVariable): number {\n if (a.name === \"0\") {\n return 1;\n }\n if (b.name === \"0\") {\n return -1;\n }\n return a.name.localeCompare(b.name);\n}\n", "import { parseSnippetFile } from \"./parseSnippetFile.js\";\nimport { serializeSnippetFile } from \"./serializeSnippetFile.js\";\nimport type { Options } from \"./serializeSnippetFile.js\";\n\nexport function snippetFormatter(text: string, options?: Options): string {\n const snippetFile = parseSnippetFile(text);\n return serializeSnippetFile(snippetFile, options);\n}\n", "import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as process from \"node:process\";\nimport type { Readable } from \"node:stream\";\nimport getStdin from \"get-stdin\";\nimport type { CLI, Logger, ParsedArgs } from \"../types.js\";\nimport { EXIT_ERROR, EXIT_FAIL, EXIT_OK } from \"../util/constants.js\";\nimport type { ExitCode } from \"../util/constants.js\";\nimport { getErrorMessage } from \"../util/getErrorMessage.js\";\nimport { isSyntaxError } from \"../util/SyntaxError.js\";\nimport { createLogger } from \"./createLogger.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { getOptionsFromConfig } from \"./getOptionsFromConfig.js\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\nimport { parseArgs } from \"./parseArgs.js\";\nimport { parseFilePatterns } from \"./parseFilePatterns.js\";\nimport { printHelp } from \"./printHelp.js\";\nimport { printVersion } from \"./printVersion.js\";\nimport { setExitCode } from \"./setExitCode.js\";\n\nexport async function main(cli: CLI): Promise {\n let logger = createLogger();\n\n try {\n const args = parseArgs(process.argv.slice(2));\n logger = createLogger(args.quiet);\n const exitCode = await mainUnsafe({ cli, args, logger });\n setExitCode(exitCode);\n } catch (error) {\n if (error instanceof FilePatternError) {\n for (const message of error.messages) {\n logger.error(message);\n }\n } else {\n logger.error(getErrorMessage(error));\n }\n setExitCode(EXIT_ERROR);\n }\n}\n\ninterface MainUnsafeArgs {\n cli: CLI;\n args: ParsedArgs;\n logger: Logger;\n}\n\nfunction mainUnsafe({ cli, args, logger }: MainUnsafeArgs): Promise {\n if (args.help) {\n printHelp(cli);\n return Promise.resolve(EXIT_OK);\n }\n\n if (args.version) {\n printVersion();\n return Promise.resolve(EXIT_OK);\n }\n\n const hasFilePatterns = args.filePatterns.length > 0;\n\n if (hasFilePatterns) {\n return mainFormatFiles({\n cli,\n logger,\n check: args.check,\n debug: args.debug,\n filePatterns: args.filePatterns,\n });\n }\n\n // If no file patterns are provided, check if there's input from stdin.\n // If stdin TTY it's an interactive terminal, so we shouldn't read from it.\n if (!process.stdin.isTTY) {\n return mainFormatStdin({\n cli,\n logger,\n stdin: process.stdin,\n check: args.check,\n debug: args.debug,\n });\n }\n\n throw new Error(\n \"No input files specified. Use --help for usage information.\",\n );\n}\n\ninterface MainFormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePatterns: string[];\n}\n\nasync function mainFormatFiles({\n cli,\n logger,\n check,\n debug,\n filePatterns,\n}: MainFormatFilesArgs): Promise {\n if (check) {\n logger.log(\"Checking formatting...\");\n }\n\n const filePaths = await parseFilePatterns(cli, filePatterns);\n const [changedFileCount, hasError] = await formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n });\n\n if (check) {\n if (changedFileCount > 0) {\n logger.warn(\n `Code style issues found in ${changedFileCount} file(s).`,\n );\n if (!hasError) {\n return EXIT_FAIL;\n }\n }\n\n if (!hasError) {\n logger.log(\"All matched files use correct code style!\");\n }\n }\n\n if (hasError) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\ninterface FormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePaths: string[];\n}\n\nexport async function formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n}: FormatFilesArgs): Promise<[number, boolean]> {\n let changedFileCount = 0;\n let hasError = false;\n\n for (const filePath of filePaths) {\n try {\n const fileWasChanged = await formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n });\n if (fileWasChanged) {\n changedFileCount++;\n }\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(getDisplayPath(filePath)));\n } else {\n logger.error(\n `${getDisplayPath(filePath)}: ${getErrorMessage(error)}`,\n );\n }\n hasError = true;\n }\n }\n\n return [changedFileCount, hasError];\n}\n\ninterface FormatFileArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePath: string;\n}\n\nexport async function formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n}: FormatFileArgs): Promise {\n try {\n const options = await getOptionsFromConfig(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const formatted = await cli.format(content, options, filePath, debug);\n\n if (formatted === content) {\n return false;\n }\n\n logger.log(getDisplayPath(filePath));\n\n if (!check) {\n await fs.writeFile(filePath, formatted, \"utf8\");\n }\n\n return true;\n } catch (error) {\n if (isMissingFileError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction getDisplayPath(filePath: string): string {\n return normalizeToPosix(path.relative(process.cwd(), filePath));\n}\n\ninterface MainFormatStdinArgs {\n cli: CLI;\n logger: Logger;\n stdin: Readable;\n check: boolean;\n debug: boolean;\n}\n\nexport async function mainFormatStdin({\n cli,\n logger,\n stdin,\n check,\n debug,\n}: MainFormatStdinArgs): Promise {\n const input = await getStdin({ stdin });\n const fileEnding = cli.getStdinFileEnding(input);\n const fauxFileName = `stdin.${fileEnding}`;\n const fauxFilePath = path.resolve(fauxFileName);\n const options = await getOptionsFromConfig(fauxFilePath);\n let formatted: string;\n\n try {\n formatted = await cli.format(input, options, fauxFilePath, debug);\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(\"stdin\"));\n return EXIT_ERROR;\n }\n throw error;\n }\n\n if (check) {\n if (input !== formatted) {\n logger.warn(\"Code style issues found in stdin.\");\n return EXIT_FAIL;\n }\n\n return EXIT_OK;\n }\n\n process.stdout.write(formatted);\n\n return EXIT_OK;\n}\n", "export function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n public constructor(private readonly point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n public getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import * as process from \"node:process\";\nimport type { WriteStream } from \"node:tty\";\nimport type { Logger, LoggerEntry, TestLogger } from \"../types.js\";\n\ntype LogCallback = (message: string) => void;\ntype ColorizeCallback = (message: string, color: string) => string;\ntype LoggerStream = Pick & Partial;\n\nconst ANSI_RESET = \"\\u001B[0m\";\nconst ANSI_YELLOW = \"\\u001B[33m\";\nconst ANSI_RED = \"\\u001B[31m\";\nconst WARN_PREFIX = \"[warn]\";\nconst ERROR_PREFIX = \"[error]\";\n\nexport function createLogger(quiet = false): Logger {\n return createLoggerFromStreams(process.stdout, process.stderr, quiet);\n}\n\nexport function createLoggerFromStreams(\n stdout: LoggerStream,\n stderr: LoggerStream,\n quiet = false,\n): Logger {\n const colorize: ColorizeCallback = shouldUseColor(stderr)\n ? (message, color) => `${color}${message}${ANSI_RESET}`\n : (message, _color) => message;\n\n let log: LogCallback;\n let warn: LogCallback;\n\n if (quiet) {\n log = () => {\n // no-op\n };\n warn = () => {\n // no-op\n };\n } else {\n log = (message: string) => {\n stdout.write(`${message}\\n`);\n };\n warn = (message: string) => {\n stderr.write(`${colorize(WARN_PREFIX, ANSI_YELLOW)} ${message}\\n`);\n };\n }\n\n return {\n log,\n warn,\n error(message: string) {\n stderr.write(`${colorize(ERROR_PREFIX, ANSI_RED)} ${message}\\n`);\n },\n };\n}\n\nexport function createTestLogger(): TestLogger {\n const entries: LoggerEntry[] = [];\n\n return {\n log(message: string) {\n entries.push({ level: \"log\", message });\n },\n warn(message: string) {\n entries.push({ level: \"warn\", message });\n },\n error(message: string) {\n entries.push({ level: \"error\", message });\n },\n getEntries() {\n return entries;\n },\n };\n}\n\nfunction shouldUseColor(stream: LoggerStream): boolean {\n if (\"NO_COLOR\" in process.env) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n", "export class FilePatternError extends Error {\n public name = \"FilePatternError\";\n\n public constructor(public messages: string[]) {\n super(\n `One or more file pattern errors occurred:\\n${messages.join(\"\\n\")}`,\n );\n }\n}\n", "import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n", "export function isMissingFileError(\n error: unknown,\n): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import * as path from \"node:path\";\n\n/**\n * Replace `\\` with `/` on Windows\n * @param {string} filepath\n * @returns {string}\n */\nexport const normalizeToPosix: (filepath: string) => string =\n path.sep === \"\\\\\"\n ? (filepath: string) => filepath.replaceAll(\"\\\\\", \"/\")\n : (filepath: string) => filepath;\n", "import type { KnownProps } from \"editorconfig\";\n\nexport const KNOWN_ARGUMENTS = [\n \"--help\",\n \"--version\",\n \"--quiet\",\n \"--check\",\n \"--debug\",\n] as const;\n\nexport type KnownArgument = (typeof KNOWN_ARGUMENTS)[number];\n\nexport function isKnownArgument(value: string): value is KnownArgument {\n return (KNOWN_ARGUMENTS as readonly string[]).includes(value);\n}\n\nexport interface CLI {\n binName: \"snippet-fmt\" | \"talon-fmt\" | \"tree-sitter-fmt\";\n fileEndings: readonly string[];\n\n getStdinFileEnding(text: string): string;\n format(\n text: string,\n options: Options,\n filePath: string,\n debug: boolean,\n ): Promise;\n}\n\nexport type EndOfLine = \"lf\" | \"crlf\";\n\nexport interface Options {\n endOfLine?: EndOfLine;\n indentTabs?: boolean;\n indentSize?: number;\n maxLineLength?: number;\n columnWidth?: number;\n insertFinalNewline?: boolean;\n preserveMultiline?: boolean;\n}\n\nexport type FormatterOptions = Pick;\n\nexport interface ParsedArgs {\n filePatterns: string[];\n help: boolean;\n version: boolean;\n check: boolean;\n quiet: boolean;\n debug: boolean;\n}\n\nexport interface LoggerEntry {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface Logger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface TestLogger extends Logger {\n getEntries(): readonly LoggerEntry[];\n}\n\nexport interface DebugLogger {\n debug(message: string): void;\n}\n\nexport interface EditorConfigOptions extends KnownProps {\n max_line_length?: number | \"unset\";\n column_width?: number | \"unset\";\n preserve_multiline?: boolean | \"unset\";\n}\n\nexport interface Point {\n row: number;\n column: number;\n}\n\n/**\n * Internal representation of the Tree sitter node. Used so that our api doesn't\n * need to export or expose clients to Tree sitter types. Also makes it simple\n * to write tests internally.\n */\nexport interface SyntaxNode {\n id: number;\n text: string;\n type: string;\n startPosition: Point;\n endPosition: Point;\n hasError: boolean;\n isError: boolean;\n isMissing: boolean;\n parent: SyntaxNode | null;\n children: SyntaxNode[];\n}\n", "import type { ParsedArgs } from \"../types.js\";\n\nexport function getDefaultArguments(): ParsedArgs {\n return {\n filePatterns: [],\n help: false,\n version: false,\n quiet: false,\n debug: false,\n check: false,\n };\n}\n", "import { isKnownArgument } from \"../types.js\";\nimport type { KnownArgument, ParsedArgs } from \"../types.js\";\nimport { getDefaultArguments } from \"./getDefaultArguments.js\";\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result = getDefaultArguments();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === \"--\") {\n // All following arguments are treated as file patterns, even if they start with \"--\"\n result.filePatterns.push(...argv.slice(i + 1));\n break;\n }\n\n if (isKnownArgument(arg) && parseKnownArgument(result, arg)) {\n continue;\n }\n\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n result.filePatterns.push(arg);\n }\n\n return result;\n}\n\nfunction parseKnownArgument(result: ParsedArgs, arg: KnownArgument): boolean {\n switch (arg) {\n case \"--help\":\n result.help = true;\n return true;\n case \"--version\":\n result.version = true;\n return true;\n case \"--quiet\":\n result.quiet = true;\n return true;\n case \"--check\":\n result.check = true;\n return true;\n case \"--debug\":\n result.debug = true;\n return true;\n default:\n return false;\n }\n}\n", "import * as path from \"node:path\";\nimport type { Options } from \"fast-glob\";\nimport fastGlob from \"fast-glob\";\nimport type { CLI } from \"../types.js\";\nimport { GLOB_IGNORE_PATTERNS } from \"../util/constants.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { lstatSafe } from \"./lstatSafe.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\n\nexport async function parseFilePatterns(\n cli: CLI,\n filePatterns: string[],\n): Promise {\n const seen = new Set();\n const globFileEndingPattern = getGlobFileEndingsPattern(cli.fileEndings);\n const errorMessages: string[] = [];\n\n const globOptions: Options = {\n dot: true,\n followSymbolicLinks: false,\n ignore: GLOB_IGNORE_PATTERNS,\n };\n\n for (const pattern of filePatterns) {\n const absolutePath = path.resolve(pattern);\n const stat = await lstatSafe(absolutePath);\n\n if (stat != null) {\n if (stat.isSymbolicLink()) {\n errorMessages.push(\n `Specified pattern is a symbolic link: ${pattern}`,\n );\n continue;\n }\n\n if (stat.isFile()) {\n seen.add(absolutePath);\n continue;\n }\n\n if (stat.isDirectory()) {\n const files = await fastGlob(`**/*.${globFileEndingPattern}`, {\n ...globOptions,\n cwd: absolutePath,\n });\n if (files.length === 0) {\n errorMessages.push(\n `No matching files were found in the directory: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(absolutePath, file));\n }\n continue;\n }\n }\n\n const glob = normalizeToPosix(pattern);\n const allFiles = await fastGlob(glob, globOptions);\n const filteredFiles = allFiles.filter((file) =>\n hasSupportedFileEnding(file, cli.fileEndings),\n );\n if (filteredFiles.length === 0) {\n errorMessages.push(\n `No files matching the pattern were found: ${pattern}`,\n );\n }\n for (const file of filteredFiles) {\n seen.add(path.resolve(file));\n }\n }\n\n if (errorMessages.length > 0) {\n throw new FilePatternError(errorMessages);\n }\n\n return Array.from(seen).toSorted((a, b) => a.localeCompare(b));\n}\n\nfunction getGlobFileEndingsPattern(fileEndings: readonly string[]): string {\n return fileEndings.length === 1\n ? fileEndings[0]\n : `{${fileEndings.join(\",\")}}`;\n}\n\nfunction hasSupportedFileEnding(\n file: string,\n fileEndings: readonly string[],\n): boolean {\n const extension = path.extname(file).slice(1);\n return fileEndings.includes(extension);\n}\n", "import type { Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\n\nexport async function lstatSafe(filePath: string): Promise {\n try {\n return await fs.lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import type { CLI } from \"../types.js\";\nimport { KNOWN_ARGUMENTS } from \"../types.js\";\n\nexport function printHelp(cli: CLI): void {\n process.stdout.write(\n `Usage: ${cli.binName} [options] [file/dir/glob ...]\\n`,\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(\"Options:\\n\");\n\n for (const option of KNOWN_ARGUMENTS) {\n process.stdout.write(` ${option}\\n`);\n }\n}\n", "{\n \"name\": \"@cursorless/talon-tools\",\n \"version\": \"0.11.0\",\n \"description\": \"Linting and formatting tools for Talon and Cursorless\",\n \"author\": \"Cursorless Dev\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"!dist/test\",\n \"!dist/build.*\"\n ],\n \"types\": \"./dist/lib.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/lib.d.ts\",\n \"default\": \"./dist/lib.js\"\n },\n \"./node\": {\n \"types\": \"./dist/node/libNode.d.ts\",\n \"default\": \"./dist/libNode.js\"\n }\n },\n \"bin\": {\n \"snippet-fmt\": \"dist/snippetFormatter.js\",\n \"talon-fmt\": \"dist/talonFormatter.js\",\n \"tree-sitter-fmt\": \"dist/treeSitterFormatter.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cursorless-dev/talon-tools.git\"\n },\n \"funding\": \"https://github.com/sponsors/cursorless-dev\",\n \"sponsor\": {\n \"url\": \"https://github.com/sponsors/cursorless-dev\"\n },\n \"scripts\": {\n \"build\": \"npm run clean && tsc -p . && tsx ./src/build.ts\",\n \"clean\": \"rm -rf dist/*\",\n \"lint\": \"npm run typecheck && npm run lint:ts && npm run lint:fmt\",\n \"typecheck\": \"tsc -p . --noEmit\",\n \"lint:ts\": \"oxlint -c oxlint.config.mts --deny-warnings .\",\n \"lint:fmt\": \"oxfmt --check .\",\n \"fix\": \"npm run fix:ts && npm run fix:fmt\",\n \"fix:ts\": \"oxlint -c oxlint.config.mts --fix .\",\n \"fix:fmt\": \"oxfmt .\",\n \"test\": \"tsx src/test/runAllTests.ts\",\n \"test:subset\": \"tsx src/test/runAllTests.ts --subset\"\n },\n \"dependencies\": {\n \"@cursorless/tree-sitter-wasms\": \"^0.9.0\",\n \"editorconfig\": \"^3.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"get-stdin\": \"^10.0.0\",\n \"web-tree-sitter\": \"^0.26.8\"\n },\n \"devDependencies\": {\n \"@types/mocha\": \"^10.0.10\",\n \"@types/node\": \"^24.12.2\",\n \"esbuild\": \"^0.28.0\",\n \"mocha\": \"^11.7.5\",\n \"oxfmt\": \"^0.47.0\",\n \"oxlint-tsgolint\": \"^0.22.1\",\n \"oxlint\": \"^1.62.0\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^6.0.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function printVersion(): void {\n process.stdout.write(`${packageJson.version}\\n`);\n}\n", "export function setExitCode(code: number): void {\n Reflect.set(process, \"exitCode\", code);\n}\n", "#!/usr/bin/env node\n\nimport { snippetFormatter } from \"../snippet/snippetFormatter.js\";\nimport { main } from \"./cli.js\";\n\nconst fileEnding = \"snippet\";\n\nvoid main({\n binName: \"snippet-fmt\",\n fileEndings: [fileEnding],\n\n getStdinFileEnding() {\n return fileEnding;\n },\n\n format: (text, options) => {\n const updated = snippetFormatter(text, options);\n return Promise.resolve(updated);\n },\n});\n"], + "mappings": ";AAEO,SAASA,EAAiBC,EAA8B,CAC3D,IAAMC,EAAmBD,EAAQ,MAAM,QAAQ,EACzCE,EAAoB,CAAE,SAAU,CAAC,CAAE,EAEzC,QAAWC,KAAQF,EAAkB,CACjC,IAAMG,EAAQ,OAAO,KAAKD,CAAI,EACxBE,EAAcD,GAAS,KAAOD,EAAK,MAAM,EAAGC,EAAM,KAAK,EAAID,EAC3DG,EACFF,GAAS,KAAOD,EAAK,MAAMC,EAAM,MAAQA,EAAM,CAAC,EAAE,MAAM,EAAI,KAC1DG,EAAOD,GAAY,KAAOE,GAAUF,CAAQ,EAAI,KAClDG,EAAUC,GAAaL,CAAW,EAGtC,GAAIE,GAAQ,KAAM,CACdE,IAAY,CAAE,UAAW,CAAC,CAAE,EAC5B,GAAM,CAAE,UAAAE,EAAW,GAAGC,CAAK,EAAIH,EAC/BP,EAAK,SAAS,KAAK,CAAE,GAAGU,EAAM,KAAAL,EAAM,UAAAI,CAAU,CAAC,CACnD,SAESF,GAAW,KAAM,CACtB,GAAIP,EAAK,QAAU,MAAQA,EAAK,SAAS,OAAS,EAC9C,MAAM,IAAI,MAAM,sCAAsC,EAE1DA,EAAK,OAASO,CAClB,CACJ,CAEA,OAAOP,CACX,CAIA,SAASQ,GAAaP,EAAmC,CACrD,IAAMU,EAAoB,CAAE,UAAW,CAAC,CAAE,EACpCC,EAAQC,GAAkBZ,CAAI,EAEpC,GAAI,OAAO,KAAKW,CAAK,EAAE,SAAW,EAC9B,OAGJ,IAAMH,EAAoC,CAAC,EAE3C,OAAW,CAACK,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAK,EAC3C,OAAQE,EAAK,CACT,IAAK,OACDH,EAAS,KAAOI,EAChB,MACJ,IAAK,cACDJ,EAAS,YAAcI,EACvB,MACJ,IAAK,SACDJ,EAAS,QAAUK,EAAiBD,CAAK,EACzC,MACJ,IAAK,iBACDJ,EAAS,gBAAkBK,EAAiBD,CAAK,EACjD,MACJ,IAAK,WACDJ,EAAS,UAAYK,EAAiBD,CAAK,EAC3C,MACJ,QACI,GAAI,CAACD,EAAI,WAAW,GAAG,EACnB,MAAM,IAAI,MAAM,gBAAgBA,CAAG,GAAG,EAE1CL,EAAUK,CAAG,EAAIC,CACzB,CAGJ,OAAAJ,EAAS,UAAYM,GAAeR,CAAS,EAEtCE,CACX,CAEA,SAASE,GAAkBZ,EAAsC,CAC7D,IAAMiB,EAAQjB,EACT,MAAM,OAAO,EACb,IAAKkB,GAAMA,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACbP,EAAgC,CAAC,EAEvC,QAAWQ,KAAQF,EAAO,CACtB,IAAMG,EAAQD,EAAK,MAAM,GAAG,EAC5B,GAAIC,EAAM,SAAW,EACjB,MAAM,IAAI,MAAM,iBAAiBD,CAAI,GAAG,EAE5C,IAAMN,EAAMO,EAAM,CAAC,EAAE,KAAK,EACpBN,EAAQM,EAAM,CAAC,EAAE,KAAK,EAC5B,GAAIP,EAAI,SAAW,GAAKC,EAAM,SAAW,EACrC,MAAM,IAAI,MAAM,iBAAiBK,CAAI,GAAG,EAG5C,GAAIR,EAAME,CAAG,GAAK,KACd,MAAM,IAAI,MAAM,kBAAkBA,CAAG,SAASb,CAAI,GAAG,EAEzDW,EAAME,CAAG,EAAIC,CACjB,CAEA,OAAOH,CACX,CAEA,SAASK,GAAeR,EAAsD,CAC1E,IAAMa,EAAgD,CAAC,EAEjDC,EAAeC,IACjBF,EAAaE,CAAI,IAAM,CAAE,KAAAA,CAAK,EACvBF,EAAaE,CAAI,GAG5B,OAAW,CAACV,EAAKC,CAAK,IAAK,OAAO,QAAQN,CAAS,EAAG,CAClD,IAAMY,EAAQP,EAAI,MAAM,GAAG,EAC3B,GAAIO,EAAM,SAAW,EACjB,MAAM,IAAI,MAAM,yBAAyBP,CAAG,GAAG,EAEnD,IAAMU,EAAOH,EAAM,CAAC,EAAE,MAAM,CAAC,EAE7B,OADcA,EAAM,CAAC,EACN,CACX,IAAK,qBACDE,EAAYC,CAAI,EAAE,oBAAsBR,EAAiBD,CAAK,EAC9D,MACJ,IAAK,gBACDQ,EAAYC,CAAI,EAAE,eAAiBR,EAAiBD,CAAK,EACzD,MACJ,IAAK,eACDQ,EAAYC,CAAI,EAAE,aAAeT,EACjC,MACJ,QACI,MAAM,IAAI,MAAM,yBAAyBD,CAAG,GAAG,CACvD,CACJ,CAEA,OAAO,OAAO,OAAOQ,CAAY,CACrC,CAEA,SAAShB,GAAUL,EAAoC,CAEnD,IAAMwB,EAAe,aAAa,KAAKxB,CAAI,EAC3C,GAAIwB,GAAc,OAAS,KAG3B,OAAOxB,EACF,MAAMwB,EAAa,KAAK,EACxB,QAAQ,EACR,MAAM,OAAO,EACb,IAAKN,GAAMA,EAAE,QAAQ,CAAC,CAC/B,CAEA,SAASH,EAAiBD,EAAyB,CAC/C,OAAOA,EAAM,MAAM,GAAG,EAAE,IAAKW,GAAMA,EAAE,KAAK,CAAC,CAC/C,CCxIO,IAAMC,GAAiB,CAC1B,OACA,OACA,MACA,eACA,aACJ,EAEaC,EAAuBD,GAAe,IAC9CE,GAAY,MAAMA,CAAO,KAC9B,ECrBO,SAASC,EAAaC,EAAyB,CAClD,OAAOA,IAAQ,OAAS;AAAA,EAAS;AAAA,CACrC,CCQO,SAASC,EACZC,EACAC,EAAmB,CAAC,EACd,CACN,IAAMC,EAAMC,EAAaF,EAAQ,SAAS,EAK1C,OAJmB,IAAIG,EACnBF,EACAD,EAAQ,oBAAsB,EAClC,EACkB,QAAQD,CAAW,CACzC,CAEA,IAAMI,EAAN,KAAwB,CACb,YACcF,EACAG,EACnB,CAFmB,SAAAH,EACA,wBAAAG,CAClB,CAFkB,IACA,mBAGd,QAAQL,EAAkC,CAE7C,IAAMM,EAAsB,CAAC,EAEzBN,EAAY,QAAU,MACtBM,EAAU,KAAK,KAAK,gBAAgBN,EAAY,MAAM,CAAC,EAG3DM,EAAU,KACN,GAAGN,EAAY,SAAS,IAAI,KAAK,gBAAgB,KAAK,IAAI,CAAC,CAC/D,EAEA,IAAMO,EAASD,EACV,OAAQE,GAAMA,EAAE,OAAS,CAAC,EAC1B,KAAK,GAAG,KAAK,GAAG,MAAkB,KAAK,GAAG,GAAG,KAAK,GAAG,EAAE,EAE5D,OAAID,EAAO,SAAW,EACX,GAGP,KAAK,mBACE,GAAGA,CAAM,GAAG,KAAK,GAAG,MAAkB,KAAK,GAAG,GAGlD,GAAGA,CAAM,GAAG,KAAK,GAAG,KAC/B,CAEQ,gBAAgBE,EAA2C,CAC/D,IAAMC,EAAkB,CACpBC,EAAsB,OAAQF,EAAS,IAAI,EAC3CE,EAAsB,cAAeF,EAAS,WAAW,EACzDE,EAAsB,WAAYF,EAAS,SAAS,EACpDE,EAAsB,SAAUF,EAAS,OAAO,EAChDE,EAAsB,iBAAkBF,EAAS,eAAe,CACpE,EAAE,OAAO,OAAO,EAEhB,OAAIA,EAAS,UAAU,OAAS,IACxBC,EAAM,OAAS,GACfA,EAAM,KAAK,EAAE,EAEjBA,EAAM,KAAK,GAAGE,GAAmBH,EAAS,SAAS,CAAC,GAGpD,SAAUA,GACVC,EAAM,KAAK,IAAK,GAAGD,EAAS,IAAI,EAG7BC,EAAM,KAAK,KAAK,GAAG,CAC9B,CACJ,EAEA,SAASE,GAAmBC,EAAwC,CAChE,IAAMN,EAASM,EAAU,MAAM,EAC/B,OAAAN,EAAO,KAAKO,EAAgB,EACrBP,EACF,QAASQ,GAAa,CACnBJ,EACI,IAAII,EAAS,IAAI,sBACjBA,EAAS,mBACb,EACAJ,EACI,IAAII,EAAS,IAAI,iBACjBA,EAAS,cACb,EACAJ,EACI,IAAII,EAAS,IAAI,gBACjBA,EAAS,YACb,CACJ,CAAC,EACA,OAAQC,GAAMA,EAAE,OAAS,CAAC,CACnC,CAEA,SAASL,EACLM,EACAC,EACM,CACN,OAAIA,GAAS,KACF,GAEP,MAAM,QAAQA,CAAK,EACZ,GAAGD,CAAG,KAAKC,EAAM,KAAK,KAAK,CAAC,GAEhC,GAAGD,CAAG,KAAKC,CAAK,EAC3B,CAEA,SAASJ,GAAiBK,EAAoBC,EAA4B,CACtE,OAAID,EAAE,OAAS,IACJ,EAEPC,EAAE,OAAS,IACJ,GAEJD,EAAE,KAAK,cAAcC,EAAE,IAAI,CACtC,CCvHO,SAASC,EAAiBC,EAAcC,EAA2B,CACtE,IAAMC,EAAcC,EAAiBH,CAAI,EACzC,OAAOI,EAAqBF,EAAaD,CAAO,CACpD,CCPA,UAAYI,MAAQ,mBACpB,UAAYC,MAAU,YACtB,UAAYC,MAAa,eAEzB,OAAOC,OAAc,YCJd,SAASC,EAAgBC,EAAwB,CACpD,OAAOA,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAChE,CCAA,IAAMC,EAAe,eAERC,EAAN,cAA0B,KAAM,CAG5B,YAA6BC,EAAe,CAC/C,IAAMC,EAAWC,GAAYF,CAAK,EAClC,MAAMG,GAAWF,CAAQ,CAAC,EAFM,WAAAD,EAGhC,KAAK,KAAO,cACZ,KAAK,SAAWC,CACpB,CALoC,MAFnB,SASV,eAAeG,EAAsB,CACxC,OAAO,KAAK,UAAY,KAClB,GAAGA,CAAI,IAAI,KAAK,QAAQ,MAAMN,CAAY,GAC1C,GAAGM,CAAI,KAAKN,CAAY,EAClC,CACJ,EAEO,SAASO,EAAcC,EAAsC,CAChE,OAAOA,aAAiBP,CAC5B,CAEA,SAASI,GAAWF,EAAsC,CACtD,OAAOA,GAAY,KAAO,GAAGH,CAAY,OAAOG,CAAQ,IAAMH,CAClE,CAEA,SAASI,GAAYF,EAA8C,CAC/D,OAAOA,GAAS,KAAO,GAAGA,EAAM,IAAM,CAAC,IAAIA,EAAM,OAAS,CAAC,GAAK,MACpE,CC/BA,UAAYO,MAAa,eAQzB,IAAMC,GAAa,UACbC,GAAc,WACdC,GAAW,WACXC,GAAc,SACdC,GAAe,UAEd,SAASC,EAAaC,EAAQ,GAAe,CAChD,OAAOC,GAAgC,SAAgB,SAAQD,CAAK,CACxE,CAEO,SAASC,GACZC,EACAC,EACAH,EAAQ,GACF,CACN,IAAMI,EAA6BC,GAAeF,CAAM,EAClD,CAACG,EAASC,IAAU,GAAGA,CAAK,GAAGD,CAAO,GAAGZ,EAAU,GACnD,CAACY,EAASE,IAAWF,EAEvBG,EACAC,EAEJ,OAAIV,GACAS,EAAM,IAAM,CAEZ,EACAC,EAAO,IAAM,CAEb,IAEAD,EAAOH,GAAoB,CACvBJ,EAAO,MAAM,GAAGI,CAAO;AAAA,CAAI,CAC/B,EACAI,EAAQJ,GAAoB,CACxBH,EAAO,MAAM,GAAGC,EAASP,GAAaF,EAAW,CAAC,IAAIW,CAAO;AAAA,CAAI,CACrE,GAGG,CACH,IAAAG,EACA,KAAAC,EACA,MAAMJ,EAAiB,CACnBH,EAAO,MAAM,GAAGC,EAASN,GAAcF,EAAQ,CAAC,IAAIU,CAAO;AAAA,CAAI,CACnE,CACJ,CACJ,CAqBA,SAASK,GAAeC,EAA+B,CACnD,MAAI,aAAsB,MACf,GAGJA,EAAO,QAAU,EAC5B,CChFO,IAAMC,EAAN,cAA+B,KAAM,CAGjC,YAAmBC,EAAoB,CAC1C,MACI;AAAA,EAA8CA,EAAS,KAAK;AAAA,CAAI,CAAC,EACrE,EAHsB,cAAAA,CAI1B,CAJ0B,SAFnB,KAAO,kBAOlB,ECRA,UAAYC,MAAkB,eAG9B,eAAsBC,EAAqBC,EAAoC,CAE3E,IAAMC,EAAU,MAAmB,QAAMD,CAAQ,EAE3CE,EAAmB,CAAC,EAE1B,OAAID,EAAO,eAAiB,MACxBC,EAAQ,WAAa,GACdD,EAAO,eAAiB,UAC/BC,EAAQ,WAAa,IAGrB,OAAOD,EAAO,aAAgB,SAC9BC,EAAQ,WAAaD,EAAO,YAE5BA,EAAO,cAAgB,OACvB,OAAOA,EAAO,WAAc,WAE5BC,EAAQ,WAAaD,EAAO,WAG5B,OAAOA,EAAO,iBAAoB,WAClCC,EAAQ,cAAgBD,EAAO,iBAG/B,OAAOA,EAAO,cAAiB,WAC/BC,EAAQ,YAAcD,EAAO,cAG7B,OAAOA,EAAO,sBAAyB,YACvCC,EAAQ,mBAAqBD,EAAO,sBAGpC,OAAOA,EAAO,oBAAuB,YACrCC,EAAQ,kBAAoBD,EAAO,oBAGnCA,EAAO,aAAe,MAAQA,EAAO,cAAgB,UACrDC,EAAQ,UAAYD,EAAO,aAGxBC,CACX,CC7CO,SAASC,EACZC,EAC8B,CAC9B,OAAOA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QACvE,CCJA,UAAYC,MAAU,YAOf,IAAMC,EACJ,QAAQ,KACNC,GAAqBA,EAAS,WAAW,KAAM,GAAG,EAClDA,GAAqBA,ECRzB,IAAMC,EAAkB,CAC3B,SACA,YACA,UACA,UACA,SACJ,EAIO,SAASC,EAAgBC,EAAuC,CACnE,OAAQF,EAAsC,SAASE,CAAK,CAChE,CCZO,SAASC,GAAkC,CAC9C,MAAO,CACH,aAAc,CAAC,EACf,KAAM,GACN,QAAS,GACT,MAAO,GACP,MAAO,GACP,MAAO,EACX,CACJ,CCPO,SAASC,EAAUC,EAA4B,CAClD,IAAMC,EAASC,EAAoB,EAEnC,QAASC,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAAK,CAClC,IAAMC,EAAMJ,EAAKG,CAAC,EAElB,GAAIC,IAAQ,KAAM,CAEdH,EAAO,aAAa,KAAK,GAAGD,EAAK,MAAMG,EAAI,CAAC,CAAC,EAC7C,KACJ,CAEA,GAAI,EAAAE,EAAgBD,CAAG,GAAKE,GAAmBL,EAAQG,CAAG,GAI1D,IAAIA,EAAI,WAAW,IAAI,EACnB,MAAM,IAAI,MAAM,qBAAqBA,CAAG,EAAE,EAG9CH,EAAO,aAAa,KAAKG,CAAG,EAChC,CAEA,OAAOH,CACX,CAEA,SAASK,GAAmBL,EAAoBG,EAA6B,CACzE,OAAQA,EAAK,CACT,IAAK,SACD,OAAAH,EAAO,KAAO,GACP,GACX,IAAK,YACD,OAAAA,EAAO,QAAU,GACV,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,QACI,MAAO,EACf,CACJ,CClDA,UAAYM,MAAU,YAEtB,OAAOC,MAAc,YCDrB,UAAYC,MAAQ,mBAGpB,eAAsBC,EAAUC,EAA8C,CAC1E,GAAI,CACA,OAAO,MAAS,QAAMA,CAAQ,CAClC,OAASC,EAAO,CACZ,GAAIC,EAAmBD,CAAK,EACxB,OAGJ,MAAMA,CACV,CACJ,CDLA,eAAsBE,EAClBC,EACAC,EACiB,CACjB,IAAMC,EAAO,IAAI,IACXC,EAAwBC,GAA0BJ,EAAI,WAAW,EACjEK,EAA0B,CAAC,EAE3BC,EAAuB,CACzB,IAAK,GACL,oBAAqB,GACrB,OAAQC,CACZ,EAEA,QAAWC,KAAWP,EAAc,CAChC,IAAMQ,EAAoB,UAAQD,CAAO,EACnCE,EAAO,MAAMC,EAAUF,CAAY,EAEzC,GAAIC,GAAQ,KAAM,CACd,GAAIA,EAAK,eAAe,EAAG,CACvBL,EAAc,KACV,yCAAyCG,CAAO,EACpD,EACA,QACJ,CAEA,GAAIE,EAAK,OAAO,EAAG,CACfR,EAAK,IAAIO,CAAY,EACrB,QACJ,CAEA,GAAIC,EAAK,YAAY,EAAG,CACpB,IAAME,EAAQ,MAAMC,EAAS,QAAQV,CAAqB,GAAI,CAC1D,GAAGG,EACH,IAAKG,CACT,CAAC,EACGG,EAAM,SAAW,GACjBP,EAAc,KACV,kDAAkDG,CAAO,EAC7D,EAEJ,QAAWM,MAAQF,EACfV,EAAK,IAAS,UAAQO,EAAcK,EAAI,CAAC,EAE7C,QACJ,CACJ,CAEA,IAAMC,EAAOC,EAAiBR,CAAO,EAE/BS,GADW,MAAMJ,EAASE,EAAMT,CAAW,GAClB,OAAQQ,GACnCI,GAAuBJ,EAAMd,EAAI,WAAW,CAChD,EACIiB,EAAc,SAAW,GACzBZ,EAAc,KACV,6CAA6CG,CAAO,EACxD,EAEJ,QAAWM,KAAQG,EACff,EAAK,IAAS,UAAQY,CAAI,CAAC,CAEnC,CAEA,GAAIT,EAAc,OAAS,EACvB,MAAM,IAAIc,EAAiBd,CAAa,EAG5C,OAAO,MAAM,KAAKH,CAAI,EAAE,SAAS,CAACkB,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,CACjE,CAEA,SAASjB,GAA0BkB,EAAwC,CACvE,OAAOA,EAAY,SAAW,EACxBA,EAAY,CAAC,EACb,IAAIA,EAAY,KAAK,GAAG,CAAC,GACnC,CAEA,SAASJ,GACLJ,EACAQ,EACO,CACP,IAAMC,EAAiB,UAAQT,CAAI,EAAE,MAAM,CAAC,EAC5C,OAAOQ,EAAY,SAASC,CAAS,CACzC,CExFO,SAASC,EAAUC,EAAgB,CACtC,QAAQ,OAAO,MACX,UAAUA,EAAI,OAAO;AAAA,CACzB,EACA,QAAQ,OAAO,MAAM;AAAA,CAAI,EACzB,QAAQ,OAAO,MAAM;AAAA,CAAY,EAEjC,QAAWC,KAAUC,EACjB,QAAQ,OAAO,MAAM,KAAKD,CAAM;AAAA,CAAI,CAE5C,CCbA,IAAAE,EAAA,CACI,KAAQ,0BACR,QAAW,SACX,YAAe,wDACf,OAAU,iBACV,QAAW,MACX,KAAQ,SACR,MAAS,CACL,OACA,aACA,eACJ,EACA,MAAS,kBACT,QAAW,CACP,IAAK,CACD,MAAS,kBACT,QAAW,eACf,EACA,SAAU,CACN,MAAS,2BACT,QAAW,mBACf,CACJ,EACA,IAAO,CACH,cAAe,2BACf,YAAa,yBACb,kBAAmB,6BACvB,EACA,WAAc,CACV,KAAQ,MACR,IAAO,uDACX,EACA,QAAW,6CACX,QAAW,CACP,IAAO,4CACX,EACA,QAAW,CACP,MAAS,kDACT,MAAS,gBACT,KAAQ,2DACR,UAAa,oBACb,UAAW,gDACX,WAAY,kBACZ,IAAO,oCACP,SAAU,sCACV,UAAW,UACX,KAAQ,8BACR,cAAe,sCACnB,EACA,aAAgB,CACZ,gCAAiC,SACjC,aAAgB,SAChB,YAAa,SACb,YAAa,UACb,kBAAmB,SACvB,EACA,gBAAmB,CACf,eAAgB,WAChB,cAAe,WACf,QAAW,UACX,MAAS,UACT,MAAS,UACT,kBAAmB,UACnB,OAAU,UACV,IAAO,UACP,WAAc,QAClB,CACJ,ECjEO,SAASC,GAAqB,CACjC,QAAQ,OAAO,MAAM,GAAGC,EAAY,OAAO;AAAA,CAAI,CACnD,CCJO,SAASC,EAAYC,EAAoB,CAC5C,QAAQ,IAAI,QAAS,WAAYA,CAAI,CACzC,ChBmBA,eAAsBC,EAAKC,EAAyB,CAChD,IAAIC,EAASC,EAAa,EAE1B,GAAI,CACA,IAAMC,EAAOC,EAAkB,OAAK,MAAM,CAAC,CAAC,EAC5CH,EAASC,EAAaC,EAAK,KAAK,EAChC,IAAME,EAAW,MAAMC,GAAW,CAAE,IAAAN,EAAK,KAAAG,EAAM,OAAAF,CAAO,CAAC,EACvDM,EAAYF,CAAQ,CACxB,OAASG,EAAO,CACZ,GAAIA,aAAiBC,EACjB,QAAWC,KAAWF,EAAM,SACxBP,EAAO,MAAMS,CAAO,OAGxBT,EAAO,MAAMU,EAAgBH,CAAK,CAAC,EAEvCD,EAAY,CAAU,CAC1B,CACJ,CAQA,SAASD,GAAW,CAAE,IAAAN,EAAK,KAAAG,EAAM,OAAAF,CAAO,EAAsC,CAC1E,GAAIE,EAAK,KACL,OAAAS,EAAUZ,CAAG,EACN,QAAQ,QAAQ,CAAO,EAGlC,GAAIG,EAAK,QACL,OAAAU,EAAa,EACN,QAAQ,QAAQ,CAAO,EAKlC,GAFwBV,EAAK,aAAa,OAAS,EAG/C,OAAOW,GAAgB,CACnB,IAAAd,EACA,OAAAC,EACA,MAAOE,EAAK,MACZ,MAAOA,EAAK,MACZ,aAAcA,EAAK,YACvB,CAAC,EAKL,GAAI,CAAS,QAAM,MACf,OAAOY,GAAgB,CACnB,IAAAf,EACA,OAAAC,EACA,MAAe,QACf,MAAOE,EAAK,MACZ,MAAOA,EAAK,KAChB,CAAC,EAGL,MAAM,IAAI,MACN,6DACJ,CACJ,CAUA,eAAeW,GAAgB,CAC3B,IAAAd,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,aAAAC,CACJ,EAA2C,CACnCF,GACAf,EAAO,IAAI,wBAAwB,EAGvC,IAAMkB,EAAY,MAAMC,EAAkBpB,EAAKkB,CAAY,EACrD,CAACG,EAAkBC,CAAQ,EAAI,MAAMC,GAAY,CACnD,IAAAvB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,UAAAE,CACJ,CAAC,EAED,GAAIH,EAAO,CACP,GAAIK,EAAmB,IACnBpB,EAAO,KACH,8BAA8BoB,CAAgB,WAClD,EACI,CAACC,GACD,MAAO,GAIVA,GACDrB,EAAO,IAAI,2CAA2C,CAE9D,CAEA,OAAIqB,EACO,EAGJ,CACX,CAUA,eAAsBC,GAAY,CAC9B,IAAAvB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,UAAAE,CACJ,EAAgD,CAC5C,IAAIE,EAAmB,EACnBC,EAAW,GAEf,QAAWE,KAAYL,EACnB,GAAI,CACuB,MAAMM,GAAW,CACpC,IAAAzB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,SAAAO,CACJ,CAAC,GAEGH,GAER,OAASb,EAAO,CACRkB,EAAclB,CAAK,EACnBP,EAAO,MAAMO,EAAM,eAAemB,EAAeH,CAAQ,CAAC,CAAC,EAE3DvB,EAAO,MACH,GAAG0B,EAAeH,CAAQ,CAAC,KAAKb,EAAgBH,CAAK,CAAC,EAC1D,EAEJc,EAAW,EACf,CAGJ,MAAO,CAACD,EAAkBC,CAAQ,CACtC,CAUA,eAAsBG,GAAW,CAC7B,IAAAzB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,SAAAO,CACJ,EAAqC,CACjC,GAAI,CACA,IAAMI,EAAU,MAAMC,EAAqBL,CAAQ,EAC7CM,EAAU,MAAS,WAASN,EAAU,MAAM,EAC5CO,EAAY,MAAM/B,EAAI,OAAO8B,EAASF,EAASJ,EAAUP,CAAK,EAEpE,OAAIc,IAAcD,EACP,IAGX7B,EAAO,IAAI0B,EAAeH,CAAQ,CAAC,EAE9BR,GACD,MAAS,YAAUQ,EAAUO,EAAW,MAAM,EAG3C,GACX,OAASvB,EAAO,CACZ,GAAIwB,EAAmBxB,CAAK,EACxB,MAAO,GAGX,MAAMA,CACV,CACJ,CAEA,SAASmB,EAAeH,EAA0B,CAC9C,OAAOS,EAAsB,WAAiB,MAAI,EAAGT,CAAQ,CAAC,CAClE,CAUA,eAAsBT,GAAgB,CAClC,IAAAf,EACA,OAAAC,EACA,MAAAiC,EACA,MAAAlB,EACA,MAAAC,CACJ,EAA2C,CACvC,IAAMkB,EAAQ,MAAMC,GAAS,CAAE,MAAAF,CAAM,CAAC,EAEhCG,EAAe,SADFrC,EAAI,mBAAmBmC,CAAK,CACP,GAClCG,EAAoB,UAAQD,CAAY,EACxCT,EAAU,MAAMC,EAAqBS,CAAY,EACnDP,EAEJ,GAAI,CACAA,EAAY,MAAM/B,EAAI,OAAOmC,EAAOP,EAASU,EAAcrB,CAAK,CACpE,OAAST,EAAO,CACZ,GAAIkB,EAAclB,CAAK,EACnB,OAAAP,EAAO,MAAMO,EAAM,eAAe,OAAO,CAAC,EACnC,EAEX,MAAMA,CACV,CAEA,OAAIQ,EACImB,IAAUJ,GACV9B,EAAO,KAAK,mCAAmC,EACxC,GAGJ,GAGH,SAAO,MAAM8B,CAAS,EAEvB,EACX,CiBzQA,IAAMQ,GAAa,UAEdC,EAAK,CACN,QAAS,cACT,YAAa,CAACD,EAAU,EAExB,oBAAqB,CACjB,OAAOA,EACX,EAEA,OAAQ,CAACE,EAAMC,IAAY,CACvB,IAAMC,EAAUC,EAAiBH,EAAMC,CAAO,EAC9C,OAAO,QAAQ,QAAQC,CAAO,CAClC,CACJ,CAAC", + "names": ["parseSnippetFile", "content", "documentContents", "file", "text", "match", "contextText", "bodyText", "body", "parseBody", "context", "parseContext", "variables", "rest", "document", "pairs", "parseContextPairs", "key", "value", "parseVectorValue", "parseVariables", "lines", "l", "line", "parts", "variablesMap", "getVariable", "name", "matchLeading", "v", "IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "getEndOfLine", "eof", "serializeSnippetFile", "snippetFile", "options", "eol", "getEndOfLine", "SnippetSerializer", "insertFinalNewline", "documents", "result", "d", "document", "lines", "getOptionalPairString", "getSortedVariables", "variables", "compareVariables", "variable", "v", "key", "value", "a", "b", "snippetFormatter", "text", "options", "snippetFile", "parseSnippetFile", "serializeSnippetFile", "fs", "path", "process", "getStdin", "getErrorMessage", "error", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "isSyntaxError", "error", "process", "ANSI_RESET", "ANSI_YELLOW", "ANSI_RED", "WARN_PREFIX", "ERROR_PREFIX", "createLogger", "quiet", "createLoggerFromStreams", "stdout", "stderr", "colorize", "shouldUseColor", "message", "color", "_color", "log", "warn", "shouldUseColor", "stream", "FilePatternError", "messages", "editorconfig", "getOptionsFromConfig", "filePath", "config", "options", "isMissingFileError", "error", "path", "normalizeToPosix", "filepath", "KNOWN_ARGUMENTS", "isKnownArgument", "value", "getDefaultArguments", "parseArgs", "argv", "result", "getDefaultArguments", "i", "arg", "isKnownArgument", "parseKnownArgument", "path", "fastGlob", "fs", "lstatSafe", "filePath", "error", "isMissingFileError", "parseFilePatterns", "cli", "filePatterns", "seen", "globFileEndingPattern", "getGlobFileEndingsPattern", "errorMessages", "globOptions", "GLOB_IGNORE_PATTERNS", "pattern", "absolutePath", "stat", "lstatSafe", "files", "fastGlob", "file", "glob", "normalizeToPosix", "filteredFiles", "hasSupportedFileEnding", "FilePatternError", "a", "b", "fileEndings", "extension", "printHelp", "cli", "option", "KNOWN_ARGUMENTS", "package_default", "printVersion", "package_default", "setExitCode", "code", "main", "cli", "logger", "createLogger", "args", "parseArgs", "exitCode", "mainUnsafe", "setExitCode", "error", "FilePatternError", "message", "getErrorMessage", "printHelp", "printVersion", "mainFormatFiles", "mainFormatStdin", "check", "debug", "filePatterns", "filePaths", "parseFilePatterns", "changedFileCount", "hasError", "formatFiles", "filePath", "formatFile", "isSyntaxError", "getDisplayPath", "options", "getOptionsFromConfig", "content", "formatted", "isMissingFileError", "normalizeToPosix", "stdin", "input", "getStdin", "fauxFileName", "fauxFilePath", "fileEnding", "main", "text", "options", "updated", "snippetFormatter"] } diff --git a/dist/talonFormatter.js b/dist/talonFormatter.js index cb7c261..34eb24b 100644 --- a/dist/talonFormatter.js +++ b/dist/talonFormatter.js @@ -1,15 +1,15 @@ #!/usr/bin/env node -var z=[".git",".svn",".hg","node_modules","__pycache__"],v=z.map(t=>`**/${t}/**`);function g(t){return t==="crlf"?`\r +var V=[".git",".svn",".hg","node_modules","__pycache__"],P=V.map(t=>`**/${t}/**`);function u(t){return t==="crlf"?`\r `:` -`}function P(t){return{debug(e){t&&console.warn(`[debug] ${e}`)}}}function w(t){let e=t.match(/# fmt: columnWidth=(\d+)/);if(e!=null)return parseInt(e[1],10)}function O(t,e){return t?" ":" ".repeat(e??4)}var E="Syntax error",y=class extends Error{constructor(r){let n=be(r);super(ye(n));this.point=r;this.name="SyntaxError",this.location=n}location;getFileMessage(r){return this.location!=null?`${r}(${this.location}): ${E}`:`${r}: ${E}`}};function k(t){return t instanceof y}function ye(t){return t!=null?`${E} at ${t}.`:E}function be(t){return t!=null?`${t.row+1}:${t.column+1}`:void 0}var b=class extends y{constructor(e){super(V(e)?.startPosition),this.name="SyntaxTreeError"}};function V(t){if(t.isError||t.isMissing)return t;for(let e of t.children){if(!e.hasError)continue;let r=V(e);if(r!=null)return r}return null}function _(t){return t.length>0&&t[0]==="'"&&t[t.length-1]==="'"&&!t.includes('"')?`"${t.slice(1,-1).replaceAll("\\'","'")}"`:t}function A(t,e={},r=!1){if(t.hasError)throw new b(t);let n=w(t.text)??e.columnWidth,s=O(e.indentTabs,e.indentSize),o=g(e.endOfLine);return new I(s,o,e.maxLineLength??80,n,e.insertFinalNewline??!0,e.preserveMultiline??!1,r).getText(t)}var I=class{constructor(e,r,n,s,o,i,a){this.indent=e;this.eol=r;this.maxLineLength=n;this.columnWidth=s;this.insertFinalNewline=o;this.preserveMultiline=i;this.logger=P(a)}lines=[];lastRow=0;logger;getText(e){this.addNode(e);let r=this.lines.join(this.eol).trimEnd();return r.length===0?"":this.insertFinalNewline?r+this.eol:r}addNL(){this.lines[this.lines.length-1]!==""&&this.lines.push("")}addNode(e,r=!1){e.startPosition.row>this.lastRow+1&&this.addNL(),this.lastRow=e.endPosition.row,this.addNodeHelper(e,r),this.lastRow=e.endPosition.row}addNodeHelper(e,r=!1){switch(e.type){case"source_file":for(let n of e.children)this.addNode(n);break;case"matches":{if(e.children.length>1||!we(e)){for(let n of e.children)this.addNode(n);this.addNL()}break}case"declarations":for(let n of e.children)this.addNode(n);break;case"block":for(let n of e.children)this.addNode(n,!0);break;case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":this.addLeftRightNode(e,!1);break;case"settings_declaration":this.lines.length>0&&!this.lines[this.lines.length-1].startsWith("#")&&this.addNL(),this.addLeftRightNode(e,!0),this.addNL();break;case"comment":{let n=e.text.trimEnd(),s=r||e.startPosition.column>0?`${this.indent}${n}`:n;this.lines.push(s);break}default:{let n=this.getNodeText(e);this.lines.push(r?`${this.indent}${n}`:n)}}}getNodeText(e){switch(e.type){case"source_file":case"matches":case"declarations":case"block":case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":case"settings_declaration":case"comment":throw new Error(`Node type '${e.type}' should be handled in addNode, not getNodeText`);case"parenthesized_rule":return this.pairWithChildren(e,e.parent!=null&&G(e,e.parent));case"optional":return this.pairWithChildren(e);case"expression_statement":case"assignment_statement":case"seq":case"choice":return e.children.map(r=>this.getNodeText(r)).join(" ");case"rule":case"action":case"key_action":case"sleep_action":case"argument_list":case"key_binding":case"face_binding":case"gamepad_binding":case"parrot_binding":case"noise_binding":case"deck_binding":case"tag_import_declaration":case"match":return e.children.map(r=>this.getNodeText(r)).join("");case"string":return Ee(e);case"match_modifier":case":":case",":return`${e.text} `;case"implicit_string":return e.text.trim();case"tag_binding":case"settings_binding":case"capture":case"list":case"key(":case"sleep(":case"gamepad(":case"face(":case"parrot(":case"noise(":case"identifier":case"variable":case"word":case"binary_operator":case"integer":case"float":case"start_anchor":case"end_anchor":case"repeat":case"deck(":case"repeat1":case"(":case")":case"=":case"-":case"|":return e.text;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}pairWithChildren(e,r=!1){let{children:n}=e,s=n.slice(1,-1).map(a=>this.getNodeText(a)).join(" ");if(r)return s;let o=n[0].text,i=n[n.length-1].text;return`${o}${s}${i}`}addLeftRightNode(e,r){let[n,s,...o]=e.children,i=this.getNodeText(n);if(!r&&o.length===1&&(!this.preserveMultiline||Ne(n,o))){let a=o[0];if(a.children.length===1){let l=this.getNodeText(a.children[0]),f=this.columnWidth!=null?`${i}: `.padEnd(this.columnWidth):`${i}: `;if(f.length+l.length<=this.maxLineLength){this.lines.push(f+l);return}}}this.lines.push(`${i}:`);for(let a of o)this.addNode(a,!0)}};function Ne(t,e){return t.endPosition.row===e[e.length-1].startPosition.row}function G(t,e){return t.startPosition.row===e.startPosition.row&&t.startPosition.column===e.startPosition.column&&t.endPosition.row===e.endPosition.row&&t.endPosition.column===e.endPosition.column}function we(t){return t.id===t.parent?.children?.[0]?.id}function Ee(t){let e=_(t.text);return t.parent?.type==="expression_statement"&&t.parent.parent?.type==="block"&&G(t,t.parent)&&t.parent.parent.children.length>1?`insert(${e})`:e}function H(t){let e=t.split(/\r?\n/).map(i=>i.trim()),r=e.indexOf("-");if(r===-1)throw Error("Separator not found in talon list");let n=e.slice(0,r),s=_e(e.slice(r+1)),o={headers:[],items:[]};for(let i of n){if(i.length===0)continue;if(i.startsWith("#")){o.headers.push({type:"comment",text:i});continue}let[a,l]=K(i);if(l==null)throw Error("Header value missing");o.headers.push({type:"header",key:a,value:l})}for(let i of s){if(i.length===0){o.items.push({type:"empty"});continue}if(i.startsWith("#")){o.items.push({type:"comment",text:i});continue}let[a,l]=K(i);o.items.push({type:"item",key:a,value:l})}return o}function K(t){let e=t.indexOf(":");return e===-1?[t,void 0]:[t.substring(0,e).trimEnd(),t.substring(e+1).trimStart()]}function _e(t){let e=t.findIndex(n=>n.length>0);if(e<0)return[];let r=t.findLastIndex(n=>n.length>0);return t.slice(e,r+1)}function C(t,e={}){let r=w(t)??e.columnWidth,n=g(e.endOfLine),s=H(t);s.headers.sort((i,a)=>i.type==="header"&&i.key==="list"?-1:0);let o=[];for(let i of s.headers){if(i.type==="comment"){o.push(i.text);continue}o.push(`${i.key}: ${i.value}`)}o.push("-","");for(let i of s.items){if(i.type==="empty"){o.push("");continue}if(i.type==="comment"){o.push(i.text);continue}if(i.value!=null){let a=r!=null?`${i.key}: `.padEnd(r):`${i.key}: `,l=_(i.value);o.push(`${a}${l}`)}else o.push(i.key)}return o.length===0?"":((e.insertFinalNewline??!0)&&o.push(""),o.join(n))}import*as Q from"node:fs";import*as L from"node:path";import{fileURLToPath as Se}from"node:url";import{Language as Fe,Parser as J}from"web-tree-sitter";var X,q=new Map,B=L.dirname(Se(import.meta.url));function Te(){return X??=J.init(),X}function $e(t){let e=q.get(t);if(e==null){let r=ve(t);e=Fe.load(r),q.set(t,e)}return e}function ve(t){let e=`${t}.wasm`,r=[L.join(B,"../../node_modules/@cursorless/tree-sitter-wasms/out",e),L.join(B,"../node_modules/@cursorless/tree-sitter-wasms/out",e)].find(n=>Q.existsSync(n));if(r==null)throw new Error(`Could not find ${e}`);return r}async function Y(t,e){await Te();let r=await $e(e),n=new J;n.setLanguage(r);let s=n.parse(t);if(s==null)throw new Error("Failed to parse text");return s.rootNode}import Ue from"get-stdin";import*as T from"node:fs/promises";import*as $ from"node:path";import*as p from"node:process";function j(t){return t instanceof Error?t.message:String(t)}import*as u from"node:process";var Pe="\x1B[0m",Oe="\x1B[33m",ke="\x1B[31m",Ie="[warn]",Ae="[error]";function R(t=!1){return Ce(u.stdout,u.stderr,t)}function Ce(t,e,r=!1){let n=je(e)?(i,a)=>`${a}${i}${Pe}`:(i,a)=>i,s,o;return r?(s=()=>{},o=()=>{}):(s=i=>{t.write(`${i} +`}function O(t){return{debug(e){t&&console.warn(`[debug] ${e}`)}}}function E(t){let e=/# fmt: columnWidth=(\d+)/.exec(t);if(e!=null)return Number.parseInt(e[1],10)}function k(t,e){return t?" ":" ".repeat(e??4)}var _="Syntax error",y=class extends Error{constructor(r){let n=Ee(r);super(Ne(n));this.point=r;this.name="SyntaxError",this.location=n}point;location;getFileMessage(r){return this.location!=null?`${r}(${this.location}): ${_}`:`${r}: ${_}`}};function I(t){return t instanceof y}function Ne(t){return t!=null?`${_} at ${t}.`:_}function Ee(t){return t!=null?`${t.row+1}:${t.column+1}`:void 0}var b=class extends y{constructor(e){super(G(e)?.startPosition),this.name="SyntaxTreeError"}};function G(t){if(t.isError||t.isMissing)return t;for(let e of t.children){if(!e.hasError)continue;let r=G(e);if(r!=null)return r}return null}function S(t){return t.length>0&&t.startsWith("'")&&t.endsWith("'")&&!t.includes('"')?`"${t.slice(1,-1).replaceAll(String.raw`\'`,"'")}"`:t}function C(t,e={},r=!1){if(t.hasError)throw new b(t);let n=E(t.text)??e.columnWidth,s=k(e.indentTabs,e.indentSize),o=u(e.endOfLine);return new A(s,o,e.maxLineLength??80,n,e.insertFinalNewline??!0,e.preserveMultiline??!1,r).getText(t)}var A=class{constructor(e,r,n,s,o,i,a){this.indent=e;this.eol=r;this.maxLineLength=n;this.columnWidth=s;this.insertFinalNewline=o;this.preserveMultiline=i;this.logger=O(a)}indent;eol;maxLineLength;columnWidth;insertFinalNewline;preserveMultiline;lines=[];lastRow=0;logger;getText(e){this.addNode(e);let r=this.lines.join(this.eol).trimEnd();return r.length===0?"":this.insertFinalNewline?r+this.eol:r}addNL(){this.lines[this.lines.length-1]!==""&&this.lines.push("")}addNode(e,r=!1){e.startPosition.row>this.lastRow+1&&this.addNL(),this.lastRow=e.endPosition.row,this.addNodeHelper(e,r),this.lastRow=e.endPosition.row}addNodeHelper(e,r=!1){switch(e.type){case"source_file":for(let n of e.children)this.addNode(n);break;case"matches":{if(e.children.length>1||!Te(e)){for(let n of e.children)this.addNode(n);this.addNL()}break}case"declarations":for(let n of e.children)this.addNode(n);break;case"block":for(let n of e.children)this.addNode(n,!0);break;case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":this.addLeftRightNode(e,!1);break;case"settings_declaration":this.lines.length>0&&!this.lines[this.lines.length-1].startsWith("#")&&this.addNL(),this.addLeftRightNode(e,!0),this.addNL();break;case"comment":{let n=e.text.trimEnd(),s=r||e.startPosition.column>0?`${this.indent}${n}`:n;this.lines.push(s);break}default:{let n=this.getNodeText(e);this.lines.push(r?`${this.indent}${n}`:n)}}}getNodeText(e){switch(e.type){case"source_file":case"matches":case"declarations":case"block":case"command_declaration":case"key_binding_declaration":case"parrot_declaration":case"noise_declaration":case"face_declaration":case"gamepad_declaration":case"deck_declaration":case"settings_declaration":case"comment":throw new Error(`Node type '${e.type}' should be handled in addNode, not getNodeText`);case"parenthesized_rule":return this.pairWithChildren(e,e.parent!=null&&H(e,e.parent));case"optional":return this.pairWithChildren(e);case"expression_statement":case"assignment_statement":case"seq":case"choice":return e.children.map(r=>this.getNodeText(r)).join(" ");case"rule":case"action":case"key_action":case"sleep_action":case"argument_list":case"key_binding":case"face_binding":case"gamepad_binding":case"parrot_binding":case"noise_binding":case"deck_binding":case"tag_import_declaration":case"match":case"for_statement":case"if_statement":return e.children.map(r=>this.getNodeText(r)).join("");case"string":return $e(e);case"match_modifier":case"for":case"if":case":":case",":return`${e.text} `;case"in":return` ${e.text} `;case"implicit_string":return e.text.trim();case"tag_binding":case"settings_binding":case"capture":case"list":case"key(":case"sleep(":case"gamepad(":case"face(":case"parrot(":case"noise(":case"identifier":case"variable":case"word":case"binary_operator":case"integer":case"float":case"start_anchor":case"end_anchor":case"repeat":case"deck(":case"repeat1":case"(":case")":case"=":case"-":case"|":return e.text;default:return this.logger.debug(`Unknown syntax node type '${e.type}'`),e.text}}pairWithChildren(e,r=!1){let{children:n}=e,s=n.slice(1,-1).map(a=>this.getNodeText(a)).join(" ");if(r)return s;let o=n[0].text,i=n[n.length-1].text;return`${o}${s}${i}`}addLeftRightNode(e,r){let[n,s,...o]=e.children,i=this.getNodeText(n);if(!r&&o.length===1&&(!this.preserveMultiline||Fe(n,o))){let a=o[0];if(a.children.length===1&&!Se(a.children[0])){let l=this.getNodeText(a.children[0]),p=this.columnWidth!=null?`${i}: `.padEnd(this.columnWidth):`${i}: `;if(p.length+l.length<=this.maxLineLength){this.lines.push(p+l);return}}}this.lines.push(`${i}:`);for(let a of o)this.addNode(a,!0)}};function Se(t){switch(t.type){case"if_statement":case"for_statement":return!0;default:return!1}}function Fe(t,e){return t.endPosition.row===e[e.length-1].startPosition.row}function H(t,e){return t.startPosition.row===e.startPosition.row&&t.startPosition.column===e.startPosition.column&&t.endPosition.row===e.endPosition.row&&t.endPosition.column===e.endPosition.column}function Te(t){return t.id===t.parent?.children[0].id}function $e(t){let e=S(t.text);return t.parent?.type==="expression_statement"&&t.parent.parent?.type==="block"&&H(t,t.parent)&&t.parent.parent.children.length>1?`insert(${e})`:e}function q(t){let e=t.split(/\r?\n/).map(i=>i.trim()),r=e.indexOf("-");if(r===-1)throw new Error("Separator not found in talon list");let n=e.slice(0,r),s=ve(e.slice(r+1)),o={headers:[],items:[]};for(let i of n){if(i.length===0)continue;if(i.startsWith("#")){o.headers.push({type:"comment",text:i});continue}let[a,l]=X(i);if(l==null)throw new Error("Header value missing");o.headers.push({type:"header",key:a,value:l})}for(let i of s){if(i.length===0){o.items.push({type:"empty"});continue}if(i.startsWith("#")){o.items.push({type:"comment",text:i});continue}let[a,l]=X(i);o.items.push({type:"item",key:a,value:l})}return o}function X(t){let e=t.indexOf(":");return e===-1?[t,void 0]:[t.slice(0,e).trimEnd(),t.slice(e+1).trimStart()]}function ve(t){let e=t.findIndex(n=>n.length>0);if(e===-1)return[];let r=t.findLastIndex(n=>n.length>0);return t.slice(e,r+1)}function j(t,e={}){let r=E(t)??e.columnWidth,n=u(e.endOfLine),s=q(t);s.headers.sort((i,a)=>i.type==="header"&&i.key==="list"?-1:0);let o=[];for(let i of s.headers){if(i.type==="comment"){o.push(i.text);continue}o.push(`${i.key}: ${i.value}`)}o.push("-","");for(let i of s.items){if(i.type==="empty"){o.push("");continue}if(i.type==="comment"){o.push(i.text);continue}if(i.value!=null){let a=r!=null?`${i.key}: `.padEnd(r):`${i.key}: `,l=S(i.value);o.push(`${a}${l}`)}else o.push(i.key)}return o.length===0?"":((e.insertFinalNewline??!0)&&o.push(""),o.join(n))}import*as $ from"node:fs/promises";import*as v from"node:path";import*as c from"node:process";import Ue from"get-stdin";function R(t){return t instanceof Error?t.message:String(t)}import*as g from"node:process";var Pe="\x1B[0m",Oe="\x1B[33m",ke="\x1B[31m",Ie="[warn]",Ae="[error]";function W(t=!1){return Ce(g.stdout,g.stderr,t)}function Ce(t,e,r=!1){let n=je(e)?(i,a)=>`${a}${i}${Pe}`:(i,a)=>i,s,o;return r?(s=()=>{},o=()=>{}):(s=i=>{t.write(`${i} `)},o=i=>{e.write(`${n(Ie,Oe)} ${i} `)}),{log:s,warn:o,error(i){e.write(`${n(Ae,ke)} ${i} -`)}}}function je(t){return"NO_COLOR"in u.env?!1:t.isTTY===!0}var m=class extends Error{constructor(r){super(`One or more file pattern errors occurred: +`)}}}function je(t){return"NO_COLOR"in g.env?!1:t.isTTY===!0}var m=class extends Error{constructor(r){super(`One or more file pattern errors occurred: ${r.join(` -`)}`);this.messages=r}name="FilePatternError"};import*as Z from"editorconfig";async function W(t){let e=await Z.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 S(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}import*as ee from"node:path";var F=ee.sep==="\\"?t=>t.replaceAll("\\","/"):t=>t;function te(){return{filePatterns:[],help:!1,version:!1,quiet:!1,debug:!1,check:!1}}function re(t){let e=te();for(let r=0;rDe(c,t.fileEndings));d.length===0&&s.push(`No files matching the pattern were found: ${i}`);for(let c of d)r.add(h.resolve(c))}if(s.length>0)throw new m(s);return Array.from(r).sort((i,a)=>i.localeCompare(a))}function We(t){return t.length===1?t[0]:`{${t.join(",")}}`}function De(t,e){let r=h.extname(t).slice(1);return e.includes(r)}var ae=["--help","--version","--quiet","--check","--debug"];function le(t){process.stdout.write(`Usage: ${t.binName} [options] [file/dir/glob ...] +`)}`);this.messages=r}messages;name="FilePatternError"};import*as B from"editorconfig";async function D(t){let e=await B.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 F(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}import*as Q from"node:path";var T=Q.sep==="\\"?t=>t.replaceAll("\\","/"):t=>t;var M=["--help","--version","--quiet","--check","--debug"];function J(t){return M.includes(t)}function Y(){return{filePatterns:[],help:!1,version:!1,quiet:!1,debug:!1,check:!1}}function Z(t){let e=Y();for(let r=0;rDe(d,t.fileEndings));f.length===0&&s.push(`No files matching the pattern were found: ${i}`);for(let d of f)r.add(h.resolve(d))}if(s.length>0)throw new m(s);return Array.from(r).toSorted((i,a)=>i.localeCompare(a))}function We(t){return t.length===1?t[0]:`{${t.join(",")}}`}function De(t,e){let r=h.extname(t).slice(1);return e.includes(r)}function ie(t){process.stdout.write(`Usage: ${t.binName} [options] [file/dir/glob ...] `),process.stdout.write(` `),process.stdout.write(`Options: -`);for(let e of ae)process.stdout.write(` ${e} -`)}var ce={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 pe(){process.stdout.write(`${ce.version} -`)}function D(t){Reflect.set(process,"exitCode",t)}async function de(t){let e=R();try{let r=re(p.argv.slice(2));e=R(r.quiet);let n=await ze({cli:t,args:r,logger:e});D(n)}catch(r){if(r instanceof m)for(let n of r.messages)e.error(n);else e.error(j(r));D(2)}}async function ze({cli:t,args:e,logger:r}){if(e.help)return le(t),0;if(e.version)return pe(),0;if(e.filePatterns.length>0)return Ve({cli:t,logger:r,check:e.check,debug:e.debug,filePatterns:e.filePatterns});if(!p.stdin.isTTY)return He({cli:t,logger:r,stdin:p.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:s}){r&&e.log("Checking formatting...");let o=await se(t,s),[i,a]=await Ge({cli:t,logger:e,check:r,debug:n,filePaths:o});if(r){if(i>0&&(e.warn(`Code style issues found in ${i} file(s).`),!a))return 1;a||e.log("All matched files use correct code style!")}return a?2:0}async function Ge({cli:t,logger:e,check:r,debug:n,filePaths:s}){let o=0,i=!1;for(let a of s)try{await Ke({cli:t,logger:e,check:r,debug:n,filePath:a})&&o++}catch(l){k(l)?e.error(l.getFileMessage(M(a))):e.error(`${M(a)}: ${j(l)}`),i=!0}return[o,i]}async function Ke({cli:t,logger:e,check:r,debug:n,filePath:s}){try{let o=await W(s),i=await T.readFile(s,"utf8"),a=await t.format(i,o,s,n);return a===i?!1:(e.log(M(s)),r||await T.writeFile(s,a,"utf8"),!0)}catch(o){if(S(o))return!1;throw o}}function M(t){return F($.relative(p.cwd(),t))}async function He({cli:t,logger:e,stdin:r,check:n,debug:s}){let o=await Ue({stdin:r}),a=`stdin.${t.getStdinFileEnding(o)}`,l=$.resolve(a),f=await W(l),d;try{d=await t.format(o,f,l,s)}catch(c){if(k(c))return e.error(c.getFileMessage("stdin")),2;throw c}return n?o!==d?(e.warn("Code style issues found in stdin."),1):0:(p.stdout.write(d),0)}var ge="talon",ue="talon-list";de({binName:"talon-fmt",fileEndings:[ge,ue],getStdinFileEnding(t){return me(t)?ue:ge},format:async(t,e,r,n)=>{if(Xe(t,r)){let o=C(t,e);return Promise.resolve(o)}let s=await Y(t,"tree-sitter-talon");return A(s,e,n)}});function Xe(t,e){return e.endsWith(".talon")?!1:e.endsWith(".talon-list")?!0:me(t)}function me(t){return t.trimStart().startsWith("list:")} +`);for(let e of M)process.stdout.write(` ${e} +`)}var oe={name:"@cursorless/talon-tools",version:"0.11.0",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 typecheck && npm run lint:ts && npm run lint:fmt",typecheck:"tsc -p . --noEmit","lint:ts":"oxlint -c oxlint.config.mts --deny-warnings .","lint:fmt":"oxfmt --check .",fix:"npm run fix:ts && npm run fix:fmt","fix:ts":"oxlint -c oxlint.config.mts --fix .","fix:fmt":"oxfmt .",test:"tsx src/test/runAllTests.ts","test:subset":"tsx src/test/runAllTests.ts --subset"},dependencies:{"@cursorless/tree-sitter-wasms":"^0.9.0",editorconfig:"^3.0.2","fast-glob":"^3.3.3","get-stdin":"^10.0.0","web-tree-sitter":"^0.26.8"},devDependencies:{"@types/mocha":"^10.0.10","@types/node":"^24.12.2",esbuild:"^0.28.0",mocha:"^11.7.5",oxfmt:"^0.47.0","oxlint-tsgolint":"^0.22.1",oxlint:"^1.62.0",tsx:"^4.21.0",typescript:"^6.0.3"}};function se(){process.stdout.write(`${oe.version} +`)}function U(t){Reflect.set(process,"exitCode",t)}async function le(t){let e=W();try{let r=Z(c.argv.slice(2));e=W(r.quiet);let n=await ze({cli:t,args:r,logger:e});U(n)}catch(r){if(r instanceof m)for(let n of r.messages)e.error(n);else e.error(R(r));U(2)}}function ze({cli:t,args:e,logger:r}){if(e.help)return ie(t),Promise.resolve(0);if(e.version)return se(),Promise.resolve(0);if(e.filePatterns.length>0)return Ke({cli:t,logger:r,check:e.check,debug:e.debug,filePatterns:e.filePatterns});if(!c.stdin.isTTY)return He({cli:t,logger:r,stdin:c.stdin,check:e.check,debug:e.debug});throw new Error("No input files specified. Use --help for usage information.")}async function Ke({cli:t,logger:e,check:r,debug:n,filePatterns:s}){r&&e.log("Checking formatting...");let o=await ne(t,s),[i,a]=await Ve({cli:t,logger:e,check:r,debug:n,filePaths:o});if(r){if(i>0&&(e.warn(`Code style issues found in ${i} file(s).`),!a))return 1;a||e.log("All matched files use correct code style!")}return a?2:0}async function Ve({cli:t,logger:e,check:r,debug:n,filePaths:s}){let o=0,i=!1;for(let a of s)try{await Ge({cli:t,logger:e,check:r,debug:n,filePath:a})&&o++}catch(l){I(l)?e.error(l.getFileMessage(z(a))):e.error(`${z(a)}: ${R(l)}`),i=!0}return[o,i]}async function Ge({cli:t,logger:e,check:r,debug:n,filePath:s}){try{let o=await D(s),i=await $.readFile(s,"utf8"),a=await t.format(i,o,s,n);return a===i?!1:(e.log(z(s)),r||await $.writeFile(s,a,"utf8"),!0)}catch(o){if(F(o))return!1;throw o}}function z(t){return T(v.relative(c.cwd(),t))}async function He({cli:t,logger:e,stdin:r,check:n,debug:s}){let o=await Ue({stdin:r}),a=`stdin.${t.getStdinFileEnding(o)}`,l=v.resolve(a),p=await D(l),N;try{N=await t.format(o,p,l,s)}catch(f){if(I(f))return e.error(f.getFileMessage("stdin")),2;throw f}return n?o!==N?(e.warn("Code style issues found in stdin."),1):0:(c.stdout.write(N),0)}import*as de from"node:fs";import*as L from"node:path";import{fileURLToPath as Xe}from"node:url";import{Language as qe,Parser as ue}from"web-tree-sitter";var ce,pe=new Map,fe=L.dirname(Xe(import.meta.url));function Be(){return ce??=ue.init(),ce}function Qe(t){let e=pe.get(t);if(e==null){let r=Je(t);e=qe.load(r),pe.set(t,e)}return e}function Je(t){let e=`${t}.wasm`,r=[L.join(fe,"../../node_modules/@cursorless/tree-sitter-wasms/out",e),L.join(fe,"../node_modules/@cursorless/tree-sitter-wasms/out",e)].find(n=>de.existsSync(n));if(r==null)throw new Error(`Could not find ${e}`);return r}async function ge(t,e){await Be();let r=await Qe(e),n=new ue;n.setLanguage(r);let s=n.parse(t);if(s==null)throw new Error("Failed to parse text");return s.rootNode}var me="talon",he="talon-list";le({binName:"talon-fmt",fileEndings:[me,he],getStdinFileEnding(t){return xe(t)?he:me},format:async(t,e,r,n)=>{if(Ye(t,r))return j(t,e);let s=await ge(t,"tree-sitter-talon");return C(s,e,n)}});function Ye(t,e){return e.endsWith(".talon")?!1:e.endsWith(".talon-list")?!0:xe(t)}function xe(t){return t.trimStart().startsWith("list:")} //# sourceMappingURL=talonFormatter.js.map diff --git a/dist/talonFormatter.js.map b/dist/talonFormatter.js.map index 5dd198e..a20a7b2 100644 --- a/dist/talonFormatter.js.map +++ b/dist/talonFormatter.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/util/constants.ts", "../src/util/getEndOfLine.ts", "../src/util/createDebugLogger.ts", "../src/util/getColumnWidth.ts", "../src/util/getIndentation.ts", "../src/util/SyntaxError.ts", "../src/util/SyntaxTreeError.ts", "../src/talon/convertQuotes.ts", "../src/talon/talonFormatter.ts", "../src/talon/parseTalonList.ts", "../src/talon/talonListFormatter.ts", "../src/node/parseText.ts", "../src/node/cli.ts", "../src/util/getErrorMessage.ts", "../src/node/createLogger.ts", "../src/node/FilePatternError.ts", "../src/node/getOptionsFromConfig.ts", "../src/node/isMissingFileError.ts", "../src/node/normalizeToPosix.ts", "../src/node/getDefaultArguments.ts", "../src/node/parseArgs.ts", "../src/node/parseFilePatterns.ts", "../src/node/lstatSafe.ts", "../src/types.ts", "../src/node/printHelp.ts", "../package.json", "../src/node/printVersion.ts", "../src/node/setExitCode.ts", "../src/node/talonFormatter.ts"], - "sourcesContent": ["// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import type { DebugLogger } from \"../types.js\";\n\nexport function createDebugLogger(debug: boolean): DebugLogger {\n return {\n debug(message: string) {\n if (debug) {\n console.warn(`[debug] ${message}`);\n }\n },\n };\n}\n", "export function getColumnWidth(text: string): number | undefined {\n const match = text.match(/# fmt: columnWidth=(\\d+)/);\n\n if (match != null) {\n return parseInt(match[1], 10);\n }\n\n return undefined;\n}\n", "import { DEFAULT_INDENT_WIDTH } from \"./constants.js\";\n\nexport function getIndentation(\n indentTabs: boolean | undefined,\n indentSize: number | undefined,\n): string {\n return indentTabs ? \"\\t\" : \" \".repeat(indentSize ?? DEFAULT_INDENT_WIDTH);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n constructor(private point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import type { SyntaxNode } from \"../types.js\";\nimport { SyntaxError } from \"./SyntaxError.js\";\n\nexport class SyntaxTreeError extends SyntaxError {\n constructor(rootNode: SyntaxNode) {\n super(findFirstProblemNode(rootNode)?.startPosition);\n this.name = \"SyntaxTreeError\";\n }\n}\n\nfunction findFirstProblemNode(node: SyntaxNode): SyntaxNode | null {\n if (node.isError || node.isMissing) {\n return node;\n }\n for (const child of node.children) {\n if (!child.hasError) {\n continue;\n }\n const errorNode = findFirstProblemNode(child);\n if (errorNode != null) {\n return errorNode;\n }\n }\n return null;\n}\n", "export function convertQuotes(text: string): string {\n // Convert single quotes to double quotes\n if (\n text.length > 0 &&\n text[0] === \"'\" &&\n text[text.length - 1] === \"'\" &&\n !text.includes('\"')\n ) {\n const innerText = text.slice(1, -1).replaceAll(\"\\\\'\", \"'\");\n return `\"${innerText}\"`;\n }\n\n return text;\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"../types.js\";\nimport {\n DEFAULT_INSERT_FINAL_NEWLINE,\n DEFAULT_MAX_LINE_LENGTH,\n} from \"../util/constants.js\";\nimport { createDebugLogger } from \"../util/createDebugLogger.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { getIndentation } from \"../util/getIndentation.js\";\nimport { SyntaxTreeError } from \"../util/SyntaxTreeError.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\n\nexport type Options = FormatterOptions<\n | \"endOfLine\"\n | \"indentTabs\"\n | \"indentSize\"\n | \"maxLineLength\"\n | \"columnWidth\"\n | \"insertFinalNewline\"\n | \"preserveMultiline\"\n>;\n\nexport function talonFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug: boolean = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const columnWidth = getColumnWidth(node.text) ?? options.columnWidth;\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TalonFormatter(\n indentation,\n eol,\n options.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH,\n columnWidth,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n options.preserveMultiline ?? false,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TalonFormatter {\n private lines: string[] = [];\n private lastRow = 0;\n private logger: DebugLogger;\n\n constructor(\n private indent: string,\n private eol: string,\n private maxLineLength: number,\n private columnWidth: number | undefined,\n private insertFinalNewline: boolean,\n private preserveMultiline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n getText(node: SyntaxNode): string {\n this.addNode(node);\n\n const result = this.lines.join(this.eol).trimEnd();\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return result + this.eol;\n }\n\n return result;\n }\n\n private addNL(): void {\n if (this.lines[this.lines.length - 1] !== \"\") {\n this.lines.push(\"\");\n }\n }\n\n private addNode(node: SyntaxNode, isIndented = false): void {\n if (node.startPosition.row > this.lastRow + 1) {\n this.addNL();\n }\n this.lastRow = node.endPosition.row;\n this.addNodeHelper(node, isIndented);\n this.lastRow = node.endPosition.row;\n }\n\n private addNodeHelper(node: SyntaxNode, isIndented = false): void {\n switch (node.type) {\n case \"source_file\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"matches\": {\n // There are match nodes or there is a comment before\n if (node.children.length > 1 || !isFirstChild(node)) {\n for (const n of node.children) {\n this.addNode(n);\n }\n this.addNL();\n }\n break;\n }\n\n case \"declarations\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"block\":\n for (const n of node.children) {\n this.addNode(n, true);\n }\n break;\n\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n this.addLeftRightNode(node, false);\n break;\n\n case \"settings_declaration\":\n if (\n this.lines.length > 0 &&\n !this.lines[this.lines.length - 1].startsWith(\"#\")\n ) {\n this.addNL();\n }\n this.addLeftRightNode(node, true);\n this.addNL();\n break;\n\n case \"comment\": {\n // When using crlf eol comments have a trailing `\\r`\n const text = node.text.trimEnd();\n const nodeText =\n isIndented || node.startPosition.column > 0\n ? `${this.indent}${text}`\n : text;\n this.lines.push(nodeText);\n break;\n }\n\n default: {\n const nodeText = this.getNodeText(node);\n this.lines.push(\n isIndented ? `${this.indent}${nodeText}` : nodeText,\n );\n }\n }\n }\n\n private getNodeText(node: SyntaxNode): string {\n switch (node.type) {\n case \"source_file\":\n case \"matches\":\n case \"declarations\":\n case \"block\":\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n case \"settings_declaration\":\n case \"comment\":\n throw new Error(\n `Node type '${node.type}' should be handled in addNode, not getNodeText`,\n );\n\n case \"parenthesized_rule\":\n return this.pairWithChildren(\n node,\n node.parent != null && rangeEqual(node, node.parent),\n );\n\n case \"optional\":\n return this.pairWithChildren(node);\n\n case \"expression_statement\":\n case \"assignment_statement\":\n case \"seq\":\n case \"choice\":\n return node.children.map((n) => this.getNodeText(n)).join(\" \");\n\n case \"rule\":\n case \"action\":\n case \"key_action\":\n case \"sleep_action\":\n case \"argument_list\":\n case \"key_binding\":\n case \"face_binding\":\n case \"gamepad_binding\":\n case \"parrot_binding\":\n case \"noise_binding\":\n case \"deck_binding\":\n case \"tag_import_declaration\":\n case \"match\":\n return node.children.map((n) => this.getNodeText(n)).join(\"\");\n\n case \"string\":\n return formatString(node);\n\n case \"match_modifier\":\n case \":\":\n case \",\":\n return `${node.text} `;\n\n case \"implicit_string\":\n return node.text.trim();\n\n case \"tag_binding\":\n case \"settings_binding\":\n case \"capture\":\n case \"list\":\n case \"key(\":\n case \"sleep(\":\n case \"gamepad(\":\n case \"face(\":\n case \"parrot(\":\n case \"noise(\":\n case \"identifier\":\n case \"variable\":\n case \"word\":\n case \"binary_operator\":\n case \"integer\":\n case \"float\":\n case \"start_anchor\":\n case \"end_anchor\":\n case \"repeat\":\n case \"deck(\":\n case \"repeat1\":\n case \"(\":\n case \")\":\n case \"=\":\n case \"-\":\n case \"|\":\n return node.text;\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private pairWithChildren(\n node: SyntaxNode,\n unwrap: boolean = false,\n ): string {\n const { children } = node;\n const middle = children\n .slice(1, -1)\n .map((n) => this.getNodeText(n))\n .join(\" \");\n if (unwrap) {\n return middle;\n }\n const pre = children[0].text;\n const post = children[children.length - 1].text;\n return `${pre}${middle}${post}`;\n }\n\n private addLeftRightNode(node: SyntaxNode, forceMultiline: boolean): void {\n const [leftNode, _colonNode, ...rightNodes] = node.children;\n const left = this.getNodeText(leftNode);\n\n if (!forceMultiline && rightNodes.length === 1) {\n if (\n !this.preserveMultiline ||\n isLeftRightSingleLine(leftNode, rightNodes)\n ) {\n const rightNode = rightNodes[0];\n if (rightNode.children.length === 1) {\n const right = this.getNodeText(rightNode.children[0]);\n const leftWithPadding =\n this.columnWidth != null\n ? `${left}: `.padEnd(this.columnWidth)\n : `${left}: `;\n if (\n leftWithPadding.length + right.length <=\n this.maxLineLength\n ) {\n this.lines.push(leftWithPadding + right);\n return;\n }\n }\n }\n }\n\n this.lines.push(`${left}:`);\n\n for (const n of rightNodes) {\n this.addNode(n, true);\n }\n }\n}\n\nfunction isLeftRightSingleLine(\n left: SyntaxNode,\n rights: SyntaxNode[],\n): boolean {\n return left.endPosition.row === rights[rights.length - 1].startPosition.row;\n}\n\nfunction rangeEqual(a: SyntaxNode, b: SyntaxNode): boolean {\n return (\n a.startPosition.row === b.startPosition.row &&\n a.startPosition.column === b.startPosition.column &&\n a.endPosition.row === b.endPosition.row &&\n a.endPosition.column === b.endPosition.column\n );\n}\n\nfunction isFirstChild(node: SyntaxNode): boolean {\n return node.id === node.parent?.children?.[0]?.id;\n}\n\nfunction formatString(node: SyntaxNode): string {\n // Convert single quotes to double quotes\n const text = convertQuotes(node.text);\n\n // A single string literal is allowed as syntactic sugar for the insert\n // action, but not in combination with other sibling statements.\n if (\n node.parent?.type === \"expression_statement\" &&\n node.parent.parent?.type === \"block\" &&\n rangeEqual(node, node.parent) &&\n node.parent.parent.children.length > 1\n ) {\n return `insert(${text})`;\n }\n\n return text;\n}\n", "interface TalonListHeader {\n type: \"header\";\n key: string;\n value: string;\n}\n\ninterface TalonListItem {\n type: \"item\";\n key: string;\n value?: string;\n}\n\ninterface EmptyLine {\n type: \"empty\";\n}\n\ninterface CommentLine {\n type: \"comment\";\n text: string;\n}\n\nexport interface TalonList {\n headers: (TalonListHeader | CommentLine)[];\n items: (TalonListItem | CommentLine | EmptyLine)[];\n}\n\nexport function parseTalonList(text: string): TalonList {\n const lines = text.split(/\\r?\\n/).map((l) => l.trim());\n const separatorIndex = lines.indexOf(\"-\");\n\n if (separatorIndex === -1) {\n throw Error(\"Separator not found in talon list\");\n }\n\n const headerLines = lines.slice(0, separatorIndex);\n const bodyLines = trim(lines.slice(separatorIndex + 1));\n\n const result: TalonList = {\n headers: [],\n items: [],\n };\n\n for (const line of headerLines) {\n if (line.length === 0) {\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.headers.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n if (value == null) {\n throw Error(\"Header value missing\");\n }\n result.headers.push({ type: \"header\", key, value });\n }\n\n for (const line of bodyLines) {\n if (line.length === 0) {\n result.items.push({ type: \"empty\" });\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.items.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n result.items.push({ type: \"item\", key, value });\n }\n\n return result;\n}\n\nfunction splitLine(line: string): [string, string | undefined] {\n const index = line.indexOf(\":\");\n if (index === -1) {\n return [line, undefined];\n }\n return [\n line.substring(0, index).trimEnd(),\n line.substring(index + 1).trimStart(),\n ];\n}\n\nfunction trim(list: string[]): string[] {\n const startIndex = list.findIndex((l) => l.length > 0);\n if (startIndex < 0) {\n return [];\n }\n const endIndex = list.findLastIndex((l) => l.length > 0);\n return list.slice(startIndex, endIndex + 1);\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\nimport { parseTalonList } from \"./parseTalonList.js\";\n\ntype Options = FormatterOptions<\n \"endOfLine\" | \"columnWidth\" | \"insertFinalNewline\"\n>;\n\nexport function talonListFormatter(\n text: string,\n options: Options = {},\n): string {\n const columnWidth = getColumnWidth(text) ?? options.columnWidth;\n const eol = getEndOfLine(options.endOfLine);\n const talonList = parseTalonList(text);\n talonList.headers.sort((a, _b) =>\n a.type === \"header\" && a.key === \"list\" ? -1 : 0,\n );\n const lines: string[] = [];\n\n for (const header of talonList.headers) {\n if (header.type === \"comment\") {\n lines.push(header.text);\n continue;\n }\n lines.push(`${header.key}: ${header.value}`);\n }\n\n lines.push(\"-\", \"\");\n\n for (const item of talonList.items) {\n if (item.type === \"empty\") {\n lines.push(\"\");\n continue;\n }\n if (item.type === \"comment\") {\n lines.push(item.text);\n continue;\n }\n if (item.value != null) {\n const keyWithColon =\n columnWidth != null\n ? `${item.key}: `.padEnd(columnWidth)\n : `${item.key}: `;\n const value = convertQuotes(item.value);\n lines.push(`${keyWithColon}${value}`);\n } else {\n lines.push(item.key);\n }\n }\n\n if (lines.length === 0) {\n return \"\";\n }\n\n if (options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE) {\n lines.push(\"\");\n }\n\n return lines.join(eol);\n}\n", "import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Language, Parser } from \"web-tree-sitter\";\nimport type { SyntaxNode } from \"../types.js\";\n\ntype ParserName = \"tree-sitter-talon\" | \"tree-sitter-query\";\n\nlet initPromise: Promise | undefined;\nconst languageCache = new Map>();\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction initTreeSitter() {\n initPromise ??= Parser.init();\n return initPromise;\n}\n\nfunction loadLanguage(parserName: ParserName) {\n let promise = languageCache.get(parserName);\n\n if (promise == null) {\n const wasmFilePath = getWasmFilePath(parserName);\n promise = Language.load(wasmFilePath);\n languageCache.set(parserName, promise);\n }\n\n return promise;\n}\n\nfunction getWasmFilePath(parserName: ParserName) {\n const fileName = `${parserName}.wasm`;\n const wasmFilePath = [\n path.join(\n moduleDir,\n \"../../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n path.join(\n moduleDir,\n \"../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n ].find((candidate) => fs.existsSync(candidate));\n\n if (wasmFilePath == null) {\n throw new Error(`Could not find ${fileName}`);\n }\n\n return wasmFilePath;\n}\n\nexport async function parseText(\n text: string,\n parserName: ParserName,\n): Promise {\n await initTreeSitter();\n\n const language = await loadLanguage(parserName);\n\n const parser = new Parser();\n parser.setLanguage(language);\n\n const tree = parser.parse(text);\n\n if (tree == null) {\n throw new Error(\"Failed to parse text\");\n }\n\n return tree.rootNode;\n}\n", "import getStdin from \"get-stdin\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as process from \"node:process\";\nimport type { Readable } from \"node:stream\";\nimport type { CLI, Logger, ParsedArgs } from \"../types.js\";\nimport {\n EXIT_ERROR,\n EXIT_FAIL,\n EXIT_OK,\n type ExitCode,\n} from \"../util/constants.js\";\nimport { getErrorMessage } from \"../util/getErrorMessage.js\";\nimport { isSyntaxError } from \"../util/SyntaxError.js\";\nimport { createLogger } from \"./createLogger.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { getOptionsFromConfig } from \"./getOptionsFromConfig.js\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\nimport { parseArgs } from \"./parseArgs.js\";\nimport { parseFilePatterns } from \"./parseFilePatterns.js\";\nimport { printHelp } from \"./printHelp.js\";\nimport { printVersion } from \"./printVersion.js\";\nimport { setExitCode } from \"./setExitCode.js\";\n\nexport async function main(cli: CLI): Promise {\n let logger = createLogger();\n\n try {\n const args = parseArgs(process.argv.slice(2));\n logger = createLogger(args.quiet);\n const exitCode = await mainUnsafe({ cli, args, logger });\n setExitCode(exitCode);\n } catch (error) {\n if (error instanceof FilePatternError) {\n for (const message of error.messages) {\n logger.error(message);\n }\n } else {\n logger.error(getErrorMessage(error));\n }\n setExitCode(EXIT_ERROR);\n }\n}\n\ninterface MainUnsafeArgs {\n cli: CLI;\n args: ParsedArgs;\n logger: Logger;\n}\n\nasync function mainUnsafe({\n cli,\n args,\n logger,\n}: MainUnsafeArgs): Promise {\n if (args.help) {\n printHelp(cli);\n return EXIT_OK;\n }\n\n if (args.version) {\n printVersion();\n return EXIT_OK;\n }\n\n const hasFilePatterns = args.filePatterns.length > 0;\n\n if (hasFilePatterns) {\n return mainFormatFiles({\n cli,\n logger,\n check: args.check,\n debug: args.debug,\n filePatterns: args.filePatterns,\n });\n }\n\n // If no file patterns are provided, check if there's input from stdin.\n // If stdin TTY it's an interactive terminal, so we shouldn't read from it.\n if (!process.stdin.isTTY) {\n return mainFormatStdin({\n cli,\n logger,\n stdin: process.stdin,\n check: args.check,\n debug: args.debug,\n });\n }\n\n throw new Error(\n \"No input files specified. Use --help for usage information.\",\n );\n}\n\ninterface MainFormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePatterns: string[];\n}\n\nasync function mainFormatFiles({\n cli,\n logger,\n check,\n debug,\n filePatterns,\n}: MainFormatFilesArgs): Promise {\n if (check) {\n logger.log(\"Checking formatting...\");\n }\n\n const filePaths = await parseFilePatterns(cli, filePatterns);\n const [changedFileCount, hasError] = await formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n });\n\n if (check) {\n if (changedFileCount > 0) {\n logger.warn(\n `Code style issues found in ${changedFileCount} file(s).`,\n );\n if (!hasError) {\n return EXIT_FAIL;\n }\n }\n\n if (!hasError) {\n logger.log(\"All matched files use correct code style!\");\n }\n }\n\n if (hasError) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\ninterface FormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePaths: string[];\n}\n\nexport async function formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n}: FormatFilesArgs): Promise<[number, boolean]> {\n let changedFileCount = 0;\n let hasError = false;\n\n for (const filePath of filePaths) {\n try {\n const fileWasChanged = await formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n });\n if (fileWasChanged) {\n changedFileCount++;\n }\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(getDisplayPath(filePath)));\n } else {\n logger.error(\n `${getDisplayPath(filePath)}: ${getErrorMessage(error)}`,\n );\n }\n hasError = true;\n }\n }\n\n return [changedFileCount, hasError];\n}\n\ninterface FormatFileArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePath: string;\n}\n\nexport async function formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n}: FormatFileArgs): Promise {\n try {\n const options = await getOptionsFromConfig(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const formatted = await cli.format(content, options, filePath, debug);\n\n if (formatted === content) {\n return false;\n }\n\n logger.log(getDisplayPath(filePath));\n\n if (!check) {\n await fs.writeFile(filePath, formatted, \"utf8\");\n }\n\n return true;\n } catch (error) {\n if (isMissingFileError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction getDisplayPath(filePath: string): string {\n return normalizeToPosix(path.relative(process.cwd(), filePath));\n}\n\ninterface MainFormatStdinArgs {\n cli: CLI;\n logger: Logger;\n stdin: Readable;\n check: boolean;\n debug: boolean;\n}\n\nexport async function mainFormatStdin({\n cli,\n logger,\n stdin,\n check,\n debug,\n}: MainFormatStdinArgs): Promise {\n const input = await getStdin({ stdin });\n const fileEnding = cli.getStdinFileEnding(input);\n const fauxFileName = `stdin.${fileEnding}`;\n const fauxFilePath = path.resolve(fauxFileName);\n const options = await getOptionsFromConfig(fauxFilePath);\n let formatted: string;\n\n try {\n formatted = await cli.format(input, options, fauxFilePath, debug);\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(\"stdin\"));\n return EXIT_ERROR;\n }\n throw error;\n }\n\n if (check) {\n if (input !== formatted) {\n logger.warn(\"Code style issues found in stdin.\");\n return EXIT_FAIL;\n }\n\n return EXIT_OK;\n }\n\n process.stdout.write(formatted);\n\n return EXIT_OK;\n}\n", "export function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import * as process from \"node:process\";\nimport type { WriteStream } from \"node:tty\";\nimport type { Logger, LoggerEntry, TestLogger } from \"../types.js\";\n\ntype LogCallback = (message: string) => void;\ntype ColorizeCallback = (message: string, color: string) => string;\ntype LoggerStream = Pick & Partial;\n\nconst ANSI_RESET = \"\\u001b[0m\";\nconst ANSI_YELLOW = \"\\u001b[33m\";\nconst ANSI_RED = \"\\u001b[31m\";\nconst WARN_PREFIX = \"[warn]\";\nconst ERROR_PREFIX = \"[error]\";\n\nexport function createLogger(quiet: boolean = false): Logger {\n return createLoggerFromStreams(process.stdout, process.stderr, quiet);\n}\n\nexport function createLoggerFromStreams(\n stdout: LoggerStream,\n stderr: LoggerStream,\n quiet: boolean = false,\n): Logger {\n const colorize: ColorizeCallback = shouldUseColor(stderr)\n ? (message, color) => `${color}${message}${ANSI_RESET}`\n : (message, _color) => message;\n\n let log: LogCallback;\n let warn: LogCallback;\n\n if (quiet) {\n log = () => {};\n warn = () => {};\n } else {\n log = (message: string) => {\n stdout.write(`${message}\\n`);\n };\n warn = (message: string) => {\n stderr.write(`${colorize(WARN_PREFIX, ANSI_YELLOW)} ${message}\\n`);\n };\n }\n\n return {\n log,\n warn,\n error(message: string) {\n stderr.write(`${colorize(ERROR_PREFIX, ANSI_RED)} ${message}\\n`);\n },\n };\n}\n\nexport function createTestLogger(): TestLogger {\n const entries: LoggerEntry[] = [];\n\n return {\n log(message: string) {\n entries.push({ level: \"log\", message });\n },\n warn(message: string) {\n entries.push({ level: \"warn\", message });\n },\n error(message: string) {\n entries.push({ level: \"error\", message });\n },\n getEntries() {\n return entries;\n },\n };\n}\n\nfunction shouldUseColor(stream: LoggerStream): boolean {\n if (\"NO_COLOR\" in process.env) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n", "export class FilePatternError extends Error {\n name = \"FilePatternError\";\n\n constructor(public messages: string[]) {\n super(\n `One or more file pattern errors occurred:\\n${messages.join(\"\\n\")}`,\n );\n }\n}\n", "import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n", "export function isMissingFileError(\n error: unknown,\n): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import * as path from \"node:path\";\n\n/**\n * Replace `\\` with `/` on Windows\n * @param {string} filepath\n * @returns {string}\n */\nexport const normalizeToPosix =\n path.sep === \"\\\\\"\n ? (filepath: string) => filepath.replaceAll(\"\\\\\", \"/\")\n : (filepath: string) => filepath;\n", "import type { ParsedArgs } from \"../types.js\";\n\nexport function getDefaultArguments(): ParsedArgs {\n return {\n filePatterns: [],\n help: false,\n version: false,\n quiet: false,\n debug: false,\n check: false,\n };\n}\n", "import type { KnownArgument, ParsedArgs } from \"../types.js\";\nimport { getDefaultArguments } from \"./getDefaultArguments.js\";\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result = getDefaultArguments();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === \"--\") {\n // All following arguments are treated as file patterns, even if they start with \"--\"\n result.filePatterns.push(...argv.slice(i + 1));\n break;\n }\n\n if (parseKnownArgument(result, arg as KnownArgument)) {\n continue;\n }\n\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n result.filePatterns.push(arg);\n }\n\n return result;\n}\n\nfunction parseKnownArgument(result: ParsedArgs, arg: KnownArgument): boolean {\n switch (arg) {\n case \"--help\":\n result.help = true;\n return true;\n case \"--version\":\n result.version = true;\n return true;\n case \"--quiet\":\n result.quiet = true;\n return true;\n case \"--check\":\n result.check = true;\n return true;\n case \"--debug\":\n result.debug = true;\n return true;\n default:\n return false;\n }\n}\n", "import type { Options } from \"fast-glob\";\nimport fastGlob from \"fast-glob\";\nimport * as path from \"node:path\";\nimport type { CLI } from \"../types.js\";\nimport { GLOB_IGNORE_PATTERNS } from \"../util/constants.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { lstatSafe } from \"./lstatSafe.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\n\nexport async function parseFilePatterns(\n cli: CLI,\n filePatterns: string[],\n): Promise {\n const seen: Set = new Set();\n const globFileEndingPattern = getGlobFileEndingsPattern(cli.fileEndings);\n const errorMessages: string[] = [];\n\n const globOptions: Options = {\n dot: true,\n followSymbolicLinks: false,\n ignore: GLOB_IGNORE_PATTERNS,\n };\n\n for (const pattern of filePatterns) {\n const absolutePath = path.resolve(pattern);\n const stat = await lstatSafe(absolutePath);\n\n if (stat != null) {\n if (stat.isSymbolicLink()) {\n errorMessages.push(\n `Specified pattern is a symbolic link: ${pattern}`,\n );\n continue;\n }\n\n if (stat.isFile()) {\n seen.add(absolutePath);\n continue;\n }\n\n if (stat.isDirectory()) {\n const files = await fastGlob(`**/*.${globFileEndingPattern}`, {\n ...globOptions,\n cwd: absolutePath,\n });\n if (files.length === 0) {\n errorMessages.push(\n `No matching files were found in the directory: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(absolutePath, file));\n }\n continue;\n }\n }\n\n const glob = normalizeToPosix(pattern);\n const files = (await fastGlob(glob, globOptions)).filter((file) =>\n hasSupportedFileEnding(file, cli.fileEndings),\n );\n if (files.length === 0) {\n errorMessages.push(\n `No files matching the pattern were found: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(file));\n }\n }\n\n if (errorMessages.length > 0) {\n throw new FilePatternError(errorMessages);\n }\n\n return Array.from(seen).sort((a, b) => a.localeCompare(b));\n}\n\nfunction getGlobFileEndingsPattern(fileEndings: readonly string[]): string {\n return fileEndings.length === 1\n ? fileEndings[0]\n : `{${fileEndings.join(\",\")}}`;\n}\n\nfunction hasSupportedFileEnding(\n file: string,\n fileEndings: readonly string[],\n): boolean {\n const extension = path.extname(file).slice(1);\n return fileEndings.includes(extension);\n}\n", "import type { Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\n\nexport async function lstatSafe(filePath: string): Promise {\n try {\n return await fs.lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import type { KnownProps } from \"editorconfig\";\n\nexport const KNOWN_ARGUMENTS = [\n \"--help\",\n \"--version\",\n \"--quiet\",\n \"--check\",\n \"--debug\",\n] as const;\n\nexport type KnownArgument = (typeof KNOWN_ARGUMENTS)[number];\n\nexport interface CLI {\n binName: \"snippet-fmt\" | \"talon-fmt\" | \"tree-sitter-fmt\";\n fileEndings: readonly string[];\n\n getStdinFileEnding(text: string): string;\n format(\n text: string,\n options: Options,\n filePath: string,\n debug: boolean,\n ): Promise;\n}\n\nexport type EndOfLine = \"lf\" | \"crlf\";\n\nexport interface Options {\n endOfLine?: EndOfLine;\n indentTabs?: boolean;\n indentSize?: number;\n maxLineLength?: number;\n columnWidth?: number;\n insertFinalNewline?: boolean;\n preserveMultiline?: boolean;\n}\n\nexport type FormatterOptions = Pick;\n\nexport interface ParsedArgs {\n filePatterns: string[];\n help: boolean;\n version: boolean;\n check: boolean;\n quiet: boolean;\n debug: boolean;\n}\n\nexport interface LoggerEntry {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface Logger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface TestLogger extends Logger {\n getEntries(): readonly LoggerEntry[];\n}\n\nexport interface DebugLogger {\n debug(message: string): void;\n}\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport interface EditorConfigOptions extends KnownProps {\n max_line_length?: number | \"unset\";\n column_width?: number | \"unset\";\n preserve_multiline?: boolean | \"unset\";\n}\n\nexport interface Point {\n row: number;\n column: number;\n}\n\n/**\n * Internal representation of the Tree sitter node. Used so that our api doesn't\n * need to export or expose clients to Tree sitter types. Also makes it simple\n * to write tests internally.\n */\nexport interface SyntaxNode {\n id: number;\n text: string;\n type: string;\n startPosition: Point;\n endPosition: Point;\n hasError: boolean;\n isError: boolean;\n isMissing: boolean;\n parent: SyntaxNode | null;\n children: SyntaxNode[];\n}\n", "import type { CLI } from \"../types.js\";\nimport { KNOWN_ARGUMENTS } from \"../types.js\";\n\nexport function printHelp(cli: CLI) {\n process.stdout.write(\n `Usage: ${cli.binName} [options] [file/dir/glob ...]\\n`,\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(\"Options:\\n\");\n\n for (const option of KNOWN_ARGUMENTS) {\n process.stdout.write(` ${option}\\n`);\n }\n}\n", "{\n \"name\": \"@cursorless/talon-tools\",\n \"version\": \"0.10.2\",\n \"description\": \"Linting and formatting tools for Talon and Cursorless\",\n \"author\": \"Cursorless Dev\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"!dist/test\",\n \"!dist/build.*\"\n ],\n \"types\": \"./dist/lib.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/lib.d.ts\",\n \"default\": \"./dist/lib.js\"\n },\n \"./node\": {\n \"types\": \"./dist/node/libNode.d.ts\",\n \"default\": \"./dist/libNode.js\"\n }\n },\n \"bin\": {\n \"snippet-fmt\": \"dist/snippetFormatter.js\",\n \"talon-fmt\": \"dist/talonFormatter.js\",\n \"tree-sitter-fmt\": \"dist/treeSitterFormatter.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cursorless-dev/talon-tools.git\"\n },\n \"funding\": \"https://github.com/sponsors/cursorless-dev\",\n \"sponsor\": {\n \"url\": \"https://github.com/sponsors/cursorless-dev\"\n },\n \"scripts\": {\n \"build\": \"npm run clean && tsc -p . && tsx ./src/build.ts\",\n \"clean\": \"rm -rf dist/*\",\n \"lint\": \"npm run lint:ts &&npm run lint:fmt\",\n \"lint:ts\": \"tsc -p . --noEmit && eslint src\",\n \"lint:fmt\": \"prettier --check .\",\n \"fix\": \"npm run fix:ts && npm run fix:fmt\",\n \"fix:ts\": \"eslint src --fix\",\n \"fix:fmt\": \"prettier --write --list-different .\",\n \"test\": \"tsx src/test/runAllTests.ts\",\n \"test:subset\": \"tsx src/test/runAllTests.ts --subset\"\n },\n \"dependencies\": {\n \"@cursorless/tree-sitter-wasms\": \"^0.7.0\",\n \"editorconfig\": \"^3.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"get-stdin\": \"^10.0.0\",\n \"web-tree-sitter\": \"^0.26.7\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.4\",\n \"@types/mocha\": \"^10.0.10\",\n \"@types/node\": \"^24.12.0\",\n \"esbuild\": \"^0.27.4\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-import\": \"^2.32.0\",\n \"eslint\": \"^9.39.4\",\n \"jiti\": \"^2.6.1\",\n \"mocha\": \"^11.7.5\",\n \"prettier\": \"^3.8.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript-eslint\": \"^8.57.1\",\n \"typescript\": \"^5.9.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function printVersion() {\n process.stdout.write(`${packageJson.version}\\n`);\n}\n", "export function setExitCode(code: number): void {\n Reflect.set(process, \"exitCode\", code);\n}\n", "#!/usr/bin/env node\n\nimport { talonListFormatter } from \"../lib.js\";\nimport { talonFormatter } from \"../talon/talonFormatter.js\";\nimport { parseText } from \"./parseText.js\";\nimport { main } from \"./cli.js\";\n\nconst fileEndingTalon = \"talon\";\nconst fileEndingTalonList = \"talon-list\";\n\nvoid main({\n binName: \"talon-fmt\",\n fileEndings: [fileEndingTalon, fileEndingTalonList],\n\n getStdinFileEnding(text) {\n return textIsList(text) ? fileEndingTalonList : fileEndingTalon;\n },\n\n format: async (text, options, filePath, debug) => {\n if (isListFile(text, filePath)) {\n const updated = talonListFormatter(text, options);\n return Promise.resolve(updated);\n }\n\n const node = await parseText(text, \"tree-sitter-talon\");\n return talonFormatter(node, options, debug);\n },\n});\n\nfunction isListFile(text: string, filePath: string): boolean {\n if (filePath.endsWith(\".talon\")) {\n return false;\n }\n if (filePath.endsWith(\".talon-list\")) {\n return true;\n }\n return textIsList(text);\n}\n\nfunction textIsList(text: string): boolean {\n return text.trimStart().startsWith(\"list:\");\n}\n"], - "mappings": "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", - "names": ["IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "getEndOfLine", "eof", "createDebugLogger", "debug", "message", "getColumnWidth", "text", "match", "getIndentation", "indentTabs", "indentSize", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "isSyntaxError", "error", "SyntaxTreeError", "SyntaxError", "rootNode", "findFirstProblemNode", "node", "child", "errorNode", "convertQuotes", "text", "talonFormatter", "node", "options", "debug", "SyntaxTreeError", "columnWidth", "getColumnWidth", "indentation", "getIndentation", "eol", "getEndOfLine", "TalonFormatter", "indent", "maxLineLength", "insertFinalNewline", "preserveMultiline", "createDebugLogger", "result", "isIndented", "isFirstChild", "text", "nodeText", "rangeEqual", "n", "formatString", "unwrap", "children", "middle", "pre", "post", "forceMultiline", "leftNode", "_colonNode", "rightNodes", "left", "isLeftRightSingleLine", "rightNode", "right", "leftWithPadding", "rights", "a", "b", "convertQuotes", "parseTalonList", "text", "lines", "l", "separatorIndex", "headerLines", "bodyLines", "trim", "result", "line", "key", "value", "splitLine", "index", "list", "startIndex", "endIndex", "talonListFormatter", "text", "options", "columnWidth", "getColumnWidth", "eol", "getEndOfLine", "talonList", "parseTalonList", "a", "_b", "lines", "header", "item", "keyWithColon", "value", "convertQuotes", "fs", "path", "fileURLToPath", "Language", "Parser", "initPromise", "languageCache", "moduleDir", "initTreeSitter", "loadLanguage", "parserName", "promise", "wasmFilePath", "getWasmFilePath", "fileName", "candidate", "parseText", "text", "language", "parser", "tree", "getStdin", "fs", "path", "process", "getErrorMessage", "error", "process", "ANSI_RESET", "ANSI_YELLOW", "ANSI_RED", "WARN_PREFIX", "ERROR_PREFIX", "createLogger", "quiet", "createLoggerFromStreams", "stdout", "stderr", "colorize", "shouldUseColor", "message", "color", "_color", "log", "warn", "shouldUseColor", "stream", "FilePatternError", "messages", "editorconfig", "getOptionsFromConfig", "filePath", "config", "options", "isMissingFileError", "error", "path", "normalizeToPosix", "filepath", "getDefaultArguments", "parseArgs", "argv", "result", "getDefaultArguments", "i", "arg", "parseKnownArgument", "fastGlob", "path", "fs", "lstatSafe", "filePath", "error", "isMissingFileError", "parseFilePatterns", "cli", "filePatterns", "seen", "globFileEndingPattern", "getGlobFileEndingsPattern", "errorMessages", "globOptions", "GLOB_IGNORE_PATTERNS", "pattern", "absolutePath", "stat", "lstatSafe", "files", "fastGlob", "file", "glob", "normalizeToPosix", "hasSupportedFileEnding", "FilePatternError", "a", "b", "fileEndings", "extension", "KNOWN_ARGUMENTS", "printHelp", "cli", "option", "KNOWN_ARGUMENTS", "package_default", "printVersion", "package_default", "setExitCode", "code", "main", "cli", "logger", "createLogger", "args", "parseArgs", "exitCode", "mainUnsafe", "setExitCode", "error", "FilePatternError", "message", "getErrorMessage", "printHelp", "printVersion", "mainFormatFiles", "mainFormatStdin", "check", "debug", "filePatterns", "filePaths", "parseFilePatterns", "changedFileCount", "hasError", "formatFiles", "filePath", "formatFile", "isSyntaxError", "getDisplayPath", "options", "getOptionsFromConfig", "content", "formatted", "isMissingFileError", "normalizeToPosix", "stdin", "input", "getStdin", "fauxFileName", "fauxFilePath", "fileEndingTalon", "fileEndingTalonList", "main", "text", "textIsList", "options", "filePath", "debug", "isListFile", "updated", "talonListFormatter", "node", "parseText", "talonFormatter"] + "sources": ["../src/util/constants.ts", "../src/util/getEndOfLine.ts", "../src/util/createDebugLogger.ts", "../src/util/getColumnWidth.ts", "../src/util/getIndentation.ts", "../src/util/SyntaxError.ts", "../src/util/SyntaxTreeError.ts", "../src/talon/convertQuotes.ts", "../src/talon/talonFormatter.ts", "../src/talon/parseTalonList.ts", "../src/talon/talonListFormatter.ts", "../src/node/cli.ts", "../src/util/getErrorMessage.ts", "../src/node/createLogger.ts", "../src/node/FilePatternError.ts", "../src/node/getOptionsFromConfig.ts", "../src/node/isMissingFileError.ts", "../src/node/normalizeToPosix.ts", "../src/types.ts", "../src/node/getDefaultArguments.ts", "../src/node/parseArgs.ts", "../src/node/parseFilePatterns.ts", "../src/node/lstatSafe.ts", "../src/node/printHelp.ts", "../package.json", "../src/node/printVersion.ts", "../src/node/setExitCode.ts", "../src/node/parseText.ts", "../src/node/talonFormatter.ts"], + "sourcesContent": ["// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import type { DebugLogger } from \"../types.js\";\n\nexport function createDebugLogger(debug: boolean): DebugLogger {\n return {\n debug(message: string) {\n if (debug) {\n console.warn(`[debug] ${message}`);\n }\n },\n };\n}\n", "export function getColumnWidth(text: string): number | undefined {\n const match = /# fmt: columnWidth=(\\d+)/.exec(text);\n\n if (match != null) {\n return Number.parseInt(match[1], 10);\n }\n\n return undefined;\n}\n", "import { DEFAULT_INDENT_WIDTH } from \"./constants.js\";\n\nexport function getIndentation(\n indentTabs: boolean | undefined,\n indentSize: number | undefined,\n): string {\n return indentTabs ? \"\\t\" : \" \".repeat(indentSize ?? DEFAULT_INDENT_WIDTH);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n public constructor(private readonly point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n public getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import type { SyntaxNode } from \"../types.js\";\nimport { SyntaxError } from \"./SyntaxError.js\";\n\nexport class SyntaxTreeError extends SyntaxError {\n public constructor(rootNode: SyntaxNode) {\n super(findFirstProblemNode(rootNode)?.startPosition);\n this.name = \"SyntaxTreeError\";\n }\n}\n\nfunction findFirstProblemNode(node: SyntaxNode): SyntaxNode | null {\n if (node.isError || node.isMissing) {\n return node;\n }\n for (const child of node.children) {\n if (!child.hasError) {\n continue;\n }\n const errorNode = findFirstProblemNode(child);\n if (errorNode != null) {\n return errorNode;\n }\n }\n return null;\n}\n", "export function convertQuotes(text: string): string {\n // Convert single quotes to double quotes\n if (\n text.length > 0 &&\n text.startsWith(\"'\") &&\n text.endsWith(\"'\") &&\n !text.includes('\"')\n ) {\n const innerText = text.slice(1, -1).replaceAll(String.raw`\\'`, \"'\");\n return `\"${innerText}\"`;\n }\n\n return text;\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"../types.js\";\nimport {\n DEFAULT_INSERT_FINAL_NEWLINE,\n DEFAULT_MAX_LINE_LENGTH,\n} from \"../util/constants.js\";\nimport { createDebugLogger } from \"../util/createDebugLogger.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { getIndentation } from \"../util/getIndentation.js\";\nimport { SyntaxTreeError } from \"../util/SyntaxTreeError.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\n\nexport type Options = FormatterOptions<\n | \"endOfLine\"\n | \"indentTabs\"\n | \"indentSize\"\n | \"maxLineLength\"\n | \"columnWidth\"\n | \"insertFinalNewline\"\n | \"preserveMultiline\"\n>;\n\nexport function talonFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const columnWidth = getColumnWidth(node.text) ?? options.columnWidth;\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TalonFormatter(\n indentation,\n eol,\n options.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH,\n columnWidth,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n options.preserveMultiline ?? false,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TalonFormatter {\n private readonly lines: string[] = [];\n private lastRow = 0;\n private readonly logger: DebugLogger;\n\n public constructor(\n private readonly indent: string,\n private readonly eol: string,\n private readonly maxLineLength: number,\n private readonly columnWidth: number | undefined,\n private readonly insertFinalNewline: boolean,\n private readonly preserveMultiline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n public getText(node: SyntaxNode): string {\n this.addNode(node);\n\n const result = this.lines.join(this.eol).trimEnd();\n\n if (result.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return result + this.eol;\n }\n\n return result;\n }\n\n private addNL(): void {\n if (this.lines[this.lines.length - 1] !== \"\") {\n this.lines.push(\"\");\n }\n }\n\n private addNode(node: SyntaxNode, isIndented = false): void {\n if (node.startPosition.row > this.lastRow + 1) {\n this.addNL();\n }\n this.lastRow = node.endPosition.row;\n this.addNodeHelper(node, isIndented);\n this.lastRow = node.endPosition.row;\n }\n\n private addNodeHelper(node: SyntaxNode, isIndented = false): void {\n switch (node.type) {\n case \"source_file\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"matches\": {\n // There are match nodes or there is a comment before\n if (node.children.length > 1 || !isFirstChild(node)) {\n for (const n of node.children) {\n this.addNode(n);\n }\n this.addNL();\n }\n break;\n }\n\n case \"declarations\":\n for (const n of node.children) {\n this.addNode(n);\n }\n break;\n\n case \"block\":\n for (const n of node.children) {\n this.addNode(n, true);\n }\n break;\n\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n this.addLeftRightNode(node, false);\n break;\n\n case \"settings_declaration\":\n if (\n this.lines.length > 0 &&\n !this.lines[this.lines.length - 1].startsWith(\"#\")\n ) {\n this.addNL();\n }\n this.addLeftRightNode(node, true);\n this.addNL();\n break;\n\n case \"comment\": {\n // When using crlf eol comments have a trailing `\\r`\n const text = node.text.trimEnd();\n const nodeText =\n isIndented || node.startPosition.column > 0\n ? `${this.indent}${text}`\n : text;\n this.lines.push(nodeText);\n break;\n }\n\n default: {\n const nodeText = this.getNodeText(node);\n this.lines.push(\n isIndented ? `${this.indent}${nodeText}` : nodeText,\n );\n }\n }\n }\n\n private getNodeText(node: SyntaxNode): string {\n switch (node.type) {\n case \"source_file\":\n case \"matches\":\n case \"declarations\":\n case \"block\":\n case \"command_declaration\":\n case \"key_binding_declaration\":\n case \"parrot_declaration\":\n case \"noise_declaration\":\n case \"face_declaration\":\n case \"gamepad_declaration\":\n case \"deck_declaration\":\n case \"settings_declaration\":\n case \"comment\":\n throw new Error(\n `Node type '${node.type}' should be handled in addNode, not getNodeText`,\n );\n\n case \"parenthesized_rule\":\n return this.pairWithChildren(\n node,\n node.parent != null && rangeEqual(node, node.parent),\n );\n\n case \"optional\":\n return this.pairWithChildren(node);\n\n case \"expression_statement\":\n case \"assignment_statement\":\n case \"seq\":\n case \"choice\":\n return node.children.map((n) => this.getNodeText(n)).join(\" \");\n\n case \"rule\":\n case \"action\":\n case \"key_action\":\n case \"sleep_action\":\n case \"argument_list\":\n case \"key_binding\":\n case \"face_binding\":\n case \"gamepad_binding\":\n case \"parrot_binding\":\n case \"noise_binding\":\n case \"deck_binding\":\n case \"tag_import_declaration\":\n case \"match\":\n case \"for_statement\":\n case \"if_statement\":\n return node.children.map((n) => this.getNodeText(n)).join(\"\");\n\n case \"string\":\n return formatString(node);\n\n case \"match_modifier\":\n case \"for\":\n case \"if\":\n case \":\":\n case \",\":\n return `${node.text} `;\n\n case \"in\":\n return ` ${node.text} `;\n\n case \"implicit_string\":\n return node.text.trim();\n\n case \"tag_binding\":\n case \"settings_binding\":\n case \"capture\":\n case \"list\":\n case \"key(\":\n case \"sleep(\":\n case \"gamepad(\":\n case \"face(\":\n case \"parrot(\":\n case \"noise(\":\n case \"identifier\":\n case \"variable\":\n case \"word\":\n case \"binary_operator\":\n case \"integer\":\n case \"float\":\n case \"start_anchor\":\n case \"end_anchor\":\n case \"repeat\":\n case \"deck(\":\n case \"repeat1\":\n case \"(\":\n case \")\":\n case \"=\":\n case \"-\":\n case \"|\":\n return node.text;\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private pairWithChildren(node: SyntaxNode, unwrap = false): string {\n const { children } = node;\n const middle = children\n .slice(1, -1)\n .map((n) => this.getNodeText(n))\n .join(\" \");\n if (unwrap) {\n return middle;\n }\n const pre = children[0].text;\n const post = children[children.length - 1].text;\n return `${pre}${middle}${post}`;\n }\n\n private addLeftRightNode(node: SyntaxNode, forceMultiline: boolean): void {\n const [leftNode, _colonNode, ...rightNodes] = node.children;\n const left = this.getNodeText(leftNode);\n\n if (!forceMultiline && rightNodes.length === 1) {\n if (\n !this.preserveMultiline ||\n isLeftRightSingleLine(leftNode, rightNodes)\n ) {\n const rightNode = rightNodes[0];\n if (\n rightNode.children.length === 1 &&\n !forceMultilineBody(rightNode.children[0])\n ) {\n const right = this.getNodeText(rightNode.children[0]);\n const leftWithPadding =\n this.columnWidth != null\n ? `${left}: `.padEnd(this.columnWidth)\n : `${left}: `;\n if (\n leftWithPadding.length + right.length <=\n this.maxLineLength\n ) {\n this.lines.push(leftWithPadding + right);\n return;\n }\n }\n }\n }\n\n this.lines.push(`${left}:`);\n\n for (const n of rightNodes) {\n this.addNode(n, true);\n }\n }\n}\n\n// Returns true if the node should remain in the declaration block instead of\n// being inlined after the command colon.\nfunction forceMultilineBody(node: SyntaxNode): boolean {\n switch (node.type) {\n case \"if_statement\":\n case \"for_statement\":\n return true;\n default:\n return false;\n }\n}\n\n// Returns true if the left and right nodes are on the same line, allowing them to be formatted on a single line.\nfunction isLeftRightSingleLine(\n left: SyntaxNode,\n rights: SyntaxNode[],\n): boolean {\n return left.endPosition.row === rights[rights.length - 1].startPosition.row;\n}\n\nfunction rangeEqual(a: SyntaxNode, b: SyntaxNode): boolean {\n return (\n a.startPosition.row === b.startPosition.row &&\n a.startPosition.column === b.startPosition.column &&\n a.endPosition.row === b.endPosition.row &&\n a.endPosition.column === b.endPosition.column\n );\n}\n\nfunction isFirstChild(node: SyntaxNode): boolean {\n return node.id === node.parent?.children[0].id;\n}\n\nfunction formatString(node: SyntaxNode): string {\n // Convert single quotes to double quotes\n const text = convertQuotes(node.text);\n\n // A single string literal is allowed as syntactic sugar for the insert\n // action, but not in combination with other sibling statements.\n if (\n node.parent?.type === \"expression_statement\" &&\n node.parent.parent?.type === \"block\" &&\n rangeEqual(node, node.parent) &&\n node.parent.parent.children.length > 1\n ) {\n return `insert(${text})`;\n }\n\n return text;\n}\n", "interface TalonListHeader {\n type: \"header\";\n key: string;\n value: string;\n}\n\ninterface TalonListItem {\n type: \"item\";\n key: string;\n value?: string;\n}\n\ninterface EmptyLine {\n type: \"empty\";\n}\n\ninterface CommentLine {\n type: \"comment\";\n text: string;\n}\n\nexport interface TalonList {\n headers: (TalonListHeader | CommentLine)[];\n items: (TalonListItem | CommentLine | EmptyLine)[];\n}\n\nexport function parseTalonList(text: string): TalonList {\n const lines = text.split(/\\r?\\n/).map((l) => l.trim());\n const separatorIndex = lines.indexOf(\"-\");\n\n if (separatorIndex === -1) {\n throw new Error(\"Separator not found in talon list\");\n }\n\n const headerLines = lines.slice(0, separatorIndex);\n const bodyLines = trim(lines.slice(separatorIndex + 1));\n\n const result: TalonList = {\n headers: [],\n items: [],\n };\n\n for (const line of headerLines) {\n if (line.length === 0) {\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.headers.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n if (value == null) {\n throw new Error(\"Header value missing\");\n }\n result.headers.push({ type: \"header\", key, value });\n }\n\n for (const line of bodyLines) {\n if (line.length === 0) {\n result.items.push({ type: \"empty\" });\n continue;\n }\n if (line.startsWith(\"#\")) {\n result.items.push({ type: \"comment\", text: line });\n continue;\n }\n const [key, value] = splitLine(line);\n result.items.push({ type: \"item\", key, value });\n }\n\n return result;\n}\n\nfunction splitLine(line: string): [string, string | undefined] {\n const index = line.indexOf(\":\");\n if (index === -1) {\n return [line, undefined];\n }\n return [line.slice(0, index).trimEnd(), line.slice(index + 1).trimStart()];\n}\n\nfunction trim(list: string[]): string[] {\n const startIndex = list.findIndex((l) => l.length > 0);\n if (startIndex === -1) {\n return [];\n }\n const endIndex = list.findLastIndex((l) => l.length > 0);\n return list.slice(startIndex, endIndex + 1);\n}\n", "import type { FormatterOptions } from \"../types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"../util/constants.js\";\nimport { getColumnWidth } from \"../util/getColumnWidth.js\";\nimport { getEndOfLine } from \"../util/getEndOfLine.js\";\nimport { convertQuotes } from \"./convertQuotes.js\";\nimport { parseTalonList } from \"./parseTalonList.js\";\n\ntype Options = FormatterOptions<\n \"endOfLine\" | \"columnWidth\" | \"insertFinalNewline\"\n>;\n\nexport function talonListFormatter(\n text: string,\n options: Options = {},\n): string {\n const columnWidth = getColumnWidth(text) ?? options.columnWidth;\n const eol = getEndOfLine(options.endOfLine);\n const talonList = parseTalonList(text);\n talonList.headers.sort((a, _b) =>\n a.type === \"header\" && a.key === \"list\" ? -1 : 0,\n );\n const lines: string[] = [];\n\n for (const header of talonList.headers) {\n if (header.type === \"comment\") {\n lines.push(header.text);\n continue;\n }\n lines.push(`${header.key}: ${header.value}`);\n }\n\n lines.push(\"-\", \"\");\n\n for (const item of talonList.items) {\n if (item.type === \"empty\") {\n lines.push(\"\");\n continue;\n }\n if (item.type === \"comment\") {\n lines.push(item.text);\n continue;\n }\n if (item.value != null) {\n const keyWithColon =\n columnWidth != null\n ? `${item.key}: `.padEnd(columnWidth)\n : `${item.key}: `;\n const value = convertQuotes(item.value);\n lines.push(`${keyWithColon}${value}`);\n } else {\n lines.push(item.key);\n }\n }\n\n if (lines.length === 0) {\n return \"\";\n }\n\n if (options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE) {\n lines.push(\"\");\n }\n\n return lines.join(eol);\n}\n", "import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as process from \"node:process\";\nimport type { Readable } from \"node:stream\";\nimport getStdin from \"get-stdin\";\nimport type { CLI, Logger, ParsedArgs } from \"../types.js\";\nimport { EXIT_ERROR, EXIT_FAIL, EXIT_OK } from \"../util/constants.js\";\nimport type { ExitCode } from \"../util/constants.js\";\nimport { getErrorMessage } from \"../util/getErrorMessage.js\";\nimport { isSyntaxError } from \"../util/SyntaxError.js\";\nimport { createLogger } from \"./createLogger.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { getOptionsFromConfig } from \"./getOptionsFromConfig.js\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\nimport { parseArgs } from \"./parseArgs.js\";\nimport { parseFilePatterns } from \"./parseFilePatterns.js\";\nimport { printHelp } from \"./printHelp.js\";\nimport { printVersion } from \"./printVersion.js\";\nimport { setExitCode } from \"./setExitCode.js\";\n\nexport async function main(cli: CLI): Promise {\n let logger = createLogger();\n\n try {\n const args = parseArgs(process.argv.slice(2));\n logger = createLogger(args.quiet);\n const exitCode = await mainUnsafe({ cli, args, logger });\n setExitCode(exitCode);\n } catch (error) {\n if (error instanceof FilePatternError) {\n for (const message of error.messages) {\n logger.error(message);\n }\n } else {\n logger.error(getErrorMessage(error));\n }\n setExitCode(EXIT_ERROR);\n }\n}\n\ninterface MainUnsafeArgs {\n cli: CLI;\n args: ParsedArgs;\n logger: Logger;\n}\n\nfunction mainUnsafe({ cli, args, logger }: MainUnsafeArgs): Promise {\n if (args.help) {\n printHelp(cli);\n return Promise.resolve(EXIT_OK);\n }\n\n if (args.version) {\n printVersion();\n return Promise.resolve(EXIT_OK);\n }\n\n const hasFilePatterns = args.filePatterns.length > 0;\n\n if (hasFilePatterns) {\n return mainFormatFiles({\n cli,\n logger,\n check: args.check,\n debug: args.debug,\n filePatterns: args.filePatterns,\n });\n }\n\n // If no file patterns are provided, check if there's input from stdin.\n // If stdin TTY it's an interactive terminal, so we shouldn't read from it.\n if (!process.stdin.isTTY) {\n return mainFormatStdin({\n cli,\n logger,\n stdin: process.stdin,\n check: args.check,\n debug: args.debug,\n });\n }\n\n throw new Error(\n \"No input files specified. Use --help for usage information.\",\n );\n}\n\ninterface MainFormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePatterns: string[];\n}\n\nasync function mainFormatFiles({\n cli,\n logger,\n check,\n debug,\n filePatterns,\n}: MainFormatFilesArgs): Promise {\n if (check) {\n logger.log(\"Checking formatting...\");\n }\n\n const filePaths = await parseFilePatterns(cli, filePatterns);\n const [changedFileCount, hasError] = await formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n });\n\n if (check) {\n if (changedFileCount > 0) {\n logger.warn(\n `Code style issues found in ${changedFileCount} file(s).`,\n );\n if (!hasError) {\n return EXIT_FAIL;\n }\n }\n\n if (!hasError) {\n logger.log(\"All matched files use correct code style!\");\n }\n }\n\n if (hasError) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\ninterface FormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePaths: string[];\n}\n\nexport async function formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n}: FormatFilesArgs): Promise<[number, boolean]> {\n let changedFileCount = 0;\n let hasError = false;\n\n for (const filePath of filePaths) {\n try {\n const fileWasChanged = await formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n });\n if (fileWasChanged) {\n changedFileCount++;\n }\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(getDisplayPath(filePath)));\n } else {\n logger.error(\n `${getDisplayPath(filePath)}: ${getErrorMessage(error)}`,\n );\n }\n hasError = true;\n }\n }\n\n return [changedFileCount, hasError];\n}\n\ninterface FormatFileArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePath: string;\n}\n\nexport async function formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n}: FormatFileArgs): Promise {\n try {\n const options = await getOptionsFromConfig(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const formatted = await cli.format(content, options, filePath, debug);\n\n if (formatted === content) {\n return false;\n }\n\n logger.log(getDisplayPath(filePath));\n\n if (!check) {\n await fs.writeFile(filePath, formatted, \"utf8\");\n }\n\n return true;\n } catch (error) {\n if (isMissingFileError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction getDisplayPath(filePath: string): string {\n return normalizeToPosix(path.relative(process.cwd(), filePath));\n}\n\ninterface MainFormatStdinArgs {\n cli: CLI;\n logger: Logger;\n stdin: Readable;\n check: boolean;\n debug: boolean;\n}\n\nexport async function mainFormatStdin({\n cli,\n logger,\n stdin,\n check,\n debug,\n}: MainFormatStdinArgs): Promise {\n const input = await getStdin({ stdin });\n const fileEnding = cli.getStdinFileEnding(input);\n const fauxFileName = `stdin.${fileEnding}`;\n const fauxFilePath = path.resolve(fauxFileName);\n const options = await getOptionsFromConfig(fauxFilePath);\n let formatted: string;\n\n try {\n formatted = await cli.format(input, options, fauxFilePath, debug);\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(\"stdin\"));\n return EXIT_ERROR;\n }\n throw error;\n }\n\n if (check) {\n if (input !== formatted) {\n logger.warn(\"Code style issues found in stdin.\");\n return EXIT_FAIL;\n }\n\n return EXIT_OK;\n }\n\n process.stdout.write(formatted);\n\n return EXIT_OK;\n}\n", "export function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import * as process from \"node:process\";\nimport type { WriteStream } from \"node:tty\";\nimport type { Logger, LoggerEntry, TestLogger } from \"../types.js\";\n\ntype LogCallback = (message: string) => void;\ntype ColorizeCallback = (message: string, color: string) => string;\ntype LoggerStream = Pick & Partial;\n\nconst ANSI_RESET = \"\\u001B[0m\";\nconst ANSI_YELLOW = \"\\u001B[33m\";\nconst ANSI_RED = \"\\u001B[31m\";\nconst WARN_PREFIX = \"[warn]\";\nconst ERROR_PREFIX = \"[error]\";\n\nexport function createLogger(quiet = false): Logger {\n return createLoggerFromStreams(process.stdout, process.stderr, quiet);\n}\n\nexport function createLoggerFromStreams(\n stdout: LoggerStream,\n stderr: LoggerStream,\n quiet = false,\n): Logger {\n const colorize: ColorizeCallback = shouldUseColor(stderr)\n ? (message, color) => `${color}${message}${ANSI_RESET}`\n : (message, _color) => message;\n\n let log: LogCallback;\n let warn: LogCallback;\n\n if (quiet) {\n log = () => {\n // no-op\n };\n warn = () => {\n // no-op\n };\n } else {\n log = (message: string) => {\n stdout.write(`${message}\\n`);\n };\n warn = (message: string) => {\n stderr.write(`${colorize(WARN_PREFIX, ANSI_YELLOW)} ${message}\\n`);\n };\n }\n\n return {\n log,\n warn,\n error(message: string) {\n stderr.write(`${colorize(ERROR_PREFIX, ANSI_RED)} ${message}\\n`);\n },\n };\n}\n\nexport function createTestLogger(): TestLogger {\n const entries: LoggerEntry[] = [];\n\n return {\n log(message: string) {\n entries.push({ level: \"log\", message });\n },\n warn(message: string) {\n entries.push({ level: \"warn\", message });\n },\n error(message: string) {\n entries.push({ level: \"error\", message });\n },\n getEntries() {\n return entries;\n },\n };\n}\n\nfunction shouldUseColor(stream: LoggerStream): boolean {\n if (\"NO_COLOR\" in process.env) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n", "export class FilePatternError extends Error {\n public name = \"FilePatternError\";\n\n public constructor(public messages: string[]) {\n super(\n `One or more file pattern errors occurred:\\n${messages.join(\"\\n\")}`,\n );\n }\n}\n", "import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n", "export function isMissingFileError(\n error: unknown,\n): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import * as path from \"node:path\";\n\n/**\n * Replace `\\` with `/` on Windows\n * @param {string} filepath\n * @returns {string}\n */\nexport const normalizeToPosix: (filepath: string) => string =\n path.sep === \"\\\\\"\n ? (filepath: string) => filepath.replaceAll(\"\\\\\", \"/\")\n : (filepath: string) => filepath;\n", "import type { KnownProps } from \"editorconfig\";\n\nexport const KNOWN_ARGUMENTS = [\n \"--help\",\n \"--version\",\n \"--quiet\",\n \"--check\",\n \"--debug\",\n] as const;\n\nexport type KnownArgument = (typeof KNOWN_ARGUMENTS)[number];\n\nexport function isKnownArgument(value: string): value is KnownArgument {\n return (KNOWN_ARGUMENTS as readonly string[]).includes(value);\n}\n\nexport interface CLI {\n binName: \"snippet-fmt\" | \"talon-fmt\" | \"tree-sitter-fmt\";\n fileEndings: readonly string[];\n\n getStdinFileEnding(text: string): string;\n format(\n text: string,\n options: Options,\n filePath: string,\n debug: boolean,\n ): Promise;\n}\n\nexport type EndOfLine = \"lf\" | \"crlf\";\n\nexport interface Options {\n endOfLine?: EndOfLine;\n indentTabs?: boolean;\n indentSize?: number;\n maxLineLength?: number;\n columnWidth?: number;\n insertFinalNewline?: boolean;\n preserveMultiline?: boolean;\n}\n\nexport type FormatterOptions = Pick;\n\nexport interface ParsedArgs {\n filePatterns: string[];\n help: boolean;\n version: boolean;\n check: boolean;\n quiet: boolean;\n debug: boolean;\n}\n\nexport interface LoggerEntry {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface Logger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface TestLogger extends Logger {\n getEntries(): readonly LoggerEntry[];\n}\n\nexport interface DebugLogger {\n debug(message: string): void;\n}\n\nexport interface EditorConfigOptions extends KnownProps {\n max_line_length?: number | \"unset\";\n column_width?: number | \"unset\";\n preserve_multiline?: boolean | \"unset\";\n}\n\nexport interface Point {\n row: number;\n column: number;\n}\n\n/**\n * Internal representation of the Tree sitter node. Used so that our api doesn't\n * need to export or expose clients to Tree sitter types. Also makes it simple\n * to write tests internally.\n */\nexport interface SyntaxNode {\n id: number;\n text: string;\n type: string;\n startPosition: Point;\n endPosition: Point;\n hasError: boolean;\n isError: boolean;\n isMissing: boolean;\n parent: SyntaxNode | null;\n children: SyntaxNode[];\n}\n", "import type { ParsedArgs } from \"../types.js\";\n\nexport function getDefaultArguments(): ParsedArgs {\n return {\n filePatterns: [],\n help: false,\n version: false,\n quiet: false,\n debug: false,\n check: false,\n };\n}\n", "import { isKnownArgument } from \"../types.js\";\nimport type { KnownArgument, ParsedArgs } from \"../types.js\";\nimport { getDefaultArguments } from \"./getDefaultArguments.js\";\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result = getDefaultArguments();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === \"--\") {\n // All following arguments are treated as file patterns, even if they start with \"--\"\n result.filePatterns.push(...argv.slice(i + 1));\n break;\n }\n\n if (isKnownArgument(arg) && parseKnownArgument(result, arg)) {\n continue;\n }\n\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n result.filePatterns.push(arg);\n }\n\n return result;\n}\n\nfunction parseKnownArgument(result: ParsedArgs, arg: KnownArgument): boolean {\n switch (arg) {\n case \"--help\":\n result.help = true;\n return true;\n case \"--version\":\n result.version = true;\n return true;\n case \"--quiet\":\n result.quiet = true;\n return true;\n case \"--check\":\n result.check = true;\n return true;\n case \"--debug\":\n result.debug = true;\n return true;\n default:\n return false;\n }\n}\n", "import * as path from \"node:path\";\nimport type { Options } from \"fast-glob\";\nimport fastGlob from \"fast-glob\";\nimport type { CLI } from \"../types.js\";\nimport { GLOB_IGNORE_PATTERNS } from \"../util/constants.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { lstatSafe } from \"./lstatSafe.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\n\nexport async function parseFilePatterns(\n cli: CLI,\n filePatterns: string[],\n): Promise {\n const seen = new Set();\n const globFileEndingPattern = getGlobFileEndingsPattern(cli.fileEndings);\n const errorMessages: string[] = [];\n\n const globOptions: Options = {\n dot: true,\n followSymbolicLinks: false,\n ignore: GLOB_IGNORE_PATTERNS,\n };\n\n for (const pattern of filePatterns) {\n const absolutePath = path.resolve(pattern);\n const stat = await lstatSafe(absolutePath);\n\n if (stat != null) {\n if (stat.isSymbolicLink()) {\n errorMessages.push(\n `Specified pattern is a symbolic link: ${pattern}`,\n );\n continue;\n }\n\n if (stat.isFile()) {\n seen.add(absolutePath);\n continue;\n }\n\n if (stat.isDirectory()) {\n const files = await fastGlob(`**/*.${globFileEndingPattern}`, {\n ...globOptions,\n cwd: absolutePath,\n });\n if (files.length === 0) {\n errorMessages.push(\n `No matching files were found in the directory: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(absolutePath, file));\n }\n continue;\n }\n }\n\n const glob = normalizeToPosix(pattern);\n const allFiles = await fastGlob(glob, globOptions);\n const filteredFiles = allFiles.filter((file) =>\n hasSupportedFileEnding(file, cli.fileEndings),\n );\n if (filteredFiles.length === 0) {\n errorMessages.push(\n `No files matching the pattern were found: ${pattern}`,\n );\n }\n for (const file of filteredFiles) {\n seen.add(path.resolve(file));\n }\n }\n\n if (errorMessages.length > 0) {\n throw new FilePatternError(errorMessages);\n }\n\n return Array.from(seen).toSorted((a, b) => a.localeCompare(b));\n}\n\nfunction getGlobFileEndingsPattern(fileEndings: readonly string[]): string {\n return fileEndings.length === 1\n ? fileEndings[0]\n : `{${fileEndings.join(\",\")}}`;\n}\n\nfunction hasSupportedFileEnding(\n file: string,\n fileEndings: readonly string[],\n): boolean {\n const extension = path.extname(file).slice(1);\n return fileEndings.includes(extension);\n}\n", "import type { Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\n\nexport async function lstatSafe(filePath: string): Promise {\n try {\n return await fs.lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import type { CLI } from \"../types.js\";\nimport { KNOWN_ARGUMENTS } from \"../types.js\";\n\nexport function printHelp(cli: CLI): void {\n process.stdout.write(\n `Usage: ${cli.binName} [options] [file/dir/glob ...]\\n`,\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(\"Options:\\n\");\n\n for (const option of KNOWN_ARGUMENTS) {\n process.stdout.write(` ${option}\\n`);\n }\n}\n", "{\n \"name\": \"@cursorless/talon-tools\",\n \"version\": \"0.11.0\",\n \"description\": \"Linting and formatting tools for Talon and Cursorless\",\n \"author\": \"Cursorless Dev\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"!dist/test\",\n \"!dist/build.*\"\n ],\n \"types\": \"./dist/lib.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/lib.d.ts\",\n \"default\": \"./dist/lib.js\"\n },\n \"./node\": {\n \"types\": \"./dist/node/libNode.d.ts\",\n \"default\": \"./dist/libNode.js\"\n }\n },\n \"bin\": {\n \"snippet-fmt\": \"dist/snippetFormatter.js\",\n \"talon-fmt\": \"dist/talonFormatter.js\",\n \"tree-sitter-fmt\": \"dist/treeSitterFormatter.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cursorless-dev/talon-tools.git\"\n },\n \"funding\": \"https://github.com/sponsors/cursorless-dev\",\n \"sponsor\": {\n \"url\": \"https://github.com/sponsors/cursorless-dev\"\n },\n \"scripts\": {\n \"build\": \"npm run clean && tsc -p . && tsx ./src/build.ts\",\n \"clean\": \"rm -rf dist/*\",\n \"lint\": \"npm run typecheck && npm run lint:ts && npm run lint:fmt\",\n \"typecheck\": \"tsc -p . --noEmit\",\n \"lint:ts\": \"oxlint -c oxlint.config.mts --deny-warnings .\",\n \"lint:fmt\": \"oxfmt --check .\",\n \"fix\": \"npm run fix:ts && npm run fix:fmt\",\n \"fix:ts\": \"oxlint -c oxlint.config.mts --fix .\",\n \"fix:fmt\": \"oxfmt .\",\n \"test\": \"tsx src/test/runAllTests.ts\",\n \"test:subset\": \"tsx src/test/runAllTests.ts --subset\"\n },\n \"dependencies\": {\n \"@cursorless/tree-sitter-wasms\": \"^0.9.0\",\n \"editorconfig\": \"^3.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"get-stdin\": \"^10.0.0\",\n \"web-tree-sitter\": \"^0.26.8\"\n },\n \"devDependencies\": {\n \"@types/mocha\": \"^10.0.10\",\n \"@types/node\": \"^24.12.2\",\n \"esbuild\": \"^0.28.0\",\n \"mocha\": \"^11.7.5\",\n \"oxfmt\": \"^0.47.0\",\n \"oxlint-tsgolint\": \"^0.22.1\",\n \"oxlint\": \"^1.62.0\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^6.0.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function printVersion(): void {\n process.stdout.write(`${packageJson.version}\\n`);\n}\n", "export function setExitCode(code: number): void {\n Reflect.set(process, \"exitCode\", code);\n}\n", "import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Language, Parser } from \"web-tree-sitter\";\nimport type { SyntaxNode } from \"../types.js\";\n\ntype ParserName = \"tree-sitter-talon\" | \"tree-sitter-query\";\n\nlet initPromise: Promise | undefined;\nconst languageCache = new Map>();\n// oxlint-disable-next-line unicorn/prefer-import-meta-properties\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction initTreeSitter() {\n initPromise ??= Parser.init();\n return initPromise;\n}\n\nfunction loadLanguage(parserName: ParserName) {\n let promise = languageCache.get(parserName);\n\n if (promise == null) {\n const wasmFilePath = getWasmFilePath(parserName);\n promise = Language.load(wasmFilePath);\n languageCache.set(parserName, promise);\n }\n\n return promise;\n}\n\nfunction getWasmFilePath(parserName: ParserName) {\n const fileName = `${parserName}.wasm`;\n const wasmFilePath = [\n path.join(\n moduleDir,\n \"../../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n path.join(\n moduleDir,\n \"../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n ].find((candidate) => fs.existsSync(candidate));\n\n if (wasmFilePath == null) {\n throw new Error(`Could not find ${fileName}`);\n }\n\n return wasmFilePath;\n}\n\nexport async function parseText(\n text: string,\n parserName: ParserName,\n): Promise {\n await initTreeSitter();\n\n const language = await loadLanguage(parserName);\n\n const parser = new Parser();\n parser.setLanguage(language);\n\n const tree = parser.parse(text);\n\n if (tree == null) {\n throw new Error(\"Failed to parse text\");\n }\n\n return tree.rootNode;\n}\n", "#!/usr/bin/env node\n\nimport { talonListFormatter } from \"../lib.js\";\nimport { talonFormatter } from \"../talon/talonFormatter.js\";\nimport { main } from \"./cli.js\";\nimport { parseText } from \"./parseText.js\";\n\nconst fileEndingTalon = \"talon\";\nconst fileEndingTalonList = \"talon-list\";\n\nvoid main({\n binName: \"talon-fmt\",\n fileEndings: [fileEndingTalon, fileEndingTalonList],\n\n getStdinFileEnding(text) {\n return textIsList(text) ? fileEndingTalonList : fileEndingTalon;\n },\n\n format: async (text, options, filePath, debug) => {\n if (isListFile(text, filePath)) {\n return talonListFormatter(text, options);\n }\n\n const node = await parseText(text, \"tree-sitter-talon\");\n return talonFormatter(node, options, debug);\n },\n});\n\nfunction isListFile(text: string, filePath: string): boolean {\n if (filePath.endsWith(\".talon\")) {\n return false;\n }\n if (filePath.endsWith(\".talon-list\")) {\n return true;\n }\n return textIsList(text);\n}\n\nfunction textIsList(text: string): boolean {\n return text.trimStart().startsWith(\"list:\");\n}\n"], + "mappings": ";AAaO,IAAMA,EAAiB,CAC1B,OACA,OACA,MACA,eACA,aACJ,EAEaC,EAAuBD,EAAe,IAC9CE,GAAY,MAAMA,CAAO,KAC9B,ECrBO,SAASC,EAAaC,EAAyB,CAClD,OAAOA,IAAQ,OAAS;AAAA,EAAS;AAAA,CACrC,CCFO,SAASC,EAAkBC,EAA6B,CAC3D,MAAO,CACH,MAAMC,EAAiB,CACfD,GACA,QAAQ,KAAK,WAAWC,CAAO,EAAE,CAEzC,CACJ,CACJ,CCVO,SAASC,EAAeC,EAAkC,CAC7D,IAAMC,EAAQ,2BAA2B,KAAKD,CAAI,EAElD,GAAIC,GAAS,KACT,OAAO,OAAO,SAASA,EAAM,CAAC,EAAG,EAAE,CAI3C,CCNO,SAASC,EACZC,EACAC,EACM,CACN,OAAOD,EAAa,IAAO,IAAI,OAAOC,GAAc,CAAoB,CAC5E,CCLA,IAAMC,EAAe,eAERC,EAAN,cAA0B,KAAM,CAG5B,YAA6BC,EAAe,CAC/C,IAAMC,EAAWC,GAAYF,CAAK,EAClC,MAAMG,GAAWF,CAAQ,CAAC,EAFM,WAAAD,EAGhC,KAAK,KAAO,cACZ,KAAK,SAAWC,CACpB,CALoC,MAFnB,SASV,eAAeG,EAAsB,CACxC,OAAO,KAAK,UAAY,KAClB,GAAGA,CAAI,IAAI,KAAK,QAAQ,MAAMN,CAAY,GAC1C,GAAGM,CAAI,KAAKN,CAAY,EAClC,CACJ,EAEO,SAASO,EAAcC,EAAsC,CAChE,OAAOA,aAAiBP,CAC5B,CAEA,SAASI,GAAWF,EAAsC,CACtD,OAAOA,GAAY,KAAO,GAAGH,CAAY,OAAOG,CAAQ,IAAMH,CAClE,CAEA,SAASI,GAAYF,EAA8C,CAC/D,OAAOA,GAAS,KAAO,GAAGA,EAAM,IAAM,CAAC,IAAIA,EAAM,OAAS,CAAC,GAAK,MACpE,CC5BO,IAAMO,EAAN,cAA8BC,CAAY,CACtC,YAAYC,EAAsB,CACrC,MAAMC,EAAqBD,CAAQ,GAAG,aAAa,EACnD,KAAK,KAAO,iBAChB,CACJ,EAEA,SAASC,EAAqBC,EAAqC,CAC/D,GAAIA,EAAK,SAAWA,EAAK,UACrB,OAAOA,EAEX,QAAWC,KAASD,EAAK,SAAU,CAC/B,GAAI,CAACC,EAAM,SACP,SAEJ,IAAMC,EAAYH,EAAqBE,CAAK,EAC5C,GAAIC,GAAa,KACb,OAAOA,CAEf,CACA,OAAO,IACX,CCxBO,SAASC,EAAcC,EAAsB,CAEhD,OACIA,EAAK,OAAS,GACdA,EAAK,WAAW,GAAG,GACnBA,EAAK,SAAS,GAAG,GACjB,CAACA,EAAK,SAAS,GAAG,EAGX,IADWA,EAAK,MAAM,EAAG,EAAE,EAAE,WAAW,OAAO,QAAS,GAAG,CAC9C,IAGjBA,CACX,CCSO,SAASC,EACZC,EACAC,EAAmB,CAAC,EACpBC,EAAQ,GACF,CACN,GAAIF,EAAK,SACL,MAAM,IAAIG,EAAgBH,CAAI,EAGlC,IAAMI,EAAcC,EAAeL,EAAK,IAAI,GAAKC,EAAQ,YACnDK,EAAcC,EAAeN,EAAQ,WAAYA,EAAQ,UAAU,EACnEO,EAAMC,EAAaR,EAAQ,SAAS,EAU1C,OATkB,IAAIS,EAClBJ,EACAE,EACAP,EAAQ,eAAiB,GACzBG,EACAH,EAAQ,oBAAsB,GAC9BA,EAAQ,mBAAqB,GAC7BC,CACJ,EACiB,QAAQF,CAAI,CACjC,CAEA,IAAMU,EAAN,KAAqB,CAKV,YACcC,EACAH,EACAI,EACAR,EACAS,EACAC,EACjBZ,EACF,CAPmB,YAAAS,EACA,SAAAH,EACA,mBAAAI,EACA,iBAAAR,EACA,wBAAAS,EACA,uBAAAC,EAGjB,KAAK,OAASC,EAAkBb,CAAK,CACzC,CATqB,OACA,IACA,cACA,YACA,mBACA,kBAVJ,MAAkB,CAAC,EAC5B,QAAU,EACD,OAcV,QAAQF,EAA0B,CACrC,KAAK,QAAQA,CAAI,EAEjB,IAAMgB,EAAS,KAAK,MAAM,KAAK,KAAK,GAAG,EAAE,QAAQ,EAEjD,OAAIA,EAAO,SAAW,EACX,GAGP,KAAK,mBACEA,EAAS,KAAK,IAGlBA,CACX,CAEQ,OAAc,CACd,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,IAAM,IACtC,KAAK,MAAM,KAAK,EAAE,CAE1B,CAEQ,QAAQhB,EAAkBiB,EAAa,GAAa,CACpDjB,EAAK,cAAc,IAAM,KAAK,QAAU,GACxC,KAAK,MAAM,EAEf,KAAK,QAAUA,EAAK,YAAY,IAChC,KAAK,cAAcA,EAAMiB,CAAU,EACnC,KAAK,QAAUjB,EAAK,YAAY,GACpC,CAEQ,cAAcA,EAAkBiB,EAAa,GAAa,CAC9D,OAAQjB,EAAK,KAAM,CACf,IAAK,cACD,QAAW,KAAKA,EAAK,SACjB,KAAK,QAAQ,CAAC,EAElB,MAEJ,IAAK,UAAW,CAEZ,GAAIA,EAAK,SAAS,OAAS,GAAK,CAACkB,GAAalB,CAAI,EAAG,CACjD,QAAW,KAAKA,EAAK,SACjB,KAAK,QAAQ,CAAC,EAElB,KAAK,MAAM,CACf,CACA,KACJ,CAEA,IAAK,eACD,QAAW,KAAKA,EAAK,SACjB,KAAK,QAAQ,CAAC,EAElB,MAEJ,IAAK,QACD,QAAW,KAAKA,EAAK,SACjB,KAAK,QAAQ,EAAG,EAAI,EAExB,MAEJ,IAAK,sBACL,IAAK,0BACL,IAAK,qBACL,IAAK,oBACL,IAAK,mBACL,IAAK,sBACL,IAAK,mBACD,KAAK,iBAAiBA,EAAM,EAAK,EACjC,MAEJ,IAAK,uBAEG,KAAK,MAAM,OAAS,GACpB,CAAC,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EAAE,WAAW,GAAG,GAEjD,KAAK,MAAM,EAEf,KAAK,iBAAiBA,EAAM,EAAI,EAChC,KAAK,MAAM,EACX,MAEJ,IAAK,UAAW,CAEZ,IAAMmB,EAAOnB,EAAK,KAAK,QAAQ,EACzBoB,EACFH,GAAcjB,EAAK,cAAc,OAAS,EACpC,GAAG,KAAK,MAAM,GAAGmB,CAAI,GACrBA,EACV,KAAK,MAAM,KAAKC,CAAQ,EACxB,KACJ,CAEA,QAAS,CACL,IAAMA,EAAW,KAAK,YAAYpB,CAAI,EACtC,KAAK,MAAM,KACPiB,EAAa,GAAG,KAAK,MAAM,GAAGG,CAAQ,GAAKA,CAC/C,CACJ,CACJ,CACJ,CAEQ,YAAYpB,EAA0B,CAC1C,OAAQA,EAAK,KAAM,CACf,IAAK,cACL,IAAK,UACL,IAAK,eACL,IAAK,QACL,IAAK,sBACL,IAAK,0BACL,IAAK,qBACL,IAAK,oBACL,IAAK,mBACL,IAAK,sBACL,IAAK,mBACL,IAAK,uBACL,IAAK,UACD,MAAM,IAAI,MACN,cAAcA,EAAK,IAAI,iDAC3B,EAEJ,IAAK,qBACD,OAAO,KAAK,iBACRA,EACAA,EAAK,QAAU,MAAQqB,EAAWrB,EAAMA,EAAK,MAAM,CACvD,EAEJ,IAAK,WACD,OAAO,KAAK,iBAAiBA,CAAI,EAErC,IAAK,uBACL,IAAK,uBACL,IAAK,MACL,IAAK,SACD,OAAOA,EAAK,SAAS,IAAKsB,GAAM,KAAK,YAAYA,CAAC,CAAC,EAAE,KAAK,GAAG,EAEjE,IAAK,OACL,IAAK,SACL,IAAK,aACL,IAAK,eACL,IAAK,gBACL,IAAK,cACL,IAAK,eACL,IAAK,kBACL,IAAK,iBACL,IAAK,gBACL,IAAK,eACL,IAAK,yBACL,IAAK,QACL,IAAK,gBACL,IAAK,eACD,OAAOtB,EAAK,SAAS,IAAKsB,GAAM,KAAK,YAAYA,CAAC,CAAC,EAAE,KAAK,EAAE,EAEhE,IAAK,SACD,OAAOC,GAAavB,CAAI,EAE5B,IAAK,iBACL,IAAK,MACL,IAAK,KACL,IAAK,IACL,IAAK,IACD,MAAO,GAAGA,EAAK,IAAI,IAEvB,IAAK,KACD,MAAO,IAAIA,EAAK,IAAI,IAExB,IAAK,kBACD,OAAOA,EAAK,KAAK,KAAK,EAE1B,IAAK,cACL,IAAK,mBACL,IAAK,UACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,WACL,IAAK,QACL,IAAK,UACL,IAAK,SACL,IAAK,aACL,IAAK,WACL,IAAK,OACL,IAAK,kBACL,IAAK,UACL,IAAK,QACL,IAAK,eACL,IAAK,aACL,IAAK,SACL,IAAK,QACL,IAAK,UACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACD,OAAOA,EAAK,KAEhB,QACI,YAAK,OAAO,MAAM,6BAA6BA,EAAK,IAAI,GAAG,EACpDA,EAAK,IACpB,CACJ,CAEQ,iBAAiBA,EAAkBwB,EAAS,GAAe,CAC/D,GAAM,CAAE,SAAAC,CAAS,EAAIzB,EACf0B,EAASD,EACV,MAAM,EAAG,EAAE,EACX,IAAKH,GAAM,KAAK,YAAYA,CAAC,CAAC,EAC9B,KAAK,GAAG,EACb,GAAIE,EACA,OAAOE,EAEX,IAAMC,EAAMF,EAAS,CAAC,EAAE,KAClBG,EAAOH,EAASA,EAAS,OAAS,CAAC,EAAE,KAC3C,MAAO,GAAGE,CAAG,GAAGD,CAAM,GAAGE,CAAI,EACjC,CAEQ,iBAAiB5B,EAAkB6B,EAA+B,CACtE,GAAM,CAACC,EAAUC,EAAY,GAAGC,CAAU,EAAIhC,EAAK,SAC7CiC,EAAO,KAAK,YAAYH,CAAQ,EAEtC,GAAI,CAACD,GAAkBG,EAAW,SAAW,IAErC,CAAC,KAAK,mBACNE,GAAsBJ,EAAUE,CAAU,GAC5C,CACE,IAAMG,EAAYH,EAAW,CAAC,EAC9B,GACIG,EAAU,SAAS,SAAW,GAC9B,CAACC,GAAmBD,EAAU,SAAS,CAAC,CAAC,EAC3C,CACE,IAAME,EAAQ,KAAK,YAAYF,EAAU,SAAS,CAAC,CAAC,EAC9CG,EACF,KAAK,aAAe,KACd,GAAGL,CAAI,KAAK,OAAO,KAAK,WAAW,EACnC,GAAGA,CAAI,KACjB,GACIK,EAAgB,OAASD,EAAM,QAC/B,KAAK,cACP,CACE,KAAK,MAAM,KAAKC,EAAkBD,CAAK,EACvC,MACJ,CACJ,CACJ,CAGJ,KAAK,MAAM,KAAK,GAAGJ,CAAI,GAAG,EAE1B,QAAWX,KAAKU,EACZ,KAAK,QAAQV,EAAG,EAAI,CAE5B,CACJ,EAIA,SAASc,GAAmBpC,EAA2B,CACnD,OAAQA,EAAK,KAAM,CACf,IAAK,eACL,IAAK,gBACD,MAAO,GACX,QACI,MAAO,EACf,CACJ,CAGA,SAASkC,GACLD,EACAM,EACO,CACP,OAAON,EAAK,YAAY,MAAQM,EAAOA,EAAO,OAAS,CAAC,EAAE,cAAc,GAC5E,CAEA,SAASlB,EAAWmB,EAAeC,EAAwB,CACvD,OACID,EAAE,cAAc,MAAQC,EAAE,cAAc,KACxCD,EAAE,cAAc,SAAWC,EAAE,cAAc,QAC3CD,EAAE,YAAY,MAAQC,EAAE,YAAY,KACpCD,EAAE,YAAY,SAAWC,EAAE,YAAY,MAE/C,CAEA,SAASvB,GAAalB,EAA2B,CAC7C,OAAOA,EAAK,KAAOA,EAAK,QAAQ,SAAS,CAAC,EAAE,EAChD,CAEA,SAASuB,GAAavB,EAA0B,CAE5C,IAAMmB,EAAOuB,EAAc1C,EAAK,IAAI,EAIpC,OACIA,EAAK,QAAQ,OAAS,wBACtBA,EAAK,OAAO,QAAQ,OAAS,SAC7BqB,EAAWrB,EAAMA,EAAK,MAAM,GAC5BA,EAAK,OAAO,OAAO,SAAS,OAAS,EAE9B,UAAUmB,CAAI,IAGlBA,CACX,CCtVO,SAASwB,EAAeC,EAAyB,CACpD,IAAMC,EAAQD,EAAK,MAAM,OAAO,EAAE,IAAKE,GAAMA,EAAE,KAAK,CAAC,EAC/CC,EAAiBF,EAAM,QAAQ,GAAG,EAExC,GAAIE,IAAmB,GACnB,MAAM,IAAI,MAAM,mCAAmC,EAGvD,IAAMC,EAAcH,EAAM,MAAM,EAAGE,CAAc,EAC3CE,EAAYC,GAAKL,EAAM,MAAME,EAAiB,CAAC,CAAC,EAEhDI,EAAoB,CACtB,QAAS,CAAC,EACV,MAAO,CAAC,CACZ,EAEA,QAAWC,KAAQJ,EAAa,CAC5B,GAAII,EAAK,SAAW,EAChB,SAEJ,GAAIA,EAAK,WAAW,GAAG,EAAG,CACtBD,EAAO,QAAQ,KAAK,CAAE,KAAM,UAAW,KAAMC,CAAK,CAAC,EACnD,QACJ,CACA,GAAM,CAACC,EAAKC,CAAK,EAAIC,EAAUH,CAAI,EACnC,GAAIE,GAAS,KACT,MAAM,IAAI,MAAM,sBAAsB,EAE1CH,EAAO,QAAQ,KAAK,CAAE,KAAM,SAAU,IAAAE,EAAK,MAAAC,CAAM,CAAC,CACtD,CAEA,QAAWF,KAAQH,EAAW,CAC1B,GAAIG,EAAK,SAAW,EAAG,CACnBD,EAAO,MAAM,KAAK,CAAE,KAAM,OAAQ,CAAC,EACnC,QACJ,CACA,GAAIC,EAAK,WAAW,GAAG,EAAG,CACtBD,EAAO,MAAM,KAAK,CAAE,KAAM,UAAW,KAAMC,CAAK,CAAC,EACjD,QACJ,CACA,GAAM,CAACC,EAAKC,CAAK,EAAIC,EAAUH,CAAI,EACnCD,EAAO,MAAM,KAAK,CAAE,KAAM,OAAQ,IAAAE,EAAK,MAAAC,CAAM,CAAC,CAClD,CAEA,OAAOH,CACX,CAEA,SAASI,EAAUH,EAA4C,CAC3D,IAAMI,EAAQJ,EAAK,QAAQ,GAAG,EAC9B,OAAII,IAAU,GACH,CAACJ,EAAM,MAAS,EAEpB,CAACA,EAAK,MAAM,EAAGI,CAAK,EAAE,QAAQ,EAAGJ,EAAK,MAAMI,EAAQ,CAAC,EAAE,UAAU,CAAC,CAC7E,CAEA,SAASN,GAAKO,EAA0B,CACpC,IAAMC,EAAaD,EAAK,UAAWX,GAAMA,EAAE,OAAS,CAAC,EACrD,GAAIY,IAAe,GACf,MAAO,CAAC,EAEZ,IAAMC,EAAWF,EAAK,cAAeX,GAAMA,EAAE,OAAS,CAAC,EACvD,OAAOW,EAAK,MAAMC,EAAYC,EAAW,CAAC,CAC9C,CC7EO,SAASC,EACZC,EACAC,EAAmB,CAAC,EACd,CACN,IAAMC,EAAcC,EAAeH,CAAI,GAAKC,EAAQ,YAC9CG,EAAMC,EAAaJ,EAAQ,SAAS,EACpCK,EAAYC,EAAeP,CAAI,EACrCM,EAAU,QAAQ,KAAK,CAACE,EAAGC,IACvBD,EAAE,OAAS,UAAYA,EAAE,MAAQ,OAAS,GAAK,CACnD,EACA,IAAME,EAAkB,CAAC,EAEzB,QAAWC,KAAUL,EAAU,QAAS,CACpC,GAAIK,EAAO,OAAS,UAAW,CAC3BD,EAAM,KAAKC,EAAO,IAAI,EACtB,QACJ,CACAD,EAAM,KAAK,GAAGC,EAAO,GAAG,KAAKA,EAAO,KAAK,EAAE,CAC/C,CAEAD,EAAM,KAAK,IAAK,EAAE,EAElB,QAAWE,KAAQN,EAAU,MAAO,CAChC,GAAIM,EAAK,OAAS,QAAS,CACvBF,EAAM,KAAK,EAAE,EACb,QACJ,CACA,GAAIE,EAAK,OAAS,UAAW,CACzBF,EAAM,KAAKE,EAAK,IAAI,EACpB,QACJ,CACA,GAAIA,EAAK,OAAS,KAAM,CACpB,IAAMC,EACFX,GAAe,KACT,GAAGU,EAAK,GAAG,KAAK,OAAOV,CAAW,EAClC,GAAGU,EAAK,GAAG,KACfE,EAAQC,EAAcH,EAAK,KAAK,EACtCF,EAAM,KAAK,GAAGG,CAAY,GAAGC,CAAK,EAAE,CACxC,MACIJ,EAAM,KAAKE,EAAK,GAAG,CAE3B,CAEA,OAAIF,EAAM,SAAW,EACV,KAGPT,EAAQ,oBAAsB,KAC9BS,EAAM,KAAK,EAAE,EAGVA,EAAM,KAAKN,CAAG,EACzB,CC/DA,UAAYY,MAAQ,mBACpB,UAAYC,MAAU,YACtB,UAAYC,MAAa,eAEzB,OAAOC,OAAc,YCJd,SAASC,EAAgBC,EAAwB,CACpD,OAAOA,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAChE,CCFA,UAAYC,MAAa,eAQzB,IAAMC,GAAa,UACbC,GAAc,WACdC,GAAW,WACXC,GAAc,SACdC,GAAe,UAEd,SAASC,EAAaC,EAAQ,GAAe,CAChD,OAAOC,GAAgC,SAAgB,SAAQD,CAAK,CACxE,CAEO,SAASC,GACZC,EACAC,EACAH,EAAQ,GACF,CACN,IAAMI,EAA6BC,GAAeF,CAAM,EAClD,CAACG,EAASC,IAAU,GAAGA,CAAK,GAAGD,CAAO,GAAGZ,EAAU,GACnD,CAACY,EAASE,IAAWF,EAEvBG,EACAC,EAEJ,OAAIV,GACAS,EAAM,IAAM,CAEZ,EACAC,EAAO,IAAM,CAEb,IAEAD,EAAOH,GAAoB,CACvBJ,EAAO,MAAM,GAAGI,CAAO;AAAA,CAAI,CAC/B,EACAI,EAAQJ,GAAoB,CACxBH,EAAO,MAAM,GAAGC,EAASP,GAAaF,EAAW,CAAC,IAAIW,CAAO;AAAA,CAAI,CACrE,GAGG,CACH,IAAAG,EACA,KAAAC,EACA,MAAMJ,EAAiB,CACnBH,EAAO,MAAM,GAAGC,EAASN,GAAcF,EAAQ,CAAC,IAAIU,CAAO;AAAA,CAAI,CACnE,CACJ,CACJ,CAqBA,SAASK,GAAeC,EAA+B,CACnD,MAAI,aAAsB,MACf,GAGJA,EAAO,QAAU,EAC5B,CChFO,IAAMC,EAAN,cAA+B,KAAM,CAGjC,YAAmBC,EAAoB,CAC1C,MACI;AAAA,EAA8CA,EAAS,KAAK;AAAA,CAAI,CAAC,EACrE,EAHsB,cAAAA,CAI1B,CAJ0B,SAFnB,KAAO,kBAOlB,ECRA,UAAYC,MAAkB,eAG9B,eAAsBC,EAAqBC,EAAoC,CAE3E,IAAMC,EAAU,MAAmB,QAAMD,CAAQ,EAE3CE,EAAmB,CAAC,EAE1B,OAAID,EAAO,eAAiB,MACxBC,EAAQ,WAAa,GACdD,EAAO,eAAiB,UAC/BC,EAAQ,WAAa,IAGrB,OAAOD,EAAO,aAAgB,SAC9BC,EAAQ,WAAaD,EAAO,YAE5BA,EAAO,cAAgB,OACvB,OAAOA,EAAO,WAAc,WAE5BC,EAAQ,WAAaD,EAAO,WAG5B,OAAOA,EAAO,iBAAoB,WAClCC,EAAQ,cAAgBD,EAAO,iBAG/B,OAAOA,EAAO,cAAiB,WAC/BC,EAAQ,YAAcD,EAAO,cAG7B,OAAOA,EAAO,sBAAyB,YACvCC,EAAQ,mBAAqBD,EAAO,sBAGpC,OAAOA,EAAO,oBAAuB,YACrCC,EAAQ,kBAAoBD,EAAO,oBAGnCA,EAAO,aAAe,MAAQA,EAAO,cAAgB,UACrDC,EAAQ,UAAYD,EAAO,aAGxBC,CACX,CC7CO,SAASC,EACZC,EAC8B,CAC9B,OAAOA,aAAiB,OAAS,SAAUA,GAASA,EAAM,OAAS,QACvE,CCJA,UAAYC,MAAU,YAOf,IAAMC,EACJ,QAAQ,KACNC,GAAqBA,EAAS,WAAW,KAAM,GAAG,EAClDA,GAAqBA,ECRzB,IAAMC,EAAkB,CAC3B,SACA,YACA,UACA,UACA,SACJ,EAIO,SAASC,EAAgBC,EAAuC,CACnE,OAAQF,EAAsC,SAASE,CAAK,CAChE,CCZO,SAASC,GAAkC,CAC9C,MAAO,CACH,aAAc,CAAC,EACf,KAAM,GACN,QAAS,GACT,MAAO,GACP,MAAO,GACP,MAAO,EACX,CACJ,CCPO,SAASC,EAAUC,EAA4B,CAClD,IAAMC,EAASC,EAAoB,EAEnC,QAASC,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAAK,CAClC,IAAMC,EAAMJ,EAAKG,CAAC,EAElB,GAAIC,IAAQ,KAAM,CAEdH,EAAO,aAAa,KAAK,GAAGD,EAAK,MAAMG,EAAI,CAAC,CAAC,EAC7C,KACJ,CAEA,GAAI,EAAAE,EAAgBD,CAAG,GAAKE,GAAmBL,EAAQG,CAAG,GAI1D,IAAIA,EAAI,WAAW,IAAI,EACnB,MAAM,IAAI,MAAM,qBAAqBA,CAAG,EAAE,EAG9CH,EAAO,aAAa,KAAKG,CAAG,EAChC,CAEA,OAAOH,CACX,CAEA,SAASK,GAAmBL,EAAoBG,EAA6B,CACzE,OAAQA,EAAK,CACT,IAAK,SACD,OAAAH,EAAO,KAAO,GACP,GACX,IAAK,YACD,OAAAA,EAAO,QAAU,GACV,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,IAAK,UACD,OAAAA,EAAO,MAAQ,GACR,GACX,QACI,MAAO,EACf,CACJ,CClDA,UAAYM,MAAU,YAEtB,OAAOC,OAAc,YCDrB,UAAYC,OAAQ,mBAGpB,eAAsBC,GAAUC,EAA8C,CAC1E,GAAI,CACA,OAAO,MAAS,SAAMA,CAAQ,CAClC,OAASC,EAAO,CACZ,GAAIC,EAAmBD,CAAK,EACxB,OAGJ,MAAMA,CACV,CACJ,CDLA,eAAsBE,GAClBC,EACAC,EACiB,CACjB,IAAMC,EAAO,IAAI,IACXC,EAAwBC,GAA0BJ,EAAI,WAAW,EACjEK,EAA0B,CAAC,EAE3BC,EAAuB,CACzB,IAAK,GACL,oBAAqB,GACrB,OAAQC,CACZ,EAEA,QAAWC,KAAWP,EAAc,CAChC,IAAMQ,EAAoB,UAAQD,CAAO,EACnCE,EAAO,MAAMC,GAAUF,CAAY,EAEzC,GAAIC,GAAQ,KAAM,CACd,GAAIA,EAAK,eAAe,EAAG,CACvBL,EAAc,KACV,yCAAyCG,CAAO,EACpD,EACA,QACJ,CAEA,GAAIE,EAAK,OAAO,EAAG,CACfR,EAAK,IAAIO,CAAY,EACrB,QACJ,CAEA,GAAIC,EAAK,YAAY,EAAG,CACpB,IAAME,EAAQ,MAAMC,GAAS,QAAQV,CAAqB,GAAI,CAC1D,GAAGG,EACH,IAAKG,CACT,CAAC,EACGG,EAAM,SAAW,GACjBP,EAAc,KACV,kDAAkDG,CAAO,EAC7D,EAEJ,QAAWM,MAAQF,EACfV,EAAK,IAAS,UAAQO,EAAcK,EAAI,CAAC,EAE7C,QACJ,CACJ,CAEA,IAAMC,EAAOC,EAAiBR,CAAO,EAE/BS,GADW,MAAMJ,GAASE,EAAMT,CAAW,GAClB,OAAQQ,GACnCI,GAAuBJ,EAAMd,EAAI,WAAW,CAChD,EACIiB,EAAc,SAAW,GACzBZ,EAAc,KACV,6CAA6CG,CAAO,EACxD,EAEJ,QAAWM,KAAQG,EACff,EAAK,IAAS,UAAQY,CAAI,CAAC,CAEnC,CAEA,GAAIT,EAAc,OAAS,EACvB,MAAM,IAAIc,EAAiBd,CAAa,EAG5C,OAAO,MAAM,KAAKH,CAAI,EAAE,SAAS,CAACkB,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,CACjE,CAEA,SAASjB,GAA0BkB,EAAwC,CACvE,OAAOA,EAAY,SAAW,EACxBA,EAAY,CAAC,EACb,IAAIA,EAAY,KAAK,GAAG,CAAC,GACnC,CAEA,SAASJ,GACLJ,EACAQ,EACO,CACP,IAAMC,EAAiB,UAAQT,CAAI,EAAE,MAAM,CAAC,EAC5C,OAAOQ,EAAY,SAASC,CAAS,CACzC,CExFO,SAASC,GAAUC,EAAgB,CACtC,QAAQ,OAAO,MACX,UAAUA,EAAI,OAAO;AAAA,CACzB,EACA,QAAQ,OAAO,MAAM;AAAA,CAAI,EACzB,QAAQ,OAAO,MAAM;AAAA,CAAY,EAEjC,QAAWC,KAAUC,EACjB,QAAQ,OAAO,MAAM,KAAKD,CAAM;AAAA,CAAI,CAE5C,CCbA,IAAAE,GAAA,CACI,KAAQ,0BACR,QAAW,SACX,YAAe,wDACf,OAAU,iBACV,QAAW,MACX,KAAQ,SACR,MAAS,CACL,OACA,aACA,eACJ,EACA,MAAS,kBACT,QAAW,CACP,IAAK,CACD,MAAS,kBACT,QAAW,eACf,EACA,SAAU,CACN,MAAS,2BACT,QAAW,mBACf,CACJ,EACA,IAAO,CACH,cAAe,2BACf,YAAa,yBACb,kBAAmB,6BACvB,EACA,WAAc,CACV,KAAQ,MACR,IAAO,uDACX,EACA,QAAW,6CACX,QAAW,CACP,IAAO,4CACX,EACA,QAAW,CACP,MAAS,kDACT,MAAS,gBACT,KAAQ,2DACR,UAAa,oBACb,UAAW,gDACX,WAAY,kBACZ,IAAO,oCACP,SAAU,sCACV,UAAW,UACX,KAAQ,8BACR,cAAe,sCACnB,EACA,aAAgB,CACZ,gCAAiC,SACjC,aAAgB,SAChB,YAAa,SACb,YAAa,UACb,kBAAmB,SACvB,EACA,gBAAmB,CACf,eAAgB,WAChB,cAAe,WACf,QAAW,UACX,MAAS,UACT,MAAS,UACT,kBAAmB,UACnB,OAAU,UACV,IAAO,UACP,WAAc,QAClB,CACJ,ECjEO,SAASC,IAAqB,CACjC,QAAQ,OAAO,MAAM,GAAGC,GAAY,OAAO;AAAA,CAAI,CACnD,CCJO,SAASC,EAAYC,EAAoB,CAC5C,QAAQ,IAAI,QAAS,WAAYA,CAAI,CACzC,CfmBA,eAAsBC,GAAKC,EAAyB,CAChD,IAAIC,EAASC,EAAa,EAE1B,GAAI,CACA,IAAMC,EAAOC,EAAkB,OAAK,MAAM,CAAC,CAAC,EAC5CH,EAASC,EAAaC,EAAK,KAAK,EAChC,IAAME,EAAW,MAAMC,GAAW,CAAE,IAAAN,EAAK,KAAAG,EAAM,OAAAF,CAAO,CAAC,EACvDM,EAAYF,CAAQ,CACxB,OAASG,EAAO,CACZ,GAAIA,aAAiBC,EACjB,QAAWC,KAAWF,EAAM,SACxBP,EAAO,MAAMS,CAAO,OAGxBT,EAAO,MAAMU,EAAgBH,CAAK,CAAC,EAEvCD,EAAY,CAAU,CAC1B,CACJ,CAQA,SAASD,GAAW,CAAE,IAAAN,EAAK,KAAAG,EAAM,OAAAF,CAAO,EAAsC,CAC1E,GAAIE,EAAK,KACL,OAAAS,GAAUZ,CAAG,EACN,QAAQ,QAAQ,CAAO,EAGlC,GAAIG,EAAK,QACL,OAAAU,GAAa,EACN,QAAQ,QAAQ,CAAO,EAKlC,GAFwBV,EAAK,aAAa,OAAS,EAG/C,OAAOW,GAAgB,CACnB,IAAAd,EACA,OAAAC,EACA,MAAOE,EAAK,MACZ,MAAOA,EAAK,MACZ,aAAcA,EAAK,YACvB,CAAC,EAKL,GAAI,CAAS,QAAM,MACf,OAAOY,GAAgB,CACnB,IAAAf,EACA,OAAAC,EACA,MAAe,QACf,MAAOE,EAAK,MACZ,MAAOA,EAAK,KAChB,CAAC,EAGL,MAAM,IAAI,MACN,6DACJ,CACJ,CAUA,eAAeW,GAAgB,CAC3B,IAAAd,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,aAAAC,CACJ,EAA2C,CACnCF,GACAf,EAAO,IAAI,wBAAwB,EAGvC,IAAMkB,EAAY,MAAMC,GAAkBpB,EAAKkB,CAAY,EACrD,CAACG,EAAkBC,CAAQ,EAAI,MAAMC,GAAY,CACnD,IAAAvB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,UAAAE,CACJ,CAAC,EAED,GAAIH,EAAO,CACP,GAAIK,EAAmB,IACnBpB,EAAO,KACH,8BAA8BoB,CAAgB,WAClD,EACI,CAACC,GACD,MAAO,GAIVA,GACDrB,EAAO,IAAI,2CAA2C,CAE9D,CAEA,OAAIqB,EACO,EAGJ,CACX,CAUA,eAAsBC,GAAY,CAC9B,IAAAvB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,UAAAE,CACJ,EAAgD,CAC5C,IAAIE,EAAmB,EACnBC,EAAW,GAEf,QAAWE,KAAYL,EACnB,GAAI,CACuB,MAAMM,GAAW,CACpC,IAAAzB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,SAAAO,CACJ,CAAC,GAEGH,GAER,OAASb,EAAO,CACRkB,EAAclB,CAAK,EACnBP,EAAO,MAAMO,EAAM,eAAemB,EAAeH,CAAQ,CAAC,CAAC,EAE3DvB,EAAO,MACH,GAAG0B,EAAeH,CAAQ,CAAC,KAAKb,EAAgBH,CAAK,CAAC,EAC1D,EAEJc,EAAW,EACf,CAGJ,MAAO,CAACD,EAAkBC,CAAQ,CACtC,CAUA,eAAsBG,GAAW,CAC7B,IAAAzB,EACA,OAAAC,EACA,MAAAe,EACA,MAAAC,EACA,SAAAO,CACJ,EAAqC,CACjC,GAAI,CACA,IAAMI,EAAU,MAAMC,EAAqBL,CAAQ,EAC7CM,EAAU,MAAS,WAASN,EAAU,MAAM,EAC5CO,EAAY,MAAM/B,EAAI,OAAO8B,EAASF,EAASJ,EAAUP,CAAK,EAEpE,OAAIc,IAAcD,EACP,IAGX7B,EAAO,IAAI0B,EAAeH,CAAQ,CAAC,EAE9BR,GACD,MAAS,YAAUQ,EAAUO,EAAW,MAAM,EAG3C,GACX,OAASvB,EAAO,CACZ,GAAIwB,EAAmBxB,CAAK,EACxB,MAAO,GAGX,MAAMA,CACV,CACJ,CAEA,SAASmB,EAAeH,EAA0B,CAC9C,OAAOS,EAAsB,WAAiB,MAAI,EAAGT,CAAQ,CAAC,CAClE,CAUA,eAAsBT,GAAgB,CAClC,IAAAf,EACA,OAAAC,EACA,MAAAiC,EACA,MAAAlB,EACA,MAAAC,CACJ,EAA2C,CACvC,IAAMkB,EAAQ,MAAMC,GAAS,CAAE,MAAAF,CAAM,CAAC,EAEhCG,EAAe,SADFrC,EAAI,mBAAmBmC,CAAK,CACP,GAClCG,EAAoB,UAAQD,CAAY,EACxCT,EAAU,MAAMC,EAAqBS,CAAY,EACnDP,EAEJ,GAAI,CACAA,EAAY,MAAM/B,EAAI,OAAOmC,EAAOP,EAASU,EAAcrB,CAAK,CACpE,OAAST,EAAO,CACZ,GAAIkB,EAAclB,CAAK,EACnB,OAAAP,EAAO,MAAMO,EAAM,eAAe,OAAO,CAAC,EACnC,EAEX,MAAMA,CACV,CAEA,OAAIQ,EACImB,IAAUJ,GACV9B,EAAO,KAAK,mCAAmC,EACxC,GAGJ,GAGH,SAAO,MAAM8B,CAAS,EAEvB,EACX,CgB9QA,UAAYQ,OAAQ,UACpB,UAAYC,MAAU,YACtB,OAAS,iBAAAC,OAAqB,WAC9B,OAAS,YAAAC,GAAU,UAAAC,OAAc,kBAKjC,IAAIC,GACEC,GAAgB,IAAI,IAEpBC,GAAiB,UAAQL,GAAc,YAAY,GAAG,CAAC,EAE7D,SAASM,IAAiB,CACtB,OAAAH,KAAgBD,GAAO,KAAK,EACrBC,EACX,CAEA,SAASI,GAAaC,EAAwB,CAC1C,IAAIC,EAAUL,GAAc,IAAII,CAAU,EAE1C,GAAIC,GAAW,KAAM,CACjB,IAAMC,EAAeC,GAAgBH,CAAU,EAC/CC,EAAUR,GAAS,KAAKS,CAAY,EACpCN,GAAc,IAAII,EAAYC,CAAO,CACzC,CAEA,OAAOA,CACX,CAEA,SAASE,GAAgBH,EAAwB,CAC7C,IAAMI,EAAW,GAAGJ,CAAU,QACxBE,EAAe,CACZ,OACDL,GACA,uDACAO,CACJ,EACK,OACDP,GACA,oDACAO,CACJ,CACJ,EAAE,KAAMC,GAAiB,cAAWA,CAAS,CAAC,EAE9C,GAAIH,GAAgB,KAChB,MAAM,IAAI,MAAM,kBAAkBE,CAAQ,EAAE,EAGhD,OAAOF,CACX,CAEA,eAAsBI,GAClBC,EACAP,EACmB,CACnB,MAAMF,GAAe,EAErB,IAAMU,EAAW,MAAMT,GAAaC,CAAU,EAExCS,EAAS,IAAIf,GACnBe,EAAO,YAAYD,CAAQ,EAE3B,IAAME,EAAOD,EAAO,MAAMF,CAAI,EAE9B,GAAIG,GAAQ,KACR,MAAM,IAAI,MAAM,sBAAsB,EAG1C,OAAOA,EAAK,QAChB,CC/DA,IAAMC,GAAkB,QAClBC,GAAsB,aAEvBC,GAAK,CACN,QAAS,YACT,YAAa,CAACF,GAAiBC,EAAmB,EAElD,mBAAmBE,EAAM,CACrB,OAAOC,GAAWD,CAAI,EAAIF,GAAsBD,EACpD,EAEA,OAAQ,MAAOG,EAAME,EAASC,EAAUC,IAAU,CAC9C,GAAIC,GAAWL,EAAMG,CAAQ,EACzB,OAAOG,EAAmBN,EAAME,CAAO,EAG3C,IAAMK,EAAO,MAAMC,GAAUR,EAAM,mBAAmB,EACtD,OAAOS,EAAeF,EAAML,EAASE,CAAK,CAC9C,CACJ,CAAC,EAED,SAASC,GAAWL,EAAcG,EAA2B,CACzD,OAAIA,EAAS,SAAS,QAAQ,EACnB,GAEPA,EAAS,SAAS,aAAa,EACxB,GAEJF,GAAWD,CAAI,CAC1B,CAEA,SAASC,GAAWD,EAAuB,CACvC,OAAOA,EAAK,UAAU,EAAE,WAAW,OAAO,CAC9C", + "names": ["IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "getEndOfLine", "eof", "createDebugLogger", "debug", "message", "getColumnWidth", "text", "match", "getIndentation", "indentTabs", "indentSize", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "isSyntaxError", "error", "SyntaxTreeError", "SyntaxError", "rootNode", "findFirstProblemNode", "node", "child", "errorNode", "convertQuotes", "text", "talonFormatter", "node", "options", "debug", "SyntaxTreeError", "columnWidth", "getColumnWidth", "indentation", "getIndentation", "eol", "getEndOfLine", "TalonFormatter", "indent", "maxLineLength", "insertFinalNewline", "preserveMultiline", "createDebugLogger", "result", "isIndented", "isFirstChild", "text", "nodeText", "rangeEqual", "n", "formatString", "unwrap", "children", "middle", "pre", "post", "forceMultiline", "leftNode", "_colonNode", "rightNodes", "left", "isLeftRightSingleLine", "rightNode", "forceMultilineBody", "right", "leftWithPadding", "rights", "a", "b", "convertQuotes", "parseTalonList", "text", "lines", "l", "separatorIndex", "headerLines", "bodyLines", "trim", "result", "line", "key", "value", "splitLine", "index", "list", "startIndex", "endIndex", "talonListFormatter", "text", "options", "columnWidth", "getColumnWidth", "eol", "getEndOfLine", "talonList", "parseTalonList", "a", "_b", "lines", "header", "item", "keyWithColon", "value", "convertQuotes", "fs", "path", "process", "getStdin", "getErrorMessage", "error", "process", "ANSI_RESET", "ANSI_YELLOW", "ANSI_RED", "WARN_PREFIX", "ERROR_PREFIX", "createLogger", "quiet", "createLoggerFromStreams", "stdout", "stderr", "colorize", "shouldUseColor", "message", "color", "_color", "log", "warn", "shouldUseColor", "stream", "FilePatternError", "messages", "editorconfig", "getOptionsFromConfig", "filePath", "config", "options", "isMissingFileError", "error", "path", "normalizeToPosix", "filepath", "KNOWN_ARGUMENTS", "isKnownArgument", "value", "getDefaultArguments", "parseArgs", "argv", "result", "getDefaultArguments", "i", "arg", "isKnownArgument", "parseKnownArgument", "path", "fastGlob", "fs", "lstatSafe", "filePath", "error", "isMissingFileError", "parseFilePatterns", "cli", "filePatterns", "seen", "globFileEndingPattern", "getGlobFileEndingsPattern", "errorMessages", "globOptions", "GLOB_IGNORE_PATTERNS", "pattern", "absolutePath", "stat", "lstatSafe", "files", "fastGlob", "file", "glob", "normalizeToPosix", "filteredFiles", "hasSupportedFileEnding", "FilePatternError", "a", "b", "fileEndings", "extension", "printHelp", "cli", "option", "KNOWN_ARGUMENTS", "package_default", "printVersion", "package_default", "setExitCode", "code", "main", "cli", "logger", "createLogger", "args", "parseArgs", "exitCode", "mainUnsafe", "setExitCode", "error", "FilePatternError", "message", "getErrorMessage", "printHelp", "printVersion", "mainFormatFiles", "mainFormatStdin", "check", "debug", "filePatterns", "filePaths", "parseFilePatterns", "changedFileCount", "hasError", "formatFiles", "filePath", "formatFile", "isSyntaxError", "getDisplayPath", "options", "getOptionsFromConfig", "content", "formatted", "isMissingFileError", "normalizeToPosix", "stdin", "input", "getStdin", "fauxFileName", "fauxFilePath", "fs", "path", "fileURLToPath", "Language", "Parser", "initPromise", "languageCache", "moduleDir", "initTreeSitter", "loadLanguage", "parserName", "promise", "wasmFilePath", "getWasmFilePath", "fileName", "candidate", "parseText", "text", "language", "parser", "tree", "fileEndingTalon", "fileEndingTalonList", "main", "text", "textIsList", "options", "filePath", "debug", "isListFile", "talonListFormatter", "node", "parseText", "talonFormatter"] } diff --git a/dist/treeSitterFormatter.js b/dist/treeSitterFormatter.js index d935f09..cbaf9e7 100644 --- a/dist/treeSitterFormatter.js +++ b/dist/treeSitterFormatter.js @@ -1,15 +1,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 +var ct=[".git",".svn",".hg","node_modules","__pycache__"],j=ct.map(e=>`**/${e}/**`);function R(e){return{debug(t){e&&console.warn(`[debug] ${t}`)}}}function k(e){return e==="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: +`}function D(e,t){return e?" ":" ".repeat(t??4)}var b="Syntax error",d=class extends Error{constructor(r){let n=pt(r);super(gt(n));this.point=r;this.name="SyntaxError",this.location=n}point;location;getFileMessage(r){return this.location!=null?`${r}(${this.location}): ${b}`:`${r}: ${b}`}};function _(e){return e instanceof d}function gt(e){return e!=null?`${b} at ${e}.`:b}function pt(e){return e!=null?`${e.row+1}:${e.column+1}`:void 0}var w=class extends d{constructor(t){super(M(t)?.startPosition),this.name="SyntaxTreeError"}};function M(e){if(e.isError||e.isMissing)return e;for(let t of e.children){if(!t.hasError)continue;let r=M(t);if(r!=null)return r}return null}function U(e,t={},r=!1){if(e.hasError)throw new w(e);let n=D(t.indentTabs,t.indentSize),i=k(t.endOfLine);return new T(n,i,t.insertFinalNewline??!0,r).getText(e)}var T=class{constructor(t,r,n,i){this.indentation=t;this.eol=r;this.insertFinalNewline=n;this.logger=R(i)}indentation;eol;insertFinalNewline;lastRow=0;logger;getText(t){let r=this.getNodeText(t,0);return r.length===0?"":this.insertFinalNewline?r+this.eol:r}getNodeText(t,r){let n=t.startPosition.row>this.lastRow+1?this.eol:"";this.lastRow=t.endPosition.row;let i=this.getNodeTextInternal(t,r);return this.lastRow=t.endPosition.row,`${n}${i}`}getNamedNodeText(t,r){let n=t.children.findIndex(s=>s.type===")"),i=t.children.slice(0,2).map(s=>s.text).join(""),a=t.children.slice(n).map(s=>this.getNodeText(s,0)).join(""),o=t.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(t,r){let n=t.children.findIndex(s=>s.type==="]"),i=t.children[0].text,a=t.children.slice(n).map(s=>s.text).join(" ");return[`${this.getIndent(r)}${i}`,...t.children.slice(1,n).map(s=>this.getNodeText(s,r+1)),`${this.getIndent(r)}${a}`].join(this.eol)}getPredicateText(t,r){let n=t.children[0].text,i=t.children[t.children.length-1].text,a=[t.children.slice(1,4).map(o=>o.text).join(""),...t.children[t.children.length-2].children.map(o=>o.text)];if(t.startPosition.row===t.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(t,r){return r===0?["(_",this.getFieldDefinitionText(t,1),")"].join(this.eol):[this.getIndent(r),t.children[0].text,t.children[1].text," ",this.getNodeText(t.children[2],r).trimStart()].join("")}getNodeTextInternal(t,r){switch(t.type){case"program":return this.joinLines(t.children,0);case"grouping":return this.joinLines(t.children,r+1);case"list":return this.getListText(t,r);case"named_node":return this.getNamedNodeText(t,r);case"predicate":return this.getPredicateText(t,r);case"field_definition":return this.getFieldDefinitionText(t,r);case"anonymous_node":return this.getIndent(r)+t.children.map(n=>this.getNodeText(n,r+1)).join("");case"comment":return`${this.getIndent(r)}${t.text.trimEnd()}`;case".":case"negated_field":return`${this.getIndent(r)}${t.text}`;case"(":case")":return`${this.getIndent(r-1)}${t.text}`;case"capture":return` ${t.text}`;case"#":case"_":case"predicate_type":case"identifier":case"quantifier":case"string":return t.text;case"parameters":return` ${t.children.map(i=>i.text).join(" ")}`;default:return this.logger.debug(`Unknown syntax node type '${t.type}'`),t.text}}joinLines(t,r){if(t.length===0)return"";let n=t[t.length-1].type==="quantifier",a=(n?t.slice(0,-1):t).map(o=>this.getNodeText(o,r)).join(this.eol);return n?`${a}${t[t.length-1].text}`:a}getIndent(t){return t<1?"":Array.from({length:t},()=>this.indentation).join("")}};import*as N from"node:fs/promises";import*as F from"node:path";import*as c from"node:process";import Pt from"get-stdin";function S(e){return e instanceof Error?e.message:String(e)}import*as p from"node:process";var mt="\x1B[0m",dt="\x1B[33m",ht="\x1B[31m",xt="[warn]",yt="[error]";function $(e=!1){return bt(p.stdout,p.stderr,e)}function bt(e,t,r=!1){let n=wt(t)?(o,s)=>`${s}${o}${mt}`:(o,s)=>o,i,a;return r?(i=()=>{},a=()=>{}):(i=o=>{e.write(`${o} +`)},a=o=>{t.write(`${n(xt,dt)} ${o} +`)}),{log:i,warn:a,error(o){t.write(`${n(yt,ht)} ${o} +`)}}}function wt(e){return"NO_COLOR"in p.env?!1:e.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_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 ...] +`)}`);this.messages=r}messages;name="FilePatternError"};import*as W from"editorconfig";async function v(e){let t=await W.parse(e),r={};return t.indent_style==="tab"?r.indentTabs=!0:t.indent_style==="space"&&(r.indentTabs=!1),typeof t.indent_size=="number"?r.indentSize=t.indent_size:t.indent_size==="tab"&&typeof t.tab_width=="number"&&(r.indentSize=t.tab_width),typeof t.max_line_length=="number"&&(r.maxLineLength=t.max_line_length),typeof t.column_width=="number"&&(r.columnWidth=t.column_width),typeof t.insert_final_newline=="boolean"&&(r.insertFinalNewline=t.insert_final_newline),typeof t.preserve_multiline=="boolean"&&(r.preserveMultiline=t.preserve_multiline),t.end_of_line!=null&&t.end_of_line!=="unset"&&(r.endOfLine=t.end_of_line),r}function E(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}import*as K from"node:path";var L=K.sep==="\\"?e=>e.replaceAll("\\","/"):e=>e;var A=["--help","--version","--quiet","--check","--debug"];function z(e){return A.includes(e)}function X(){return{filePatterns:[],help:!1,version:!1,quiet:!1,debug:!1,check:!1}}function G(e){let t=X();for(let r=0;rNt(g,e.fileEndings));f.length===0&&i.push(`No files matching the pattern were found: ${o}`);for(let g of f)r.add(m.resolve(g))}if(i.length>0)throw new u(i);return Array.from(r).toSorted((o,s)=>o.localeCompare(s))}function Lt(e){return e.length===1?e[0]:`{${e.join(",")}}`}function Nt(e,t){let r=m.extname(e).slice(1);return t.includes(r)}function Y(e){process.stdout.write(`Usage: ${e.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)}}); +`);for(let t of A)process.stdout.write(` ${t} +`)}var V={name:"@cursorless/talon-tools",version:"0.11.0",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 typecheck && npm run lint:ts && npm run lint:fmt",typecheck:"tsc -p . --noEmit","lint:ts":"oxlint -c oxlint.config.mts --deny-warnings .","lint:fmt":"oxfmt --check .",fix:"npm run fix:ts && npm run fix:fmt","fix:ts":"oxlint -c oxlint.config.mts --fix .","fix:fmt":"oxfmt .",test:"tsx src/test/runAllTests.ts","test:subset":"tsx src/test/runAllTests.ts --subset"},dependencies:{"@cursorless/tree-sitter-wasms":"^0.9.0",editorconfig:"^3.0.2","fast-glob":"^3.3.3","get-stdin":"^10.0.0","web-tree-sitter":"^0.26.8"},devDependencies:{"@types/mocha":"^10.0.10","@types/node":"^24.12.2",esbuild:"^0.28.0",mocha:"^11.7.5",oxfmt:"^0.47.0","oxlint-tsgolint":"^0.22.1",oxlint:"^1.62.0",tsx:"^4.21.0",typescript:"^6.0.3"}};function Q(){process.stdout.write(`${V.version} +`)}function O(e){Reflect.set(process,"exitCode",e)}async function tt(e){let t=$();try{let r=G(c.argv.slice(2));t=$(r.quiet);let n=await _t({cli:e,args:r,logger:t});O(n)}catch(r){if(r instanceof u)for(let n of r.messages)t.error(n);else t.error(S(r));O(2)}}function _t({cli:e,args:t,logger:r}){if(t.help)return Y(e),Promise.resolve(0);if(t.version)return Q(),Promise.resolve(0);if(t.filePatterns.length>0)return Tt({cli:e,logger:r,check:t.check,debug:t.debug,filePatterns:t.filePatterns});if(!c.stdin.isTTY)return vt({cli:e,logger:r,stdin:c.stdin,check:t.check,debug:t.debug});throw new Error("No input files specified. Use --help for usage information.")}async function Tt({cli:e,logger:t,check:r,debug:n,filePatterns:i}){r&&t.log("Checking formatting...");let a=await J(e,i),[o,s]=await St({cli:e,logger:t,check:r,debug:n,filePaths:a});if(r){if(o>0&&(t.warn(`Code style issues found in ${o} file(s).`),!s))return 1;s||t.log("All matched files use correct code style!")}return s?2:0}async function St({cli:e,logger:t,check:r,debug:n,filePaths:i}){let a=0,o=!1;for(let s of i)try{await $t({cli:e,logger:t,check:r,debug:n,filePath:s})&&a++}catch(l){_(l)?t.error(l.getFileMessage(C(s))):t.error(`${C(s)}: ${S(l)}`),o=!0}return[a,o]}async function $t({cli:e,logger:t,check:r,debug:n,filePath:i}){try{let a=await v(i),o=await N.readFile(i,"utf8"),s=await e.format(o,a,i,n);return s===o?!1:(t.log(C(i)),r||await N.writeFile(i,s,"utf8"),!0)}catch(a){if(E(a))return!1;throw a}}function C(e){return L(F.relative(c.cwd(),e))}async function vt({cli:e,logger:t,stdin:r,check:n,debug:i}){let a=await Pt({stdin:r}),s=`stdin.${e.getStdinFileEnding(a)}`,l=F.resolve(s),P=await v(l),y;try{y=await e.format(a,P,l,i)}catch(f){if(_(f))return t.error(f.getFileMessage("stdin")),2;throw f}return n?a!==y?(t.warn("Code style issues found in stdin."),1):0:(c.stdout.write(y),0)}import*as it from"node:fs";import*as x from"node:path";import{fileURLToPath as At}from"node:url";import{Language as Ot,Parser as ot}from"web-tree-sitter";var et,rt=new Map,nt=x.dirname(At(import.meta.url));function Ct(){return et??=ot.init(),et}function It(e){let t=rt.get(e);if(t==null){let r=jt(e);t=Ot.load(r),rt.set(e,t)}return t}function jt(e){let t=`${e}.wasm`,r=[x.join(nt,"../../node_modules/@cursorless/tree-sitter-wasms/out",t),x.join(nt,"../node_modules/@cursorless/tree-sitter-wasms/out",t)].find(n=>it.existsSync(n));if(r==null)throw new Error(`Could not find ${t}`);return r}async function st(e,t){await Ct();let r=await It(t),n=new ot;n.setLanguage(r);let i=n.parse(e);if(i==null)throw new Error("Failed to parse text");return i.rootNode}var at="scm";tt({binName:"tree-sitter-fmt",fileEndings:[at],getStdinFileEnding(){return at},format:async(e,t,r,n)=>{let i=await st(e,"tree-sitter-query");return U(i,t,n)}}); //# sourceMappingURL=treeSitterFormatter.js.map diff --git a/dist/treeSitterFormatter.js.map b/dist/treeSitterFormatter.js.map index 4845293..ed8bbeb 100644 --- a/dist/treeSitterFormatter.js.map +++ b/dist/treeSitterFormatter.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/util/constants.ts", "../src/util/createDebugLogger.ts", "../src/util/getEndOfLine.ts", "../src/util/getIndentation.ts", "../src/util/SyntaxError.ts", "../src/util/SyntaxTreeError.ts", "../src/treeSitterFormatter.ts", "../src/node/parseText.ts", "../src/node/cli.ts", "../src/util/getErrorMessage.ts", "../src/node/createLogger.ts", "../src/node/FilePatternError.ts", "../src/node/getOptionsFromConfig.ts", "../src/node/isMissingFileError.ts", "../src/node/normalizeToPosix.ts", "../src/node/getDefaultArguments.ts", "../src/node/parseArgs.ts", "../src/node/parseFilePatterns.ts", "../src/node/lstatSafe.ts", "../src/types.ts", "../src/node/printHelp.ts", "../package.json", "../src/node/printVersion.ts", "../src/node/setExitCode.ts", "../src/node/treeSitterFormatter.ts"], - "sourcesContent": ["// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { DebugLogger } from \"../types.js\";\n\nexport function createDebugLogger(debug: boolean): DebugLogger {\n return {\n debug(message: string) {\n if (debug) {\n console.warn(`[debug] ${message}`);\n }\n },\n };\n}\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import { DEFAULT_INDENT_WIDTH } from \"./constants.js\";\n\nexport function getIndentation(\n indentTabs: boolean | undefined,\n indentSize: number | undefined,\n): string {\n return indentTabs ? \"\\t\" : \" \".repeat(indentSize ?? DEFAULT_INDENT_WIDTH);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n constructor(private point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import type { SyntaxNode } from \"../types.js\";\nimport { SyntaxError } from \"./SyntaxError.js\";\n\nexport class SyntaxTreeError extends SyntaxError {\n constructor(rootNode: SyntaxNode) {\n super(findFirstProblemNode(rootNode)?.startPosition);\n this.name = \"SyntaxTreeError\";\n }\n}\n\nfunction findFirstProblemNode(node: SyntaxNode): SyntaxNode | null {\n if (node.isError || node.isMissing) {\n return node;\n }\n for (const child of node.children) {\n if (!child.hasError) {\n continue;\n }\n const errorNode = findFirstProblemNode(child);\n if (errorNode != null) {\n return errorNode;\n }\n }\n return null;\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"./types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"./util/constants.js\";\nimport { createDebugLogger } from \"./util/createDebugLogger.js\";\nimport { getEndOfLine } from \"./util/getEndOfLine.js\";\nimport { getIndentation } from \"./util/getIndentation.js\";\nimport { SyntaxTreeError } from \"./util/SyntaxTreeError.js\";\n\nexport type Options = FormatterOptions<\n \"endOfLine\" | \"indentTabs\" | \"indentSize\" | \"insertFinalNewline\"\n>;\n\nexport function treeSitterFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug: boolean = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TreeSitterFormatter(\n indentation,\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TreeSitterFormatter {\n private lastRow = 0;\n private logger: DebugLogger;\n\n constructor(\n private indentation: string,\n private eol: string,\n private insertFinalNewline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n getText(node: SyntaxNode): string {\n const nodeText = this.getNodeText(node, 0);\n\n if (nodeText.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return nodeText + this.eol;\n }\n\n return nodeText;\n }\n\n private getNodeText(node: SyntaxNode, numIndents: number): string {\n const nl = node.startPosition.row > this.lastRow + 1 ? this.eol : \"\";\n this.lastRow = node.endPosition.row;\n const text = this.getNodeTextInternal(node, numIndents);\n this.lastRow = node.endPosition.row;\n return `${nl}${text}`;\n }\n\n private getNamedNodeText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \")\");\n const first = node.children\n .slice(0, 2)\n .map((n) => n.text)\n .join(\"\");\n const last = node.children\n .slice(index)\n .map((n) => this.getNodeText(n, 0))\n .join(\"\");\n const interior = node.children\n .slice(2, index)\n .map((n) => this.getNodeText(n, numIndents + 1));\n // Inline node\n if (interior.length === 0) {\n return `${this.getIndent(numIndents)}${first}${last}`;\n }\n // Multiline node\n return [\n `${this.getIndent(numIndents)}${first}`,\n ...interior,\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getListText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \"]\");\n const first = node.children[0].text;\n const last = node.children\n .slice(index)\n .map((n) => n.text)\n .join(\" \");\n const parts = [\n `${this.getIndent(numIndents)}${first}`,\n ...node.children\n .slice(1, index)\n .map((n) => this.getNodeText(n, numIndents + 1)),\n `${this.getIndent(numIndents)}${last}`,\n ];\n return parts.join(this.eol);\n }\n\n private getPredicateText(node: SyntaxNode, numIndents: number): string {\n const first = node.children[0].text;\n const last = node.children[node.children.length - 1].text;\n const parts = [\n node.children\n .slice(1, 4)\n .map((n) => n.text)\n .join(\"\"),\n ...node.children[node.children.length - 2].children.map(\n (n) => n.text,\n ),\n ];\n // Inline predicate\n if (node.startPosition.row === node.endPosition.row) {\n const text = `${first}${parts.join(\" \")}${last}`;\n return `${this.getIndent(numIndents)}${text}`;\n }\n // Multiline predicate\n return [\n `${this.getIndent(numIndents)}${first}${parts[0]}`,\n ...parts\n .slice(1)\n .map((s) => `${this.getIndent(numIndents + 1)}${s}`),\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getFieldDefinitionText(\n node: SyntaxNode,\n numIndents: number,\n ): string {\n // Field definition directly in document root\n if (numIndents === 0) {\n return [\"(_\", this.getFieldDefinitionText(node, 1), \")\"].join(\n this.eol,\n );\n }\n // [lhs, \":\", rhs]\n return [\n this.getIndent(numIndents),\n node.children[0].text,\n node.children[1].text,\n \" \",\n this.getNodeText(node.children[2], numIndents).trimStart(),\n ].join(\"\");\n }\n\n private getNodeTextInternal(node: SyntaxNode, numIndents: number): string {\n switch (node.type) {\n case \"program\":\n return this.joinLines(node.children, 0);\n\n case \"grouping\":\n return this.joinLines(node.children, numIndents + 1);\n\n case \"list\":\n return this.getListText(node, numIndents);\n\n case \"named_node\":\n return this.getNamedNodeText(node, numIndents);\n\n case \"predicate\":\n return this.getPredicateText(node, numIndents);\n\n case \"field_definition\":\n return this.getFieldDefinitionText(node, numIndents);\n\n case \"anonymous_node\":\n return (\n this.getIndent(numIndents) +\n node.children\n .map((n) => this.getNodeText(n, numIndents + 1))\n .join(\"\")\n );\n\n case \"comment\":\n return `${this.getIndent(numIndents)}${node.text.trimEnd()}`;\n\n case \".\":\n case \"negated_field\":\n return `${this.getIndent(numIndents)}${node.text}`;\n\n case \"(\":\n case \")\":\n return `${this.getIndent(numIndents - 1)}${node.text}`;\n\n case \"capture\":\n return ` ${node.text}`;\n\n case \"#\":\n case \"_\":\n case \"predicate_type\":\n case \"identifier\":\n case \"quantifier\":\n case \"string\":\n return node.text;\n\n case \"parameters\": {\n const text = node.children.map((n) => n.text).join(\" \");\n return ` ${text}`;\n }\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private joinLines(nodes: SyntaxNode[], numIndents: number): string {\n if (nodes.length === 0) {\n return \"\";\n }\n const lastIsQuantifier = nodes[nodes.length - 1].type === \"quantifier\";\n const nodesToUse = lastIsQuantifier ? nodes.slice(0, -1) : nodes;\n const text = nodesToUse\n .map((n) => this.getNodeText(n, numIndents))\n .join(this.eol);\n return lastIsQuantifier\n ? `${text}${nodes[nodes.length - 1].text}`\n : text;\n }\n\n private getIndent(length: number): string {\n return length < 1\n ? \"\"\n : new Array(length).fill(this.indentation).join(\"\");\n }\n}\n", "import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Language, Parser } from \"web-tree-sitter\";\nimport type { SyntaxNode } from \"../types.js\";\n\ntype ParserName = \"tree-sitter-talon\" | \"tree-sitter-query\";\n\nlet initPromise: Promise | undefined;\nconst languageCache = new Map>();\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction initTreeSitter() {\n initPromise ??= Parser.init();\n return initPromise;\n}\n\nfunction loadLanguage(parserName: ParserName) {\n let promise = languageCache.get(parserName);\n\n if (promise == null) {\n const wasmFilePath = getWasmFilePath(parserName);\n promise = Language.load(wasmFilePath);\n languageCache.set(parserName, promise);\n }\n\n return promise;\n}\n\nfunction getWasmFilePath(parserName: ParserName) {\n const fileName = `${parserName}.wasm`;\n const wasmFilePath = [\n path.join(\n moduleDir,\n \"../../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n path.join(\n moduleDir,\n \"../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n ].find((candidate) => fs.existsSync(candidate));\n\n if (wasmFilePath == null) {\n throw new Error(`Could not find ${fileName}`);\n }\n\n return wasmFilePath;\n}\n\nexport async function parseText(\n text: string,\n parserName: ParserName,\n): Promise {\n await initTreeSitter();\n\n const language = await loadLanguage(parserName);\n\n const parser = new Parser();\n parser.setLanguage(language);\n\n const tree = parser.parse(text);\n\n if (tree == null) {\n throw new Error(\"Failed to parse text\");\n }\n\n return tree.rootNode;\n}\n", "import getStdin from \"get-stdin\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as process from \"node:process\";\nimport type { Readable } from \"node:stream\";\nimport type { CLI, Logger, ParsedArgs } from \"../types.js\";\nimport {\n EXIT_ERROR,\n EXIT_FAIL,\n EXIT_OK,\n type ExitCode,\n} from \"../util/constants.js\";\nimport { getErrorMessage } from \"../util/getErrorMessage.js\";\nimport { isSyntaxError } from \"../util/SyntaxError.js\";\nimport { createLogger } from \"./createLogger.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { getOptionsFromConfig } from \"./getOptionsFromConfig.js\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\nimport { parseArgs } from \"./parseArgs.js\";\nimport { parseFilePatterns } from \"./parseFilePatterns.js\";\nimport { printHelp } from \"./printHelp.js\";\nimport { printVersion } from \"./printVersion.js\";\nimport { setExitCode } from \"./setExitCode.js\";\n\nexport async function main(cli: CLI): Promise {\n let logger = createLogger();\n\n try {\n const args = parseArgs(process.argv.slice(2));\n logger = createLogger(args.quiet);\n const exitCode = await mainUnsafe({ cli, args, logger });\n setExitCode(exitCode);\n } catch (error) {\n if (error instanceof FilePatternError) {\n for (const message of error.messages) {\n logger.error(message);\n }\n } else {\n logger.error(getErrorMessage(error));\n }\n setExitCode(EXIT_ERROR);\n }\n}\n\ninterface MainUnsafeArgs {\n cli: CLI;\n args: ParsedArgs;\n logger: Logger;\n}\n\nasync function mainUnsafe({\n cli,\n args,\n logger,\n}: MainUnsafeArgs): Promise {\n if (args.help) {\n printHelp(cli);\n return EXIT_OK;\n }\n\n if (args.version) {\n printVersion();\n return EXIT_OK;\n }\n\n const hasFilePatterns = args.filePatterns.length > 0;\n\n if (hasFilePatterns) {\n return mainFormatFiles({\n cli,\n logger,\n check: args.check,\n debug: args.debug,\n filePatterns: args.filePatterns,\n });\n }\n\n // If no file patterns are provided, check if there's input from stdin.\n // If stdin TTY it's an interactive terminal, so we shouldn't read from it.\n if (!process.stdin.isTTY) {\n return mainFormatStdin({\n cli,\n logger,\n stdin: process.stdin,\n check: args.check,\n debug: args.debug,\n });\n }\n\n throw new Error(\n \"No input files specified. Use --help for usage information.\",\n );\n}\n\ninterface MainFormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePatterns: string[];\n}\n\nasync function mainFormatFiles({\n cli,\n logger,\n check,\n debug,\n filePatterns,\n}: MainFormatFilesArgs): Promise {\n if (check) {\n logger.log(\"Checking formatting...\");\n }\n\n const filePaths = await parseFilePatterns(cli, filePatterns);\n const [changedFileCount, hasError] = await formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n });\n\n if (check) {\n if (changedFileCount > 0) {\n logger.warn(\n `Code style issues found in ${changedFileCount} file(s).`,\n );\n if (!hasError) {\n return EXIT_FAIL;\n }\n }\n\n if (!hasError) {\n logger.log(\"All matched files use correct code style!\");\n }\n }\n\n if (hasError) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\ninterface FormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePaths: string[];\n}\n\nexport async function formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n}: FormatFilesArgs): Promise<[number, boolean]> {\n let changedFileCount = 0;\n let hasError = false;\n\n for (const filePath of filePaths) {\n try {\n const fileWasChanged = await formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n });\n if (fileWasChanged) {\n changedFileCount++;\n }\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(getDisplayPath(filePath)));\n } else {\n logger.error(\n `${getDisplayPath(filePath)}: ${getErrorMessage(error)}`,\n );\n }\n hasError = true;\n }\n }\n\n return [changedFileCount, hasError];\n}\n\ninterface FormatFileArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePath: string;\n}\n\nexport async function formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n}: FormatFileArgs): Promise {\n try {\n const options = await getOptionsFromConfig(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const formatted = await cli.format(content, options, filePath, debug);\n\n if (formatted === content) {\n return false;\n }\n\n logger.log(getDisplayPath(filePath));\n\n if (!check) {\n await fs.writeFile(filePath, formatted, \"utf8\");\n }\n\n return true;\n } catch (error) {\n if (isMissingFileError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction getDisplayPath(filePath: string): string {\n return normalizeToPosix(path.relative(process.cwd(), filePath));\n}\n\ninterface MainFormatStdinArgs {\n cli: CLI;\n logger: Logger;\n stdin: Readable;\n check: boolean;\n debug: boolean;\n}\n\nexport async function mainFormatStdin({\n cli,\n logger,\n stdin,\n check,\n debug,\n}: MainFormatStdinArgs): Promise {\n const input = await getStdin({ stdin });\n const fileEnding = cli.getStdinFileEnding(input);\n const fauxFileName = `stdin.${fileEnding}`;\n const fauxFilePath = path.resolve(fauxFileName);\n const options = await getOptionsFromConfig(fauxFilePath);\n let formatted: string;\n\n try {\n formatted = await cli.format(input, options, fauxFilePath, debug);\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(\"stdin\"));\n return EXIT_ERROR;\n }\n throw error;\n }\n\n if (check) {\n if (input !== formatted) {\n logger.warn(\"Code style issues found in stdin.\");\n return EXIT_FAIL;\n }\n\n return EXIT_OK;\n }\n\n process.stdout.write(formatted);\n\n return EXIT_OK;\n}\n", "export function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import * as process from \"node:process\";\nimport type { WriteStream } from \"node:tty\";\nimport type { Logger, LoggerEntry, TestLogger } from \"../types.js\";\n\ntype LogCallback = (message: string) => void;\ntype ColorizeCallback = (message: string, color: string) => string;\ntype LoggerStream = Pick & Partial;\n\nconst ANSI_RESET = \"\\u001b[0m\";\nconst ANSI_YELLOW = \"\\u001b[33m\";\nconst ANSI_RED = \"\\u001b[31m\";\nconst WARN_PREFIX = \"[warn]\";\nconst ERROR_PREFIX = \"[error]\";\n\nexport function createLogger(quiet: boolean = false): Logger {\n return createLoggerFromStreams(process.stdout, process.stderr, quiet);\n}\n\nexport function createLoggerFromStreams(\n stdout: LoggerStream,\n stderr: LoggerStream,\n quiet: boolean = false,\n): Logger {\n const colorize: ColorizeCallback = shouldUseColor(stderr)\n ? (message, color) => `${color}${message}${ANSI_RESET}`\n : (message, _color) => message;\n\n let log: LogCallback;\n let warn: LogCallback;\n\n if (quiet) {\n log = () => {};\n warn = () => {};\n } else {\n log = (message: string) => {\n stdout.write(`${message}\\n`);\n };\n warn = (message: string) => {\n stderr.write(`${colorize(WARN_PREFIX, ANSI_YELLOW)} ${message}\\n`);\n };\n }\n\n return {\n log,\n warn,\n error(message: string) {\n stderr.write(`${colorize(ERROR_PREFIX, ANSI_RED)} ${message}\\n`);\n },\n };\n}\n\nexport function createTestLogger(): TestLogger {\n const entries: LoggerEntry[] = [];\n\n return {\n log(message: string) {\n entries.push({ level: \"log\", message });\n },\n warn(message: string) {\n entries.push({ level: \"warn\", message });\n },\n error(message: string) {\n entries.push({ level: \"error\", message });\n },\n getEntries() {\n return entries;\n },\n };\n}\n\nfunction shouldUseColor(stream: LoggerStream): boolean {\n if (\"NO_COLOR\" in process.env) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n", "export class FilePatternError extends Error {\n name = \"FilePatternError\";\n\n constructor(public messages: string[]) {\n super(\n `One or more file pattern errors occurred:\\n${messages.join(\"\\n\")}`,\n );\n }\n}\n", "import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n", "export function isMissingFileError(\n error: unknown,\n): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import * as path from \"node:path\";\n\n/**\n * Replace `\\` with `/` on Windows\n * @param {string} filepath\n * @returns {string}\n */\nexport const normalizeToPosix =\n path.sep === \"\\\\\"\n ? (filepath: string) => filepath.replaceAll(\"\\\\\", \"/\")\n : (filepath: string) => filepath;\n", "import type { ParsedArgs } from \"../types.js\";\n\nexport function getDefaultArguments(): ParsedArgs {\n return {\n filePatterns: [],\n help: false,\n version: false,\n quiet: false,\n debug: false,\n check: false,\n };\n}\n", "import type { KnownArgument, ParsedArgs } from \"../types.js\";\nimport { getDefaultArguments } from \"./getDefaultArguments.js\";\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result = getDefaultArguments();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === \"--\") {\n // All following arguments are treated as file patterns, even if they start with \"--\"\n result.filePatterns.push(...argv.slice(i + 1));\n break;\n }\n\n if (parseKnownArgument(result, arg as KnownArgument)) {\n continue;\n }\n\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n result.filePatterns.push(arg);\n }\n\n return result;\n}\n\nfunction parseKnownArgument(result: ParsedArgs, arg: KnownArgument): boolean {\n switch (arg) {\n case \"--help\":\n result.help = true;\n return true;\n case \"--version\":\n result.version = true;\n return true;\n case \"--quiet\":\n result.quiet = true;\n return true;\n case \"--check\":\n result.check = true;\n return true;\n case \"--debug\":\n result.debug = true;\n return true;\n default:\n return false;\n }\n}\n", "import type { Options } from \"fast-glob\";\nimport fastGlob from \"fast-glob\";\nimport * as path from \"node:path\";\nimport type { CLI } from \"../types.js\";\nimport { GLOB_IGNORE_PATTERNS } from \"../util/constants.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { lstatSafe } from \"./lstatSafe.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\n\nexport async function parseFilePatterns(\n cli: CLI,\n filePatterns: string[],\n): Promise {\n const seen: Set = new Set();\n const globFileEndingPattern = getGlobFileEndingsPattern(cli.fileEndings);\n const errorMessages: string[] = [];\n\n const globOptions: Options = {\n dot: true,\n followSymbolicLinks: false,\n ignore: GLOB_IGNORE_PATTERNS,\n };\n\n for (const pattern of filePatterns) {\n const absolutePath = path.resolve(pattern);\n const stat = await lstatSafe(absolutePath);\n\n if (stat != null) {\n if (stat.isSymbolicLink()) {\n errorMessages.push(\n `Specified pattern is a symbolic link: ${pattern}`,\n );\n continue;\n }\n\n if (stat.isFile()) {\n seen.add(absolutePath);\n continue;\n }\n\n if (stat.isDirectory()) {\n const files = await fastGlob(`**/*.${globFileEndingPattern}`, {\n ...globOptions,\n cwd: absolutePath,\n });\n if (files.length === 0) {\n errorMessages.push(\n `No matching files were found in the directory: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(absolutePath, file));\n }\n continue;\n }\n }\n\n const glob = normalizeToPosix(pattern);\n const files = (await fastGlob(glob, globOptions)).filter((file) =>\n hasSupportedFileEnding(file, cli.fileEndings),\n );\n if (files.length === 0) {\n errorMessages.push(\n `No files matching the pattern were found: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(file));\n }\n }\n\n if (errorMessages.length > 0) {\n throw new FilePatternError(errorMessages);\n }\n\n return Array.from(seen).sort((a, b) => a.localeCompare(b));\n}\n\nfunction getGlobFileEndingsPattern(fileEndings: readonly string[]): string {\n return fileEndings.length === 1\n ? fileEndings[0]\n : `{${fileEndings.join(\",\")}}`;\n}\n\nfunction hasSupportedFileEnding(\n file: string,\n fileEndings: readonly string[],\n): boolean {\n const extension = path.extname(file).slice(1);\n return fileEndings.includes(extension);\n}\n", "import type { Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\n\nexport async function lstatSafe(filePath: string): Promise {\n try {\n return await fs.lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import type { KnownProps } from \"editorconfig\";\n\nexport const KNOWN_ARGUMENTS = [\n \"--help\",\n \"--version\",\n \"--quiet\",\n \"--check\",\n \"--debug\",\n] as const;\n\nexport type KnownArgument = (typeof KNOWN_ARGUMENTS)[number];\n\nexport interface CLI {\n binName: \"snippet-fmt\" | \"talon-fmt\" | \"tree-sitter-fmt\";\n fileEndings: readonly string[];\n\n getStdinFileEnding(text: string): string;\n format(\n text: string,\n options: Options,\n filePath: string,\n debug: boolean,\n ): Promise;\n}\n\nexport type EndOfLine = \"lf\" | \"crlf\";\n\nexport interface Options {\n endOfLine?: EndOfLine;\n indentTabs?: boolean;\n indentSize?: number;\n maxLineLength?: number;\n columnWidth?: number;\n insertFinalNewline?: boolean;\n preserveMultiline?: boolean;\n}\n\nexport type FormatterOptions = Pick;\n\nexport interface ParsedArgs {\n filePatterns: string[];\n help: boolean;\n version: boolean;\n check: boolean;\n quiet: boolean;\n debug: boolean;\n}\n\nexport interface LoggerEntry {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface Logger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface TestLogger extends Logger {\n getEntries(): readonly LoggerEntry[];\n}\n\nexport interface DebugLogger {\n debug(message: string): void;\n}\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport interface EditorConfigOptions extends KnownProps {\n max_line_length?: number | \"unset\";\n column_width?: number | \"unset\";\n preserve_multiline?: boolean | \"unset\";\n}\n\nexport interface Point {\n row: number;\n column: number;\n}\n\n/**\n * Internal representation of the Tree sitter node. Used so that our api doesn't\n * need to export or expose clients to Tree sitter types. Also makes it simple\n * to write tests internally.\n */\nexport interface SyntaxNode {\n id: number;\n text: string;\n type: string;\n startPosition: Point;\n endPosition: Point;\n hasError: boolean;\n isError: boolean;\n isMissing: boolean;\n parent: SyntaxNode | null;\n children: SyntaxNode[];\n}\n", "import type { CLI } from \"../types.js\";\nimport { KNOWN_ARGUMENTS } from \"../types.js\";\n\nexport function printHelp(cli: CLI) {\n process.stdout.write(\n `Usage: ${cli.binName} [options] [file/dir/glob ...]\\n`,\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(\"Options:\\n\");\n\n for (const option of KNOWN_ARGUMENTS) {\n process.stdout.write(` ${option}\\n`);\n }\n}\n", "{\n \"name\": \"@cursorless/talon-tools\",\n \"version\": \"0.10.2\",\n \"description\": \"Linting and formatting tools for Talon and Cursorless\",\n \"author\": \"Cursorless Dev\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"!dist/test\",\n \"!dist/build.*\"\n ],\n \"types\": \"./dist/lib.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/lib.d.ts\",\n \"default\": \"./dist/lib.js\"\n },\n \"./node\": {\n \"types\": \"./dist/node/libNode.d.ts\",\n \"default\": \"./dist/libNode.js\"\n }\n },\n \"bin\": {\n \"snippet-fmt\": \"dist/snippetFormatter.js\",\n \"talon-fmt\": \"dist/talonFormatter.js\",\n \"tree-sitter-fmt\": \"dist/treeSitterFormatter.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cursorless-dev/talon-tools.git\"\n },\n \"funding\": \"https://github.com/sponsors/cursorless-dev\",\n \"sponsor\": {\n \"url\": \"https://github.com/sponsors/cursorless-dev\"\n },\n \"scripts\": {\n \"build\": \"npm run clean && tsc -p . && tsx ./src/build.ts\",\n \"clean\": \"rm -rf dist/*\",\n \"lint\": \"npm run lint:ts &&npm run lint:fmt\",\n \"lint:ts\": \"tsc -p . --noEmit && eslint src\",\n \"lint:fmt\": \"prettier --check .\",\n \"fix\": \"npm run fix:ts && npm run fix:fmt\",\n \"fix:ts\": \"eslint src --fix\",\n \"fix:fmt\": \"prettier --write --list-different .\",\n \"test\": \"tsx src/test/runAllTests.ts\",\n \"test:subset\": \"tsx src/test/runAllTests.ts --subset\"\n },\n \"dependencies\": {\n \"@cursorless/tree-sitter-wasms\": \"^0.7.0\",\n \"editorconfig\": \"^3.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"get-stdin\": \"^10.0.0\",\n \"web-tree-sitter\": \"^0.26.7\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.4\",\n \"@types/mocha\": \"^10.0.10\",\n \"@types/node\": \"^24.12.0\",\n \"esbuild\": \"^0.27.4\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-import\": \"^2.32.0\",\n \"eslint\": \"^9.39.4\",\n \"jiti\": \"^2.6.1\",\n \"mocha\": \"^11.7.5\",\n \"prettier\": \"^3.8.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript-eslint\": \"^8.57.1\",\n \"typescript\": \"^5.9.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function printVersion() {\n process.stdout.write(`${packageJson.version}\\n`);\n}\n", "export function setExitCode(code: number): void {\n Reflect.set(process, \"exitCode\", code);\n}\n", "#!/usr/bin/env node\n\nimport { treeSitterFormatter } from \"../treeSitterFormatter.js\";\nimport { parseText } from \"./parseText.js\";\nimport { main } from \"./cli.js\";\n\nconst fileEnding = \"scm\";\n\nvoid main({\n binName: \"tree-sitter-fmt\",\n fileEndings: [fileEnding],\n\n getStdinFileEnding() {\n return fileEnding;\n },\n\n format: async (text, options, _filePath, debug) => {\n const node = await parseText(text, \"tree-sitter-query\");\n return treeSitterFormatter(node, options, debug);\n },\n});\n"], - "mappings": "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", - "names": ["IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "createDebugLogger", "debug", "message", "getEndOfLine", "eof", "getIndentation", "indentTabs", "indentSize", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "isSyntaxError", "error", "SyntaxTreeError", "SyntaxError", "rootNode", "findFirstProblemNode", "node", "child", "errorNode", "treeSitterFormatter", "node", "options", "debug", "SyntaxTreeError", "indentation", "getIndentation", "eol", "getEndOfLine", "TreeSitterFormatter", "insertFinalNewline", "createDebugLogger", "nodeText", "numIndents", "nl", "text", "index", "n", "first", "last", "interior", "parts", "s", "nodes", "lastIsQuantifier", "length", "fs", "path", "fileURLToPath", "Language", "Parser", "initPromise", "languageCache", "moduleDir", "initTreeSitter", "loadLanguage", "parserName", "promise", "wasmFilePath", "getWasmFilePath", "fileName", "candidate", "parseText", "text", "language", "parser", "tree", "getStdin", "fs", "path", "process", "getErrorMessage", "error", "process", "ANSI_RESET", "ANSI_YELLOW", "ANSI_RED", "WARN_PREFIX", "ERROR_PREFIX", "createLogger", "quiet", "createLoggerFromStreams", "stdout", "stderr", "colorize", "shouldUseColor", "message", "color", "_color", "log", "warn", "shouldUseColor", "stream", "FilePatternError", "messages", "editorconfig", "getOptionsFromConfig", "filePath", "config", "options", "isMissingFileError", "error", "path", "normalizeToPosix", "filepath", "getDefaultArguments", "parseArgs", "argv", "result", "getDefaultArguments", "i", "arg", "parseKnownArgument", "fastGlob", "path", "fs", "lstatSafe", "filePath", "error", "isMissingFileError", "parseFilePatterns", "cli", "filePatterns", "seen", "globFileEndingPattern", "getGlobFileEndingsPattern", "errorMessages", "globOptions", "GLOB_IGNORE_PATTERNS", "pattern", "absolutePath", "stat", "lstatSafe", "files", "fastGlob", "file", "glob", "normalizeToPosix", "hasSupportedFileEnding", "FilePatternError", "a", "b", "fileEndings", "extension", "KNOWN_ARGUMENTS", "printHelp", "cli", "option", "KNOWN_ARGUMENTS", "package_default", "printVersion", "package_default", "setExitCode", "code", "main", "cli", "logger", "createLogger", "args", "parseArgs", "exitCode", "mainUnsafe", "setExitCode", "error", "FilePatternError", "message", "getErrorMessage", "printHelp", "printVersion", "mainFormatFiles", "mainFormatStdin", "check", "debug", "filePatterns", "filePaths", "parseFilePatterns", "changedFileCount", "hasError", "formatFiles", "filePath", "formatFile", "isSyntaxError", "getDisplayPath", "options", "getOptionsFromConfig", "content", "formatted", "isMissingFileError", "normalizeToPosix", "stdin", "input", "getStdin", "fauxFileName", "fauxFilePath", "fileEnding", "main", "text", "options", "_filePath", "debug", "node", "parseText", "treeSitterFormatter"] + "sources": ["../src/util/constants.ts", "../src/util/createDebugLogger.ts", "../src/util/getEndOfLine.ts", "../src/util/getIndentation.ts", "../src/util/SyntaxError.ts", "../src/util/SyntaxTreeError.ts", "../src/treeSitterFormatter.ts", "../src/node/cli.ts", "../src/util/getErrorMessage.ts", "../src/node/createLogger.ts", "../src/node/FilePatternError.ts", "../src/node/getOptionsFromConfig.ts", "../src/node/isMissingFileError.ts", "../src/node/normalizeToPosix.ts", "../src/types.ts", "../src/node/getDefaultArguments.ts", "../src/node/parseArgs.ts", "../src/node/parseFilePatterns.ts", "../src/node/lstatSafe.ts", "../src/node/printHelp.ts", "../package.json", "../src/node/printVersion.ts", "../src/node/setExitCode.ts", "../src/node/parseText.ts", "../src/node/treeSitterFormatter.ts"], + "sourcesContent": ["// Exit code 0: Success\nexport const EXIT_OK = 0;\n// Exit code 1: Check failed\nexport const EXIT_FAIL = 1;\n// Exit code 2: Unexpected error\nexport const EXIT_ERROR = 2;\n\nexport type ExitCode = typeof EXIT_OK | typeof EXIT_FAIL | typeof EXIT_ERROR;\n\nexport const DEFAULT_INDENT_WIDTH = 4;\nexport const DEFAULT_MAX_LINE_LENGTH = 80;\nexport const DEFAULT_INSERT_FINAL_NEWLINE = true;\n\nexport const IGNORE_FOLDERS = [\n \".git\",\n \".svn\",\n \".hg\",\n \"node_modules\",\n \"__pycache__\",\n];\n\nexport const GLOB_IGNORE_PATTERNS = IGNORE_FOLDERS.map(\n (pattern) => `**/${pattern}/**`,\n);\n", "import type { DebugLogger } from \"../types.js\";\n\nexport function createDebugLogger(debug: boolean): DebugLogger {\n return {\n debug(message: string) {\n if (debug) {\n console.warn(`[debug] ${message}`);\n }\n },\n };\n}\n", "import type { EndOfLine } from \"../types.js\";\n\nexport function getEndOfLine(eof?: EndOfLine): string {\n return eof === \"crlf\" ? \"\\r\\n\" : \"\\n\";\n}\n", "import { DEFAULT_INDENT_WIDTH } from \"./constants.js\";\n\nexport function getIndentation(\n indentTabs: boolean | undefined,\n indentSize: number | undefined,\n): string {\n return indentTabs ? \"\\t\" : \" \".repeat(indentSize ?? DEFAULT_INDENT_WIDTH);\n}\n", "import type { Point } from \"../types.js\";\n\nconst shortMessage = \"Syntax error\";\n\nexport class SyntaxError extends Error {\n private readonly location: string | undefined;\n\n public constructor(private readonly point?: Point) {\n const location = getLocation(point);\n super(getMessage(location));\n this.name = \"SyntaxError\";\n this.location = location;\n }\n\n public getFileMessage(file: string): string {\n return this.location != null\n ? `${file}(${this.location}): ${shortMessage}`\n : `${file}: ${shortMessage}`;\n }\n}\n\nexport function isSyntaxError(error: unknown): error is SyntaxError {\n return error instanceof SyntaxError;\n}\n\nfunction getMessage(location: string | undefined): string {\n return location != null ? `${shortMessage} at ${location}.` : shortMessage;\n}\n\nfunction getLocation(point: Point | undefined): string | undefined {\n return point != null ? `${point.row + 1}:${point.column + 1}` : undefined;\n}\n", "import type { SyntaxNode } from \"../types.js\";\nimport { SyntaxError } from \"./SyntaxError.js\";\n\nexport class SyntaxTreeError extends SyntaxError {\n public constructor(rootNode: SyntaxNode) {\n super(findFirstProblemNode(rootNode)?.startPosition);\n this.name = \"SyntaxTreeError\";\n }\n}\n\nfunction findFirstProblemNode(node: SyntaxNode): SyntaxNode | null {\n if (node.isError || node.isMissing) {\n return node;\n }\n for (const child of node.children) {\n if (!child.hasError) {\n continue;\n }\n const errorNode = findFirstProblemNode(child);\n if (errorNode != null) {\n return errorNode;\n }\n }\n return null;\n}\n", "import type { DebugLogger, FormatterOptions, SyntaxNode } from \"./types.js\";\nimport { DEFAULT_INSERT_FINAL_NEWLINE } from \"./util/constants.js\";\nimport { createDebugLogger } from \"./util/createDebugLogger.js\";\nimport { getEndOfLine } from \"./util/getEndOfLine.js\";\nimport { getIndentation } from \"./util/getIndentation.js\";\nimport { SyntaxTreeError } from \"./util/SyntaxTreeError.js\";\n\nexport type Options = FormatterOptions<\n \"endOfLine\" | \"indentTabs\" | \"indentSize\" | \"insertFinalNewline\"\n>;\n\nexport function treeSitterFormatter(\n node: SyntaxNode,\n options: Options = {},\n debug = false,\n): string {\n if (node.hasError) {\n throw new SyntaxTreeError(node);\n }\n\n const indentation = getIndentation(options.indentTabs, options.indentSize);\n const eol = getEndOfLine(options.endOfLine);\n const formatter = new TreeSitterFormatter(\n indentation,\n eol,\n options.insertFinalNewline ?? DEFAULT_INSERT_FINAL_NEWLINE,\n debug,\n );\n return formatter.getText(node);\n}\n\nclass TreeSitterFormatter {\n private lastRow = 0;\n private readonly logger: DebugLogger;\n\n public constructor(\n private readonly indentation: string,\n private readonly eol: string,\n private readonly insertFinalNewline: boolean,\n debug: boolean,\n ) {\n this.logger = createDebugLogger(debug);\n }\n\n public getText(node: SyntaxNode): string {\n const nodeText = this.getNodeText(node, 0);\n\n if (nodeText.length === 0) {\n return \"\";\n }\n\n if (this.insertFinalNewline) {\n return nodeText + this.eol;\n }\n\n return nodeText;\n }\n\n private getNodeText(node: SyntaxNode, numIndents: number): string {\n const nl = node.startPosition.row > this.lastRow + 1 ? this.eol : \"\";\n this.lastRow = node.endPosition.row;\n const text = this.getNodeTextInternal(node, numIndents);\n this.lastRow = node.endPosition.row;\n return `${nl}${text}`;\n }\n\n private getNamedNodeText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \")\");\n const first = node.children\n .slice(0, 2)\n .map((n) => n.text)\n .join(\"\");\n const last = node.children\n .slice(index)\n .map((n) => this.getNodeText(n, 0))\n .join(\"\");\n const interior = node.children\n .slice(2, index)\n .map((n) => this.getNodeText(n, numIndents + 1));\n // Inline node\n if (interior.length === 0) {\n return `${this.getIndent(numIndents)}${first}${last}`;\n }\n // Multiline node\n return [\n `${this.getIndent(numIndents)}${first}`,\n ...interior,\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getListText(node: SyntaxNode, numIndents: number): string {\n const index = node.children.findIndex((n) => n.type === \"]\");\n const first = node.children[0].text;\n const last = node.children\n .slice(index)\n .map((n) => n.text)\n .join(\" \");\n const parts = [\n `${this.getIndent(numIndents)}${first}`,\n ...node.children\n .slice(1, index)\n .map((n) => this.getNodeText(n, numIndents + 1)),\n `${this.getIndent(numIndents)}${last}`,\n ];\n return parts.join(this.eol);\n }\n\n private getPredicateText(node: SyntaxNode, numIndents: number): string {\n const first = node.children[0].text;\n const last = node.children[node.children.length - 1].text;\n const parts = [\n node.children\n .slice(1, 4)\n .map((n) => n.text)\n .join(\"\"),\n ...node.children[node.children.length - 2].children.map(\n (n) => n.text,\n ),\n ];\n // Inline predicate\n if (node.startPosition.row === node.endPosition.row) {\n const text = `${first}${parts.join(\" \")}${last}`;\n return `${this.getIndent(numIndents)}${text}`;\n }\n // Multiline predicate\n return [\n `${this.getIndent(numIndents)}${first}${parts[0]}`,\n ...parts\n .slice(1)\n .map((s) => `${this.getIndent(numIndents + 1)}${s}`),\n `${this.getIndent(numIndents)}${last}`,\n ].join(this.eol);\n }\n\n private getFieldDefinitionText(\n node: SyntaxNode,\n numIndents: number,\n ): string {\n // Field definition directly in document root\n if (numIndents === 0) {\n return [\"(_\", this.getFieldDefinitionText(node, 1), \")\"].join(\n this.eol,\n );\n }\n // [lhs, \":\", rhs]\n return [\n this.getIndent(numIndents),\n node.children[0].text,\n node.children[1].text,\n \" \",\n this.getNodeText(node.children[2], numIndents).trimStart(),\n ].join(\"\");\n }\n\n private getNodeTextInternal(node: SyntaxNode, numIndents: number): string {\n switch (node.type) {\n case \"program\":\n return this.joinLines(node.children, 0);\n\n case \"grouping\":\n return this.joinLines(node.children, numIndents + 1);\n\n case \"list\":\n return this.getListText(node, numIndents);\n\n case \"named_node\":\n return this.getNamedNodeText(node, numIndents);\n\n case \"predicate\":\n return this.getPredicateText(node, numIndents);\n\n case \"field_definition\":\n return this.getFieldDefinitionText(node, numIndents);\n\n case \"anonymous_node\":\n return (\n this.getIndent(numIndents) +\n node.children\n .map((n) => this.getNodeText(n, numIndents + 1))\n .join(\"\")\n );\n\n case \"comment\":\n return `${this.getIndent(numIndents)}${node.text.trimEnd()}`;\n\n case \".\":\n case \"negated_field\":\n return `${this.getIndent(numIndents)}${node.text}`;\n\n case \"(\":\n case \")\":\n return `${this.getIndent(numIndents - 1)}${node.text}`;\n\n case \"capture\":\n return ` ${node.text}`;\n\n case \"#\":\n case \"_\":\n case \"predicate_type\":\n case \"identifier\":\n case \"quantifier\":\n case \"string\":\n return node.text;\n\n case \"parameters\": {\n const text = node.children.map((n) => n.text).join(\" \");\n return ` ${text}`;\n }\n\n default:\n this.logger.debug(`Unknown syntax node type '${node.type}'`);\n return node.text;\n }\n }\n\n private joinLines(nodes: SyntaxNode[], numIndents: number): string {\n if (nodes.length === 0) {\n return \"\";\n }\n const lastIsQuantifier = nodes[nodes.length - 1].type === \"quantifier\";\n const nodesToUse = lastIsQuantifier ? nodes.slice(0, -1) : nodes;\n const text = nodesToUse\n .map((n) => this.getNodeText(n, numIndents))\n .join(this.eol);\n return lastIsQuantifier\n ? `${text}${nodes[nodes.length - 1].text}`\n : text;\n }\n\n private getIndent(length: number): string {\n return length < 1\n ? \"\"\n : Array.from({ length }, () => this.indentation).join(\"\");\n }\n}\n", "import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as process from \"node:process\";\nimport type { Readable } from \"node:stream\";\nimport getStdin from \"get-stdin\";\nimport type { CLI, Logger, ParsedArgs } from \"../types.js\";\nimport { EXIT_ERROR, EXIT_FAIL, EXIT_OK } from \"../util/constants.js\";\nimport type { ExitCode } from \"../util/constants.js\";\nimport { getErrorMessage } from \"../util/getErrorMessage.js\";\nimport { isSyntaxError } from \"../util/SyntaxError.js\";\nimport { createLogger } from \"./createLogger.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { getOptionsFromConfig } from \"./getOptionsFromConfig.js\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\nimport { parseArgs } from \"./parseArgs.js\";\nimport { parseFilePatterns } from \"./parseFilePatterns.js\";\nimport { printHelp } from \"./printHelp.js\";\nimport { printVersion } from \"./printVersion.js\";\nimport { setExitCode } from \"./setExitCode.js\";\n\nexport async function main(cli: CLI): Promise {\n let logger = createLogger();\n\n try {\n const args = parseArgs(process.argv.slice(2));\n logger = createLogger(args.quiet);\n const exitCode = await mainUnsafe({ cli, args, logger });\n setExitCode(exitCode);\n } catch (error) {\n if (error instanceof FilePatternError) {\n for (const message of error.messages) {\n logger.error(message);\n }\n } else {\n logger.error(getErrorMessage(error));\n }\n setExitCode(EXIT_ERROR);\n }\n}\n\ninterface MainUnsafeArgs {\n cli: CLI;\n args: ParsedArgs;\n logger: Logger;\n}\n\nfunction mainUnsafe({ cli, args, logger }: MainUnsafeArgs): Promise {\n if (args.help) {\n printHelp(cli);\n return Promise.resolve(EXIT_OK);\n }\n\n if (args.version) {\n printVersion();\n return Promise.resolve(EXIT_OK);\n }\n\n const hasFilePatterns = args.filePatterns.length > 0;\n\n if (hasFilePatterns) {\n return mainFormatFiles({\n cli,\n logger,\n check: args.check,\n debug: args.debug,\n filePatterns: args.filePatterns,\n });\n }\n\n // If no file patterns are provided, check if there's input from stdin.\n // If stdin TTY it's an interactive terminal, so we shouldn't read from it.\n if (!process.stdin.isTTY) {\n return mainFormatStdin({\n cli,\n logger,\n stdin: process.stdin,\n check: args.check,\n debug: args.debug,\n });\n }\n\n throw new Error(\n \"No input files specified. Use --help for usage information.\",\n );\n}\n\ninterface MainFormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePatterns: string[];\n}\n\nasync function mainFormatFiles({\n cli,\n logger,\n check,\n debug,\n filePatterns,\n}: MainFormatFilesArgs): Promise {\n if (check) {\n logger.log(\"Checking formatting...\");\n }\n\n const filePaths = await parseFilePatterns(cli, filePatterns);\n const [changedFileCount, hasError] = await formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n });\n\n if (check) {\n if (changedFileCount > 0) {\n logger.warn(\n `Code style issues found in ${changedFileCount} file(s).`,\n );\n if (!hasError) {\n return EXIT_FAIL;\n }\n }\n\n if (!hasError) {\n logger.log(\"All matched files use correct code style!\");\n }\n }\n\n if (hasError) {\n return EXIT_ERROR;\n }\n\n return EXIT_OK;\n}\n\ninterface FormatFilesArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePaths: string[];\n}\n\nexport async function formatFiles({\n cli,\n logger,\n check,\n debug,\n filePaths,\n}: FormatFilesArgs): Promise<[number, boolean]> {\n let changedFileCount = 0;\n let hasError = false;\n\n for (const filePath of filePaths) {\n try {\n const fileWasChanged = await formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n });\n if (fileWasChanged) {\n changedFileCount++;\n }\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(getDisplayPath(filePath)));\n } else {\n logger.error(\n `${getDisplayPath(filePath)}: ${getErrorMessage(error)}`,\n );\n }\n hasError = true;\n }\n }\n\n return [changedFileCount, hasError];\n}\n\ninterface FormatFileArgs {\n cli: CLI;\n logger: Logger;\n check: boolean;\n debug: boolean;\n filePath: string;\n}\n\nexport async function formatFile({\n cli,\n logger,\n check,\n debug,\n filePath,\n}: FormatFileArgs): Promise {\n try {\n const options = await getOptionsFromConfig(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const formatted = await cli.format(content, options, filePath, debug);\n\n if (formatted === content) {\n return false;\n }\n\n logger.log(getDisplayPath(filePath));\n\n if (!check) {\n await fs.writeFile(filePath, formatted, \"utf8\");\n }\n\n return true;\n } catch (error) {\n if (isMissingFileError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction getDisplayPath(filePath: string): string {\n return normalizeToPosix(path.relative(process.cwd(), filePath));\n}\n\ninterface MainFormatStdinArgs {\n cli: CLI;\n logger: Logger;\n stdin: Readable;\n check: boolean;\n debug: boolean;\n}\n\nexport async function mainFormatStdin({\n cli,\n logger,\n stdin,\n check,\n debug,\n}: MainFormatStdinArgs): Promise {\n const input = await getStdin({ stdin });\n const fileEnding = cli.getStdinFileEnding(input);\n const fauxFileName = `stdin.${fileEnding}`;\n const fauxFilePath = path.resolve(fauxFileName);\n const options = await getOptionsFromConfig(fauxFilePath);\n let formatted: string;\n\n try {\n formatted = await cli.format(input, options, fauxFilePath, debug);\n } catch (error) {\n if (isSyntaxError(error)) {\n logger.error(error.getFileMessage(\"stdin\"));\n return EXIT_ERROR;\n }\n throw error;\n }\n\n if (check) {\n if (input !== formatted) {\n logger.warn(\"Code style issues found in stdin.\");\n return EXIT_FAIL;\n }\n\n return EXIT_OK;\n }\n\n process.stdout.write(formatted);\n\n return EXIT_OK;\n}\n", "export function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import * as process from \"node:process\";\nimport type { WriteStream } from \"node:tty\";\nimport type { Logger, LoggerEntry, TestLogger } from \"../types.js\";\n\ntype LogCallback = (message: string) => void;\ntype ColorizeCallback = (message: string, color: string) => string;\ntype LoggerStream = Pick & Partial;\n\nconst ANSI_RESET = \"\\u001B[0m\";\nconst ANSI_YELLOW = \"\\u001B[33m\";\nconst ANSI_RED = \"\\u001B[31m\";\nconst WARN_PREFIX = \"[warn]\";\nconst ERROR_PREFIX = \"[error]\";\n\nexport function createLogger(quiet = false): Logger {\n return createLoggerFromStreams(process.stdout, process.stderr, quiet);\n}\n\nexport function createLoggerFromStreams(\n stdout: LoggerStream,\n stderr: LoggerStream,\n quiet = false,\n): Logger {\n const colorize: ColorizeCallback = shouldUseColor(stderr)\n ? (message, color) => `${color}${message}${ANSI_RESET}`\n : (message, _color) => message;\n\n let log: LogCallback;\n let warn: LogCallback;\n\n if (quiet) {\n log = () => {\n // no-op\n };\n warn = () => {\n // no-op\n };\n } else {\n log = (message: string) => {\n stdout.write(`${message}\\n`);\n };\n warn = (message: string) => {\n stderr.write(`${colorize(WARN_PREFIX, ANSI_YELLOW)} ${message}\\n`);\n };\n }\n\n return {\n log,\n warn,\n error(message: string) {\n stderr.write(`${colorize(ERROR_PREFIX, ANSI_RED)} ${message}\\n`);\n },\n };\n}\n\nexport function createTestLogger(): TestLogger {\n const entries: LoggerEntry[] = [];\n\n return {\n log(message: string) {\n entries.push({ level: \"log\", message });\n },\n warn(message: string) {\n entries.push({ level: \"warn\", message });\n },\n error(message: string) {\n entries.push({ level: \"error\", message });\n },\n getEntries() {\n return entries;\n },\n };\n}\n\nfunction shouldUseColor(stream: LoggerStream): boolean {\n if (\"NO_COLOR\" in process.env) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n", "export class FilePatternError extends Error {\n public name = \"FilePatternError\";\n\n public constructor(public messages: string[]) {\n super(\n `One or more file pattern errors occurred:\\n${messages.join(\"\\n\")}`,\n );\n }\n}\n", "import * as editorconfig from \"editorconfig\";\nimport type { EditorConfigOptions, Options } from \"../types.js\";\n\nexport async function getOptionsFromConfig(filePath: string): Promise {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n const config = (await editorconfig.parse(filePath)) as EditorConfigOptions;\n\n const options: Options = {};\n\n if (config.indent_style === \"tab\") {\n options.indentTabs = true;\n } else if (config.indent_style === \"space\") {\n options.indentTabs = false;\n }\n\n if (typeof config.indent_size === \"number\") {\n options.indentSize = config.indent_size;\n } else if (\n config.indent_size === \"tab\" &&\n typeof config.tab_width === \"number\"\n ) {\n options.indentSize = config.tab_width;\n }\n\n if (typeof config.max_line_length === \"number\") {\n options.maxLineLength = config.max_line_length;\n }\n\n if (typeof config.column_width === \"number\") {\n options.columnWidth = config.column_width;\n }\n\n if (typeof config.insert_final_newline === \"boolean\") {\n options.insertFinalNewline = config.insert_final_newline;\n }\n\n if (typeof config.preserve_multiline === \"boolean\") {\n options.preserveMultiline = config.preserve_multiline;\n }\n\n if (config.end_of_line != null && config.end_of_line !== \"unset\") {\n options.endOfLine = config.end_of_line;\n }\n\n return options;\n}\n", "export function isMissingFileError(\n error: unknown,\n): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import * as path from \"node:path\";\n\n/**\n * Replace `\\` with `/` on Windows\n * @param {string} filepath\n * @returns {string}\n */\nexport const normalizeToPosix: (filepath: string) => string =\n path.sep === \"\\\\\"\n ? (filepath: string) => filepath.replaceAll(\"\\\\\", \"/\")\n : (filepath: string) => filepath;\n", "import type { KnownProps } from \"editorconfig\";\n\nexport const KNOWN_ARGUMENTS = [\n \"--help\",\n \"--version\",\n \"--quiet\",\n \"--check\",\n \"--debug\",\n] as const;\n\nexport type KnownArgument = (typeof KNOWN_ARGUMENTS)[number];\n\nexport function isKnownArgument(value: string): value is KnownArgument {\n return (KNOWN_ARGUMENTS as readonly string[]).includes(value);\n}\n\nexport interface CLI {\n binName: \"snippet-fmt\" | \"talon-fmt\" | \"tree-sitter-fmt\";\n fileEndings: readonly string[];\n\n getStdinFileEnding(text: string): string;\n format(\n text: string,\n options: Options,\n filePath: string,\n debug: boolean,\n ): Promise;\n}\n\nexport type EndOfLine = \"lf\" | \"crlf\";\n\nexport interface Options {\n endOfLine?: EndOfLine;\n indentTabs?: boolean;\n indentSize?: number;\n maxLineLength?: number;\n columnWidth?: number;\n insertFinalNewline?: boolean;\n preserveMultiline?: boolean;\n}\n\nexport type FormatterOptions = Pick;\n\nexport interface ParsedArgs {\n filePatterns: string[];\n help: boolean;\n version: boolean;\n check: boolean;\n quiet: boolean;\n debug: boolean;\n}\n\nexport interface LoggerEntry {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface Logger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface TestLogger extends Logger {\n getEntries(): readonly LoggerEntry[];\n}\n\nexport interface DebugLogger {\n debug(message: string): void;\n}\n\nexport interface EditorConfigOptions extends KnownProps {\n max_line_length?: number | \"unset\";\n column_width?: number | \"unset\";\n preserve_multiline?: boolean | \"unset\";\n}\n\nexport interface Point {\n row: number;\n column: number;\n}\n\n/**\n * Internal representation of the Tree sitter node. Used so that our api doesn't\n * need to export or expose clients to Tree sitter types. Also makes it simple\n * to write tests internally.\n */\nexport interface SyntaxNode {\n id: number;\n text: string;\n type: string;\n startPosition: Point;\n endPosition: Point;\n hasError: boolean;\n isError: boolean;\n isMissing: boolean;\n parent: SyntaxNode | null;\n children: SyntaxNode[];\n}\n", "import type { ParsedArgs } from \"../types.js\";\n\nexport function getDefaultArguments(): ParsedArgs {\n return {\n filePatterns: [],\n help: false,\n version: false,\n quiet: false,\n debug: false,\n check: false,\n };\n}\n", "import { isKnownArgument } from \"../types.js\";\nimport type { KnownArgument, ParsedArgs } from \"../types.js\";\nimport { getDefaultArguments } from \"./getDefaultArguments.js\";\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result = getDefaultArguments();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === \"--\") {\n // All following arguments are treated as file patterns, even if they start with \"--\"\n result.filePatterns.push(...argv.slice(i + 1));\n break;\n }\n\n if (isKnownArgument(arg) && parseKnownArgument(result, arg)) {\n continue;\n }\n\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n result.filePatterns.push(arg);\n }\n\n return result;\n}\n\nfunction parseKnownArgument(result: ParsedArgs, arg: KnownArgument): boolean {\n switch (arg) {\n case \"--help\":\n result.help = true;\n return true;\n case \"--version\":\n result.version = true;\n return true;\n case \"--quiet\":\n result.quiet = true;\n return true;\n case \"--check\":\n result.check = true;\n return true;\n case \"--debug\":\n result.debug = true;\n return true;\n default:\n return false;\n }\n}\n", "import * as path from \"node:path\";\nimport type { Options } from \"fast-glob\";\nimport fastGlob from \"fast-glob\";\nimport type { CLI } from \"../types.js\";\nimport { GLOB_IGNORE_PATTERNS } from \"../util/constants.js\";\nimport { FilePatternError } from \"./FilePatternError.js\";\nimport { lstatSafe } from \"./lstatSafe.js\";\nimport { normalizeToPosix } from \"./normalizeToPosix.js\";\n\nexport async function parseFilePatterns(\n cli: CLI,\n filePatterns: string[],\n): Promise {\n const seen = new Set();\n const globFileEndingPattern = getGlobFileEndingsPattern(cli.fileEndings);\n const errorMessages: string[] = [];\n\n const globOptions: Options = {\n dot: true,\n followSymbolicLinks: false,\n ignore: GLOB_IGNORE_PATTERNS,\n };\n\n for (const pattern of filePatterns) {\n const absolutePath = path.resolve(pattern);\n const stat = await lstatSafe(absolutePath);\n\n if (stat != null) {\n if (stat.isSymbolicLink()) {\n errorMessages.push(\n `Specified pattern is a symbolic link: ${pattern}`,\n );\n continue;\n }\n\n if (stat.isFile()) {\n seen.add(absolutePath);\n continue;\n }\n\n if (stat.isDirectory()) {\n const files = await fastGlob(`**/*.${globFileEndingPattern}`, {\n ...globOptions,\n cwd: absolutePath,\n });\n if (files.length === 0) {\n errorMessages.push(\n `No matching files were found in the directory: ${pattern}`,\n );\n }\n for (const file of files) {\n seen.add(path.resolve(absolutePath, file));\n }\n continue;\n }\n }\n\n const glob = normalizeToPosix(pattern);\n const allFiles = await fastGlob(glob, globOptions);\n const filteredFiles = allFiles.filter((file) =>\n hasSupportedFileEnding(file, cli.fileEndings),\n );\n if (filteredFiles.length === 0) {\n errorMessages.push(\n `No files matching the pattern were found: ${pattern}`,\n );\n }\n for (const file of filteredFiles) {\n seen.add(path.resolve(file));\n }\n }\n\n if (errorMessages.length > 0) {\n throw new FilePatternError(errorMessages);\n }\n\n return Array.from(seen).toSorted((a, b) => a.localeCompare(b));\n}\n\nfunction getGlobFileEndingsPattern(fileEndings: readonly string[]): string {\n return fileEndings.length === 1\n ? fileEndings[0]\n : `{${fileEndings.join(\",\")}}`;\n}\n\nfunction hasSupportedFileEnding(\n file: string,\n fileEndings: readonly string[],\n): boolean {\n const extension = path.extname(file).slice(1);\n return fileEndings.includes(extension);\n}\n", "import type { Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { isMissingFileError } from \"./isMissingFileError.js\";\n\nexport async function lstatSafe(filePath: string): Promise {\n try {\n return await fs.lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import type { CLI } from \"../types.js\";\nimport { KNOWN_ARGUMENTS } from \"../types.js\";\n\nexport function printHelp(cli: CLI): void {\n process.stdout.write(\n `Usage: ${cli.binName} [options] [file/dir/glob ...]\\n`,\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(\"Options:\\n\");\n\n for (const option of KNOWN_ARGUMENTS) {\n process.stdout.write(` ${option}\\n`);\n }\n}\n", "{\n \"name\": \"@cursorless/talon-tools\",\n \"version\": \"0.11.0\",\n \"description\": \"Linting and formatting tools for Talon and Cursorless\",\n \"author\": \"Cursorless Dev\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"!dist/test\",\n \"!dist/build.*\"\n ],\n \"types\": \"./dist/lib.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/lib.d.ts\",\n \"default\": \"./dist/lib.js\"\n },\n \"./node\": {\n \"types\": \"./dist/node/libNode.d.ts\",\n \"default\": \"./dist/libNode.js\"\n }\n },\n \"bin\": {\n \"snippet-fmt\": \"dist/snippetFormatter.js\",\n \"talon-fmt\": \"dist/talonFormatter.js\",\n \"tree-sitter-fmt\": \"dist/treeSitterFormatter.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cursorless-dev/talon-tools.git\"\n },\n \"funding\": \"https://github.com/sponsors/cursorless-dev\",\n \"sponsor\": {\n \"url\": \"https://github.com/sponsors/cursorless-dev\"\n },\n \"scripts\": {\n \"build\": \"npm run clean && tsc -p . && tsx ./src/build.ts\",\n \"clean\": \"rm -rf dist/*\",\n \"lint\": \"npm run typecheck && npm run lint:ts && npm run lint:fmt\",\n \"typecheck\": \"tsc -p . --noEmit\",\n \"lint:ts\": \"oxlint -c oxlint.config.mts --deny-warnings .\",\n \"lint:fmt\": \"oxfmt --check .\",\n \"fix\": \"npm run fix:ts && npm run fix:fmt\",\n \"fix:ts\": \"oxlint -c oxlint.config.mts --fix .\",\n \"fix:fmt\": \"oxfmt .\",\n \"test\": \"tsx src/test/runAllTests.ts\",\n \"test:subset\": \"tsx src/test/runAllTests.ts --subset\"\n },\n \"dependencies\": {\n \"@cursorless/tree-sitter-wasms\": \"^0.9.0\",\n \"editorconfig\": \"^3.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"get-stdin\": \"^10.0.0\",\n \"web-tree-sitter\": \"^0.26.8\"\n },\n \"devDependencies\": {\n \"@types/mocha\": \"^10.0.10\",\n \"@types/node\": \"^24.12.2\",\n \"esbuild\": \"^0.28.0\",\n \"mocha\": \"^11.7.5\",\n \"oxfmt\": \"^0.47.0\",\n \"oxlint-tsgolint\": \"^0.22.1\",\n \"oxlint\": \"^1.62.0\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^6.0.3\"\n }\n}\n", "import packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport function printVersion(): void {\n process.stdout.write(`${packageJson.version}\\n`);\n}\n", "export function setExitCode(code: number): void {\n Reflect.set(process, \"exitCode\", code);\n}\n", "import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Language, Parser } from \"web-tree-sitter\";\nimport type { SyntaxNode } from \"../types.js\";\n\ntype ParserName = \"tree-sitter-talon\" | \"tree-sitter-query\";\n\nlet initPromise: Promise | undefined;\nconst languageCache = new Map>();\n// oxlint-disable-next-line unicorn/prefer-import-meta-properties\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction initTreeSitter() {\n initPromise ??= Parser.init();\n return initPromise;\n}\n\nfunction loadLanguage(parserName: ParserName) {\n let promise = languageCache.get(parserName);\n\n if (promise == null) {\n const wasmFilePath = getWasmFilePath(parserName);\n promise = Language.load(wasmFilePath);\n languageCache.set(parserName, promise);\n }\n\n return promise;\n}\n\nfunction getWasmFilePath(parserName: ParserName) {\n const fileName = `${parserName}.wasm`;\n const wasmFilePath = [\n path.join(\n moduleDir,\n \"../../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n path.join(\n moduleDir,\n \"../node_modules/@cursorless/tree-sitter-wasms/out\",\n fileName,\n ),\n ].find((candidate) => fs.existsSync(candidate));\n\n if (wasmFilePath == null) {\n throw new Error(`Could not find ${fileName}`);\n }\n\n return wasmFilePath;\n}\n\nexport async function parseText(\n text: string,\n parserName: ParserName,\n): Promise {\n await initTreeSitter();\n\n const language = await loadLanguage(parserName);\n\n const parser = new Parser();\n parser.setLanguage(language);\n\n const tree = parser.parse(text);\n\n if (tree == null) {\n throw new Error(\"Failed to parse text\");\n }\n\n return tree.rootNode;\n}\n", "#!/usr/bin/env node\n\nimport { treeSitterFormatter } from \"../treeSitterFormatter.js\";\nimport { main } from \"./cli.js\";\nimport { parseText } from \"./parseText.js\";\n\nconst fileEnding = \"scm\";\n\nvoid main({\n binName: \"tree-sitter-fmt\",\n fileEndings: [fileEnding],\n\n getStdinFileEnding() {\n return fileEnding;\n },\n\n format: async (text, options, _filePath, debug) => {\n const node = await parseText(text, \"tree-sitter-query\");\n return treeSitterFormatter(node, options, debug);\n },\n});\n"], + "mappings": "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", + "names": ["IGNORE_FOLDERS", "GLOB_IGNORE_PATTERNS", "pattern", "createDebugLogger", "debug", "message", "getEndOfLine", "eof", "getIndentation", "indentTabs", "indentSize", "shortMessage", "SyntaxError", "point", "location", "getLocation", "getMessage", "file", "isSyntaxError", "error", "SyntaxTreeError", "SyntaxError", "rootNode", "findFirstProblemNode", "node", "child", "errorNode", "treeSitterFormatter", "node", "options", "debug", "SyntaxTreeError", "indentation", "getIndentation", "eol", "getEndOfLine", "TreeSitterFormatter", "insertFinalNewline", "createDebugLogger", "nodeText", "numIndents", "nl", "text", "index", "n", "first", "last", "interior", "parts", "s", "nodes", "lastIsQuantifier", "length", "fs", "path", "process", "getStdin", "getErrorMessage", "error", "process", "ANSI_RESET", "ANSI_YELLOW", "ANSI_RED", "WARN_PREFIX", "ERROR_PREFIX", "createLogger", "quiet", "createLoggerFromStreams", "stdout", "stderr", "colorize", "shouldUseColor", "message", "color", "_color", "log", "warn", "shouldUseColor", "stream", "FilePatternError", "messages", "editorconfig", "getOptionsFromConfig", "filePath", "config", "options", "isMissingFileError", "error", "path", "normalizeToPosix", "filepath", "KNOWN_ARGUMENTS", "isKnownArgument", "value", "getDefaultArguments", "parseArgs", "argv", "result", "getDefaultArguments", "i", "arg", "isKnownArgument", "parseKnownArgument", "path", "fastGlob", "fs", "lstatSafe", "filePath", "error", "isMissingFileError", "parseFilePatterns", "cli", "filePatterns", "seen", "globFileEndingPattern", "getGlobFileEndingsPattern", "errorMessages", "globOptions", "GLOB_IGNORE_PATTERNS", "pattern", "absolutePath", "stat", "lstatSafe", "files", "fastGlob", "file", "glob", "normalizeToPosix", "filteredFiles", "hasSupportedFileEnding", "FilePatternError", "a", "b", "fileEndings", "extension", "printHelp", "cli", "option", "KNOWN_ARGUMENTS", "package_default", "printVersion", "package_default", "setExitCode", "code", "main", "cli", "logger", "createLogger", "args", "parseArgs", "exitCode", "mainUnsafe", "setExitCode", "error", "FilePatternError", "message", "getErrorMessage", "printHelp", "printVersion", "mainFormatFiles", "mainFormatStdin", "check", "debug", "filePatterns", "filePaths", "parseFilePatterns", "changedFileCount", "hasError", "formatFiles", "filePath", "formatFile", "isSyntaxError", "getDisplayPath", "options", "getOptionsFromConfig", "content", "formatted", "isMissingFileError", "normalizeToPosix", "stdin", "input", "getStdin", "fauxFileName", "fauxFilePath", "fs", "path", "fileURLToPath", "Language", "Parser", "initPromise", "languageCache", "moduleDir", "initTreeSitter", "loadLanguage", "parserName", "promise", "wasmFilePath", "getWasmFilePath", "fileName", "candidate", "parseText", "text", "language", "parser", "tree", "fileEnding", "main", "text", "options", "_filePath", "debug", "node", "parseText", "treeSitterFormatter"] } diff --git a/dist/types.d.ts b/dist/types.d.ts index b496ee8..caf6e50 100644 --- a/dist/types.d.ts +++ b/dist/types.d.ts @@ -1,6 +1,7 @@ import type { KnownProps } from "editorconfig"; export declare const KNOWN_ARGUMENTS: readonly ["--help", "--version", "--quiet", "--check", "--debug"]; export type KnownArgument = (typeof KNOWN_ARGUMENTS)[number]; +export declare function isKnownArgument(value: string): value is KnownArgument; export interface CLI { binName: "snippet-fmt" | "talon-fmt" | "tree-sitter-fmt"; fileEndings: readonly string[]; diff --git a/dist/util/SyntaxError.d.ts b/dist/util/SyntaxError.d.ts index 04016d4..31e1dbb 100644 --- a/dist/util/SyntaxError.d.ts +++ b/dist/util/SyntaxError.d.ts @@ -1,6 +1,6 @@ import type { Point } from "../types.js"; export declare class SyntaxError extends Error { - private point?; + private readonly point?; private readonly location; constructor(point?: Point | undefined); getFileMessage(file: string): string; diff --git a/package-lock.json b/package-lock.json index 2ee4a3f..5b9e1f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@cursorless/talon-tools", - "version": "0.10.2", + "version": "0.11.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@cursorless/talon-tools", - "version": "0.10.2", + "version": "0.11.0", "license": "MIT", "dependencies": { - "@cursorless/tree-sitter-wasms": "^0.8.1", + "@cursorless/tree-sitter-wasms": "^0.9.0", "editorconfig": "^3.0.2", "fast-glob": "^3.3.3", "get-stdin": "^10.0.0", @@ -25,20 +25,20 @@ "@types/node": "^24.12.2", "esbuild": "^0.28.0", "mocha": "^11.7.5", - "oxfmt": "^0.44.0", - "oxlint": "^1.59.0", - "oxlint-tsgolint": "^0.20.0", + "oxfmt": "^0.47.0", + "oxlint": "^1.62.0", + "oxlint-tsgolint": "^0.22.1", "tsx": "^4.21.0", - "typescript": "^6.0.2" + "typescript": "^6.0.3" }, "funding": { "url": "https://github.com/sponsors/cursorless-dev" } }, "node_modules/@cursorless/tree-sitter-wasms": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cursorless/tree-sitter-wasms/-/tree-sitter-wasms-0.8.1.tgz", - "integrity": "sha512-xCOwc5+4ILAkjrwCIyWHeF9dxAO8Ju6ElCff2HhgjWTBokzt5rO7Ok3mnvPuDDR53wYEYqDPbtQWrLJcsWckDQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@cursorless/tree-sitter-wasms/-/tree-sitter-wasms-0.9.0.tgz", + "integrity": "sha512-272qb3uKEOwLClLDxfo/Zv0DZmuI2mkWyGHC3aRZ9pcgr29ddokTEyNsOxx0jy0ouwyfKH7Mcn+kkyQWiVTWUw==", "license": "Unlicense" }, "node_modules/@esbuild/aix-ppc64": { @@ -628,9 +628,9 @@ "license": "MIT" }, "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.44.0.tgz", - "integrity": "sha512-5UvghMd9SA/yvKTWCAxMAPXS1d2i054UeOf4iFjZjfayTwCINcC3oaSXjtbZfCaEpxgJod7XiOjTtby5yEv/BQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.47.0.tgz", + "integrity": "sha512-KrMQRdMi/upr81qT4ijK6X6BNp6jqpMY7FwILQnwIy9QLc3qpnhUx5rsCLGzn4ewsCQ0CNAspN2ogmP1GXLyLw==", "cpu": [ "arm" ], @@ -645,9 +645,9 @@ } }, "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.44.0.tgz", - "integrity": "sha512-IVudM1BWfvrYO++Khtzr8q9n5Rxu7msUvoFMqzGJVdX7HfUXUDHwaH2zHZNB58svx2J56pmCUzophyaPFkcG/A==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.47.0.tgz", + "integrity": "sha512-r4ixS/PeUpAFKgrpDoZ5pSkthjZzVzKd95525Aazj+aOv9H4ulK5zYHGb7wFY5n5kZxHK8TbOJUZgoEb1ohddQ==", "cpu": [ "arm64" ], @@ -662,9 +662,9 @@ } }, "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.44.0.tgz", - "integrity": "sha512-eWCLAIKAHfx88EqEP1Ga2yz7qVcqDU5lemn4xck+07bH182hDdprOHjbogyk0In1Djys3T0/pO2JepFnRJ41Mg==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.47.0.tgz", + "integrity": "sha512-CLWxiKpMl+195cm09CuaWEhJK0CirRkoMa07aR9+9AFPat2LfIKtwx1JqxZM0MTvcMe6+adlJNdVL6jdInvq3g==", "cpu": [ "arm64" ], @@ -679,9 +679,9 @@ } }, "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.44.0.tgz", - "integrity": "sha512-eHTBznHLM49++dwz07MblQ2cOXyIgeedmE3Wgy4ptUESj38/qYZyRi1MPwC9olQJWssMeY6WI3UZ7YmU5ggvyQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.47.0.tgz", + "integrity": "sha512-Xq5fjTYDC50faUeLSm0rZdBqoTgleXEdD7NpJdARtQIczkCJn3xNjMUSQQkUmh4CtxkKTNL68lytcOK3e/osgg==", "cpu": [ "x64" ], @@ -696,9 +696,9 @@ } }, "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.44.0.tgz", - "integrity": "sha512-jLMmbj0u0Ft43QpkUVr/0v1ZfQCGWAvU+WznEHcN3wZC/q6ox7XeSJtk9P36CCpiDSUf3sGnzbIuG1KdEMEDJQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.47.0.tgz", + "integrity": "sha512-QOU9ZIJ52p5askcEC0QJvvr8trHAWoonul8bgISo6gYUL3s50zkqafBYcNAr9LJZQbsZtPfIWHk9+5+nUp1qJQ==", "cpu": [ "x64" ], @@ -713,9 +713,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.44.0.tgz", - "integrity": "sha512-n+A/u/ByK1qV8FVGOwyaSpw5NPNl0qlZfgTBqHeGIqr8Qzq1tyWZ4lAaxPoe5mZqE3w88vn3+jZtMxriHPE7tg==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.47.0.tgz", + "integrity": "sha512-oJxDM1aBhPvz9gmElBv8UpxyiqhwfjcbrSxT5F0xtuUzY6dQI27/AQPIt3eu3Z5Yvn0kQl5R7MA3Z+MbnRvCBw==", "cpu": [ "arm" ], @@ -730,9 +730,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.44.0.tgz", - "integrity": "sha512-5eax+FkxyCqAi3Rw0mrZFr7+KTt/XweFsbALR+B5ljWBLBl8nHe4ADrUnb1gLEfQCJLl+Ca5FIVD4xEt95AwIw==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.47.0.tgz", + "integrity": "sha512-g8Lh50VS4ibGz2q6v7r9UZY4D0dM16SdrFYOMzhqIoCwGcai8VMIRUAcqn1/jlCsOOzUXJ741+kCeJt0cofakQ==", "cpu": [ "arm" ], @@ -747,9 +747,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.44.0.tgz", - "integrity": "sha512-58l8JaHxSGOmOMOG2CIrNsnkRJAj0YcHQCmvNACniOa/vd1iRHhlPajczegzS5jwMENlqgreyiTR9iNlke8qCw==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.47.0.tgz", + "integrity": "sha512-YrNT1vQ0asaXoRbrvYENPqmBfOQ9Xr8enPNOULeYfg44VjCcrUowFy5QZr+WawE0zyP8cH9e9Gxxg0fDEFzhcg==", "cpu": [ "arm64" ], @@ -767,9 +767,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.44.0.tgz", - "integrity": "sha512-AlObQIXyVRZ96LbtVljtFq0JqH5B92NU+BQeDFrXWBUWlCKAM0wF5GLfIhCLT5kQ3Sl+U0YjRJ7Alqj5hGQaCg==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.47.0.tgz", + "integrity": "sha512-IxtQC/sbBi4ubbY+MdwdanRWrG9InQJVZqyMsBa5IUaQcnSg86gQme574HxXMC1p4bo4YhV99zQ+wNnGCvEgzw==", "cpu": [ "arm64" ], @@ -787,9 +787,9 @@ } }, "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.44.0.tgz", - "integrity": "sha512-YcFE8/q/BbrCiIiM5piwbkA6GwJc5QqhMQp2yDrqQ2fuVkZ7CInb1aIijZ/k8EXc72qXMSwKpVlBv1w/MsGO/A==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.47.0.tgz", + "integrity": "sha512-EWXEhOMbWO0q6eJSbu0QLkU8cKi0ljlYLngeDs2Ocu/pm1rrLwyQiYzlFbdnMRURI4w9ndr1sI9rSbhlJ5o23Q==", "cpu": [ "ppc64" ], @@ -807,9 +807,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.44.0.tgz", - "integrity": "sha512-eOdzs6RqkRzuqNHUX5C8ISN5xfGh4xDww8OEd9YAmc3OWN8oAe5bmlIqQ+rrHLpv58/0BuU48bxkhnIGjA/ATQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.47.0.tgz", + "integrity": "sha512-tZrjS11TUiDuEpRaqdk8K9F9xETRyKXfuZKmdeW+Gj7coBnm7+8sBEfyt033EAFEQSlkniAXvBLh+Qja2ioGBQ==", "cpu": [ "riscv64" ], @@ -827,9 +827,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.44.0.tgz", - "integrity": "sha512-YBgNTxntD/QvlFUfgvh8bEdwOhXiquX8gaofZJAwYa/Xp1S1DQrFVZEeck7GFktr24DztsSp8N8WtWCBwxs0Hw==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.47.0.tgz", + "integrity": "sha512-KBFy+2CFKUCZzYwX2ZOPQKck1vjQbz+hextuc19G4r0WRJwadfAeuQMQRQvB+Ivc8brlbOVg7et8K7E467440g==", "cpu": [ "riscv64" ], @@ -847,9 +847,9 @@ } }, "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.44.0.tgz", - "integrity": "sha512-GLIh1R6WHWshl/i4QQDNgj0WtT25aRO4HNUWEoitxiywyRdhTFmFEYT2rXlcl9U6/26vhmOqG5cRlMLG3ocaIA==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.47.0.tgz", + "integrity": "sha512-REUPFKVGSiK99B+9eaPhluEVglzaoj/SMykNC5SUiV2RSsBfV5lWN7Y0iCIc251Wz3GaeAGZsJ/zj3gjarxdFg==", "cpu": [ "s390x" ], @@ -867,9 +867,9 @@ } }, "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.44.0.tgz", - "integrity": "sha512-gZOpgTlOsLcLfAF9qgpTr7FIIFSKnQN3hDf/0JvQ4CIwMY7h+eilNjxq/CorqvYcEOu+LRt1W4ZS7KccEHLOdA==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.47.0.tgz", + "integrity": "sha512-KVftVSVEDeIfRW3TIeLe3aNI/iY4m1fu5mDwHcisKMZSCMKLkrhFsjowC7o9RoqNPxbbglm2+/6KAKBIts2t0Q==", "cpu": [ "x64" ], @@ -887,9 +887,9 @@ } }, "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.44.0.tgz", - "integrity": "sha512-1CyS9JTB+pCUFYFI6pkQGGZaT/AY5gnhHVrQQLhFba6idP9AzVYm1xbdWfywoldTYvjxQJV6x4SuduCIfP3W+A==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.47.0.tgz", + "integrity": "sha512-DTsmGEaA2860Aq5VUyDO8/MT9NFxwVL93RnRYmpMwK6DsSkThmvEpqoUDDljziEpAedMRG19SCogrNbINSbLUQ==", "cpu": [ "x64" ], @@ -907,9 +907,9 @@ } }, "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.44.0.tgz", - "integrity": "sha512-bmEv70Ak6jLr1xotCbF5TxIKjsmQaiX+jFRtnGtfA03tJPf6VG3cKh96S21boAt3JZc+Vjx8PYcDuLj39vM2Pw==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.47.0.tgz", + "integrity": "sha512-8r5BDro7fLOBoq1JXHLVSs55OlrxQhEso4HVo0TcY7OXJUPYfjPoOaYL5us+yIwqyP9rQwN+rxuiNFSmaxSuOQ==", "cpu": [ "arm64" ], @@ -924,9 +924,9 @@ } }, "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.44.0.tgz", - "integrity": "sha512-yWzB+oCpSnP/dmw85eFLAT5o35Ve5pkGS2uF/UCISpIwDqf1xa7OpmtomiqY/Vzg8VyvMbuf6vroF2khF/+1Vg==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.47.0.tgz", + "integrity": "sha512-qtz/gzm8IjSPUlseZ0ofW8zyHLoZsuP5HTfcGGkWkUblB89JT8GNYH3ICqjbDsqsGqXum0/ZndXTFplSdXFIcg==", "cpu": [ "arm64" ], @@ -941,9 +941,9 @@ } }, "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.44.0.tgz", - "integrity": "sha512-TcWpo18xEIE3AmIG2kpr3kz5IEhQgnx0lazl2+8L+3eTopOAUevQcmlr4nhguImNWz0OMeOZrYZOhJNCf16nlQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.47.0.tgz", + "integrity": "sha512-5vIcdcIDE7nCx+MXN6sm8kbC4zajDB31E86rez4i45iHNH/2NjdKlJ720xcHTr3eeiMcttCGPHPhE1TjtBDGZw==", "cpu": [ "ia32" ], @@ -958,9 +958,9 @@ } }, "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.44.0.tgz", - "integrity": "sha512-oj8aLkPJZppIM4CMQNsyir9ybM1Xw/CfGPTSsTnzpVGyljgfbdP0EVUlURiGM0BDrmw5psQ6ArmGCcUY/yABaQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.47.0.tgz", + "integrity": "sha512-Sr59Y5ms54ONBjxFeWhVlGyQcHXxcl9DxC23f6yXlRkcos7LXBLoO+KDfxexjHIOZh7cWqrWduzvUjJ+pHp8cQ==", "cpu": [ "x64" ], @@ -975,9 +975,9 @@ } }, "node_modules/@oxlint-tsgolint/darwin-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.20.0.tgz", - "integrity": "sha512-KKQcIHZHMxqpHUA1VXIbOG6chNCFkUWbQy6M+AFVtPKkA/3xAeJkJ3njoV66bfzwPHRcWQO+kcj5XqtbkjakoA==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.22.1.tgz", + "integrity": "sha512-4150Lpgc1YM09GcjA6GSrra1JoPjC7aOpfywLjWEY4vW0Sd1qKzqHF1WRaiw0/qUZ40OATYdv3aRd7ipPkWQbw==", "cpu": [ "arm64" ], @@ -989,9 +989,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.20.0.tgz", - "integrity": "sha512-7HeVMuclGfG+NLZi2ybY0T4fMI7/XxO/208rJk+zEIloKkVnlh11Wd241JMGwgNFXn+MLJbOqOfojDb2Dt4L1g==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.22.1.tgz", + "integrity": "sha512-vFWcPWYOgZs4HWcgS1EjUZg33NLcNfEYU49KGImmCfZWkflENrmBYV4HN/C0YeAPum6ZZ/goPSvQrB/cOD+NfA==", "cpu": [ "x64" ], @@ -1003,9 +1003,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.20.0.tgz", - "integrity": "sha512-zxhUwz+WSxE6oWlZLK2z2ps9yC6ebmgoYmjAl0Oa48+GqkZ56NVgo+wb8DURNv6xrggzHStQxqQxe3mK51HZag==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.22.1.tgz", + "integrity": "sha512-6LiUpP0Zir3+29FvBm7Y28q/dBjSHqTZ5MhG1Ckw4fGhI4cAvbcwXaKvbjx1TP7rRmBNOoq/M5xdpHjTb+GAew==", "cpu": [ "arm64" ], @@ -1017,9 +1017,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.20.0.tgz", - "integrity": "sha512-/1l6FnahC9im8PK+Ekkx/V3yetO/PzZnJegE2FXcv/iXEhbeVxP/ouiTYcUQu9shT1FWJCSNti1VJHH+21Y1dg==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.22.1.tgz", + "integrity": "sha512-fuX1hEQfpHauUbXADsfqVhRzrUrGabzGXbj5wsp2vKhV5uk/Rze8Mba9GdjFGECzvXudMGqHqxB4r6jGRdhxVA==", "cpu": [ "x64" ], @@ -1031,9 +1031,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.20.0.tgz", - "integrity": "sha512-oPZ5Yz8sVdo7P/5q+i3IKeix31eFZ55JAPa1+RGPoe9PoaYVsdMvR6Jvib6YtrqoJnFPlg3fjEjlEPL8VBKYJA==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.22.1.tgz", + "integrity": "sha512-8SZidAj+jrbZf9ZjBEYW0tiNZ+KasqB2zgW26qdiPpQSF/DzURnPmXz651IeA9YsmbVdHGIooEHUmev6QJdquA==", "cpu": [ "arm64" ], @@ -1045,9 +1045,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.20.0.tgz", - "integrity": "sha512-4stx8RHj3SP9vQyRF/yZbz5igtPvYMEUR8CUoha4BVNZihi39DpCR8qkU7lpjB5Ga1DRMo2pHaA4bdTOMaY4mw==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.22.1.tgz", + "integrity": "sha512-QweSk9H5lFh5Y+WUf2Kq/OAN88V6+62ZwGhP38gqdRotI90luXSMkruFTj7Q2rYrzH4ZVNaSqx7NY8JpSfIzqg==", "cpu": [ "x64" ], @@ -1059,9 +1059,9 @@ ] }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.59.0.tgz", - "integrity": "sha512-etYDw/UaEv936AQUd/CRMBVd+e+XuuU6wC+VzOv1STvsTyZenLChepLWqLtnyTTp4YMlM22ypzogDDwqYxv5cg==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.62.0.tgz", + "integrity": "sha512-pKsthNECyvJh8lPTICz6VcwVy2jOqdhhsp1rlxCkhgZR47aKvXPmaRWQDv+zlXpRae4qm1MaaTnutkaOk5aofg==", "cpu": [ "arm" ], @@ -1076,9 +1076,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.59.0.tgz", - "integrity": "sha512-TgLc7XVLKH2a4h8j3vn1MDjfK33i9MY60f/bKhRGWyVzbk5LCZ4X01VZG7iHrMmi5vYbAp8//Ponigx03CLsdw==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.62.0.tgz", + "integrity": "sha512-b1AUNViByvgmR2xJDubvLIr+dSuu3uraG7bsAoKo+xrpspPvu6RIn6Fhr2JUhobfep3jwUTy18Huco6GkwdvGQ==", "cpu": [ "arm64" ], @@ -1093,9 +1093,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.59.0.tgz", - "integrity": "sha512-DXyFPf5ZKldMLloRHx/B9fsxsiTQomaw7cmEW3YIJko2HgCh+GUhp9gGYwHrqlLJPsEe3dYj9JebjX92D3j3AA==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.62.0.tgz", + "integrity": "sha512-iG+Tvf70UJ6otfwFYIHk36Sjq9cpPP5YLxkoggANNRtzgi3Tj3g8q6Ybqi6AtkU3+yg9QwF7bDCkCS6bbL4PCg==", "cpu": [ "arm64" ], @@ -1110,9 +1110,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.59.0.tgz", - "integrity": "sha512-LgvrsdgVLX1qWqIEmNsSmMXJhpAWdtUQ0M+oR0CySwi+9IHWyOGuIL8w8+u/kbZNMyZr4WUyYB5i0+D+AKgkLg==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.62.0.tgz", + "integrity": "sha512-oOWI6YPPr5AJUx+yIDlxmuUbQjS5gZX3OH3QisawYvsZgLiQVvZtR0rPBcJTxLWqt2ClrWg0DlSrlUiG5SQNHg==", "cpu": [ "x64" ], @@ -1127,9 +1127,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.59.0.tgz", - "integrity": "sha512-bOJhqX/ny4hrFuTPlyk8foSRx/vLRpxJh0jOOKN2NWW6FScXHPAA5rQbrwdQPcgGB5V8Ua51RS03fke8ssBcug==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.62.0.tgz", + "integrity": "sha512-dLP33T7VLCmLVv4cvjkVX+rmkcwNk2UfxmsZPNur/7BQHoQR60zJ7XLiRvNUawlzn0u8ngCa3itjEG73MAMa/w==", "cpu": [ "x64" ], @@ -1144,9 +1144,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.59.0.tgz", - "integrity": "sha512-vVUXxYMF9trXCsz4m9H6U0IjehosVHxBzVgJUxly1uz4W1PdDyicaBnpC0KRXsHYretLVe+uS9pJy8iM57Kujw==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.62.0.tgz", + "integrity": "sha512-fl//LWNks6qo9chNY60UDYyIwtp7a5cEx4Y/rHPjaarhuwqx6jtbzEpD5V5AqmdL4a6Y5D8zeXg5HF2Cr0QmSQ==", "cpu": [ "arm" ], @@ -1161,9 +1161,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.59.0.tgz", - "integrity": "sha512-TULQW8YBPGRWg5yZpFPL54HLOnJ3/HiX6VenDPi6YfxB/jlItwSMFh3/hCeSNbh+DAMaE1Py0j5MOaivHkI/9Q==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.62.0.tgz", + "integrity": "sha512-i5vkAuxvueTODV3J2dL61/TXewDHhMFKvtD156cIsk7GsdfiAu7zW7kY0NJXhKeFHeiMZIh7eFNjkPYH6J47HQ==", "cpu": [ "arm" ], @@ -1178,9 +1178,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.59.0.tgz", - "integrity": "sha512-Gt54Y4eqSgYJ90xipm24xeyaPV854706o/kiT8oZvUt3VDY7qqxdqyGqchMaujd87ib+/MXvnl9WkK8Cc1BExg==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.62.0.tgz", + "integrity": "sha512-QwN19LLuIGuOjEflSeJkZmOTfBdBMlTmW8xbMf8TZhjd//cxVNYQPq75q7oKZBJc6hRx3gY7sX0Egc8cEIFZYg==", "cpu": [ "arm64" ], @@ -1198,9 +1198,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.59.0.tgz", - "integrity": "sha512-3CtsKp7NFB3OfqQzbuAecrY7GIZeiv7AD+xutU4tefVQzlfmTI7/ygWLrvkzsDEjTlMq41rYHxgsn6Yh8tybmA==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.62.0.tgz", + "integrity": "sha512-8eCy3FCDuWUM5hWujAv6heMvfZPbcCOU3SdQUAkixZLu5bSzOkNfirJiLGoQFO943xceOKkiQRMQNzH++jM3WA==", "cpu": [ "arm64" ], @@ -1218,9 +1218,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.59.0.tgz", - "integrity": "sha512-K0diOpT3ncDmOfl9I1HuvpEsAuTxkts0VYwIv/w6Xiy9CdwyPBVX88Ga9l8VlGgMrwBMnSY4xIvVlVY/fkQk7Q==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.62.0.tgz", + "integrity": "sha512-NjQ7K7tpTPDe9J+yq8p/s/J0E7lRCkK2uDBDqvT4XIT6f4Z0tlnr59OBg/WcrmVHER1AbrcfyxhGTXgcG8ytWg==", "cpu": [ "ppc64" ], @@ -1238,9 +1238,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.59.0.tgz", - "integrity": "sha512-xAU7+QDU6kTJJ7mJLOGgo7oOjtAtkKyFZ0Yjdb5cEo3DiCCPFLvyr08rWiQh6evZ7RiUTf+o65NY/bqttzJiQQ==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.62.0.tgz", + "integrity": "sha512-oKZed9gmSwze29dEt3/Wnsv6l/Ygw/FUst+8Kfpv2SGeS/glEoTGZAMQw37SVyzFV76UTHJN2snGgxK2t2+8ow==", "cpu": [ "riscv64" ], @@ -1258,9 +1258,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.59.0.tgz", - "integrity": "sha512-KUmZmKlTTyauOnvUNVxK7G40sSSx0+w5l1UhaGsC6KPpOYHenx2oqJTnabmpLJicok7IC+3Y6fXAUOMyexaeJQ==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.62.0.tgz", + "integrity": "sha512-gBjBxQ+9lGpAYq+ELqw0w8QXsBnkZclFc7GRX2r0LnEVn3ZTEqeIKpKcGjucmp76Q53bvJD0i4qBWBhcfhSfGA==", "cpu": [ "riscv64" ], @@ -1278,9 +1278,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.59.0.tgz", - "integrity": "sha512-4usRxC8gS0PGdkHnRmwJt/4zrQNZyk6vL0trCxwZSsAKM+OxhB8nKiR+mhjdBbl8lbMh2gc3bZpNN/ik8c4c2A==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.62.0.tgz", + "integrity": "sha512-Ew2Kxs9EQ9/mbAIJ2hvocMC0wsOu6YKzStI2eFBDt+Td5O8seVC/oxgRIHqCcl5sf5ratA1nozQBAuv7tphkHg==", "cpu": [ "s390x" ], @@ -1298,9 +1298,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.59.0.tgz", - "integrity": "sha512-s/rNE2gDmbwAOOP493xk2X7M8LZfI1LJFSSW1+yanz3vuQCFPiHkx4GY+O1HuLUDtkzGlhtMrIcxxzyYLv308w==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.62.0.tgz", + "integrity": "sha512-5z25jcAA0gfKyVwz71A0VXgaPlocPoTAxhlv/hgoK6tlCrfoNuw7haWbDHvGMfjXhdic4EqVXGRv5XsTqFnbRQ==", "cpu": [ "x64" ], @@ -1318,9 +1318,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.59.0.tgz", - "integrity": "sha512-+yYj1udJa2UvvIUmEm0IcKgc0UlPMgz0nsSTvkPL2y6n0uU5LgIHSwVu4AHhrve6j9BpVSoRksnz8c9QcvITJA==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.62.0.tgz", + "integrity": "sha512-IWpHmMB6ZDllPvqWDkG6AmXrN7JF5e/c4g/0PuURsmlK+vHoYZPB70rr4u1bn3I4LsKCSpqqfveyx6UCOC8wdg==", "cpu": [ "x64" ], @@ -1338,9 +1338,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.59.0.tgz", - "integrity": "sha512-bUplUb48LYsB3hHlQXP2ZMOenpieWoOyppLAnnAhuPag3MGPnt+7caxE3w/Vl9wpQsTA3gzLntQi9rxWrs7Xqg==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.62.0.tgz", + "integrity": "sha512-fjlSxxrD5pA594vkyikCS9MnPRjQawW6/BLgyTYkO+73wwPlYjkcZ7LSd974l0Q2zkHQmu4DPvJFLYA7o8xrxQ==", "cpu": [ "arm64" ], @@ -1355,9 +1355,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.59.0.tgz", - "integrity": "sha512-/HLsLuz42rWl7h7ePdmMTpHm2HIDmPtcEMYgm5BBEHiEiuNOrzMaUpd2z7UnNni5LGN9obJy2YoAYBLXQwazrA==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.62.0.tgz", + "integrity": "sha512-EiFXr8loNS0Ul3Gu80+9nr1T8jRmnKocqmHHg16tj5ZqTgUXyb97l2rrspVHdDluyFn9JfR4PoJFdNzw4paHww==", "cpu": [ "arm64" ], @@ -1372,9 +1372,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.59.0.tgz", - "integrity": "sha512-rUPy+JnanpPwV/aJCPnxAD1fW50+XPI0VkWr7f0vEbqcdsS8NpB24Rw6RsS7SdpFv8Dw+8ugCwao5nCFbqOUSg==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.62.0.tgz", + "integrity": "sha512-IgOFvL73li1bFgab+hThXYA0N2Xms2kV2MvZN95cebV+fmrZ9AVui1JSxfeeqRLo3CpPxKZlzhyq4G0cnaAvIw==", "cpu": [ "ia32" ], @@ -1389,9 +1389,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.59.0.tgz", - "integrity": "sha512-xkE7puteDS/vUyRngLXW0t8WgdWoS/tfxXjhP/P7SMqPDx+hs44SpssO3h3qmTqECYEuXBUPzcAw5257Ka+ofA==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.62.0.tgz", + "integrity": "sha512-6hMpyDWQ2zGA1OXFKBrdYMUveUCO8UJhkO6JdwZPd78xIdHZNhjx+pib+4fC2Cljuhjyl0QwA2F3df/bs4Bp6A==", "cpu": [ "x64" ], @@ -2171,9 +2171,9 @@ "license": "MIT" }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -2250,9 +2250,9 @@ "license": "MIT" }, "node_modules/oxfmt": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.44.0.tgz", - "integrity": "sha512-lnncqvHewyRvaqdrnntVIrZV2tEddz8lbvPsQzG/zlkfvgZkwy0HP1p/2u1aCDToeg1jb9zBpbJdfkV73Itw+w==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.47.0.tgz", + "integrity": "sha512-OFbkbzxKCpooQEnRmpTDnuwTX8KHXzZTQ4Df/hz85fpS67Pl+lxPEFvUtin56HIIS0B1k4X8oIzTXRZPufA2CA==", "dev": true, "license": "MIT", "dependencies": { @@ -2268,31 +2268,31 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxfmt/binding-android-arm-eabi": "0.44.0", - "@oxfmt/binding-android-arm64": "0.44.0", - "@oxfmt/binding-darwin-arm64": "0.44.0", - "@oxfmt/binding-darwin-x64": "0.44.0", - "@oxfmt/binding-freebsd-x64": "0.44.0", - "@oxfmt/binding-linux-arm-gnueabihf": "0.44.0", - "@oxfmt/binding-linux-arm-musleabihf": "0.44.0", - "@oxfmt/binding-linux-arm64-gnu": "0.44.0", - "@oxfmt/binding-linux-arm64-musl": "0.44.0", - "@oxfmt/binding-linux-ppc64-gnu": "0.44.0", - "@oxfmt/binding-linux-riscv64-gnu": "0.44.0", - "@oxfmt/binding-linux-riscv64-musl": "0.44.0", - "@oxfmt/binding-linux-s390x-gnu": "0.44.0", - "@oxfmt/binding-linux-x64-gnu": "0.44.0", - "@oxfmt/binding-linux-x64-musl": "0.44.0", - "@oxfmt/binding-openharmony-arm64": "0.44.0", - "@oxfmt/binding-win32-arm64-msvc": "0.44.0", - "@oxfmt/binding-win32-ia32-msvc": "0.44.0", - "@oxfmt/binding-win32-x64-msvc": "0.44.0" + "@oxfmt/binding-android-arm-eabi": "0.47.0", + "@oxfmt/binding-android-arm64": "0.47.0", + "@oxfmt/binding-darwin-arm64": "0.47.0", + "@oxfmt/binding-darwin-x64": "0.47.0", + "@oxfmt/binding-freebsd-x64": "0.47.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.47.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.47.0", + "@oxfmt/binding-linux-arm64-gnu": "0.47.0", + "@oxfmt/binding-linux-arm64-musl": "0.47.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.47.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.47.0", + "@oxfmt/binding-linux-riscv64-musl": "0.47.0", + "@oxfmt/binding-linux-s390x-gnu": "0.47.0", + "@oxfmt/binding-linux-x64-gnu": "0.47.0", + "@oxfmt/binding-linux-x64-musl": "0.47.0", + "@oxfmt/binding-openharmony-arm64": "0.47.0", + "@oxfmt/binding-win32-arm64-msvc": "0.47.0", + "@oxfmt/binding-win32-ia32-msvc": "0.47.0", + "@oxfmt/binding-win32-x64-msvc": "0.47.0" } }, "node_modules/oxlint": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.59.0.tgz", - "integrity": "sha512-0xBLeGGjP4vD9pygRo8iuOkOzEU1MqOnfiOl7KYezL/QvWL8NUg6n03zXc7ZVqltiOpUxBk2zgHI3PnRIEdAvw==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.62.0.tgz", + "integrity": "sha512-1uFkg6HakjsGIpW9wNdeW4/2LOHW9MEkoWjZUTUfQtIHyLIZPYt00w3Sg+H3lH+206FgBPHBbW5dVE5l2ExECQ==", "dev": true, "license": "MIT", "bin": { @@ -2305,25 +2305,25 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.59.0", - "@oxlint/binding-android-arm64": "1.59.0", - "@oxlint/binding-darwin-arm64": "1.59.0", - "@oxlint/binding-darwin-x64": "1.59.0", - "@oxlint/binding-freebsd-x64": "1.59.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.59.0", - "@oxlint/binding-linux-arm-musleabihf": "1.59.0", - "@oxlint/binding-linux-arm64-gnu": "1.59.0", - "@oxlint/binding-linux-arm64-musl": "1.59.0", - "@oxlint/binding-linux-ppc64-gnu": "1.59.0", - "@oxlint/binding-linux-riscv64-gnu": "1.59.0", - "@oxlint/binding-linux-riscv64-musl": "1.59.0", - "@oxlint/binding-linux-s390x-gnu": "1.59.0", - "@oxlint/binding-linux-x64-gnu": "1.59.0", - "@oxlint/binding-linux-x64-musl": "1.59.0", - "@oxlint/binding-openharmony-arm64": "1.59.0", - "@oxlint/binding-win32-arm64-msvc": "1.59.0", - "@oxlint/binding-win32-ia32-msvc": "1.59.0", - "@oxlint/binding-win32-x64-msvc": "1.59.0" + "@oxlint/binding-android-arm-eabi": "1.62.0", + "@oxlint/binding-android-arm64": "1.62.0", + "@oxlint/binding-darwin-arm64": "1.62.0", + "@oxlint/binding-darwin-x64": "1.62.0", + "@oxlint/binding-freebsd-x64": "1.62.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.62.0", + "@oxlint/binding-linux-arm-musleabihf": "1.62.0", + "@oxlint/binding-linux-arm64-gnu": "1.62.0", + "@oxlint/binding-linux-arm64-musl": "1.62.0", + "@oxlint/binding-linux-ppc64-gnu": "1.62.0", + "@oxlint/binding-linux-riscv64-gnu": "1.62.0", + "@oxlint/binding-linux-riscv64-musl": "1.62.0", + "@oxlint/binding-linux-s390x-gnu": "1.62.0", + "@oxlint/binding-linux-x64-gnu": "1.62.0", + "@oxlint/binding-linux-x64-musl": "1.62.0", + "@oxlint/binding-openharmony-arm64": "1.62.0", + "@oxlint/binding-win32-arm64-msvc": "1.62.0", + "@oxlint/binding-win32-ia32-msvc": "1.62.0", + "@oxlint/binding-win32-x64-msvc": "1.62.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" @@ -2335,21 +2335,21 @@ } }, "node_modules/oxlint-tsgolint": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.20.0.tgz", - "integrity": "sha512-/Uc9TQyN1l8w9QNvXtVHYtz+SzDJHKpb5X0UnHodl0BVzijUPk0LPlDOHAvogd1UI+iy9ZSF6gQxEqfzUxCULQ==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.22.1.tgz", + "integrity": "sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg==", "dev": true, "license": "MIT", "bin": { "tsgolint": "bin/tsgolint.js" }, "optionalDependencies": { - "@oxlint-tsgolint/darwin-arm64": "0.20.0", - "@oxlint-tsgolint/darwin-x64": "0.20.0", - "@oxlint-tsgolint/linux-arm64": "0.20.0", - "@oxlint-tsgolint/linux-x64": "0.20.0", - "@oxlint-tsgolint/win32-arm64": "0.20.0", - "@oxlint-tsgolint/win32-x64": "0.20.0" + "@oxlint-tsgolint/darwin-arm64": "0.22.1", + "@oxlint-tsgolint/darwin-x64": "0.22.1", + "@oxlint-tsgolint/linux-arm64": "0.22.1", + "@oxlint-tsgolint/linux-x64": "0.22.1", + "@oxlint-tsgolint/win32-arm64": "0.22.1", + "@oxlint-tsgolint/win32-x64": "0.22.1" } }, "node_modules/p-limit": { @@ -3208,9 +3208,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index b0ca229..69839fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cursorless/talon-tools", - "version": "0.10.2", + "version": "0.11.0", "description": "Linting and formatting tools for Talon and Cursorless", "author": "Cursorless Dev", "license": "MIT", @@ -48,7 +48,7 @@ "test:subset": "tsx src/test/runAllTests.ts --subset" }, "dependencies": { - "@cursorless/tree-sitter-wasms": "^0.8.1", + "@cursorless/tree-sitter-wasms": "^0.9.0", "editorconfig": "^3.0.2", "fast-glob": "^3.3.3", "get-stdin": "^10.0.0", @@ -59,10 +59,10 @@ "@types/node": "^24.12.2", "esbuild": "^0.28.0", "mocha": "^11.7.5", - "oxfmt": "^0.44.0", - "oxlint-tsgolint": "^0.20.0", - "oxlint": "^1.59.0", + "oxfmt": "^0.47.0", + "oxlint-tsgolint": "^0.22.1", + "oxlint": "^1.62.0", "tsx": "^4.21.0", - "typescript": "^6.0.2" + "typescript": "^6.0.3" } } diff --git a/src/node/FilePatternError.ts b/src/node/FilePatternError.ts index 038f304..27b8da6 100644 --- a/src/node/FilePatternError.ts +++ b/src/node/FilePatternError.ts @@ -1,7 +1,7 @@ export class FilePatternError extends Error { - name = "FilePatternError"; + public name = "FilePatternError"; - constructor(public messages: string[]) { + public constructor(public messages: string[]) { super( `One or more file pattern errors occurred:\n${messages.join("\n")}`, ); diff --git a/src/snippet/serializeSnippetFile.ts b/src/snippet/serializeSnippetFile.ts index 99e4f9c..e5d8b91 100644 --- a/src/snippet/serializeSnippetFile.ts +++ b/src/snippet/serializeSnippetFile.ts @@ -23,12 +23,12 @@ export function serializeSnippetFile( } class SnippetSerializer { - constructor( + public constructor( private readonly eol: string, private readonly insertFinalNewline: boolean, ) {} - getText(snippetFile: SnippetFile): string { + public getText(snippetFile: SnippetFile): string { const docDelimiter = "---"; const documents: string[] = []; diff --git a/src/talon/talonFormatter.ts b/src/talon/talonFormatter.ts index ddf2773..8814e68 100644 --- a/src/talon/talonFormatter.ts +++ b/src/talon/talonFormatter.ts @@ -49,7 +49,7 @@ class TalonFormatter { private lastRow = 0; private readonly logger: DebugLogger; - constructor( + public constructor( private readonly indent: string, private readonly eol: string, private readonly maxLineLength: number, @@ -61,7 +61,7 @@ class TalonFormatter { this.logger = createDebugLogger(debug); } - getText(node: SyntaxNode): string { + public getText(node: SyntaxNode): string { this.addNode(node); const result = this.lines.join(this.eol).trimEnd(); @@ -211,16 +211,23 @@ class TalonFormatter { case "deck_binding": case "tag_import_declaration": case "match": + case "for_statement": + case "if_statement": return node.children.map((n) => this.getNodeText(n)).join(""); case "string": return formatString(node); case "match_modifier": + case "for": + case "if": case ":": case ",": return `${node.text} `; + case "in": + return ` ${node.text} `; + case "implicit_string": return node.text.trim(); @@ -282,7 +289,10 @@ class TalonFormatter { isLeftRightSingleLine(leftNode, rightNodes) ) { const rightNode = rightNodes[0]; - if (rightNode.children.length === 1) { + if ( + rightNode.children.length === 1 && + !forceMultilineBody(rightNode.children[0]) + ) { const right = this.getNodeText(rightNode.children[0]); const leftWithPadding = this.columnWidth != null @@ -307,6 +317,19 @@ class TalonFormatter { } } +// Returns true if the node should remain in the declaration block instead of +// being inlined after the command colon. +function forceMultilineBody(node: SyntaxNode): boolean { + switch (node.type) { + case "if_statement": + case "for_statement": + return true; + default: + return false; + } +} + +// Returns true if the left and right nodes are on the same line, allowing them to be formatted on a single line. function isLeftRightSingleLine( left: SyntaxNode, rights: SyntaxNode[], diff --git a/src/test/talonFixtures/For statement.txt b/src/test/talonFixtures/For statement.txt new file mode 100644 index 0000000..fa3618f --- /dev/null +++ b/src/test/talonFixtures/For statement.txt @@ -0,0 +1,5 @@ +command : + for a in "test" : print(a) +================ EXPECTED ================ +command: + for a in "test": print(a) diff --git a/src/test/talonFixtures/If statement.txt b/src/test/talonFixtures/If statement.txt new file mode 100644 index 0000000..66c255d --- /dev/null +++ b/src/test/talonFixtures/If statement.txt @@ -0,0 +1,5 @@ +command : + if true : print( "true" ) +================ EXPECTED ================ +command: + if true: print("true") diff --git a/src/test/talonFormatter.test.ts b/src/test/talonFormatter.test.ts index 3fba813..6e3e9a3 100644 --- a/src/test/talonFormatter.test.ts +++ b/src/test/talonFormatter.test.ts @@ -86,12 +86,8 @@ suite("Talon formatter", () => { }); test("Syntax tree error", async () => { - const content = [ - "^test []$:", - 'if ini: insert("{ini}")', - ].join("\n"); await assert.rejects( - () => talonFormatter(content), + () => talonFormatter("foo . bar: baz"), (error) => { assert.ok(error instanceof Error); assert.equal(error.name, "SyntaxTreeError"); diff --git a/src/treeSitterFormatter.ts b/src/treeSitterFormatter.ts index a574e39..38ea989 100644 --- a/src/treeSitterFormatter.ts +++ b/src/treeSitterFormatter.ts @@ -33,7 +33,7 @@ class TreeSitterFormatter { private lastRow = 0; private readonly logger: DebugLogger; - constructor( + public constructor( private readonly indentation: string, private readonly eol: string, private readonly insertFinalNewline: boolean, @@ -42,7 +42,7 @@ class TreeSitterFormatter { this.logger = createDebugLogger(debug); } - getText(node: SyntaxNode): string { + public getText(node: SyntaxNode): string { const nodeText = this.getNodeText(node, 0); if (nodeText.length === 0) { diff --git a/src/util/SyntaxError.ts b/src/util/SyntaxError.ts index 9c0e7b5..3be2d91 100644 --- a/src/util/SyntaxError.ts +++ b/src/util/SyntaxError.ts @@ -5,14 +5,14 @@ const shortMessage = "Syntax error"; export class SyntaxError extends Error { private readonly location: string | undefined; - constructor(private readonly point?: Point) { + public constructor(private readonly point?: Point) { const location = getLocation(point); super(getMessage(location)); this.name = "SyntaxError"; this.location = location; } - getFileMessage(file: string): string { + public getFileMessage(file: string): string { return this.location != null ? `${file}(${this.location}): ${shortMessage}` : `${file}: ${shortMessage}`; diff --git a/src/util/SyntaxTreeError.ts b/src/util/SyntaxTreeError.ts index 97bacff..ba3cc0d 100644 --- a/src/util/SyntaxTreeError.ts +++ b/src/util/SyntaxTreeError.ts @@ -2,7 +2,7 @@ import type { SyntaxNode } from "../types.js"; import { SyntaxError } from "./SyntaxError.js"; export class SyntaxTreeError extends SyntaxError { - constructor(rootNode: SyntaxNode) { + public constructor(rootNode: SyntaxNode) { super(findFirstProblemNode(rootNode)?.startPosition); this.name = "SyntaxTreeError"; }