wbfy 2.21.4 → 2.21.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 CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as i,ignoreErrorAsync as s}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import p from"node:child_process";import d from"deepmerge";import u from"node:os";import{Octokit as m}from"@octokit/core";import g from"lodash.clonedeep";import f from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(n){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!n.containingDockerfile)return;const i=n.dockerfile,s=i;i!==s&&await e.writeFile(t.join(n.dirPath,"Dockerfile"),s)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const n=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(n))return;const i=await r.promises.readFile(n,"utf8"),s=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==s&&await r.promises.writeFile(n,s)}))}async function P(n){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const i=await a(["*.env","*.env.*"],{dot:!0,cwd:n.dirPath});for(const s of i){const i=t.resolve(n.dirPath,s),o=(await e.readFile(i,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(i,o)}}))}async function F(e){return j.functionIgnoringException("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),i=t.join(e,"tests");try{await r.promises.rename(n,i);const s=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=s.replaceAll("__tests__","tests");if(s===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const $=new l;async function S(i,s){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(i.dirPath,"@types"),r=i.root&&i.containingSubPackageJsons?void 0:t.resolve(i.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const i of a){const a=i.name.slice(0,-5),c=i.name.endsWith(".d.ts");let l=c?a:i.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));i.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await $.run((()=>e.rename(t.join(o,i.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await $.run((()=>e.rename(t.join(o,i.name),t.join(r,i.name))))):i.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await $.run((()=>n((()=>e.rename(t.join(o,i.name,"index.d.ts"),t.join(r,`${i.name}.d.ts`)))))))}}))}const E={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n)}};async function O(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const n=e.dirPath,i=await a("**/*.md",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${n}`);for(const s of i){const i=t.join(n,s);await $.run((async()=>{const t=await r.promises.readFile(i,"utf8");let n=t.replaceAll("c.f.","cf.").replaceAll("eg.","e.g.").replaceAll("ie.","i.e.");n=R(n,e,"doc"),t!==n&&await E.generateFile(i,n)}))}const s=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${n}`);for(const i of s){const s=t.join(n,i),o=await r.promises.readFile(s,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=R(a,e,"ts"),o!==a&&await E.generateFile(s,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${n}`);for(const i of o){const s=t.join(n,i),o=await r.promises.readFile(s,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=R(a,e,"text"),o!==a&&await E.generateFile(s,a)}await $.promiseAll()}))}function R(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,s]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,s);return e}function T(e,t,n,i=0){do{const[i,s,o]=B(e,t,n);if(0===p.spawnSync(i,s,o).status)break}while(--i>=0)}function D(e,t,n){const[i,s,o]=B(e,t,n);o.stdio="pipe";const r=p.spawnSync(i,s,o),a=r.stderr.toString().trim();return a&&console.error(`${i} [${s.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function B(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.replace(`${i.BERRY_BIN_FOLDER}:`,"")),i.ASDF_DIR&&(t=["-l","-c",`. ${i.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:i,shell:!1,stdio:"inherit"}]}function A(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let n=0,i=1;for(const e of t)n+=e*i,i/=1e3;return n}const I="3.9.18",W="zulu-11.68.17",N="2.0.4",C="14.1.0";async function J(e){return j.functionIgnoringException("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${L.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),i=[...new Set(n)];if(e.containingPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&G(i,"poetry",t?.info?.version),G(i,"python",I,!0)}e.depending.firebase&&G(i,"java",W,!0);if(e.containingPackageJson){const t=D("npm",["show","yarn","version"],e.dirPath);G(i,"yarn",t)}for(const n of z){const i=t.resolve(e.dirPath,`.${n}-version`);r.promises.rm(i,{force:!0})}const s=t.resolve(e.dirPath,".tool-versions");await(i.length>0?$.run((()=>r.promises.writeFile(s,i.join("\n")+"\n"))):$.run((()=>r.promises.rm(s,{force:!0})))),await $.promiseAll(),T("asdf",["plugin","update","--all"],e.dirPath),T("asdf",["install"],e.dirPath)}(e)}))}const L=new Set(["java","nodejs","python"]),z=["java","node","python"];function G(e,t,n,i=!1){const s=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(s>=0){const[,t]=e[s].split(/\s+/);A(n)>A(t)&&(e[s]=o)}else e.splice(i?0:e.length,0,o)}const U="# Project-specific settings",H=/# Project-specific settings[^\n]*\n/gm,M="# Generated by wbfy",q=`${U} (head)\n\n\n${M}\n`,Y=`\n${U} (tail)\n`,K={separator:M,separatorPrefix:"# Generated by ",defaultHeadUserContent:q,defaultTailUserContent:Y,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const n=V(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(H,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return t>=0?e.slice(0,e.indexOf("\n",t)+1).replaceAll(H,`${U} (head)\n`):q},getTailUserContent(e){const t=V(e);return t>0?e.slice(t-1):Y},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function V(e){const t=e.indexOf(U),n=e.lastIndexOf(U);return n>t?n:-1}const X="\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n";async function Z(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.containingDockerfile){const e=await E.readFileIgnoringError(n)??"",t=K.getHeadUserContent(e),i=K.getTailUserContent(e),s=t+X+i;await $.run((()=>E.generateFile(n,s)))}else await r.promises.rm(n,{force:!0})}))}const Q={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","css","htm","html","md","scss","vue","yaml","yml"].sort()},ee=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ne(Q.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ne(Q.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ne(Q.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ne(Q.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function te(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run((()=>E.generateFile(n,ee)))}))}function ne(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const ie="\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n";async function se(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore"),i=await E.readFileIgnoringError(n)??"",s=K.getHeadUserContent(i),o=K.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await K.readGitignoreWithoutSeparators(r)||"",c=s+ie+a+o;await $.run((()=>E.generateFile(n,c)))}))}function oe(e,t){return t}function re(e,t,n){const i=[...e];for(const[s,o]of t.entries())void 0===i[s]?i[s]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?i[s]=d(e[s],o,n):e.includes(o)||i.push(o);return i}async function ae(e,n){return j.functionIgnoringException("generateEslintrc",(async()=>{const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let s={root:!0,extends:i};const o=t.resolve(e.dirPath,".eslintrc.json");try{const t=await r.promises.readFile(o,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=s.extends;s.extends=n.extends,n.extends=a,s=d.all([s,n,s],{arrayMerge:re}),e.depending.blitz&&(s.extends=s.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(s);await $.run((()=>E.generateFile(o,a)))}))}const ce=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...Q.codeWith2IndentSize,...Q.codeWith4IndentSize,...Q.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function le(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run((()=>E.generateFile(n,ce)))}))}const pe=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],de="\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\nIcon[\r]\n!.keep\n*/mount/*.hash\n\n";async function ue(e,n){return j.functionIgnoringException("generateGitignore",(async()=>{const i=t.resolve(e.dirPath,".gitignore"),s=await E.readFileIgnoringError(i)??"";let o=K.getHeadUserContent(s)+de;const r=K.getTailUserContent(s),a=[...pe];e.containingGemfile&&a.push("ruby"),e.containingGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.containingPackageJson&&a.push("node"),e.containingPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.containingPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.containingTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.containingPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),n.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await fe(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),s=await i.text();if(!i.ok||s.includes("Attention Required!")||s.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=s.trim(),await $.run((()=>ge(e,t))),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await K.isBerryZeroInstallEnabled(i)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.containingPomXml||e.containingPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.containingPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.containingPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await $.run((()=>E.generateFile(i,l)))}))}const me=t.join(u.homedir(),".cache","wbfy","gitignore");async function ge(e,n){await r.promises.mkdir(me,{recursive:!0}),await r.promises.writeFile(t.join(me,e),n)}async function fe(e){try{const n=await r.promises.stat(t.join(me,e));if(Date.now()-n.mtimeMs>216e5)return;return await r.promises.readFile(t.join(me,e),"utf8")}catch{}}const he={getLintFixSuffix:e=>e.containingJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},ye=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,we=!!ye,be=new m({auth:ye});const ve=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},ke={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function je(e){return e.depending.blitz?ke.blitz:ke.node}const xe=["eslint","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],_e=[...xe,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Pe=["eslint-plugin-react","eslint-plugin-react-hooks"],Fe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...xe],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...xe,...Pe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",..._e],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",..._e,...Pe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",..._e,...Pe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",..._e,...Pe]};async function $e(e,n,i){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,n,i){const s=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(s,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e){"WillBooster LLC"===e.author&&(e.author="WillBooster Inc.");delete e.scripts["sort-package-json"],delete e.scripts["sort-all-package-json"],delete e.scripts["typecheck/warn"],delete e.scripts["typecheck:gen-code"],delete e.scripts["typecheck:codegen"],delete e.dependencies["@willbooster/shared-scripts"],delete e.dependencies.tslib,delete e.devDependencies["@willbooster/eslint-config"],delete e.devDependencies["@willbooster/eslint-config-react"],delete e.devDependencies["@willbooster/renovate-config"],delete e.devDependencies["@willbooster/shared-scripts"],delete e.devDependencies["@willbooster/tsconfig"],delete e.devDependencies["eslint-import-resolver-node"],delete e.devDependencies["eslint-plugin-prettier"],delete e.devDependencies.lerna,delete e.devDependencies.pinst,delete e.scripts["flutter-format"],delete e.scripts["format-flutter"],delete e.scripts["python-format"],delete e.scripts["format-python"],delete e.scripts.prettier;for(const t of Object.values(Fe))for(const n of t)delete e.devDependencies[n];await $.run((()=>r.promises.rm("lerna.json",{force:!0})))}(l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=d(l.scripts,Se(e)),l.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),i=await r.promises.readFile(n,"utf8"),s=i.indexOf(K.separatorPrefix);if(s<0)return"";const o=i.slice(0,s);return o.split("\n").map((e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t})).filter((e=>e&&!e.startsWith("#")&&!e.includes("/"))).map((e=>` "!**/${e}/**"`)).join("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["lint-staged","prettier","sort-package-json","@willbooster/prettier-config"];const m=[];if(e.root){if(u.push("husky"),l.scripts.postinstall="husky",(e.publicRepo||e.referredByOtherRepo)&&(u.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable"),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";u.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.containingSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?d.all([l.workspaces,["packages/*"]],{arrayMerge:re}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb){l.dependencies["@willbooster/shared-scripts"]||l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(u.push("eslint","micromatch"),e.containingTypeScriptInPackages&&u.push("@typescript-eslint/parser"));(e.containingTypeScript||e.containingTypeScriptInPackages)&&u.push("typescript");e.eslintBase&&u.push(...Fe[e.eslintBase]);e.willBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),u=u.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.containingSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&n.publicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[g]=ve.getOrgAndName(e.repository??"");"WillBooster"!==g&&"WillBoosterLab"!==g||(l.author="WillBooster Inc.");e.root||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.containingSubPackageJsons){if(e.containingJavaScript||e.containingTypeScript?l.scripts["lint-fix"]+=he.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix","")),e.containingPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>r.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(l.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.containingPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,i]=e.split(/[/\\]/);i&&n.add(t)}if(n.size>0){const e=[...n].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${N}`,`@blitzjs/auth@${N}`,`@blitzjs/next@${N}`,`@blitzjs/rpc@${N}`,`next@${C}`),u=u.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;let f=JSON.stringify(l);f=await async function(e,n,i){const s=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&s.push([t,t.replaceAll(":","-")]);if(0===s.length)return n;for(const[e,t]of s)n=n.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,gitignore:!0});for(const e of o)await $.run((async()=>{const n=t.join(i.dirPath,e),o=await r.promises.readFile(n,"utf8");let a=o;for(const[e,t]of s)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(n,a)}));return await $.promiseAll(),n}(l.scripts,f,e),await r.promises.writeFile(s,f),i||(p=p.filter((e=>!l.devDependencies?.[e])),p.length>0&&T("yarn",["add",...new Set(p)],e.dirPath),u=u.filter((e=>!l.dependencies?.[e])),u.length>0&&T("yarn",["add","-D",...new Set(u)],e.dirPath),m.length>0&&T("poetry",["add","--group","dev",...new Set(m)],e.dirPath))}(e,n,i)}))}function Se(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${je(e)}}/**/*.{${Q.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Q.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.containingSubPackageJsons){const e=t.test;t=d({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Q.prettier.join(",")}}" "!**/packages/**" "!**/test-fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),e?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.containingTypeScript||e.containingTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}const Ee={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Oe(e){return j.functionIgnoringException("generateHuskyrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),i=await r.promises.readFile(n,"utf8"),s=JSON.parse(i);s.scripts||={},delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepare,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack;const o=t.resolve(e.dirPath,".husky");await Promise.all([r.promises.writeFile(n,JSON.stringify(s,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),T("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await $.run((()=>r.promises.writeFile(a,Ee.preCommit+"\n")));const{typecheck:c}=Se(e);if(c){let n=e.repository?.startsWith("github:WillBoosterLab/")?Ee.prePushForLab:Ee.prePush;n=n.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await $.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),n+"\n",{mode:493})))}const l=[];e.versionsText&&l.push('run_if_changed "\\..+-version" "asdf plugin update --all"');e.versionsText?.includes("python ")&&l.push('run_if_changed "\\..+-version" "asdf install python"');e.versionsText&&l.push('run_if_changed "\\..+-version" "asdf install"');const p=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";l.push(`run_if_changed "package\\.json" "yarn${p}"`),e.containingPoetryLock&&l.push('run_if_changed "poetry\\.lock" "poetry install"');e.depending.blitz?l.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&l.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"');const d=`${Ee.postMerge}\n\n${l.join("\n")}\n`;await $.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),d,{mode:493})))}(e)}))}const Re='<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="ts" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.ts)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="tsx" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.tsx)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="js" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.js)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="json" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.json)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="md" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.md)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="html" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.html)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n </component>\n</project>\n';async function Te(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(r.existsSync(n)){const i=t.resolve(n,"watcherTasks.xml");await(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages||e.containingPackageJson&&!e.containingPubspecYaml&&!e.containingGemfile&&!e.containingGoMod&&!e.containingPomXml?$.run((()=>E.generateFile(i,Re))):$.run((()=>r.promises.rm(i,{force:!0}))))}}))}async function De(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const n=e.root?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.containingJavaScript||e.containingTypeScript){const t=`\n '${Be(e)}': [${JSON.stringify(`${n}eslint --fix${he.getLintFixSuffix(e)}`)}, '${n}prettier --cache --write'],`;i.push(t)}const s=e.root?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${Q.prettier.join(",")}}': files => {\n ${e.containingJavaScript||e.containingTypeScript?function(e){return`files = micromatch.not(files, '${Be(e)}');`}(e):""}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${s});\n if (filteredFiles.length === 0) return [];\n const commands = [\`${n}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${n}sort-package-json');\n }\n return commands;\n },`),e.containingPubspecYaml&&i.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.containingPoetryLock&&i.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const o=`${e.containingJavaScript||e.containingTypeScript?"const micromatch = require('micromatch');":""}\n\nmodule.exports = {${i.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await $.run((()=>E.generateFile(a,o)))}(e)}))}function Be(e){return`./{${je(e).join(",")}}/**/*.{${Q.eslint.join(",")}}`}async function Ae(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const n=["js","mjs","cjs"].map((n=>t.resolve(e.dirPath,`next.config.${n}`))).find((e=>r.existsSync(e)));if(!n)return;const i=(await r.promises.readFile(n,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await $.run((()=>E.generateFile(n,i)))}))}const Ie="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function We(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),i=await E.readFileIgnoringError(n)??"",s=K.getHeadUserContent(i),o=K.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await K.readGitignoreWithoutSeparators(r)||"";let c="";e.containingPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=s+Ie+c+a+o;await $.run((()=>E.generateFile(n,l)))}))}const Ne={venvPath:".",venv:".venv"};async function Ce(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let n=g(Ne);const i=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(i,"utf8"),t=JSON.parse(e);n=d.all([n,t,n],{arrayMerge:oe})}catch{}const s=JSON.stringify(n);await $.run((()=>E.generateFile(i,s)))}))}const Je="[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)";async function Le(e){return j.functionIgnoringException("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let i=await r.promises.readFile(n,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(i=ze(i,Je));const s=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const n of o){if(!n.startsWith("test")&&!n.startsWith("deploy"))continue;let o=n;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[![${o}](https://github.com/${s}/actions/workflows/${n}/badge.svg)](https://github.com/${s}/actions/workflows/${n})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${n}`))&&(i=ze(i,a))}await $.run((()=>E.generateFile(n,i)))}))}function ze(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const i=e.slice(0,n+1);let s=e.slice(n+1);return s.startsWith("[")||s.startsWith("!")||(s=`\n${s}`),`${i}${t}\n${s}`}return`${e}\n${t}\n`}async function Ge(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json"),i=JSON.parse(await r.promises.readFile(n,"utf8")),s=i?.plugins||[];for(let e=0;e<s.length;e++){const t=Array.isArray(s[e])?s[e][0]:s[e],n=Array.isArray(s[e])&&s[e][1]||{};"@semantic-release/commit-analyzer"===t?s[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:oe})]:"@semantic-release/github"===t&&(s[e]=["@semantic-release/github",d.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:oe})])}const o=JSON.stringify(i);await $.run((()=>E.generateFile(n,o)))}))}const Ue={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function He(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let n=g(Ue);const i=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${i}5`))return;try{const e=await r.promises.readFile(i,"utf8"),t=JSON.parse(e);n=d.all([n,t,n],{arrayMerge:oe}),n.extends=n.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const s=JSON.stringify(n);await $.run((()=>E.generateFile(i,s)))}))}function Me(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,i]of t)delete e[n],e[n]=i,"object"==typeof i&&null!==i&&Me(i);return e}const qe={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Ye={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function Ke(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let n=g(e.root?qe:Ye);e.containingJsxOrTsx||e.containingJsxOrTsxInPackages||delete n.compilerOptions?.jsx,e.root&&!e.containingSubPackageJsons&&(n.include=n.include?.filter((e=>!e.startsWith("packages/*/")))),e.esmPackage&&(n.compilerOptions={...n.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(i,"utf8"),s=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===s.extends&&delete s.extends,delete n.compilerOptions?.target,e.esmPackage||(delete n.compilerOptions?.module,delete n.compilerOptions?.moduleResolution),s.compilerOptions?.jsx&&delete n.compilerOptions?.jsx,n=d.all([n,s,n],{arrayMerge:re}),n.include=n.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Me(n),n.include?.sort();const s=JSON.stringify(n);delete n.compilerOptions?.experimentalDecorators,await $.run((()=>E.generateFile(i,s)))}))}const Ve=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Xe(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const n=t.resolve(e.dirPath,".vscode","settings.json"),i=await r.promises.readFile(n,"utf8");let s=JSON.parse(i);for(const e of Ve)s=d.all([s,Ze(e)]);e.containingPoetryLock&&(s=d.all([s,Ze("**/.venv/**")])),e.depending.next&&(s=d.all([s,Ze("**/.next/**")])),Me(s??{});const o=JSON.stringify(s,void 0,2);await $.run((()=>E.generateFile(n,o)))}catch{}}))}function Ze(e){return{"files.watcherExclude":{[e]:!0}}}const Qe={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-focused-issue-to-project":{name:"Add focused issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-focused-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{label:"focused :dart:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBooster/projects/7"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{label:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function et(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(n,{recursive:!0});const i=t.resolve(e.dirPath,".github","semantic.yml");await $.run((()=>r.promises.rm(i,{force:!0,recursive:!0})));const s=await r.promises.readdir(n,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml","add-focused-issue-to-project.yml",...s.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.publicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const i of o){const s=t.basename(i,".yml");await $.run((()=>tt(e,n,s)))}}))}async function tt(e,n,i){let s=g(Qe[i]??{});const o=t.join(n,`${i}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=f.load(e);s=d.all([s,t,s],{arrayMerge:re})}catch{}i.startsWith("deploy")&&(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},s.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(s,"jobs"),s.on?.push&&(s.on.push["paths-ignore"]=[...new Set([...s.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(s.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;nt(e,t,i)}switch(i){case"release":if(s.on?.schedule)delete s.on.push;else{if(!(s.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(n,"release.yml"),{force:!0});s.on.push.branches=e.release.branches}break;case"test":s.on?.push&&(s.on.push.branches=s.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":s.on&&it(s,20,24);break;case"wbfy-merge":it(s,1,4)}if(function(e){delete e.jobs["add-to-project"]}(s),await st(s,o),"release"===i)await r.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await r.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!s.jobs.sync||!s.jobs.sync.with)return;s.jobs["sync-force"]=s.jobs.sync;const e=s.jobs.sync.with.sync_params_without_dest;if(!e)return;s.jobs.sync.with.sync_params_without_dest=`--force ${e}`,s.name="Force to Sync",s.on={workflow_dispatch:null},delete s.jobs.sync,await st(s,t.join(n,"sync-force.yml"))}}function nt(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-focused-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.publicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.toString().replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,".env"===e.with.dot_env_path&&delete e.with.dot_env_path;delete e.with.cpu_arch}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.containingDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.publicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Me(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Me(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function it(e,t,n){const[i,s]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==i&&Number.isInteger(s)){const e=(s+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function st(e,t){const n=f.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,n)}async function ot(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const n=D("yarn",["--version"],e.dirPath),i=function(e,t){const n=D("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);rt(n)<=rt(i)&&n!==i&&T("yarn",["set","version",i],e.dirPath,1);const s=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(s,{recursive:!0});for(const e of await r.promises.readdir(s))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&await $.run((()=>r.promises.rm(t.join(s,e))));const o=t.resolve(e.dirPath,".yarnrc");await $.run((()=>r.promises.rm(o,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=f.load(await r.promises.readFile(a,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter((e=>".yarn/plugins/undefined.cjs"!==e.path))??[],c.plugins.length!==l){const n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await $.run((()=>r.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(a,f.dump(c,{lineWidth:-1})),T("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function rt(e){const[t]=e.split(".");return Number(t)}async function at(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!we)return;const[t,n]=ve.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await ct(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ct(t,n,"d2: easy :rabbit2:","DDD6FE"),await ct(t,n,"d3: medium :ox:","C4B5FD"),await ct(t,n,"d4: hard :squid:","A78BFA"),await ct(t,n,"d5: x-hard :whale2:","8B5CF6"),await ct(t,n,"p1: critical :fire::fire::fire:","EF4444"),await ct(t,n,"p2: urgent :fire::fire:","F87171"),await ct(t,n,"p3: important :fire:","FCA5A5"),await ct(t,n,"p4: nice to have :droplet:","FECACA"),await ct(t,n,"r: blitz","5300bc"),await ct(t,n,"r: firebase","ffca28"),await ct(t,n,"r: prisma","0c344b"),await ct(t,n,"r: react","61dafb"),await ct(t,n,"r: svelte","ff3e00"),await ct(t,n,"r: semantic-release","494949"),await ct(t,n,"ready :rocket:","22C55E"),await ct(t,n,"review requested :mag:","FBCA04"),await ct(t,n,"released :bookmark:","6366F1"),await ct(t,n,"s: 0.5h :clock1230:","F3F4F6"),await ct(t,n,"s: 1h :clock1:","E5E7EB"),await ct(t,n,"s: 2h :clock2:","D1D5DB"),await ct(t,n,"s: 3h :clock3:","9CA3AF"),await ct(t,n,"s: 5h :clock5:","6B7280"),await ct(t,n,"s: 8h :clock8:","4B5563"),await ct(t,n,"s: 13h :clock1:","374151"),await ct(t,n,"t: build :hammer:","BFDBFE"),await ct(t,n,"t: chore :broom:","BFDBFE"),await ct(t,n,"t: ci :construction_worker:","BFDBFE"),await ct(t,n,"t: docs :memo:","BFDBFE"),await ct(t,n,"t: feat :sparkles:","BFDBFE"),await ct(t,n,"t: fix :bug:","BFDBFE"),await ct(t,n,"t: perf :zap:","BFDBFE"),await ct(t,n,"t: refactor :recycle:","BFDBFE"),await ct(t,n,"t: style :lipstick:","BFDBFE"),await ct(t,n,"t: test :test_tube:","BFDBFE"),await ct(t,n,"project","24292F"),await ct(t,n,"focused :dart:","22C55E"),await lt(t,n,"bug"),await lt(t,n,"documentation"),await lt(t,n,"duplicate"),await lt(t,n,"enhancement"),await lt(t,n,"good first issue"),await lt(t,n,"help wanted"),await lt(t,n,"invalid"),await lt(t,n,"question"),await lt(t,n,"wontfix"),await lt(t,n,"ready"),await lt(t,n,"review requested"),await lt(t,n,"released"),await lt(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function ct(e,t,n,i){try{await be.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:i})}catch{await be.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:i})}}async function lt(e,t,n){try{await be.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const pt=["READY_DISCORD_WEBHOOK_URL"];async function dt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!we||!k.doesUploadEnvVars)return;const[t,n]=ve.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const i=h.config().parsed||{};if(0!==Object.keys(i).length)try{for(const e of pt)try{await be.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const s=await be.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=s.data;await y.ready;for(const[s,a]of Object.entries(i)){if(e.publicRepo&&"GH_BOT_PAT"===s)continue;if(!e.publicRepo&&"PUBLIC_GH_BOT_PAT"===s)continue;const i=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,i),p=y.to_base64(l,y.base64_variants.ORIGINAL);await be.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:s,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function ut(e){const[t,n]=ve.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await i((()=>be.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))))}const mt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on PR page. (You may leave this box unchecked due to long workflows.)\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on PR\'s diff view.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n'.trim()};async function gt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[n,i]of Object.entries(mt)){const s=t.resolve(e.dirPath,".github",n);if(r.existsSync(s)){const e=await r.promises.readFile(s,"utf8");if(w(e,i)>i.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await $.run((()=>E.generateFile(s,i)))}}))}const ft=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function ht(n){const i=t.resolve(n,"package.json");try{const s=r.existsSync(i);let o={},a={},c={},l=!1;if(s){const e=r.readFileSync(i,"utf8");c=JSON.parse(e),o=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const i=t.resolve(n,".releaserc.json"),s=JSON.parse(await e.readFile(i,"utf8"));p=s?.branches||[],d=s?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(n,".."))||!r.existsSync(t.resolve(n,"..","..","package.json"));let m;u&&(m=await async function(e,t){const n=b(e),i=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),s=i?.refs?.fetch??i?.refs?.push;if("string"==typeof s){const e=await wt(s);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await wt(o);if(e&&"Not Found"!==e.message)return e}}(n,c));let g="";try{g+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[i,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${i}-version`),"utf8");g&&(g+="\n"),g+=s+" "+o.trim()}catch{}let f="";try{f=await e.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let y;try{const t=await e.readFile(h,"utf8");y=ft.parse(JSON.parse(t))}catch{}const w={dirPath:n,dockerfile:f,root:u,publicRepo:!1===m?.private,referredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,esmPackage:l,willBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),containingSubPackageJsons:yt("packages/**/package.json",n),containingDockerfile:!!f||r.existsSync(t.resolve(n,"docker-compose.yml")),containingGemfile:r.existsSync(t.resolve(n,"Gemfile")),containingGoMod:r.existsSync(t.resolve(n,"go.mod")),containingPackageJson:r.existsSync(t.resolve(n,"package.json")),containingPoetryLock:r.existsSync(t.resolve(n,"poetry.lock")),containingPomXml:r.existsSync(t.resolve(n,"pom.xml")),containingPubspecYaml:r.existsSync(t.resolve(n,"pubspec.yaml")),containingTemplateYaml:r.existsSync(t.resolve(n,"template.yaml")),containingVscodeSettingsJson:r.existsSync(t.resolve(n,".vscode","settings.json")),containingJavaScript:yt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScript:yt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsx:yt("{app,src,tests}/**/*.{t,j}sx",n),containingJavaScriptInPackages:yt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScriptInPackages:yt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsxInPackages:yt("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!o.blitz,firebase:!!a["firebase-tools"],litestream:f.includes("install-litestream.sh"),next:!!o.next,playwrightTest:!!o["@playwright/test"]||!!a["@playwright/test"]||!!a.playwright,prisma:!!o["@prisma/client"]||!!a.prisma,pyright:!!a.pyright,reactNative:!!o["react-native"],semanticRelease:!!(a["semantic-release"]||p.length>0||d.length>0),storybook:!!a["@storybook/react"],wb:!!(o["@willbooster/wb"]||a["@willbooster/wb"]||o["@willbooster/shared-scripts"]||a["@willbooster/shared-scripts"])},release:{branches:p,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},versionsText:g,packageJson:c,wbfyJson:y};if(w.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.containingTypeScript)return e.containingJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.containingJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.containingJavaScript)return"@willbooster/eslint-config-js"}(w),w.containingGemfile||w.containingGoMod||w.containingPackageJson||w.containingPoetryLock||w.containingPomXml||w.containingPubspecYaml||w.containingTemplateYaml)return w}catch{}}function yt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function wt(e){const[t,n]=ve.getOrgAndName(e);if(!t||!n)return;const i={full_name:`${t}/${n}`};try{const e=await be.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(i,e.data)}catch{}return i}await async function(){const n=await o(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",(e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})})).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const i of n.paths){const o=t.join(i,"packages"),r=(await s((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await F([i,...r]);const a=await ht(i);if(!a){console.error(`there is no valid package.json in ${i}`);continue}const c=O(a),l=(await Promise.all(r.map((e=>ht(e))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await J(a),await ot(a),await Promise.all([x(a),P(a),c.then((()=>Le(a))),Z(a),te(a),le(a),gt(a),Oe(a),Te(a),De(a),He(a),Ge(a),et(a),at(a),dt(a),ut(a)]),await $.promiseAll();const d=[];for(const e of p)(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push(S(e,e.root?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(Ae(e)),await ue(e,a),await $.promiseAll(),(e.root||e.containingPackageJson)&&(await We(e),await $e(e,a,n.skipDeps),d.push(De(e)),e.containingVscodeSettingsJson&&e.containingPackageJson&&d.push(Xe(e)),(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push(Ke(e)),(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(a.willBoosterConfigs||d.push(ae(e,a)),d.push(se(e))),e.depending.pyright&&d.push(Ce(e)));await Promise.all(d),await $.promiseAll(),T("yarn",["cleanup"],i),T("yarn",["install"],i)}}();
1
+ import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as i,ignoreErrorAsync as s}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import p from"node:child_process";import d from"deepmerge";import u from"node:os";import{Octokit as m}from"@octokit/core";import g from"lodash.clonedeep";import f from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(n){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!n.containingDockerfile)return;const i=n.dockerfile,s=i;i!==s&&await e.writeFile(t.join(n.dirPath,"Dockerfile"),s)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const n=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(n))return;const i=await r.promises.readFile(n,"utf8"),s=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==s&&await r.promises.writeFile(n,s)}))}async function P(n){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const i=await a(["*.env","*.env.*"],{dot:!0,cwd:n.dirPath});for(const s of i){const i=t.resolve(n.dirPath,s),o=(await e.readFile(i,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(i,o)}}))}async function F(e){return j.functionIgnoringException("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),i=t.join(e,"tests");try{await r.promises.rename(n,i);const s=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=s.replaceAll("__tests__","tests");if(s===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const $=new l;async function S(i,s){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(i.dirPath,"@types"),r=i.root&&i.containingSubPackageJsons?void 0:t.resolve(i.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const i of a){const a=i.name.slice(0,-5),c=i.name.endsWith(".d.ts");let l=c?a:i.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));i.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await $.run((()=>e.rename(t.join(o,i.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await $.run((()=>e.rename(t.join(o,i.name),t.join(r,i.name))))):i.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await $.run((()=>n((()=>e.rename(t.join(o,i.name,"index.d.ts"),t.join(r,`${i.name}.d.ts`)))))))}}))}const E={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n)}};async function O(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const n=e.dirPath,i=await a("**/*.md",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${n}`);for(const s of i){const i=t.join(n,s);await $.run((async()=>{const t=await r.promises.readFile(i,"utf8");let n=t.replaceAll("c.f.","cf.").replaceAll("eg.","e.g.").replaceAll("ie.","i.e.");n=R(n,e,"doc"),t!==n&&await E.generateFile(i,n)}))}const s=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${n}`);for(const i of s){const s=t.join(n,i),o=await r.promises.readFile(s,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=R(a,e,"ts"),o!==a&&await E.generateFile(s,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${n}`);for(const i of o){const s=t.join(n,i),o=await r.promises.readFile(s,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=R(a,e,"text"),o!==a&&await E.generateFile(s,a)}await $.promiseAll()}))}function R(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,s]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,s);return e}function T(e,t,n,i=0){do{const[i,s,o]=B(e,t,n);if(0===p.spawnSync(i,s,o).status)break}while(--i>=0)}function D(e,t,n){const[i,s,o]=B(e,t,n);o.stdio="pipe";const r=p.spawnSync(i,s,o),a=r.stderr.toString().trim();return a&&console.error(`${i} [${s.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function B(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.replace(`${i.BERRY_BIN_FOLDER}:`,"")),i.ASDF_DIR&&(t=["-l","-c",`. ${i.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:i,shell:!1,stdio:"inherit"}]}function A(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let n=0,i=1;for(const e of t)n+=e*i,i/=1e3;return n}const I="3.9.18",W="zulu-11.68.17",N="2.0.4",C="14.1.0";async function J(e){return j.functionIgnoringException("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${L.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),i=[...new Set(n)];if(e.containingPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&G(i,"poetry",t?.info?.version),G(i,"python",I,!0)}e.depending.firebase&&G(i,"java",W,!0);if(e.containingPackageJson){const t=D("npm",["show","yarn","version"],e.dirPath);G(i,"yarn",t)}for(const n of z){const i=t.resolve(e.dirPath,`.${n}-version`);r.promises.rm(i,{force:!0})}const s=t.resolve(e.dirPath,".tool-versions");await(i.length>0?$.run((()=>r.promises.writeFile(s,i.join("\n")+"\n"))):$.run((()=>r.promises.rm(s,{force:!0})))),await $.promiseAll(),T("asdf",["plugin","update","--all"],e.dirPath),T("asdf",["install"],e.dirPath)}(e)}))}const L=new Set(["java","nodejs","python"]),z=["java","node","python"];function G(e,t,n,i=!1){const s=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(s>=0){const[,t]=e[s].split(/\s+/);A(n)>A(t)&&(e[s]=o)}else e.splice(i?0:e.length,0,o)}const U="# Project-specific settings",H=/# Project-specific settings[^\n]*\n/gm,M="# Generated by wbfy",q=`${U} (head)\n\n\n${M}\n`,Y=`\n${U} (tail)\n`,K={separator:M,separatorPrefix:"# Generated by ",defaultHeadUserContent:q,defaultTailUserContent:Y,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const n=V(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(H,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return t>=0?e.slice(0,e.indexOf("\n",t)+1).replaceAll(H,`${U} (head)\n`):q},getTailUserContent(e){const t=V(e);return t>0?e.slice(t-1):Y},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function V(e){const t=e.indexOf(U),n=e.lastIndexOf(U);return n>t?n:-1}const X="\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n";async function Z(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.containingDockerfile){const e=await E.readFileIgnoringError(n)??"",t=K.getHeadUserContent(e),i=K.getTailUserContent(e),s=t+X+i;await $.run((()=>E.generateFile(n,s)))}else await r.promises.rm(n,{force:!0})}))}const Q={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","css","htm","html","md","scss","vue","yaml","yml"].sort()},ee=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ne(Q.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ne(Q.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ne(Q.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ne(Q.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function te(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run((()=>E.generateFile(n,ee)))}))}function ne(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const ie="\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n";async function se(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore"),i=await E.readFileIgnoringError(n)??"",s=K.getHeadUserContent(i),o=K.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await K.readGitignoreWithoutSeparators(r)||"",c=s+ie+a+o;await $.run((()=>E.generateFile(n,c)))}))}function oe(e,t){return t}function re(e,t,n){const i=[...e];for(const[s,o]of t.entries())void 0===i[s]?i[s]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?i[s]=d(e[s],o,n):e.includes(o)||i.push(o);return i}async function ae(e,n){return j.functionIgnoringException("generateEslintrc",(async()=>{const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let s={root:!0,extends:i};const o=t.resolve(e.dirPath,".eslintrc.json");try{const t=await r.promises.readFile(o,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=s.extends;s.extends=n.extends,n.extends=a,s=d.all([s,n,s],{arrayMerge:re}),e.depending.blitz&&(s.extends=s.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(s);await $.run((()=>E.generateFile(o,a)))}))}const ce=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...Q.codeWith2IndentSize,...Q.codeWith4IndentSize,...Q.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function le(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run((()=>E.generateFile(n,ce)))}))}const pe=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],de="\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\nIcon[\r]\n!.keep\n*/mount/*.hash\n\n";async function ue(e,n){return j.functionIgnoringException("generateGitignore",(async()=>{const i=t.resolve(e.dirPath,".gitignore"),s=await E.readFileIgnoringError(i)??"";let o=K.getHeadUserContent(s)+de;const r=K.getTailUserContent(s),a=[...pe];e.containingGemfile&&a.push("ruby"),e.containingGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.containingPackageJson&&a.push("node"),e.containingPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.containingPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.containingTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.containingPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),n.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await fe(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),s=await i.text();if(!i.ok||s.includes("Attention Required!")||s.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=s.trim(),await $.run((()=>ge(e,t))),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await K.isBerryZeroInstallEnabled(i)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.containingPomXml||e.containingPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.containingPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.containingPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await $.run((()=>E.generateFile(i,l)))}))}const me=t.join(u.homedir(),".cache","wbfy","gitignore");async function ge(e,n){await r.promises.mkdir(me,{recursive:!0}),await r.promises.writeFile(t.join(me,e),n)}async function fe(e){try{const n=await r.promises.stat(t.join(me,e));if(Date.now()-n.mtimeMs>216e5)return;return await r.promises.readFile(t.join(me,e),"utf8")}catch{}}const he={getLintFixSuffix:e=>e.containingJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},ye=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,we=!!ye,be=new m({auth:ye});const ve=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},ke={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function je(e){return e.depending.blitz?ke.blitz:ke.node}const xe=["eslint","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],_e=[...xe,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Pe=["eslint-plugin-react","eslint-plugin-react-hooks"],Fe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...xe],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...xe,...Pe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",..._e],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",..._e,...Pe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",..._e,...Pe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",..._e,...Pe]};async function $e(e,n,i){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,n,i){const s=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(s,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e){"WillBooster LLC"===e.author&&(e.author="WillBooster Inc.");delete e.scripts["sort-package-json"],delete e.scripts["sort-all-package-json"],delete e.scripts["typecheck/warn"],delete e.scripts["typecheck:gen-code"],delete e.scripts["typecheck:codegen"],delete e.dependencies["@willbooster/shared-scripts"],delete e.dependencies.tslib,delete e.devDependencies["@willbooster/eslint-config"],delete e.devDependencies["@willbooster/eslint-config-react"],delete e.devDependencies["@willbooster/renovate-config"],delete e.devDependencies["@willbooster/shared-scripts"],delete e.devDependencies["@willbooster/tsconfig"],delete e.devDependencies["eslint-import-resolver-node"],delete e.devDependencies["eslint-plugin-prettier"],delete e.devDependencies.lerna,delete e.devDependencies.pinst,delete e.scripts["flutter-format"],delete e.scripts["format-flutter"],delete e.scripts["python-format"],delete e.scripts["format-python"],delete e.scripts.prettier;for(const t of Object.values(Fe))for(const n of t)delete e.devDependencies[n];await $.run((()=>r.promises.rm("lerna.json",{force:!0})))}(l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=d(l.scripts,Se(e)),l.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),i=await r.promises.readFile(n,"utf8"),s=i.indexOf(K.separatorPrefix);if(s<0)return"";const o=i.slice(0,s);return o.split("\n").map((e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t})).filter((e=>e&&!e.startsWith("#")&&!e.includes("/"))).map((e=>` "!**/${e}/**"`)).join("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["lint-staged","prettier","sort-package-json","@willbooster/prettier-config"];const m=[];if(e.root){if(u.push("husky"),l.scripts.postinstall="husky",(e.publicRepo||e.referredByOtherRepo)&&(u.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable"),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";u.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.containingSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?d.all([l.workspaces,["packages/*"]],{arrayMerge:re}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb){l.dependencies["@willbooster/shared-scripts"]||l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(u.push("eslint","micromatch"),e.containingTypeScriptInPackages&&u.push("@typescript-eslint/parser"));(e.containingTypeScript||e.containingTypeScriptInPackages)&&u.push("typescript");e.eslintBase&&u.push(...Fe[e.eslintBase]);e.willBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),u=u.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.containingSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&n.publicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[g]=ve.getOrgAndName(e.repository??"");"WillBooster"!==g&&"WillBoosterLab"!==g||(l.author="WillBooster Inc.");e.root||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.containingSubPackageJsons){if(e.containingJavaScript||e.containingTypeScript?l.scripts["lint-fix"]+=he.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix","")),e.containingPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>r.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(l.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.containingPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,i]=e.split(/[/\\]/);i&&n.add(t)}if(n.size>0){const e=[...n].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${N}`,`@blitzjs/auth@${N}`,`@blitzjs/next@${N}`,`@blitzjs/rpc@${N}`,`next@${C}`),u=u.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;let f=JSON.stringify(l);f=await async function(e,n,i){const s=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&s.push([t,t.replaceAll(":","-")]);if(0===s.length)return n;for(const[e,t]of s)n=n.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,gitignore:!0});for(const e of o)await $.run((async()=>{const n=t.join(i.dirPath,e),o=await r.promises.readFile(n,"utf8");let a=o;for(const[e,t]of s)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(n,a)}));return await $.promiseAll(),n}(l.scripts,f,e),await r.promises.writeFile(s,f),i||(p=p.filter((e=>!l.devDependencies?.[e])),p.length>0&&T("yarn",["add",...new Set(p)],e.dirPath),u=u.filter((e=>!l.dependencies?.[e])),u.length>0&&T("yarn",["add","-D",...new Set(u)],e.dirPath),m.length>0&&T("poetry",["add","--group","dev",...new Set(m)],e.dirPath))}(e,n,i)}))}function Se(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${je(e)}}/**/*.{${Q.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Q.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.containingSubPackageJsons){const e=t.test;t=d({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Q.prettier.join(",")}}" "!**/packages/**" "!**/test-fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),e?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.containingTypeScript||e.containingTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}const Ee={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Oe(e){return j.functionIgnoringException("generateHuskyrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),i=await r.promises.readFile(n,"utf8"),s=JSON.parse(i);s.scripts||={},delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepare,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack;const o=t.resolve(e.dirPath,".husky");await Promise.all([r.promises.writeFile(n,JSON.stringify(s,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),T("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await $.run((()=>r.promises.writeFile(a,Ee.preCommit+"\n")));const{typecheck:c}=Se(e);if(c){let n=e.repository?.startsWith("github:WillBoosterLab/")?Ee.prePushForLab:Ee.prePush;n=n.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await $.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),n+"\n",{mode:493})))}const l=[];e.versionsText&&l.push('run_if_changed "\\..+-version" "asdf plugin update --all"');e.versionsText?.includes("python ")&&l.push('run_if_changed "\\..+-version" "asdf install python"');e.versionsText&&l.push('run_if_changed "\\..+-version" "asdf install"');const p=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";l.push(`run_if_changed "package\\.json" "yarn${p}"`),e.containingPoetryLock&&l.push('run_if_changed "poetry\\.lock" "poetry install"');e.depending.blitz?l.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&l.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"');const d=`${Ee.postMerge}\n\n${l.join("\n")}\n`;await $.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),d,{mode:493})))}(e)}))}const Re='<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="ts" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.ts)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="tsx" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.tsx)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="js" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.js)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="json" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.json)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="md" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.md)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="html" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.html)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n </component>\n</project>\n';async function Te(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(r.existsSync(n)){const i=t.resolve(n,"watcherTasks.xml");await(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages||e.containingPackageJson&&!e.containingPubspecYaml&&!e.containingGemfile&&!e.containingGoMod&&!e.containingPomXml?$.run((()=>E.generateFile(i,Re))):$.run((()=>r.promises.rm(i,{force:!0}))))}}))}async function De(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const n=e.root?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.containingJavaScript||e.containingTypeScript){const t=`\n '${Be(e)}': [${JSON.stringify(`${n}eslint --fix${he.getLintFixSuffix(e)}`)}, '${n}prettier --cache --write'],`;i.push(t)}const s=e.root?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${Q.prettier.join(",")}}': files => {\n ${e.containingJavaScript||e.containingTypeScript?function(e){return`files = micromatch.not(files, '${Be(e)}');`}(e):""}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${s});\n if (filteredFiles.length === 0) return [];\n const commands = [\`${n}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${n}sort-package-json');\n }\n return commands;\n },`),e.containingPubspecYaml&&i.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.containingPoetryLock&&i.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const o=`${e.containingJavaScript||e.containingTypeScript?"const micromatch = require('micromatch');":""}\n\nmodule.exports = {${i.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await $.run((()=>E.generateFile(a,o)))}(e)}))}function Be(e){return`./{${je(e).join(",")}}/**/*.{${Q.eslint.join(",")}}`}async function Ae(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const n=["js","mjs","cjs"].map((n=>t.resolve(e.dirPath,`next.config.${n}`))).find((e=>r.existsSync(e)));if(!n)return;const i=(await r.promises.readFile(n,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await $.run((()=>E.generateFile(n,i)))}))}const Ie="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function We(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),i=await E.readFileIgnoringError(n)??"",s=K.getHeadUserContent(i),o=K.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await K.readGitignoreWithoutSeparators(r)||"";let c="";e.containingPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=s+Ie+c+a+o;await $.run((()=>E.generateFile(n,l)))}))}const Ne={venvPath:".",venv:".venv"};async function Ce(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let n=g(Ne);const i=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(i,"utf8"),t=JSON.parse(e);n=d.all([n,t,n],{arrayMerge:oe})}catch{}const s=JSON.stringify(n);await $.run((()=>E.generateFile(i,s)))}))}const Je="[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)";async function Le(e){return j.functionIgnoringException("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let i=await r.promises.readFile(n,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(i=ze(i,Je));const s=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const n of o){if(!n.startsWith("test")&&!n.startsWith("deploy"))continue;let o=n;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[![${o}](https://github.com/${s}/actions/workflows/${n}/badge.svg)](https://github.com/${s}/actions/workflows/${n})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${n}`))&&(i=ze(i,a))}await $.run((()=>E.generateFile(n,i)))}))}function ze(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const i=e.slice(0,n+1);let s=e.slice(n+1);return s.startsWith("[")||s.startsWith("!")||(s=`\n${s}`),`${i}${t}\n${s}`}return`${e}\n${t}\n`}async function Ge(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json"),i=JSON.parse(await r.promises.readFile(n,"utf8")),s=i?.plugins||[];for(let e=0;e<s.length;e++){const t=Array.isArray(s[e])?s[e][0]:s[e],n=Array.isArray(s[e])&&s[e][1]||{};"@semantic-release/commit-analyzer"===t?s[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:oe})]:"@semantic-release/github"===t&&(s[e]=["@semantic-release/github",d.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:oe})])}const o=JSON.stringify(i);await $.run((()=>E.generateFile(n,o)))}))}const Ue={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function He(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let n=g(Ue);const i=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${i}5`))return;try{const e=await r.promises.readFile(i,"utf8"),t=JSON.parse(e);n=d.all([n,t,n],{arrayMerge:oe}),n.extends=n.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const s=JSON.stringify(n);await $.run((()=>E.generateFile(i,s)))}))}function Me(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,i]of t)delete e[n],e[n]=i,"object"==typeof i&&null!==i&&Me(i);return e}const qe={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Ye={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function Ke(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let n=g(e.root?qe:Ye);e.containingJsxOrTsx||e.containingJsxOrTsxInPackages||delete n.compilerOptions?.jsx,e.root&&!e.containingSubPackageJsons&&(n.include=n.include?.filter((e=>!e.startsWith("packages/*/")))),e.esmPackage&&(n.compilerOptions={...n.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(i,"utf8"),s=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===s.extends&&delete s.extends,delete n.compilerOptions?.target,e.esmPackage||(delete n.compilerOptions?.module,delete n.compilerOptions?.moduleResolution),s.compilerOptions?.jsx&&delete n.compilerOptions?.jsx,n=d.all([n,s,n],{arrayMerge:re}),n.include=n.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Me(n),n.include?.sort();const s=JSON.stringify(n);delete n.compilerOptions?.experimentalDecorators,await $.run((()=>E.generateFile(i,s)))}))}const Ve=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Xe(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const n=t.resolve(e.dirPath,".vscode","settings.json"),i=await r.promises.readFile(n,"utf8");let s=JSON.parse(i);for(const e of Ve)s=d.all([s,Ze(e)]);e.containingPoetryLock&&(s=d.all([s,Ze("**/.venv/**")])),e.depending.next&&(s=d.all([s,Ze("**/.next/**")])),Me(s??{});const o=JSON.stringify(s,void 0,2);await $.run((()=>E.generateFile(n,o)))}catch{}}))}function Ze(e){return{"files.watcherExclude":{[e]:!0}}}const Qe={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-focused-issue-to-project":{name:"Add focused issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-focused-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{label:"focused :dart:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBooster/projects/7"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{label:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function et(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(n,{recursive:!0});const i=t.resolve(e.dirPath,".github","semantic.yml");await $.run((()=>r.promises.rm(i,{force:!0,recursive:!0})));const s=await r.promises.readdir(n,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml","add-focused-issue-to-project.yml",...s.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.publicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const i of o){const s=t.basename(i,".yml");await $.run((()=>tt(e,n,s)))}}))}async function tt(e,n,i){let s=g(Qe[i]??{});const o=t.join(n,`${i}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=f.load(e);s=d.all([s,t,s],{arrayMerge:re})}catch{}i.startsWith("deploy")&&(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},s.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(s,"jobs"),s.on?.push&&(s.on.push["paths-ignore"]=[...new Set([...s.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(s.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;nt(e,t,i)}switch(i){case"release":if(s.on?.schedule)delete s.on.push;else{if(!(s.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(n,"release.yml"),{force:!0});s.on.push.branches=e.release.branches}break;case"test":s.on?.push&&(s.on.push.branches=s.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":s.on&&it(s,20,24);break;case"wbfy-merge":it(s,1,4)}if(function(e){delete e.jobs["add-to-project"]}(s),await st(s,o),"release"===i)await r.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await r.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!s.jobs.sync||!s.jobs.sync.with)return;s.jobs["sync-force"]=s.jobs.sync;const e=s.jobs.sync.with.sync_params_without_dest;if(!e)return;s.jobs.sync.with.sync_params_without_dest=`--force ${e}`,s.name="Force to Sync",s.on={workflow_dispatch:null},delete s.jobs.sync,await st(s,t.join(n,"sync-force.yml"))}}function nt(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-focused-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.publicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.toString().replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,".env"===e.with.dot_env_path&&delete e.with.dot_env_path;delete e.with.cpu_arch}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.containingDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.publicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Me(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Me(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function it(e,t,n){const[i,s]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==i&&Number.isInteger(s)){const e=(s+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function st(e,t){const n=f.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,n)}async function ot(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const n=D("yarn",["--version"],e.dirPath),i=function(e,t){const n=D("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);rt(n)<=rt(i)&&n!==i&&T("yarn",["set","version",i],e.dirPath,1);const s=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(s,{recursive:!0});for(const e of await r.promises.readdir(s))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&await $.run((()=>r.promises.rm(t.join(s,e))));const o=t.resolve(e.dirPath,".yarnrc");await $.run((()=>r.promises.rm(o,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=f.load(await r.promises.readFile(a,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter((e=>".yarn/plugins/undefined.cjs"!==e.path))??[],c.plugins.length!==l){const n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await $.run((()=>r.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(a,f.dump(c,{lineWidth:-1})),T("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function rt(e){const[t]=e.split(".");return Number(t)}async function at(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!we)return;const[t,n]=ve.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await ct(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ct(t,n,"d2: easy :rabbit2:","DDD6FE"),await ct(t,n,"d3: medium :ox:","C4B5FD"),await ct(t,n,"d4: hard :squid:","A78BFA"),await ct(t,n,"d5: x-hard :whale2:","8B5CF6"),await ct(t,n,"p1: critical :fire::fire::fire:","EF4444"),await ct(t,n,"p2: urgent :fire::fire:","F87171"),await ct(t,n,"p3: important :fire:","FCA5A5"),await ct(t,n,"p4: nice to have :droplet:","FECACA"),await ct(t,n,"r: blitz","5300bc"),await ct(t,n,"r: firebase","ffca28"),await ct(t,n,"r: prisma","0c344b"),await ct(t,n,"r: react","61dafb"),await ct(t,n,"r: svelte","ff3e00"),await ct(t,n,"r: semantic-release","494949"),await ct(t,n,"ready :rocket:","22C55E"),await ct(t,n,"review requested :mag:","FBCA04"),await ct(t,n,"released :bookmark:","6366F1"),await ct(t,n,"s: 0.5h :clock1230:","F3F4F6"),await ct(t,n,"s: 1h :clock1:","E5E7EB"),await ct(t,n,"s: 2h :clock2:","D1D5DB"),await ct(t,n,"s: 3h :clock3:","9CA3AF"),await ct(t,n,"s: 5h :clock5:","6B7280"),await ct(t,n,"s: 8h :clock8:","4B5563"),await ct(t,n,"s: 13h :clock1:","374151"),await ct(t,n,"t: build :hammer:","BFDBFE"),await ct(t,n,"t: chore :broom:","BFDBFE"),await ct(t,n,"t: ci :construction_worker:","BFDBFE"),await ct(t,n,"t: docs :memo:","BFDBFE"),await ct(t,n,"t: feat :sparkles:","BFDBFE"),await ct(t,n,"t: fix :bug:","BFDBFE"),await ct(t,n,"t: perf :zap:","BFDBFE"),await ct(t,n,"t: refactor :recycle:","BFDBFE"),await ct(t,n,"t: style :lipstick:","BFDBFE"),await ct(t,n,"t: test :test_tube:","BFDBFE"),await ct(t,n,"project","24292F"),await ct(t,n,"focused :dart:","22C55E"),await lt(t,n,"bug"),await lt(t,n,"documentation"),await lt(t,n,"duplicate"),await lt(t,n,"enhancement"),await lt(t,n,"good first issue"),await lt(t,n,"help wanted"),await lt(t,n,"invalid"),await lt(t,n,"question"),await lt(t,n,"wontfix"),await lt(t,n,"ready"),await lt(t,n,"review requested"),await lt(t,n,"released"),await lt(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function ct(e,t,n,i){try{await be.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:i})}catch{await be.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:i})}}async function lt(e,t,n){try{await be.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const pt=["READY_DISCORD_WEBHOOK_URL"];async function dt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!we||!k.doesUploadEnvVars)return;const[t,n]=ve.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const i=h.config().parsed||{};if(0!==Object.keys(i).length)try{for(const e of pt)try{await be.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const s=await be.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=s.data;await y.ready;for(const[s,a]of Object.entries(i)){if(e.publicRepo&&"GH_BOT_PAT"===s)continue;if(!e.publicRepo&&"PUBLIC_GH_BOT_PAT"===s)continue;const i=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,i),p=y.to_base64(l,y.base64_variants.ORIGINAL);await be.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:s,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function ut(e){const[t,n]=ve.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await i((()=>be.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))))}const mt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on PR page. (You may leave this box unchecked due to long workflows.)\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on PR\'s diff view.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n'.trim()};async function gt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[n,i]of Object.entries(mt)){const s=t.resolve(e.dirPath,".github",n);if(r.existsSync(s)){const e=await r.promises.readFile(s,"utf8");if(w(e,i)>i.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await $.run((()=>E.generateFile(s,i)))}}))}const ft=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function ht(n){const i=t.resolve(n,"package.json");try{const s=r.existsSync(i);let o={},a={},c={},l=!1;if(s){const e=r.readFileSync(i,"utf8");c=JSON.parse(e),o=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const i=t.resolve(n,".releaserc.json"),s=JSON.parse(await e.readFile(i,"utf8"));p=s?.branches||[],d=s?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(n,".."))||!r.existsSync(t.resolve(n,"..","..","package.json"));let m;u&&(m=await async function(e,t){const n=b(e),i=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),s=i?.refs?.fetch??i?.refs?.push;if("string"==typeof s){const e=await wt(s);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await wt(o);if(e&&"Not Found"!==e.message)return e}}(n,c));let g="";try{g+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[i,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${i}-version`),"utf8");g&&(g+="\n"),g+=s+" "+o.trim()}catch{}let f="";try{f=await e.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let y;try{const t=await e.readFile(h,"utf8");y=ft.parse(JSON.parse(t))}catch{}const w={dirPath:n,dockerfile:f,root:u,publicRepo:!1===m?.private,referredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,esmPackage:l,willBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),containingSubPackageJsons:yt("packages/**/package.json",n),containingDockerfile:!!f||r.existsSync(t.resolve(n,"docker-compose.yml")),containingGemfile:r.existsSync(t.resolve(n,"Gemfile")),containingGoMod:r.existsSync(t.resolve(n,"go.mod")),containingPackageJson:r.existsSync(t.resolve(n,"package.json")),containingPoetryLock:r.existsSync(t.resolve(n,"poetry.lock")),containingPomXml:r.existsSync(t.resolve(n,"pom.xml")),containingPubspecYaml:r.existsSync(t.resolve(n,"pubspec.yaml")),containingTemplateYaml:r.existsSync(t.resolve(n,"template.yaml")),containingVscodeSettingsJson:r.existsSync(t.resolve(n,".vscode","settings.json")),containingJavaScript:yt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScript:yt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsx:yt("{app,src,tests}/**/*.{t,j}sx",n),containingJavaScriptInPackages:yt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScriptInPackages:yt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsxInPackages:yt("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!o.blitz,firebase:!!a["firebase-tools"],litestream:f.includes("install-litestream.sh"),next:!!o.next,playwrightTest:!!o["@playwright/test"]||!!a["@playwright/test"]||!!a.playwright,prisma:!!o["@prisma/client"]||!!a.prisma,pyright:!!a.pyright,reactNative:!!o["react-native"],semanticRelease:!!(a["semantic-release"]||p.length>0||d.length>0),storybook:!!a["@storybook/react"],wb:!!(o["@willbooster/wb"]||a["@willbooster/wb"]||o["@willbooster/shared-scripts"]||a["@willbooster/shared-scripts"])},release:{branches:p,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},versionsText:g,packageJson:c,wbfyJson:y};if(w.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.containingTypeScript)return e.containingJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.containingJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.containingJavaScript)return"@willbooster/eslint-config-js"}(w),w.containingGemfile||w.containingGoMod||w.containingPackageJson||w.containingPoetryLock||w.containingPomXml||w.containingPubspecYaml||w.containingTemplateYaml)return w}catch{}}function yt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function wt(e){const[t,n]=ve.getOrgAndName(e);if(!t||!n)return;const i={full_name:`${t}/${n}`};try{const e=await be.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(i,e.data)}catch{}return i}await async function(){const n=await o(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",(e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})})).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const i of n.paths){const o=t.join(i,"packages"),r=(await s((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await F([i,...r]);const a=await ht(i);if(!a){console.error(`there is no valid package.json in ${i}`);continue}const c=O(a),l=(await Promise.all(r.map((e=>ht(e))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await J(a),await ot(a),await Promise.all([x(a),P(a),c.then((()=>Le(a))),Z(a),te(a),le(a),gt(a),Oe(a),Te(a),De(a),He(a),Ge(a),et(a),at(a),dt(a),ut(a)]),await $.promiseAll();const d=[];for(const e of p)(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push(S(e,e.root?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(Ae(e)),await ue(e,a),await $.promiseAll(),(e.root||e.containingPackageJson)&&(await We(e),await $e(e,a,n.skipDeps),d.push(De(e)),e.containingVscodeSettingsJson&&e.containingPackageJson&&d.push(Xe(e)),(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push(Ke(e)),(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(a.willBoosterConfigs||d.push(ae(e,a)),d.push(se(e))),e.depending.pyright&&d.push(Ce(e)));await Promise.all(d),await $.promiseAll(),T("yarn",["cleanup"],i),T("yarn",["install"],i)}}();
2
2
  //# sourceMappingURL=index.js.map