oxlint-tui 1.5.0 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import e from"node:fs";import t from"
|
|
3
|
-
`).filter(e=>!e.includes(`experimental`)&&!e.includes(`Breaking changes`)&&e.trim()!==``).join(` `);
|
|
2
|
+
import e from"node:fs";import t from"readline";import{execSync as n,spawn as r}from"node:child_process";import{argv as i,exit as a,platform as o,stdin as s,stdout as c}from"node:process";import l from"node:zlib";import u from"node:path";import{fileURLToPath as d}from"node:url";const f={reset:`\x1B[0m`,dim:`\x1B[38;5;242m`,highlight:`\x1B[38;5;111m`,selectedBg:`\x1B[48;5;24m\x1B[38;5;255m\x1B[1m`,borderActive:`\x1B[38;5;111m`,borderInactive:`\x1B[38;5;237m`,error:`\x1B[38;5;203m`,warn:`\x1B[38;5;215m`,success:`\x1B[38;5;114m`,info:`\x1B[38;5;75m`};function p(e,t){if(!e)return[];let n=Math.ceil(e.length/t),r=Array(n);for(let i=0;i<n;i++)r[i]=e.substring(i*t,(i+1)*t);return r}function m(e,t,n,r,i,a,o,s,c,l){let u=l?f.borderActive:f.borderInactive,d=`${u}┌─ ${a.length>r-6?a.substring(0,r-7)+`…`:a} `.padEnd(r+u.length-1,`─`);e.push(`\x1b[${n};${t}H${d}┐${f.reset}`);for(let a=1;a<i-1;a++)e.push(`\x1b[${n+a};${t}H${u}│${` `.repeat(r-2)}│${f.reset}`);e.push(`\x1b[${n+i-1};${t}H${u}└${`─`.repeat(r-2)}┘${f.reset}`);let p=i-2;o.slice(c,c+p).forEach((i,a)=>{let o=c+a,u=typeof i!=`string`,d=u?i.hits?`${i.value} (${i.hits})`:i.value:i,p=d.length>r-4?d.substring(0,r-5)+`…`:d.padEnd(r-4),m=f.dim;if(u){let e=i;e.configStatus===`error`?m=f.error:e.configStatus===`warn`?m=f.warn:e.isActive&&(m=f.success),e.hits&&e.hits>0&&(m=f.highlight)}e.push(`\x1b[${n+1+a};${t+2}H`),o===s?e.push(l?`${f.selectedBg}${p}${f.reset}`:`${f.dim}\x1b[7m${p}${f.reset}`):e.push(`${m}${p}${f.reset}`)})}function h(e,t,n,r,i,a){let o=f.borderInactive,s=`${o}┌─ STATS `.padEnd(r+o.length-1,`─`);e.push(`\x1b[${n};${t}H${s}┐${f.reset}`);for(let a=1;a<i-1;a++)e.push(`\x1b[${n+a};${t}H${o}│${` `.repeat(r-2)}│${f.reset}`);e.push(`\x1b[${n+i-1};${t}H${o}└${`─`.repeat(r-2)}┘${f.reset}`);let c={error:0,warn:0,off:0};a.forEach(e=>{e.configStatus===`error`?c.error++:e.configStatus===`warn`?c.warn++:c.off++}),[{label:`Error`,count:c.error,color:f.error},{label:`Warn`,count:c.warn,color:f.warn},{label:`Off`,count:c.off,color:f.dim}].forEach((a,o)=>{if(o<i-2){let i=String(a.count).padStart(3),s=a.label.padEnd(r-8);e.push(`\x1b[${n+1+o};${t+2}H${a.color}${s}${i}${f.reset}`)}})}function g(e,t,n,r,i,a,o){let s=o?f.borderActive:f.borderInactive,c=`${s}┌─ DETAILS `.padEnd(r+s.length-1,`─`);e.push(`\x1b[${n};${t}H${c}┐${f.reset}`);for(let a=1;a<i-1;a++)e.push(`\x1b[${n+a};${t}H${s}│${` `.repeat(r-2)}│${f.reset}`);if(e.push(`\x1b[${n+i-1};${t}H${s}└${`─`.repeat(r-2)}┘${f.reset}`),!a)return;let l=a.configStatus.toUpperCase();l=a.configStatus===`error`?`${f.error}${l}${f.reset}`:a.configStatus===`warn`?`${f.warn}${l}${f.reset}`:`${f.dim}${l}${f.reset}`;let u=[[`Name`,a.value],[`Status`,l],[`Category`,a.category],[`Scope`,a.scope],[`Fix`,a.fix||`N/A`],[`Default`,a.default?`Yes`:`No`],[`Type-aware`,a.type_aware?`Yes`:`No`]],d=0;u.forEach(([r,a])=>{d<i-2&&(e.push(`\x1b[${n+1+d};${t+2}H${f.highlight}${r.padEnd(12)} ${f.reset}${a}`),d++)}),d<i-3&&d++,d<i-2&&(e.push(`\x1b[${n+1+d};${t+2}H${f.reset}Description:${f.reset}`),d++,p((a.description??`N/A`).replace(/\s+/g,` `).trim(),r-6).forEach(r=>{d<i-2&&(e.push(`\x1b[${n+1+d};${t+2}H${f.dim}${r}${f.reset}`),d++)}));let m=Math.max(d+1,i-3);m<i-1&&e.push(`\x1b[${n+1+m};${t+2}HHit ${f.highlight}ENTER${f.reset} to open docs`)}function _(e,t,n){return e<t?e:e>=t+n?e-n+1:t}function v(){if(!E||!E.categories)return;let{columns:e=80,rows:t=24}=c,n=E.categories[E.selectedCategoryIndex],r=E.rulesByCategory[n]||[],i=r[E.selectedRuleIndex],a=t-5,o=Math.floor(e*.2),s=Math.floor(e*.3),l=e-o-s-2,u=a-6,d=[`\x1B[H\x1B[J`];m(d,1,1,o,u,`CATEGORIES`,E.categories,E.selectedCategoryIndex,E.categoryScroll,E.activePane===0),h(d,1,1+u,o,6,r),m(d,o+1,1,s,a,`RULES (${r.length})`,r,E.selectedRuleIndex,E.ruleScroll,E.activePane===1),g(d,o+s+1,1,l,a,i,E.activePane===2);let p=f[E.messageType]||f.reset;d.push(`\x1b[${t-3};2H${p}● ${E.message}${f.reset}`);let _=E.configPath?`Config: ${E.configPath}`:`No config loaded`;d.push(`\x1b[${t-1};2H${f.dim}Arrows/HJKL: Nav | 1-3: Status | R: Active | A: All | X: Rule | Enter: Docs | Q: Quit | ${_}${f.reset}`),c.write(d.join(``))}const y=`1.42.0`,b={k:{type:`MOVE_UP`},up:{type:`MOVE_UP`},down:{type:`MOVE_DOWN`},j:{type:`MOVE_DOWN`},left:{type:`MOVE_LEFT`},h:{type:`MOVE_LEFT`},right:{type:`MOVE_RIGHT`},l:{type:`MOVE_RIGHT`},return:{type:`OPEN_DOCS`},enter:{type:`OPEN_DOCS`},1:{type:`SET_STATUS`,value:`off`},2:{type:`SET_STATUS`,value:`warn`},3:{type:`SET_STATUS`,value:`error`},q:{type:`EXIT`},r:{type:`RUN_LINT`},x:{type:`RUN_SINGLE_RULE`},a:{type:`RUN_ALL_RULES`}},x=u.dirname(d(import.meta.url));function S(){let t=u.join(x,`rule-descriptions.br`);if(e.existsSync(t))return JSON.parse(l.brotliDecompressSync(e.readFileSync(t)).toString())}function C(e){return e.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g,(e,t)=>t?``:e)}function w(e){e&&r(o===`darwin`?`open`:o===`win32`?`explorer`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const T=S();let E={activePane:0,selectedCategoryIndex:0,selectedRuleIndex:0,categoryScroll:0,ruleScroll:0,isLintInProgress:!1,message:`oxlint-tui`,messageType:`dim`,...j()};function D(e,t){E.config||={rules:{}},E.config.rules||(E.config.rules={});try{let n=e.value,r=e.scope===`oxc2`||e.scope===`eslint`?n:`${e.scope}/${n}`,i=E.config.rules,a=Object.keys(i).find(e=>e===r||e===n||e.endsWith(`/${n}`))||r;i[a]=t}catch{E.message=`Failed to update internal state`,E.messageType=`error`}}function O({rule:e=null,isRunAll:t=!1}={}){if(E.isLintInProgress)return;E.isLintInProgress=!0;let n=e?`${e.scope}/${e.value}`:null,i=e||t?!0:Object.values(E.rulesByCategory).flat().some(e=>e.isActive&&e.type_aware===!0);E.message=t?`Running all rules`:`Linting`,n&&(E.message+=` [${n}]`),i&&(E.message+=` with --type-aware`),E.message+=`...`,E.messageType=`info`,v();let a=o===`win32`?`npx.cmd`:`npx`,s=[`-q`,`--yes`,`--package`,`oxlint@${y}`];i&&s.push(`--package`,`oxlint-tsgolint@0.11.4`),s.push(`--`,`oxlint`),i&&s.push(`--type-aware`),s.push(`--format=json`),t?s.push(`-A`,`all`,`-W`,`all`):n?s.push(`-A`,`all`,`-D`,n):E.config&&E.config.rules&&Object.entries(E.config.rules).forEach(([e,t])=>{let n=Array.isArray(t)?t[0]:t;n===`error`?s.push(`-D`,e):n===`warn`?s.push(`-W`,e):n===`off`&&s.push(`-A`,e)});let c=r(a,s),l=``,u=``;c.stdout.on(`data`,e=>{l+=e}),c.stderr.on(`data`,e=>{u+=e}),c.on(`close`,e=>{E.isLintInProgress=!1;try{let e=JSON.parse(l||`{}`).diagnostics||[],t={};e.forEach(e=>{let n=e.code;t[n]=(t[n]||0)+1}),Object.keys(E.rulesByCategory).forEach(e=>{E.rulesByCategory[e].forEach(e=>{e.hits=0})}),Object.entries(t).forEach(([e,t])=>{let n;Object.values(E.rulesByCategory).some(t=>(n=t.find(t=>!!(e===t.value||e===`${t.scope}/${t.value}`||e===`${t.scope}(${t.value})`||e.endsWith(`(${t.value})`))),!!n)),n&&(n.hits=t)});let n=e.filter(e=>e.severity===`error`).length,r=e.filter(e=>e.severity===`warning`).length;e.length>0?(E.message=`Found ${r} warning${r===1?``:`s`} and ${n} error${n===1?``:`s`}`,E.messageType=n>0?`error`:`warn`):(E.message=`Linting passed! 0 issues found.`,E.messageType=`success`)}catch{let e=u.split(`
|
|
3
|
+
`).filter(e=>!e.includes(`experimental`)&&!e.includes(`Breaking changes`)&&e.trim()!==``).join(` `);E.message=e?`Error: ${e.substring(0,50)}...`:`Lint failed`,E.messageType=`error`}v()})}function k(e){if(!e)return;let{categories:t,rulesByCategory:n,selectedCategoryIndex:r,selectedRuleIndex:i,activePane:o}=E,s=t[r],l=n[s]||[],u=c.rows-8,d=u-3;switch(e.type){case`EXIT`:P(),a(0);return;case`RUN_LINT`:O();return;case`RUN_ALL_RULES`:O({isRunAll:!0});return;case`RUN_SINGLE_RULE`:{let e=l[i];e&&O({rule:e});return}case`OPEN_DOCS`:if(o===1){let e=l[i];e&&w(e.docs_url||e.url)}return;case`SET_STATUS`:{if(o!==1||!e.value)return;let t=l[i];if(!t)return;D(t,e.value);let r=[...l];r[i]={...t,configStatus:e.value,isActive:e.value===`error`||e.value===`warn`},E={...E,message:`Rule '${t.value}' set to: ${e.value}`,messageType:`info`,rulesByCategory:{...n,[s]:r}},v();return}case`MOVE_RIGHT`:o!==1&&(E={...E,activePane:o+1},v());return;case`MOVE_LEFT`:o!==0&&(E={...E,activePane:o-1},v());return;case`MOVE_UP`:if(o===0){let e=r===0?t.length-1:r-1;E={...E,selectedCategoryIndex:e,selectedRuleIndex:0,ruleScroll:0,categoryScroll:_(e,E.categoryScroll,d)}}else if(o===1){let e=i===0?l.length-1:i-1;E={...E,selectedRuleIndex:e,ruleScroll:_(e,E.ruleScroll,u)}}v();return;case`MOVE_DOWN`:if(o===0){let e=r===t.length-1?0:r+1;E={...E,selectedCategoryIndex:e,selectedRuleIndex:0,ruleScroll:0,categoryScroll:_(e,E.categoryScroll,d)}}else if(o===1){let e=i===l.length-1?0:i+1;E={...E,selectedRuleIndex:e,ruleScroll:_(e,E.ruleScroll,u)}}v();return}}function A(e,t,n){if(n.rules){let t=n.rules[e];if(t===void 0){let r=Object.keys(n.rules).find(t=>t.endsWith(`/${e}`));r&&(t=n.rules[r])}if(t!==void 0)return Array.isArray(t)?t[0]:t}return n.categories&&n.categories[t]?n.categories[t]:`off`}function j(){let t=[],r={rules:{},categories:{}},o=null,s=T;s||(E.message=`Error: Couldn't find description.`,E.messageType=`error`);try{let e=n(`npx -q --yes oxlint@${y} --rules --format=json`,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]});t=JSON.parse(e)}catch{E.message=`Error: Couldn't run 'npx oxlint'.`,E.messageType=`error`,a(1)}let c=i[2];if(c&&e.existsSync(c)?o=c:e.existsSync(`.oxlintrc.json`)&&(o=`.oxlintrc.json`),o)try{r=JSON.parse(C(e.readFileSync(o,`utf8`)))}catch{E.message=`Error: Couldn't parse config.`,E.messageType=`error`}let l={},u=[],d=[],f=[],p={};return t.forEach(e=>{let t=e.category;l[t]||(l[t]=[]);let n=A(e.value,t,r),i=s[e.scope]?.[e.value],a={...e,description:i,configStatus:n,isActive:n===`error`||n===`warn`};e.scope&&(p[e.scope]||(p[e.scope]=[]),p[e.scope].push(a)),l[t].push(a),e.fix&&e.fix!==`none`&&e.fix!==`pending`&&u.push(a),e.default===!0&&d.push(a),e.type_aware===!0&&f.push(a)}),l.FIXABLE=u,l.DEFAULT=d,l[`TYPE-AWARE`]=f,Object.entries(p).forEach(([e,t])=>{l[e]=t}),{categories:Object.keys(l).toSorted(),rulesByCategory:l,config:r,configPath:o}}const M=e=>c.write(e),N=()=>M(`\x1B[?1049h\x1B[?25l`),P=()=>M(`\x1B[?1049l\x1B[?25h`);t.emitKeypressEvents(s),s.isTTY&&s.setRawMode(!0),s.on(`keypress`,(e,t)=>{k(b[t.name]||(t.ctrl&&t.name===`c`?{type:`EXIT`}:b[t.sequence]||null))}),c.on(`resize`,v),N(),v();export{E as state};
|