turborepo-template-upgrade
Version:
Upgrade projects based on a Turborepo template using selective git diffs, with support for ignore paths and skipped packages.
4 lines (3 loc) • 6.49 kB
JavaScript
;var E=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var q=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},H=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of B(t))!J.call(e,s)&&s!==r&&E(e,s,{get:()=>t[s],enumerable:!(n=_(t,s))||n.enumerable});return e};var K=e=>H(E({},"__esModule",{value:!0}),e);var Y={};q(Y,{upgradeTemplate:()=>V});module.exports=K(Y);var c=require("child_process"),f=require("fs"),F=require("path");var S=require("git-json-resolver"),b=require("git-json-resolver/utils"),D=()=>{let e=process.cwd();for(;e!=="/"&&!((0,f.existsSync)((0,F.resolve)(e,"pnpm-lock.yaml"))&&(0,f.existsSync)((0,F.resolve)(e,"pnpm-workspace.yaml")));)e=(0,F.resolve)(e,"..");return process.chdir(e),e},W="159692443c7a196d86c2612f752ae1d0786b004b",U=".turborepo-template.lst",P=()=>{var s;if((0,f.existsSync)(U))return(s=(0,f.readFileSync)(U,"utf8"))==null?void 0:s.trim();let e=(0,c.execSync)("git log --reverse --format=%ai | head -n 1",{encoding:"utf8"}).trim(),t=new Date(e),n=(0,c.execSync)("git log --format=%H::%ai template/main",{encoding:"utf8"}).trim().split(`
`).map(i=>{let[d,p]=i.split("::");return{hash:d,date:new Date(p==null?void 0:p.trim())}}).reverse().find(i=>i.date>=t);return n?(console.info("Applying changes from ",n.hash," dated ",n.date),n.hash):W},A=async e=>{let t=(0,f.existsSync)("scripts/rebrand.js"),r=(0,f.existsSync)("typedoc.config.js"),n=(0,f.existsSync)("scripts/templates");await(0,S.resolveConflicts)({include:["package.json"],defaultStrategy:["merge","ours"],rules:{"devDependencies.*":["ignore-removed","theirs"],"dependencies.*":["ignore-removed","theirs"]},customStrategies:{"ignore-removed":({theirs:s,path:i})=>!t&&/enquirer$/.test(i)||!r&&/typedoc/.test(i)||!n&&/plop/.test(i)?{status:b.StrategyStatus_OK,value:b.DROP}:{status:b.StrategyStatus_OK,value:s}},debug:e}),await(0,S.resolveConflicts)({include:["**/package.json"],exclude:["package.json","**/dist/**","**/.next/**"],defaultStrategy:["merge","ours"],rules:{"devDependencies.*":["semver-max"],"dependencies.*":["semver-max"]},loggerConfig:{logDir:".logs2",levels:{stdout:[]}},plugins:["git-json-resolver-semver"],pluginConfig:{"git-json-resolver-semver":{preferValid:!0}},includeNonConflicted:!0,debug:e})};var L=e=>{let t=(0,F.resolve)(e,".tt-upgrade.config.json");if(!(0,f.existsSync)(t))return{};try{let r=(0,f.readFileSync)(t,"utf8");return JSON.parse(r)}catch{return console.warn(`\u26A0\uFE0F Failed to parse config file: ${t}`),{}}},N=(e,t)=>({...e,...t,excludePaths:[...e.excludePaths||[],...t.excludePaths||[]]});var h=[],R=0,T=(e,t,r,n="template",s=3)=>{var p,C;if(R++>s){R=0,r(`Max patch recursion reached (${s}), stopping`);return}let i=`git diff ${e} ${n}/main -- ${t.join(" ")} .`;r(`Running: ${i}`);let d=(0,c.execSync)(i,{encoding:"utf8"});(0,f.writeFileSync)(".template.patch",d),r(`Patch written to .template.patch (${d.length} chars)`);try{r("Applying patch with 3-way merge"),(0,c.execSync)("git apply --3way --ignore-space-change --ignore-whitespace .template.patch",{encoding:"utf8"}),r("Patch applied successfully")}catch($){let a=(C=(p=$.stderr)==null?void 0:p.split)==null?void 0:C.call(p,`
`).filter(y=>y.startsWith("error"));r(`Patch failed with ${a.length} errors`),a.forEach(y=>{var o;let x=(o=y.split(":")[1])==null?void 0:o.trim();x&&(t.push(`:!${x}`),r(`Added to exclusions: ${x}`))}),h.push("Applied patch with errors: "),h.push({errorLines:a,exclusions:t}),h.push("^^^---Applied patch with errors"),a.length&&T(e,t,r,n,s)}},V=async(e,t={})=>{let r=D(),n=L(r),s=N(n,t),{debug:i=!1,dryRun:d=!1,templateUrl:p="https://github.com/react18-tools/turborepo-template",excludePaths:C=[],skipInstall:$=!1,remoteName:a="template",maxPatchRetries:y=3,skipCleanCheck:x=!1}=s,o=m=>i&&console.log(`\u{1F50D} [DEBUG] ${m}`);if(o(`Working directory: ${r}`),Object.keys(n).length>0&&o("Loaded config from .tt-upgrade.config.json"),x)o("Skipping git clean check");else try{(0,c.execSync)("git diff --quiet"),(0,c.execSync)("git diff --cached --quiet"),o("Git tree is clean")}catch{console.error("\u274C Error: Please commit or stash your changes before upgrading.");return}d&&console.log("\u{1F50D} Dry run mode - no changes will be applied");try{(0,c.execSync)(`git remote add ${a} ${p}`),o(`Added ${a} remote: ${p}`)}catch{o(`${a} remote already exists`)}try{(0,c.execSync)(`rm -rf ${b.DEFAULT_BACKUP_DIR}`)}catch{}try{(0,c.execSync)(`git fetch ${a}`),o(`Fetched latest changes from ${a}`);let m=(e==null?void 0:e.trim())||P(),u=[...[".tkb","CHANGELOG.md","README.md","**/CHANGELOG.md","**/FUNDING.md","SECURITY.md","TODO.md","FEATURED.md","docs","lib","scripts/rebrand.config.json","pnpm-lock.yaml",".lst",".turborepo-template.lst",".vscode/settings.json"],...C].map(l=>`:!${l}`);if(o(`Base exclusions: ${u.length} items`),[".github/workflows/docs.yml","scripts/templates","examples/express","examples/nextjs/src/app/button.tsx","examples/nextjs/src/app/button.module.css","examples/remix","packages/logger","packages/jest-presets","scripts/rebrand.js","scripts/rebrander.js","plopfile.js","tsconfig.docs.json","typedoc.config.js"].forEach(l=>{(0,f.existsSync)((0,F.resolve)(r,l))||(u.push(`:!${l}`),o(`Added missing path to exclusions: ${l}`))}),[["scripts/templates",["component-generator.md"]],["docs",["scripts/add-frontmatter.mjs"]]].forEach(([l,v])=>{(0,f.existsSync)(l)||v.forEach(M=>u.push(`:!${M}`))}),o(`Generating patch from ${m} to template/main`),o(`Total exclusions: ${u.length}`),d){let l=`git diff ${m} ${a}/main -- ${u.join(" ")} .`,v=(0,c.execSync)(l,{encoding:"utf8"});console.log("\u{1F4CB} Patch preview:"),console.log(v||"No changes to apply");return}T(m,u,o,a,y);let G=(0,c.execSync)(`git rev-parse ${a}/main`,{encoding:"utf8"}).trim();(0,f.writeFileSync)(".turborepo-template.lst",G),await A(i),console.log("\u2705 Upgrade applied successfully."),!d&&!$?(console.log("Reinstalling dependencies..."),(0,c.execSync)("pnpm i",{stdio:i?"inherit":"pipe"}),o("Dependencies reinstalled")):$&&o("Skipping dependency installation");try{(0,c.execSync)("sed -i '/\\.turborepo-template\\.lst/d' .github/workflows/upgrade.yml"),(0,c.execSync)("sed -i '/\\.turborepo-template\\.lst/d' .github/workflows/docs.yml")}catch{}}catch(m){console.error("\u274C Upgrade failed:",m)}h.length>0&&((0,f.writeFileSync)(".error.log",JSON.stringify(h,null,2)),o(`Error log written with ${h.length} entries`))};0&&(module.exports={upgradeTemplate});