wbfy 1.102.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as n,ignoreErrorAsync as i}from"@willbooster/shared-lib";import s from"yargs";import o from"node:fs";import{globby as r,globbySync as a}from"globby";import{PromisePool as c}from"minimal-promise-pool";import l from"node:child_process";import p from"deepmerge";import d from"node:os";import{Octokit as u}from"@octokit/core";import m from"lodash.clonedeep";import f from"js-yaml";import g from"dotenv";import h from"libsodium-wrappers";import{simpleGit as y}from"simple-git";function w(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const b=new class{constructor(){w(this,"isVerbose",void 0),this.isVerbose=!1}};const v=new class{async function(e,t){b.isVerbose&&console.info(`--------- ${e} start ---------`),await t(),b.isVerbose&&console.info(`---------- ${e} end ----------`)}},k={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n),console.log(`Generated/Updated ${t}`)}},j=new c;async function _(e){return v.function("fixAbbreviations",(async()=>{const n=await r("**/*.md",{dot:!0,cwd:e,gitignore:!0});b.isVerbose&&console.info(`Found ${n.length} markdown files in ${e}`);for(const i of n){const n=t.join(e,i);await j.run((async()=>{const e=await o.promises.readFile(n,"utf8"),t=e.replaceAll("c.f.","cf.").replaceAll("eg.","e.g.").replaceAll("ie.","i.e.");e!==t&&await k.generateFile(n,t)}))}const i=await r(["{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:e,gitignore:!0});b.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${e}`);for(const n of i){const i=t.join(e,n),s=await o.promises.readFile(i,"utf8"),r=s.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");s!==r&&await k.generateFile(i,r)}await j.promiseAll()}))}async function P(n){return v.function("fixDockerfile",(async()=>{if(!n.containingDockerfile)return;const i=t.join(n.dirPath,"Dockerfile"),s=await e.readFile(i,"utf8");let o=s.replaceAll("then(process.stdout.write)","then(t => process.stdout.write(t))");s.includes("FROM node")&&(o=o.replaceAll(/curl https:\/\/raw.githubusercontent.com\/WillBooster(\S+)/g,"node -e 'fetch(\"https://raw.githubusercontent.com/WillBooster$1\").then(r => r.text()).then(t => process.stdout.write(t))'").replaceAll("wb db","wb prisma"),o.includes("node node_modules/.bin/wb")&&!o.includes("procps")&&(o=o.replaceAll(/apt-get -qq install -y --no-install-recommends (.+)\\/g,((e,t)=>{const n=t.trim().split(/\s+/);return n.push("procps"),`apt-get -qq install -y --no-install-recommends ${n.sort().join(" ")} \\`})))),s!==o&&await e.writeFile(i,o)}))}async function x(n){return v.function("fixPlaywrightConfig",(async()=>{const i=t.join(n.dirPath,"playwright.config.ts"),s=await e.readFile(i,"utf8"),o=s.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");s!==o&&await e.writeFile(i,o)}))}async function F(e){return v.function("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),i=t.join(e,"tests");try{await o.promises.rename(n,i);const s=await o.promises.readFile(t.join(e,"package.json"),"utf8"),r=s.replaceAll("__tests__","tests");if(s===r)return;await o.promises.writeFile(t.join(e,"package.json"),r)}catch{}})))}))}async function $(i,s){return v.function("fixTypeDefinitions",(async()=>{const o=t.resolve(i.dirPath,"@types"),r=i.root&&i.containingSubPackageJsons?void 0:t.resolve(i.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const i of a){const a=i.name.slice(0,-5),c=i.name.endsWith(".d.ts");let l=c?a:i.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));i.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await j.run((()=>e.rename(t.join(o,i.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await j.run((()=>e.rename(t.join(o,i.name),t.join(r,i.name))))):i.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await j.run((()=>n((()=>e.rename(t.join(o,i.name,"index.d.ts"),t.join(r,`${i.name}.d.ts`)))))))}}))}function S(e,t,n,i=0){do{const[i,s,o]=R(e,t,n);console.log(`$ ${i} ${s.join(" ")} at ${o.cwd}`);if(0===l.spawnSync(i,s,o).status)break}while(--i>=0)}function O(e,t,n){const[i,s,o]=R(e,t,n);o.stdio="pipe";const r=l.spawnSync(i,s,o),a=r.stderr.toString().trim();return a&&console.error(`${i} [${s.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function R(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.replace(`${i.BERRY_BIN_FOLDER}:`,"")),i.ASDF_DIR&&(t=["-l","-c",`. ${i.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:i,shell:!1,stdio:"inherit"}]}function E(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let n=0,i=1;for(const e of t)n+=e*i,i/=1e3;return n}const T="3.9.16",D="adoptopenjdk-11.0.17+8",B="2.0.0-beta.29",A="13.4.7";async function W(e){return v.function("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${N.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),i=[...new Set(n)];if(e.containingPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&I(i,"poetry",t?.info?.version),I(i,"python",T,!0)}e.depending.firebase&&I(i,"java",D,!0);if(e.containingPackageJson){const t=O("npm",["show","yarn","version"],e.dirPath);I(i,"yarn",t)}for(const n of C){const i=t.resolve(e.dirPath,`.${n}-version`);o.promises.rm(i,{force:!0})}const s=t.resolve(e.dirPath,".tool-versions");await(i.length>0?j.run((()=>o.promises.writeFile(s,i.join("\n")+"\n"))):j.run((()=>o.promises.rm(s,{force:!0})))),await j.promiseAll(),S("asdf",["plugin","update","--all"],e.dirPath),S("asdf",["install"],e.dirPath)}(e)}))}const N=new Set(["java","nodejs","python"]),C=["java","node","python"];function I(e,t,n,i=!1){const s=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(s>=0){const[,t]=e[s].split(/\s+/);E(n)>E(t)&&(e[s]=o)}else e.splice(i?0:e.length,0,o)}const J="# Project-specific settings",z=/# Project-specific settings[^\n]*\n/gm,L="# Generated by wbfy",G=`${J} (head)\n\n\n${L}\n`,M=`\n${J} (tail)\n`,U={separator:L,separatorPrefix:"# Generated by ",defaultHeadUserContent:G,defaultTailUserContent:M,async readGitignoreWithoutSeparators(e){try{let t=await o.promises.readFile(e,"utf8");const n=H(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(z,"").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(z,`${J} (head)\n`):G},getTailUserContent(e){const t=H(e);return t>0?e.slice(t-1):M},async isBerryZeroInstallEnabled(e){try{return(await o.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function H(e){const t=e.indexOf(J),n=e.lastIndexOf(J);return n>t?n:-1}const q="\n**/*.sqlite3*\n.yarn/install-state.gz\n";async function Y(e){return v.function("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.containingDockerfile){const e=await k.readFileIgnoringError(n)??"",t=U.getHeadUserContent(e),i=U.getTailUserContent(e),s=t+q+i;await j.run((()=>k.generateFile(n,s)))}else await o.promises.rm(n,{force:!0})}))}const K={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","cpp","dart","htm","html","pu","puml","rb","vue","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","css","htm","html","md","scss","vue","yaml","yml"].sort()},V=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Z(K.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Z(K.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Z(K.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${Z(K.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function X(e){return v.function("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await j.run((()=>k.generateFile(n,V)))}))}function Z(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const Q="\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 ee(e){return v.function("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore"),i=await k.readFileIgnoringError(n)??"",s=U.getHeadUserContent(i),o=U.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await U.readGitignoreWithoutSeparators(r)||"",c=s+Q+a+o;await j.run((()=>k.generateFile(n,c)))}))}function te(e,t){return t}function ne(e,t,n){const i=[...e];for(const[s,o]of t.entries())void 0===i[s]?i[s]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?i[s]=p(e[s],o,n):e.includes(o)||i.push(o);return i}async function ie(e,n){return v.function("generateEslintrc",(async()=>{const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let s={root:!0,extends:i};const r=t.resolve(e.dirPath,".eslintrc.json");try{const t=await o.promises.readFile(r,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=s.extends;s.extends=n.extends,n.extends=a,s=p.all([s,n,s],{arrayMerge:ne}),"0"===e.depending.blitz?se(s,"blitz"):"2"===e.depending.blitz&&se(s,"./node_modules/@blitzjs/next/eslint")}catch{}const a=JSON.stringify(s);await j.run((()=>k.generateFile(r,a)))}))}function se(e,t){e.extends=[t,...e.extends.filter((e=>e!==t))]}const oe=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...K.codeWith2IndentSize,...K.codeWith4IndentSize,...K.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n`;async function re(e){return v.function("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await j.run((()=>k.generateFile(n,oe)))}))}const ae=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],ce="\n.devcontainer/\ndist/\ntemp/\nIcon[\r]\n!.keep\n";async function le(e,n){return v.function("generateGitignore",(async()=>{const i=t.resolve(e.dirPath,".gitignore"),s=await k.readFileIgnoringError(i)??"";let o=U.getHeadUserContent(s)+ce;const r=U.getTailUserContent(s),a=[...ae];e.containingGemfile&&a.push("ruby"),e.containingGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.containingPackageJson&&a.push("node"),e.containingPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.containingPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.containingTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.containingPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(a.push("nextjs"),o+=".blitz/\n.blitz**\n"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),n.depending.prisma&&(o+="*.sqlite3\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs");let c="";for(const e of a){let t=await ue(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),s=await i.text();if(s.includes("Attention Required!"))return void console.error(`Failed to fetch ${n}`);t=s.trim(),await j.run((()=>de(e,t))),b.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await U.isBerryZeroInstallEnabled(i)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.containingPomXml||e.containingPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.containingPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.containingPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await j.run((()=>k.generateFile(i,l)))}))}const pe=t.join(d.homedir(),".cache","wbfy","gitignore");async function de(e,n){await o.promises.mkdir(pe,{recursive:!0}),await o.promises.writeFile(t.join(pe,e),n)}async function ue(e){try{const n=await o.promises.stat(t.join(pe,e));if(Date.now()-n.mtimeMs>216e5)return;return await o.promises.readFile(t.join(pe,e),"utf8")}catch{}}const me={getLintFixSuffix:e=>e.containingJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},fe=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,ge=!!fe,he=new u({auth:fe});const ye=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},we={node:["src","tests","scripts"].sort(),blitz0:["tests","scripts","app","db","integrations","mailers","test"].sort(),blitz2:["src","tests","scripts","db","integrations","mailers"].sort()};function be(e){return e.depending.blitz?"0"===e.depending.blitz?we.blitz0:we.blitz2:we.node}const ve=["eslint","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],ke=[...ve,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],je=["eslint-plugin-react","eslint-plugin-react-hooks"],_e={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...ve],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...ve,...je],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...ke],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...ke,...je],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next",...ke,...je],"../../.eslintrc.json":[]};async function Pe(e,n,i){return v.function("generatePackageJson",(async()=>{await async function(e,n,i){const s=t.resolve(e.dirPath,"package.json"),a=await o.promises.readFile(s,"utf8"),c=JSON.parse(a);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.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.tslib,delete e.devDependencies["@willbooster/eslint-config"],delete e.devDependencies["@willbooster/eslint-config-react"],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(_e))for(const n of t)delete e.devDependencies[n];await j.run((()=>o.promises.rm("lerna.json",{force:!0})))}(c),"@willbooster/prettier-config"!==c.name&&(c.prettier="@willbooster/prettier-config");for(const e of Object.keys(c.scripts))c.scripts[e].includes("git clone")||(c.scripts[e]=c.scripts[e].replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=p(c.scripts,xe(e)),c.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),i=await o.promises.readFile(n,"utf8"),s=i.indexOf(U.separatorPrefix);if(s<0)return"";const r=i.slice(0,s);return r.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);let l=[],d=["lint-staged","prettier","sort-package-json","@willbooster/prettier-config"];const u=[];e.root&&(d.push("husky","@willbooster/renovate-config"),(e.publicRepo||e.referredByOtherRepo)&&(d.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable"),e.depending.semanticRelease&&(d.push("conventional-changelog-conventionalcommits"),c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),c.version="0.0.0-semantically-released"),e.depending.playwrightTest&&(c.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright),e.containingSubPackageJsons?c.workspaces=["packages/*"]:delete c.workspaces);if(e.depending.wb){c.dependencies["@willbooster/shared-scripts"]||c.dependencies["@willbooster/wb"]?l.push("@willbooster/wb"):d.push("@willbooster/wb"),delete c.dependencies["@willbooster/shared-scripts"],delete c.devDependencies["@willbooster/shared-scripts"];for(const e of Object.keys(c.scripts))c.scripts[e]=c.scripts[e].replace(/wb\s+db/,"wb prisma")}(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(d.push("eslint","micromatch"),e.containingTypeScriptInPackages&&d.push("@typescript-eslint/parser"));(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push("typescript");e.eslintBase&&d.push(..._e[e.eslintBase]);e.willBoosterConfigs&&(l=l.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));c.name||(c.name=t.basename(e.dirPath));e.containingSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&n.publicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[m]=ye.getOrgAndName(e.repository??"");"WillBooster"!==m&&"WillBoosterLab"!==m||(c.author="WillBooster Inc.");e.root||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!e.containingSubPackageJsons){if(e.containingJavaScript||e.containingTypeScript?c.scripts["lint-fix"]+=me.getLintFixSuffix(e):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup.replace(" && yarn lint-fix","")),e.containingPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>o.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(c.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format+=" && yarn format-code")}if(e.containingPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const t=await r("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,i]=e.split(/[/\\]/);i&&n.add(t)}if(n.size>0){const e=[...n].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",u.push("black","isort","flake8")}}e.repository&&(c.repository=e.repository)}e.depending.blitz?("0"===e.depending.blitz?(d=d.filter((e=>!e.includes("@typescript-eslint/"))),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-import-resolver-typescript"!==e&&"eslint-plugin-import"!==e&&"eslint-plugin-react-hooks"!==e))):l.push(`@blitzjs/auth@${B}`,`@blitzjs/next@${B}`,`@blitzjs/rpc@${B}`,`next@${A}`),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");e.depending.next&&delete c.devDependencies["@types/react"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await o.promises.writeFile(s,JSON.stringify(c)),i||(l=l.filter((e=>!c.devDependencies?.[e])),l.length>0&&S("yarn",["add",...new Set(l)],e.dirPath),d=d.filter((e=>!c.dependencies?.[e])),d.length>0&&S("yarn",["add","-D",...new Set(d)],e.dirPath),u.length>0&&S("poetry",["add","--group","dev",...new Set(u)],e.dirPath))}(e,n,i)}))}function xe(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${be(e)}}/**/*.{${K.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${K.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};return e.containingSubPackageJsons?(t=p({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --parallel --verbose run format",lint:"yarn workspaces foreach --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${K.prettier.join(",")}}" "!**/packages/**" "!**/test-fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --verbose run test",typecheck:"yarn workspaces foreach --parallel --verbose run typecheck"}),e.containingTypeScript||e.containingTypeScriptInPackages||delete t.typecheck):(e.depending.wb&&(t.typecheck="wb typecheck"),e.containingTypeScript||e.containingTypeScriptInPackages||delete t.typecheck,e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright")),t}const Fe="npm test",$e={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 Se(e){return v.function("generateHuskyrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),i=await o.promises.readFile(n,"utf8"),s=JSON.parse(i);s.scripts||={},delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepare,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack;const r=t.resolve(e.dirPath,".husky");await Promise.all([o.promises.writeFile(n,JSON.stringify(s,void 0,2)),o.promises.rm(r,{force:!0,recursive:!0})]),S("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(r,"pre-commit"),c=await o.promises.readFile(a,"utf8");await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await j.run((()=>o.promises.writeFile(a,c.replace(Fe,$e.preCommit))));const{typecheck:l}=xe(e);if(l){let n=e.repository?.startsWith("github:WillBoosterLab/")?$e.prePushForLab:$e.prePush;n=n.replace("yarn typecheck",l.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await j.run((()=>o.promises.writeFile(t.resolve(r,"pre-push"),c.replace(Fe,n),{mode:493})))}const p=[];e.versionsText&&p.push('run_if_changed "\\..+-version" "asdf plugin update --all"');e.versionsText?.includes("python ")&&p.push('run_if_changed "\\..+-version" "asdf install python"');e.versionsText&&p.push('run_if_changed "\\..+-version" "asdf install"');const d=e.depending.blitz?" && rm -Rf .next":"";p.push(`run_if_changed "package\\.json" "yarn${d}"`),e.containingPoetryLock&&p.push('run_if_changed "poetry\\.lock" "poetry install"');e.depending.blitz?p.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&&p.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 u=c.replace(Fe,`${$e.postMerge}\n\n${p.join("\n")}`);await j.run((()=>o.promises.writeFile(t.resolve(r,"post-merge"),u,{mode:493})))}(e)}))}const Oe='<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="ts" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.ts)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="tsx" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.tsx)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="js" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.js)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="json" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.json)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="md" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.md)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="html" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.html)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n </component>\n</project>\n';async function Re(e){return v.function("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(o.existsSync(n)){const i=t.resolve(n,"watcherTasks.xml");await(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages||e.containingPackageJson&&!e.containingPubspecYaml&&!e.containingGemfile&&!e.containingGoMod&&!e.containingPomXml?j.run((()=>k.generateFile(i,Oe))):j.run((()=>o.promises.rm(i,{force:!0}))))}}))}async function Ee(e){return v.function("generateLintstagedrc",(async()=>{await async function(e){const n=e.root?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.containingJavaScript||e.containingTypeScript){const t=`\n '${Te(e)}': [${JSON.stringify(`${n}eslint --fix${me.getLintFixSuffix(e)}`)}, '${n}prettier --cache --write'],`;i.push(t)}const s=e.root?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${K.prettier.join(",")}}': files => {\n ${e.containingJavaScript||e.containingTypeScript?function(e){return`files = micromatch.not(files, '${Te(e)}');`}(e):""}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${s});\n if (filteredFiles.length === 0) return [];\n const commands = [\`${n}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${n}sort-package-json');\n }\n return commands;\n },`),e.containingPubspecYaml&&i.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.containingPoetryLock&&i.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const r=`${e.containingJavaScript||e.containingTypeScript?"const micromatch = require('micromatch');":""}\n\nmodule.exports = {${i.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await j.run((()=>k.generateFile(a,r)))}(e)}))}function Te(e){return`./{${be(e).join(",")}}/**/*.{${K.eslint.join(",")}}`}const De="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function Be(e){return v.function("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),i=await k.readFileIgnoringError(n)??"",s=U.getHeadUserContent(i),o=U.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await U.readGitignoreWithoutSeparators(r)||"";let c="";e.containingPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=s+De+c+a+o;await j.run((()=>k.generateFile(n,l)))}))}const Ae={venvPath:".",venv:".venv"};async function We(e){return v.function("generatePyrightConfigJson",(async()=>{let n=m(Ae);const i=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await o.promises.readFile(i,"utf8"),t=JSON.parse(e);n=p.all([n,t,n],{arrayMerge:te})}catch{}const s=JSON.stringify(n);await j.run((()=>k.generateFile(i,s)))}))}async function Ne(e){return v.function("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let i=await o.promises.readFile(n,"utf8");i=Ie(e,i,Ce,".releaserc.json");const s=e.repository?.slice(e.repository?.indexOf(":")+1),r=o.readdirSync(`${e.dirPath}/.github/workflows`);for(const t of r){if(!t.startsWith("test")&&!t.startsWith("deploy"))continue;let n=t;n=n.charAt(0).toUpperCase()+n.slice(1,n.indexOf(".")),n=n.replace("-"," ");i=Ie(e,i,`[![${n}](https://github.com/${s}/actions/workflows/${t}/badge.svg)](https://github.com/${s}/actions/workflows/${t})`,`.github/workflows/${t}`)}await j.run((()=>k.generateFile(n,i)))}))}const Ce="[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)";function Ie(e,n,i,s){if(!o.existsSync(t.resolve(e.dirPath,s)))return n;const r=n.indexOf(i);r>=0&&(n=n.slice(0,r)+n.slice(r+i.length));let a=!1;for(let e=0;e<n.length;e++)if("\n"===n[e]){a=!0,n=`${n.slice(0,e+1)}${i}\n${n.slice(e+1)}`;break}return a||(n=`${n}\n${i}\n`),n}async function Je(e){return v.function("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json");try{const e=JSON.parse(await o.promises.readFile(n,"utf8")),t=e?.plugins||[];for(let e=0;e<t.length;e++){const n=Array.isArray(t[e])?t[e][0]:t[e],i=Array.isArray(t[e])&&t[e][1]||{};"@semantic-release/commit-analyzer"===n?t[e]=["@semantic-release/commit-analyzer",p.all([i,{preset:"conventionalcommits"}],{arrayMerge:te})]:"@semantic-release/github"===n&&(t[e]=["@semantic-release/github",p.all([i,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:te})])}const i=JSON.stringify(e);await j.run((()=>k.generateFile(n,i)))}catch{}}))}const ze={extends:["@willbooster"]};async function Le(e){return v.function("generateRenovateJson",(async()=>{let n=m(ze);const i=t.resolve(e.dirPath,".renovaterc.json");try{const e=await o.promises.readFile(i,"utf8"),t=JSON.parse(e);n=p.all([n,t,n],{arrayMerge:te})}catch{}e.depending.blitz&&"0"!==e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await j.run((()=>o.promises.rm(t.resolve(e.dirPath,"renovate.json"),{force:!0})));const s=JSON.stringify(n);await j.run((()=>k.generateFile(i,s)))}))}function Ge(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,i]of t)delete e[n],e[n]=i;return e}const Me={compilerOptions:{target:"ESNext",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/**/*"]},Ue={compilerOptions:{target:"ESNext",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 He(e,n){return v.function("generateTsconfig",(async()=>{if(n.depending.blitz)return;let i=m(e.root?Me:Ue);e.containingJsxOrTsx||e.containingJsxOrTsxInPackages||delete i.compilerOptions?.jsx,e.root&&!e.containingSubPackageJsons&&(i.include=i.include?.filter((e=>!e.startsWith("packages/*/")))),e.esmPackage&&(i.compilerOptions={...i.compilerOptions,moduleResolution:"NodeNext"});const s=t.resolve(e.dirPath,"tsconfig.json");try{const e=await o.promises.readFile(s,"utf8"),t=JSON.parse(e);"./node_modules/@willbooster/tsconfig/tsconfig.json"===t.extends&&delete t.extends,delete i.compilerOptions?.target,delete i.compilerOptions?.module,delete i.compilerOptions?.moduleResolution,t.compilerOptions?.jsx&&delete i.compilerOptions?.jsx,i=p.all([i,t,i],{arrayMerge:ne}),i.include=i.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ge(i.compilerOptions??{}),i.include?.sort();const r=JSON.stringify(i);await j.run((()=>k.generateFile(s,r)))}))}const qe={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy","renovate/**"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.head_ref || github.run_id }}","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"}}},"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 }}"}}}}};async function Ye(e){return v.function("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await o.promises.mkdir(n,{recursive:!0});const i=t.resolve(e.dirPath,".github","semantic.yml");await j.run((()=>o.promises.rm(i,{force:!0,recursive:!0})));const s=await o.promises.readdir(n,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...s.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&r.add("release.yml"),(e.publicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&r.add("notify-ready.yml");for(const i of r){const s=t.basename(i,".yml");await j.run((()=>Ke(e,n,s)))}}))}async function Ke(e,n,i){let s=m(qe[i]||{});const r=t.join(n,`${i}.yml`);try{const e=await o.promises.readFile(r,"utf8"),t=f.load(e);s=p.all([s,t,s],{arrayMerge:ne})}catch{}if(i.startsWith("deploy")){if(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},s.jobs){const e=s.jobs;delete s.jobs,s.jobs=e}s.on?.push&&(s.on.push["paths-ignore"]=[...new Set([...s.on.push["paths-ignore"]??[],"**.md","**/docs/**"])])}for(const t of Object.values(s.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;Ve(e,t,i)}switch(i){case"release":if(s.on.schedule)delete s.on.push;else{if(!(e.release.branches.length>0))return void await o.promises.rm(t.join(n,"release.yml"),{force:!0});s.on.push.branches=e.release.branches}break;case"wbfy":Xe(s,20,24);break;case"wbfy-merge":Xe(s,1,4)}if(function(e){delete e.jobs["add-to-project"]}(s),await Ze(s,r),"release"===i)await o.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await o.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!s.jobs.sync)return;s.jobs["sync-force"]=s.jobs.sync;const e=s.jobs.sync.with.sync_params_without_dest;if(!e)return;s.jobs.sync.with.sync_params_without_dest=`--force ${e}`,s.name="Force to Sync",s.on={workflow_dispatch:null},delete s.jobs.sync,await Ze(s,t.join(n,"sync-force.yml"))}}function Ve(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.publicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.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){delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,".env"===e.with.dot_env_path&&delete e.with.dot_env_path;delete e.with.cpu_arch}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.containingDockerfile&&((n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.publicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ge(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ge(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function Xe(e,t,n){const[i,s]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==i&&Number.isInteger(s)){const e=(s+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function Ze(e,t){const n=f.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await o.promises.writeFile(t,n)}async function Qe(e){return v.function("generateYarnrcYml",(async()=>{const n=O("yarn",["--version"],e.dirPath),i=function(e,t){const n=O("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);et(n)<=et(i)&&n!==i&&S("yarn",["set","version",i],e.dirPath,1),S("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath);const s=t.join(e.dirPath,".yarn","releases");await o.promises.mkdir(s,{recursive:!0});for(const e of await o.promises.readdir(s))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&(await j.run((()=>o.promises.rm(t.join(s,e)))),console.log("Removed",t.join(s,e)));const r=t.resolve(e.dirPath,".yarnrc");await j.run((()=>o.promises.rm(r,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=f.load(await o.promises.readFile(a,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.injectEnvironmentFiles=[],c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter((e=>".yarn/plugins/undefined.cjs"!==e.path))??[],c.plugins.length!==l){const n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await j.run((()=>o.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await o.promises.writeFile(a,f.dump(c,{lineWidth:-1}))}))}function et(e){const[t]=e.split(".");return Number(t)}async function tt(e){return v.function("setupLabels",(async()=>{if(!ge)return;const[t,n]=ye.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await nt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await nt(t,n,"d2: easy :rabbit2:","DDD6FE"),await nt(t,n,"d3: medium :ox:","C4B5FD"),await nt(t,n,"d4: hard :squid:","A78BFA"),await nt(t,n,"d5: x-hard :whale2:","8B5CF6"),await nt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await nt(t,n,"p2: urgent :fire::fire:","F87171"),await nt(t,n,"p3: important :fire:","FCA5A5"),await nt(t,n,"p4: nice to have :droplet:","FECACA"),await nt(t,n,"r: blitz","5300bc"),await nt(t,n,"r: firebase","ffca28"),await nt(t,n,"r: prisma","0c344b"),await nt(t,n,"r: react","61dafb"),await nt(t,n,"r: svelte","ff3e00"),await nt(t,n,"r: semantic-release","494949"),await nt(t,n,"ready :rocket:","22C55E"),await nt(t,n,"review requested :mag:","FBCA04"),await nt(t,n,"released :bookmark:","6366F1"),await nt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await nt(t,n,"s: 1h :clock1:","E5E7EB"),await nt(t,n,"s: 2h :clock2:","D1D5DB"),await nt(t,n,"s: 3h :clock3:","9CA3AF"),await nt(t,n,"s: 5h :clock5:","6B7280"),await nt(t,n,"s: 8h :clock8:","4B5563"),await nt(t,n,"s: 13h :clock1:","374151"),await nt(t,n,"t: build :hammer:","BFDBFE"),await nt(t,n,"t: chore :broom:","BFDBFE"),await nt(t,n,"t: ci :construction_worker:","BFDBFE"),await nt(t,n,"t: docs :memo:","BFDBFE"),await nt(t,n,"t: feat :sparkles:","BFDBFE"),await nt(t,n,"t: fix :bug:","BFDBFE"),await nt(t,n,"t: perf :zap:","BFDBFE"),await nt(t,n,"t: refactor :recycle:","BFDBFE"),await nt(t,n,"t: style :lipstick:","BFDBFE"),await nt(t,n,"t: test :test_tube:","BFDBFE"),await nt(t,n,"project","24292F"),await it(t,n,"bug"),await it(t,n,"documentation"),await it(t,n,"duplicate"),await it(t,n,"enhancement"),await it(t,n,"good first issue"),await it(t,n,"help wanted"),await it(t,n,"invalid"),await it(t,n,"question"),await it(t,n,"wontfix"),await it(t,n,"ready"),await it(t,n,"review requested"),await it(t,n,"released"),await it(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function nt(e,t,n,i){try{await he.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:i})}catch{await he.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:i})}}async function it(e,t,n){try{await he.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const st=["READY_DISCORD_WEBHOOK_URL"];async function ot(e){return v.function("setupSecrets",(async()=>{if(!ge)return;const[t,n]=ye.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const i=g.config().parsed||{};if(0!==Object.keys(i).length)try{for(const e of st)try{await he.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const s=await he.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=s.data;await h.ready;for(const[s,a]of Object.entries(i)){if(e.publicRepo&&"GH_BOT_PAT"===s)continue;if(!e.publicRepo&&"PUBLIC_GH_BOT_PAT"===s)continue;const i=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,i),p=h.to_base64(l,h.base64_variants.ORIGINAL);await he.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:s,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function rt(e){}async function at(n){const i=t.resolve(n,"package.json");try{const s=o.existsSync(i);let r={},a={},c={},l=!1;if(s){const e=o.readFileSync(i,"utf8");c=JSON.parse(e),r=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const i=t.resolve(n,".releaserc.json"),s=JSON.parse(await e.readFile(i,"utf8"));p=s?.branches||[],d=s?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(n,".."))||!o.existsSync(t.resolve(n,"..","..","package.json"));let m;u&&(m=await async function(e,t){const n=y(e),i=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),s=i?.refs?.fetch??i?.refs?.push;if("string"==typeof s){const e=await lt(s);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await lt(o);if(e&&"Not Found"!==e.message)return e}}(n,c));let f="";try{f+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[i,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${i}-version`),"utf8");f&&(f+="\n"),f+=s+" "+o.trim()}catch{}const g={dirPath:n,root:u,publicRepo:!1===m?.private,referredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,esmPackage:l,willBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),containingSubPackageJsons:ct("packages/**/package.json",n),containingDockerfile:o.existsSync(t.resolve(n,"Dockerfile"))||o.existsSync(t.resolve(n,"docker-compose.yml")),containingGemfile:o.existsSync(t.resolve(n,"Gemfile")),containingGoMod:o.existsSync(t.resolve(n,"go.mod")),containingPackageJson:o.existsSync(t.resolve(n,"package.json")),containingPoetryLock:o.existsSync(t.resolve(n,"poetry.lock")),containingPomXml:o.existsSync(t.resolve(n,"pom.xml")),containingPubspecYaml:o.existsSync(t.resolve(n,"pubspec.yaml")),containingTemplateYaml:o.existsSync(t.resolve(n,"template.yaml")),containingJavaScript:ct("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScript:ct("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsx:ct("{app,src,tests}/**/*.{t,j}sx",n),containingJavaScriptInPackages:ct("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScriptInPackages:ct("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsxInPackages:ct("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:(r.blitz||"").replace("^","")[0],firebase:!!a["firebase-tools"],next:!!r.next,playwrightTest:!!r["@playwright/test"]||!!a["@playwright/test"]||!!a.playwright,prisma:!!r.prisma,pyright:!!a.pyright,reactNative:!!r["react-native"],semanticRelease:!!(a["semantic-release"]||p.length>0||d.length>0),storybook:!!a["@storybook/react"],wb:!!(r["@willbooster/wb"]||a["@willbooster/wb"]||r["@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};if(g.eslintBase=function(e){if("2"===e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.containingTypeScript)return e.containingJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.containingJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.containingJavaScript)return"@willbooster/eslint-config-js"}(g),g.containingGemfile||g.containingGoMod||g.containingPackageJson||g.containingPoetryLock||g.containingPomXml||g.containingPubspecYaml||g.containingTemplateYaml)return g}catch{}}function ct(e,t){return a(e,{dot:!0,cwd:t}).length>0}async function lt(e){const[t,n]=ye.getOrgAndName(e);if(!t||!n)return;const i={full_name:`${t}/${n}`};try{const e=await he.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(i,e.data)}catch{}return i}await async function(){const n=await s(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({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;b.isVerbose=n.verbose;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await F([s,...r]);const a=_(s),c=await at(s);if(!c){console.error(`there is no valid package.json in ${s}`);continue}const l=(await Promise.all(r.map((e=>at(e))))).filter((e=>!!e)),p=[c,...l];if(b.isVerbose)for(const e of p)console.info(e);await W(c),await Qe(c),await Promise.all([P(c),a.then((()=>Ne(c))),Y(c),X(c),re(c),Se(c),Re(c),Ee(c),Le(c),Je(c),Ye(c),tt(c),ot(c),rt()]),await j.promiseAll();const d=[];for(const e of p)(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push($(e,e.root?p:[e])),e.depending.playwrightTest&&d.push(x(c)),await le(e,c),await j.promiseAll(),(e.root||e.containingPackageJson)&&(await Be(e),await Pe(e,c,n.skipDeps),d.push(Ee(e)),(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push(He(e,c)),(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(c.willBoosterConfigs||d.push(ie(e,c)),d.push(ee(e))),e.depending.pyright&&d.push(We(e)));await Promise.all(d),await j.promiseAll(),S("yarn",["cleanup"],s),S("yarn",["install"],s)}}();
1
+ import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as n,ignoreErrorAsync as i}from"@willbooster/shared-lib";import s from"yargs";import o from"node:fs";import{globby as r,globbySync as a}from"globby";import{PromisePool as c}from"minimal-promise-pool";import l from"node:child_process";import p from"deepmerge";import d from"node:os";import{Octokit as u}from"@octokit/core";import m from"lodash.clonedeep";import f from"js-yaml";import g from"dotenv";import h from"libsodium-wrappers";import{simpleGit as y}from"simple-git";function w(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const b=new class{constructor(){w(this,"isVerbose",void 0),this.isVerbose=!1}};const v=new class{async function(e,t){b.isVerbose&&console.info(`--------- ${e} start ---------`),await t(),b.isVerbose&&console.info(`---------- ${e} end ----------`)}},k={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n),console.log(`Generated/Updated ${t}`)}},j=new c;async function _(e){return v.function("fixAbbreviations",(async()=>{const n=await r("**/*.md",{dot:!0,cwd:e,gitignore:!0});b.isVerbose&&console.info(`Found ${n.length} markdown files in ${e}`);for(const i of n){const n=t.join(e,i);await j.run((async()=>{const e=await o.promises.readFile(n,"utf8"),t=e.replaceAll("c.f.","cf.").replaceAll("eg.","e.g.").replaceAll("ie.","i.e.");e!==t&&await k.generateFile(n,t)}))}const i=await r(["{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:e,gitignore:!0});b.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${e}`);for(const n of i){const i=t.join(e,n),s=await o.promises.readFile(i,"utf8"),r=s.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");s!==r&&await k.generateFile(i,r)}await j.promiseAll()}))}async function P(n){return v.function("fixDockerfile",(async()=>{if(!n.containingDockerfile)return;const i=t.join(n.dirPath,"Dockerfile"),s=await e.readFile(i,"utf8");let o=s.replaceAll("then(process.stdout.write)","then(t => process.stdout.write(t))");s.includes("FROM node")&&(o=o.replaceAll(/curl https:\/\/raw.githubusercontent.com\/WillBooster(\S+)/g,"node -e 'fetch(\"https://raw.githubusercontent.com/WillBooster$1\").then(r => r.text()).then(t => process.stdout.write(t))'").replaceAll("wb db","wb prisma"),o.includes("node node_modules/.bin/wb")&&!o.includes("procps")&&(o=o.replaceAll(/apt-get -qq install -y --no-install-recommends (.+)\\/g,((e,t)=>{const n=t.trim().split(/\s+/);return n.push("procps"),`apt-get -qq install -y --no-install-recommends ${n.sort().join(" ")} \\`})))),s!==o&&await e.writeFile(i,o)}))}async function x(n){return v.function("fixPlaywrightConfig",(async()=>{const i=t.join(n.dirPath,"playwright.config.ts"),s=await e.readFile(i,"utf8"),o=s.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");s!==o&&await e.writeFile(i,o)}))}async function F(e){return v.function("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),i=t.join(e,"tests");try{await o.promises.rename(n,i);const s=await o.promises.readFile(t.join(e,"package.json"),"utf8"),r=s.replaceAll("__tests__","tests");if(s===r)return;await o.promises.writeFile(t.join(e,"package.json"),r)}catch{}})))}))}async function $(i,s){return v.function("fixTypeDefinitions",(async()=>{const o=t.resolve(i.dirPath,"@types"),r=i.root&&i.containingSubPackageJsons?void 0:t.resolve(i.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const i of a){const a=i.name.slice(0,-5),c=i.name.endsWith(".d.ts");let l=c?a:i.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));i.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await j.run((()=>e.rename(t.join(o,i.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await j.run((()=>e.rename(t.join(o,i.name),t.join(r,i.name))))):i.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await j.run((()=>n((()=>e.rename(t.join(o,i.name,"index.d.ts"),t.join(r,`${i.name}.d.ts`)))))))}}))}function S(e,t,n,i=0){do{const[i,s,o]=R(e,t,n);console.log(`$ ${i} ${s.join(" ")} at ${o.cwd}`);if(0===l.spawnSync(i,s,o).status)break}while(--i>=0)}function O(e,t,n){const[i,s,o]=R(e,t,n);o.stdio="pipe";const r=l.spawnSync(i,s,o),a=r.stderr.toString().trim();return a&&console.error(`${i} [${s.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function R(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.replace(`${i.BERRY_BIN_FOLDER}:`,"")),i.ASDF_DIR&&(t=["-l","-c",`. ${i.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:i,shell:!1,stdio:"inherit"}]}function E(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let n=0,i=1;for(const e of t)n+=e*i,i/=1e3;return n}const T="3.9.16",D="adoptopenjdk-11.0.17+8",B="2.0.0-beta.29",A="13.4.7";async function W(e){return v.function("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${N.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),i=[...new Set(n)];if(e.containingPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&I(i,"poetry",t?.info?.version),I(i,"python",T,!0)}e.depending.firebase&&I(i,"java",D,!0);if(e.containingPackageJson){const t=O("npm",["show","yarn","version"],e.dirPath);I(i,"yarn",t)}for(const n of C){const i=t.resolve(e.dirPath,`.${n}-version`);o.promises.rm(i,{force:!0})}const s=t.resolve(e.dirPath,".tool-versions");await(i.length>0?j.run((()=>o.promises.writeFile(s,i.join("\n")+"\n"))):j.run((()=>o.promises.rm(s,{force:!0})))),await j.promiseAll(),S("asdf",["plugin","update","--all"],e.dirPath),S("asdf",["install"],e.dirPath)}(e)}))}const N=new Set(["java","nodejs","python"]),C=["java","node","python"];function I(e,t,n,i=!1){const s=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(s>=0){const[,t]=e[s].split(/\s+/);E(n)>E(t)&&(e[s]=o)}else e.splice(i?0:e.length,0,o)}const J="# Project-specific settings",z=/# Project-specific settings[^\n]*\n/gm,L="# Generated by wbfy",G=`${J} (head)\n\n\n${L}\n`,M=`\n${J} (tail)\n`,U={separator:L,separatorPrefix:"# Generated by ",defaultHeadUserContent:G,defaultTailUserContent:M,async readGitignoreWithoutSeparators(e){try{let t=await o.promises.readFile(e,"utf8");const n=H(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(z,"").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(z,`${J} (head)\n`):G},getTailUserContent(e){const t=H(e);return t>0?e.slice(t-1):M},async isBerryZeroInstallEnabled(e){try{return(await o.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function H(e){const t=e.indexOf(J),n=e.lastIndexOf(J);return n>t?n:-1}const q="\n**/*.sqlite3*\n.yarn/install-state.gz\n";async function Y(e){return v.function("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.containingDockerfile){const e=await k.readFileIgnoringError(n)??"",t=U.getHeadUserContent(e),i=U.getTailUserContent(e),s=t+q+i;await j.run((()=>k.generateFile(n,s)))}else await o.promises.rm(n,{force:!0})}))}const K={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","cpp","dart","htm","html","pu","puml","rb","vue","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","css","htm","html","md","scss","vue","yaml","yml"].sort()},V=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Z(K.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Z(K.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Z(K.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${Z(K.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function X(e){return v.function("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await j.run((()=>k.generateFile(n,V)))}))}function Z(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const Q="\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 ee(e){return v.function("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore"),i=await k.readFileIgnoringError(n)??"",s=U.getHeadUserContent(i),o=U.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await U.readGitignoreWithoutSeparators(r)||"",c=s+Q+a+o;await j.run((()=>k.generateFile(n,c)))}))}function te(e,t){return t}function ne(e,t,n){const i=[...e];for(const[s,o]of t.entries())void 0===i[s]?i[s]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?i[s]=p(e[s],o,n):e.includes(o)||i.push(o);return i}async function ie(e,n){return v.function("generateEslintrc",(async()=>{const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let s={root:!0,extends:i};const r=t.resolve(e.dirPath,".eslintrc.json");try{const t=await o.promises.readFile(r,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=s.extends;s.extends=n.extends,n.extends=a,s=p.all([s,n,s],{arrayMerge:ne}),"0"===e.depending.blitz?se(s,"blitz"):"2"===e.depending.blitz&&se(s,"./node_modules/@blitzjs/next/eslint")}catch{}const a=JSON.stringify(s);await j.run((()=>k.generateFile(r,a)))}))}function se(e,t){e.extends=[t,...e.extends.filter((e=>e!==t))]}const oe=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...K.codeWith2IndentSize,...K.codeWith4IndentSize,...K.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n`;async function re(e){return v.function("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await j.run((()=>k.generateFile(n,oe)))}))}const ae=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],ce="\n.devcontainer/\ndist/\ntemp/\nIcon[\r]\n!.keep\n";async function le(e,n){return v.function("generateGitignore",(async()=>{const i=t.resolve(e.dirPath,".gitignore"),s=await k.readFileIgnoringError(i)??"";let o=U.getHeadUserContent(s)+ce;const r=U.getTailUserContent(s),a=[...ae];e.containingGemfile&&a.push("ruby"),e.containingGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.containingPackageJson&&a.push("node"),e.containingPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.containingPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.containingTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.containingPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(a.push("nextjs"),o+=".blitz/\n.blitz**\n"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),n.depending.prisma&&(o+="*.sqlite3\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs");let c="";for(const e of a){let t=await ue(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),s=await i.text();if(s.includes("Attention Required!"))return void console.error(`Failed to fetch ${n}`);t=s.trim(),await j.run((()=>de(e,t))),b.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await U.isBerryZeroInstallEnabled(i)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.containingPomXml||e.containingPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.containingPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.containingPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await j.run((()=>k.generateFile(i,l)))}))}const pe=t.join(d.homedir(),".cache","wbfy","gitignore");async function de(e,n){await o.promises.mkdir(pe,{recursive:!0}),await o.promises.writeFile(t.join(pe,e),n)}async function ue(e){try{const n=await o.promises.stat(t.join(pe,e));if(Date.now()-n.mtimeMs>216e5)return;return await o.promises.readFile(t.join(pe,e),"utf8")}catch{}}const me={getLintFixSuffix:e=>e.containingJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},fe=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,ge=!!fe,he=new u({auth:fe});const ye=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},we={node:["src","tests","scripts"].sort(),blitz0:["tests","scripts","app","db","integrations","mailers","test"].sort(),blitz2:["src","tests","scripts","db","integrations","mailers"].sort()};function be(e){return e.depending.blitz?"0"===e.depending.blitz?we.blitz0:we.blitz2:we.node}const ve=["eslint","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],ke=[...ve,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],je=["eslint-plugin-react","eslint-plugin-react-hooks"],_e={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...ve],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...ve,...je],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...ke],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...ke,...je],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next",...ke,...je],"../../.eslintrc.json":[]};async function Pe(e,n,i){return v.function("generatePackageJson",(async()=>{await async function(e,n,i){const s=t.resolve(e.dirPath,"package.json"),a=await o.promises.readFile(s,"utf8"),c=JSON.parse(a);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.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.tslib,delete e.devDependencies["@willbooster/eslint-config"],delete e.devDependencies["@willbooster/eslint-config-react"],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(_e))for(const n of t)delete e.devDependencies[n];await j.run((()=>o.promises.rm("lerna.json",{force:!0})))}(c),"@willbooster/prettier-config"!==c.name&&(c.prettier="@willbooster/prettier-config");for(const e of Object.keys(c.scripts))c.scripts[e].includes("git clone")||(c.scripts[e]=c.scripts[e].replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=p(c.scripts,xe(e)),c.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),i=await o.promises.readFile(n,"utf8"),s=i.indexOf(U.separatorPrefix);if(s<0)return"";const r=i.slice(0,s);return r.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);let l=[],d=["lint-staged","prettier","sort-package-json","@willbooster/prettier-config"];const u=[];e.root&&(d.push("husky","@willbooster/renovate-config"),(e.publicRepo||e.referredByOtherRepo)&&(d.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable"),e.depending.semanticRelease&&(d.push("conventional-changelog-conventionalcommits"),c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),c.version="0.0.0-semantically-released"),e.depending.playwrightTest&&(c.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright),e.containingSubPackageJsons?c.workspaces=["packages/*"]:delete c.workspaces);if(e.depending.wb){c.dependencies["@willbooster/shared-scripts"]||c.dependencies["@willbooster/wb"]?l.push("@willbooster/wb"):d.push("@willbooster/wb"),delete c.dependencies["@willbooster/shared-scripts"],delete c.devDependencies["@willbooster/shared-scripts"];for(const e of Object.keys(c.scripts))c.scripts[e]=c.scripts[e].replace(/wb\s+db/,"wb prisma")}(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(d.push("eslint","micromatch"),e.containingTypeScriptInPackages&&d.push("@typescript-eslint/parser"));(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push("typescript");e.eslintBase&&d.push(..._e[e.eslintBase]);e.willBoosterConfigs&&(l=l.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));c.name||(c.name=t.basename(e.dirPath));e.containingSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&n.publicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[m]=ye.getOrgAndName(e.repository??"");"WillBooster"!==m&&"WillBoosterLab"!==m||(c.author="WillBooster Inc.");e.root||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!e.containingSubPackageJsons){if(e.containingJavaScript||e.containingTypeScript?c.scripts["lint-fix"]+=me.getLintFixSuffix(e):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup.replace(" && yarn lint-fix","")),e.containingPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>o.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(c.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format+=" && yarn format-code")}if(e.containingPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const t=await r("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,i]=e.split(/[/\\]/);i&&n.add(t)}if(n.size>0){const e=[...n].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",u.push("black","isort","flake8")}}e.repository&&(c.repository=e.repository)}e.depending.blitz?("0"===e.depending.blitz?(d=d.filter((e=>!e.includes("@typescript-eslint/"))),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-import-resolver-typescript"!==e&&"eslint-plugin-import"!==e&&"eslint-plugin-react-hooks"!==e))):l.push(`@blitzjs/auth@${B}`,`@blitzjs/next@${B}`,`@blitzjs/rpc@${B}`,`next@${A}`),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");e.depending.next&&delete c.devDependencies["@types/react"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await o.promises.writeFile(s,JSON.stringify(c)),i||(l=l.filter((e=>!c.devDependencies?.[e])),l.length>0&&S("yarn",["add",...new Set(l)],e.dirPath),d=d.filter((e=>!c.dependencies?.[e])),d.length>0&&S("yarn",["add","-D",...new Set(d)],e.dirPath),u.length>0&&S("poetry",["add","--group","dev",...new Set(u)],e.dirPath))}(e,n,i)}))}function xe(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${be(e)}}/**/*.{${K.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${K.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};return e.containingSubPackageJsons?(t=p({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --parallel --verbose run format",lint:"yarn workspaces foreach --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${K.prettier.join(",")}}" "!**/packages/**" "!**/test-fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --verbose run test",typecheck:"yarn workspaces foreach --parallel --verbose run typecheck"}),e.containingTypeScript||e.containingTypeScriptInPackages||delete t.typecheck):(e.depending.wb&&(t.typecheck="wb typecheck"),e.containingTypeScript||e.containingTypeScriptInPackages||delete t.typecheck,e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright")),t}const Fe="npm test",$e={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 Se(e){return v.function("generateHuskyrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),i=await o.promises.readFile(n,"utf8"),s=JSON.parse(i);s.scripts||={},delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepare,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack;const r=t.resolve(e.dirPath,".husky");await Promise.all([o.promises.writeFile(n,JSON.stringify(s,void 0,2)),o.promises.rm(r,{force:!0,recursive:!0})]),S("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(r,"pre-commit"),c=await o.promises.readFile(a,"utf8");await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await j.run((()=>o.promises.writeFile(a,c.replace(Fe,$e.preCommit))));const{typecheck:l}=xe(e);if(l){let n=e.repository?.startsWith("github:WillBoosterLab/")?$e.prePushForLab:$e.prePush;n=n.replace("yarn typecheck",l.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await j.run((()=>o.promises.writeFile(t.resolve(r,"pre-push"),c.replace(Fe,n),{mode:493})))}const p=[];e.versionsText&&p.push('run_if_changed "\\..+-version" "asdf plugin update --all"');e.versionsText?.includes("python ")&&p.push('run_if_changed "\\..+-version" "asdf install python"');e.versionsText&&p.push('run_if_changed "\\..+-version" "asdf install"');const d=e.depending.blitz?" && rm -Rf .next":"";p.push(`run_if_changed "package\\.json" "yarn${d}"`),e.containingPoetryLock&&p.push('run_if_changed "poetry\\.lock" "poetry install"');e.depending.blitz?p.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&&p.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 u=c.replace(Fe,`${$e.postMerge}\n\n${p.join("\n")}`);await j.run((()=>o.promises.writeFile(t.resolve(r,"post-merge"),u,{mode:493})))}(e)}))}const Oe='<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="ts" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.ts)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="tsx" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.tsx)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="js" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.js)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="json" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.json)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="md" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.md)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n <TaskOptions isEnabled="true">\n <option name="arguments" value="node node_modules/.bin/prettier --cache --write $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="html" />\n <option name="immediateSync" value="false" />\n <option name="name" value="Prettier (.html)" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="yarn" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n </component>\n</project>\n';async function Re(e){return v.function("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(o.existsSync(n)){const i=t.resolve(n,"watcherTasks.xml");await(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages||e.containingPackageJson&&!e.containingPubspecYaml&&!e.containingGemfile&&!e.containingGoMod&&!e.containingPomXml?j.run((()=>k.generateFile(i,Oe))):j.run((()=>o.promises.rm(i,{force:!0}))))}}))}async function Ee(e){return v.function("generateLintstagedrc",(async()=>{await async function(e){const n=e.root?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.containingJavaScript||e.containingTypeScript){const t=`\n '${Te(e)}': [${JSON.stringify(`${n}eslint --fix${me.getLintFixSuffix(e)}`)}, '${n}prettier --cache --write'],`;i.push(t)}const s=e.root?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${K.prettier.join(",")}}': files => {\n ${e.containingJavaScript||e.containingTypeScript?function(e){return`files = micromatch.not(files, '${Te(e)}');`}(e):""}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${s});\n if (filteredFiles.length === 0) return [];\n const commands = [\`${n}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${n}sort-package-json');\n }\n return commands;\n },`),e.containingPubspecYaml&&i.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.containingPoetryLock&&i.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const r=`${e.containingJavaScript||e.containingTypeScript?"const micromatch = require('micromatch');":""}\n\nmodule.exports = {${i.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await j.run((()=>k.generateFile(a,r)))}(e)}))}function Te(e){return`./{${be(e).join(",")}}/**/*.{${K.eslint.join(",")}}`}const De="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function Be(e){return v.function("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),i=await k.readFileIgnoringError(n)??"",s=U.getHeadUserContent(i),o=U.getTailUserContent(i),r=t.resolve(e.dirPath,".gitignore"),a=await U.readGitignoreWithoutSeparators(r)||"";let c="";e.containingPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=s+De+c+a+o;await j.run((()=>k.generateFile(n,l)))}))}const Ae={venvPath:".",venv:".venv"};async function We(e){return v.function("generatePyrightConfigJson",(async()=>{let n=m(Ae);const i=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await o.promises.readFile(i,"utf8"),t=JSON.parse(e);n=p.all([n,t,n],{arrayMerge:te})}catch{}const s=JSON.stringify(n);await j.run((()=>k.generateFile(i,s)))}))}async function Ne(e){return v.function("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let i=await o.promises.readFile(n,"utf8");i=Ie(e,i,Ce,".releaserc.json");const s=e.repository?.slice(e.repository?.indexOf(":")+1),r=o.readdirSync(`${e.dirPath}/.github/workflows`);for(const t of r){if(!t.startsWith("test")&&!t.startsWith("deploy"))continue;let n=t;n=n.charAt(0).toUpperCase()+n.slice(1,n.indexOf(".")),n=n.replace("-"," ");i=Ie(e,i,`[![${n}](https://github.com/${s}/actions/workflows/${t}/badge.svg)](https://github.com/${s}/actions/workflows/${t})`,`.github/workflows/${t}`)}await j.run((()=>k.generateFile(n,i)))}))}const Ce="[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)";function Ie(e,n,i,s){if(!o.existsSync(t.resolve(e.dirPath,s)))return n;const r=n.indexOf(i);r>=0&&(n=n.slice(0,r)+n.slice(r+i.length));let a=!1;for(let e=0;e<n.length;e++)if("\n"===n[e]){a=!0,n=`${n.slice(0,e+1)}${i}\n${n.slice(e+1)}`;break}return a||(n=`${n}\n${i}\n`),n}async function Je(e){return v.function("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json");try{const e=JSON.parse(await o.promises.readFile(n,"utf8")),t=e?.plugins||[];for(let e=0;e<t.length;e++){const n=Array.isArray(t[e])?t[e][0]:t[e],i=Array.isArray(t[e])&&t[e][1]||{};"@semantic-release/commit-analyzer"===n?t[e]=["@semantic-release/commit-analyzer",p.all([i,{preset:"conventionalcommits"}],{arrayMerge:te})]:"@semantic-release/github"===n&&(t[e]=["@semantic-release/github",p.all([i,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:te})])}const i=JSON.stringify(e);await j.run((()=>k.generateFile(n,i)))}catch{}}))}const ze={extends:["@willbooster"]};async function Le(e){return v.function("generateRenovateJson",(async()=>{let n=m(ze);const i=t.resolve(e.dirPath,".renovaterc.json");try{const e=await o.promises.readFile(i,"utf8"),t=JSON.parse(e);n=p.all([n,t,n],{arrayMerge:te})}catch{}e.depending.blitz&&"0"!==e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await j.run((()=>o.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await j.run((()=>o.promises.rm(t.resolve(e.dirPath,"renovate.json"),{force:!0})));const s=JSON.stringify(n);await j.run((()=>k.generateFile(i,s)))}))}function Ge(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,i]of t)delete e[n],e[n]=i;return e}const Me={compilerOptions:{target:"ESNext",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/**/*"]},Ue={compilerOptions:{target:"ESNext",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 He(e,n){return v.function("generateTsconfig",(async()=>{if(n.depending.blitz)return;let i=m(e.root?Me:Ue);e.containingJsxOrTsx||e.containingJsxOrTsxInPackages||delete i.compilerOptions?.jsx,e.root&&!e.containingSubPackageJsons&&(i.include=i.include?.filter((e=>!e.startsWith("packages/*/")))),e.esmPackage&&(i.compilerOptions={...i.compilerOptions,moduleResolution:"NodeNext"});const s=t.resolve(e.dirPath,"tsconfig.json");try{const e=await o.promises.readFile(s,"utf8"),t=JSON.parse(e);"./node_modules/@willbooster/tsconfig/tsconfig.json"===t.extends&&delete t.extends,delete i.compilerOptions?.target,delete i.compilerOptions?.module,delete i.compilerOptions?.moduleResolution,t.compilerOptions?.jsx&&delete i.compilerOptions?.jsx,i=p.all([i,t,i],{arrayMerge:ne}),i.include=i.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ge(i.compilerOptions??{}),i.include?.sort();const r=JSON.stringify(i);await j.run((()=>k.generateFile(s,r)))}))}const qe={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy","renovate/**"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.head_ref || github.run_id }}","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"}}},"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 }}"}}}}};async function Ye(e){return v.function("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await o.promises.mkdir(n,{recursive:!0});const i=t.resolve(e.dirPath,".github","semantic.yml");await j.run((()=>o.promises.rm(i,{force:!0,recursive:!0})));const s=await o.promises.readdir(n,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...s.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&r.add("release.yml"),(e.publicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&r.add("notify-ready.yml");for(const i of r){const s=t.basename(i,".yml");await j.run((()=>Ke(e,n,s)))}}))}async function Ke(e,n,i){let s=m(qe[i]||{});const r=t.join(n,`${i}.yml`);try{const e=await o.promises.readFile(r,"utf8"),t=f.load(e);s=p.all([s,t,s],{arrayMerge:ne})}catch{}if(i.startsWith("deploy")){if(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},s.jobs){const e=s.jobs;delete s.jobs,s.jobs=e}s.on?.push&&(s.on.push["paths-ignore"]=[...new Set([...s.on.push["paths-ignore"]??[],"**.md","**/docs/**"])])}for(const t of Object.values(s.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;Ve(e,t,i)}switch(i){case"release":if(s.on.schedule)delete s.on.push;else{if(!(e.release.branches.length>0))return void await o.promises.rm(t.join(n,"release.yml"),{force:!0});s.on.push.branches=e.release.branches}break;case"wbfy":Xe(s,20,24);break;case"wbfy-merge":Xe(s,1,4)}if(function(e){delete e.jobs["add-to-project"]}(s),await Ze(s,r),"release"===i)await o.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await o.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!s.jobs.sync)return;s.jobs["sync-force"]=s.jobs.sync;const e=s.jobs.sync.with.sync_params_without_dest;if(!e)return;s.jobs.sync.with.sync_params_without_dest=`--force ${e}`,s.name="Force to Sync",s.on={workflow_dispatch:null},delete s.jobs.sync,await Ze(s,t.join(n,"sync-force.yml"))}}function Ve(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.publicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.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){delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,".env"===e.with.dot_env_path&&delete e.with.dot_env_path;delete e.with.cpu_arch}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.containingDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.publicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ge(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ge(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function Xe(e,t,n){const[i,s]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==i&&Number.isInteger(s)){const e=(s+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function Ze(e,t){const n=f.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await o.promises.writeFile(t,n)}async function Qe(e){return v.function("generateYarnrcYml",(async()=>{const n=O("yarn",["--version"],e.dirPath),i=function(e,t){const n=O("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);et(n)<=et(i)&&n!==i&&S("yarn",["set","version",i],e.dirPath,1),S("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath);const s=t.join(e.dirPath,".yarn","releases");await o.promises.mkdir(s,{recursive:!0});for(const e of await o.promises.readdir(s))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&(await j.run((()=>o.promises.rm(t.join(s,e)))),console.log("Removed",t.join(s,e)));const r=t.resolve(e.dirPath,".yarnrc");await j.run((()=>o.promises.rm(r,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=f.load(await o.promises.readFile(a,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.injectEnvironmentFiles=[],c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter((e=>".yarn/plugins/undefined.cjs"!==e.path))??[],c.plugins.length!==l){const n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await j.run((()=>o.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await o.promises.writeFile(a,f.dump(c,{lineWidth:-1}))}))}function et(e){const[t]=e.split(".");return Number(t)}async function tt(e){return v.function("setupLabels",(async()=>{if(!ge)return;const[t,n]=ye.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await nt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await nt(t,n,"d2: easy :rabbit2:","DDD6FE"),await nt(t,n,"d3: medium :ox:","C4B5FD"),await nt(t,n,"d4: hard :squid:","A78BFA"),await nt(t,n,"d5: x-hard :whale2:","8B5CF6"),await nt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await nt(t,n,"p2: urgent :fire::fire:","F87171"),await nt(t,n,"p3: important :fire:","FCA5A5"),await nt(t,n,"p4: nice to have :droplet:","FECACA"),await nt(t,n,"r: blitz","5300bc"),await nt(t,n,"r: firebase","ffca28"),await nt(t,n,"r: prisma","0c344b"),await nt(t,n,"r: react","61dafb"),await nt(t,n,"r: svelte","ff3e00"),await nt(t,n,"r: semantic-release","494949"),await nt(t,n,"ready :rocket:","22C55E"),await nt(t,n,"review requested :mag:","FBCA04"),await nt(t,n,"released :bookmark:","6366F1"),await nt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await nt(t,n,"s: 1h :clock1:","E5E7EB"),await nt(t,n,"s: 2h :clock2:","D1D5DB"),await nt(t,n,"s: 3h :clock3:","9CA3AF"),await nt(t,n,"s: 5h :clock5:","6B7280"),await nt(t,n,"s: 8h :clock8:","4B5563"),await nt(t,n,"s: 13h :clock1:","374151"),await nt(t,n,"t: build :hammer:","BFDBFE"),await nt(t,n,"t: chore :broom:","BFDBFE"),await nt(t,n,"t: ci :construction_worker:","BFDBFE"),await nt(t,n,"t: docs :memo:","BFDBFE"),await nt(t,n,"t: feat :sparkles:","BFDBFE"),await nt(t,n,"t: fix :bug:","BFDBFE"),await nt(t,n,"t: perf :zap:","BFDBFE"),await nt(t,n,"t: refactor :recycle:","BFDBFE"),await nt(t,n,"t: style :lipstick:","BFDBFE"),await nt(t,n,"t: test :test_tube:","BFDBFE"),await nt(t,n,"project","24292F"),await it(t,n,"bug"),await it(t,n,"documentation"),await it(t,n,"duplicate"),await it(t,n,"enhancement"),await it(t,n,"good first issue"),await it(t,n,"help wanted"),await it(t,n,"invalid"),await it(t,n,"question"),await it(t,n,"wontfix"),await it(t,n,"ready"),await it(t,n,"review requested"),await it(t,n,"released"),await it(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function nt(e,t,n,i){try{await he.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:i})}catch{await he.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:i})}}async function it(e,t,n){try{await he.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const st=["READY_DISCORD_WEBHOOK_URL"];async function ot(e){return v.function("setupSecrets",(async()=>{if(!ge)return;const[t,n]=ye.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const i=g.config().parsed||{};if(0!==Object.keys(i).length)try{for(const e of st)try{await he.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const s=await he.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=s.data;await h.ready;for(const[s,a]of Object.entries(i)){if(e.publicRepo&&"GH_BOT_PAT"===s)continue;if(!e.publicRepo&&"PUBLIC_GH_BOT_PAT"===s)continue;const i=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,i),p=h.to_base64(l,h.base64_variants.ORIGINAL);await he.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:s,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function rt(e){}async function at(n){const i=t.resolve(n,"package.json");try{const s=o.existsSync(i);let r={},a={},c={},l=!1;if(s){const e=o.readFileSync(i,"utf8");c=JSON.parse(e),r=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const i=t.resolve(n,".releaserc.json"),s=JSON.parse(await e.readFile(i,"utf8"));p=s?.branches||[],d=s?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(n,".."))||!o.existsSync(t.resolve(n,"..","..","package.json"));let m;u&&(m=await async function(e,t){const n=y(e),i=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),s=i?.refs?.fetch??i?.refs?.push;if("string"==typeof s){const e=await lt(s);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await lt(o);if(e&&"Not Found"!==e.message)return e}}(n,c));let f="";try{f+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[i,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${i}-version`),"utf8");f&&(f+="\n"),f+=s+" "+o.trim()}catch{}const g={dirPath:n,root:u,publicRepo:!1===m?.private,referredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,esmPackage:l,willBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),containingSubPackageJsons:ct("packages/**/package.json",n),containingDockerfile:o.existsSync(t.resolve(n,"Dockerfile"))||o.existsSync(t.resolve(n,"docker-compose.yml")),containingGemfile:o.existsSync(t.resolve(n,"Gemfile")),containingGoMod:o.existsSync(t.resolve(n,"go.mod")),containingPackageJson:o.existsSync(t.resolve(n,"package.json")),containingPoetryLock:o.existsSync(t.resolve(n,"poetry.lock")),containingPomXml:o.existsSync(t.resolve(n,"pom.xml")),containingPubspecYaml:o.existsSync(t.resolve(n,"pubspec.yaml")),containingTemplateYaml:o.existsSync(t.resolve(n,"template.yaml")),containingJavaScript:ct("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScript:ct("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsx:ct("{app,src,tests}/**/*.{t,j}sx",n),containingJavaScriptInPackages:ct("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),containingTypeScriptInPackages:ct("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),containingJsxOrTsxInPackages:ct("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:(r.blitz||"").replace("^","")[0],firebase:!!a["firebase-tools"],next:!!r.next,playwrightTest:!!r["@playwright/test"]||!!a["@playwright/test"]||!!a.playwright,prisma:!!r.prisma,pyright:!!a.pyright,reactNative:!!r["react-native"],semanticRelease:!!(a["semantic-release"]||p.length>0||d.length>0),storybook:!!a["@storybook/react"],wb:!!(r["@willbooster/wb"]||a["@willbooster/wb"]||r["@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};if(g.eslintBase=function(e){if("2"===e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.containingTypeScript)return e.containingJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.containingJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.containingJavaScript)return"@willbooster/eslint-config-js"}(g),g.containingGemfile||g.containingGoMod||g.containingPackageJson||g.containingPoetryLock||g.containingPomXml||g.containingPubspecYaml||g.containingTemplateYaml)return g}catch{}}function ct(e,t){return a(e,{dot:!0,cwd:t}).length>0}async function lt(e){const[t,n]=ye.getOrgAndName(e);if(!t||!n)return;const i={full_name:`${t}/${n}`};try{const e=await he.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(i,e.data)}catch{}return i}await async function(){const n=await s(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({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;b.isVerbose=n.verbose;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await F([s,...r]);const a=_(s),c=await at(s);if(!c){console.error(`there is no valid package.json in ${s}`);continue}const l=(await Promise.all(r.map((e=>at(e))))).filter((e=>!!e)),p=[c,...l];if(b.isVerbose)for(const e of p)console.info(e);await W(c),await Qe(c),await Promise.all([P(c),a.then((()=>Ne(c))),Y(c),X(c),re(c),Se(c),Re(c),Ee(c),Le(c),Je(c),Ye(c),tt(c),ot(c),rt()]),await j.promiseAll();const d=[];for(const e of p)(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push($(e,e.root?p:[e])),e.depending.playwrightTest&&d.push(x(c)),await le(e,c),await j.promiseAll(),(e.root||e.containingPackageJson)&&(await Be(e),await Pe(e,c,n.skipDeps),d.push(Ee(e)),(e.containingTypeScript||e.containingTypeScriptInPackages)&&d.push(He(e,c)),(e.containingJavaScript||e.containingJavaScriptInPackages||e.containingTypeScript||e.containingTypeScriptInPackages)&&(c.willBoosterConfigs||d.push(ie(e,c)),d.push(ee(e))),e.depending.pyright&&d.push(We(e)));await Promise.all(d),await j.promiseAll(),S("yarn",["cleanup"],s),S("yarn",["install"],s)}}();
2
2
  //# sourceMappingURL=index.js.map