@kitschpatrol/shared-config 8.6.0 → 8.8.0
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/bin/cli.js +13 -12
- package/dist/index.d.ts +4 -4
- package/package.json +22 -22
- package/readme.md +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{cosmiconfig as e}from"cosmiconfig";import{TypeScriptLoader as t}from"cosmiconfig-typescript-loader";import{execa as n}from"execa";import r from"fs-extra";import i,{constants as a}from"node:fs";import{availableParallelism as o}from"node:os";import s from"node:path";import{PassThrough as c,Transform as l}from"node:stream";import{packageUp as u,packageUpSync as d}from"package-up";import f from"yargs";import{hideBin as p}from"yargs/helpers";import m from"picocolors";import{stripVTControlCharacters as h}from"node:util";import g from"@pinojs/json-colorizer";import _ from"decircular";import ee from"deepmerge";import v from"json-stringify-pretty-compact";import{findWorkspaces as y,findWorkspacesRoot as te}from"find-workspaces";import b,{access as ne}from"node:fs/promises";import{getDefaultConfigLoader as x,resolveConfigFileImports as re}from"cspell-lib";import{fileURLToPath as S}from"node:url";import{createReaderWriter as ie}from"cspell-config-lib";import{loadFile as ae,writeFile as oe}from"magicast";import{getDefaultExportOptions as se}from"magicast/helpers";import{lint as ce}from"cspell";import"deepmerge-ts";import{loadConfig as le}from"mdat";import{globby as ue}from"globby";import C,{gt as
|
|
3
|
-
`);try{return await r.execute(a,t,n)}catch(e){return console.error(String(e)),1}}function
|
|
4
|
-
`);for(let e of t)l.write(`${e}\n`)}s=t.exitCode??1}catch(e){console.error(`${i.name} failed with error:`),console.error(e),
|
|
5
|
-
`),1;let l=s.dirname(o),d=(t===`file`||t===`package`)&&n!==void 0&&a!==void 0;try{if(d){let n=Object.keys(a)[0],i=r.readJsonSync(o);if(t===`package`){e.write(`Merging: \nPackage config key "${n}" → "${l}" (Because --location is set to "package")\n`);let t=
|
|
6
|
-
`),0;let o=
|
|
7
|
-
`);for(let e of o)t.write(`${e}\n`);return 0},name:`Cosmiconfig ${e}`}}async function
|
|
8
|
-
`),0
|
|
9
|
-
`)
|
|
10
|
-
`);for(let t of r)e.write(`${t}\n`);return 0}async function Wt(e){let t=M(),n=await Ht(),r=[];for(let i of t)r.push({cwdOverride:i,name:`mdat`,optionFlags:n===void 0||n===``?[`--format`]:[`--config`,n,`--format`],subcommands:[e]});return r}const Gt={commands:{fix:{commands:await Wt(`expand`),description:`Expand all Mdat content placeholders in your readme.md file(s). ${q.packageRun} ${q.monorepoRun}`,parallel:!0,positionalArgumentMode:`none`},init:{configFile:`mdat.config.ts`,configPackageJson:{mdat:{$import:`node_modules/@kitschpatrol/mdat-config/dist/index.js`}},locationOptionFlag:!0},lint:{commands:await Wt(`check`),description:`Validate that all Mdat content placeholders in your readme.md file(s) have been expanded and are up to date. ${q.packageRun} ${q.monorepoRun}`,parallel:!0,positionalArgumentMode:`none`},printConfig:{commands:[{execute:Ut,name:`mdat-config`}],description:`Print the effective Mdat configuration. ${q.packageSearch}. ${q.monorepoSearch}.`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Mdat shared configuration tools.`,logColor:`green`,logPrefix:`[Mdat Config]`,name:`ksc-mdat`,order:2},Kt=/^\[warn\] (?<file>\S+)$/v,qt=/^\[error\] (?<message>.+)$/v;function Jt(e){let t=[],n=[];for(let r of k(`${e.stdout}\n${e.stderr}`)){let i=Kt.exec(r);if(i?.groups?.file!==void 0){t.push({file:O(i.groups.file,e.cwd),message:`File is not formatted with Prettier`,severity:`warning`,tool:`prettier`});continue}if(r.startsWith(`[warn] Code style issues found`))continue;let a=qt.exec(r);if(a?.groups?.message!==void 0){t.push({message:a.groups.message,severity:`error`,tool:`prettier`});continue}n.push(r)}return{diagnostics:t,unparsed:n}}const Yt=[`--log-level=warn`,`--plugin=prettier-plugin-astro`,`--plugin=@prettier/plugin-php`,`--plugin=@prettier/plugin-ruby`,`--plugin=@prettier/plugin-xml`,`--plugin=prettier-plugin-jsdoc`,`--plugin=prettier-plugin-packagejson`,`--plugin=prettier-plugin-sh`,`--plugin=prettier-plugin-svelte`,`--plugin=prettier-plugin-toml`,`--plugin=prettier-plugin-tailwindcss`,`--ignore-path=${Fe(`.gitignore`)??`.gitignore`}`,`--ignore-path=${Fe(`.prettierignore`)??`.prettierignore`}`],Xt={commands:{fix:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`prettier`},collect:{parse:Jt},name:`prettier`,optionFlags:[...Yt,`--write`],receivePositionalArguments:!0}],description:`Format files according to your Prettier configuration. ${q.fileRun}`,positionalArgumentDefault:`.`,positionalArgumentMode:`optional`},init:{configFile:`prettier.config.ts`,configPackageJson:{prettier:`@kitschpatrol/prettier-config`},locationOptionFlag:!0},lint:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`prettier`},collect:{parse:Jt},name:`prettier`,optionFlags:[...Yt,`--check`],receivePositionalArguments:!0}],description:`Check that files are formatted according to your Prettier configuration. ${q.fileRun}`,positionalArgumentDefault:`.`,positionalArgumentMode:`optional`},printConfig:{commands:[G(`prettier`)],description:`Print the effective Prettier configuration. ${q.packageSearch}. ${q.monorepoSearch}.`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Prettier shared configuration tools.`,logColor:`blue`,logPrefix:`[Prettier]`,name:`ksc-prettier`,order:9},Zt={commands:{init:{configFile:`.remarkrc.js`,configPackageJson:{remarkConfig:{plugins:[`@kitschpatrol/remark-config`]}},locationOptionFlag:!0},printConfig:{commands:[G(`remark`)],description:`Print the effective Remark configuration. ${q.packageSearch} ${q.monorepoSearch}`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Remark and Remark Lint shared configuration tools. (Actual linting and fixing is managed through @kitschpatrol/eslint-config.)`,logColor:`blue`,logPrefix:`[remarklint]`,name:`ksc-remark`,order:8},Qt=[/Version 2\.0,?\s*January 2004/gv,/Version 1,?\s*February 1989/gv,/Version 2,?\s*June 1991/gv,/Version 3,?\s*29 June 2007/gv,/Version 2\.1,?\s*February 1999/gv,/Version 3,?\s*19 November 2007/gv,/Version 1\.0\s*-\s*August 17th,?\s*2003/gv,/Version 1\.1,?\s*March 2000/gv,/Version 1\.2,?\s*November 2002/gv,/Version 1\.3,?\s*3 November 2008/gv,/Version 1\.0\s*-\s*22 November 2005/gv,/Version 1\.1\s*-\s*26 February 2007/gv,/Version 2,?\s*December 2004/gv,/20 December 1996/gv,/December 20,?\s*1996/gv,/11 March 1996/gv,/28 March 2007/gv,/November 1,?\s*2008/gv,/August 1,?\s*2009/gv,/1 April 19\d{2}/gv,/Copyright \(c\) 2000-2006,?\s*The Perl Foundation/giv,/Copyright \(C\) (?:\d{4},?\s*)+Free Software Foundation/gv],$t=[`node_modules/**`,`test/**`];function en(e){let t=e;for(let e of Qt)e.lastIndex=0,t=t.replace(e,e=>e.replaceAll(/\d/gv,`X`));return t}const tn=/(\d{4})\s*-\s*(\d{4})/v,nn=/(\d{4})/v;function rn(e,t){let n=en(e),r=tn,i=r.exec(n);if(i){let[,n,a]=i;if(Number(a)!==t){let a=`${n}-${t}`;return e.slice(0,i.index)+e.slice(i.index).replace(r,()=>a)}return e}let a=nn,o=a.exec(n);if(o){let[,n]=o;if(Number(n)!==t){let r=`${n}-${t}`;return e.slice(0,o.index)+e.slice(o.index).replace(a,()=>r)}return e}return e}async function an(e){let t=new Date().getFullYear(),n=[`**/license.txt`,`**/license`,...$t.map(e=>`!${e}`)],r=await ue(n,{caseSensitiveMatch:!1,cwd:N(),followSymbolicLinks:!1,gitignore:!0}),i=[];for(let n of r)try{let r=await b.readFile(n,`utf8`),a=rn(r,t);a!==r&&(i.push(n),e&&await b.writeFile(n,a,`utf8`))}catch(e){console.error(`Failed to process ${n}:`,e)}return i}async function on(e,t=!1){let n=await an(t);if(n.length>0){e.write(`${t?`Fixed`:`Found`} ${n.length} license ${L(`file`,n.length)} with outdated copyright year:\n`);for(let t of n)e.write(` - ${t}\n`);return+!t}return 0}async function sn(e){return on(e,!1)}async function cn(){let e=await an(!1);return{diagnostics:e.map(e=>({file:O(e,N()),message:`License file has an outdated copyright year`,severity:`error`,tool:`copyright-year`})),exitCode:+(e.length>0),unparsed:[]}}async function ln(e){return on(e,!0)}const un=`pnpm-lock.yaml`;function dn(e){let t=P(),n=s.resolve(e);for(;;){if(r.existsSync(s.join(n,un)))return n;if(n===t)break;let e=s.dirname(n);if(e===n)break;n=e}}function fn(e,t,n){let r=`${e}@${t}`;if(Object.hasOwn(n,r))return r;if(Object.hasOwn(n,t))return t}function pn(e,t){return e===void 0||e===``?t===void 0||t===``?void 0:t:t===void 0||t===``||de(e,t)?e:t}async function mn(e){let t=dn(e);if(t===void 0||t===``)throw Error(`${un} not found at or above "${e}".`);let n=s.join(t,un),r=await pe(t,{ignoreIncompatible:!1});if(!r?.importers)throw Error(`Lockfile at "${n}" is unreadable or missing importers.`);let i=r.packages??{},a,o,c={},l={};function u(e,t){let n,r=new Set;function a(e,t){if(t.startsWith(`link:`))return;let o=fn(e,t,i);if(o===void 0||o===``||r.has(o))return;r.add(o);let s=i[o];if(s===void 0)return;let c=s.engines?.node;if(c!==void 0&&c!==``){let e=fe(c)?.version;e!==void 0&&e!==``&&(n===void 0||n===``||de(e,n))&&(n=e)}if(s.dependencies)for(let[e,t]of Object.entries(s.dependencies))a(e,t)}return a(e,t),n}function d(e,t){for(let[n,r]of Object.entries(e)){let e=u(n,typeof r==`string`?r:r.version);if(e!==void 0&&e!==``){let r=t?l:c;r[e]??=new Set,r[e].add(n);let i=t?o:a;(i===void 0||i===``||de(e,i))&&(t?o=e:a=e)}}}let f=s.relative(t,e),p=f===``?`.`:f,m=r.importers[p];m!==void 0&&(m.dependencies&&d(m.dependencies,!1),m.devDependencies&&d(m.devDependencies,!0));let h=pn(a,o),g=h===void 0?void 0:`>=${h}`;return{dependencies:a!==void 0&&a!==``?{topLevelCauses:[...c[a]??[]],version:`>=${a}`}:void 0,devDependencies:o!==void 0&&o!==``?{topLevelCauses:[...l[o]??[]],version:`>=${o}`}:void 0,lockfile:n,version:g}}function hn(e){let t=e.devEngines;if(t?.runtime)return(Array.isArray(t.runtime)?t.runtime:[t.runtime]).find(e=>e.name===`node`)?.version}function gn(e,t){let n=e.devEngines??{};if(n.runtime)if(Array.isArray(n.runtime)){let e=n.runtime.find(e=>e.name===`node`);e===void 0?n.runtime.push({name:`node`,version:t}):e.version=t}else n.runtime.name===`node`?n.runtime.version=t:n.runtime=[n.runtime,{name:`node`,version:t}];else n.runtime={name:`node`,version:t};e.devEngines=n}function _n(e){let t=e.devEngines;if(t?.runtime){if(Array.isArray(t.runtime)){t.runtime=t.runtime.filter(e=>e.name!==`node`);let[e]=t.runtime;e===void 0?delete t.runtime:t.runtime.length===1&&(t.runtime=e)}else t.runtime.name===`node`&&delete t.runtime;Object.keys(t).length===0&&delete e.devEngines}}function J(e){return e.length===0?``:` (from ${e.join(`, `)})`}async function vn(e,t){let n=s.join(t,`package.json`);if(!r.existsSync(n))return{issues:[],packageJsonPath:n};let i=r.readJsonSync(n),a=i.engines?.node,o=hn(i),c=await mn(t),l=c.dependencies?.version,u=c.dependencies?.topLevelCauses??[],d=c.version,f=c.devDependencies?.topLevelCauses??[],p=[];if(l!==void 0)if(a===void 0){if(p.push(`Missing engines.node — suggest setting to "${l}"${J(u)}`),e){let e=i.engines??{};e.node=l,i.engines=e}}else{let t=C.minVersion(a),n=C.minVersion(l);t&&n&&C.lt(t,n)&&(p.push(`engines.node is "${a}" but production dependencies require at least "${l}"${J(u)}`),e&&(i.engines.node=l))}let m=(()=>{if(l!==void 0&&l!==``&&a!==void 0&&a!==``){let e=C.minVersion(l),t=C.minVersion(a);if(e&&t)return C.gt(e,t)?l:a}return l??a})(),h=m!==void 0&&m!==``?C.minVersion(m):void 0,g=d!==void 0&&d!==``?C.minVersion(d):void 0,_=g&&h&&C.gt(g,h);if(d!==void 0&&_)if(o===void 0)p.push(`devDependencies require a higher Node.js minimum (${d}) than engines.node (${m??`none`}) — suggest adding devEngines.runtime for node with version "${d}"${J(f)}`),e&&gn(i,d);else{let t=C.minVersion(o);t&&C.lt(t,g)&&(p.push(`devEngines.runtime.version for node is "${o}" but all dependencies require at least "${d}"${J(f)}`),e&&gn(i,d))}else if(o!==void 0){let t=C.minVersion(o);t&&h&&C.lte(t,h)&&(p.push(`devEngines.runtime.version for node is redundant (engines.node already covers the requirement) — suggest removing`),e&&_n(i))}return e&&p.length>0&&(r.writeJsonSync(n,i,{spaces:` `}),await F(n)),{issues:p,packageJsonPath:n}}async function yn(e,t){let n=M(),r=0;for(let i of n){let{issues:n,packageJsonPath:a}=await vn(t,i);if(n.length>0){e.write(`${t?`Fixed`:`Found`} ${n.length} Node.js version ${L(`issue`,n.length)} in ${a}:\n`);for(let t of n)e.write(` - ${t}\n`);t||(r=1)}}return r}async function bn(){let e=M(),t=[];for(let n of e){let{issues:e,packageJsonPath:r}=await vn(!1,n);for(let n of e)t.push({file:O(r,process.cwd()),message:n,severity:`error`,tool:`node-version`})}return{diagnostics:t,exitCode:+(t.length>0),unparsed:[]}}async function xn(e){let t=A(await mn(N())).split(`
|
|
11
|
-
`);for(let n of t)e.write(`${n}\n`);return 0}async function Sn(e){return yn(e,!1)}async function Cn(e){return yn(e,!0)}const wn={commands:{fix:{commands:[{execute:ln,name:`copyright-year`},{execute:Cn,name:`node-version`}],description:`Fix common issues like outdated copyright years in license files. ${q.packageRun} ${q.monorepoRun}`,positionalArgumentMode:`none`},init:{locationOptionFlag:!1},lint:{commands:[{collect:cn,execute:sn,name:`copyright-year`},{collect:bn,execute:Sn,name:`node-version`}],description:`Check the repo for common issues. ${q.packageRun} ${q.monorepoRun}`,positionalArgumentMode:`none`},printConfig:{commands:[{execute:xn,name:`node-version`}],description:`Print minimum Node.js version constraints from the pnpm lockfile.`,positionalArgumentMode:`none`}},description:`Kitschpatrol's repository-related shared configuration tools.`,logColor:`gray`,logPrefix:`[Repo Config]`,name:`ksc-repo`,order:1},Y=[`--ignore-path`,Fe(`.gitignore`)??`.gitignore`,`--allow-empty-input`],Tn=`**/*.{${[`css`,`scss`,`sass`,`svelte`,`html`,`astro`,`tsx`,`jsx`,`php`,`vue`].join(`,`)}}`;function En(e){let t;try{t=JSON.parse(e.stderr)}catch{return{diagnostics:[],unparsed:[...k(e.stdout),...k(e.stderr)]}}let n=[];for(let r of t){let t=O(r.source,e.cwd);for(let e of r.warnings){let r=e.rule===void 0?void 0:` (${e.rule})`,i=r!==void 0&&e.text.endsWith(r)?e.text.slice(0,-r.length):e.text;n.push({column:e.column,endColumn:e.endColumn,endLine:e.endLine,file:t,line:e.line,message:i,rule:e.rule,severity:e.severity===`warning`?`warning`:`error`,tool:`stylelint`})}let i=r.parseErrors??[];for(let e of i)n.push({column:e.column,file:t,line:e.line,message:e.text,rule:`parse-error`,severity:`error`,tool:`stylelint`})}return{diagnostics:n,unparsed:k(e.stdout)}}async function Dn(e,t){let n=`stylelint`,r=await K(n);if(r===void 0)return 1;let{filepath:i,isEmpty:a}=r;if(a)return e.write(`Configuration is empty.
|
|
12
|
-
`)
|
|
13
|
-
`)
|
|
2
|
+
import{cosmiconfig as e}from"cosmiconfig";import{TypeScriptLoader as t}from"cosmiconfig-typescript-loader";import{execa as n}from"execa";import r from"fs-extra";import i,{constants as a}from"node:fs";import{availableParallelism as o}from"node:os";import s from"node:path";import{PassThrough as c,Transform as l}from"node:stream";import{packageUp as u,packageUpSync as d}from"package-up";import f from"yargs";import{hideBin as p}from"yargs/helpers";import m from"picocolors";import{stripVTControlCharacters as h}from"node:util";import g from"@pinojs/json-colorizer";import _ from"decircular";import ee from"deepmerge";import v from"json-stringify-pretty-compact";import{findWorkspaces as y,findWorkspacesRoot as te}from"find-workspaces";import b,{access as ne}from"node:fs/promises";import{getDefaultConfigLoader as x,resolveConfigFileImports as re}from"cspell-lib";import{fileURLToPath as S}from"node:url";import{createReaderWriter as ie}from"cspell-config-lib";import{loadFile as ae,writeFile as oe}from"magicast";import{getDefaultExportOptions as se}from"magicast/helpers";import{lint as ce}from"cspell";import"deepmerge-ts";import{loadConfig as le}from"mdat";import{globby as ue}from"globby";import C,{gt as w,minVersion as de}from"semver";import{readWantedLockfile as fe}from"@pnpm/lockfile.fs";import pe from"stylelint";var me=`8.8.0`;const he=[`json`,`machine`,`native`],ge=he;function _e(e){return typeof e==`string`&&he.includes(e)}function T(){let e=process.env.KSC_FORMAT;return _e(e)?e:`native`}function ve(){let{argv:e}=process;for(let[t,n]of e.entries()){let r;n===`--format`?r=e[t+1]:n.startsWith(`--format=`)&&(r=n.slice(9)),_e(r)&&(process.env.KSC_FORMAT=r)}}function ye(){let{env:e}=process;if(e.NO_COLOR!==void 0&&e.NO_COLOR!==``)return!1;if(e.FORCE_COLOR!==void 0)return e.FORCE_COLOR!==`0`&&e.FORCE_COLOR!==`false`;if(e.TERM===`dumb`)return!1}function be(e,{ciColor:t=!0}={}){let n=ye();return n===void 0?e.isTTY===!0||t&&!!process.env.CI:n}function xe(){return T()===`json`?process.stderr:process.stdout}function E(){return T()===`machine`?m.createColors(!1):m.createColors(be(xe()))}function Se(e){if(!e)return{FORCE_COLOR:`0`,NO_COLOR:`1`};let t=process.env.FORCE_COLOR;return t===void 0||t===``?{FORCE_COLOR:`1`}:{}}function D(e,t){let n=s.isAbsolute(e)?e:s.resolve(t,e),r=s.relative(process.cwd(),n);return r===``?`.`:r}const Ce=/\s*\n\s*/gv,we=/\r?\n/v;function Te(e){let t=e.message.replaceAll(Ce,` `),n=e.rule===void 0?e.tool:`${e.tool}/${e.rule}`;return e.file===void 0?`${e.severity}: ${t} [${n}]`:`${e.file}:${e.line??1}:${e.column??1}: ${e.severity}: ${t} [${n}]`}function Ee(e,t){let n=(e.file??``).localeCompare(t.file??``);if(n!==0)return n;let r=(e.line??0)-(t.line??0);return r===0?(e.column??0)-(t.column??0):r}function De(e,t){let n=t.toSorted(Ee);return{cwd:process.cwd(),diagnostics:n,success:e.every(e=>e.exitCode===0),summary:{errors:n.filter(e=>e.severity===`error`).length,infos:n.filter(e=>e.severity===`info`).length,warnings:n.filter(e=>e.severity===`warning`).length},tools:e,version:1}}function O(e){return h(e).split(we).map(e=>e.trimEnd()).filter(e=>e.trim().length>0)}function Oe(e){return e instanceof Error&&`exitCode`in e&&typeof e.exitCode==`number`}function k(e){return be(process.stdout,{ciColor:!1})?Ae(e):ke(e)}function ke(e){return v(_(e),{indent:2,replacer(e,t){return typeof t==`function`?t.name:t}})}function Ae(e){return g(ke(e),{colors:{BRACKET:`gray`}})}const je=(e,t,n)=>{let r=[...e];for(let[i,a]of t.entries())r[i]===void 0?r[i]=n.cloneUnlessOtherwiseSpecified(a,n):n.isMergeableObject(a)?r[i]=A(e[i],a,n):e.includes(a)||r.push(a);return r};function A(e,t,n={arrayMerge:je}){return ee(e,t,n)}function Me(e){let{tasks:t}=e;return Array.isArray(t)?t:[]}function Ne(e,t){let n=[...Me(e)];for(let e of Me(t)){let t=n.findIndex(t=>t.label!==void 0&&t.label===e.label);t===-1?n.push(e):n[t]=e}return{...e,...t,tasks:n}}function Pe(e,t){return e.startsWith(t+s.sep)}function j(){let e=M(),t=new Set([e]),n=y();if(n!==null)for(let r of n){let n=s.resolve(r.location);Pe(n,e)&&t.add(n)}return[...t]}function M(){let e=d();if(e===void 0)throw Error(`No package.json found.`);return s.dirname(e)}function Fe(){return te()!==null}function N(){let e=te();return e===null?M():s.resolve(e.location)}function P(e){let t=s.join(N(),e);if(r.existsSync(t))return t}function F(e){if(e===`workspace-root`)return N();if(e===`package-dir`)return M();if(typeof e==`string`){if(!r.pathExistsSync(e))throw Error(`Custom cwd directory does not exist: ${e}`);return e}return process.cwd()}async function Ie(e,t){try{let{default:n}=await import(`prettier`),r=await n.resolveConfig(e),i=await n.format(t,{filepath:e,...r});await b.writeFile(e,i,`utf8`)}catch{console.warn(`Skipped formatting ${e} since Prettier is not installed.`)}}async function I(e){try{await Ie(e,await b.readFile(e,`utf8`))}catch{}}const Le=/\r?\n/v;function Re(e){let t=``,n=t=>t.filter(t=>{let n=h(t);return n.trim()!==``&&!e(n)}).map(e=>`${e}\n`).join(``);return new l({flush(e){e(void 0,n([t]))},transform(e,r,i){let a=(t+e.toString()).split(Le);t=a.pop()??``,i(void 0,n(a))}})}function L(e,t){let n=T()===`native`?e:void 0,r=n===void 0||n===``?``:t===void 0?n:E()[t](n),i=``,a=e=>e.filter(e=>e.trim().length>0).map(e=>r===``?`${e}\n`:`${r} ${e}\n`).join(``);return new l({flush(e){e(void 0,a([i]))},transform(e,t,n){let r=(i+e.toString()).split(Le);i=r.pop()??``,n(void 0,a(r))}})}async function ze(e){let t=[];return new Promise((n,r)=>{e.on(`data`,e=>{t.push(e)}),e.on(`error`,e=>{r(e)}),e.on(`end`,()=>{n(Buffer.concat(t).toString(`utf8`))})})}function Be(e){return e.replaceAll(/[A-Z\u{C0}-\u{D6}\u{D8}-\u{DE}]/gv,e=>`-`+e.toLowerCase())}function R(e,t){return t===1?e:e+`s`}async function z(e){return typeof e==`function`?e():e}async function Ve(e,t,n,r,i){let a;if(r.logPrefix===void 0)a=e;else{let t=L(r.logPrefix,r.logColor);t.pipe(e),a=t}i&&a.write(E().bold(`Running: "${r.name}() with Positional arguments: ${String(t)} and Option flags: ${String(n)}"`)+`
|
|
3
|
+
`);try{return await r.execute(a,t,n)}catch(e){return console.error(String(e)),1}}function He(e,t,n,r,i){return[...e.subcommands??[],...e.receiveOptionFlags?n:[],...r??[],...i&&e.cache!==void 0?[...e.cache.flags,`--cache-location`,s.join(N(),`node_modules`,`.cache`,`ksc`,e.cache.name)]:[],...e.receivePositionalArguments?t:[],...e.positionalArguments??[]]}async function Ue(e,t,r,i,a,o){let s=1,l;if(i.logPrefix===void 0)l=e;else{let t=L(i.logPrefix,i.logColor);t.pipe(e),l=t}let u=He(i,t,r,i.optionFlags,a),d=F(i.cwdOverride);o&&l.write(`Running: "${i.name} ${u.join(` `)}"\n`);let f=i.prettyJsonOutput?new c:void 0,p=f??l,m=Se(T()===`native`&&i.prettyJsonOutput!==!0&&be(xe()));try{let e=n(i.name,u,{cwd:d,env:m,preferLocal:!0,reject:!1,stdin:`inherit`});if(i.outputFilter){let t=Re(i.outputFilter),n=Re(i.outputFilter);e.stdout.pipe(t).pipe(p,{end:!1}),e.stderr.pipe(n).pipe(p,{end:!1})}else e.stdout.pipe(p,{end:!1}),e.stderr.pipe(p,{end:!1});let t=await e;if(f!==void 0){f.end();let e=await ze(f),t=k(JSON.parse(e)).split(`
|
|
4
|
+
`);for(let e of t)l.write(`${e}\n`)}s=t.exitCode??1}catch(e){console.error(`${i.name} failed with error:`),console.error(e),Oe(e)&&(s=typeof e.exitCode==`number`?e.exitCode:1)}return s}function B(e){return`execute`in e}function V(e){return`kind`in e}async function We(e,t,r,i,a){let o=He(r,e,t,r.collect?.optionFlags??r.optionFlags,i),s=F(r.cwdOverride);try{let e=n(r.name,o,{cwd:s,env:Se(!1),preferLocal:!0,reject:!1,stdin:`inherit`});a!==void 0&&e.stderr.pipe(a,{end:!1});let t=await e;return{cwd:s,exitCode:t.exitCode??1,stderr:t.stderr,stdout:t.stdout}}catch(e){return console.error(`${r.name} failed with error:`),console.error(e),{cwd:s,exitCode:Oe(e)&&typeof e.exitCode==`number`?e.exitCode:1,stderr:``,stdout:``}}}function Ge(e){return typeof e==`object`&&!!e&&`version`in e&&e.version===1&&`diagnostics`in e&&Array.isArray(e.diagnostics)&&`success`in e&&typeof e.success==`boolean`&&`tools`in e&&Array.isArray(e.tools)}function Ke(e,t){return e===0&&t.some(({severity:e})=>e===`error`)?1:e}async function qe(e,t,n,r,i){let a=Date.now(),o=()=>Date.now()-a;if(B(r)){if(r.collect!==void 0)try{let e=await r.collect(t,n),i=Ke(e.exitCode,e.diagnostics);return{diagnostics:e.diagnostics,exitCode:i,tools:[{durationMs:o(),exitCode:i,name:r.name,unparsed:e.unparsed}]}}catch(e){return{diagnostics:[],exitCode:1,tools:[{durationMs:o(),exitCode:1,name:r.name,unparsed:[String(e)]}]}}let e=``,i=new c;i.on(`data`,t=>{e+=t.toString()});let a;try{a=await r.execute(i,t,n)}catch(t){e+=`\n${String(t)}`,a=1}return{diagnostics:[],exitCode:a,tools:[{durationMs:o(),exitCode:a,name:r.name,unparsed:O(e)}]}}if(V(r))throw Error(`Command groups must be expanded before collection`);if(r.outputFormatAware){let a=await We(t,n,r,i,e);try{let e=JSON.parse(a.stdout);if(!Ge(e))throw Error(`Child output is not a lint report`);return{diagnostics:e.diagnostics,exitCode:a.exitCode===0&&e.success&&e.diagnostics.every(({severity:e})=>e!==`error`)?0:1,tools:e.tools}}catch{return{diagnostics:[],exitCode:a.exitCode,tools:[{durationMs:o(),exitCode:a.exitCode,name:r.name,unparsed:O(a.stdout)}]}}}let s=await We(t,n,r,i);if(r.collect!==void 0)try{let{diagnostics:e,unparsed:t}=r.collect.parse(s),n=Ke(s.exitCode,e);return{diagnostics:e,exitCode:n,tools:[{durationMs:o(),exitCode:n,name:r.name,unparsed:t}]}}catch(e){return{diagnostics:[],exitCode:s.exitCode,tools:[{durationMs:o(),exitCode:s.exitCode,name:r.name,unparsed:[...O(s.stdout),...O(s.stderr),String(e)]}]}}return{diagnostics:[],exitCode:s.exitCode,tools:[{durationMs:o(),exitCode:s.exitCode,name:r.name,unparsed:[...O(s.stdout),...O(s.stderr)]}]}}const Je=/^ksc-/v;function H(e){return e.replace(Je,``)}function U(e){return e===void 0||e.length===0?[]:e.flatMap(e=>e.split(`,`)).map(e=>H(e.trim()))}function W(e){return e.option(`skip`,{array:!0,describe:`Tool names to skip (with or without "ksc-" prefix).`,type:`string`})}function Ye(e){return e.option(`format`,{choices:ge,default:`native`,describe:`Output format: "native" streams each tool's own output, "machine" prints one parseable line per issue for editor problem matchers, "json" prints an aggregate report.`})}function Xe(e){return e.option(`cache`,{boolean:!0,default:!0,describe:`Use tool-native caches stored below node_modules/.cache/ksc at the workspace root. Disable with --no-cache.`})}function Ze(e,t){return t===`native`||t===`machine`&&!B(e)&&!V(e)&&e.outputFormatAware===!0}function Qe(e,t){for(let n of t.diagnostics)e.write(`${Te(n)}\n`);for(let n of t.tools)for(let t of n.unparsed)e.write(`${t}\n`)}function $e(){return Math.min(4,o())}var et=class{concurrency;active=0;queue=[];constructor(e){this.concurrency=e}async run(e){this.active>=this.concurrency&&await new Promise(e=>{this.queue.push(e)}),this.active+=1;try{return await e()}finally{--this.active,this.queue.shift()?.()}}};async function tt(e){let t=e.cache??!1,n=e.concurrency??$e();if(!Number.isInteger(n)||n<1)throw Error(`Concurrency must be a positive integer.`);return t&&await r.ensureDir(s.join(N(),`node_modules`,`.cache`,`ksc`)),{cache:t,scheduler:new et(n)}}function nt(e,t){return e.positionalArgumentMode===`none`?[]:t.length>0?t:e.positionalArgumentDefault===void 0?[]:[e.positionalArgumentDefault]}function rt(e,t){if(t.logPrefix===void 0)return e;let n=L(t.logPrefix,t.logColor);return n.pipe(e),n}function it(e){return V(e)?`${e.name} ${e.subcommand}`:!B(e)&&e.subcommands!==void 0?[e.name,...e.subcommands].join(` `):e.name}async function at(e,t){if(V(e)){let n=rt(t.logStream,e);try{let r=await z(e.commands);if(t.nativeVerbose){let n=[e.subcommand,...t.positionalArguments].join(` `),i=e.showResolvedCommands?` (${r.map(e=>it(e)).join(`, `)})`:``;t.logStream.write(`Running: "${e.name} ${n}"${i}\n`)}let i=await ot(r,{...t,logStream:n,nativeVerbose:e.verbose,positionalArguments:nt(e,t.positionalArguments)},e.parallel===!0);return{diagnostics:i.flatMap(({diagnostics:e})=>e),exitCode:+!i.every(({exitCode:e})=>e===0),machineOutcomes:i.flatMap(({machineOutcomes:e})=>e),name:e.name,tools:i.flatMap(({tools:e})=>e)}}catch(r){let i=String(r),a={durationMs:0,exitCode:1,name:e.name,unparsed:[i]};return t.format===`native`&&n.write(`${i}\n`),{diagnostics:[],exitCode:1,machineOutcomes:[{diagnostics:[],exitCode:1,tools:[a]}],name:e.name,tools:[a]}}}return t.scheduler.run(async()=>{if(Ze(e,t.format))return{diagnostics:[],exitCode:await(B(e)?Ve(t.logStream,t.positionalArguments,t.optionFlags,e,t.nativeVerbose):Ue(t.logStream,t.positionalArguments,t.optionFlags,e,t.cache,t.nativeVerbose)),machineOutcomes:[],name:e.name,tools:[]};let n=await qe(t.logStream,t.positionalArguments,t.optionFlags,e,t.cache);return{diagnostics:n.diagnostics,exitCode:n.exitCode,machineOutcomes:[n],name:e.name,tools:n.tools}})}async function ot(e,t,n){if(!n||t.scheduler.concurrency===1){let n=[];for(let r of e)n.push(await at(r,t));return n}await Promise.resolve();let r=new Map;for(let[t,n]of e.entries()){let e=n.stage??0,i=r.get(e)??[];i.push({command:n,index:t}),r.set(e,i)}let i=Array.from({length:e.length}),a=r.keys().toArray().toSorted((e,t)=>e-t);for(let e of a){let n=r.get(e)??[],a=await Promise.all(n.map(async({command:e,index:n})=>({index:n,outcome:await at(e,t)})));for(let{index:e,outcome:t}of a)i[e]=t}return i.filter(e=>e!==void 0)}function st(e,t,n){let r=[],i=[];for(let e of t)n.length>0&&n.includes(H(e.name))?i.push(e):r.push(e);if(n.length>0){let r=new Set(i.map(e=>H(e.name))),a=n.filter(e=>!r.has(e));if(a.length>0){let n=t.map(e=>H(e.name)).join(`, `);e.write(`⚠️ ${E().yellow(`Unrecognized --skip ${R(`value`,a.length)}: ${a.join(`, `)}. Available: ${n}`)}\n`)}}return{commandsToRun:r,skippedCommands:i}}async function G(e,t,n,r,i,a,o,s=`native`){let c=typeof s==`string`?{}:s,l=typeof s==`string`?s:c.format??`native`,{commandsToRun:u,skippedCommands:d}=st(e,r,o??[]),f=l===`native`&&i,{cache:p,scheduler:m}=await tt(c),h=await ot(u,{cache:p,format:l,logStream:e,nativeVerbose:f,optionFlags:n,positionalArguments:t,scheduler:m},c.parallel===!0),g=h.map(({exitCode:e,name:t})=>({exitCode:e,name:t})),_=h.flatMap(({tools:e})=>e),ee=h.flatMap(({diagnostics:e})=>e);if(l===`machine`)for(let t of h)for(let n of t.machineOutcomes)Qe(e,n);let v=r.length,y=E();if(l===`native`&&d.length>0){let t=d.map(({name:e})=>e),n=y.bold(`${t.length} / ${v} ${R(`Command`,t.length)} Skipped:`);e.write(`⏭️ ${y.dim(n)} ${y.dim(t.join(`, `))}\n`)}if(l===`native`&&a){let t=g.filter(({exitCode:e})=>e===0).map(({name:e})=>e),n=g.filter(({exitCode:e})=>e!==0).map(({name:e})=>e);if(t.length>0){let n=y.bold(`${t.length} / ${v} ${R(`Command`,t.length)} Succeeded:`);e.write(`✅ ${y.green(n)} ${y.green(t.join(`, `))}\n`)}if(n.length>0){let t=y.bold(`${n.length} / ${v} ${R(`Command`,n.length)} Failed:`);e.write(`❌ ${y.red(t)} ${y.red(n.join(`, `))}\n`)}}return{exitCode:+!g.every(({exitCode:e})=>e===0),report:l===`json`?De(_,ee):void 0}}async function ct(e){let t=await u({cwd:e});return t===void 0?void 0:s.join(s.dirname(t),`init`)}async function lt(e,t,n,a){let o=await u();if(o===void 0)throw Error("The `init` command must be used in a directory with a package.json file");let c=await ct(import.meta.dirname);if(c===void 0)return e.write(`Error: Could not locate the package containing this CLI.
|
|
5
|
+
`),1;let l=s.dirname(o),d=(t===`file`||t===`package`)&&n!==void 0&&a!==void 0;try{if(d){let n=Object.keys(a)[0],i=r.readJsonSync(o);if(t===`package`){e.write(`Merging: \nPackage config key "${n}" → "${l}" (Because --location is set to "package")\n`);let t=A(i,a);r.writeJSONSync(o,t,{spaces:` `}),await I(o)}else n!==void 0&&Object.keys(i).includes(n)&&(e.write(`Deleting: \nPackage config key "${n}" in "${l}" (Because --location is set to "file")\n`),delete i[n],r.writeJSONSync(o,i,{spaces:` `}),await I(o))}if(!await r.pathExists(c))return 0;if((await r.readdir(c)).length===0)return e.write(`Source directory "${c}" is empty.\n`),0;e.write(`Adding initial configuration files from:\n"${c}" → "${l}"\n`),await r.copy(c,l,{async filter(a,o){let c=i.statSync(a).isFile(),l=i.existsSync(o);if(c){if(d&&t===`package`&&a.includes(n))return l?(e.write(`Deleting: \n"${a}" → "${o}" (Because --location is set to "package")\n`),r.removeSync(o)):e.write(`Skipping: \n"${a}" → "${o}" (Because --location is set to "package")\n`),!1;if(l&&(o.includes(`.vscode/`)||o.includes(`package.json`))&&s.extname(o)===`.json`){e.write(`Merging: \n"${a}" → "${o}"\n`);let t=r.readJSONSync(a),n=r.readJSONSync(o),i=o.endsWith(`.vscode/tasks.json`)?Ne(n,t):A(n,t);return r.writeJSONSync(o,i,{spaces:` `}),await I(o),!1}return l?(e.write(`Overwriting: \n"${a}" → "${o}"\n`),await I(o),!0):(e.write(`Copying: \n"${a}" → "${o}"\n`),await I(o),!0)}return!0},overwrite:!0})}catch(e){return console.error(String(e)),1}return 0}async function ut(e){let{commands:{fix:t,init:n,lint:r,printConfig:i},description:a,logColor:o,logPrefix:s,name:c,showSummary:l,verbose:u}=e;ve();let d=L(s,o);d.pipe(xe());let m=f(p(process.argv)).scriptName(c).usage(`$0 <command>`,a);n!==void 0&&m.command({builder(e){let t=n.locationOptionFlag?e.option(`location`,{choices:[`file`,`package`],default:`file`,describe:`Where to store the configuration.`,type:`string`}):e;return l?W(t):t},command:`init`,describe:n.description??`Initialize by copying starter config files to your project root${n.locationOptionFlag?` or to your package.json file.`:`.`}`,async handler(e){let t=n.locationOptionFlag?e.location:void 0,r=U(e.skip),{exitCode:i}=await G(d,[],t===void 0?[]:[`--location`,t],[{async execute(e,t,r){return lt(e,r.at(1),n.configFile,n.configPackageJson)},name:`copyAndMergeInitFiles`},...n.commands??[]],void 0,void 0,r);process.exitCode=i}}),r!==void 0&&m.command({builder(e){let t=Xe(Ye(r.positionalArgumentMode===`none`?e:e.positional(`files`,{array:!0,...r.positionalArgumentDefault!==void 0&&{default:r.positionalArgumentDefault},describe:`Files or glob pattern to lint.`,type:`string`})));return l?W(t):t},command:r.positionalArgumentMode===`none`?`lint`:r.positionalArgumentMode===`optional`?`lint [files..]`:`lint <files..>`,describe:r.description,async handler(e){let t=e.files??[],n=U(e.skip),i=T(),{exitCode:a,report:o}=await G(d,t,[],await z(r.commands),u,l,n,{cache:e.cache,format:i,parallel:r.parallel});o!==void 0&&process.stdout.write(`${k(o)}\n`),process.exitCode=a}}),t!==void 0&&m.command({builder(e){let n=Xe(Ye(t.positionalArgumentMode===`none`?e:e.positional(`files`,{array:!0,...t.positionalArgumentDefault!==void 0&&{default:t.positionalArgumentDefault},describe:`Files or glob pattern to fix.`,type:`string`})));return l?W(n):n},command:t.positionalArgumentMode===`none`?`fix`:t.positionalArgumentMode===`optional`?`fix [files..]`:`fix <files..>`,describe:t.description,async handler(e){let n=e.files??[],r=U(e.skip),i=T(),{exitCode:a,report:o}=await G(d,n,[],await z(t.commands),void 0,void 0,r,{cache:e.cache,format:i,parallel:t.parallel});o!==void 0&&process.stdout.write(`${k(o)}\n`),process.exitCode=a}}),i!==void 0&&m.command({builder(e){let t=i.positionalArgumentMode===`none`?e:e.positional(`file`,{...i.positionalArgumentDefault!==void 0&&{default:i.positionalArgumentDefault},describe:`File or glob pattern to print configuration for.`,type:`string`});return l?W(t):t},command:i.positionalArgumentMode===`none`?`print-config`:i.positionalArgumentMode===`optional`?`print-config [file]`:`print-config <file>`,describe:i.description,async handler(e){let t=e.file??void 0,n=t===void 0?[]:[t],r=U(e.skip),{exitCode:a}=await G(d,n,[],await z(i.commands),u,l,r);process.exitCode=a}}),m.alias(`h`,`help`),m.version(me),m.alias(`v`,`version`),m.help(),m.wrap(process.stdout.isTTY?Math.min(120,m.terminalWidth()):0),await m.parseAsync()}function K(e){return{async execute(t){let n=await q(e);if(n===void 0)return 1;let{config:r,filepath:i,isEmpty:a}=n;if(t.write(`Found ${e} configuration at "${i}"\n`),a)return t.write(`Configuration is empty.
|
|
6
|
+
`),0;let o=k(r).split(`
|
|
7
|
+
`);for(let e of o)t.write(`${e}\n`);return 0},name:`Cosmiconfig ${e}`}}async function q(n){let r=e(n,{loaders:{".ts":t()},searchStrategy:`project`});try{let e=await r.search();if(e===null){console.error(`No ${n} configuration found.`);return}return e}catch(e){console.error(`Error while searching for ${n} configuration:`,e);return}}const J={fileRun:`Matches files below the current working directory by default.`,monorepoRun:`In a monorepo, it will also run in all packages below the current working directory.`,monorepoSearch:`Searches up to the root of a monorepo if necessary.`,multiArgumentCaveat:`Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package scope.`,multiOptionCaveat:`Will use option flags where possible if provided, but some of the invoked tools will ignore them.`,optionalFileRun:`Package-scoped by default, file-scoped if a file argument is provided.`,packageRun:`Package-scoped.`,packageSearch:`Package-scoped.`},dt=/['\u{2019}\u{2018}]s$/v;async function ft(e=[`.`]){let t=await x().searchForConfigFile(void 0);if(t===void 0)throw Error(`No CSpell configuration found.`);let{settings:n,url:r}=t;if(n.words===void 0||n.words.length===0)return{errors:0,filesChecked:0,unusedWords:[]};let i=[...n.words];delete n.words;let a=await ce(e,{config:{settings:n,url:r},progress:!1,unique:!0,wordsOnly:!0},{issue({text:e,uri:t}){i=i.filter(n=>n.toLowerCase()!==e.toLowerCase().replace(dt,``)||t===r.href)}});return{errors:a.errors,filesChecked:a.files,unusedWords:i}}const pt=new Set([`.cjs`,`.cts`,`.js`,`.mjs`,`.mts`,`.ts`]);async function mt(e=[`**/*`]){let t=await x().searchForConfigFile(void 0);if(t===void 0)throw Error(`No CSpell configuration found.`);let n=S(t.url),r=[...t.settings.words??[]];if(r.length===0)return;let{errors:i,filesChecked:a,unusedWords:o}=await ft(e);if(a===0||i>0)throw Error(`Refusing to modify "${n}": CSpell checked ${a} files with ${i} errors, so word usage can't be determined. Check your file globs and configuration.`);let s=new Set(o),c=r.filter(e=>!s.has(e)),l=ht([...new Set(c)]);return gt(l,r)?{configFilePath:n,removedWords:[],reordered:!1}:(await _t(t.url,l),{configFilePath:n,removedWords:[...s],reordered:!gt(l,c)})}function ht(e){return e.toSorted((e,t)=>{let n=e.toLowerCase().localeCompare(t.toLowerCase());return n===0?e.localeCompare(t):n})}function gt(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}async function _t(e,t){let n=S(e),r=s.extname(n).toLowerCase();if(pt.has(r)){let e=await ae(n),r=se(e);r.words=t,await oe(e,n),await I(n);return}let i=ie(),a=await i.readConfig(e);if(a.readonly)throw Error(`CSpell configuration file "${n}" can't be modified automatically. Please update the words list manually.`);a.setValue(`words`,t),await i.writeConfig(a)}const vt=`**/*`;function yt(e){return e.length===0||e.length===1&&e[0]===vt}async function bt(){let e=await x().searchForConfigFile(void 0);return e===void 0?void 0:S(e.url)}async function xt(){let e=await x().searchForConfigFile(void 0);if(e===void 0)throw Error(`No CSpell configuration found.`);let t=await re(e);return t.ignorePaths===void 0?``:Array.from(t.ignorePaths,e=>typeof e==`string`?e:e.glob).join(`,`)}const St=/^(?<file>.+?):(?<line>\d+):(?<column>\d+) - (?<message>.+)$/v,Ct=/ fix: \((?<suggestion>[^\)]+)\)$/v;function wt(e){let t=[],n=[];for(let r of O(`${e.stdout}\n${e.stderr}`)){let i=St.exec(r);if(i?.groups===void 0){n.push(r);continue}let{column:a,file:o,line:s,message:c}=i.groups,l=Ct.exec(c??``),u=l?.groups?.suggestion;t.push({column:Number(a),file:D(o??``,e.cwd),line:Number(s),message:l===null?c??``:(c??``).slice(0,-l[0].length),...u!==void 0&&{suggestion:u},severity:`warning`,tool:`cspell`})}return{diagnostics:t,unparsed:n}}async function Tt(e,t){if(!yt(t))return 0;let{errors:n,filesChecked:r,unusedWords:i}=await ft(t);if(n>0||r===0&&i.length>0){let t=L(`[Unused Words]`,`cyanBright`);return t.pipe(e),t.write(`Could not check for unused words: CSpell checked ${r} files with ${n} errors.\n`),1}if(i.length>0){let t=L(`[Unused Words]`,`cyanBright`);t.pipe(e);for(let e of i)t.write(`${e}\n`);return 1}return 0}async function Et(e){if(!yt(e))return{diagnostics:[],exitCode:0,unparsed:[]};let{errors:t,filesChecked:n,unusedWords:r}=await ft(e);if(t>0||n===0&&r.length>0)return{diagnostics:[{message:`Could not check for unused words: CSpell checked ${n} files with ${t} errors`,severity:`error`,tool:`unused-words`}],exitCode:1,unparsed:[]};let i=await bt(),a=i===void 0?{}:{file:D(i,process.cwd())};return{diagnostics:r.map(e=>({...a,message:`Unused word in CSpell config "words" array: ${e}`,severity:`warning`,tool:`unused-words`})),exitCode:+(r.length>0),unparsed:[]}}async function Dt(e,t){let n=L(`[Words]`,`cyanBright`);if(n.pipe(e),!yt(t))return n.write(`Skipping unused word removal because file arguments were provided. Run without file arguments to remove unused words.
|
|
8
|
+
`),0;let r=await mt(t);if(r===void 0)return 0;for(let e of r.removedWords)n.write(`Removed unused word: ${e}\n`);return r.reordered&&n.write(`Sorted the "words" array alphabetically.
|
|
9
|
+
`),0}async function Ot(){let e=import.meta.resolve(`@kitschpatrol/cspell-config`),t=await u({cwd:s.dirname(S(e))});if(t===void 0)throw Error(`Could not find Case Police dictionary parent package.`);let n=s.join(s.dirname(t),`dictionaries`,`case-police.json`);try{await ne(n,a.F_OK)}catch{throw Error(`Case Police dictionary file "${n}" does not exist.`)}return n}const kt=/^(?<from>\S+) → (?<to>\S+)\s+(?<file>\S+):(?<line>\d+):(?<column>\d+)$/v;function At(e){let t=[],n=[];for(let r of O(`${e.stdout}\n${e.stderr}`)){if(!r.includes(`→`))continue;let i=kt.exec(r);if(i?.groups===void 0){n.push(r);continue}let{column:a,file:o,from:s,line:c,to:l}=i.groups;t.push({column:Number(a),file:D(o??``,e.cwd),line:Number(c),message:`Case error: "${s}" should be "${l}"`,severity:`warning`,...l!==void 0&&{suggestion:l},tool:`case-police`})}return{diagnostics:t,unparsed:n}}async function jt(e){let t=await x().searchForConfigFile(void 0);if(t===void 0)throw Error(`No CSpell configuration found.`);e.write(`Found cspell readme configuration at "${S(t.url)}"\n`);let n=k(await re(t)).split(`
|
|
10
|
+
`);for(let t of n)e.write(`${t}\n`);return 0}const Mt={commands:{fix:{async commands(){return[{collect:{parse:At},logColor:`cyanBright`,logPrefix:`[Case Police]`,name:`case-police`,optionFlags:[`--fix`,`--dict`,await Ot(),`--ignore`,await xt()],outputFilter:e=>!e.includes(`→`),receivePositionalArguments:!0},{execute:Dt,name:`words`},{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`cspell`},collect:{parse:wt},name:`cspell`,optionFlags:[`--quiet`],receivePositionalArguments:!0}]},description:`Fix letter casing issues, remove unused words from the local CSpell configuration's "words" array, and report remaining (unfixable) spelling errors. ${J.fileRun} Unused words are only removed when no file arguments are given, since detecting them requires checking every file.`,positionalArgumentDefault:vt,positionalArgumentMode:`optional`},init:{configFile:`cspell.config.ts`,configPackageJson:{cspell:{import:`@kitschpatrol/cspell-config`}},locationOptionFlag:!0},lint:{async commands(){return[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`cspell`},collect:{parse:wt},name:`cspell`,optionFlags:[`--quiet`],receivePositionalArguments:!0},{collect:Et,execute:Tt,name:`unused-words`},{collect:{parse:At},logColor:`cyanBright`,logPrefix:`[Case Police]`,name:`case-police`,optionFlags:[`--dict`,await Ot(),`--ignore`,await xt()],outputFilter:e=>!e.includes(`→`),receivePositionalArguments:!0}]},description:`Check for spelling mistakes. ${J.fileRun} Unused words in the configuration's "words" array are only reported when no file arguments are given, since detecting them requires checking every file.`,positionalArgumentDefault:vt,positionalArgumentMode:`optional`},printConfig:{commands:[{execute:jt,name:`cspell-config`}],description:`Print the resolved CSpell configuration. ${J.packageSearch} ${J.monorepoSearch}`,positionalArgumentMode:`none`}},description:`Kitschpatrol's CSpell shared configuration tools.`,logColor:`cyan`,logPrefix:`[CSpell]`,name:`ksc-cspell`,order:6};async function Nt(e,t){let n,[r]=t;if(r===void 0)n=K(`eslint`);else{let t=s.join(process.cwd(),r);e.write(`Showing configuration for file: ${t}\n`),n={name:`eslint`,optionFlags:[`--print-config`],receivePositionalArguments:!0}}let{exitCode:i}=await G(e,t,[],[n]);return i}function Pt(e){let t;try{t=JSON.parse(e.stdout)}catch{return{diagnostics:[],unparsed:[...O(e.stdout),...O(e.stderr)]}}let n=[];for(let r of t)for(let t of r.messages)n.push({column:t.column,endColumn:t.endColumn,endLine:t.endLine,file:D(r.filePath,e.cwd),line:t.line,message:t.message,rule:t.ruleId??void 0,severity:t.fatal===!0||t.severity===2?`error`:`warning`,tool:`eslint`});return{diagnostics:n,unparsed:O(e.stderr)}}const Ft={commands:{fix:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`eslint`},collect:{optionFlags:[`--fix`,`--max-warnings`,`0`,`--format`,`json`],parse:Pt},name:`eslint`,optionFlags:[`--fix`,`--max-warnings`,`0`],receivePositionalArguments:!0}],description:`Fix your project with ESLint. ${J.fileRun}`,positionalArgumentDefault:`.`,positionalArgumentMode:`optional`},init:{locationOptionFlag:!1},lint:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`eslint`},collect:{optionFlags:[`--max-warnings`,`0`,`--format`,`json`],parse:Pt},name:`eslint`,optionFlags:[`--max-warnings`,`0`],receivePositionalArguments:!0}],description:`Lint your project with ESLint. ${J.fileRun}`,positionalArgumentDefault:`.`,positionalArgumentMode:`optional`},printConfig:{commands:[{execute:Nt,name:`eslint-config`}],description:`Print the effective ESLint configuration. ${J.optionalFileRun} Use \`@eslint/config-inspector\` for a more detailed view.`,positionalArgumentMode:`optional`}},description:`Kitschpatrol's ESLint shared configuration tools.`,logColor:`magenta`,logPrefix:`[ESLint]`,name:`ksc-eslint`,order:4},It={entry:[`{index,cli,main}.{js,mjs,cjs,jsx,ts,tsx,mts,cts}!`,`src/{index,cli,main}.{js,mjs,cjs,jsx,ts,tsx,mts,cts}!`,`src/{bin,lib,cli}/{index,cli,main}.{js,mjs,cjs,jsx,ts,tsx,mts,cts}!`,`scripts/**/*.{js,mjs,cjs,ts,mts,cts}`,`.remarkrc.{js,mjs,cjs,ts,mts,cts}`,`cspell.config.{js,mjs,cjs,ts,mts,cts}`,`eslint.config.{js,mjs,cjs,ts,mts,cts}`,`mdat.config.{js,mjs,cjs,ts,mts,cts}`,`prettier.config.{js,mjs,cjs,ts,mts,cts}`,`stylelint.config.{js,mjs,cjs,ts,mts,cts}`],ignoreBinaries:[`gh`,`ksc-cspell`,`ksc-eslint`,`ksc-knip`,`ksc-mdat`,`ksc-prettier`,`ksc-remark`,`ksc-repo`,`ksc-stylelint`,`ksc-typescript`,`op`],ignoreDependencies:[`@astrojs/check`,`@kitschpatrol/cspell-config`,`@kitschpatrol/dict-en-wiktionary`,`@kitschpatrol/eslint-config`,`@kitschpatrol/knip-config`,`@kitschpatrol/mdat-config`,`@kitschpatrol/prettier-config`,`@kitschpatrol/remark-config`,`@kitschpatrol/repo-config`,`@kitschpatrol/stylelint-config`,`@kitschpatrol/typescript-config`,`@prettier/plugin-php`,`@prettier/plugin-ruby`,`@prettier/plugin-xml`,`node-addon-api`,`node-gyp`,`prettier-plugin-packagejson`,`prettier-plugin-sh`,`prettier-plugin-tailwindcss`,`prettier-plugin-toml`,`remark-attribute-list`,`remark-directive`,`sharp`]},Lt={binaries:`Unlisted binary`,catalog:`Unused catalog entry`,classMembers:`Unused class member`,dependencies:`Unused dependency`,devDependencies:`Unused devDependency`,duplicates:`Duplicate export`,enumMembers:`Unused enum member`,exports:`Unused export`,files:`Unused file`,namespaceMembers:`Unused namespace member`,nsExports:`Unused namespace export`,nsTypes:`Unused namespace type`,optionalPeerDependencies:`Unused optional peer dependency`,types:`Unused exported type`,unlisted:`Unlisted dependency`,unresolved:`Unresolved import`};function Rt(e){return Array.isArray(e)?e.flatMap(e=>Array.isArray(e)?e:[e]):[]}function zt(e){let t;try{t=JSON.parse(e.stdout)}catch{return{diagnostics:[],unparsed:[...O(e.stdout),...O(e.stderr)]}}let n=[],r=t.issues??[];for(let t of r){let r=D(t.file,e.cwd);for(let[e,i]of Object.entries(t)){let t=Lt[e];if(t!==void 0)for(let a of Rt(i)){let i=typeof a==`string`?a:a.name,o=typeof a==`string`?{}:{column:a.col,line:a.line};n.push({...o,file:r,message:e===`files`?t:`${t}: ${i}`,rule:e,severity:`warning`,tool:`knip`})}}}return{diagnostics:n,unparsed:O(e.stderr)}}function Bt(){if(Fe()){let e=M(),t=N();if(e!==t){let n=s.relative(t,e);if(n!==``)return[`--workspace`,n.split(s.sep).join(`/`)]}}return[]}function Vt(){return{knip:It}}const Ht={commands:{init:{configFile:`knip.config.ts`,configPackageJson:Vt(),locationOptionFlag:!0},lint:{commands:[{collect:{optionFlags:[`--no-progress`,`--no-config-hints`,...Bt(),`--reporter`,`json`],parse:zt},cwdOverride:`workspace-root`,name:`knip`,optionFlags:[`--no-progress`,`--no-config-hints`,...Bt()]}],description:`Check for unused code and dependencies. ${J.packageRun} ${J.monorepoRun}`,positionalArgumentMode:`none`},printConfig:{commands:[K(`knip`)],description:`Print the effective Knip configuration. ${J.packageSearch} ${J.monorepoSearch}`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Knip shared configuration tools.`,logColor:`cyan`,logPrefix:`[Knip]`,name:`ksc-knip`,order:7};async function Ut(){return(await q(`mdat`))?.filepath}async function Wt(e){let t=`mdat`,n=await q(t);n!==void 0&&e.write(`Found ${t} readme configuration at "${n.filepath}"\n`);let r=k(await le()).split(`
|
|
11
|
+
`);for(let t of r)e.write(`${t}\n`);return 0}async function Gt(e){let t=j(),n=await Ut(),r=[];for(let i of t)r.push({cwdOverride:i,name:`mdat`,optionFlags:n===void 0||n===``?[`--format`]:[`--config`,n,`--format`],subcommands:[e]});return r}const Kt={commands:{fix:{commands:await Gt(`expand`),description:`Expand all Mdat content placeholders in your readme.md file(s). ${J.packageRun} ${J.monorepoRun}`,parallel:!0,positionalArgumentMode:`none`},init:{configFile:`mdat.config.ts`,configPackageJson:{mdat:{$import:`node_modules/@kitschpatrol/mdat-config/dist/index.js`}},locationOptionFlag:!0},lint:{commands:await Gt(`check`),description:`Validate that all Mdat content placeholders in your readme.md file(s) have been expanded and are up to date. ${J.packageRun} ${J.monorepoRun}`,parallel:!0,positionalArgumentMode:`none`},printConfig:{commands:[{execute:Wt,name:`mdat-config`}],description:`Print the effective Mdat configuration. ${J.packageSearch}. ${J.monorepoSearch}.`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Mdat shared configuration tools.`,logColor:`green`,logPrefix:`[Mdat Config]`,name:`ksc-mdat`,order:2},qt=/^\[warn\] (?<file>\S+)$/v,Jt=/^\[error\] (?<message>.+)$/v;function Yt(e){let t=[],n=[];for(let r of O(`${e.stdout}\n${e.stderr}`)){let i=qt.exec(r);if(i?.groups?.file!==void 0){t.push({file:D(i.groups.file,e.cwd),message:`File is not formatted with Prettier`,severity:`warning`,tool:`prettier`});continue}if(r.startsWith(`[warn] Code style issues found`))continue;let a=Jt.exec(r);if(a?.groups?.message!==void 0){t.push({message:a.groups.message,severity:`error`,tool:`prettier`});continue}n.push(r)}return{diagnostics:t,unparsed:n}}const Xt=[`--log-level=warn`,`--plugin=prettier-plugin-astro`,`--plugin=@prettier/plugin-php`,`--plugin=@prettier/plugin-ruby`,`--plugin=@prettier/plugin-xml`,`--plugin=prettier-plugin-jsdoc`,`--plugin=prettier-plugin-packagejson`,`--plugin=prettier-plugin-sh`,`--plugin=prettier-plugin-svelte`,`--plugin=prettier-plugin-toml`,`--plugin=prettier-plugin-tailwindcss`,`--ignore-path=${P(`.gitignore`)??`.gitignore`}`,`--ignore-path=${P(`.prettierignore`)??`.prettierignore`}`],Zt={commands:{fix:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`prettier`},collect:{parse:Yt},name:`prettier`,optionFlags:[...Xt,`--write`],receivePositionalArguments:!0}],description:`Format files according to your Prettier configuration. ${J.fileRun}`,positionalArgumentDefault:`.`,positionalArgumentMode:`optional`},init:{configFile:`prettier.config.ts`,configPackageJson:{prettier:`@kitschpatrol/prettier-config`},locationOptionFlag:!0},lint:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`prettier`},collect:{parse:Yt},name:`prettier`,optionFlags:[...Xt,`--check`],receivePositionalArguments:!0}],description:`Check that files are formatted according to your Prettier configuration. ${J.fileRun}`,positionalArgumentDefault:`.`,positionalArgumentMode:`optional`},printConfig:{commands:[K(`prettier`)],description:`Print the effective Prettier configuration. ${J.packageSearch}. ${J.monorepoSearch}.`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Prettier shared configuration tools.`,logColor:`blue`,logPrefix:`[Prettier]`,name:`ksc-prettier`,order:9},Qt={commands:{init:{configFile:`.remarkrc.js`,configPackageJson:{remarkConfig:{plugins:[`@kitschpatrol/remark-config`]}},locationOptionFlag:!0},printConfig:{commands:[K(`remark`)],description:`Print the effective Remark configuration. ${J.packageSearch} ${J.monorepoSearch}`,positionalArgumentMode:`none`}},description:`Kitschpatrol's Remark and Remark Lint shared configuration tools. (Actual linting and fixing is managed through @kitschpatrol/eslint-config.)`,logColor:`blue`,logPrefix:`[remarklint]`,name:`ksc-remark`,order:8},$t=[/Version 2\.0,?\s*January 2004/gv,/Version 1,?\s*February 1989/gv,/Version 2,?\s*June 1991/gv,/Version 3,?\s*29 June 2007/gv,/Version 2\.1,?\s*February 1999/gv,/Version 3,?\s*19 November 2007/gv,/Version 1\.0\s*-\s*August 17th,?\s*2003/gv,/Version 1\.1,?\s*March 2000/gv,/Version 1\.2,?\s*November 2002/gv,/Version 1\.3,?\s*3 November 2008/gv,/Version 1\.0\s*-\s*22 November 2005/gv,/Version 1\.1\s*-\s*26 February 2007/gv,/Version 2,?\s*December 2004/gv,/20 December 1996/gv,/December 20,?\s*1996/gv,/11 March 1996/gv,/28 March 2007/gv,/November 1,?\s*2008/gv,/August 1,?\s*2009/gv,/1 April 19\d{2}/gv,/Copyright \(c\) 2000-2006,?\s*The Perl Foundation/giv,/Copyright \(C\) (?:\d{4},?\s*)+Free Software Foundation/gv],en=[`node_modules/**`,`test/**`];function tn(e){let t=e;for(let e of $t)e.lastIndex=0,t=t.replace(e,e=>e.replaceAll(/\d/gv,`X`));return t}const nn=/(\d{4})\s*-\s*(\d{4})/v,rn=/(\d{4})/v;function an(e,t){let n=tn(e),r=nn,i=r.exec(n);if(i){let[,n,a]=i;if(Number(a)!==t){let a=`${n}-${t}`;return e.slice(0,i.index)+e.slice(i.index).replace(r,()=>a)}return e}let a=rn,o=a.exec(n);if(o){let[,n]=o;if(Number(n)!==t){let r=`${n}-${t}`;return e.slice(0,o.index)+e.slice(o.index).replace(a,()=>r)}return e}return e}async function on(e){let t=new Date().getFullYear(),n=[`**/license.txt`,`**/license`,...en.map(e=>`!${e}`)],r=await ue(n,{caseSensitiveMatch:!1,cwd:M(),followSymbolicLinks:!1,gitignore:!0}),i=[];for(let n of r)try{let r=await b.readFile(n,`utf8`),a=an(r,t);a!==r&&(i.push(n),e&&await b.writeFile(n,a,`utf8`))}catch(e){console.error(`Failed to process ${n}:`,e)}return i}async function sn(e,t=!1){let n=await on(t);if(n.length>0){e.write(`${t?`Fixed`:`Found`} ${n.length} license ${R(`file`,n.length)} with outdated copyright year:\n`);for(let t of n)e.write(` - ${t}\n`);return+!t}return 0}async function cn(e){return sn(e,!1)}async function ln(){let e=await on(!1);return{diagnostics:e.map(e=>({file:D(e,M()),message:`License file has an outdated copyright year`,severity:`error`,tool:`copyright-year`})),exitCode:+(e.length>0),unparsed:[]}}async function un(e){return sn(e,!0)}const dn=`pnpm-lock.yaml`;function fn(e){let t=N(),n=s.resolve(e);for(;;){if(r.existsSync(s.join(n,dn)))return n;if(n===t)break;let e=s.dirname(n);if(e===n)break;n=e}}function pn(e,t,n){let r=`${e}@${t}`;if(Object.hasOwn(n,r))return r;if(Object.hasOwn(n,t))return t}function mn(e,t){return e===void 0||e===``?t===void 0||t===``?void 0:t:t===void 0||t===``||w(e,t)?e:t}async function hn(e){let t=fn(e);if(t===void 0||t===``)throw Error(`${dn} not found at or above "${e}".`);let n=s.join(t,dn),r=await fe(t,{ignoreIncompatible:!1});if(!r?.importers)throw Error(`Lockfile at "${n}" is unreadable or missing importers.`);let i=r.packages??{},a,o,c={},l={};function u(e,t){let n,r=new Set;function a(e,t){if(t.startsWith(`link:`))return;let o=pn(e,t,i);if(o===void 0||o===``||r.has(o))return;r.add(o);let s=i[o];if(s===void 0)return;let c=s.engines?.node;if(c!==void 0&&c!==``){let e=de(c)?.version;e!==void 0&&e!==``&&(n===void 0||n===``||w(e,n))&&(n=e)}if(s.dependencies)for(let[e,t]of Object.entries(s.dependencies))a(e,t)}return a(e,t),n}function d(e,t){for(let[n,r]of Object.entries(e)){let e=u(n,typeof r==`string`?r:r.version);if(e!==void 0&&e!==``){let r=t?l:c;r[e]??=new Set,r[e].add(n);let i=t?o:a;(i===void 0||i===``||w(e,i))&&(t?o=e:a=e)}}}let f=s.relative(t,e),p=f===``?`.`:f,m=r.importers[p];m!==void 0&&(m.dependencies&&d(m.dependencies,!1),m.devDependencies&&d(m.devDependencies,!0));let h=mn(a,o),g=h===void 0?void 0:`>=${h}`;return{dependencies:a!==void 0&&a!==``?{topLevelCauses:[...c[a]??[]],version:`>=${a}`}:void 0,devDependencies:o!==void 0&&o!==``?{topLevelCauses:[...l[o]??[]],version:`>=${o}`}:void 0,lockfile:n,version:g}}function gn(e){let t=e.devEngines;if(t?.runtime)return(Array.isArray(t.runtime)?t.runtime:[t.runtime]).find(e=>e.name===`node`)?.version}function _n(e,t){let n=e.devEngines??{};if(n.runtime){if(Array.isArray(n.runtime)){let e=n.runtime.find(e=>e.name===`node`);e===void 0?n.runtime.push({name:`node`,version:t}):e.version=t}else n.runtime.name===`node`?n.runtime.version=t:n.runtime=[n.runtime,{name:`node`,version:t}]}else n.runtime={name:`node`,version:t};e.devEngines=n}function vn(e){let t=e.devEngines;if(t?.runtime){if(Array.isArray(t.runtime)){t.runtime=t.runtime.filter(e=>e.name!==`node`);let[e]=t.runtime;e===void 0?delete t.runtime:t.runtime.length===1&&(t.runtime=e)}else t.runtime.name===`node`&&delete t.runtime;Object.keys(t).length===0&&delete e.devEngines}}function Y(e){return e.length===0?``:` (from ${e.join(`, `)})`}async function yn(e,t){let n=s.join(t,`package.json`);if(!r.existsSync(n))return{issues:[],packageJsonPath:n};let i=r.readJsonSync(n),a=i.engines?.node,o=gn(i),c=await hn(t),l=c.dependencies?.version,u=c.dependencies?.topLevelCauses??[],d=c.version,f=c.devDependencies?.topLevelCauses??[],p=[];if(l!==void 0){if(a===void 0){if(p.push(`Missing engines.node — suggest setting to "${l}"${Y(u)}`),e){let e=i.engines??{};e.node=l,i.engines=e}}else{let t=C.minVersion(a),n=C.minVersion(l);t&&n&&C.lt(t,n)&&(p.push(`engines.node is "${a}" but production dependencies require at least "${l}"${Y(u)}`),e&&(i.engines.node=l))}}let m=(()=>{if(l!==void 0&&l!==``&&a!==void 0&&a!==``){let e=C.minVersion(l),t=C.minVersion(a);if(e&&t)return C.gt(e,t)?l:a}return l??a})(),h=m!==void 0&&m!==``?C.minVersion(m):void 0,g=d!==void 0&&d!==``?C.minVersion(d):void 0,_=g&&h&&C.gt(g,h);if(d!==void 0&&_){if(o===void 0)p.push(`devDependencies require a higher Node.js minimum (${d}) than engines.node (${m??`none`}) — suggest adding devEngines.runtime for node with version "${d}"${Y(f)}`),e&&_n(i,d);else{let t=C.minVersion(o);t&&C.lt(t,g)&&(p.push(`devEngines.runtime.version for node is "${o}" but all dependencies require at least "${d}"${Y(f)}`),e&&_n(i,d))}}else if(o!==void 0){let t=C.minVersion(o);t&&h&&C.lte(t,h)&&(p.push(`devEngines.runtime.version for node is redundant (engines.node already covers the requirement) — suggest removing`),e&&vn(i))}return e&&p.length>0&&(r.writeJsonSync(n,i,{spaces:` `}),await I(n)),{issues:p,packageJsonPath:n}}async function bn(e,t){let n=j(),r=0;for(let i of n){let{issues:n,packageJsonPath:a}=await yn(t,i);if(n.length>0){e.write(`${t?`Fixed`:`Found`} ${n.length} Node.js version ${R(`issue`,n.length)} in ${a}:\n`);for(let t of n)e.write(` - ${t}\n`);t||(r=1)}}return r}async function xn(){let e=j(),t=[];for(let n of e){let{issues:e,packageJsonPath:r}=await yn(!1,n);for(let n of e)t.push({file:D(r,process.cwd()),message:n,severity:`error`,tool:`node-version`})}return{diagnostics:t,exitCode:+(t.length>0),unparsed:[]}}async function Sn(e){let t=k(await hn(M())).split(`
|
|
12
|
+
`);for(let n of t)e.write(`${n}\n`);return 0}async function Cn(e){return bn(e,!1)}async function wn(e){return bn(e,!0)}const Tn={commands:{fix:{commands:[{execute:un,name:`copyright-year`},{execute:wn,name:`node-version`}],description:`Fix common issues like outdated copyright years in license files. ${J.packageRun} ${J.monorepoRun}`,positionalArgumentMode:`none`},init:{locationOptionFlag:!1},lint:{commands:[{collect:ln,execute:cn,name:`copyright-year`},{collect:xn,execute:Cn,name:`node-version`}],description:`Check the repo for common issues. ${J.packageRun} ${J.monorepoRun}`,positionalArgumentMode:`none`},printConfig:{commands:[{execute:Sn,name:`node-version`}],description:`Print minimum Node.js version constraints from the pnpm lockfile.`,positionalArgumentMode:`none`}},description:`Kitschpatrol's repository-related shared configuration tools.`,logColor:`gray`,logPrefix:`[Repo Config]`,name:`ksc-repo`,order:1},X=[`--ignore-path`,P(`.gitignore`)??`.gitignore`,`--allow-empty-input`],En=`**/*.{${[`css`,`scss`,`sass`,`svelte`,`html`,`astro`,`tsx`,`jsx`,`php`,`vue`].join(`,`)}}`;function Dn(e){let t;try{t=JSON.parse(e.stderr)}catch{return{diagnostics:[],unparsed:[...O(e.stdout),...O(e.stderr)]}}let n=[];for(let r of t){let t=D(r.source,e.cwd);for(let e of r.warnings){let r=e.rule===void 0?void 0:` (${e.rule})`,i=r!==void 0&&e.text.endsWith(r)?e.text.slice(0,-r.length):e.text;n.push({column:e.column,endColumn:e.endColumn,endLine:e.endLine,file:t,line:e.line,message:i,rule:e.rule,severity:e.severity===`warning`?`warning`:`error`,tool:`stylelint`})}let i=r.parseErrors??[];for(let e of i)n.push({column:e.column,file:t,line:e.line,message:e.text,rule:`parse-error`,severity:`error`,tool:`stylelint`})}return{diagnostics:n,unparsed:O(e.stdout)}}async function On(e,t){let n=`stylelint`,r=await q(n);if(r===void 0)return 1;let{filepath:i,isEmpty:a}=r;if(a)return e.write(`Configuration is empty.
|
|
13
|
+
`),0;e.write(`Found ${n} configuration at "${i}"\n`);let o,[c]=t;c===void 0?o=F(`package-dir`):(o=s.join(process.cwd(),c),e.write(`Showing config for file at "${o}"\n`));let l=k(await pe.resolveConfig(o)).split(`
|
|
14
|
+
`);for(let t of l)e.write(`${t}\n`);return 0}const kn={commands:{fix:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`stylelint`},collect:{optionFlags:[...X,`--fix`,`--formatter`,`json`],parse:Dn},name:`stylelint`,optionFlags:[...X,`--fix`],receivePositionalArguments:!0}],description:`Fix your project with Stylelint. ${J.fileRun}`,positionalArgumentDefault:En,positionalArgumentMode:`optional`},init:{configFile:`stylelint.config.js`,configPackageJson:{stylelint:{extends:`@kitschpatrol/stylelint-config`}},locationOptionFlag:!0},lint:{commands:[{cache:{flags:[`--cache`,`--cache-strategy`,`content`],name:`stylelint`},collect:{optionFlags:[...X,`--formatter`,`json`],parse:Dn},name:`stylelint`,optionFlags:X,receivePositionalArguments:!0}],description:`Lint your project with Stylelint. ${J.fileRun}`,positionalArgumentDefault:En,positionalArgumentMode:`optional`},printConfig:{commands:[{execute:On,name:`stylelint-config`}],description:`Print the effective Stylelint configuration. ${J.optionalFileRun}.`,positionalArgumentMode:`optional`}},description:`Kitschpatrol's Stylelint shared configuration tools.`,logColor:`greenBright`,logPrefix:`[Stylelint]`,name:`ksc-stylelint`,order:5},An=/^\s/v,jn=/\berror\b|\bfailed\b|\bfailure\b/iv;function Mn(e,t,n,r){return e.exitCode!==0&&t.every(({severity:e})=>e!==`error`)&&t.push({message:r.find(e=>jn.test(e))??`${n} exited with code ${e.exitCode} without a parseable error.`,severity:`error`,tool:n}),{diagnostics:t,unparsed:r}}function Nn(e){return An.test(e)}function Z(e){return typeof e==`object`&&!!e}function Pn(e){try{let t=JSON.parse(e);return typeof t==`string`?t:void 0}catch{return}}const Fn=/^(?<file>.+?):(?<line>\d+):(?<column>\d+) - (?<severity>error|warning|hint) (?<rule>[^:]+): (?<message>.*)$/v,In=/^(?:\d{2}:\d{2}:\d{2} )?(?:✘ )?\[(?<severity>ERROR|WARN)\](?: \[(?<label>[^\]]+)\])? (?<message>.*)$/v,Ln=/^\d{2}:\d{2}:\d{2}\s+\[(?!ERROR\]|WARN\])[^\]]+\]\s+/v,Rn=/^(?:Result \(\d+ files?\):|- \d+ (?:errors?|warnings?|hints?))$/v,zn=/^(?:\d+\s.*|\s*[~^]+)$/v;function Bn(e){try{let t=JSON.parse(e);return!Z(t)||typeof t.message!=`string`||t.level!==`debug`&&t.level!==`error`&&t.level!==`info`&&t.level!==`warn`?void 0:{...typeof t.label==`string`&&t.label.length>0&&{label:t.label},level:t.level,message:t.message}}catch{return}}function Vn(e){if(e.level===`error`||e.level===`warn`)return{...e.label!==void 0&&{rule:e.label},message:e.message,severity:e.level===`error`?`error`:`warning`,tool:`astro`}}function Hn(e,t){let n=Fn.exec(e);if(n?.groups===void 0)return;let{column:r,file:i,line:a,message:o,rule:s,severity:c}=n.groups;return{column:Number(r),file:D(i??``,t),line:Number(a),message:o??``,rule:s?.trim()??`unknown`,severity:c===`error`?`error`:c===`hint`?`info`:`warning`,tool:`astro`}}function Un(e){let t=In.exec(e);if(t?.groups===void 0)return;let{label:n,message:r,severity:i}=t.groups;return{...n!==void 0&&{rule:n},message:r??``,severity:i===`ERROR`?`error`:`warning`,tool:`astro`}}function Wn(e){let t=e.trimEnd();return Ln.test(t)||Rn.test(t)||t.startsWith(`Getting diagnostics for Astro files in `)}function Gn(e){let t=[],n=[];for(let r of O(`${e.stdout}\n${e.stderr}`)){let i=Bn(r);if(i!==void 0){let e=Vn(i);e!==void 0&&t.push(e);continue}let a=Hn(r,e.cwd)??Un(r);if(a!==void 0){t.push(a);continue}if(Wn(r)||zn.test(r))continue;let o=t.at(-1);if(o!==void 0&&Nn(r)){o.message+=`\n${r.trim()}`;continue}n.push(r)}return Mn(e,t,`astro`,n)}const Kn=/^(?:Loading svelte-check in workspace: |Getting Svelte diagnostics\.\.\.|svelte-check found 0 errors and 0 warnings$)/v,qn=/^\d+ (?:START "|COMPLETED \d+ FILES 0 ERRORS 0 WARNINGS 0 FILES_WITH_PROBLEMS$)/v,Jn=/^\d+ (?:START "|COMPLETED \d+ FILES \d+ ERRORS \d+ WARNINGS \d+ FILES_WITH_PROBLEMS$)/v,Yn=/^\d+ (?<severity>ERROR|WARNING) (?<file>"(?:\\.|[^"\\])*") (?<line>\d+):(?<column>\d+) (?<message>"(?:\\.|[^"\\])*")$/v,Xn=/^\d+ FAILURE (?<message>.+)$/v,Zn=/^\d+\s/v;function Qn(e,t){let n=typeof e==`string`&&e.length>0?e:void 0,r=typeof t==`string`||typeof t==`number`?String(t):void 0;return n!==void 0&&r!==void 0?`${n}(${r})`:n??r}function $n(e,t){let n=e.indexOf(`{`);if(!(n<=0||!Zn.test(e)))try{let r=JSON.parse(e.slice(n));if(!Z(r)||r.type!==`ERROR`&&r.type!==`WARNING`||typeof r.filename!=`string`||typeof r.message!=`string`||!Z(r.start)||typeof r.start.line!=`number`||typeof r.start.character!=`number`)return;let i=Z(r.end)?r.end:void 0,a=Qn(r.source,r.code);return{column:r.start.character+1,...i!==void 0&&typeof i.character==`number`&&{endColumn:i.character+1},...i!==void 0&&typeof i.line==`number`&&{endLine:i.line+1},file:D(r.filename,t),line:r.start.line+1,message:r.message,...a!==void 0&&{rule:a},severity:r.type===`ERROR`?`error`:`warning`,tool:`svelte-check`}}catch{return}}function er(e,t){let n=Yn.exec(e);if(n?.groups===void 0)return;let{column:r,file:i,line:a,message:o,severity:s}=n.groups,c=Pn(i??``),l=Pn(o??``);if(c!==void 0&&l!==void 0)return{column:Number(r),file:D(c,t),line:Number(a),message:l,severity:s===`ERROR`?`error`:`warning`,tool:`svelte-check`}}function tr(e){let t=Xn.exec(e);if(t?.groups===void 0)return;let n=t.groups.message??``;return{message:Pn(n)??n,severity:`error`,tool:`svelte-check`}}function nr(e){return Kn.test(e)||qn.test(e)}function rr(e){let t=[],n=[];for(let r of O(`${e.stdout}\n${e.stderr}`)){let i=$n(r,e.cwd)??er(r,e.cwd)??tr(r);if(i!==void 0){t.push(i);continue}!Jn.test(r)&&!nr(r)&&n.push(r)}return Mn(e,t,`svelte-check`,n)}const ir=/^(?<file>.+?)\((?<line>\d+),(?<column>\d+)\): (?<severity>error|warning) (?<code>TS\d+): (?<message>.*)$/v,ar=/^(?<severity>error|warning) (?<code>TS\d+): (?<message>.*)$/v;function or(e){let t=[],n=[];for(let r of O(`${e.stdout}\n${e.stderr}`)){let i=ir.exec(r);if(i?.groups!==void 0){let{code:n,column:r,file:a,line:o,message:s,severity:c}=i.groups;t.push({column:Number(r),file:D(a??``,e.cwd),line:Number(o),message:s??``,rule:n,severity:c===`warning`?`warning`:`error`,tool:`tsc`});continue}let a=ar.exec(r);if(a?.groups!==void 0){let{code:e,message:n,severity:r}=a.groups;t.push({message:n??``,rule:e,severity:r===`warning`?`warning`:`error`,tool:`tsc`});continue}let o=t.at(-1);if(o!==void 0&&Nn(r)){o.message+=`\n${r.trim()}`;continue}n.push(r)}return Mn(e,t,`tsc`,n)}async function sr(e){let t=await r.readJson(s.join(e,`package.json`));return new Set([...Object.keys(t.dependencies??{}),...Object.keys(t.devDependencies??{})])}function cr(e,t=`package-dir`){let n=e.has(`@astrojs/check`),r=e.has(`svelte-check`);if(n||r){let e=[];if(n&&e.push({collect:{optionFlags:[`--json`],parse:Gn},cwdOverride:t,name:`astro`,outputFilter:Wn,subcommands:[`check`]}),r){let r=n?[]:[`--tsconfig`,`./tsconfig.json`];e.push({collect:{optionFlags:[...r,`--output`,`machine-verbose`],parse:rr},cwdOverride:t,name:`svelte-check`,optionFlags:r,outputFilter:nr})}return e}return[{collect:{parse:or},cwdOverride:t,name:`tsc`,optionFlags:[`--noEmit`]}]}function lr(e){let t=e.some(({hasTypeScriptConfig:e})=>e);return e.flatMap(({dependencies:e,directory:n,hasTypeScriptConfig:r},i)=>{let a=e.has(`@astrojs/check`)||e.has(`svelte-check`);return r||a||!t&&i===0?cr(e,n):[]})}async function ur(){let e=j();return lr(await Promise.all(e.map(async e=>{let[t,n]=await Promise.all([sr(e),r.pathExists(s.join(e,`tsconfig.json`))]);return{dependencies:t,directory:e,hasTypeScriptConfig:n}})))}const Q=[Ft,Mt,Ht,Kt,Zt,Qt,Tn,kn,{commands:{init:{locationOptionFlag:!1},lint:{commands:ur,description:`Run type checking on your project. ${J.packageRun} ${J.monorepoRun}`,positionalArgumentMode:`none`,showResolvedCommands:!0},printConfig:{commands:[{name:`tsc`,optionFlags:[`--showConfig`],prettyJsonOutput:!0}],description:`Print the TypeScript configuration for the project. ${J.packageSearch} ${J.monorepoSearch}`,positionalArgumentMode:`none`}},description:`Kitschpatrol's TypeScript shared configuration tools.`,logColor:`blueBright`,logPrefix:`[TypeScript Config]`,name:`ksc-typescript`,order:3}],dr={"ksc-cspell":4,"ksc-eslint":2,"ksc-knip":6,"ksc-mdat":1,"ksc-prettier":5,"ksc-repo":0,"ksc-stylelint":3,"ksc-typescript":6};function $(e,t){t.sort((e,t)=>e.order-t.order);let n=[];for(let r of t)r.commands[e]!==void 0&&n.push({definition:r,effectiveKey:e});if(e===`fix`)for(let e of t)e.commands.fix===void 0&&e.commands.lint!==void 0&&n.push({definition:e,effectiveKey:`lint`});let r=[];for(let{definition:t,effectiveKey:i}of n){let n=i===`lint`?t.commands.lint:i===`fix`?t.commands.fix:void 0;if(n!==void 0&&(e===`lint`||e===`fix`)){let a={commands:n.commands,kind:`group`,logColor:t.logColor,logPrefix:t.logPrefix,name:t.name,parallel:n.parallel,positionalArgumentDefault:n.positionalArgumentDefault,positionalArgumentMode:n.positionalArgumentMode,showResolvedCommands:n.showResolvedCommands,stage:e===`fix`?dr[t.name]??7:0,subcommand:Be(i),verbose:t.verbose};r.push(a);continue}let a={name:t.name,...i===`init`?{receiveOptionFlags:t.commands.init?.locationOptionFlag??!1}:{receivePositionalArguments:t.commands[i]?.positionalArgumentMode!==`none`},subcommands:[Be(i)]};r.push(a)}return r}await ut({commands:{fix:{commands:$(`fix`,Q),description:`Fix your project with multiple tools in one go. Tools without auto-fixes run their checks afterward, so remaining issues match a subsequent lint. ${J.multiArgumentCaveat}`,parallel:!0,positionalArgumentMode:`optional`},init:{commands:$(`init`,Q),description:`Initialize configuration files for the entire suite of @kitschpatrol/shared-config tools. ${J.multiOptionCaveat}`,locationOptionFlag:!0},lint:{commands:$(`lint`,Q),description:`Lint your project with multiple tools in one go. ${J.multiArgumentCaveat}`,parallel:!0,positionalArgumentMode:`optional`},printConfig:{commands:$(`printConfig`,Q),description:`Print aggregated tool configuration data. ${J.multiArgumentCaveat}`,positionalArgumentMode:`optional`}},description:`Run aggregated @kitschpatrol/shared-config commands.`,logColor:`yellow`,logPrefix:`🔬`,name:`ksc`,order:0,showSummary:!0,verbose:!0});export{};
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ import { FileType, FileType as FileType$1 } from "@kitschpatrol/prettier-config"
|
|
|
12
12
|
*
|
|
13
13
|
* @returns The fixed source string.
|
|
14
14
|
*/
|
|
15
|
-
declare function fix(source: string, fileType?: FileType$1): Promise<string>;
|
|
15
|
+
export declare function fix(source: string, fileType?: FileType$1): Promise<string>;
|
|
16
16
|
/**
|
|
17
17
|
* Fix a file in place by running all shared-config tools in sequence: Mdat →
|
|
18
18
|
* ESLint → Stylelint → Prettier. Mdat only runs for Markdown files. ESLint and
|
|
@@ -21,11 +21,11 @@ declare function fix(source: string, fileType?: FileType$1): Promise<string>;
|
|
|
21
21
|
*
|
|
22
22
|
* @param filePath - Path to the file to fix.
|
|
23
23
|
*/
|
|
24
|
-
declare function fixFile(filePath: string): Promise<void>;
|
|
24
|
+
export declare function fixFile(filePath: string): Promise<void>;
|
|
25
25
|
/**
|
|
26
26
|
* Clear all cached tool modules and instances. Subsequent calls to `fix` or
|
|
27
27
|
* `fixFile` will re-import all tools.
|
|
28
28
|
*/
|
|
29
|
-
declare function clearCache(): void;
|
|
29
|
+
export declare function clearCache(): void;
|
|
30
30
|
//#endregion
|
|
31
|
-
export {
|
|
31
|
+
export type { FileType };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kitschpatrol/shared-config",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.8.0",
|
|
4
4
|
"description": "A collection of shared configurations, linters, and formatting tools for TypeScript projects. All managed as a single dependency. All invoked via a single CLI command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"shared-config",
|
|
@@ -53,38 +53,38 @@
|
|
|
53
53
|
"init/*"
|
|
54
54
|
],
|
|
55
55
|
"dependencies": {
|
|
56
|
+
"@kitschpatrol/cspell-config": "8.8.0",
|
|
57
|
+
"@kitschpatrol/eslint-config": "8.8.0",
|
|
58
|
+
"@kitschpatrol/knip-config": "8.8.0",
|
|
59
|
+
"@kitschpatrol/mdat-config": "8.8.0",
|
|
60
|
+
"@kitschpatrol/prettier-config": "8.8.0",
|
|
61
|
+
"@kitschpatrol/remark-config": "8.8.0",
|
|
62
|
+
"@kitschpatrol/repo-config": "8.8.0",
|
|
63
|
+
"@kitschpatrol/stylelint-config": "8.8.0",
|
|
64
|
+
"@kitschpatrol/typescript-config": "8.8.0",
|
|
56
65
|
"@pinojs/json-colorizer": "^4.0.0",
|
|
57
|
-
"@pnpm/lockfile.fs": "^1100.
|
|
58
|
-
"cosmiconfig": "^
|
|
66
|
+
"@pnpm/lockfile.fs": "^1100.2.6",
|
|
67
|
+
"cosmiconfig": "^10.0.1",
|
|
59
68
|
"cosmiconfig-typescript-loader": "^6.3.0",
|
|
60
|
-
"cspell": "^10.
|
|
61
|
-
"cspell-config-lib": "^10.
|
|
62
|
-
"cspell-lib": "^10.
|
|
69
|
+
"cspell": "^10.2.2",
|
|
70
|
+
"cspell-config-lib": "^10.2.2",
|
|
71
|
+
"cspell-lib": "^10.2.2",
|
|
63
72
|
"decircular": "^1.0.0",
|
|
64
73
|
"deepmerge": "^4.3.1",
|
|
65
|
-
"deepmerge-ts": "^
|
|
74
|
+
"deepmerge-ts": "^8.0.2",
|
|
66
75
|
"execa": "^10.0.1",
|
|
67
76
|
"find-workspaces": "^0.3.1",
|
|
68
77
|
"fs-extra": "^11.4.0",
|
|
69
|
-
"globby": "^16.2.
|
|
78
|
+
"globby": "^16.2.4",
|
|
70
79
|
"json-stringify-pretty-compact": "^4.0.0",
|
|
71
|
-
"magicast": "^0.5.
|
|
72
|
-
"mdat": "^3.
|
|
80
|
+
"magicast": "^0.5.4",
|
|
81
|
+
"mdat": "^3.2.0",
|
|
73
82
|
"package-up": "^5.0.0",
|
|
74
83
|
"picocolors": "^1.1.1",
|
|
75
84
|
"prettier": "^3.9.6",
|
|
76
85
|
"semver": "^7.8.5",
|
|
77
|
-
"stylelint": "^17.
|
|
78
|
-
"yargs": "^18.1.0"
|
|
79
|
-
"@kitschpatrol/knip-config": "8.6.0",
|
|
80
|
-
"@kitschpatrol/cspell-config": "8.6.0",
|
|
81
|
-
"@kitschpatrol/eslint-config": "8.6.0",
|
|
82
|
-
"@kitschpatrol/mdat-config": "8.6.0",
|
|
83
|
-
"@kitschpatrol/repo-config": "8.6.0",
|
|
84
|
-
"@kitschpatrol/remark-config": "8.6.0",
|
|
85
|
-
"@kitschpatrol/prettier-config": "8.6.0",
|
|
86
|
-
"@kitschpatrol/stylelint-config": "8.6.0",
|
|
87
|
-
"@kitschpatrol/typescript-config": "8.6.0"
|
|
86
|
+
"stylelint": "^17.15.0",
|
|
87
|
+
"yargs": "^18.1.0"
|
|
88
88
|
},
|
|
89
89
|
"engines": {
|
|
90
90
|
"node": "^24.16.0 || >=26.3.0"
|
|
@@ -95,6 +95,6 @@
|
|
|
95
95
|
"scripts": {
|
|
96
96
|
"build": "tsdown",
|
|
97
97
|
"cli": "node ./bin/cli.js",
|
|
98
|
-
"test": "vitest run"
|
|
98
|
+
"test": "vitest run --config ../../vitest.config.ts"
|
|
99
99
|
}
|
|
100
100
|
}
|
package/readme.md
CHANGED
|
@@ -195,7 +195,7 @@ pnpm --package=@kitschpatrol/repo-config dlx ksc-repo init && pnpm i && pnpm add
|
|
|
195
195
|
gh secret set PERSONAL_ACCESS_TOKEN --app actions --body $(op read 'op://Personal/GitHub Mika/PERSONAL_ACCESS_TOKEN')
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
See the [@kitschpatrol/repo-config readme](/packages/repo-config/readme.md#github-configuration) for more details.
|
|
198
|
+
See the [@kitschpatrol/repo-config readme](https://github.com/kitschpatrol/shared-config/blob/main/packages/repo-config/readme.md#github-configuration) for more details.
|
|
199
199
|
|
|
200
200
|
## Usage
|
|
201
201
|
|