ts-morph-react 1.0.4 → 1.0.5
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.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {SyntaxKind,Node,StructureKind,VariableDeclarationKind,ImportDeclaration,ts}from'ts-morph';import
|
|
2
|
-
`):
|
|
1
|
+
import {SyntaxKind,Node,StructureKind,VariableDeclarationKind,ImportDeclaration,ts}from'ts-morph';import k from'@stylistic/eslint-plugin';import {ESLint}from'eslint';import {dirname}from'path';import C from'typescript-eslint';import {format}from'prettier';var f=["ComponentProps","ComponentPropsWithRef","ComponentPropsWithoutRef","FC","FunctionComponent","ReactNode","ReactElement","JSX","RefObject","MutableRefObject","CSSProperties","HTMLAttributes","SVGAttributes","DOMAttributes","PropsWithChildren","PropsWithRef"],y=["useState","useEffect","useCallback","useMemo","useRef","useContext","useReducer","useImperativeHandle","useLayoutEffect","useDebugValue","useTransition","useDeferredValue","useId","useSyncExternalStore"],E=["forwardRef","memo","lazy","createContext","createElement","cloneElement","isValidElement","Children","Fragment","StrictMode","Suspense"];function G(e){try{let t=e.getInitializer?.();if(!t)return !1;let n=t.getDescendantsOfKind?.(SyntaxKind.JsxElement)||[],r=t.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement)||[];if(n.length>0||r.length>0)return !0;if(Node.isArrowFunction(t)){let o=t.getBody?.();if(o){let i=o.getDescendantsOfKind?.(SyntaxKind.JsxElement)||[],s=o.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement)||[];return i.length>0||s.length>0}}return !1}catch{return false}}function Y(e){try{let t=e.getInitializer?.();if(!t)return !1;let n=t.getText?.();return !!(n?.includes("forwardRef(")||n?.includes("React.forwardRef("))}catch{return false}}function l(e){try{let t=e.getDescendantsOfKind?.(SyntaxKind.JsxElement)||[],n=e.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement)||[];return t.length>0||n.length>0}catch{return false}}var S={match:({config:e})=>e.enforceDirectExports,transform:async({sourceFile:e})=>{e.getFunctions().forEach(t=>{if(!l(t)||t.isExported()&&t.hasExportKeyword())return;let n=t.getName(),r=false;e.getExportDeclarations().forEach(o=>{o.getNamedExports().some(s=>s.getName()===n)&&(r=true);}),r&&(t.setIsExported(true),e.getExportDeclarations().forEach(o=>{let s=o.getNamedExports().filter(a=>a.getName()===n);s.length>0&&(s.forEach(a=>{a.remove();}),o.getNamedExports().length===0&&o.remove());}));});}};var h={match:({config:e})=>e.enforceEslint,transform:async({sourceFile:e,config:t})=>{let n=e.getFilePath(),r=dirname(n),o=new ESLint({fix:true,cwd:r,overrideConfigFile:true,overrideConfig:[{basePath:".",languageOptions:{parser:C.parser,ecmaVersion:2020,sourceType:"module",parserOptions:{ecmaFeatures:{jsx:true}}},files:["**/*.{ts,tsx,js,jsx}"],plugins:{"@stylistic":k,"@typescript-eslint":C.plugin},rules:t.eslint}]}),[i]=await o.lintText(e.getFullText(),{filePath:n});i?.output&&e.replaceWithText(i.output);}};var b={match:({config:e})=>e.enforceFormat,transform:async({sourceFile:e,config:t})=>{e.formatText(t.format),e.organizeImports(t.format,{organizeImportsTypeOrder:"first"});}};var N={match:({config:e})=>e.enforceFunctionComponent,transform:async({sourceFile:e,config:{enforceDirectExports:t}})=>{e.getFunctions().some(r=>{if(!l(r))return false;let o=r.getName();if(!o)return false;let i=r.isExported(),s=false;e.getExportDeclarations().forEach(c=>{c.getNamedExports().some(x=>x.getName()===o)&&(s=true);});let a=t&&(i||s),u=r.getParameters()[0],T=(u.getTypeNode()??u.getType()).getText();u.removeType();let v=T==="any"?"React.FunctionComponent":`React.FunctionComponent<${T}>`,L=r.getChildIndex();return e.insertVariableStatement(L,{declarations:[{name:o,type:v,initializer:c=>{c.write("(").write(r.getParameters().map(K=>K.getText()).join(", ")).write(")");let g=r.getReturnTypeNode()?.getText();g&&c.write(`: ${g}`),c.write(" => ");let x=r.getBody()?.getText()??"{}";c.block(()=>{c.write(x.replace(/^{|}$/g,"").trim());});}}],declarationKind:VariableDeclarationKind.Const,kind:StructureKind.VariableStatement,isExported:a}),r.remove(),true})&&(e.getImportDeclarations().find(o=>o.getModuleSpecifier().getLiteralValue()==="react")||e.addImportDeclaration({moduleSpecifier:"react",namespaceImport:"React"}));}};var I=(r=>(r[r.IGNORE=0]="IGNORE",r[r.COMBINE=1]="COMBINE",r[r.SEPARATE=2]="SEPARATE",r))(I||{});function P(e,t){let n=[],r=e.getChildSyntaxListOrThrow();for(let o=r.getChildCount()-1;o>0;o-=1){let i=r.getChildAtIndex(o-1),s=r.getChildAtIndex(o),a=t(s,i,s.getLeadingTriviaWidth());n.push({range:[i.getEnd(),s.getStart()],intent:a});}n.forEach(({range:o,intent:i})=>{i===1?e.replaceText(o,`
|
|
2
|
+
`):i===2&&e.replaceText(o,`
|
|
3
3
|
|
|
4
|
-
`);});}var w={match:({config:e})=>e.enforceLineSeparation,transform:async({sourceFile:e})=>{P(e,(
|
|
4
|
+
`);});}var w={match:({config:e})=>e.enforceLineSeparation,transform:async({sourceFile:e})=>{P(e,(t,n)=>n instanceof ImportDeclaration&&t instanceof ImportDeclaration?1:2);}};var D={match:({config:e})=>e.enforceNamedImports,transform:async({sourceFile:e})=>{let t=e.getImportDeclarations().find(o=>o.getModuleSpecifier().getLiteralValue()==="react"),n=new Set,r=new Set;if(e.forEachDescendant(o=>{if(o.getKind()===SyntaxKind.TypeReference){let i=o.asKind(SyntaxKind.TypeReference);if(!i)return;let s=i.getTypeName();if(Node.isQualifiedName(s)){let a=s.getLeft().getText(),p=s.getRight().getText();a==="React"&&f.includes(p)&&(s.replaceWithText(p),n.add(p));}}if(o.getKind()===SyntaxKind.PropertyAccessExpression){let i=o.asKind(SyntaxKind.PropertyAccessExpression);if(!i)return;let s=i.getExpression(),a=i.getName();s.getText()==="React"&&(y.includes(a)||E.includes(a)||f.includes(a))&&(i.replaceWithText(a),f.includes(a)?n.add(a):(y.includes(a)||E.includes(a))&&r.add(a));}}),t&&(n.size>0||r.size>0)){t.removeNamespaceImport();let o=Array.from(n).sort();for(let s of o)t.addNamedImport({name:s,isTypeOnly:true});let i=Array.from(r).sort();for(let s of i)t.addNamedImport(s);}}};var A={match:({config:e})=>e.enforcePrettier,transform:async({sourceFile:e,config:t})=>{let n=await format(e.getText(),{parser:"babel-ts",...t.prettier,embeddedLanguageFormatting:"auto",quoteProps:"consistent",trailingComma:"none",singleQuote:true,jsxSingleQuote:true});e.replaceWithText(n);}};function F({eslint:e,format:t,prettier:n,...r}={}){return {enforceDirectExports:false,enforceFunctionComponent:false,enforceNamedImports:false,enforceFormat:false,enforceLineSeparation:false,enforceEslint:false,enforcePrettier:false,eslint:{"@stylistic/space-in-parens":["error"],"@stylistic/comma-spacing":["error"],"@stylistic/no-multi-spaces":["error"],"@stylistic/no-trailing-spaces":["error"],"@stylistic/no-whitespace-before-property":["error"],"@stylistic/array-bracket-newline":["error","consistent"],"@stylistic/array-bracket-spacing":["error"],"@stylistic/arrow-spacing":["error"],"@stylistic/arrow-parens":["error","always"],"@stylistic/block-spacing":["error","always"],"@stylistic/brace-style":["error","1tbs",{allowSingleLine:true}],"@stylistic/comma-dangle":["error","never"],"@stylistic/key-spacing":["error"],"@stylistic/keyword-spacing":["error"],"@stylistic/member-delimiter-style":["error",{multiline:{delimiter:"none"}}],"@stylistic/no-extra-semi":["error"],"@stylistic/indent":["error",2],"@stylistic/no-multiple-empty-lines":["error",{max:1,maxEOF:0,maxBOF:0}],"@stylistic/object-curly-spacing":["error","always"],"@stylistic/quotes":["error","single"],"@stylistic/semi":["error","never"],"@stylistic/space-before-blocks":["error","always"],"@stylistic/space-before-function-paren":["error",{anonymous:"always",named:"never",asyncArrow:"always"}],"@typescript-eslint/adjacent-overload-signatures":"error","@typescript-eslint/no-extra-non-null-assertion":"error","@typescript-eslint/no-misused-new":"error","@typescript-eslint/no-non-null-asserted-optional-chain":"error","@typescript-eslint/no-shadow":"error","@typescript-eslint/prefer-for-of":"error",...e},format:{indentSize:2,convertTabsToSpaces:true,ensureNewLineAtEndOfFile:true,indentStyle:ts.IndentStyle.Block,semicolons:ts.SemicolonPreference.Remove,trimTrailingWhitespace:true,...t},prettier:{semi:false,singleQuote:true,jsxSingleQuote:true,arrowParens:"always",bracketSameLine:true,objectWrap:"collapse",printWidth:120,...n},...r}}var _=[S,N,D,w,b,A,h];async function Ae(e,t={}){let n={config:F(t),sourceFile:e};for(let r of _)r.match(n)&&await r.transform(n);}export{E as REACT_APIS,y as REACT_HOOKS,f as REACT_TYPES,I as SeparationIntent,S as enforceDirectExports,h as enforceEslint,b as enforceFormat,N as enforceFunctionComponent,w as enforceLineSeparation,D as enforceNamedImports,A as enforcePrettier,P as enforeLineSeparation,Y as isForwardRefComponent,l as isFunctionComponent,G as isReactComponent,F as mergeConfig,Ae as transform,_ as transformers};//# sourceMappingURL=index.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/react.ts","../src/transformers/enforceDirectExports.ts","../src/transformers/enforceEslint.ts","../src/transformers/enforceFormat.ts","../src/transformers/enforceFunctionComponent.ts","../src/utils/trivia.ts","../src/transformers/enforceLineSeparation.ts","../src/transformers/enforceNamedImports.ts","../src/transformers/enforcePrettier.ts","../src/utils/config.ts","../src/utils/transform.ts"],"names":["REACT_TYPES","REACT_HOOKS","REACT_APIS","isReactComponent","varDecl","initializer","descendants","SyntaxKind","selfClosing","Node","body","bodyDescendants","bodySelfClosing","isForwardRefComponent","text","isFunctionComponent","func","enforceDirectExports","config","sourceFile","funcName","isExportedViaSeparateStatement","exportDecl","exp","matchingExports","namedExport","enforceEslint","filePath","cwd","dirname","eslint","ESLint","tseslint","stylistic","result","enforceFormat","enforceFunctionComponent","isExportedViaKeyword","isExported","param","typeText","typeAnnotation","index","writer","p","returnType","bodyText","VariableDeclarationKind","StructureKind","SeparationIntent","enforeLineSeparation","predicate","instructions","syntaxList","prev","cur","intent","range","enforceLineSeparation","ImportDeclaration","enforceNamedImports","reactImport","importDeclaration","typeImportsNeeded","valueImportsNeeded","node","typeRef","typeName","left","right","propAccess","expr","name","typeImportsArray","valueImportsArray","valueName","enforcePrettier","formattedText","format","mergeConfig","prettier","ts","transformers","transform","params","transformer"],"mappings":"gQAEO,IAAMA,CAAAA,CAAc,CACzB,gBAAA,CACA,uBAAA,CACA,2BACA,IAAA,CACA,mBAAA,CACA,YACA,cAAA,CACA,KAAA,CACA,YACA,kBAAA,CACA,eAAA,CACA,iBACA,eAAA,CACA,eAAA,CACA,oBACA,cACF,CAAA,CAEaC,EAAc,CACzB,UAAA,CACA,YACA,aAAA,CACA,SAAA,CACA,SACA,YAAA,CACA,YAAA,CACA,sBACA,iBAAA,CACA,eAAA,CACA,gBACA,kBAAA,CACA,OAAA,CACA,sBACF,CAAA,CAEaC,CAAAA,CAAa,CACxB,YAAA,CACA,MAAA,CACA,OACA,eAAA,CACA,eAAA,CACA,eACA,gBAAA,CACA,UAAA,CACA,WACA,YAAA,CACA,UACF,EAEO,SAASC,CAAAA,CAAiBC,EAAuC,CACtE,GAAI,CACF,IAAMC,CAAAA,CAAcD,EAAQ,cAAA,IAAiB,CAC7C,GAAI,CAACC,CAAAA,CAAa,OAAO,CAAA,CAAA,CAGzB,IAAMC,EAAcD,CAAAA,CAAY,oBAAA,GAAuBE,WAAW,UAAU,CAAA,EAAK,EAAC,CAC5EC,CAAAA,CAAcH,EAAY,oBAAA,GAAuBE,UAAAA,CAAW,qBAAqB,CAAA,EAAK,GAE5F,GAAID,CAAAA,CAAY,MAAA,CAAS,CAAA,EAAKE,CAAAA,CAAY,MAAA,CAAS,EAAK,OAAO,CAAA,CAAA,CAG/D,GAAIC,IAAAA,CAAK,eAAA,CAAgBJ,CAAW,CAAA,CAAG,CACrC,IAAMK,CAAAA,CAAOL,CAAAA,CAAY,WAAU,CACnC,GAAIK,EAAM,CACR,IAAMC,EAAkBD,CAAAA,CAAK,oBAAA,GAAuBH,WAAW,UAAU,CAAA,EAAK,EAAC,CACzEK,CAAAA,CAAkBF,EAAK,oBAAA,GAAuBH,UAAAA,CAAW,qBAAqB,CAAA,EAAK,GACzF,OAAOI,CAAAA,CAAgB,OAAS,CAAA,EAAKC,CAAAA,CAAgB,OAAS,CAChE,CACF,CAEA,OAAO,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAEO,SAASC,EAAsBT,CAAAA,CAAuC,CAC3E,GAAI,CACF,IAAMC,EAAcD,CAAAA,CAAQ,cAAA,KAC5B,GAAI,CAACC,EAAa,OAAO,CAAA,CAAA,CAEzB,IAAMS,CAAAA,CAAOT,CAAAA,CAAY,WAAU,CACnC,OAAO,GAAAS,CAAAA,EAAM,QAAA,CAAS,aAAa,CAAA,EAAKA,CAAAA,EAAM,SAAS,mBAAmB,CAAA,CAC5E,MAAQ,CACN,OAAO,MACT,CACF,CAEO,SAASC,CAAAA,CAAoBC,CAAAA,CAAoC,CACtE,GAAI,CACF,IAAMV,CAAAA,CAAcU,CAAAA,CAAK,oBAAA,GAAuBT,WAAW,UAAU,CAAA,EAAK,EAAC,CACrEC,CAAAA,CAAcQ,EAAK,oBAAA,GAAuBT,UAAAA,CAAW,qBAAqB,CAAA,EAAK,GACrF,OAAID,CAAAA,CAAY,OAAS,CAAA,EAAKE,CAAAA,CAAY,OAAS,CAErD,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CCjGO,IAAMS,EAAoC,CAC/C,KAAA,CAAO,CAAC,CAAE,MAAA,CAAAC,CAAO,CAAA,GAAMA,CAAAA,CAAO,qBAC9B,SAAA,CAAW,MAAO,CAAE,UAAA,CAAAC,CAAW,IAAM,CAEnCA,CAAAA,CAAW,cAAa,CAAE,OAAA,CAASH,GAAS,CAK1C,GAHI,CAACD,CAAAA,CAAoBC,CAAI,GAGzBA,CAAAA,CAAK,UAAA,IAAgBA,CAAAA,CAAK,gBAAA,GAAsB,OAEpD,IAAMI,EAAWJ,CAAAA,CAAK,OAAA,GAGlBK,CAAAA,CAAiC,KAAA,CACrCF,EAAW,qBAAA,EAAsB,CAAE,QAASG,CAAAA,EAAe,CACpCA,EAAW,eAAA,EAAgB,CAC/B,KAAMC,CAAAA,EAAQA,CAAAA,CAAI,SAAQ,GAAMH,CAAQ,IACvDC,CAAAA,CAAiC,IAAA,EAErC,CAAC,CAAA,CAGGA,CAAAA,GAEFL,EAAK,aAAA,CAAc,IAAI,CAAA,CAGvBG,CAAAA,CAAW,qBAAA,EAAsB,CAAE,QAASG,CAAAA,EAAe,CAEzD,IAAME,CAAAA,CADeF,CAAAA,CAAW,iBAAgB,CACX,MAAA,CAAQG,GAAgBA,CAAAA,CAAY,OAAA,KAAcL,CAAQ,CAAA,CAC3FI,EAAgB,MAAA,CAAS,CAAA,GAC3BA,EAAgB,OAAA,CAASC,CAAAA,EAAgB,CAAEA,CAAAA,CAAY,MAAA,GAAS,CAAC,CAAA,CAC7DH,EAAW,eAAA,EAAgB,CAAE,SAAW,CAAA,EAAKA,CAAAA,CAAW,QAAO,EAEvE,CAAC,GAEL,CAAC,EACH,CACF,MCpCaI,CAAAA,CAA6B,CACxC,MAAO,CAAC,CAAE,OAAAR,CAAO,CAAA,GAAMA,EAAO,aAAA,CAC9B,SAAA,CAAW,MAAO,CAAE,UAAA,CAAAC,EAAY,MAAA,CAAAD,CAAO,IAAM,CAC3C,IAAMS,EAAWR,CAAAA,CAAW,WAAA,GACtBS,CAAAA,CAAMC,OAAAA,CAAQF,CAAQ,CAAA,CACtBG,CAAAA,CAAS,IAAIC,MAAAA,CAAO,CACxB,IAAK,IAAA,CACL,GAAA,CAAAH,EACA,kBAAA,CAAoB,IAAA,CACpB,cAAA,CAAgB,CAAC,CACf,QAAA,CAAU,IACV,eAAA,CAAiB,CACf,OAAQI,CAAAA,CAAS,MAAA,CACjB,YAAa,IAAA,CACb,UAAA,CAAY,SACZ,aAAA,CAAe,CAAE,aAAc,CAAE,GAAA,CAAK,IAAK,CAAE,CAC/C,EACA,KAAA,CAAO,CAAC,sBAAsB,CAAA,CAC9B,OAAA,CAAS,CACP,YAAA,CAAcC,CAAAA,CACd,qBAAsBD,CAAAA,CAAS,MACjC,EACA,KAAA,CAAOd,CAAAA,CAAO,MAChB,CAAC,CACH,CAAC,CAAA,CAEK,CAACgB,CAAM,CAAA,CAAI,MAAMJ,EAAO,QAAA,CAASX,CAAAA,CAAW,aAAY,CAAG,CAAE,SAAAQ,CAAS,CAAC,EACzEO,CAAAA,EAAQ,MAAA,EAAUf,EAAW,eAAA,CAAgBe,CAAAA,CAAO,MAAM,EAChE,CACF,ECjCO,IAAMC,CAAAA,CAA6B,CACxC,KAAA,CAAO,CAAC,CAAE,MAAA,CAAAjB,CAAO,IAAMA,CAAAA,CAAO,aAAA,CAC9B,UAAW,MAAO,CAAE,WAAAC,CAAAA,CAAY,MAAA,CAAAD,CAAO,CAAA,GAAM,CAC3CC,EAAW,eAAA,EAAgB,CAC3BA,EAAW,UAAA,CAAWD,CAAAA,CAAO,MAAM,EACrC,CACF,MCJakB,CAAAA,CAAwC,CACnD,MAAO,CAAC,CAAE,OAAAlB,CAAO,CAAA,GAAMA,EAAO,wBAAA,CAC9B,SAAA,CAAW,MAAO,CAAE,UAAA,CAAAC,EAAY,MAAA,CAAQ,CAAE,qBAAAF,CAAqB,CAAE,IAAM,CACrEE,CAAAA,CAAW,cAAa,CAAE,OAAA,CAASH,GAAS,CAC1C,GAAI,CAACD,CAAAA,CAAoBC,CAAI,EAAK,OAElC,IAAMI,EAAWJ,CAAAA,CAAK,OAAA,GACtB,GAAI,CAACI,EAAY,OAEjB,IAAMiB,CAAAA,CAAuBrB,CAAAA,CAAK,UAAA,EAAW,CACzCK,EAAiC,KAAA,CAErCF,CAAAA,CAAW,uBAAsB,CAAE,OAAA,CAASG,GAAe,CACpCA,CAAAA,CAAW,iBAAgB,CAC/B,IAAA,CAAMC,GAAQA,CAAAA,CAAI,OAAA,KAAcH,CAAQ,CAAA,GACvDC,EAAiC,IAAA,EAErC,CAAC,EAED,IAAMiB,CAAAA,CAAarB,IAAyBoB,CAAAA,EAAwBhB,CAAAA,CAAAA,CAI9DkB,EADSvB,CAAAA,CAAK,aAAA,GACC,CAAC,CAAA,CAEhBwB,GADOD,CAAAA,CAAM,WAAA,IAAiBA,CAAAA,CAAM,OAAA,IACpB,OAAA,EAAQ,CAC9BA,EAAM,UAAA,EAAW,CACjB,IAAME,CAAAA,CAAiBD,CAAAA,GAAa,KAAA,CAAQ,0BAA4B,CAAA,wBAAA,EAA2BA,CAAQ,IAErGE,CAAAA,CAAQ1B,CAAAA,CAAK,eAAc,CACjCG,CAAAA,CAAW,wBAAwBuB,CAAAA,CAAO,CACxC,aAAc,CAAC,CACb,KAAMtB,CAAAA,CACN,IAAA,CAAMqB,EACN,WAAA,CAAcE,CAAAA,EAAW,CACvBA,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM3B,EAAK,aAAA,EAAc,CAAE,IAAK4B,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,CAAE,KAAK,IAAI,CAAC,EAAE,KAAA,CAAM,GAAG,EAC1F,IAAMC,CAAAA,CAAa7B,CAAAA,CAAK,iBAAA,EAAkB,EAAG,OAAA,GACzC6B,CAAAA,EAAcF,CAAAA,CAAO,MAAM,CAAA,EAAA,EAAKE,CAAU,EAAE,CAAA,CAChDF,CAAAA,CAAO,MAAM,MAAM,CAAA,CACnB,IAAMG,CAAAA,CAAW9B,CAAAA,CAAK,SAAQ,EAAG,OAAA,IAAa,IAAA,CAC9C2B,CAAAA,CAAO,MAAM,IAAM,CAAEA,EAAO,KAAA,CAAMG,CAAAA,CAAS,QAAQ,QAAA,CAAU,EAAE,EAAE,IAAA,EAAM,EAAE,CAAC,EAC5E,CACF,CAAC,CAAA,CACD,gBAAiBC,uBAAAA,CAAwB,KAAA,CACzC,KAAMC,aAAAA,CAAc,iBAAA,CACpB,UAAA,CAAAV,CACF,CAAC,CAAA,CACDtB,EAAK,MAAA,GACP,CAAC,EACH,CACF,ECpDO,IAAKiC,OAAmBA,CAAAA,CAAAA,CAAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAQA,IAAA,OAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAASA,CAAAA,CAAAA,CAAAA,CAAA,uBAApCA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,EAOL,SAASC,CAAAA,CAAqB/B,CAAAA,CAAwBgC,EAA+F,CAC1J,IAAMC,EAAkC,EAAC,CACnCC,EAAalC,CAAAA,CAAW,yBAAA,GAC9B,IAAA,IAASuB,CAAAA,CAAQW,EAAW,aAAA,EAAc,CAAI,EAAGX,CAAAA,CAAQ,CAAA,CAAGA,GAAS,CAAA,CAAG,CACtE,IAAMY,CAAAA,CAAOD,CAAAA,CAAW,eAAA,CAAgBX,EAAQ,CAAC,CAAA,CAC3Ca,EAAMF,CAAAA,CAAW,eAAA,CAAgBX,CAAK,CAAA,CACtCc,CAAAA,CAASL,EAAUI,CAAAA,CAAKD,CAAAA,CAAMC,EAAI,qBAAA,EAAuB,EAC/DH,CAAAA,CAAa,IAAA,CAAK,CAAE,KAAA,CAAO,CAACE,EAAK,MAAA,EAAO,CAAGC,EAAI,QAAA,EAAU,EAAG,MAAA,CAAAC,CAAO,CAAC,EACtE,CACAJ,EAAa,OAAA,CAAQ,CAAC,CAAE,KAAA,CAAAK,CAAAA,CAAO,OAAAD,CAAO,CAAA,GAAM,CACtCA,CAAAA,GAAW,CAAA,CACbrC,CAAAA,CAAW,WAAA,CAAYsC,CAAAA,CAAO;AAAA,CAAI,CAAA,CACzBD,CAAAA,GAAW,CAAA,EACpBrC,CAAAA,CAAW,YAAYsC,CAAAA,CAAO;;AAAA,CAAM,EAExC,CAAC,EACH,KCrBaC,CAAAA,CAAqC,CAChD,KAAA,CAAO,CAAC,CAAE,MAAA,CAAAxC,CAAO,CAAA,GAAMA,EAAO,qBAAA,CAC9B,SAAA,CAAW,MAAO,CAAE,UAAA,CAAAC,CAAW,CAAA,GAAM,CACnC+B,EAAqB/B,CAAAA,CAAY,CAACoC,CAAAA,CAAKD,CAAAA,GAAUA,CAAAA,YAAgBK,iBAAAA,EAAqBJ,CAAAA,YAAeI,iBAAAA,CAAAA,CAAAA,CAAAA,CAGrG,EACF,CACF,MCRaC,CAAAA,CAAmC,CAC9C,KAAA,CAAO,CAAC,CAAE,MAAA,CAAA1C,CAAO,CAAA,GAAMA,EAAO,mBAAA,CAC9B,SAAA,CAAW,MAAO,CAAE,UAAA,CAAAC,CAAW,CAAA,GAAM,CAEnC,IAAM0C,CAAAA,CAAc1C,CAAAA,CAAW,qBAAA,EAAsB,CAAE,IAAA,CAAM2C,CAAAA,EACpDA,CAAAA,CAAkB,kBAAA,GAAqB,eAAA,EAAgB,GAAM,OACrE,CAAA,CAGKC,CAAAA,CAAoB,IAAI,GAAA,CACxBC,CAAAA,CAAqB,IAAI,GAAA,CA4D/B,GArDA7C,CAAAA,CAAW,iBAAA,CAAmB8C,CAAAA,EAAS,CAErC,GAAIA,CAAAA,CAAK,SAAQ,GAAM1D,UAAAA,CAAW,aAAA,CAAe,CAC/C,IAAM2D,CAAAA,CAAUD,CAAAA,CAAK,MAAA,CAAO1D,WAAW,aAAa,CAAA,CACpD,GAAI,CAAC2D,CAAAA,CAAS,OAEd,IAAMC,CAAAA,CAAWD,EAAQ,WAAA,EAAY,CAGrC,GAAIzD,IAAAA,CAAK,eAAA,CAAgB0D,CAAQ,CAAA,CAAG,CAClC,IAAMC,CAAAA,CAAOD,CAAAA,CAAS,OAAA,EAAQ,CAAE,OAAA,EAAQ,CAClCE,CAAAA,CAAQF,CAAAA,CAAS,UAAS,CAAE,OAAA,EAAQ,CAEtCC,CAAAA,GAAS,OAAA,EAEPpE,CAAAA,CAAY,QAAA,CAASqE,CAAK,IAC5BF,CAAAA,CAAS,eAAA,CAAgBE,CAAK,CAAA,CAC9BN,EAAkB,GAAA,CAAIM,CAAK,CAAA,EAGjC,CACF,CAIA,GAAIJ,CAAAA,CAAK,OAAA,EAAQ,GAAM1D,UAAAA,CAAW,wBAAA,CAA0B,CAC1D,IAAM+D,EAAaL,CAAAA,CAAK,MAAA,CAAO1D,UAAAA,CAAW,wBAAwB,CAAA,CAClE,GAAI,CAAC+D,CAAAA,CAAY,OAEjB,IAAMC,CAAAA,CAAOD,CAAAA,CAAW,aAAA,EAAc,CAChCE,CAAAA,CAAOF,CAAAA,CAAW,OAAA,GAEpBC,CAAAA,CAAK,OAAA,EAAQ,GAAM,OAAA,GAEjBtE,CAAAA,CAAY,QAAA,CAASuE,CAAI,CAAA,EAAKtE,EAAW,QAAA,CAASsE,CAAI,CAAA,EAAKxE,CAAAA,CAAY,QAAA,CAASwE,CAAI,CAAA,CAAA,GACtFF,CAAAA,CAAW,gBAAgBE,CAAI,CAAA,CAG3BxE,CAAAA,CAAY,QAAA,CAASwE,CAAI,CAAA,CAC3BT,CAAAA,CAAkB,GAAA,CAAIS,CAAI,CAAA,CAAA,CACjBvE,CAAAA,CAAY,QAAA,CAASuE,CAAI,CAAA,EAAKtE,CAAAA,CAAW,QAAA,CAASsE,CAAI,IAC/DR,CAAAA,CAAmB,GAAA,CAAIQ,CAAI,CAAA,EAInC,CACF,CAAC,CAAA,CAOGX,CAAAA,GAAgBE,CAAAA,CAAkB,KAAO,CAAA,EAAKC,CAAAA,CAAmB,IAAA,CAAO,CAAA,CAAA,CAAI,CAE9EH,CAAAA,CAAY,qBAAA,EAAsB,CAGlC,IAAMY,CAAAA,CAAmB,KAAA,CAAM,IAAA,CAAKV,CAAiB,CAAA,CAAE,IAAA,EAAK,CAC5D,IAAA,IAAWI,KAAYM,CAAAA,CACrBZ,CAAAA,CAAY,cAAA,CAAe,CAAE,IAAA,CAAMM,CAAAA,CAAU,UAAA,CAAY,IAAK,CAAC,CAAA,CAIjE,IAAMO,CAAAA,CAAoB,KAAA,CAAM,IAAA,CAAKV,CAAkB,CAAA,CAAE,IAAA,GACzD,IAAA,IAAWW,CAAAA,IAAaD,CAAAA,CACtBb,CAAAA,CAAY,cAAA,CAAec,CAAS,EAExC,CACF,CACF,ECxFO,IAAMC,CAAAA,CAA+B,CAC1C,MAAO,CAAC,CAAE,MAAA,CAAA1D,CAAO,CAAA,GAAMA,CAAAA,CAAO,eAAA,CAC9B,SAAA,CAAW,MAAO,CAAE,UAAA,CAAAC,CAAAA,CAAY,MAAA,CAAAD,CAAO,CAAA,GAAM,CAC3C,IAAM2D,CAAAA,CAAgB,MAAMC,MAAAA,CAAO3D,CAAAA,CAAW,OAAA,EAAQ,CAAG,CACvD,MAAA,CAAQ,UAAA,CACR,GAAGD,EAAO,QAAA,CACV,0BAAA,CAA4B,MAAA,CAC5B,UAAA,CAAY,YAAA,CACZ,aAAA,CAAe,MAAA,CACf,WAAA,CAAa,KACb,cAAA,CAAgB,IAClB,CAAC,CAAA,CACDC,CAAAA,CAAW,eAAA,CAAgB0D,CAAa,EAC1C,CACF,ECCO,SAASE,CAAAA,CAAY,CAAE,OAAAjD,CAAAA,CAAQ,MAAA,CAAAgD,CAAAA,CAAQ,QAAA,CAAAE,CAAAA,CAAU,GAAG9D,CAAO,CAAA,CAAoC,EAAC,CAAsB,CAC3H,OAAO,CACL,oBAAA,CAAsB,KAAA,CACtB,wBAAA,CAA0B,KAAA,CAC1B,oBAAqB,KAAA,CACrB,aAAA,CAAe,KAAA,CACf,qBAAA,CAAuB,KAAA,CACvB,aAAA,CAAe,KAAA,CACf,eAAA,CAAiB,MACjB,MAAA,CAAQ,CACN,4BAAA,CAA8B,CAAC,OAAO,CAAA,CACtC,0BAAA,CAA4B,CAAC,OAAO,EACpC,4BAAA,CAA8B,CAAC,OAAO,CAAA,CACtC,+BAAA,CAAiC,CAAC,OAAO,CAAA,CACzC,2CAA4C,CAAC,OAAO,CAAA,CACpD,kCAAA,CAAoC,CAAC,OAAA,CAAS,YAAY,CAAA,CAC1D,mCAAoC,CAAC,OAAO,CAAA,CAC5C,0BAAA,CAA4B,CAAC,OAAO,CAAA,CACpC,yBAAA,CAA2B,CAAC,OAAA,CAAS,QAAQ,CAAA,CAC7C,0BAAA,CAA4B,CAAC,OAAA,CAAS,QAAQ,CAAA,CAC9C,yBAA0B,CAAC,OAAA,CAAS,MAAA,CAAQ,CAAE,eAAA,CAAmB,IAAK,CAAC,CAAA,CACvE,0BAA2B,CAAC,OAAA,CAAS,OAAO,CAAA,CAC5C,wBAAA,CAA0B,CAAC,OAAO,CAAA,CAClC,6BAA8B,CAAC,OAAO,CAAA,CACtC,mCAAA,CAAqC,CAAC,OAAA,CAAS,CAAE,SAAA,CAAa,CAAE,SAAA,CAAa,MAAO,CAAE,CAAC,EACvF,0BAAA,CAA4B,CAAC,OAAO,CAAA,CACpC,oBAAqB,CAAC,OAAA,CAAS,CAAC,CAAA,CAChC,oCAAA,CAAsC,CAAC,OAAA,CAAS,CAAE,IAAO,CAAA,CAAG,MAAA,CAAU,CAAA,CAAG,MAAA,CAAU,CAAE,CAAC,CAAA,CACtF,iCAAA,CAAmC,CAAC,OAAA,CAAS,QAAQ,CAAA,CACrD,mBAAA,CAAqB,CAAC,OAAA,CAAS,QAAQ,CAAA,CACvC,kBAAmB,CAAC,OAAA,CAAS,OAAO,CAAA,CACpC,gCAAA,CAAkC,CAAC,OAAA,CAAS,QAAQ,EACpD,wCAAA,CAA0C,CAAC,OAAA,CAAS,CAAE,SAAA,CAAa,QAAA,CAAU,KAAA,CAAS,OAAA,CAAS,WAAc,QAAS,CAAC,CAAA,CACvH,iDAAA,CAAmD,OAAA,CACnD,gDAAA,CAAkD,OAAA,CAClD,mCAAA,CAAqC,QACrC,wDAAA,CAA0D,OAAA,CAC1D,8BAAA,CAAgC,OAAA,CAChC,kCAAA,CAAoC,OAAA,CACpC,GAAGY,CACL,EACA,MAAA,CAAQ,CACN,UAAA,CAAY,CAAA,CACZ,oBAAqB,IAAA,CACrB,wBAAA,CAA0B,IAAA,CAC1B,WAAA,CAAamD,GAAG,WAAA,CAAY,KAAA,CAC5B,UAAA,CAAYA,EAAAA,CAAG,mBAAA,CAAoB,MAAA,CACnC,sBAAA,CAAwB,IAAA,CACxB,GAAGH,CACL,CAAA,CACA,QAAA,CAAU,CACR,IAAA,CAAM,KAAA,CACN,WAAA,CAAa,IAAA,CACb,eAAgB,IAAA,CAChB,WAAA,CAAa,QAAA,CACb,eAAA,CAAiB,IAAA,CACjB,UAAA,CAAY,UAAA,CACZ,UAAA,CAAY,IACZ,GAAGE,CACL,CAAA,CACA,GAAG9D,CACL,CACF,CCpEO,IAAMgE,EAAe,CAC1BjE,CAAAA,CACAmB,CAAAA,CACAwB,CAAAA,CACAzB,CAAAA,CACAyC,CAAAA,CACAlB,CAAAA,CACAhC,CACF,EAEA,eAAsByD,EAAAA,CACpBhE,CAAAA,CACAD,CAAAA,CAAyC,EAAC,CAC3B,CACf,IAAMkE,EAA4B,CAAE,MAAA,CAAQL,CAAAA,CAAY7D,CAAM,CAAA,CAAG,UAAA,CAAAC,CAAW,CAAA,CAC5E,QAAWkE,CAAAA,IAAeH,CAAAA,CACpBG,CAAAA,CAAY,KAAA,CAAMD,CAAM,CAAA,EAC1B,MAAMC,CAAAA,CAAY,SAAA,CAAUD,CAAM,EAGxC","file":"index.js","sourcesContent":["import { FunctionDeclaration, Node, SyntaxKind, VariableDeclaration } from 'ts-morph'\n\nexport const REACT_TYPES = [\n 'ComponentProps',\n 'ComponentPropsWithRef',\n 'ComponentPropsWithoutRef',\n 'FC',\n 'FunctionComponent',\n 'ReactNode',\n 'ReactElement',\n 'JSX',\n 'RefObject',\n 'MutableRefObject',\n 'CSSProperties',\n 'HTMLAttributes',\n 'SVGAttributes',\n 'DOMAttributes',\n 'PropsWithChildren',\n 'PropsWithRef'\n]\n\nexport const REACT_HOOKS = [\n 'useState',\n 'useEffect',\n 'useCallback',\n 'useMemo',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useImperativeHandle',\n 'useLayoutEffect',\n 'useDebugValue',\n 'useTransition',\n 'useDeferredValue',\n 'useId',\n 'useSyncExternalStore'\n]\n\nexport const REACT_APIS = [\n 'forwardRef',\n 'memo',\n 'lazy',\n 'createContext',\n 'createElement',\n 'cloneElement',\n 'isValidElement',\n 'Children',\n 'Fragment',\n 'StrictMode',\n 'Suspense'\n]\n\nexport function isReactComponent(varDecl: VariableDeclaration): boolean {\n try {\n const initializer = varDecl.getInitializer?.()\n if (!initializer) return false\n\n // Check if the initializer contains JSX\n const descendants = initializer.getDescendantsOfKind?.(SyntaxKind.JsxElement) || []\n const selfClosing = initializer.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement) || []\n\n if (descendants.length > 0 || selfClosing.length > 0) { return true }\n\n // Check if it's assigned to an arrow function that returns JSX\n if (Node.isArrowFunction(initializer)) {\n const body = initializer.getBody?.()\n if (body) {\n const bodyDescendants = body.getDescendantsOfKind?.(SyntaxKind.JsxElement) || []\n const bodySelfClosing = body.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement) || []\n return bodyDescendants.length > 0 || bodySelfClosing.length > 0\n }\n }\n\n return false\n } catch {\n return false\n }\n}\n\nexport function isForwardRefComponent(varDecl: VariableDeclaration): boolean {\n try {\n const initializer = varDecl.getInitializer?.()\n if (!initializer) return false\n\n const text = initializer.getText?.()\n return text?.includes('forwardRef(') || text?.includes('React.forwardRef(') ? true : false\n } catch {\n return false\n }\n}\n\nexport function isFunctionComponent(func: FunctionDeclaration): boolean {\n try {\n const descendants = func.getDescendantsOfKind?.(SyntaxKind.JsxElement) || []\n const selfClosing = func.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement) || []\n if (descendants.length > 0 || selfClosing.length > 0) { return true }\n return false\n } catch {\n return false\n }\n}\n","import { isFunctionComponent } from '../utils/react'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceDirectExports: Transformer = {\n match: ({ config }) => config.enforceDirectExports,\n transform: async ({ sourceFile }) => {\n // Transform function declarations: add direct export if it's a component\n sourceFile.getFunctions().forEach((func) => {\n // Skip if not a component\n if (!isFunctionComponent(func)) { return }\n\n // Skip if already exported directly\n if (func.isExported() && func.hasExportKeyword()) { return }\n\n const funcName = func.getName()\n\n // Check if it's exported via separate export statement\n let isExportedViaSeparateStatement = false\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n if (namedExports.some((exp) => exp.getName() === funcName)) {\n isExportedViaSeparateStatement = true\n }\n })\n\n // Only convert if it's a component that should be exported\n if (isExportedViaSeparateStatement) {\n // Add direct export modifier\n func.setIsExported(true)\n\n // Remove from separate export statements\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n const matchingExports = namedExports.filter((namedExport) => namedExport.getName() === funcName)\n if (matchingExports.length > 0) {\n matchingExports.forEach((namedExport) => { namedExport.remove() })\n if (exportDecl.getNamedExports().length === 0) { exportDecl.remove() }\n }\n })\n }\n })\n }\n}\n","import stylistic from '@stylistic/eslint-plugin'\nimport { ESLint } from 'eslint'\nimport { dirname } from 'path'\nimport tseslint from 'typescript-eslint'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceEslint: Transformer = {\n match: ({ config }) => config.enforceEslint,\n transform: async ({ sourceFile, config }) => {\n const filePath = sourceFile.getFilePath()\n const cwd = dirname(filePath)\n const eslint = new ESLint({\n fix: true,\n cwd,\n overrideConfigFile: true,\n overrideConfig: [{\n basePath: '.',\n languageOptions: {\n parser: tseslint.parser,\n ecmaVersion: 2020,\n sourceType: 'module',\n parserOptions: { ecmaFeatures: { jsx: true } }\n },\n files: ['**/*.{ts,tsx,js,jsx}'],\n plugins: {\n '@stylistic': stylistic,\n '@typescript-eslint': tseslint.plugin\n },\n rules: config.eslint\n }]\n })\n\n const [result] = await eslint.lintText(sourceFile.getFullText(), { filePath })\n if (result?.output) { sourceFile.replaceWithText(result.output) }\n }\n}\n","import { Transformer } from '../utils/transformer'\n\nexport const enforceFormat: Transformer = {\n match: ({ config }) => config.enforceFormat,\n transform: async ({ sourceFile, config }) => {\n sourceFile.organizeImports()\n sourceFile.formatText(config.format)\n }\n}\n","import { StructureKind, VariableDeclarationKind } from 'ts-morph'\nimport { isFunctionComponent } from '../utils/react'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceFunctionComponent: Transformer = {\n match: ({ config }) => config.enforceFunctionComponent,\n transform: async ({ sourceFile, config: { enforceDirectExports } }) => {\n sourceFile.getFunctions().forEach((func) => {\n if (!isFunctionComponent(func)) { return }\n\n const funcName = func.getName()\n if (!funcName) { return }\n\n const isExportedViaKeyword = func.isExported()\n let isExportedViaSeparateStatement = false\n\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n if (namedExports.some((exp) => exp.getName() === funcName)) {\n isExportedViaSeparateStatement = true\n }\n })\n\n const isExported = enforceDirectExports && (isExportedViaKeyword || isExportedViaSeparateStatement)\n\n // Get the parameters with their type annotations\n const params = func.getParameters()\n const param = params[0]\n const type = param.getTypeNode() ?? param.getType()\n const typeText = type.getText()\n param.removeType()\n const typeAnnotation = typeText === 'any' ? 'React.FunctionComponent' : `React.FunctionComponent<${typeText}>`\n\n const index = func.getChildIndex()\n sourceFile.insertVariableStatement(index, {\n declarations: [{\n name: funcName,\n type: typeAnnotation,\n initializer: (writer) => {\n writer.write('(').write(func.getParameters().map((p) => p.getText()).join(', ')).write(')')\n const returnType = func.getReturnTypeNode()?.getText()\n if (returnType) { writer.write(`: ${returnType}`) }\n writer.write(' => ')\n const bodyText = func.getBody()?.getText() ?? '{}'\n writer.block(() => { writer.write(bodyText.replace(/^{|}$/g, '').trim()) })\n }\n }],\n declarationKind: VariableDeclarationKind.Const,\n kind: StructureKind.VariableStatement,\n isExported\n })\n func.remove()\n })\n }\n}\n","import { Node, SourceFile, ts } from 'ts-morph'\n\nexport enum SeparationIntent { IGNORE, COMBINE, SEPARATE }\n\nexport interface SeparationEntry {\n range: [number, number]\n intent: SeparationIntent\n}\n\nexport function enforeLineSeparation(sourceFile: SourceFile, predicate: (cur: Node<ts.Node>, prev: Node<ts.Node>, triviaWidth: number) => SeparationIntent) {\n const instructions: SeparationEntry[] = []\n const syntaxList = sourceFile.getChildSyntaxListOrThrow()\n for (let index = syntaxList.getChildCount() - 1; index > 0; index -= 1) {\n const prev = syntaxList.getChildAtIndex(index - 1)\n const cur = syntaxList.getChildAtIndex(index)\n const intent = predicate(cur, prev, cur.getLeadingTriviaWidth())\n instructions.push({ range: [prev.getEnd(), cur.getStart()], intent })\n }\n instructions.forEach(({ range, intent }) => {\n if (intent === SeparationIntent.COMBINE) {\n sourceFile.replaceText(range, '\\n')\n } else if (intent === SeparationIntent.SEPARATE) {\n sourceFile.replaceText(range, '\\n\\n')\n }\n })\n}\n","import { ImportDeclaration } from 'ts-morph'\nimport { Transformer } from '../utils/transformer'\nimport { enforeLineSeparation, SeparationIntent } from '../utils/trivia'\n\nexport const enforceLineSeparation: Transformer = {\n match: ({ config }) => config.enforceLineSeparation,\n transform: async ({ sourceFile }) => {\n enforeLineSeparation(sourceFile, (cur, prev) => (prev instanceof ImportDeclaration && cur instanceof ImportDeclaration)\n ? SeparationIntent.COMBINE\n : SeparationIntent.SEPARATE\n )\n }\n}\n","import { Node, SyntaxKind } from 'ts-morph'\nimport { REACT_APIS, REACT_HOOKS, REACT_TYPES } from '../utils/react'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceNamedImports: Transformer = {\n match: ({ config }) => config.enforceNamedImports,\n transform: async ({ sourceFile }) => {\n // Find React import declaration\n const reactImport = sourceFile.getImportDeclarations().find((importDeclaration) => {\n return importDeclaration.getModuleSpecifier().getLiteralValue() === 'react'\n })\n\n // Initialize tracking sets\n const typeImportsNeeded = new Set<string>()\n const valueImportsNeeded = new Set<string>()\n\n // ============================================================\n // Phase 2 & 3: Transform Type References and Hook Calls\n // (Single-pass traversal for efficiency)\n // ============================================================\n\n sourceFile.forEachDescendant((node) => {\n // Handle TypeReference nodes (Phase 2)\n if (node.getKind() === SyntaxKind.TypeReference) {\n const typeRef = node.asKind(SyntaxKind.TypeReference)\n if (!typeRef) return\n\n const typeName = typeRef.getTypeName()\n\n // Check if it's a qualified name like React.ComponentProps or React.HTMLAttributes\n if (Node.isQualifiedName(typeName)) {\n const left = typeName.getLeft().getText()\n const right = typeName.getRight().getText()\n\n if (left === 'React') {\n // Check if it's a known React type\n if (REACT_TYPES.includes(right)) {\n typeName.replaceWithText(right)\n typeImportsNeeded.add(right)\n }\n }\n }\n }\n\n // Handle PropertyAccessExpression nodes (Phase 3)\n // This handles both React.Component and React.SomethingRef patterns\n if (node.getKind() === SyntaxKind.PropertyAccessExpression) {\n const propAccess = node.asKind(SyntaxKind.PropertyAccessExpression)\n if (!propAccess) return\n\n const expr = propAccess.getExpression()\n const name = propAccess.getName()\n\n if (expr.getText() === 'React') {\n // Check if it's a known hook or API\n if (REACT_HOOKS.includes(name) || REACT_APIS.includes(name) || REACT_TYPES.includes(name)) {\n propAccess.replaceWithText(name)\n\n // Determine if it's a type or value import\n if (REACT_TYPES.includes(name)) {\n typeImportsNeeded.add(name)\n } else if (REACT_HOOKS.includes(name) || REACT_APIS.includes(name)) {\n valueImportsNeeded.add(name)\n }\n }\n }\n }\n })\n\n // ============================================================\n // Phase 4: Import Management\n // ============================================================\n\n // Only add named imports and remove namespace if we have imports to add\n if (reactImport && (typeImportsNeeded.size > 0 || valueImportsNeeded.size > 0)) {\n // Remove namespace import FIRST (before adding named imports)\n reactImport.removeNamespaceImport()\n\n // Add type imports (with 'type' keyword for type-only imports)\n const typeImportsArray = Array.from(typeImportsNeeded).sort()\n for (const typeName of typeImportsArray) {\n reactImport.addNamedImport({ name: typeName, isTypeOnly: true })\n }\n\n // Add value imports\n const valueImportsArray = Array.from(valueImportsNeeded).sort()\n for (const valueName of valueImportsArray) {\n reactImport.addNamedImport(valueName)\n }\n }\n }\n}\n","import { format } from 'prettier'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforcePrettier: Transformer = {\n match: ({ config }) => config.enforcePrettier,\n transform: async ({ sourceFile, config }) => {\n const formattedText = await format(sourceFile.getText(), {\n parser: 'babel-ts',\n ...config.prettier,\n embeddedLanguageFormatting: 'auto',\n quoteProps: 'consistent',\n trailingComma: 'none',\n singleQuote: true,\n jsxSingleQuote: true\n })\n sourceFile.replaceWithText(formattedText)\n }\n}\n","import { RulesConfig } from '@eslint/core'\nimport { Options as PrettierOptions } from 'prettier'\nimport { FormatCodeSettings, ts } from 'ts-morph'\nimport { PartialDeep } from 'type-fest'\n\nexport interface TransformerConfig {\n enforceDirectExports: boolean\n enforceFunctionComponent: boolean\n enforceNamedImports: boolean\n enforceFormat: boolean\n enforceLineSeparation: boolean\n enforceEslint: boolean\n enforcePrettier: boolean\n format: FormatCodeSettings\n prettier: PrettierOptions\n eslint: Partial<RulesConfig>\n}\n\nexport function mergeConfig({ eslint, format, prettier, ...config }: PartialDeep<TransformerConfig> = {}): TransformerConfig {\n return {\n enforceDirectExports: false,\n enforceFunctionComponent: false,\n enforceNamedImports: false,\n enforceFormat: false,\n enforceLineSeparation: false,\n enforceEslint: false,\n enforcePrettier: false,\n eslint: {\n '@stylistic/space-in-parens': ['error'],\n '@stylistic/comma-spacing': ['error'],\n '@stylistic/no-multi-spaces': ['error'],\n '@stylistic/no-trailing-spaces': ['error'],\n '@stylistic/no-whitespace-before-property': ['error'],\n '@stylistic/array-bracket-newline': ['error', 'consistent'],\n '@stylistic/array-bracket-spacing': ['error'],\n '@stylistic/arrow-spacing': ['error'],\n '@stylistic/arrow-parens': ['error', 'always'],\n '@stylistic/block-spacing': ['error', 'always'],\n '@stylistic/brace-style': ['error', '1tbs', { 'allowSingleLine': true }],\n '@stylistic/comma-dangle': ['error', 'never'],\n '@stylistic/key-spacing': ['error'],\n '@stylistic/keyword-spacing': ['error'],\n '@stylistic/member-delimiter-style': ['error', { 'multiline': { 'delimiter': 'none' } }],\n '@stylistic/no-extra-semi': ['error'],\n '@stylistic/indent': ['error', 2],\n '@stylistic/no-multiple-empty-lines': ['error', { 'max': 1, 'maxEOF': 0, 'maxBOF': 0 }],\n '@stylistic/object-curly-spacing': ['error', 'always'],\n '@stylistic/quotes': ['error', 'single'],\n '@stylistic/semi': ['error', 'never'],\n '@stylistic/space-before-blocks': ['error', 'always'],\n '@stylistic/space-before-function-paren': ['error', { 'anonymous': 'always', 'named': 'never', 'asyncArrow': 'always' }],\n '@typescript-eslint/adjacent-overload-signatures': 'error',\n '@typescript-eslint/no-extra-non-null-assertion': 'error',\n '@typescript-eslint/no-misused-new': 'error',\n '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',\n '@typescript-eslint/no-shadow': 'error',\n '@typescript-eslint/prefer-for-of': 'error',\n ...eslint\n },\n format: {\n indentSize: 2,\n convertTabsToSpaces: true,\n ensureNewLineAtEndOfFile: true,\n indentStyle: ts.IndentStyle.Block,\n semicolons: ts.SemicolonPreference.Remove,\n trimTrailingWhitespace: true,\n ...format\n },\n prettier: {\n semi: false,\n singleQuote: true,\n jsxSingleQuote: true,\n arrowParens: 'always',\n bracketSameLine: true,\n objectWrap: 'collapse',\n printWidth: 120,\n ...prettier\n },\n ...config\n }\n}\n","import { SourceFile } from 'ts-morph'\nimport { PartialDeep } from 'type-fest'\nimport { enforceDirectExports } from '../transformers/enforceDirectExports'\nimport { enforceEslint } from '../transformers/enforceEslint'\nimport { enforceFormat } from '../transformers/enforceFormat'\nimport { enforceFunctionComponent } from '../transformers/enforceFunctionComponent'\nimport { enforceLineSeparation } from '../transformers/enforceLineSeparation'\nimport { enforceNamedImports } from '../transformers/enforceNamedImports'\nimport { enforcePrettier } from '../transformers/enforcePrettier'\nimport { mergeConfig, TransformerConfig } from './config'\nimport { TransformerParams } from './transformer'\n\nexport const transformers = [\n enforceDirectExports,\n enforceFunctionComponent,\n enforceNamedImports,\n enforceFormat,\n enforcePrettier,\n enforceLineSeparation,\n enforceEslint\n]\n\nexport async function transform(\n sourceFile: SourceFile,\n config: PartialDeep<TransformerConfig> = {}\n): Promise<void> {\n const params: TransformerParams = { config: mergeConfig(config), sourceFile }\n for (const transformer of transformers) {\n if (transformer.match(params)) {\n await transformer.transform(params)\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/react.ts","../src/transformers/enforceDirectExports.ts","../src/transformers/enforceEslint.ts","../src/transformers/enforceFormat.ts","../src/transformers/enforceFunctionComponent.ts","../src/utils/trivia.ts","../src/transformers/enforceLineSeparation.ts","../src/transformers/enforceNamedImports.ts","../src/transformers/enforcePrettier.ts","../src/utils/config.ts","../src/utils/transform.ts"],"names":["REACT_TYPES","REACT_HOOKS","REACT_APIS","isReactComponent","varDecl","initializer","descendants","SyntaxKind","selfClosing","Node","body","bodyDescendants","bodySelfClosing","isForwardRefComponent","text","isFunctionComponent","func","enforceDirectExports","config","sourceFile","funcName","isExportedViaSeparateStatement","exportDecl","exp","matchingExports","namedExport","enforceEslint","filePath","cwd","dirname","eslint","ESLint","tseslint","stylistic","result","enforceFormat","enforceFunctionComponent","isExportedViaKeyword","isExported","param","typeText","typeAnnotation","index","writer","p","returnType","bodyText","VariableDeclarationKind","StructureKind","importDeclaration","SeparationIntent","enforeLineSeparation","predicate","instructions","syntaxList","prev","cur","intent","range","enforceLineSeparation","ImportDeclaration","enforceNamedImports","reactImport","typeImportsNeeded","valueImportsNeeded","node","typeRef","typeName","left","right","propAccess","expr","name","typeImportsArray","valueImportsArray","valueName","enforcePrettier","formattedText","format","mergeConfig","prettier","ts","transformers","transform","params","transformer"],"mappings":"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","file":"index.js","sourcesContent":["import { FunctionDeclaration, Node, SyntaxKind, VariableDeclaration } from 'ts-morph'\n\nexport const REACT_TYPES = [\n 'ComponentProps',\n 'ComponentPropsWithRef',\n 'ComponentPropsWithoutRef',\n 'FC',\n 'FunctionComponent',\n 'ReactNode',\n 'ReactElement',\n 'JSX',\n 'RefObject',\n 'MutableRefObject',\n 'CSSProperties',\n 'HTMLAttributes',\n 'SVGAttributes',\n 'DOMAttributes',\n 'PropsWithChildren',\n 'PropsWithRef'\n]\n\nexport const REACT_HOOKS = [\n 'useState',\n 'useEffect',\n 'useCallback',\n 'useMemo',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useImperativeHandle',\n 'useLayoutEffect',\n 'useDebugValue',\n 'useTransition',\n 'useDeferredValue',\n 'useId',\n 'useSyncExternalStore'\n]\n\nexport const REACT_APIS = [\n 'forwardRef',\n 'memo',\n 'lazy',\n 'createContext',\n 'createElement',\n 'cloneElement',\n 'isValidElement',\n 'Children',\n 'Fragment',\n 'StrictMode',\n 'Suspense'\n]\n\nexport function isReactComponent(varDecl: VariableDeclaration): boolean {\n try {\n const initializer = varDecl.getInitializer?.()\n if (!initializer) return false\n\n // Check if the initializer contains JSX\n const descendants = initializer.getDescendantsOfKind?.(SyntaxKind.JsxElement) || []\n const selfClosing = initializer.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement) || []\n\n if (descendants.length > 0 || selfClosing.length > 0) { return true }\n\n // Check if it's assigned to an arrow function that returns JSX\n if (Node.isArrowFunction(initializer)) {\n const body = initializer.getBody?.()\n if (body) {\n const bodyDescendants = body.getDescendantsOfKind?.(SyntaxKind.JsxElement) || []\n const bodySelfClosing = body.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement) || []\n return bodyDescendants.length > 0 || bodySelfClosing.length > 0\n }\n }\n\n return false\n } catch {\n return false\n }\n}\n\nexport function isForwardRefComponent(varDecl: VariableDeclaration): boolean {\n try {\n const initializer = varDecl.getInitializer?.()\n if (!initializer) return false\n\n const text = initializer.getText?.()\n return text?.includes('forwardRef(') || text?.includes('React.forwardRef(') ? true : false\n } catch {\n return false\n }\n}\n\nexport function isFunctionComponent(func: FunctionDeclaration): boolean {\n try {\n const descendants = func.getDescendantsOfKind?.(SyntaxKind.JsxElement) || []\n const selfClosing = func.getDescendantsOfKind?.(SyntaxKind.JsxSelfClosingElement) || []\n if (descendants.length > 0 || selfClosing.length > 0) { return true }\n return false\n } catch {\n return false\n }\n}\n","import { isFunctionComponent } from '../utils/react'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceDirectExports: Transformer = {\n match: ({ config }) => config.enforceDirectExports,\n transform: async ({ sourceFile }) => {\n // Transform function declarations: add direct export if it's a component\n sourceFile.getFunctions().forEach((func) => {\n // Skip if not a component\n if (!isFunctionComponent(func)) { return }\n\n // Skip if already exported directly\n if (func.isExported() && func.hasExportKeyword()) { return }\n\n const funcName = func.getName()\n\n // Check if it's exported via separate export statement\n let isExportedViaSeparateStatement = false\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n if (namedExports.some((exp) => exp.getName() === funcName)) {\n isExportedViaSeparateStatement = true\n }\n })\n\n // Only convert if it's a component that should be exported\n if (isExportedViaSeparateStatement) {\n // Add direct export modifier\n func.setIsExported(true)\n\n // Remove from separate export statements\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n const matchingExports = namedExports.filter((namedExport) => namedExport.getName() === funcName)\n if (matchingExports.length > 0) {\n matchingExports.forEach((namedExport) => { namedExport.remove() })\n if (exportDecl.getNamedExports().length === 0) { exportDecl.remove() }\n }\n })\n }\n })\n }\n}\n","import stylistic from '@stylistic/eslint-plugin'\nimport { ESLint } from 'eslint'\nimport { dirname } from 'path'\nimport tseslint from 'typescript-eslint'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceEslint: Transformer = {\n match: ({ config }) => config.enforceEslint,\n transform: async ({ sourceFile, config }) => {\n const filePath = sourceFile.getFilePath()\n const cwd = dirname(filePath)\n const eslint = new ESLint({\n fix: true,\n cwd,\n overrideConfigFile: true,\n overrideConfig: [{\n basePath: '.',\n languageOptions: {\n parser: tseslint.parser,\n ecmaVersion: 2020,\n sourceType: 'module',\n parserOptions: { ecmaFeatures: { jsx: true } }\n },\n files: ['**/*.{ts,tsx,js,jsx}'],\n plugins: {\n '@stylistic': stylistic,\n '@typescript-eslint': tseslint.plugin\n },\n rules: config.eslint\n }]\n })\n\n const [result] = await eslint.lintText(sourceFile.getFullText(), { filePath })\n if (result?.output) { sourceFile.replaceWithText(result.output) }\n }\n}\n","import { Transformer } from '../utils/transformer'\n\nexport const enforceFormat: Transformer = {\n match: ({ config }) => config.enforceFormat,\n transform: async ({ sourceFile, config }) => {\n sourceFile.formatText(config.format)\n sourceFile.organizeImports(config.format, { organizeImportsTypeOrder: 'first' })\n }\n}\n","import { StructureKind, VariableDeclarationKind } from 'ts-morph'\nimport { isFunctionComponent } from '../utils/react'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceFunctionComponent: Transformer = {\n match: ({ config }) => config.enforceFunctionComponent,\n transform: async ({ sourceFile, config: { enforceDirectExports } }) => {\n const requireImportCheck = sourceFile.getFunctions().some((func) => {\n if (!isFunctionComponent(func)) { return false }\n\n const funcName = func.getName()\n if (!funcName) { return false }\n\n const isExportedViaKeyword = func.isExported()\n let isExportedViaSeparateStatement = false\n\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n if (namedExports.some((exp) => exp.getName() === funcName)) {\n isExportedViaSeparateStatement = true\n }\n })\n\n const isExported = enforceDirectExports && (isExportedViaKeyword || isExportedViaSeparateStatement)\n\n // Get the parameters with their type annotations\n const params = func.getParameters()\n const param = params[0]\n const type = param.getTypeNode() ?? param.getType()\n const typeText = type.getText()\n param.removeType()\n const typeAnnotation = typeText === 'any' ? 'React.FunctionComponent' : `React.FunctionComponent<${typeText}>`\n\n const index = func.getChildIndex()\n sourceFile.insertVariableStatement(index, {\n declarations: [{\n name: funcName,\n type: typeAnnotation,\n initializer: (writer) => {\n writer.write('(').write(func.getParameters().map((p) => p.getText()).join(', ')).write(')')\n const returnType = func.getReturnTypeNode()?.getText()\n if (returnType) { writer.write(`: ${returnType}`) }\n writer.write(' => ')\n const bodyText = func.getBody()?.getText() ?? '{}'\n writer.block(() => { writer.write(bodyText.replace(/^{|}$/g, '').trim()) })\n }\n }],\n declarationKind: VariableDeclarationKind.Const,\n kind: StructureKind.VariableStatement,\n isExported\n })\n func.remove()\n return true\n })\n\n if (requireImportCheck) {\n const reactImport = sourceFile.getImportDeclarations().find((importDeclaration) => {\n return importDeclaration.getModuleSpecifier().getLiteralValue() === 'react'\n })\n if (!reactImport) {\n sourceFile.addImportDeclaration({\n moduleSpecifier: 'react',\n namespaceImport: 'React'\n })\n }\n }\n }\n}\n","import { Node, SourceFile, ts } from 'ts-morph'\n\nexport enum SeparationIntent { IGNORE, COMBINE, SEPARATE }\n\nexport interface SeparationEntry {\n range: [number, number]\n intent: SeparationIntent\n}\n\nexport function enforeLineSeparation(sourceFile: SourceFile, predicate: (cur: Node<ts.Node>, prev: Node<ts.Node>, triviaWidth: number) => SeparationIntent) {\n const instructions: SeparationEntry[] = []\n const syntaxList = sourceFile.getChildSyntaxListOrThrow()\n for (let index = syntaxList.getChildCount() - 1; index > 0; index -= 1) {\n const prev = syntaxList.getChildAtIndex(index - 1)\n const cur = syntaxList.getChildAtIndex(index)\n const intent = predicate(cur, prev, cur.getLeadingTriviaWidth())\n instructions.push({ range: [prev.getEnd(), cur.getStart()], intent })\n }\n instructions.forEach(({ range, intent }) => {\n if (intent === SeparationIntent.COMBINE) {\n sourceFile.replaceText(range, '\\n')\n } else if (intent === SeparationIntent.SEPARATE) {\n sourceFile.replaceText(range, '\\n\\n')\n }\n })\n}\n","import { ImportDeclaration } from 'ts-morph'\nimport { Transformer } from '../utils/transformer'\nimport { enforeLineSeparation, SeparationIntent } from '../utils/trivia'\n\nexport const enforceLineSeparation: Transformer = {\n match: ({ config }) => config.enforceLineSeparation,\n transform: async ({ sourceFile }) => {\n enforeLineSeparation(sourceFile, (cur, prev) => (prev instanceof ImportDeclaration && cur instanceof ImportDeclaration)\n ? SeparationIntent.COMBINE\n : SeparationIntent.SEPARATE\n )\n }\n}\n","import { Node, SyntaxKind } from 'ts-morph'\nimport { REACT_APIS, REACT_HOOKS, REACT_TYPES } from '../utils/react'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforceNamedImports: Transformer = {\n match: ({ config }) => config.enforceNamedImports,\n transform: async ({ sourceFile }) => {\n // Find React import declaration\n const reactImport = sourceFile.getImportDeclarations().find((importDeclaration) => {\n return importDeclaration.getModuleSpecifier().getLiteralValue() === 'react'\n })\n\n // Initialize tracking sets\n const typeImportsNeeded = new Set<string>()\n const valueImportsNeeded = new Set<string>()\n\n // ============================================================\n // Phase 2 & 3: Transform Type References and Hook Calls\n // (Single-pass traversal for efficiency)\n // ============================================================\n\n sourceFile.forEachDescendant((node) => {\n // Handle TypeReference nodes (Phase 2)\n if (node.getKind() === SyntaxKind.TypeReference) {\n const typeRef = node.asKind(SyntaxKind.TypeReference)\n if (!typeRef) return\n\n const typeName = typeRef.getTypeName()\n\n // Check if it's a qualified name like React.ComponentProps or React.HTMLAttributes\n if (Node.isQualifiedName(typeName)) {\n const left = typeName.getLeft().getText()\n const right = typeName.getRight().getText()\n\n if (left === 'React') {\n // Check if it's a known React type\n if (REACT_TYPES.includes(right)) {\n typeName.replaceWithText(right)\n typeImportsNeeded.add(right)\n }\n }\n }\n }\n\n // Handle PropertyAccessExpression nodes (Phase 3)\n // This handles both React.Component and React.SomethingRef patterns\n if (node.getKind() === SyntaxKind.PropertyAccessExpression) {\n const propAccess = node.asKind(SyntaxKind.PropertyAccessExpression)\n if (!propAccess) return\n\n const expr = propAccess.getExpression()\n const name = propAccess.getName()\n\n if (expr.getText() === 'React') {\n // Check if it's a known hook or API\n if (REACT_HOOKS.includes(name) || REACT_APIS.includes(name) || REACT_TYPES.includes(name)) {\n propAccess.replaceWithText(name)\n\n // Determine if it's a type or value import\n if (REACT_TYPES.includes(name)) {\n typeImportsNeeded.add(name)\n } else if (REACT_HOOKS.includes(name) || REACT_APIS.includes(name)) {\n valueImportsNeeded.add(name)\n }\n }\n }\n }\n })\n\n // ============================================================\n // Phase 4: Import Management\n // ============================================================\n\n // Only add named imports and remove namespace if we have imports to add\n if (reactImport && (typeImportsNeeded.size > 0 || valueImportsNeeded.size > 0)) {\n // Remove namespace import FIRST (before adding named imports)\n reactImport.removeNamespaceImport()\n\n // Add type imports (with 'type' keyword for type-only imports)\n const typeImportsArray = Array.from(typeImportsNeeded).sort()\n for (const typeName of typeImportsArray) {\n reactImport.addNamedImport({ name: typeName, isTypeOnly: true })\n }\n\n // Add value imports\n const valueImportsArray = Array.from(valueImportsNeeded).sort()\n for (const valueName of valueImportsArray) {\n reactImport.addNamedImport(valueName)\n }\n }\n }\n}\n","import { format } from 'prettier'\nimport { Transformer } from '../utils/transformer'\n\nexport const enforcePrettier: Transformer = {\n match: ({ config }) => config.enforcePrettier,\n transform: async ({ sourceFile, config }) => {\n const formattedText = await format(sourceFile.getText(), {\n parser: 'babel-ts',\n ...config.prettier,\n embeddedLanguageFormatting: 'auto',\n quoteProps: 'consistent',\n trailingComma: 'none',\n singleQuote: true,\n jsxSingleQuote: true\n })\n sourceFile.replaceWithText(formattedText)\n }\n}\n","import { RulesConfig } from '@eslint/core'\nimport { Options as PrettierOptions } from 'prettier'\nimport { FormatCodeSettings, ts } from 'ts-morph'\nimport { PartialDeep } from 'type-fest'\n\nexport interface TransformerConfig {\n enforceDirectExports: boolean\n enforceFunctionComponent: boolean\n enforceNamedImports: boolean\n enforceFormat: boolean\n enforceLineSeparation: boolean\n enforceEslint: boolean\n enforcePrettier: boolean\n format: FormatCodeSettings\n prettier: PrettierOptions\n eslint: Partial<RulesConfig>\n}\n\nexport function mergeConfig({ eslint, format, prettier, ...config }: PartialDeep<TransformerConfig> = {}): TransformerConfig {\n return {\n enforceDirectExports: false,\n enforceFunctionComponent: false,\n enforceNamedImports: false,\n enforceFormat: false,\n enforceLineSeparation: false,\n enforceEslint: false,\n enforcePrettier: false,\n eslint: {\n '@stylistic/space-in-parens': ['error'],\n '@stylistic/comma-spacing': ['error'],\n '@stylistic/no-multi-spaces': ['error'],\n '@stylistic/no-trailing-spaces': ['error'],\n '@stylistic/no-whitespace-before-property': ['error'],\n '@stylistic/array-bracket-newline': ['error', 'consistent'],\n '@stylistic/array-bracket-spacing': ['error'],\n '@stylistic/arrow-spacing': ['error'],\n '@stylistic/arrow-parens': ['error', 'always'],\n '@stylistic/block-spacing': ['error', 'always'],\n '@stylistic/brace-style': ['error', '1tbs', { 'allowSingleLine': true }],\n '@stylistic/comma-dangle': ['error', 'never'],\n '@stylistic/key-spacing': ['error'],\n '@stylistic/keyword-spacing': ['error'],\n '@stylistic/member-delimiter-style': ['error', { 'multiline': { 'delimiter': 'none' } }],\n '@stylistic/no-extra-semi': ['error'],\n '@stylistic/indent': ['error', 2],\n '@stylistic/no-multiple-empty-lines': ['error', { 'max': 1, 'maxEOF': 0, 'maxBOF': 0 }],\n '@stylistic/object-curly-spacing': ['error', 'always'],\n '@stylistic/quotes': ['error', 'single'],\n '@stylistic/semi': ['error', 'never'],\n '@stylistic/space-before-blocks': ['error', 'always'],\n '@stylistic/space-before-function-paren': ['error', { 'anonymous': 'always', 'named': 'never', 'asyncArrow': 'always' }],\n '@typescript-eslint/adjacent-overload-signatures': 'error',\n '@typescript-eslint/no-extra-non-null-assertion': 'error',\n '@typescript-eslint/no-misused-new': 'error',\n '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',\n '@typescript-eslint/no-shadow': 'error',\n '@typescript-eslint/prefer-for-of': 'error',\n ...eslint\n },\n format: {\n indentSize: 2,\n convertTabsToSpaces: true,\n ensureNewLineAtEndOfFile: true,\n indentStyle: ts.IndentStyle.Block,\n semicolons: ts.SemicolonPreference.Remove,\n trimTrailingWhitespace: true,\n ...format\n },\n prettier: {\n semi: false,\n singleQuote: true,\n jsxSingleQuote: true,\n arrowParens: 'always',\n bracketSameLine: true,\n objectWrap: 'collapse',\n printWidth: 120,\n ...prettier\n },\n ...config\n }\n}\n","import { SourceFile } from 'ts-morph'\nimport { PartialDeep } from 'type-fest'\nimport { enforceDirectExports } from '../transformers/enforceDirectExports'\nimport { enforceEslint } from '../transformers/enforceEslint'\nimport { enforceFormat } from '../transformers/enforceFormat'\nimport { enforceFunctionComponent } from '../transformers/enforceFunctionComponent'\nimport { enforceLineSeparation } from '../transformers/enforceLineSeparation'\nimport { enforceNamedImports } from '../transformers/enforceNamedImports'\nimport { enforcePrettier } from '../transformers/enforcePrettier'\nimport { mergeConfig, TransformerConfig } from './config'\nimport { TransformerParams } from './transformer'\n\nexport const transformers = [\n enforceDirectExports,\n enforceFunctionComponent,\n enforceNamedImports,\n enforceLineSeparation,\n enforceFormat,\n enforcePrettier,\n enforceEslint\n]\n\nexport async function transform(\n sourceFile: SourceFile,\n config: PartialDeep<TransformerConfig> = {}\n): Promise<void> {\n const params: TransformerParams = { config: mergeConfig(config), sourceFile }\n for (const transformer of transformers) {\n if (transformer.match(params)) {\n await transformer.transform(params)\n }\n }\n}\n"]}
|