wbfy 2.22.1 → 2.22.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as s,withRetry as n,ignoreErrorAsync as i}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 f from"lodash.clonedeep";import g 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(s){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!s.doesContainsDockerfile)return;const n=s.dockerfile,i=n;n!==i&&await e.writeFile(t.join(s.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const s=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(s))return;const n=await r.promises.readFile(s,"utf8"),i=n.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");n!==i&&await r.promises.writeFile(s,i)}))}async function P(s){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a(["*.env","*.env.*"],{dot:!0,cwd:s.dirPath});for(const i of n){const n=t.resolve(s.dirPath,i),o=(await e.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(n,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const s=t.join(e,"__tests__"),n=t.join(e,"tests");try{await r.promises.rename(s,n);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const C=new l;async function S(n,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(n.dirPath,"@types"),r=n.isRoot&&n.doesContainsSubPackageJsons?void 0:t.resolve(n.dirPath,"src","types"),a=await s((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const n of a){const a=n.name.slice(0,-5),c=n.name.endsWith(".d.ts");let l=c?a:n.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));n.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await C.run((()=>e.rename(t.join(o,n.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await C.run((()=>e.rename(t.join(o,n.name),t.join(r,n.name))))):n.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await C.run((()=>s((()=>e.rename(t.join(o,n.name,"index.d.ts"),t.join(r,`${n.name}.d.ts`)))))))}}))}const F={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,s){await e.writeFile(t,s)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const s=e.dirPath,n=await a("**/*.md",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${n.length} markdown files in ${s}`);for(const i of n){const n=t.join(s,i);await C.run((async()=>{const t=await r.promises.readFile(n,"utf8");let s=O(t);s=A(s,e,"doc"),t!==s&&await F.generateFile(n,s)}))}const i=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:s,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${s}`);for(const n of i){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=A(a,e,"ts"),o!==a&&await F.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const n of o){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=A(a,e,"text"),o!==a&&await F.generateFile(i,a)}await C.promiseAll()}))}function O(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function A(e,t,s){for(const[s,n]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(s,n);for(const[n,i]of Object.entries(t.wbfyJson?.typos?.[s]??{}))e=e.replaceAll(n,i);return e}function B(e,t,s,n=0){do{const[n,i,o]=R(e,t,s);if(0===p.spawnSync(n,i,o).status)break}while(--n>=0)}function I(e,t,s){const[n,i,o]=R(e,t,s);o.stdio="pipe";const r=p.spawnSync(n,i,o),a=r.stderr.toString().trim();return a&&console.error(`${n} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function R(e,t,s){const n={...process.env};return n.PATH&&n.BERRY_BIN_FOLDER&&(n.PATH=n.PATH.replace(`${n.BERRY_BIN_FOLDER}:`,"")),n.ASDF_DIR&&(t=["-l","-c",`. ${n.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:s,env:n,shell:!1,stdio:"inherit"}]}function T(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let s=0,n=1;for(const e of t)s+=e*n,n/=1e3;return s}const D="3.9.18",W="zulu-11.68.17",N="2.0.4",J="14.1.0";async function L(e){return j.functionIgnoringException("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const s=e.versionsText.trim().split("\n").map((e=>{const[t,s]=e.trim().split(/\s+/);return`${z.has(t)?" ":""}${t} ${s}`})).sort().map((e=>e.trim())),n=[...new Set(s)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),s=t?.info?.version;s&&U(n,"poetry",t?.info?.version),U(n,"python",D,!0)}e.depending.firebase&&U(n,"java",W,!0);if(e.doesContainsPackageJson){const t=I("npm",["show","yarn","version"],e.dirPath);U(n,"yarn",t)}for(const s of G){const n=t.resolve(e.dirPath,`.${s}-version`);r.promises.rm(n,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(n.length>0?C.run((()=>r.promises.writeFile(i,n.join("\n")+"\n"))):C.run((()=>r.promises.rm(i,{force:!0})))),await C.promiseAll(),B("asdf",["plugin","update","--all"],e.dirPath),B("asdf",["install"],e.dirPath)}(e)}))}const z=new Set(["java","nodejs","python"]),G=["java","node","python"];function U(e,t,s,n=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${s}`;if(i>=0){const[,t]=e[i].split(/\s+/);T(s)>T(t)&&(e[i]=o)}else e.splice(n?0:e.length,0,o)}const H="# Project-specific settings",M=/# Project-specific settings[^\n]*\n/gm,q="# Generated by wbfy",Y=`${H} (head)\n\n\n${q}\n`,K=`\n${H} (tail)\n`,V={separator:q,separatorPrefix:"# Generated by ",defaultHeadUserContent:Y,defaultTailUserContent:K,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const s=X(t);return s>0&&(t=t.slice(0,s-1)),t.replaceAll(M,"").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(M,`${H} (head)\n`):Y},getTailUserContent(e){const t=X(e);return t>0?e.slice(t-1):K},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function X(e){const t=e.indexOf(H),s=e.lastIndexOf(H);return s>t?s:-1}const Z="\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n";async function Q(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const s=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await F.readFileIgnoringError(s)??"",t=V.getHeadUserContent(e),n=V.getTailUserContent(e),i=t+Z+n;await C.run((()=>F.generateFile(s,i)))}else await r.promises.rm(s,{force:!0})}))}const ee={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","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","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},te=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ne(ee.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ne(ee.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ne(ee.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ne(ee.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function se(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const s=t.resolve(e.dirPath,".editorconfig");await C.run((()=>F.generateFile(s,te)))}))}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 oe(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const s=t.resolve(e.dirPath,".eslintignore"),n=await F.readFileIgnoringError(s)??"",i=V.getHeadUserContent(n),o=V.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await V.readGitignoreWithoutSeparators(r)||"",c=i+ie+a+o;await C.run((()=>F.generateFile(s,c)))}))}function re(e,t){return t}function ae(e,t,s){const n=[...e];for(const[i,o]of t.entries())void 0===n[i]?n[i]=s.cloneUnlessOtherwiseSpecified(o,s):s.isMergeableObject(o)?n[i]=d(e[i],o,s):e.includes(o)||n.push(o);return n}async function ce(e,s){return j.functionIgnoringException("generateEslintrc",(async()=>{const n=[];e.eslintBase&&n.push(e.eslintBase),e!==s&&n.push("../../.eslintrc.json");let i={root:!0,extends:n};const o=t.resolve(e.dirPath,".eslintrc.json");try{const t=await r.promises.readFile(o,"utf8"),s=JSON.parse(t);s.extends&&(s.extends=s.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===n.length&&(s.extends=[]);const a=i.extends;i.extends=s.extends,s.extends=a,i=d.all([i,s,i],{arrayMerge:ae}),e.depending.blitz&&(i.extends=i.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(i);await C.run((()=>F.generateFile(o,a)))}))}const le=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...ee.codeWith2IndentSize,...ee.codeWith4IndentSize,...ee.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function pe(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const s=t.resolve(e.dirPath,".gitattributes");await C.run((()=>F.generateFile(s,le)))}))}const de=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],ue="\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\nIcon[\r]\n!.keep\n*/mount/*.hash\n\n";async function me(e,s){return j.functionIgnoringException("generateGitignore",(async()=>{const n=t.resolve(e.dirPath,".gitignore"),i=await F.readFileIgnoringError(n)??"";let o=V.getHeadUserContent(i)+ue;const r=V.getTailUserContent(i),a=[...de];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(s.depending.firebase||e.depending.firebase)&&a.push("firebase"),s.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(s.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 he(e)??"";if(!t){const s=`https://www.toptal.com/developers/gitignore/api/${e}`,n=await fetch(s),i=await n.text();if(!n.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${s}`);t=i.trim(),await C.run((()=>ge(e,t))),k.isVerbose&&console.info(`Fetched ${s}`)}c&&(c+="\n"),c+=t+"\n"}await V.isBerryZeroInstallEnabled(n)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(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.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(s.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await C.run((()=>F.generateFile(n,l)))}))}const fe=t.join(u.homedir(),".cache","wbfy","gitignore");async function ge(e,s){await r.promises.mkdir(fe,{recursive:!0}),await r.promises.writeFile(t.join(fe,e),s)}async function he(e){try{const s=await r.promises.stat(t.join(fe,e));if(Date.now()-s.mtimeMs>216e5)return;return await r.promises.readFile(t.join(fe,e),"utf8")}catch{}}const ye={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},we=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,be=!!we,ve=new m({auth:we});const ke=new class{getOrgAndName(e){const t=e.split(":").at(-1),s=t?.split("/");return[s?.at(-2)??"",s?.at(-1)?.replace(/.git$/,"")??""]}},je={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function xe(e){return e.depending.blitz?je.blitz:je.node}const _e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Pe=[..._e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],$e=["eslint-plugin-react","eslint-plugin-react-hooks"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",..._e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",..._e,...$e],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Pe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Pe,...$e],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Pe,...$e],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Pe,...$e]};async function Se(e,s,n){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,s,n){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"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(Ce))for(const s of t)delete e.devDependencies[s];await C.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,Fe(e)),l.scripts.prettify+=await async function(e){const s=t.resolve(e,".prettierignore"),n=await r.promises.readFile(s,"utf8"),i=n.indexOf(V.separatorPrefix);if(i<0)return"";const o=n.slice(0,i);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.isRoot){if(u.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(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.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?d.all([l.workspaces,["packages/*"]],{arrayMerge:ae}):["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.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(u.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&u.push("@typescript-eslint/parser"));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&u.push("typescript");e.eslintBase&&u.push(...Ce[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),u=u.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&s.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=ke.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=ye.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix","")),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>r.existsSync(t.resolve(e.dirPath,s))));s.length>0&&(l.scripts["format-code"]=`flutter format $(find ${s.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.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),s=new Set;for(const e of t){const[t,n]=e.split(/[/\\]/);n&&s.add(t)}if(s.size>0){const e=[...s].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@${J}`),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 g=JSON.stringify(l);g=await async function(e,s,n){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return s;for(const[e,t]of i)s=s.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:n.dirPath,dot:!0,gitignore:!0});for(const e of o)await C.run((async()=>{const s=t.join(n.dirPath,e),o=await r.promises.readFile(s,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(s,a)}));return await C.promiseAll(),s}(l.scripts,g,e),await r.promises.writeFile(i,g),n||(p=p.filter((e=>!l.devDependencies?.[e])),p.length>0&&B("yarn",["add",...new Set(p)],e.dirPath),u=u.filter((e=>!l.dependencies?.[e])),u.length>0&&B("yarn",["add","-D",...new Set(u)],e.dirPath),m.length>0&&B("poetry",["add","--group","dev",...new Set(m)],e.dirPath))}(e,s,n)}))}function Fe(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${xe(e)}}/**/*.{${ee.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ee.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){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 "**/{.*/,}*.{${ee.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.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?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 s=t.resolve(e.dirPath,"package.json"),n=await r.promises.readFile(s,"utf8"),i=JSON.parse(n);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");await Promise.all([r.promises.writeFile(s,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),B("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await C.run((()=>r.promises.writeFile(a,Ee.preCommit+"\n")));const{typecheck:c}=Fe(e);if(c){let s=e.repository?.startsWith("github:WillBoosterLab/")?Ee.prePushForLab:Ee.prePush;s=s.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 C.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),s+"\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.doesContainsPoetryLock&&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 C.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),d,{mode:493})))}(e)}))}function Ae(e,t,s,n){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${n}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${s} (.${n})" />\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="${e}" />\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`}const Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n ${ee.prettier.map((e=>Ae("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Ie=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n ${ee.prettier.map((e=>Ae("bun","node_modules/.bin/biome check --apply","Biome",e))).join("")}\n </component>\n</project>\n`;async function Re(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const s=t.resolve(e.dirPath,".idea");if(r.existsSync(s)){const n=t.resolve(s,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?C.run((()=>F.generateFile(n,e.isBun?Ie:Be))):C.run((()=>r.promises.rm(n,{force:!0}))))}}))}async function Te(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",n=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${De(e)}': [${JSON.stringify(`${s}eslint --fix${ye.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;n.push(t)}const i=e.isRoot?" && !file.includes('/packages/')":"";n.push(`\n './**/*.{${ee.prettier.join(",")}}': files => {\n ${e.doesContainsJavaScript||e.doesContainsTypeScript?function(e){return`files = micromatch.not(files, '${De(e)}');`}(e):""}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${i});\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}sort-package-json');\n }\n return commands;\n },`),e.doesContainsPubspecYaml&&n.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.doesContainsPoetryLock&&n.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const o=`${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');":""}\n\nmodule.exports = {${n.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await C.run((()=>F.generateFile(a,o)))}(e)}))}function De(e){return`./{${xe(e).join(",")}}/**/*.{${ee.eslint.join(",")}}`}async function We(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const s=["js","mjs","cjs"].map((s=>t.resolve(e.dirPath,`next.config.${s}`))).find((e=>r.existsSync(e)));if(!s)return;const n=(await r.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await C.run((()=>F.generateFile(s,n)))}))}const Ne="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function Je(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const s=t.resolve(e.dirPath,".prettierignore"),n=await F.readFileIgnoringError(s)??"",i=V.getHeadUserContent(n),o=V.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await V.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+Ne+c+a+o;await C.run((()=>F.generateFile(s,l)))}))}const Le={venvPath:".",venv:".venv"};async function ze(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=f(Le);const n=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=d.all([s,t,s],{arrayMerge:re})}catch{}const i=JSON.stringify(s);await C.run((()=>F.generateFile(n,i)))}))}const Ge="[](https://github.com/semantic-release/semantic-release)";async function Ue(e){return j.functionIgnoringException("generateReadme",(async()=>{const s=t.resolve(e.dirPath,"README.md");let n=await r.promises.readFile(s,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(n=He(n,Ge));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${s})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${s}`))&&(n=He(n,a))}await C.run((()=>F.generateFile(s,n)))}))}function He(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let s=0;s<e.length;s++)if("\n"===e[s-1]&&"\n"===e[s]){const n=e.slice(0,s+1);let i=e.slice(s+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${n}${t}\n${i}`}return`${e}\n${t}\n`}async function Me(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const s=t.resolve(e.dirPath,".releaserc.json"),n=JSON.parse(await r.promises.readFile(s,"utf8")),i=n?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],s=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",d.all([s,{preset:"conventionalcommits"}],{arrayMerge:re})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",d.all([s,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:re})])}const o=JSON.stringify(n);await C.run((()=>F.generateFile(s,o)))}))}const qe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ye(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let s=f(qe);const n=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${n}5`))return;try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=d.all([s,t,s],{arrayMerge:re}),s.extends=s.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(s.packageRules??=[],s.packageRules.some((e=>e.packageNames.includes("next")))||s.packageRules.push({packageNames:["next"],enabled:!1})),await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(s);await C.run((()=>F.generateFile(n,i)))}))}function Ke(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[s,n]of t)delete e[s],e[s]=n,"object"==typeof n&&null!==n&&Ke(n);return e}const Ve={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/**/*"]},Xe={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 Ze(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let s=f(e.isRoot?Ve:Xe);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(s.include=s.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const n=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(n,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete s.compilerOptions?.target,e.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,i,s],{arrayMerge:ae}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ke(s),s.include?.sort();const i=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await C.run((()=>F.generateFile(n,i)))}))}const Qe=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function et(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const s=t.resolve(e.dirPath,".vscode","settings.json"),n=await r.promises.readFile(s,"utf8");let i=JSON.parse(n);for(const e of Qe)i=d.all([i,tt(e)]);e.doesContainsPoetryLock&&(i=d.all([i,tt("**/.venv/**")])),e.depending.next&&(i=d.all([i,tt("**/.next/**")])),Ke(i??{});const o=JSON.stringify(i,void 0,2);await C.run((()=>F.generateFile(s,o)))}catch{}}))}function tt(e){return{"files.watcherExclude":{[e]:!0}}}const st={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:{labeled:"ready :rocket:",labelOperator:"OR"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function nt(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const s=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(s,{recursive:!0});const n=t.resolve(e.dirPath,".github","semantic.yml");await C.run((()=>r.promises.rm(n,{force:!0,recursive:!0})));const i=await r.promises.readdir(s,{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",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const n of o){const i=t.basename(n,".yml");await C.run((()=>it(e,s,i)))}}))}async function it(e,s,n){let i=f(st[n]??{});const o=t.join(s,`${n}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=d.all([i,t,i],{arrayMerge:ae})}catch{}n.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const s=e[t];delete e[t],e[t]=s}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;ot(e,t,n)}switch(n){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(s,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&rt(i,20,24);break;case"wbfy-merge":rt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await at(i,o),"release"===n)await r.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===n){if(await r.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await at(i,t.join(s,"sync-force.yml"))}}function ot(e,t,s){if(t.with||={},t.secrets||={},"test"!==s&&"release"!==s&&"wbfy"!==s&&"wbfy-merge"!==s&&"add-issue-to-project"!==s&&"add-focused-issue-to-project"!==s&&"add-ready-issue-to-project"!==s||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==s&&"test"!==s||(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"===s||s.startsWith("deploy"))||t.with.server_url&&s.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===s){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,delete e.with.label}(t),s.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(s.startsWith("deploy")||s.startsWith("test"))&&(t.with.ci_size="large"),s.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===s||"test"===s||"wbfy"===s||"wbfy-merge"===s||s.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ke(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ke(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function rt(e,t,s){const[n,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==n&&Number.isInteger(i)){const e=(i+9)%24;if(t<s?t<=e&&e<s:t<=e||e<s)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(s-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function at(e,t){const s=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,s)}async function ct(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const s=I("yarn",["--version"],e.dirPath),n=function(e,t){const s=I("npm",["show",e,"versions","--json"],t);return JSON.parse(s).at(-1)}("@yarnpkg/cli",e.dirPath);lt(s)<=lt(n)&&s!==n&&B("yarn",["set","version",n],e.dirPath,1);const i=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(i,{recursive:!0});for(const e of await r.promises.readdir(i))e.startsWith("yarn-")&&!e.startsWith(`yarn-${n}.`)&&await C.run((()=>r.promises.rm(t.join(i,e))));const o=t.resolve(e.dirPath,".yarnrc");await C.run((()=>r.promises.rm(o,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=g.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 s=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await C.run((()=>r.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(a,g.dump(c,{lineWidth:-1})),B("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function lt(e){const[t]=e.split(".");return Number(t)}async function pt(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!be)return;const[t,s]=ke.getOrgAndName(e.repository??"");if(t&&s&&("WillBooster"===t||"WillBoosterLab"===t))try{await dt(t,s,"d1: x-easy :hedgehog:","EDE9FE"),await dt(t,s,"d2: easy :rabbit2:","DDD6FE"),await dt(t,s,"d3: medium :ox:","C4B5FD"),await dt(t,s,"d4: hard :squid:","A78BFA"),await dt(t,s,"d5: x-hard :whale2:","8B5CF6"),await dt(t,s,"p1: critical :fire::fire::fire:","EF4444"),await dt(t,s,"p2: urgent :fire::fire:","F87171"),await dt(t,s,"p3: important :fire:","FCA5A5"),await dt(t,s,"p4: nice to have :droplet:","FECACA"),await dt(t,s,"r: blitz","5300bc"),await dt(t,s,"r: firebase","ffca28"),await dt(t,s,"r: prisma","0c344b"),await dt(t,s,"r: react","61dafb"),await dt(t,s,"r: svelte","ff3e00"),await dt(t,s,"r: semantic-release","494949"),await dt(t,s,"ready :rocket:","22C55E"),await dt(t,s,"review requested :mag:","FBCA04"),await dt(t,s,"released :bookmark:","6366F1"),await dt(t,s,"s: 0.5h :clock1230:","F3F4F6"),await dt(t,s,"s: 1h :clock1:","E5E7EB"),await dt(t,s,"s: 2h :clock2:","D1D5DB"),await dt(t,s,"s: 3h :clock3:","9CA3AF"),await dt(t,s,"s: 5h :clock5:","6B7280"),await dt(t,s,"s: 8h :clock8:","4B5563"),await dt(t,s,"s: 13h :clock1:","374151"),await dt(t,s,"t: build :hammer:","BFDBFE"),await dt(t,s,"t: chore :broom:","BFDBFE"),await dt(t,s,"t: ci :construction_worker:","BFDBFE"),await dt(t,s,"t: docs :memo:","BFDBFE"),await dt(t,s,"t: feat :sparkles:","BFDBFE"),await dt(t,s,"t: fix :bug:","BFDBFE"),await dt(t,s,"t: perf :zap:","BFDBFE"),await dt(t,s,"t: refactor :recycle:","BFDBFE"),await dt(t,s,"t: style :lipstick:","BFDBFE"),await dt(t,s,"t: test :test_tube:","BFDBFE"),await dt(t,s,"project","24292F"),await dt(t,s,"focused :dart:","22C55E"),await ut(t,s,"bug"),await ut(t,s,"documentation"),await ut(t,s,"duplicate"),await ut(t,s,"enhancement"),await ut(t,s,"good first issue"),await ut(t,s,"help wanted"),await ut(t,s,"invalid"),await ut(t,s,"question"),await ut(t,s,"wontfix"),await ut(t,s,"ready"),await ut(t,s,"review requested"),await ut(t,s,"released"),await ut(t,s,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function dt(e,t,s,n){try{await ve.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:s,color:n})}catch{await ve.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s,color:n})}}async function ut(e,t,s){try{await ve.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s})}catch{}}const mt=["READY_DISCORD_WEBHOOK_URL"];async function ft(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!be||!k.doesUploadEnvVars)return;const[t,s]=ke.getOrgAndName(e.repository??"");if(!t||!s||"WillBoosterLab"!==t)return;const n=h.config().parsed||{};if(0!==Object.keys(n).length)try{for(const e of mt)try{await ve.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:e})}catch{}const i=await ve.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:s}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(n)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const n=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,n),p=y.to_base64(l,y.base64_variants.ORIGINAL);await ve.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function gt(e){const[t,s]=ke.getOrgAndName(e.repository??"");t&&s&&("WillBooster"!==t&&"WillBoosterLab"!==t||await n((()=>ve.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:s,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 ht={"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 yt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,n]of Object.entries(ht)){const i=t.resolve(e.dirPath,".github",s);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,n)>n.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await C.run((()=>F.generateFile(i,n)))}}))}const wt=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 bt(s){const n=t.resolve(s,"package.json");try{const i=r.existsSync(n);let o={},a={},c={},l=!1;if(i){const e=r.readFileSync(n,"utf8");c=JSON.parse(e),o=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const n=t.resolve(s,".releaserc.json"),i=JSON.parse(await e.readFile(n,"utf8"));p=i?.branches||[],d=i?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(s,".."))||!r.existsSync(t.resolve(s,"..","..","package.json"));let m;u&&(m=await async function(e,t){const s=b(e),n=(await s.getRemotes(!0)).find((e=>"origin"===e.name)),i=n?.refs?.fetch??n?.refs?.push;if("string"==typeof i){const e=await kt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await kt(o);if(e&&"Not Found"!==e.message)return e}}(s,c));let f="";try{f+=(await e.readFile(t.resolve(s,".tool-versions"),"utf8")).trim()}catch{}for(const[n,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(s,`.${n}-version`),"utf8");f&&(f+="\n"),f+=i+" "+o.trim()}catch{}let g="";try{g=await e.readFile(t.resolve(s,"Dockerfile"),"utf8")}catch{}const h=t.resolve(s,"wbfy.json");let y;try{const t=await e.readFile(h,"utf8");y=wt.parse(JSON.parse(t))}catch{}const w={dirPath:s,dockerfile:g,isRoot:u,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,isBun:r.existsSync(t.join(s,"bunfig.toml")),isEsmPackage:l,isWillBoosterConfigs:n.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:vt("packages/**/package.json",s),doesContainsDockerfile:!!g||r.existsSync(t.resolve(s,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(s,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(s,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(s,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(s,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(s,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(s,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(s,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(s,".vscode","settings.json")),doesContainsJavaScript:vt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScript:vt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsx:vt("{app,src,tests}/**/*.{t,j}sx",s),doesContainsJavaScriptInPackages:vt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScriptInPackages:vt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsxInPackages:vt("packages/**/{app,src,tests}/**/*.{t,j}sx",s),depending:{blitz:!!o.blitz,firebase:!!a["firebase-tools"],litestream:g.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:f,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.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(w),w.doesContainsGemfile||w.doesContainsGoMod||w.doesContainsPackageJson||w.doesContainsPoetryLock||w.doesContainsPomXml||w.doesContainsPubspecYaml||w.doesContainsTemplateYaml)return w}catch{}}function vt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function kt(e){const[t,s]=ke.getOrgAndName(e);if(!t||!s)return;const n={full_name:`${t}/${s}`};try{const e=await ve.request("GET /repos/{owner}/{repo}",{owner:t,repo:s});Object.assign(n,e.data)}catch{}return n}await async function(){const s=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=s.verbose,k.doesUploadEnvVars=s.env;for(const n of s.paths){const o=t.join(n,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([n,...r]);const a=await bt(n);if(!a){console.error(`there is no valid package.json in ${n}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>bt(e))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await L(a),await ct(a),await Promise.all([x(a),P(a),c.then((()=>Ue(a))),Q(a),se(a),pe(a),yt(a),Oe(a),Re(a),Te(a),Ye(a),Me(a),nt(a),pt(a),ft(a),gt(a)]),await C.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(S(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(We(e)),await me(e,a),await C.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Je(e),await Se(e,a,s.skipDeps),d.push(Te(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(et(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(Ze(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isWillBoosterConfigs||d.push(ce(e,a)),d.push(oe(e))),e.depending.pyright&&d.push(ze(e)));await Promise.all(d),await C.promiseAll(),B("yarn",["cleanup"],n),B("yarn",["install"],n)}}();
|
1
|
+
import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as s,withRetry as n,ignoreErrorAsync as i}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 f from"lodash.clonedeep";import g 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(s){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!s.doesContainsDockerfile)return;const n=s.dockerfile,i=n;n!==i&&await e.writeFile(t.join(s.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const s=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(s))return;const n=await r.promises.readFile(s,"utf8"),i=n.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");n!==i&&await r.promises.writeFile(s,i)}))}async function P(s){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a(["*.env","*.env.*"],{dot:!0,cwd:s.dirPath});for(const i of n){const n=t.resolve(s.dirPath,i),o=(await e.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(n,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const s=t.join(e,"__tests__"),n=t.join(e,"tests");try{await r.promises.rename(s,n);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const C=new l;async function S(n,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(n.dirPath,"@types"),r=n.isRoot&&n.doesContainsSubPackageJsons?void 0:t.resolve(n.dirPath,"src","types"),a=await s((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const n of a){const a=n.name.slice(0,-5),c=n.name.endsWith(".d.ts");let l=c?a:n.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));n.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await C.run((()=>e.rename(t.join(o,n.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await C.run((()=>e.rename(t.join(o,n.name),t.join(r,n.name))))):n.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await C.run((()=>s((()=>e.rename(t.join(o,n.name,"index.d.ts"),t.join(r,`${n.name}.d.ts`)))))))}}))}const F={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,s){await e.writeFile(t,s)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const s=e.dirPath,n=await a("**/*.md",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${n.length} markdown files in ${s}`);for(const i of n){const n=t.join(s,i);await C.run((async()=>{const t=await r.promises.readFile(n,"utf8");let s=O(t);s=A(s,e,"doc"),t!==s&&await F.generateFile(n,s)}))}const i=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:s,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${s}`);for(const n of i){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=A(a,e,"ts"),o!==a&&await F.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const n of o){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=A(a,e,"text"),o!==a&&await F.generateFile(i,a)}await C.promiseAll()}))}function O(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function A(e,t,s){for(const[s,n]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(s,n);for(const[n,i]of Object.entries(t.wbfyJson?.typos?.[s]??{}))e=e.replaceAll(n,i);return e}function B(e,t,s,n=0){do{const[n,i,o]=R(e,t,s);if(0===p.spawnSync(n,i,o).status)break}while(--n>=0)}function I(e,t,s){const[n,i,o]=R(e,t,s);o.stdio="pipe";const r=p.spawnSync(n,i,o),a=r.stderr.toString().trim();return a&&console.error(`${n} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function R(e,t,s){const n={...process.env};return n.PATH&&n.BERRY_BIN_FOLDER&&(n.PATH=n.PATH.replace(`${n.BERRY_BIN_FOLDER}:`,"")),n.ASDF_DIR&&(t=["-l","-c",`. ${n.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:s,env:n,shell:!1,stdio:"inherit"}]}function T(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let s=0,n=1;for(const e of t)s+=e*n,n/=1e3;return s}const D="3.9.18",W="zulu-11.68.17",N="2.0.4",J="14.1.0";async function L(e){return j.functionIgnoringException("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const s=e.versionsText.trim().split("\n").map((e=>{const[t,s]=e.trim().split(/\s+/);return`${z.has(t)?" ":""}${t} ${s}`})).sort().map((e=>e.trim())),n=[...new Set(s)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),s=t?.info?.version;s&&U(n,"poetry",t?.info?.version),U(n,"python",D,!0)}e.depending.firebase&&U(n,"java",W,!0);if(e.doesContainsPackageJson){const t=I("npm",["show","yarn","version"],e.dirPath);U(n,"yarn",t)}for(const s of G){const n=t.resolve(e.dirPath,`.${s}-version`);r.promises.rm(n,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(n.length>0?C.run((()=>r.promises.writeFile(i,n.join("\n")+"\n"))):C.run((()=>r.promises.rm(i,{force:!0})))),await C.promiseAll(),B("asdf",["plugin","update","--all"],e.dirPath),B("asdf",["install"],e.dirPath)}(e)}))}const z=new Set(["java","nodejs","python"]),G=["java","node","python"];function U(e,t,s,n=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${s}`;if(i>=0){const[,t]=e[i].split(/\s+/);T(s)>T(t)&&(e[i]=o)}else e.splice(n?0:e.length,0,o)}const H="# Project-specific settings",M=/# Project-specific settings[^\n]*\n/gm,q="# Generated by wbfy",Y=`${H} (head)\n\n\n${q}\n`,K=`\n${H} (tail)\n`,V={separator:q,separatorPrefix:"# Generated by ",defaultHeadUserContent:Y,defaultTailUserContent:K,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const s=X(t);return s>0&&(t=t.slice(0,s-1)),t.replaceAll(M,"").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(M,`${H} (head)\n`):Y},getTailUserContent(e){const t=X(e);return t>0?e.slice(t-1):K},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function X(e){const t=e.indexOf(H),s=e.lastIndexOf(H);return s>t?s:-1}const Z="\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n";async function Q(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const s=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await F.readFileIgnoringError(s)??"",t=V.getHeadUserContent(e),n=V.getTailUserContent(e),i=t+Z+n;await C.run((()=>F.generateFile(s,i)))}else await r.promises.rm(s,{force:!0})}))}const ee={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","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","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},te=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ne(ee.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ne(ee.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ne(ee.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ne(ee.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function se(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const s=t.resolve(e.dirPath,".editorconfig");await C.run((()=>F.generateFile(s,te)))}))}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 oe(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const s=t.resolve(e.dirPath,".eslintignore"),n=await F.readFileIgnoringError(s)??"",i=V.getHeadUserContent(n),o=V.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await V.readGitignoreWithoutSeparators(r)||"",c=i+ie+a+o;await C.run((()=>F.generateFile(s,c)))}))}function re(e,t){return t}function ae(e,t,s){const n=[...e];for(const[i,o]of t.entries())void 0===n[i]?n[i]=s.cloneUnlessOtherwiseSpecified(o,s):s.isMergeableObject(o)?n[i]=d(e[i],o,s):e.includes(o)||n.push(o);return n}async function ce(e,s){return j.functionIgnoringException("generateEslintrc",(async()=>{const n=[];e.eslintBase&&n.push(e.eslintBase),e!==s&&n.push("../../.eslintrc.json");let i={root:!0,extends:n};const o=t.resolve(e.dirPath,".eslintrc.json");try{const t=await r.promises.readFile(o,"utf8"),s=JSON.parse(t);s.extends&&(s.extends=s.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===n.length&&(s.extends=[]);const a=i.extends;i.extends=s.extends,s.extends=a,i=d.all([i,s,i],{arrayMerge:ae}),e.depending.blitz&&(i.extends=i.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(i);await C.run((()=>F.generateFile(o,a)))}))}const le=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...ee.codeWith2IndentSize,...ee.codeWith4IndentSize,...ee.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function pe(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const s=t.resolve(e.dirPath,".gitattributes");await C.run((()=>F.generateFile(s,le)))}))}const de=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],ue="\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\nIcon[\r]\n!.keep\n*/mount/*.hash\n\n";async function me(e,s){return j.functionIgnoringException("generateGitignore",(async()=>{const n=t.resolve(e.dirPath,".gitignore"),i=await F.readFileIgnoringError(n)??"";let o=V.getHeadUserContent(i)+ue;const r=V.getTailUserContent(i),a=[...de];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(s.depending.firebase||e.depending.firebase)&&a.push("firebase"),s.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(s.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 he(e)??"";if(!t){const s=`https://www.toptal.com/developers/gitignore/api/${e}`,n=await fetch(s),i=await n.text();if(!n.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${s}`);t=i.trim(),await C.run((()=>ge(e,t))),k.isVerbose&&console.info(`Fetched ${s}`)}c&&(c+="\n"),c+=t+"\n"}await V.isBerryZeroInstallEnabled(n)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(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.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(s.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await C.run((()=>F.generateFile(n,l)))}))}const fe=t.join(u.homedir(),".cache","wbfy","gitignore");async function ge(e,s){await r.promises.mkdir(fe,{recursive:!0}),await r.promises.writeFile(t.join(fe,e),s)}async function he(e){try{const s=await r.promises.stat(t.join(fe,e));if(Date.now()-s.mtimeMs>216e5)return;return await r.promises.readFile(t.join(fe,e),"utf8")}catch{}}const ye={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},we=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,be=!!we,ve=new m({auth:we});const ke=new class{getOrgAndName(e){const t=e.split(":").at(-1),s=t?.split("/");return[s?.at(-2)??"",s?.at(-1)?.replace(/.git$/,"")??""]}},je={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function xe(e){return e.depending.blitz?je.blitz:je.node}const _e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Pe=[..._e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],$e=["eslint-plugin-react","eslint-plugin-react-hooks"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",..._e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",..._e,...$e],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Pe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Pe,...$e],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Pe,...$e],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Pe,...$e]};async function Se(e,s,n){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,s,n){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"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(Ce))for(const s of t)delete e.devDependencies[s];await C.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,Fe(e)),l.scripts.prettify+=await async function(e){const s=t.resolve(e,".prettierignore"),n=await r.promises.readFile(s,"utf8"),i=n.indexOf(V.separatorPrefix);if(i<0)return"";const o=n.slice(0,i);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.isRoot){if(u.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(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.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?d.all([l.workspaces,["packages/*"]],{arrayMerge:ae}):["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.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(u.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&u.push("@typescript-eslint/parser"));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&u.push("typescript");e.eslintBase&&u.push(...Ce[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),u=u.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&s.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=ke.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=ye.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix","")),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>r.existsSync(t.resolve(e.dirPath,s))));s.length>0&&(l.scripts["format-code"]=`flutter format $(find ${s.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.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),s=new Set;for(const e of t){const[t,n]=e.split(/[/\\]/);n&&s.add(t)}if(s.size>0){const e=[...s].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@${J}`),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 g=JSON.stringify(l);g=await async function(e,s,n){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return s;for(const[e,t]of i)s=s.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:n.dirPath,dot:!0,gitignore:!0});for(const e of o)await C.run((async()=>{const s=t.join(n.dirPath,e),o=await r.promises.readFile(s,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(s,a)}));return await C.promiseAll(),s}(l.scripts,g,e),await r.promises.writeFile(i,g),n||(p=p.filter((e=>!l.devDependencies?.[e])),p.length>0&&B("yarn",["add",...new Set(p)],e.dirPath),u=u.filter((e=>!l.dependencies?.[e])),u.length>0&&B("yarn",["add","-D",...new Set(u)],e.dirPath),m.length>0&&B("poetry",["add","--group","dev",...new Set(m)],e.dirPath))}(e,s,n)}))}function Fe(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${xe(e)}}/**/*.{${ee.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ee.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){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 "**/{.*/,}*.{${ee.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.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?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 s=t.resolve(e.dirPath,"package.json"),n=await r.promises.readFile(s,"utf8"),i=JSON.parse(n);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");await Promise.all([r.promises.writeFile(s,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),B("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await C.run((()=>r.promises.writeFile(a,Ee.preCommit+"\n")));const{typecheck:c}=Fe(e);if(c){let s=e.repository?.startsWith("github:WillBoosterLab/")?Ee.prePushForLab:Ee.prePush;s=s.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 C.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),s+"\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.doesContainsPoetryLock&&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 C.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),d,{mode:493})))}(e)}))}function Ae(e,t,s,n){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${n}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${s} (.${n})" />\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="${e}" />\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`}const Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ee.prettier.map((e=>Ae("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Ie=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ee.prettier.map((e=>Ae("bun","node_modules/.bin/biome check --apply","Biome",e))).join("")}\n </component>\n</project>\n`;async function Re(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const s=t.resolve(e.dirPath,".idea");if(r.existsSync(s)){const n=t.resolve(s,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?C.run((()=>F.generateFile(n,e.isBun?Ie:Be))):C.run((()=>r.promises.rm(n,{force:!0}))))}}))}async function Te(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",n=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${De(e)}': [${JSON.stringify(`${s}eslint --fix${ye.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;n.push(t)}const i=e.isRoot?" && !file.includes('/packages/')":"";n.push(`\n './**/*.{${ee.prettier.join(",")}}': files => {\n ${e.doesContainsJavaScript||e.doesContainsTypeScript?function(e){return`files = micromatch.not(files, '${De(e)}');`}(e):""}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${i});\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}sort-package-json');\n }\n return commands;\n },`),e.doesContainsPubspecYaml&&n.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.doesContainsPoetryLock&&n.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const o=`${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');":""}\n\nmodule.exports = {${n.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await C.run((()=>F.generateFile(a,o)))}(e)}))}function De(e){return`./{${xe(e).join(",")}}/**/*.{${ee.eslint.join(",")}}`}async function We(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const s=["js","mjs","cjs"].map((s=>t.resolve(e.dirPath,`next.config.${s}`))).find((e=>r.existsSync(e)));if(!s)return;const n=(await r.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await C.run((()=>F.generateFile(s,n)))}))}const Ne="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function Je(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const s=t.resolve(e.dirPath,".prettierignore"),n=await F.readFileIgnoringError(s)??"",i=V.getHeadUserContent(n),o=V.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await V.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+Ne+c+a+o;await C.run((()=>F.generateFile(s,l)))}))}const Le={venvPath:".",venv:".venv"};async function ze(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=f(Le);const n=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=d.all([s,t,s],{arrayMerge:re})}catch{}const i=JSON.stringify(s);await C.run((()=>F.generateFile(n,i)))}))}const Ge="[](https://github.com/semantic-release/semantic-release)";async function Ue(e){return j.functionIgnoringException("generateReadme",(async()=>{const s=t.resolve(e.dirPath,"README.md");let n=await r.promises.readFile(s,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(n=He(n,Ge));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${s})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${s}`))&&(n=He(n,a))}await C.run((()=>F.generateFile(s,n)))}))}function He(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let s=0;s<e.length;s++)if("\n"===e[s-1]&&"\n"===e[s]){const n=e.slice(0,s+1);let i=e.slice(s+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${n}${t}\n${i}`}return`${e}\n${t}\n`}async function Me(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const s=t.resolve(e.dirPath,".releaserc.json"),n=JSON.parse(await r.promises.readFile(s,"utf8")),i=n?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],s=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",d.all([s,{preset:"conventionalcommits"}],{arrayMerge:re})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",d.all([s,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:re})])}const o=JSON.stringify(n);await C.run((()=>F.generateFile(s,o)))}))}const qe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ye(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let s=f(qe);const n=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${n}5`))return;try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=d.all([s,t,s],{arrayMerge:re}),s.extends=s.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(s.packageRules??=[],s.packageRules.some((e=>e.packageNames.includes("next")))||s.packageRules.push({packageNames:["next"],enabled:!1})),await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await C.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(s);await C.run((()=>F.generateFile(n,i)))}))}function Ke(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[s,n]of t)delete e[s],e[s]=n,"object"==typeof n&&null!==n&&Ke(n);return e}const Ve={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/**/*"]},Xe={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 Ze(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let s=f(e.isRoot?Ve:Xe);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(s.include=s.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const n=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(n,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete s.compilerOptions?.target,e.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,i,s],{arrayMerge:ae}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ke(s),s.include?.sort();const i=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await C.run((()=>F.generateFile(n,i)))}))}const Qe=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function et(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const s=t.resolve(e.dirPath,".vscode","settings.json"),n=await r.promises.readFile(s,"utf8");let i=JSON.parse(n);for(const e of Qe)i=d.all([i,tt(e)]);e.doesContainsPoetryLock&&(i=d.all([i,tt("**/.venv/**")])),e.depending.next&&(i=d.all([i,tt("**/.next/**")])),Ke(i??{});const o=JSON.stringify(i,void 0,2);await C.run((()=>F.generateFile(s,o)))}catch{}}))}function tt(e){return{"files.watcherExclude":{[e]:!0}}}const st={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:{labeled:"ready :rocket:",labelOperator:"OR"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function nt(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const s=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(s,{recursive:!0});const n=t.resolve(e.dirPath,".github","semantic.yml");await C.run((()=>r.promises.rm(n,{force:!0,recursive:!0})));const i=await r.promises.readdir(s,{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",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const n of o){const i=t.basename(n,".yml");await C.run((()=>it(e,s,i)))}}))}async function it(e,s,n){let i=f(st[n]??{});const o=t.join(s,`${n}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=d.all([i,t,i],{arrayMerge:ae})}catch{}n.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const s=e[t];delete e[t],e[t]=s}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;ot(e,t,n)}switch(n){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(s,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&rt(i,20,24);break;case"wbfy-merge":rt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await at(i,o),"release"===n)await r.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===n){if(await r.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await at(i,t.join(s,"sync-force.yml"))}}function ot(e,t,s){if(t.with||={},t.secrets||={},"test"!==s&&"release"!==s&&"wbfy"!==s&&"wbfy-merge"!==s&&"add-issue-to-project"!==s&&"add-focused-issue-to-project"!==s&&"add-ready-issue-to-project"!==s||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==s&&"test"!==s||(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"===s||s.startsWith("deploy"))||t.with.server_url&&s.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===s){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,delete e.with.label}(t),s.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(s.startsWith("deploy")||s.startsWith("test"))&&(t.with.ci_size="large"),s.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===s||"test"===s||"wbfy"===s||"wbfy-merge"===s||s.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ke(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ke(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function rt(e,t,s){const[n,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==n&&Number.isInteger(i)){const e=(i+9)%24;if(t<s?t<=e&&e<s:t<=e||e<s)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(s-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function at(e,t){const s=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,s)}async function ct(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const s=I("yarn",["--version"],e.dirPath),n=function(e,t){const s=I("npm",["show",e,"versions","--json"],t);return JSON.parse(s).at(-1)}("@yarnpkg/cli",e.dirPath);lt(s)<=lt(n)&&s!==n&&B("yarn",["set","version",n],e.dirPath,1);const i=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(i,{recursive:!0});for(const e of await r.promises.readdir(i))e.startsWith("yarn-")&&!e.startsWith(`yarn-${n}.`)&&await C.run((()=>r.promises.rm(t.join(i,e))));const o=t.resolve(e.dirPath,".yarnrc");await C.run((()=>r.promises.rm(o,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=g.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 s=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await C.run((()=>r.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(a,g.dump(c,{lineWidth:-1})),B("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function lt(e){const[t]=e.split(".");return Number(t)}async function pt(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!be)return;const[t,s]=ke.getOrgAndName(e.repository??"");if(t&&s&&("WillBooster"===t||"WillBoosterLab"===t))try{await dt(t,s,"d1: x-easy :hedgehog:","EDE9FE"),await dt(t,s,"d2: easy :rabbit2:","DDD6FE"),await dt(t,s,"d3: medium :ox:","C4B5FD"),await dt(t,s,"d4: hard :squid:","A78BFA"),await dt(t,s,"d5: x-hard :whale2:","8B5CF6"),await dt(t,s,"p1: critical :fire::fire::fire:","EF4444"),await dt(t,s,"p2: urgent :fire::fire:","F87171"),await dt(t,s,"p3: important :fire:","FCA5A5"),await dt(t,s,"p4: nice to have :droplet:","FECACA"),await dt(t,s,"r: blitz","5300bc"),await dt(t,s,"r: firebase","ffca28"),await dt(t,s,"r: prisma","0c344b"),await dt(t,s,"r: react","61dafb"),await dt(t,s,"r: svelte","ff3e00"),await dt(t,s,"r: semantic-release","494949"),await dt(t,s,"ready :rocket:","22C55E"),await dt(t,s,"review requested :mag:","FBCA04"),await dt(t,s,"released :bookmark:","6366F1"),await dt(t,s,"s: 0.5h :clock1230:","F3F4F6"),await dt(t,s,"s: 1h :clock1:","E5E7EB"),await dt(t,s,"s: 2h :clock2:","D1D5DB"),await dt(t,s,"s: 3h :clock3:","9CA3AF"),await dt(t,s,"s: 5h :clock5:","6B7280"),await dt(t,s,"s: 8h :clock8:","4B5563"),await dt(t,s,"s: 13h :clock1:","374151"),await dt(t,s,"t: build :hammer:","BFDBFE"),await dt(t,s,"t: chore :broom:","BFDBFE"),await dt(t,s,"t: ci :construction_worker:","BFDBFE"),await dt(t,s,"t: docs :memo:","BFDBFE"),await dt(t,s,"t: feat :sparkles:","BFDBFE"),await dt(t,s,"t: fix :bug:","BFDBFE"),await dt(t,s,"t: perf :zap:","BFDBFE"),await dt(t,s,"t: refactor :recycle:","BFDBFE"),await dt(t,s,"t: style :lipstick:","BFDBFE"),await dt(t,s,"t: test :test_tube:","BFDBFE"),await dt(t,s,"project","24292F"),await dt(t,s,"focused :dart:","22C55E"),await ut(t,s,"bug"),await ut(t,s,"documentation"),await ut(t,s,"duplicate"),await ut(t,s,"enhancement"),await ut(t,s,"good first issue"),await ut(t,s,"help wanted"),await ut(t,s,"invalid"),await ut(t,s,"question"),await ut(t,s,"wontfix"),await ut(t,s,"ready"),await ut(t,s,"review requested"),await ut(t,s,"released"),await ut(t,s,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function dt(e,t,s,n){try{await ve.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:s,color:n})}catch{await ve.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s,color:n})}}async function ut(e,t,s){try{await ve.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s})}catch{}}const mt=["READY_DISCORD_WEBHOOK_URL"];async function ft(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!be||!k.doesUploadEnvVars)return;const[t,s]=ke.getOrgAndName(e.repository??"");if(!t||!s||"WillBoosterLab"!==t)return;const n=h.config().parsed||{};if(0!==Object.keys(n).length)try{for(const e of mt)try{await ve.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:e})}catch{}const i=await ve.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:s}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(n)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const n=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,n),p=y.to_base64(l,y.base64_variants.ORIGINAL);await ve.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function gt(e){const[t,s]=ke.getOrgAndName(e.repository??"");t&&s&&("WillBooster"!==t&&"WillBoosterLab"!==t||await n((()=>ve.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:s,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 ht={"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 yt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,n]of Object.entries(ht)){const i=t.resolve(e.dirPath,".github",s);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,n)>n.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await C.run((()=>F.generateFile(i,n)))}}))}const wt=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 bt(s){const n=t.resolve(s,"package.json");try{const i=r.existsSync(n);let o={},a={},c={},l=!1;if(i){const e=r.readFileSync(n,"utf8");c=JSON.parse(e),o=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const n=t.resolve(s,".releaserc.json"),i=JSON.parse(await e.readFile(n,"utf8"));p=i?.branches||[],d=i?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(s,".."))||!r.existsSync(t.resolve(s,"..","..","package.json"));let m;u&&(m=await async function(e,t){const s=b(e),n=(await s.getRemotes(!0)).find((e=>"origin"===e.name)),i=n?.refs?.fetch??n?.refs?.push;if("string"==typeof i){const e=await kt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await kt(o);if(e&&"Not Found"!==e.message)return e}}(s,c));let f="";try{f+=(await e.readFile(t.resolve(s,".tool-versions"),"utf8")).trim()}catch{}for(const[n,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(s,`.${n}-version`),"utf8");f&&(f+="\n"),f+=i+" "+o.trim()}catch{}let g="";try{g=await e.readFile(t.resolve(s,"Dockerfile"),"utf8")}catch{}const h=t.resolve(s,"wbfy.json");let y;try{const t=await e.readFile(h,"utf8");y=wt.parse(JSON.parse(t))}catch{}const w={dirPath:s,dockerfile:g,isRoot:u,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,isBun:r.existsSync(t.join(s,"bunfig.toml")),isEsmPackage:l,isWillBoosterConfigs:n.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:vt("packages/**/package.json",s),doesContainsDockerfile:!!g||r.existsSync(t.resolve(s,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(s,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(s,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(s,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(s,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(s,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(s,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(s,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(s,".vscode","settings.json")),doesContainsJavaScript:vt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScript:vt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsx:vt("{app,src,tests}/**/*.{t,j}sx",s),doesContainsJavaScriptInPackages:vt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScriptInPackages:vt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsxInPackages:vt("packages/**/{app,src,tests}/**/*.{t,j}sx",s),depending:{blitz:!!o.blitz,firebase:!!a["firebase-tools"],litestream:g.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:f,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.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(w),w.doesContainsGemfile||w.doesContainsGoMod||w.doesContainsPackageJson||w.doesContainsPoetryLock||w.doesContainsPomXml||w.doesContainsPubspecYaml||w.doesContainsTemplateYaml)return w}catch{}}function vt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function kt(e){const[t,s]=ke.getOrgAndName(e);if(!t||!s)return;const n={full_name:`${t}/${s}`};try{const e=await ve.request("GET /repos/{owner}/{repo}",{owner:t,repo:s});Object.assign(n,e.data)}catch{}return n}await async function(){const s=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=s.verbose,k.doesUploadEnvVars=s.env;for(const n of s.paths){const o=t.join(n,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([n,...r]);const a=await bt(n);if(!a){console.error(`there is no valid package.json in ${n}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>bt(e))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await L(a),await ct(a),await Promise.all([x(a),P(a),c.then((()=>Ue(a))),Q(a),se(a),pe(a),yt(a),Oe(a),Re(a),Te(a),Ye(a),Me(a),nt(a),pt(a),ft(a),gt(a)]),await C.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(S(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(We(e)),await me(e,a),await C.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Je(e),await Se(e,a,s.skipDeps),d.push(Te(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(et(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(Ze(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isWillBoosterConfigs||d.push(ce(e,a)),d.push(oe(e))),e.depending.pyright&&d.push(ze(e)));await Promise.all(d),await C.promiseAll(),B("yarn",["cleanup"],n),B("yarn",["install"],n)}}();
|
2
2
|
//# sourceMappingURL=index.js.map
|