wbfy 2.21.13 → 2.22.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/options.ts","../src/logger.ts","../src/fixers/dockerfile.ts","../src/fixers/playwrightConfig.ts","../src/fixers/prisma.ts","../src/fixers/testDirectory.ts","../src/utils/promisePool.ts","../src/fixers/typeDefinition.ts","../src/utils/fsUtil.ts","../src/fixers/typos.ts","../src/utils/spawnUtil.ts","../src/utils/version.ts","../src/utils/versionConstants.ts","../src/generators/asdf.ts","../src/utils/ignoreFileUtil.ts","../src/generators/dockerignore.ts","../src/utils/extensions.ts","../src/generators/editorconfig.ts","../src/generators/eslintignore.ts","../src/utils/mergeUtil.ts","../src/generators/eslintrc.ts","../src/generators/gitattributes.ts","../src/generators/gitignore.ts","../src/utils/eslintUtil.ts","../src/utils/githubUtil.ts","../src/utils/srcDirectories.ts","../src/generators/packageJson.ts","../src/generators/huskyrc.ts","../src/generators/idea.ts","../src/generators/lintstagedrc.ts","../src/generators/nextconfig.ts","../src/generators/prettierignore.ts","../src/generators/pyrightconfig.ts","../src/generators/readme.ts","../src/generators/releaserc.ts","../src/generators/renovaterc.ts","../src/utils/objectUtil.ts","../src/generators/tsconfig.ts","../src/generators/vscodeSettings.ts","../src/generators/workflow.ts","../src/generators/yarnrc.ts","../src/github/label.ts","../src/github/secret.ts","../src/github/settings.ts","../src/github/template.ts","../src/packageConfig.ts","../src/index.ts"],"sourcesContent":["class Options {\n isVerbose: boolean;\n doesUploadEnvVars: boolean;\n\n constructor() {\n this.isVerbose = false;\n this.doesUploadEnvVars = false;\n }\n}\n\nexport const options = new Options();\n","import { options } from './options.js';\n\nclass Logger {\n async functionIgnoringException(name: string, func: () => Promise<void>): Promise<void> {\n if (options.isVerbose) {\n console.info(`--------- ${name} start ---------`);\n }\n try {\n await func();\n } catch (error) {\n console.info(`Error occurred in ${name}: ${error instanceof Error ? error.stack : error}}`);\n }\n if (options.isVerbose) {\n console.info(`---------- ${name} end ----------`);\n }\n }\n}\n\nexport const logger = new Logger();\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\n\nexport async function fixDockerfile(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixDockerfile', async () => {\n if (!config.containingDockerfile) return;\n\n const oldContent = config.dockerfile;\n const newContent = oldContent;\n\n if (oldContent === newContent) return;\n await fs.writeFile(path.join(config.dirPath, 'Dockerfile'), newContent);\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\n\nexport async function fixPlaywrightConfig(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixPlaywrightConfig', async () => {\n const filePath = path.join(config.dirPath, 'playwright.config.ts');\n if (!fs.existsSync(filePath)) return;\n\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n\n const newContent = oldContent.replace(/retries:.+,/, 'retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,');\n if (oldContent === newContent) return;\n\n await fs.promises.writeFile(filePath, newContent);\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { globby } from 'globby';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\n\nexport async function fixPrismaEnvFiles(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixPrismaEnvFiles', async () => {\n const envFiles = await globby(['*.env', '*.env.*'], { dot: true, cwd: config.dirPath });\n for (const envFile of envFiles) {\n const envFilePath = path.resolve(config.dirPath, envFile);\n const content = await fs.readFile(envFilePath, 'utf8');\n const newContent = content.replace(\n /DATABASE_URL=\"?(.+\\.sqlite3)\"?[\\n$]/,\n 'DATABASE_URL=\"$1?connection_limit=1\"\\n'\n );\n await fs.writeFile(envFilePath, newContent);\n }\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\n\nexport async function fixTestDirectories(packageDirPaths: string[]): Promise<void> {\n return logger.functionIgnoringException('fixTestDirectories', async () => {\n await Promise.all(\n packageDirPaths.map(async (packageDirPath) => {\n const oldTestDirPath = path.join(packageDirPath, '__tests__');\n const newTestDirPath = path.join(packageDirPath, 'tests');\n try {\n await fs.promises.rename(oldTestDirPath, newTestDirPath);\n const oldContent = await fs.promises.readFile(path.join(packageDirPath, 'package.json'), 'utf8');\n const newContent = oldContent.replaceAll('__tests__', 'tests');\n if (oldContent === newContent) return;\n\n await fs.promises.writeFile(path.join(packageDirPath, 'package.json'), newContent);\n } catch {\n // do nothing\n }\n })\n );\n });\n}\n","import { PromisePool } from 'minimal-promise-pool';\n\nexport const promisePool = new PromisePool();\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { ignoreEnoentAsync } from '@willbooster/shared-lib';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function fixTypeDefinitions(\n config: PackageConfig,\n configsIncludingChildren: PackageConfig[]\n): Promise<void> {\n return logger.functionIgnoringException('fixTypeDefinitions', async () => {\n const libTypeDirPath = path.resolve(config.dirPath, '@types');\n const srcTypeDirPath =\n config.root && config.containingSubPackageJsons ? undefined : path.resolve(config.dirPath, 'src', 'types');\n\n const dirents = await ignoreEnoentAsync(() => fs.readdir(libTypeDirPath, { withFileTypes: true }));\n if (!dirents) return;\n\n for (const dirent of dirents) {\n const dirName = dirent.name.slice(0, -5);\n const hasTypeDeclarationExtension = dirent.name.endsWith('.d.ts');\n let packageName = hasTypeDeclarationExtension ? dirName : dirent.name;\n if (packageName.includes('__')) {\n packageName = `@${packageName.replace('__', '/')}`;\n }\n const hasLibrary = configsIncludingChildren.some(\n (config) =>\n config.packageJson?.dependencies?.[packageName] || config.packageJson?.devDependencies?.[packageName]\n );\n\n if (dirent.isFile() && hasTypeDeclarationExtension) {\n if (hasLibrary) {\n // Move @types/<name>/index.d.ts if installed\n await fs.mkdir(path.join(libTypeDirPath, dirName));\n await promisePool.run(() =>\n fs.rename(path.join(libTypeDirPath, dirent.name), path.join(libTypeDirPath, dirName, 'index.d.ts'))\n );\n } else if (srcTypeDirPath) {\n // Move src/types/<name> if not installed\n await fs.mkdir(srcTypeDirPath, { recursive: true });\n await promisePool.run(() =>\n fs.rename(path.join(libTypeDirPath, dirent.name), path.join(srcTypeDirPath, dirent.name))\n );\n }\n } else if (dirent.isDirectory() && srcTypeDirPath && !hasLibrary) {\n // Move src/types/<name>.d.ts if not installed\n await fs.mkdir(srcTypeDirPath, { recursive: true });\n await promisePool.run(() =>\n ignoreEnoentAsync(() =>\n fs.rename(\n path.join(libTypeDirPath, dirent.name, 'index.d.ts'),\n path.join(srcTypeDirPath, `${dirent.name}.d.ts`)\n )\n )\n );\n }\n }\n });\n}\n","import fsp from 'node:fs/promises';\n\nexport const fsUtil = {\n async readFileIgnoringError(filePath: string): Promise<string | undefined> {\n try {\n return await fsp.readFile(filePath, 'utf8');\n } catch {\n // do nothing\n }\n },\n async generateFile(filePath: string, content: string): Promise<void> {\n await fsp.writeFile(filePath, content);\n console.log(`Generated/Updated ${filePath}`);\n },\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { globby } from 'globby';\n\nimport { logger } from '../logger.js';\nimport { options } from '../options.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function fixTypos(packageConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixAbbreviations', async () => {\n const dirPath = packageConfig.dirPath;\n const docFiles = await globby('**/*.md', { dot: true, cwd: dirPath, gitignore: true });\n if (options.isVerbose) {\n console.info(`Found ${docFiles.length} markdown files in ${dirPath}`);\n }\n for (const mdFile of docFiles) {\n const filePath = path.join(dirPath, mdFile);\n await promisePool.run(async () => {\n const content = await fs.promises.readFile(filePath, 'utf8');\n let newContent = fixAbbreviationsInText(content);\n newContent = replaceWithConfig(newContent, packageConfig, 'doc');\n if (content !== newContent) {\n await fsUtil.generateFile(filePath, newContent);\n }\n });\n }\n\n const tsFiles = await globby(\n [\n '{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}',\n 'packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}',\n ],\n { dot: true, cwd: dirPath, gitignore: true }\n );\n if (options.isVerbose) {\n console.info(`Found ${tsFiles.length} TypeScript files in ${dirPath}`);\n }\n for (const tsFile of tsFiles) {\n const filePath = path.join(dirPath, tsFile);\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n let newContent = oldContent\n .replaceAll(/\\/\\/(.*)c\\.f\\./g, '//$1cf.')\n .replaceAll(/\\/\\/(.*)eg\\./g, '//$1e.g.')\n .replaceAll(/\\/\\/(.*)ie\\./g, '//$1i.e.');\n newContent = replaceWithConfig(newContent, packageConfig, 'ts');\n\n if (oldContent === newContent) continue;\n await fsUtil.generateFile(filePath, newContent);\n }\n\n const textBasedFiles = await globby('**/*.{csv,htm,html,tsv,xml,yaml,yml}', {\n dot: true,\n cwd: dirPath,\n gitignore: true,\n });\n if (options.isVerbose) {\n console.info(`Found ${textBasedFiles.length} text-based files in ${dirPath}`);\n }\n for (const file of textBasedFiles) {\n const filePath = path.join(dirPath, file);\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n let newContent = oldContent\n .replaceAll(/\\/\\/(.*)c\\.f\\./g, '//$1cf.')\n .replaceAll(/\\/\\/(.*)eg\\./g, '//$1e.g.')\n .replaceAll(/\\/\\/(.*)ie\\./g, '//$1i.e.');\n newContent = replaceWithConfig(newContent, packageConfig, 'text');\n\n if (oldContent === newContent) continue;\n await fsUtil.generateFile(filePath, newContent);\n }\n\n await promisePool.promiseAll();\n });\n}\n\nexport function fixAbbreviationsInText(content: string): string {\n return content\n .replaceAll(/\\bc\\.f\\.([^$])/g, 'cf.$1')\n .replaceAll(/\\beg\\.([^$])/g, 'e.g.$1')\n .replaceAll(/\\bie\\.([^$])/g, 'i.e.$1');\n}\n\nfunction replaceWithConfig(newContent: string, packageConfig: PackageConfig, propName: 'doc' | 'ts' | 'text'): string {\n for (const [before, after] of Object.entries(packageConfig.wbfyJson?.typos?.all ?? {})) {\n newContent = newContent.replaceAll(before, after);\n }\n for (const [before, after] of Object.entries(packageConfig.wbfyJson?.typos?.[propName] ?? {})) {\n newContent = newContent.replaceAll(before, after);\n }\n return newContent;\n}\n","import type { SpawnSyncOptions } from 'node:child_process';\nimport child_process from 'node:child_process';\n\nexport function spawnSync(command: string, args: string[], cwd: string, retry = 0): void {\n do {\n const [newCmd, newArgs, options] = getSpawnSyncArgs(command, args, cwd);\n console.log(`$ ${newCmd} ${newArgs.join(' ')} at ${options.cwd}`);\n const ret = child_process.spawnSync(newCmd, newArgs, options);\n if (ret.status === 0) break;\n } while (--retry >= 0);\n}\n\nexport function spawnSyncWithStringResult(command: string, args: string[], cwd: string): string {\n const [newCmd, newArgs, options] = getSpawnSyncArgs(command, args, cwd);\n options.stdio = 'pipe';\n const proc = child_process.spawnSync(newCmd, newArgs, options);\n const error = proc.stderr.toString().trim();\n if (error) {\n console.error(`${newCmd} [${newArgs.map((s) => `\"${s}\"`)}] caused the following error:\\n ${error}`);\n }\n return proc.stdout.toString().trim();\n}\n\nexport function getSpawnSyncArgs(command: string, args: string[], cwd: string): [string, string[], SpawnSyncOptions] {\n const env = { ...process.env };\n // Remove berry from PATH\n if (env.PATH && env.BERRY_BIN_FOLDER) {\n env.PATH = env.PATH.replace(`${env.BERRY_BIN_FOLDER}:`, '');\n }\n\n if (env.ASDF_DIR) {\n args = ['-l', '-c', `. ${env.ASDF_DIR}/asdf.sh && ${command} ${args.join(' ')}`];\n command = 'bash';\n }\n return [\n command,\n args,\n {\n cwd,\n env,\n shell: false,\n stdio: 'inherit',\n },\n ];\n}\n","export function convertVersionIntoNumber(version: string): number {\n // e.g. java adoptopenjdk-11.0.17+8\n const numbers = version.split(/[+.-]/).map(Number).filter(Number.isNaN);\n let versionNumber = 0;\n let divisor = 1;\n for (const num of numbers) {\n versionNumber += num * divisor;\n divisor /= 1000;\n }\n return versionNumber;\n}\n","export const PYTHON_VERSION = '3.9.18';\nexport const JAVA_VERSION = 'zulu-11.68.17';\nexport const BLITZ_VERSION = '2.0.4';\nexport const NEXT_VERSION = '14.1.0';\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync, spawnSyncWithStringResult } from '../utils/spawnUtil.js';\nimport { convertVersionIntoNumber } from '../utils/version.js';\nimport { JAVA_VERSION, PYTHON_VERSION } from '../utils/versionConstants.js';\n\nexport async function generateVersionConfigs(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateVersionConfigs', async () => {\n await core(config);\n });\n}\n\nconst CORE_TOOLS = new Set(['java', 'nodejs', 'python']);\nconst DEPRECATED_VERSION_PREFIXES = ['java', 'node', 'python'];\n\nasync function core(config: PackageConfig): Promise<void> {\n if (!config.versionsText) return;\n\n const duplicatableLines = config.versionsText\n .trim()\n .split('\\n')\n .map((line) => {\n const [name, version] = line.trim().split(/\\s+/);\n return `${CORE_TOOLS.has(name) ? ' ' : ''}${name} ${version}`;\n })\n .sort()\n .map((line) => line.trim());\n const lines = [...new Set(duplicatableLines)];\n\n if (config.containingPoetryLock) {\n const response = await fetch('https://pypi.org/pypi/poetry/json');\n const json = await response.json();\n const poetryVersion = json?.info?.version;\n if (poetryVersion) {\n updateVersion(lines, 'poetry', json?.info?.version);\n }\n updateVersion(lines, 'python', PYTHON_VERSION, true);\n }\n if (config.depending.firebase) {\n updateVersion(lines, 'java', JAVA_VERSION, true);\n }\n if (config.containingPackageJson) {\n const version = spawnSyncWithStringResult('npm', ['show', 'yarn', 'version'], config.dirPath);\n updateVersion(lines, 'yarn', version);\n }\n\n for (const prefix of DEPRECATED_VERSION_PREFIXES) {\n const versionPath = path.resolve(config.dirPath, `.${prefix}-version`);\n void fs.promises.rm(versionPath, { force: true });\n }\n\n const toolVersionsPath = path.resolve(config.dirPath, '.tool-versions');\n await (lines.length > 0\n ? promisePool.run(() => fs.promises.writeFile(toolVersionsPath, lines.join('\\n') + '\\n'))\n : promisePool.run(() => fs.promises.rm(toolVersionsPath, { force: true })));\n await promisePool.promiseAll();\n spawnSync('asdf', ['plugin', 'update', '--all'], config.dirPath);\n spawnSync('asdf', ['install'], config.dirPath);\n}\n\nfunction updateVersion(lines: string[], toolName: string, newVersion: string, head = false): void {\n const index = lines.findIndex((l) => l.split(/\\s+/)[0] === toolName);\n const newLine = `${toolName} ${newVersion}`;\n if (index >= 0) {\n const [, version] = lines[index].split(/\\s+/);\n if (convertVersionIntoNumber(newVersion) > convertVersionIntoNumber(version)) {\n lines[index] = newLine;\n }\n } else {\n lines.splice(head ? 0 : lines.length, 0, newLine);\n }\n}\n","import fs from 'node:fs';\n\nconst userContentHeader = '# Project-specific settings';\nconst userContentHeaderRegex = /# Project-specific settings[^\\n]*\\n/gm;\nconst separator = '# Generated by wbfy';\nconst separatorPrefix = '# Generated by ';\nconst defaultHeadUserContent = `${userContentHeader} (head)\n\n\n${separator}\n`;\nconst defaultTailUserContent = `\n${userContentHeader} (tail)\n`;\n\nexport const ignoreFileUtil = {\n separator,\n separatorPrefix,\n defaultHeadUserContent,\n defaultTailUserContent,\n async readGitignoreWithoutSeparators(filePath: string): Promise<string | undefined> {\n try {\n let content = await fs.promises.readFile(filePath, 'utf8');\n const lastHeaderIndex = getIndexOfTailUserContentHeader(content);\n if (lastHeaderIndex > 0) {\n content = content.slice(0, lastHeaderIndex - 1);\n }\n return (\n content\n .replaceAll(userContentHeaderRegex, '')\n .replaceAll(/# Generated by [^\\n]*\\n/gm, '')\n .replaceAll(/\\r?\\n\\r?\\n(\\r?\\n)+/gm, '\\n\\n')\n .trim() + '\\n'\n );\n } catch {\n // do nothing\n }\n },\n getHeadUserContent(content: string): string {\n const index = content.indexOf(this.separatorPrefix);\n if (index >= 0) {\n return content\n .slice(0, content.indexOf('\\n', index) + 1)\n .replaceAll(userContentHeaderRegex, `${userContentHeader} (head)\\n`);\n }\n return defaultHeadUserContent;\n },\n getTailUserContent(content: string): string | undefined {\n const lastHeaderIndex = getIndexOfTailUserContentHeader(content);\n if (lastHeaderIndex > 0) {\n return content.slice(lastHeaderIndex - 1);\n }\n return defaultTailUserContent;\n },\n async isBerryZeroInstallEnabled(filePath: string): Promise<boolean> {\n try {\n const content = await fs.promises.readFile(filePath, 'utf8');\n return content.includes('\\n!.yarn/cache');\n } catch {\n return false;\n }\n },\n};\n\nfunction getIndexOfTailUserContentHeader(content: string): number {\n const index = content.indexOf(userContentHeader);\n const lastIndex = content.lastIndexOf(userContentHeader);\n return lastIndex > index ? lastIndex : -1;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\n// Exercodeではnode_modulesをCOPYする必要があるため、node_modulesを除外してはいけない。\nconst commonContent = `\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n`;\n\nexport async function generateDockerignore(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateDockerignore', async () => {\n const filePath = path.resolve(config.dirPath, '.dockerignore');\n if (config.containingDockerfile) {\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n const headUserContent = ignoreFileUtil.getHeadUserContent(content);\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const newContent = headUserContent + commonContent + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n } else {\n await fs.promises.rm(filePath, { force: true });\n }\n });\n}\n","export const extensions = {\n codeWith2IndentSize: [\n 'cjs',\n 'mjs',\n 'js',\n 'jsx',\n 'cts',\n 'mts',\n 'ts',\n 'tsx',\n 'json',\n 'json5',\n 'jsonc',\n 'cpp',\n 'dart',\n 'htm',\n 'html',\n 'pu',\n 'puml',\n 'rb',\n 'vue',\n 'xml',\n 'yaml',\n 'yml',\n ].sort(),\n codeWith4IndentSize: ['go', 'gradle', 'py'].sort(),\n codeWith8IndentSize: ['sh'].sort(),\n markdownLike: ['md'].sort(),\n eslint: ['cjs', 'mjs', 'js', 'cts', 'mts', 'ts', 'tsx', 'jsx'].sort(),\n prettier: [\n 'cjs',\n 'mjs',\n 'js',\n 'jsx',\n 'cts',\n 'mts',\n 'ts',\n 'tsx',\n 'json',\n 'json5',\n 'jsonc',\n 'css',\n 'htm',\n 'html',\n 'md',\n 'scss',\n 'vue',\n 'yaml',\n 'yml',\n ].sort(),\n};\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst newContent = `root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${generateExtensions(extensions.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${generateExtensions(extensions.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${generateExtensions(extensions.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${generateExtensions(extensions.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;\n\nexport async function generateEditorconfig(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateEditorconfig', async () => {\n const filePath = path.resolve(config.dirPath, '.editorconfig');\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n\nfunction generateExtensions(extensions: string[]): string {\n return extensions.length > 1 ? `[*.{${extensions.join(',')}}]` : `[*.${extensions[0]}]`;\n}\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst commonContent = `\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`;\n\nexport async function generateEslintignore(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateEslintignore', async () => {\n const filePath = path.resolve(config.dirPath, '.eslintignore');\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n const headUserContent = ignoreFileUtil.getHeadUserContent(content);\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const gitignoreFilePath = path.resolve(config.dirPath, '.gitignore');\n const gitignoreContent = (await ignoreFileUtil.readGitignoreWithoutSeparators(gitignoreFilePath)) || '';\n\n const newContent = headUserContent + commonContent + gitignoreContent + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import merge from 'deepmerge';\n\nexport function overwriteMerge<T>(destinationArray: T[], sourceArray: T[]): T[] {\n return sourceArray;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function combineMerge(target: any[], source: any[], options: any): any[] {\n const destination = [...target];\n\n for (const [index, item] of source.entries()) {\n if (destination[index] === undefined) {\n destination[index] = options.cloneUnlessOtherwiseSpecified(item, options);\n } else if (options.isMergeableObject(item)) {\n destination[index] = merge(target[index], item, options);\n } else if (!target.includes(item)) {\n destination.push(item);\n }\n }\n return destination;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function generateEslintrc(config: PackageConfig, rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateEslintrc', async () => {\n const bases = [];\n if (config.eslintBase) {\n bases.push(config.eslintBase);\n }\n if (config !== rootConfig) {\n bases.push('../../.eslintrc.json');\n }\n let newSettings = { root: true, extends: bases };\n\n const filePath = path.resolve(config.dirPath, '.eslintrc.json');\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(oldContent);\n if (oldSettings.extends) {\n oldSettings.extends = oldSettings.extends.filter(\n (ext: string) => !ext.startsWith('@willbooster/') && ext !== '../../.eslintrc.json'\n );\n }\n if (bases.length === 0) {\n oldSettings.extends = [];\n }\n const newExtends = newSettings.extends;\n newSettings.extends = oldSettings.extends;\n oldSettings.extends = newExtends;\n newSettings = merge.all([newSettings, oldSettings, newSettings], {\n arrayMerge: combineMerge,\n }) as typeof newSettings;\n // TODO: Remove the following code after all Blitz.js projects are updated.\n if (config.depending.blitz) {\n newSettings.extends = newSettings.extends.filter(\n (ext: string) => ext !== './node_modules/@blitzjs/next/eslint'\n );\n }\n } catch {\n // do nothing\n }\n const newContent = JSON.stringify(newSettings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst newContent = `* text=auto\n\n*.vcproj text eol=crlf\n\n${[...extensions.codeWith2IndentSize, ...extensions.codeWith4IndentSize, ...extensions.markdownLike]\n .map((ext) => `*.${ext} text eol=lf`)\n .join('\\n')}\n\ndist/** linguist-generated=true\n`;\n\nexport async function generateGitattributes(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateGitattributes', async () => {\n const filePath = path.resolve(config.dirPath, '.gitattributes');\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport { options } from '../options.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst defaultNames = ['windows', 'macos', 'linux', 'jetbrains', 'visualstudiocode', 'emacs', 'vim', 'yarn'];\n\nconst commonContent = `\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\nIcon[\\r]\n!.keep\n*/mount/*.hash\n\n`;\n\nexport async function generateGitignore(config: PackageConfig, rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateGitignore', async () => {\n const filePath = path.resolve(config.dirPath, '.gitignore');\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n let headUserContent = ignoreFileUtil.getHeadUserContent(content) + commonContent;\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const names = [...defaultNames];\n if (config.containingGemfile) {\n names.push('ruby');\n }\n if (config.containingGoMod) {\n names.push('go');\n headUserContent += `${path.basename(config.dirPath)}\n`;\n }\n if (config.containingPackageJson) {\n names.push('node');\n }\n if (config.containingPomXml) {\n names.push('maven');\n headUserContent += `.idea/google-java-format.xml\n`;\n }\n if (config.containingPubspecYaml) {\n names.push('flutter', 'AndroidStudio', 'ruby');\n headUserContent += `.flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n`;\n }\n if (config.containingTemplateYaml) {\n headUserContent += `.aws-sam/\npackaged.yaml\n`;\n }\n // Because .venv should be ignored on root directory\n if (config.containingPoetryLock) {\n names.push('python');\n headUserContent += `.venv/\n`;\n }\n\n if (config.depending.blitz) {\n headUserContent += `.blitz/\n.blitz**\n`;\n }\n if (config.depending.next) {\n names.push('nextjs');\n }\n if (rootConfig.depending.firebase || config.depending.firebase) {\n names.push('firebase');\n }\n if (rootConfig.depending.prisma) {\n headUserContent += `*.sqlite3*\n*.sqlite3-journal\n`;\n }\n if (config.depending.playwrightTest) {\n headUserContent += `test-results/\n`;\n }\n if (rootConfig.depending.reactNative || config.depending.reactNative) {\n names.push('reactnative');\n headUserContent += `google-services.json\nandroid/app/src/main/assets/\n`;\n }\n if (config.depending.storybook) {\n names.push('storybookjs');\n }\n if (config.depending.litestream) {\n headUserContent += `gcp-sa-key.json\n`;\n }\n\n let generated = '';\n for (const name of names) {\n let content = (await readCache(name)) ?? '';\n if (!content) {\n const url = `https://www.toptal.com/developers/gitignore/api/${name}`;\n const response = await fetch(url);\n const responseText = await response.text();\n if (!response.ok || responseText.includes('Attention Required!') || responseText.includes('<title>')) {\n console.error(`Failed to fetch ${url}`);\n return;\n }\n content = responseText.trim();\n await promisePool.run(() => writeCache(name, content));\n if (options.isVerbose) {\n console.info(`Fetched ${url}`);\n }\n }\n if (generated) generated += '\\n';\n generated += content + '\\n';\n }\n if (!(await ignoreFileUtil.isBerryZeroInstallEnabled(filePath))) {\n generated = generated.replace('!.yarn/cache', '# !.yarn/cache').replace('# .pnp.*', '.pnp.*');\n }\n if (config.containingPomXml || config.containingPubspecYaml) {\n generated = generated\n .replaceAll(/^# .idea\\/artifacts$/gm, '.idea/artifacts')\n .replaceAll(/^# .idea\\/compiler.xml$/gm, '.idea/compiler.xml')\n .replaceAll(/^# .idea\\/jarRepositories.xml$/gm, '.idea/jarRepositories.xml')\n .replaceAll(/^# .idea\\/modules.xml$/gm, '.idea/modules.xml')\n .replaceAll(/^# .idea\\/*.iml$/gm, '.idea/*.iml')\n .replaceAll(/^# .idea\\/modules$/gm, '.idea/modules')\n .replaceAll(/^# *.iml$/gm, '*.iml')\n .replaceAll(/^# *.ipr$/gm, '*.ipr');\n if (config.containingPubspecYaml) {\n generated = generated.replaceAll(/^.idea\\/modules.xml$/gm, '# .idea/modules.xml');\n }\n }\n generated = generated.replaceAll(/^.idea\\/?$/gm, '# .idea');\n if (rootConfig.depending.reactNative || config.depending.reactNative || config.containingPubspecYaml) {\n generated = generated.replaceAll(/^(.idea\\/.+)$/gm, '$1\\nandroid/$1');\n }\n const newContent = headUserContent + generated + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n\nconst dirPath = path.join(os.homedir(), '.cache', 'wbfy', 'gitignore');\n\nasync function writeCache(name: string, content: string): Promise<void> {\n await fs.promises.mkdir(dirPath, { recursive: true });\n await fs.promises.writeFile(path.join(dirPath, name), content);\n}\n\nasync function readCache(name: string): Promise<string | undefined> {\n try {\n const stat = await fs.promises.stat(path.join(dirPath, name));\n if (Date.now() - stat.mtimeMs > 6 * 60 * 60 * 1000) {\n return;\n }\n return await fs.promises.readFile(path.join(dirPath, name), 'utf8');\n } catch {\n // do nothing\n }\n}\n","import type { PackageConfig } from '../packageConfig.js';\n\nexport const EslintUtil = {\n getLintFixSuffix(config: PackageConfig): string {\n return config.containingJsxOrTsx ? ' --rule \"{ react-hooks/exhaustive-deps: 0 }\"' : '';\n },\n};\n","import { Octokit } from '@octokit/core';\n\nconst token =\n process.env.GH_BOT_PAT || process.env.PUBLIC_GH_BOT_PAT || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;\nexport const hasGitHubToken = !!token;\nexport const octokit = new Octokit({\n auth: token,\n});\n\nclass GitHubUtil {\n getOrgAndName(urlOrFullName: string): [string, string] {\n const urlWithoutProtocol = urlOrFullName.split(':').at(-1);\n const names = urlWithoutProtocol?.split('/');\n const org = names?.at(-2) ?? '';\n const name = names?.at(-1)?.replace(/.git$/, '') ?? '';\n return [org, name];\n }\n}\n\nexport const gitHubUtil = new GitHubUtil();\n","import type { PackageConfig } from '../packageConfig.js';\n\nconst srcDirectories = {\n node: ['src', 'tests', 'scripts'].sort(),\n blitz: ['src', 'tests', 'scripts', 'db', 'integrations', 'mailers'].sort(),\n};\n\nexport function getSrcDirs(config: PackageConfig): string[] {\n if (config.depending.blitz) {\n return srcDirectories.blitz;\n }\n return srcDirectories.node;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport { globby, globbySync } from 'globby';\nimport type { PackageJson, SetRequired } from 'type-fest';\n\nimport { logger } from '../logger.js';\nimport type { EslintExtensionBase, PackageConfig } from '../packageConfig.js';\nimport { EslintUtil } from '../utils/eslintUtil.js';\nimport { extensions } from '../utils/extensions.js';\nimport { gitHubUtil } from '../utils/githubUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync } from '../utils/spawnUtil.js';\nimport { getSrcDirs } from '../utils/srcDirectories.js';\nimport { BLITZ_VERSION, NEXT_VERSION } from '../utils/versionConstants.js';\n\nconst jsCommonDeps = [\n 'eslint@8.57.0',\n 'eslint-config-prettier',\n 'eslint-plugin-import',\n 'eslint-plugin-sort-class-members',\n 'eslint-plugin-sort-destructure-keys',\n 'eslint-plugin-unicorn',\n];\n\nconst tsCommonDeps = [\n ...jsCommonDeps,\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'eslint-import-resolver-typescript',\n];\n\nconst reactCommonDeps = ['eslint-plugin-react', 'eslint-plugin-react-hooks'];\n\nconst eslintDeps: Record<EslintExtensionBase, string[]> = {\n '@willbooster/eslint-config-js': ['@willbooster/eslint-config-js', ...jsCommonDeps],\n '@willbooster/eslint-config-js-react': ['@willbooster/eslint-config-js-react', ...jsCommonDeps, ...reactCommonDeps],\n '@willbooster/eslint-config-ts': ['@willbooster/eslint-config-ts', ...tsCommonDeps],\n '@willbooster/eslint-config-ts-react': ['@willbooster/eslint-config-ts-react', ...tsCommonDeps, ...reactCommonDeps],\n '@willbooster/eslint-config-blitz-next': [\n '@willbooster/eslint-config-blitz-next',\n 'eslint-config-next',\n ...tsCommonDeps,\n ...reactCommonDeps,\n ],\n '@willbooster/eslint-config-next': [\n '@willbooster/eslint-config-next',\n 'eslint-config-next',\n ...tsCommonDeps,\n ...reactCommonDeps,\n ],\n};\n\nexport async function generatePackageJson(\n config: PackageConfig,\n rootConfig: PackageConfig,\n skipAddingDeps: boolean\n): Promise<void> {\n return logger.functionIgnoringException('generatePackageJson', async () => {\n await core(config, rootConfig, skipAddingDeps);\n });\n}\n\nasync function core(config: PackageConfig, rootConfig: PackageConfig, skipAddingDeps: boolean): Promise<void> {\n const filePath = path.resolve(config.dirPath, 'package.json');\n const jsonText = await fs.promises.readFile(filePath, 'utf8');\n const jsonObj = JSON.parse(jsonText) as PackageJson;\n jsonObj.scripts = jsonObj.scripts || {};\n jsonObj.dependencies = jsonObj.dependencies || {};\n jsonObj.devDependencies = jsonObj.devDependencies || {};\n jsonObj.peerDependencies = jsonObj.peerDependencies || {};\n\n await removeDeprecatedStuff(jsonObj as SetRequired<PackageJson, 'scripts' | 'dependencies' | 'devDependencies'>);\n\n if (jsonObj.name !== '@willbooster/prettier-config') {\n jsonObj.prettier = '@willbooster/prettier-config';\n }\n\n for (const [key, value] of Object.entries(jsonObj.scripts as Record<string, string>)) {\n // Fresh repo still requires 'yarn install'\n if (!value.includes('git clone')) {\n jsonObj.scripts[key] = value.replace(/yarn\\s*&&\\s*/, '').replace(/yarn\\s*install\\s*&&\\s*/, '');\n }\n }\n\n jsonObj.scripts = merge(jsonObj.scripts, generateScripts(config));\n jsonObj.scripts.prettify += await generatePrettierSuffix(config.dirPath);\n // Deal with breaking changes in yarn berry 4.0.0-rc.49\n for (const [key, value] of Object.entries(jsonObj.scripts)) {\n if (!value?.includes('yarn workspaces foreach')) continue;\n if (\n value.includes('--all') ||\n value.includes('--recursive') ||\n value.includes('--since') ||\n value.includes('--worktree')\n )\n continue;\n jsonObj.scripts[key] = value.replace('yarn workspaces foreach', 'yarn workspaces foreach --all');\n }\n\n let dependencies: string[] = [];\n let devDependencies = ['lint-staged', 'prettier', 'sort-package-json', '@willbooster/prettier-config'];\n const poetryDevDependencies: string[] = [];\n\n if (config.root) {\n // To install the latest pinst\n devDependencies.push('husky');\n // '|| true' avoids errors when husky is not installed.\n jsonObj.scripts['prepare'] = 'husky || true'; // for non-yarn package managers.\n jsonObj.scripts['postinstall'] = 'husky || true'; // for yarn.\n if (config.publicRepo || config.referredByOtherRepo) {\n // https://typicode.github.io/husky/#/?id=install-1\n devDependencies.push('pinst');\n jsonObj.scripts['prepack'] = 'pinst --disable';\n jsonObj.scripts['postpack'] = 'pinst --enable';\n }\n if (config.depending.semanticRelease) {\n const version =\n jsonObj.devDependencies['multi-semantic-release'] || jsonObj.devDependencies['@qiwi/multi-semantic-release']\n ? // TODO: remove the version specification after multi-semantic-release supports version 7+\n '@6.1.0'\n : '';\n devDependencies.push(`conventional-changelog-conventionalcommits${version}`);\n if (\n !jsonObj.devDependencies['semantic-release'] &&\n !jsonObj.devDependencies['multi-semantic-release'] &&\n !jsonObj.devDependencies['@qiwi/multi-semantic-release']\n ) {\n devDependencies.push('semantic-release');\n }\n jsonObj.version = '0.0.0-semantically-released';\n }\n if (config.depending.playwrightTest) {\n // Since llm-toolbox requires @playwright/test in dependencies\n if (!jsonObj.dependencies['@playwright/test']) {\n devDependencies.push('@playwright/test');\n delete jsonObj.dependencies['@playwright/test'];\n }\n delete jsonObj.dependencies['playwright'];\n delete jsonObj.devDependencies['playwright'];\n }\n if (config.containingSubPackageJsons) {\n // We don't allow non-array workspaces in monorepo.\n jsonObj.workspaces = Array.isArray(jsonObj.workspaces)\n ? merge.all([jsonObj.workspaces, ['packages/*']], {\n arrayMerge: combineMerge,\n })\n : ['packages/*'];\n } else if (Array.isArray(jsonObj.workspaces)) {\n jsonObj.workspaces = jsonObj.workspaces.filter(\n (workspace) =>\n globbySync(workspace, {\n dot: true,\n cwd: config.dirPath,\n gitignore: true,\n }).length > 0\n );\n if (jsonObj.workspaces.length === 0) {\n delete jsonObj.workspaces;\n }\n }\n }\n if (config.depending.wb) {\n if (jsonObj.dependencies['@willbooster/shared-scripts'] || jsonObj.dependencies['@willbooster/wb']) {\n dependencies.push('@willbooster/wb');\n } else {\n devDependencies.push('@willbooster/wb');\n }\n for (const [key, value] of Object.entries(jsonObj.scripts as Record<string, string>)) {\n jsonObj.scripts[key] = value.replace(/wb\\s+db/, 'wb prisma');\n }\n }\n\n if (\n config.containingJavaScript ||\n config.containingJavaScriptInPackages ||\n config.containingTypeScript ||\n config.containingTypeScriptInPackages\n ) {\n devDependencies.push('eslint@8.57.0', 'micromatch');\n // TODO: not needed anymore?\n if (config.containingTypeScriptInPackages) {\n devDependencies.push('@typescript-eslint/parser');\n }\n }\n\n if (config.containingTypeScript || config.containingTypeScriptInPackages) {\n devDependencies.push('typescript');\n }\n\n if (config.eslintBase) {\n devDependencies.push(...eslintDeps[config.eslintBase]);\n }\n\n if (config.willBoosterConfigs) {\n dependencies = dependencies.filter((dep) => !dep.includes('@willbooster/'));\n devDependencies = devDependencies.filter((dep) => !dep.includes('@willbooster/'));\n }\n\n if (!jsonObj.name) {\n jsonObj.name = path.basename(config.dirPath);\n }\n\n if (config.containingSubPackageJsons) {\n jsonObj.private = true;\n }\n if (!jsonObj.license) {\n jsonObj.license = 'UNLICENSED';\n }\n if (!jsonObj.private && jsonObj.license !== 'UNLICENSED' && rootConfig.publicRepo) {\n jsonObj.publishConfig ??= {};\n jsonObj.publishConfig.access ??= 'public';\n }\n const [owner] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (owner === 'WillBooster' || owner === 'WillBoosterLab') {\n jsonObj.author = 'WillBooster Inc.';\n }\n if (!config.root && jsonObj.private && !jsonObj.main) {\n // Make VSCode possible to refactor code across subpackages.\n jsonObj.main = './src';\n }\n\n // Since `\"resolutions\": { \"npm/chalk\": \"^4.1.2\" },` causes \"Invalid npm token\"\n delete jsonObj.resolutions?.['npm/chalk'];\n\n if (!config.containingSubPackageJsons) {\n if (!config.containingJavaScript && !config.containingTypeScript) {\n delete jsonObj.scripts.lint;\n delete jsonObj.scripts['lint-fix'];\n jsonObj.scripts.cleanup = jsonObj.scripts.cleanup?.replace(' && yarn lint-fix', '');\n } else {\n jsonObj.scripts['lint-fix'] += EslintUtil.getLintFixSuffix(config);\n }\n\n if (config.containingPubspecYaml) {\n jsonObj.scripts.lint = 'flutter analyze';\n jsonObj.scripts['lint-fix'] = 'yarn lint';\n const dirs = ['lib', 'test', 'test_driver'].filter((dir) => fs.existsSync(path.resolve(config.dirPath, dir)));\n if (dirs.length > 0) {\n jsonObj.scripts['format-code'] = `flutter format $(find ${dirs.join(\n ' '\n )} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`;\n jsonObj.scripts.format += ` && yarn format-code`;\n }\n }\n\n if (config.containingPoetryLock) {\n if (jsonObj.scripts.postinstall === 'poetry install') {\n delete jsonObj.scripts.postinstall;\n }\n const pythonFiles = await globby('**/*.py', {\n cwd: config.dirPath,\n dot: true,\n gitignore: true,\n ignore: ['test-fixtures'],\n });\n const dirNameSet = new Set<string>();\n for (const pythonFile of pythonFiles) {\n const [first, second] = pythonFile.split(/[/\\\\]/);\n if (second) {\n dirNameSet.add(first);\n }\n }\n if (dirNameSet.size > 0) {\n const dirNamesStr = [...dirNameSet].join(' ');\n jsonObj.scripts['format-code'] =\n `poetry run isort --profile black ${dirNamesStr} && poetry run black ${dirNamesStr}`;\n if (jsonObj.scripts.lint) {\n jsonObj.scripts.lint = `poetry run flake8 ${dirNamesStr} && ${jsonObj.scripts.lint}`;\n } else {\n jsonObj.scripts.lint = `poetry run flake8 ${dirNamesStr}`;\n jsonObj.scripts['lint-fix'] = 'yarn lint';\n }\n jsonObj.scripts.format += ` && yarn format-code`;\n poetryDevDependencies.push('black', 'isort', 'flake8');\n }\n }\n\n if (config.repository) {\n jsonObj.repository = config.repository;\n }\n }\n\n if (config.depending.blitz) {\n dependencies.push(\n `blitz@${BLITZ_VERSION}`,\n `@blitzjs/auth@${BLITZ_VERSION}`,\n `@blitzjs/next@${BLITZ_VERSION}`,\n `@blitzjs/rpc@${BLITZ_VERSION}`,\n `next@${NEXT_VERSION}`\n );\n // Prefer eslint-config-next's dependencies\n devDependencies = devDependencies.filter((d) => d !== 'eslint-plugin-react' && d !== 'eslint-plugin-react-hooks');\n if (!jsonObj.scripts['gen-code']?.startsWith('blitz codegen')) {\n jsonObj.scripts['gen-code'] = 'blitz codegen';\n } else if (!jsonObj.scripts['gen-code'].includes('blitz prisma generate')) {\n jsonObj.scripts['gen-code'] = jsonObj.scripts['gen-code'].replace(\n 'blitz codegen',\n 'blitz codegen && blitz prisma generate'\n );\n }\n } else if (config.depending.prisma && !jsonObj.scripts['gen-code']?.startsWith('prisma generate')) {\n jsonObj.scripts['gen-code'] = 'prisma generate';\n }\n\n if (config.depending.next) {\n // To prevent multiple versions of @types/react from mixing.\n delete jsonObj.devDependencies['@types/react'];\n }\n\n if (!jsonObj.dependencies?.prettier) {\n // Because @types/prettier blocks prettier execution.\n delete jsonObj.devDependencies['@types/prettier'];\n }\n\n if (Object.keys(jsonObj.dependencies).length === 0) {\n delete jsonObj.dependencies;\n }\n if (Object.keys(jsonObj.devDependencies).length === 0) {\n delete jsonObj.devDependencies;\n }\n if (Object.keys(jsonObj.peerDependencies).length === 0) {\n delete jsonObj.peerDependencies;\n }\n\n let newJsonText = JSON.stringify(jsonObj);\n newJsonText = await fixScriptNames(jsonObj.scripts, newJsonText, config);\n await fs.promises.writeFile(filePath, newJsonText);\n\n if (!skipAddingDeps) {\n // We cannot add dependencies which are already included in devDependencies.\n dependencies = dependencies.filter((dep) => !jsonObj.devDependencies?.[dep]);\n if (dependencies.length > 0) {\n spawnSync('yarn', ['add', ...new Set(dependencies)], config.dirPath);\n }\n // We cannot add devDependencies which are already included in dependencies.\n devDependencies = devDependencies.filter((dep) => !jsonObj.dependencies?.[dep]);\n if (devDependencies.length > 0) {\n spawnSync('yarn', ['add', '-D', ...new Set(devDependencies)], config.dirPath);\n }\n if (poetryDevDependencies.length > 0) {\n spawnSync('poetry', ['add', '--group', 'dev', ...new Set(poetryDevDependencies)], config.dirPath);\n }\n }\n}\n\n// TODO: remove the following migration code in future\nasync function removeDeprecatedStuff(\n jsonObj: SetRequired<PackageJson, 'scripts' | 'dependencies' | 'devDependencies'>\n): Promise<void> {\n if (jsonObj.author === 'WillBooster LLC') {\n jsonObj.author = 'WillBooster Inc.';\n }\n delete jsonObj.scripts['sort-package-json'];\n delete jsonObj.scripts['sort-all-package-json'];\n delete jsonObj.scripts['typecheck/warn'];\n delete jsonObj.scripts['typecheck:gen-code'];\n delete jsonObj.scripts['typecheck:codegen'];\n delete jsonObj.dependencies['@willbooster/shared-scripts'];\n delete jsonObj.dependencies['tslib'];\n delete jsonObj.devDependencies['@willbooster/eslint-config'];\n delete jsonObj.devDependencies['@willbooster/eslint-config-react'];\n delete jsonObj.devDependencies['@willbooster/renovate-config'];\n delete jsonObj.devDependencies['@willbooster/shared-scripts'];\n delete jsonObj.devDependencies['@willbooster/tsconfig'];\n delete jsonObj.devDependencies['eslint-import-resolver-node'];\n delete jsonObj.devDependencies['eslint-plugin-prettier'];\n delete jsonObj.devDependencies['lerna'];\n // To install the latest pinst\n delete jsonObj.devDependencies['pinst'];\n delete jsonObj.scripts['flutter-format'];\n delete jsonObj.scripts['format-flutter'];\n delete jsonObj.scripts['python-format'];\n delete jsonObj.scripts['format-python'];\n delete jsonObj.scripts['prettier'];\n for (const deps of Object.values(eslintDeps)) {\n for (const dep of deps) {\n delete jsonObj.devDependencies[dep];\n }\n }\n await promisePool.run(() => fs.promises.rm('lerna.json', { force: true }));\n}\n\nexport function generateScripts(config: PackageConfig): Record<string, string> {\n let scripts: Record<string, string> = {\n cleanup: 'yarn format && yarn lint-fix',\n format: `sort-package-json && yarn prettify`,\n lint: `eslint --color \"./{${getSrcDirs(config)}}/**/*.{${extensions.eslint.join(',')}}\"`,\n 'lint-fix': 'yarn lint --fix',\n prettify: `prettier --cache --color --write \"**/{.*/,}*.{${extensions.prettier.join(',')}}\" \"!**/test-fixtures/**\"`,\n typecheck: 'tsc --noEmit --Pretty',\n };\n if (config.containingSubPackageJsons) {\n const oldTest = scripts.test;\n scripts = merge(\n { ...scripts },\n {\n format: `sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format`,\n lint: `yarn workspaces foreach --all --parallel --verbose run lint`,\n 'lint-fix': 'yarn workspaces foreach --all --parallel --verbose run lint-fix',\n prettify: `prettier --cache --color --write \"**/{.*/,}*.{${extensions.prettier.join(\n ','\n )}}\" \"!**/packages/**\" \"!**/test-fixtures/**\"`,\n // CI=1 prevents vitest from enabling watch.\n // FORCE_COLOR=3 make wb enable color output.\n test: 'CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test',\n typecheck: 'yarn workspaces foreach --all --parallel --verbose run typecheck',\n }\n );\n if (oldTest?.includes('wb test')) {\n scripts.test = oldTest;\n }\n } else if (config.depending.pyright) {\n scripts.typecheck = scripts.typecheck ? `${scripts.typecheck} && ` : '';\n scripts.typecheck += 'pyright';\n }\n\n if (!config.containingTypeScript && !config.containingTypeScriptInPackages) {\n delete scripts.typecheck;\n } else if (config.depending.wb) {\n scripts.typecheck = 'wb typecheck';\n }\n return scripts;\n}\n\nasync function generatePrettierSuffix(dirPath: string): Promise<string> {\n const filePath = path.resolve(dirPath, '.prettierignore');\n const existingContent = await fs.promises.readFile(filePath, 'utf8');\n const index = existingContent.indexOf(ignoreFileUtil.separatorPrefix);\n if (index < 0) return '';\n\n const originalContent = existingContent.slice(0, index);\n const lines = originalContent\n .split('\\n')\n .map((line) => {\n const newLine = line.trim();\n return newLine.endsWith('/') ? newLine.slice(0, -1) : newLine;\n })\n .filter((l) => l && !l.startsWith('#') && !l.includes('/'));\n\n return lines.map((line) => ` \"!**/${line}/**\"`).join('');\n}\n\nasync function fixScriptNames(\n scripts: PackageJson.Scripts,\n newJsonText: string,\n config: PackageConfig\n): Promise<string> {\n const oldAndNewScriptNames: [string, string][] = [];\n for (const [key] of Object.keys(scripts)) {\n if (key[0] !== ':' && key.includes(':')) {\n oldAndNewScriptNames.push([key, key.replaceAll(':', '-')]);\n }\n }\n if (oldAndNewScriptNames.length === 0) return newJsonText;\n\n for (const [oldName, newName] of oldAndNewScriptNames) {\n newJsonText = newJsonText.replaceAll(oldName, newName);\n }\n const files = await globby(['**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}', '**/Dockerfile'], {\n cwd: config.dirPath,\n dot: true,\n gitignore: true,\n });\n for (const file of files) {\n await promisePool.run(async () => {\n const filePath = path.join(config.dirPath, file);\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n let newContent = oldContent;\n for (const [oldName, newName] of oldAndNewScriptNames) {\n newContent = newContent.replaceAll(oldName, newName);\n }\n if (newContent !== oldContent) {\n await fs.promises.writeFile(filePath, newContent);\n }\n });\n }\n await promisePool.promiseAll();\n return newJsonText;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync } from '../utils/spawnUtil.js';\n\nimport { generateScripts } from './packageJson.js';\n\nconst settings = {\n preCommit: 'node node_modules/.bin/lint-staged',\n prePush: `yarn typecheck`,\n 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(),\n 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(),\n};\n\nexport async function generateHuskyrc(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateHuskyrc', async () => {\n await core(config);\n });\n}\n\nasync function core(config: PackageConfig): Promise<void> {\n const packageJsonPath = path.resolve(config.dirPath, 'package.json');\n const jsonText = await fs.promises.readFile(packageJsonPath, 'utf8');\n const packageJson = JSON.parse(jsonText);\n packageJson.scripts ||= {};\n delete packageJson.scripts['postinstall'];\n delete packageJson.scripts['postpublish'];\n delete packageJson.scripts['prepare'];\n delete packageJson.scripts['prepublishOnly'];\n delete packageJson.scripts['prepack'];\n delete packageJson.scripts['postpack'];\n\n const dirPath = path.resolve(config.dirPath, '.husky');\n await Promise.all([\n fs.promises.writeFile(packageJsonPath, JSON.stringify(packageJson, undefined, 2)),\n fs.promises.rm(dirPath, { force: true, recursive: true }),\n ]);\n spawnSync('yarn', ['dlx', 'husky-init', '--yarn2'], config.dirPath);\n\n const preCommitFilePath = path.resolve(dirPath, 'pre-commit');\n\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.huskyrc.json'), { force: true }));\n await promisePool.run(() => fs.promises.writeFile(preCommitFilePath, settings.preCommit + '\\n'));\n\n const { typecheck } = generateScripts(config);\n if (typecheck) {\n let prePush = config.repository?.startsWith('github:WillBoosterLab/') ? settings.prePushForLab : settings.prePush;\n prePush = prePush.replace(\n 'yarn typecheck',\n typecheck\n .replace('tsc ', 'node node_modules/.bin/tsc ')\n .replace('wb ', 'node node_modules/.bin/wb ')\n // pyright has no arguments\n .replace('pyright', 'node node_modules/.bin/pyright')\n );\n await promisePool.run(() =>\n fs.promises.writeFile(path.resolve(dirPath, 'pre-push'), prePush + '\\n', {\n mode: 0o755,\n })\n );\n }\n\n const postMergeCommands: string[] = [];\n if (config.versionsText) {\n postMergeCommands.push('run_if_changed \"\\\\..+-version\" \"asdf plugin update --all\"');\n }\n // Pythonがないとインストールできない処理系が存在するため、強制的に最初にインストールする。\n if (config.versionsText?.includes('python ')) {\n postMergeCommands.push('run_if_changed \"\\\\..+-version\" \"asdf install python\"');\n }\n if (config.versionsText) {\n postMergeCommands.push('run_if_changed \"\\\\..+-version\" \"asdf install\"');\n }\n const rmNextDirectory = config.depending.blitz || config.depending.next ? ' && rm -Rf .next' : '';\n postMergeCommands.push(`run_if_changed \"package\\\\.json\" \"yarn${rmNextDirectory}\"`);\n if (config.containingPoetryLock) {\n postMergeCommands.push('run_if_changed \"poetry\\\\.lock\" \"poetry install\"');\n }\n if (config.depending.blitz) {\n postMergeCommands.push(\n 'run_if_changed \"db/schema.prisma\" \"node node_modules/.bin/blitz prisma migrate deploy\"',\n 'run_if_changed \"db/schema.prisma\" \"node node_modules/.bin/blitz prisma generate\"',\n 'run_if_changed \"db/schema.prisma\" \"node node_modules/.bin/blitz codegen\"'\n );\n } else if (config.depending.prisma) {\n postMergeCommands.push(\n 'run_if_changed \"prisma/schema.prisma\" \"node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy\"',\n 'run_if_changed \"prisma/schema.prisma\" \"node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate\"'\n );\n }\n const postMergeCommand = `${settings.postMerge}\\n\\n${postMergeCommands.join('\\n')}\\n`;\n await promisePool.run(() =>\n fs.promises.writeFile(path.resolve(dirPath, 'post-merge'), postMergeCommand, {\n mode: 0o755,\n })\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst newContent = `<?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`;\n\nexport async function generateIdeaSettings(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateIdeaSettings', async () => {\n const dirPath = path.resolve(config.dirPath, '.idea');\n if (fs.existsSync(dirPath)) {\n const filePath = path.resolve(dirPath, 'watcherTasks.xml');\n await (config.containingJavaScript ||\n config.containingJavaScriptInPackages ||\n config.containingTypeScript ||\n config.containingTypeScriptInPackages ||\n (config.containingPackageJson &&\n !config.containingPubspecYaml &&\n !config.containingGemfile &&\n !config.containingGoMod &&\n !config.containingPomXml)\n ? promisePool.run(() => fsUtil.generateFile(filePath, newContent))\n : promisePool.run(() => fs.promises.rm(filePath, { force: true })));\n }\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { EslintUtil } from '../utils/eslintUtil.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { getSrcDirs } from '../utils/srcDirectories.js';\n\nexport async function generateLintstagedrc(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateLintstagedrc', async () => {\n await core(config);\n });\n}\n\nasync function core(config: PackageConfig): Promise<void> {\n const packagePrefix = config.root ? 'node node_modules/.bin/' : 'node ../../node_modules/.bin/';\n const lines: string[] = [];\n if (config.containingJavaScript || config.containingTypeScript) {\n const eslint = `\n '${getEslintKey(config)}': [${JSON.stringify(\n `${packagePrefix}eslint --fix${EslintUtil.getLintFixSuffix(config)}`\n )}, '${packagePrefix}prettier --cache --write'],`;\n lines.push(eslint);\n }\n const packagesFilter = config.root ? \" && !file.includes('/packages/')\" : '';\n lines.push(`\n './**/*.{${extensions.prettier.join(',')}}': files => {\n ${config.containingJavaScript || config.containingTypeScript ? getEslintFilterForPrettier(config) : ''}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${packagesFilter});\n if (filteredFiles.length === 0) return [];\n const commands = [\\`${packagePrefix}prettier --cache --write \\${filteredFiles.join(' ')}\\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${packagePrefix}sort-package-json');\n }\n return commands;\n },`);\n if (config.containingPubspecYaml) {\n lines.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 },`);\n }\n if (config.containingPoetryLock) {\n lines.push(`\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],`);\n }\n\n const newContent = `${\n config.containingJavaScript || config.containingTypeScript ? \"const micromatch = require('micromatch');\" : ''\n }\n\nmodule.exports = {${lines.join('')}\n};\n`;\n\n const filePath = path.resolve(config.dirPath, '.lintstagedrc.cjs');\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.lintstagedrc.js'), { force: true }));\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.lintstagedrc.json'), { force: true }));\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n}\n\nfunction getEslintKey(config: PackageConfig): string {\n const dirs = getSrcDirs(config);\n return `./{${dirs.join(',')}}/**/*.{${extensions.eslint.join(',')}}`;\n}\n\nfunction getEslintFilterForPrettier(config: PackageConfig): string {\n return `files = micromatch.not(files, '${getEslintKey(config)}');`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function generateNextConfigJson(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateNextConfigJson', async () => {\n const filePath = ['js', 'mjs', 'cjs']\n .map((ext) => path.resolve(config.dirPath, `next.config.${ext}`))\n .find((p) => fs.existsSync(p));\n if (!filePath) return;\n\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n // Replace the JSON object from the file\n const newContent = oldContent.replace(/=\\s*{([\\S\\s]*)};/, (_, settingsText) => {\n if (!settingsText.includes('eslint:')) {\n settingsText += 'eslint: { ignoreDuringBuilds: true },';\n }\n if (!settingsText.includes('typescript:')) {\n settingsText += 'typescript: { ignoreBuildErrors: true },';\n }\n return `= {${settingsText}};`;\n });\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst commonContent = `\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n`;\n\nexport async function generatePrettierignore(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generatePrettierignore', async () => {\n const filePath = path.resolve(config.dirPath, '.prettierignore');\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n const headUserContent = ignoreFileUtil.getHeadUserContent(content);\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const gitignoreFilePath = path.resolve(config.dirPath, '.gitignore');\n const gitignoreContent = (await ignoreFileUtil.readGitignoreWithoutSeparators(gitignoreFilePath)) || '';\n\n let additionalContent = '';\n if (config.containingPubspecYaml) {\n additionalContent = `\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n`;\n }\n\n const newContent = headUserContent + commonContent + additionalContent + gitignoreContent + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { overwriteMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst jsonObj = {\n venvPath: '.',\n venv: '.venv',\n};\n\nexport async function generatePyrightConfigJson(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generatePyrightConfigJson', async () => {\n let newSettings: unknown = cloneDeep(jsonObj);\n const filePath = path.resolve(config.dirPath, 'pyrightconfig.json');\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(oldContent);\n newSettings = merge.all([newSettings, oldSettings, newSettings], { arrayMerge: overwriteMerge });\n } catch {\n // do nothing\n }\n const newContent = JSON.stringify(newSettings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst semanticReleaseBadge =\n '[![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)';\n\nexport async function generateReadme(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateReadme', async () => {\n const filePath = path.resolve(config.dirPath, 'README.md');\n let newContent = await fs.promises.readFile(filePath, 'utf8');\n\n if (fs.existsSync(path.resolve(config.dirPath, '.releaserc.json'))) {\n newContent = insertBadge(newContent, semanticReleaseBadge);\n }\n\n const repository = config.repository?.slice(config.repository?.indexOf(':') + 1);\n const fileNames = fs.readdirSync(`${config.dirPath}/.github/workflows`);\n for (const fileName of fileNames) {\n if (!fileName.startsWith('test') && !fileName.startsWith('deploy')) continue;\n\n let badgeName = fileName;\n badgeName = badgeName[0].toUpperCase() + badgeName.slice(1, badgeName.indexOf('.'));\n badgeName = badgeName.replace('-', ' ');\n const badge = `[![${badgeName}](https://github.com/${repository}/actions/workflows/${fileName}/badge.svg)](https://github.com/${repository}/actions/workflows/${fileName})`;\n if (fs.existsSync(path.resolve(config.dirPath, `.github/workflows/${fileName}`))) {\n newContent = insertBadge(newContent, badge);\n }\n }\n\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n\nexport function insertBadge(readme: string, badge: string): string {\n // 既にbadgeがある場合は削除\n readme = readme.replace(badge, '').replaceAll(/\\n\\n\\n+/g, '\\n\\n');\n\n for (let i = 0; i < readme.length; i++) {\n if (readme[i - 1] === '\\n' && readme[i] === '\\n') {\n const before = readme.slice(0, i + 1);\n let after = readme.slice(i + 1);\n if (!after.startsWith('[') && !after.startsWith('!')) {\n after = `\\n${after}`;\n }\n return `${before}${badge}\\n${after}`;\n }\n }\n return `${readme}\\n${badge}\\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { overwriteMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function generateReleaserc(rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateReleaserc', async () => {\n const filePath = path.resolve(rootConfig.dirPath, '.releaserc.json');\n const settings = JSON.parse(await fs.promises.readFile(filePath, 'utf8'));\n const plugins = settings?.plugins || [];\n for (let i = 0; i < plugins.length; i++) {\n const plugin = Array.isArray(plugins[i]) ? plugins[i][0] : plugins[i];\n const oldConfig = (Array.isArray(plugins[i]) && plugins[i][1]) || {};\n if (plugin === '@semantic-release/commit-analyzer') {\n plugins[i] = [\n '@semantic-release/commit-analyzer',\n merge.all(\n [\n oldConfig,\n {\n preset: 'conventionalcommits',\n },\n ],\n { arrayMerge: overwriteMerge }\n ),\n ];\n } else if (plugin === '@semantic-release/github') {\n plugins[i] = [\n '@semantic-release/github',\n merge.all(\n [\n oldConfig,\n {\n // cf. https://github.com/semantic-release/semantic-release/issues/2204#issuecomment-1508417704\n successComment: false,\n failComment: false,\n labels: ['r: semantic-release'],\n releasedLabels: ['released :bookmark:'],\n },\n ],\n { arrayMerge: overwriteMerge }\n ),\n ];\n }\n }\n const newContent = JSON.stringify(settings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { overwriteMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst jsonObj = {\n $schema: 'https://docs.renovatebot.com/renovate-schema.json',\n extends: ['github>WillBooster/willbooster-configs:renovate.json5'],\n};\n\ntype Settings = typeof jsonObj & { packageRules: { packageNames: string[]; enabled?: boolean }[] };\n\nexport async function generateRenovateJson(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateRenovateJson', async () => {\n let newSettings = cloneDeep(jsonObj) as Settings;\n const filePath = path.resolve(config.dirPath, 'renovate.json');\n if (fs.existsSync(`${filePath}5`)) {\n // Since it is difficult for parsing renovate.json5, we do nothing\n return;\n }\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(oldContent);\n newSettings = merge.all([newSettings, oldSettings, newSettings], {\n arrayMerge: overwriteMerge,\n }) as Settings;\n newSettings.extends = newSettings.extends.filter((item: string) => item !== '@willbooster');\n } catch {\n // do nothing\n }\n\n // Don't upgrade Next.js automatically\n if (config.depending.blitz) {\n newSettings.packageRules ??= [];\n if (!newSettings.packageRules.some((rule: { packageNames: string[] }) => rule.packageNames.includes('next'))) {\n newSettings.packageRules.push({ packageNames: ['next'], enabled: false });\n }\n }\n\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.dependabot'), { force: true }));\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.renovaterc.json'), { force: true }));\n const newContent = JSON.stringify(newSettings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","export function moveToBottom<TObj extends Record<TKey, unknown>, TKey extends string | number | symbol>(\n obj: TObj,\n key: TKey\n): TObj {\n const value = obj[key];\n delete obj[key];\n (obj as Record<TKey, unknown>)[key] = value;\n return obj;\n}\n\nexport function sortKeys<T extends Record<string, unknown>>(obj: T): T {\n const keyAndValues = Object.entries(obj).sort(([key1], [key2]) => key1.localeCompare(key2));\n for (const [key, value] of keyAndValues) {\n delete obj[key];\n (obj as Record<string, unknown>)[key] = value;\n\n // if value is an object, sort the keys of the object\n if (typeof value === 'object' && value !== null) {\n sortKeys(value as Record<string, unknown>);\n }\n }\n return obj;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport cloneDeep from 'lodash.clonedeep';\nimport type { TsConfigJson } from 'type-fest';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { sortKeys } from '../utils/objectUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst rootJsonObj = {\n compilerOptions: {\n target: 'ES2022', // because decorators should be transpiled to ES2022 on Node.js\n module: 'ESNext',\n moduleResolution: 'Node',\n jsx: 'react-jsx',\n alwaysStrict: true,\n strict: true,\n skipLibCheck: true, // because libraries may have broken types\n allowSyntheticDefaultImports: true, // allow `import React from 'react'`\n esModuleInterop: true, // allow default import from CommonJS/AMD/UMD modules\n resolveJsonModule: true, // allow to import JSON files\n declaration: true,\n sourceMap: true,\n importHelpers: false,\n outDir: 'dist',\n typeRoots: ['./node_modules/@types', './@types'],\n },\n include: [\n 'src/**/*',\n 'tests/**/*',\n 'scripts/**/*',\n 'packages/*/src/**/*',\n 'packages/*/tests/**/*',\n 'packages/*/scripts/**/*',\n ],\n};\n\nconst subJsonObj = {\n compilerOptions: {\n target: 'ES2022', // because decorators should be transpiled to ES2022 on Node.js\n module: 'ESNext',\n moduleResolution: 'Node',\n jsx: 'react-jsx',\n alwaysStrict: true,\n strict: true,\n skipLibCheck: true, // because libraries may have broken types\n allowSyntheticDefaultImports: true, // allow `import React from 'react'`\n esModuleInterop: true, // allow default import from CommonJS/AMD/UMD modules\n resolveJsonModule: true, // allow to import JSON files\n declaration: true,\n sourceMap: true,\n importHelpers: false,\n outDir: 'dist',\n typeRoots: ['../../node_modules/@types', '../../@types', './@types'],\n },\n include: ['src/**/*', 'tests/**/*', 'scripts/**/*'],\n};\n\nexport async function generateTsconfig(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateTsconfig', async () => {\n if (config.depending.blitz || config.depending.next) return;\n\n let newSettings = cloneDeep(config.root ? rootJsonObj : subJsonObj) as TsConfigJson;\n if (!config.containingJsxOrTsx && !config.containingJsxOrTsxInPackages) {\n delete newSettings.compilerOptions?.jsx;\n }\n if (config.root && !config.containingSubPackageJsons) {\n newSettings.include = newSettings.include?.filter((dirPath: string) => !dirPath.startsWith('packages/*/'));\n }\n if (config.esmPackage) {\n newSettings.compilerOptions = {\n ...newSettings.compilerOptions,\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n };\n }\n\n const filePath = path.resolve(config.dirPath, 'tsconfig.json');\n try {\n const existingContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(existingContent) as TsConfigJson;\n if (oldSettings.extends === './node_modules/@willbooster/tsconfig/tsconfig.json') {\n delete oldSettings.extends;\n }\n // Don't modify \"target\", \"module\" and \"moduleResolution\".\n delete newSettings.compilerOptions?.target;\n if (!config.esmPackage) {\n delete newSettings.compilerOptions?.module;\n delete newSettings.compilerOptions?.moduleResolution;\n }\n if (oldSettings.compilerOptions?.jsx) {\n delete newSettings.compilerOptions?.jsx;\n }\n newSettings = merge.all([newSettings, oldSettings, newSettings], { arrayMerge: combineMerge });\n newSettings.include = newSettings.include?.filter(\n (dirPath: string) => !dirPath.includes('@types') && !dirPath.includes('__tests__')\n );\n } catch {\n // do nothing\n }\n sortKeys(newSettings);\n newSettings.include?.sort();\n const newContent = JSON.stringify(newSettings);\n // Don't use old decorator\n delete newSettings.compilerOptions?.experimentalDecorators;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { sortKeys } from '../utils/objectUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst excludeFilePatterns = [\n '**/.git/objects/**',\n '**/.git/subtree-cache/**',\n '**/node_modules/**',\n '**/tmp/**',\n '**/temp/**',\n '**/dist/**',\n];\n\nexport async function generateVscodeSettings(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateVscodeSettings', async () => {\n try {\n const filePath = path.resolve(config.dirPath, '.vscode', 'settings.json');\n const existingContent = await fs.promises.readFile(filePath, 'utf8');\n let settings = JSON.parse(existingContent);\n for (const excludeFilePattern of excludeFilePatterns) {\n settings = merge.all([settings, excludeSetting(excludeFilePattern)]);\n }\n if (config.containingPoetryLock) {\n settings = merge.all([settings, excludeSetting('**/.venv/**')]);\n }\n if (config.depending.next) {\n settings = merge.all([settings, excludeSetting('**/.next/**')]);\n }\n sortKeys(settings ?? {});\n const newContent = JSON.stringify(settings, undefined, 2);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n } catch {\n // do nothing\n }\n });\n}\n\nfunction excludeSetting(excludeFilePattern: string): unknown {\n return {\n 'files.watcherExclude': {\n [excludeFilePattern]: true,\n },\n };\n}\n","/* eslint-disable unicorn/no-null */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport yaml from 'js-yaml';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { moveToBottom, sortKeys } from '../utils/objectUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\ninterface Workflow {\n name: string;\n on: On;\n concurrency?: Concurrency;\n jobs: { [key: string]: Job };\n}\n\ninterface Concurrency {\n group: string;\n 'cancel-in-progress': boolean;\n}\n\ninterface On {\n issues?: Types;\n pull_request?: PullRequest;\n pull_request_target?: Types;\n push?: Push;\n schedule?: Schedule[];\n workflow_dispatch?: null;\n}\n\ninterface PullRequest {\n 'paths-ignore'?: string[];\n types?: string[];\n}\n\ninterface Push {\n branches: string[];\n 'paths-ignore'?: string[];\n}\n\ninterface Schedule {\n cron: string;\n}\n\ninterface Types {\n types: string[];\n}\n\ninterface Job {\n uses: string;\n secrets?: Record<string, unknown>;\n with?: Record<string, unknown>;\n}\n\nconst workflows = {\n test: {\n name: 'Test',\n on: {\n pull_request: {\n 'paths-ignore': ['**.md', '**/docs/**'],\n },\n push: {\n branches: ['main', 'wbfy'],\n 'paths-ignore': ['**.md', '**/docs/**'],\n },\n },\n // cf. https://docs.github.com/en/actions/using-jobs/using-concurrency#example-only-cancel-in-progress-jobs-or-runs-for-the-current-workflow\n concurrency: {\n group: '${{ github.workflow }}-${{ github.ref }}',\n 'cancel-in-progress': true,\n },\n jobs: {\n test: {\n uses: 'WillBooster/reusable-workflows/.github/workflows/test.yml@main',\n },\n },\n },\n release: {\n name: 'Release',\n on: {\n push: {\n branches: [],\n },\n },\n concurrency: {\n group: '${{ github.workflow }}',\n 'cancel-in-progress': false,\n },\n jobs: {\n release: {\n uses: 'WillBooster/reusable-workflows/.github/workflows/release.yml@main',\n },\n },\n },\n wbfy: {\n name: 'Willboosterify',\n on: {\n workflow_dispatch: null,\n },\n jobs: {\n wbfy: {\n uses: 'WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main',\n },\n },\n },\n 'wbfy-merge': {\n name: 'Merge wbfy',\n on: {\n workflow_dispatch: null,\n },\n jobs: {\n 'wbfy-merge': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main',\n },\n },\n },\n 'semantic-pr': {\n name: 'Lint PR title',\n on: {\n pull_request_target: {\n types: ['opened', 'edited', 'synchronize'],\n },\n },\n jobs: {\n 'semantic-pr': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main',\n },\n },\n },\n sync: {\n name: 'Sync',\n on: {},\n jobs: {\n sync: { uses: 'WillBooster/reusable-workflows/.github/workflows/sync.yml@main' },\n },\n },\n 'notify-ready': {\n name: 'Notify ready',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'notify-ready': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main',\n secrets: {\n DISCORD_WEBHOOK_URL: '${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}',\n },\n },\n },\n },\n 'close-comment': {\n name: 'Add close comment',\n on: {\n pull_request: {\n types: ['opened'],\n },\n },\n jobs: {\n 'close-comment': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main',\n },\n },\n },\n 'add-issue-to-project': {\n name: 'Add issue to GitHub project',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'add-issue-to-project': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main',\n secrets: {\n GH_PROJECT_URL: '${{ secrets.GH_PROJECT_URL }}',\n },\n },\n },\n },\n 'add-focused-issue-to-project': {\n name: 'Add focused issue to GitHub project',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'add-focused-issue-to-project': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main',\n with: {\n label: 'focused :dart:',\n },\n secrets: {\n GH_PROJECT_URL: 'https://github.com/orgs/WillBooster/projects/7',\n },\n },\n },\n },\n 'add-ready-issue-to-project': {\n name: 'Add ready issue to GitHub project',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'add-ready-issue-to-project': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main',\n with: {\n labeled: 'ready :rocket:',\n labelOperator: 'OR',\n },\n secrets: {\n GH_PROJECT_URL: 'https://github.com/orgs/WillBoosterLab/projects/5',\n },\n },\n },\n },\n} as const;\n\ntype KnownKind = keyof typeof workflows | 'deploy';\n\nexport async function generateWorkflows(rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateWorkflow', async () => {\n const workflowsPath = path.resolve(rootConfig.dirPath, '.github', 'workflows');\n await fs.promises.mkdir(workflowsPath, { recursive: true });\n\n // Remove config of semantic pull request\n const semanticYmlPath = path.resolve(rootConfig.dirPath, '.github', 'semantic.yml');\n await promisePool.run(() => fs.promises.rm(semanticYmlPath, { force: true, recursive: true }));\n\n const entries = await fs.promises.readdir(workflowsPath, { withFileTypes: true });\n const fileNameSet = new Set([\n 'test.yml',\n 'wbfy.yml',\n 'wbfy-merge.yml',\n 'semantic-pr.yml',\n 'close-comment.yml',\n 'add-issue-to-project.yml',\n 'add-focused-issue-to-project.yml',\n ...entries.filter((dirent) => dirent.isFile() && dirent.name.endsWith('.yml')).map((dirent) => dirent.name),\n ]);\n if (rootConfig.depending.semanticRelease) {\n fileNameSet.add('release.yml');\n }\n if (rootConfig.publicRepo || rootConfig.repository?.startsWith('github:WillBoosterLab/')) {\n fileNameSet.add('add-ready-issue-to-project.yml');\n fileNameSet.add('notify-ready.yml');\n }\n\n for (const fileName of fileNameSet) {\n // 実際はKnownKind以外の値も代入されることに注意\n const kind = path.basename(fileName, '.yml') as KnownKind;\n await promisePool.run(() => writeWorkflowYaml(rootConfig, workflowsPath, kind));\n }\n });\n}\n\nasync function writeWorkflowYaml(config: PackageConfig, workflowsPath: string, kind: KnownKind): Promise<void> {\n let newSettings = cloneDeep(workflows[kind as keyof typeof workflows] ?? {}) as Workflow;\n const filePath = path.join(workflowsPath, `${kind}.yml`);\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = yaml.load(oldContent) as Workflow;\n newSettings = merge.all([newSettings, oldSettings, newSettings], { arrayMerge: combineMerge }) as Workflow;\n } catch {\n // do nothing\n }\n\n if (kind.startsWith('deploy')) {\n newSettings = {\n ...newSettings,\n concurrency: {\n group: '${{ github.workflow }}',\n 'cancel-in-progress': false,\n },\n };\n // Move jobs to the bottom\n if (newSettings.jobs) {\n moveToBottom(newSettings, 'jobs');\n }\n if (newSettings.on?.push) {\n newSettings.on.push['paths-ignore'] = [\n ...new Set<string>([...(newSettings.on.push['paths-ignore'] ?? []), '**.md', '**/docs/**']),\n ];\n }\n }\n\n for (const job of Object.values(newSettings.jobs)) {\n // Ignore non-reusable workflows\n if (!job.uses?.includes?.('/reusable-workflows/')) return;\n\n normalizeJob(config, job, kind);\n }\n\n switch (kind) {\n case 'release': {\n if (newSettings.on?.schedule) {\n delete newSettings.on.push;\n } else if (newSettings.on?.push && config.release.branches.length > 0) {\n newSettings.on.push.branches = config.release.branches;\n } else {\n // Don't use release.yml if release branch is not specified\n await fs.promises.rm(path.join(workflowsPath, 'release.yml'), { force: true });\n return;\n }\n break;\n }\n case 'test': {\n if (newSettings.on?.push) {\n newSettings.on.push.branches = newSettings.on.push.branches.filter((branch) => branch !== 'renovate/**');\n }\n break;\n }\n case 'wbfy': {\n if (newSettings.on) setSchedule(newSettings, 20, 24);\n break;\n }\n case 'wbfy-merge': {\n setSchedule(newSettings, 1, 4);\n break;\n }\n // No default\n }\n migrateWorkflow(newSettings);\n await writeYaml(newSettings, filePath);\n\n if (kind === 'release') {\n await fs.promises.rm(path.join(workflowsPath, 'semantic-release.yml'), { force: true });\n } else if (kind === 'sync') {\n await fs.promises.rm(path.join(workflowsPath, 'sync-init.yml'), { force: true });\n if (!newSettings.jobs.sync || !newSettings.jobs.sync.with) return;\n\n newSettings.jobs['sync-force'] = newSettings.jobs.sync;\n const params = newSettings.jobs.sync.with.sync_params_without_dest;\n if (!params) return;\n\n newSettings.jobs.sync.with.sync_params_without_dest = `--force ${params}`;\n newSettings.name = 'Force to Sync';\n newSettings.on = { workflow_dispatch: null };\n delete newSettings.jobs.sync;\n await writeYaml(newSettings, path.join(workflowsPath, 'sync-force.yml'));\n }\n}\n\nfunction normalizeJob(config: PackageConfig, job: Job, kind: KnownKind): void {\n job.with ||= {};\n job.secrets ||= {};\n\n if (\n kind === 'test' ||\n kind === 'release' ||\n kind === 'wbfy' ||\n kind === 'wbfy-merge' ||\n kind === 'add-issue-to-project' ||\n kind === 'add-focused-issue-to-project' ||\n kind === 'add-ready-issue-to-project'\n ) {\n job.secrets['GH_TOKEN'] = config.publicRepo ? '${{ secrets.PUBLIC_GH_BOT_PAT }}' : '${{ secrets.GH_BOT_PAT }}';\n }\n if (config.release.npm && (kind === 'release' || kind === 'test')) {\n job.secrets['NPM_TOKEN'] = '${{ secrets.NPM_TOKEN }}';\n }\n if (job.secrets['FIREBASE_TOKEN']) {\n job.secrets['GCP_SA_KEY_JSON_FOR_FIREBASE'] = '${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}';\n delete job.secrets['FIREBASE_TOKEN'];\n }\n if (\n (job.secrets['DISCORD_WEBHOOK_URL'] && (kind === 'release' || kind.startsWith('deploy'))) ||\n (job.with.server_url && kind.startsWith('deploy'))\n ) {\n job.secrets['DISCORD_WEBHOOK_URL'] = '${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}';\n }\n\n if (kind === 'sync') {\n const params = job.with?.sync_params_without_dest;\n if (params) {\n job.with.sync_params_without_dest = params.toString().replace('sync ', '');\n }\n }\n\n if (config.repository?.startsWith('github:WillBooster/')) {\n job.uses = job.uses.replace('WillBoosterLab/', 'WillBooster/');\n } else if (config.repository?.startsWith('github:WillBoosterLab/')) {\n job.uses = job.uses.replace('WillBooster/', 'WillBoosterLab/');\n }\n\n // Remove deprecated parameters\n migrateJob(job);\n\n // Don't use `fly deploy --json` since it causes an error\n if (kind.startsWith('deploy') && job.secrets['FLY_API_TOKEN'] && job.with['deploy_command']) {\n job.with['deploy_command'] = job.with['deploy_command'].toString().replace(/\\s+--json/, '');\n }\n if (config.containingDockerfile) {\n if (job.with['ci_size'] !== 'extra-large' && (kind.startsWith('deploy') || kind.startsWith('test'))) {\n job.with['ci_size'] = 'large';\n }\n if (kind.startsWith('deploy')) {\n job.with['cpu_arch'] = 'X64';\n }\n }\n // Because github.event.repository.private is always true if job is scheduled\n if (kind === 'release' || kind === 'test' || kind === 'wbfy' || kind === 'wbfy-merge' || kind.startsWith('deploy')) {\n if (config.publicRepo) {\n job.with['github_hosted_runner'] = true;\n }\n } else {\n delete job.with['github_hosted_runner'];\n }\n\n if (Object.keys(job.with).length > 0) {\n sortKeys(job.with);\n } else {\n delete job.with;\n }\n if (Object.keys(job.secrets).length > 0) {\n // Move secrets prop after with prop\n const newSecrets = sortKeys(job.secrets);\n delete job.secrets;\n job.secrets = newSecrets;\n } else {\n delete job.secrets;\n }\n}\n\nfunction setSchedule(newSettings: Workflow, inclusiveMinHourJst: number, exclusiveMaxHourJst: number): void {\n const [minuteUtc, hourUtc] = ((newSettings.on.schedule?.[0]?.cron as string) ?? '').split(' ').map(Number);\n if (minuteUtc !== 0 && Number.isInteger(hourUtc)) {\n const hourJst = (hourUtc + 9) % 24;\n const inRange =\n inclusiveMinHourJst < exclusiveMaxHourJst\n ? inclusiveMinHourJst <= hourJst && hourJst < exclusiveMaxHourJst\n : inclusiveMinHourJst <= hourJst || hourJst < exclusiveMaxHourJst;\n if (inRange) return;\n }\n\n const minJst = 1 + Math.floor(Math.random() * 59);\n const hourJst = inclusiveMinHourJst + Math.floor(Math.random() * (exclusiveMaxHourJst - inclusiveMinHourJst));\n const cron = `${minJst} ${(hourJst - 9 + 24) % 24} * * *`;\n newSettings.on.schedule = [{ cron }];\n}\n\nasync function writeYaml(newSettings: Workflow, filePath: string): Promise<void> {\n const yamlText = yaml.dump(newSettings, {\n lineWidth: -1,\n noCompatMode: true,\n styles: {\n '!!null': 'empty',\n },\n });\n await fs.promises.writeFile(filePath, yamlText);\n}\n\nfunction migrateWorkflow(newSettings: Workflow): void {\n // TODO: Remove them after 2023-03-31\n delete newSettings.jobs['add-to-project'];\n}\n\nfunction migrateJob(job: Job): void {\n // TODO: Remove them after 2023-03-31\n if (!job.with) return;\n delete job.with['non_self_hosted'];\n delete job.with['notify_discord'];\n delete job.with['require_fly'];\n delete job.with['require_gcloud'];\n if (job.with['dot_env_path'] === '.env') {\n delete job.with['dot_env_path'];\n }\n delete job.with['cpu_arch'];\n delete job.with['label'];\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { ConfigurationValueMap } from '@yarnpkg/core';\nimport yaml from 'js-yaml';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync, spawnSyncWithStringResult } from '../utils/spawnUtil.js';\n\ninterface Settings extends Partial<ConfigurationValueMap> {\n defaultSemverRangePrefix: string;\n nmMode: string;\n nodeLinker: string;\n plugins?: Plugin[];\n}\n\ninterface Plugin {\n checksum: string;\n path: string;\n spec: string;\n}\n\nexport async function generateYarnrcYml(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateYarnrcYml', async () => {\n const currentVersion = spawnSyncWithStringResult('yarn', ['--version'], config.dirPath);\n const latestVersion = getLatestVersion('@yarnpkg/cli', config.dirPath);\n if (getMajorNumber(currentVersion) <= getMajorNumber(latestVersion) && currentVersion !== latestVersion) {\n spawnSync('yarn', ['set', 'version', latestVersion], config.dirPath, 1);\n }\n\n const releasesPath = path.join(config.dirPath, '.yarn', 'releases');\n await fs.promises.mkdir(releasesPath, { recursive: true });\n for (const file of await fs.promises.readdir(releasesPath)) {\n if (file.startsWith('yarn-') && !file.startsWith(`yarn-${latestVersion}.`)) {\n await promisePool.run(() => fs.promises.rm(path.join(releasesPath, file)));\n console.log('Removed', path.join(releasesPath, file));\n }\n }\n\n const yarnrcPath = path.resolve(config.dirPath, '.yarnrc');\n await promisePool.run(() => fs.promises.rm(yarnrcPath, { force: true }));\n\n const yarnrcYmlPath = path.resolve(config.dirPath, '.yarnrc.yml');\n const settings = yaml.load(await fs.promises.readFile(yarnrcYmlPath, 'utf8')) as Settings;\n settings.defaultSemverRangePrefix = '';\n settings.nodeLinker = 'node-modules';\n settings.nmMode = 'hardlinks-global';\n delete settings.compressionLevel;\n if (settings.injectEnvironmentFiles?.length === 0) {\n delete settings.injectEnvironmentFiles;\n }\n // cf. https://github.com/yarnpkg/berry/pull/4698\n settings.enableGlobalCache = true;\n const originalLength = settings.plugins?.length ?? 0;\n settings.plugins = settings.plugins?.filter((p) => p.path !== '.yarn/plugins/undefined.cjs') ?? [];\n if (settings.plugins.length !== originalLength) {\n const pluginPath = path.resolve(config.dirPath, '.yarnrc', 'undefined.cjs');\n await promisePool.run(() => fs.promises.rm(pluginPath, { force: true }));\n }\n if (settings.plugins.length === 0) {\n delete settings.plugins;\n }\n await fs.promises.writeFile(yarnrcYmlPath, yaml.dump(settings, { lineWidth: -1 }));\n\n spawnSync('yarn', ['dlx', 'yarn-plugin-auto-install'], config.dirPath);\n });\n}\n\nexport function getLatestVersion(packageName: string, dirPath: string): string {\n const versionsJson = spawnSyncWithStringResult('npm', ['show', packageName, 'versions', '--json'], dirPath);\n const versions = JSON.parse(versionsJson) as string[];\n return versions.at(-1) as string;\n}\nfunction getMajorNumber(version: string): number {\n const [major] = version.split('.');\n return Number(major);\n}\n","import { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { gitHubUtil, hasGitHubToken, octokit } from '../utils/githubUtil.js';\n\nexport async function setupLabels(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('setupLabels', async () => {\n if (!hasGitHubToken) return;\n\n const [owner, repo] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (!owner || !repo) return;\n if (owner !== 'WillBooster' && owner !== 'WillBoosterLab') return;\n\n try {\n await setupLabel(owner, repo, 'd1: x-easy :hedgehog:', 'EDE9FE');\n await setupLabel(owner, repo, 'd2: easy :rabbit2:', 'DDD6FE');\n await setupLabel(owner, repo, 'd3: medium :ox:', 'C4B5FD');\n await setupLabel(owner, repo, 'd4: hard :squid:', 'A78BFA');\n await setupLabel(owner, repo, 'd5: x-hard :whale2:', '8B5CF6');\n await setupLabel(owner, repo, 'p1: critical :fire::fire::fire:', 'EF4444');\n await setupLabel(owner, repo, 'p2: urgent :fire::fire:', 'F87171');\n await setupLabel(owner, repo, 'p3: important :fire:', 'FCA5A5');\n await setupLabel(owner, repo, 'p4: nice to have :droplet:', 'FECACA');\n await setupLabel(owner, repo, 'r: blitz', '5300bc');\n await setupLabel(owner, repo, 'r: firebase', 'ffca28');\n await setupLabel(owner, repo, 'r: prisma', '0c344b');\n await setupLabel(owner, repo, 'r: react', '61dafb');\n await setupLabel(owner, repo, 'r: svelte', 'ff3e00');\n await setupLabel(owner, repo, 'r: semantic-release', '494949');\n await setupLabel(owner, repo, 'ready :rocket:', '22C55E');\n await setupLabel(owner, repo, 'review requested :mag:', 'FBCA04');\n await setupLabel(owner, repo, 'released :bookmark:', '6366F1');\n await setupLabel(owner, repo, 's: 0.5h :clock1230:', 'F3F4F6');\n await setupLabel(owner, repo, 's: 1h :clock1:', 'E5E7EB');\n await setupLabel(owner, repo, 's: 2h :clock2:', 'D1D5DB');\n await setupLabel(owner, repo, 's: 3h :clock3:', '9CA3AF');\n await setupLabel(owner, repo, 's: 5h :clock5:', '6B7280');\n await setupLabel(owner, repo, 's: 8h :clock8:', '4B5563');\n await setupLabel(owner, repo, 's: 13h :clock1:', '374151');\n await setupLabel(owner, repo, 't: build :hammer:', 'BFDBFE');\n await setupLabel(owner, repo, 't: chore :broom:', 'BFDBFE');\n await setupLabel(owner, repo, 't: ci :construction_worker:', 'BFDBFE');\n await setupLabel(owner, repo, 't: docs :memo:', 'BFDBFE');\n await setupLabel(owner, repo, 't: feat :sparkles:', 'BFDBFE');\n await setupLabel(owner, repo, 't: fix :bug:', 'BFDBFE');\n await setupLabel(owner, repo, 't: perf :zap:', 'BFDBFE');\n await setupLabel(owner, repo, 't: refactor :recycle:', 'BFDBFE');\n await setupLabel(owner, repo, 't: style :lipstick:', 'BFDBFE');\n await setupLabel(owner, repo, 't: test :test_tube:', 'BFDBFE');\n await setupLabel(owner, repo, 'project', '24292F');\n await setupLabel(owner, repo, 'focused :dart:', '22C55E');\n\n await deleteLabel(owner, repo, 'bug');\n await deleteLabel(owner, repo, 'documentation');\n await deleteLabel(owner, repo, 'duplicate');\n await deleteLabel(owner, repo, 'enhancement');\n await deleteLabel(owner, repo, 'good first issue');\n await deleteLabel(owner, repo, 'help wanted');\n await deleteLabel(owner, repo, 'invalid');\n await deleteLabel(owner, repo, 'question');\n await deleteLabel(owner, repo, 'wontfix');\n\n await deleteLabel(owner, repo, 'ready');\n await deleteLabel(owner, repo, 'review requested');\n await deleteLabel(owner, repo, 'released');\n await deleteLabel(owner, repo, 'semantic-release');\n } catch (error) {\n console.warn('Skip setupLabels due to:', (error as Error)?.stack ?? error);\n }\n });\n}\n\nasync function setupLabel(owner: string, repo: string, name: string, color: string): Promise<void> {\n try {\n await octokit.request('POST /repos/{owner}/{repo}/labels', {\n owner,\n repo,\n name,\n color,\n });\n } catch {\n await octokit.request('PATCH /repos/{owner}/{repo}/labels/{name}', {\n owner,\n repo,\n name,\n color,\n });\n }\n}\n\nasync function deleteLabel(owner: string, repo: string, name: string): Promise<void> {\n try {\n await octokit.request('DELETE /repos/{owner}/{repo}/labels/{name}', {\n owner,\n repo,\n name,\n });\n } catch {\n // do nothing\n }\n}\n","/* eslint-disable import/no-named-as-default-member */\n\nimport dotenv from 'dotenv';\nimport sodium from 'libsodium-wrappers';\n\nimport { logger } from '../logger.js';\nimport { options } from '../options.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { gitHubUtil, hasGitHubToken, octokit } from '../utils/githubUtil.js';\n\nconst deprecatedSecretNames = ['READY_DISCORD_WEBHOOK_URL'];\n\nexport async function setupSecrets(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('setupSecrets', async () => {\n if (!hasGitHubToken || !options.doesUploadEnvVars) return;\n\n const [owner, repo] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (!owner || !repo || owner !== 'WillBoosterLab') return;\n\n const parsed = dotenv.config().parsed || {};\n if (Object.keys(parsed).length === 0) return;\n\n try {\n for (const secretName of deprecatedSecretNames) {\n try {\n await octokit.request('DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}', {\n owner,\n repo,\n secret_name: secretName,\n });\n } catch {\n // do nothing\n }\n }\n\n const response = await octokit.request('GET /repos/{owner}/{repo}/actions/secrets/public-key', {\n owner,\n repo,\n });\n const { key, key_id: keyId } = response.data;\n\n await sodium.ready;\n\n for (const [name, secret] of Object.entries(parsed)) {\n if (config.publicRepo && name === 'GH_BOT_PAT') continue;\n if (!config.publicRepo && name === 'PUBLIC_GH_BOT_PAT') continue;\n\n // Convert Secret & Base64 key to Uint8Array.\n const rawKey = sodium.from_base64(key, sodium.base64_variants.ORIGINAL);\n const rawSec = sodium.from_string(secret);\n\n // Encrypt the secret using LibSodium\n const encBytes = sodium.crypto_box_seal(rawSec, rawKey);\n\n // Convert encrypted Uint8Array to Base64\n const encBase64 = sodium.to_base64(encBytes, sodium.base64_variants.ORIGINAL);\n\n await octokit.request('PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}', {\n owner,\n repo,\n secret_name: name,\n encrypted_value: encBase64,\n key_id: keyId,\n });\n }\n } catch (error) {\n console.warn('Skip setupSecrets due to:', (error as Error)?.stack ?? error);\n }\n });\n}\n","import { withRetry } from '@willbooster/shared-lib';\n\nimport type { PackageConfig } from '../packageConfig.js';\nimport { gitHubUtil, octokit } from '../utils/githubUtil.js';\n\nexport async function setupGitHubSettings(config: PackageConfig): Promise<void> {\n const [owner, repo] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (!owner || !repo) return;\n if (owner !== 'WillBooster' && owner !== 'WillBoosterLab') return;\n\n await withRetry(() =>\n octokit.request('PATCH /repos/{owner}/{repo}', {\n owner,\n repo,\n allow_merge_commit: false,\n allow_squash_merge: true,\n allow_rebase_merge: false,\n delete_branch_on_merge: true,\n squash_merge_commit_title: 'PR_TITLE',\n squash_merge_commit_message: 'BLANK',\n headers: {\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n ...(config.repository?.startsWith('github:WillBooster/') ? { allow_auto_merge: true } : {}),\n })\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { distance } from 'fastest-levenshtein';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst templates = {\n 'pull_request_template.md': `\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \\`All checks have passed\\` on PR page. (You may leave this box unchecked due to long workflows.)\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \\`WIP:\\`.\n - All tests are passed.\n - Test command (e.g., \\`yarn test\\`) is passed.\n - Lint command (e.g., \\`yarn lint\\`) is passed.\n- [ ] I've reviewed my changes on PR's diff view.\n\n<!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src=\"\" width=\"400\"> | <img src=\"\" width=\"400\"> |\n-->\n`.trim(),\n};\n\nexport async function generateGitHubTemplates(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateGitHubTemplates', async () => {\n for (const [fileName, newContent] of Object.entries(templates)) {\n const filePath = path.resolve(config.dirPath, '.github', fileName);\n if (fs.existsSync(filePath)) {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n if (distance(oldContent, newContent) > newContent.length / 2) {\n continue;\n }\n }\n\n await fs.promises.mkdir(path.resolve(config.dirPath, '.github'), { recursive: true });\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n }\n });\n}\n","import fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { globbySync } from 'globby';\nimport { simpleGit } from 'simple-git';\nimport type { PackageJson } from 'type-fest';\nimport { z } from 'zod';\n\nimport { gitHubUtil, octokit } from './utils/githubUtil.js';\n\nexport interface PackageConfig {\n dirPath: string;\n dockerfile: string;\n root: boolean;\n publicRepo: boolean;\n referredByOtherRepo: boolean;\n repository?: string;\n esmPackage: boolean;\n willBoosterConfigs: boolean;\n containingSubPackageJsons: boolean;\n containingDockerfile: boolean;\n containingGemfile: boolean;\n containingGoMod: boolean;\n containingPackageJson: boolean;\n containingPoetryLock: boolean;\n containingPomXml: boolean;\n containingPubspecYaml: boolean;\n containingTemplateYaml: boolean;\n containingVscodeSettingsJson: boolean;\n\n containingJavaScript: boolean;\n containingTypeScript: boolean;\n containingJsxOrTsx: boolean;\n containingJavaScriptInPackages: boolean;\n containingTypeScriptInPackages: boolean;\n containingJsxOrTsxInPackages: boolean;\n depending: {\n blitz: boolean;\n firebase: boolean;\n litestream: boolean;\n next: boolean;\n playwrightTest: boolean;\n prisma: boolean;\n pyright: boolean;\n reactNative: boolean;\n semanticRelease: boolean;\n storybook: boolean;\n wb: boolean;\n };\n release: {\n branches: string[];\n github: boolean;\n npm: boolean;\n };\n eslintBase?: EslintExtensionBase;\n versionsText?: string;\n packageJson?: PackageJson;\n wbfyJson?: WbfyJson;\n}\n\ntype WbfyJson = z.infer<typeof wbfyJsonSchema>;\n\nconst wbfyJsonSchema = z.object({\n typos: z\n .object({\n all: z.record(z.string()).optional(),\n doc: z.record(z.string()).optional(),\n ts: z.record(z.string()).optional(),\n text: z.record(z.string()).optional(),\n })\n .optional(),\n});\n\nexport async function getPackageConfig(dirPath: string): Promise<PackageConfig | undefined> {\n const packageJsonPath = path.resolve(dirPath, 'package.json');\n try {\n const containingPackageJson = fs.existsSync(packageJsonPath);\n let dependencies: PackageJson['dependencies'] = {};\n let devDependencies: PackageJson['devDependencies'] = {};\n let packageJson: PackageJson = {};\n let esmPackage = false;\n if (containingPackageJson) {\n const packageJsonText = fs.readFileSync(packageJsonPath, 'utf8');\n packageJson = JSON.parse(packageJsonText);\n dependencies = packageJson.dependencies ?? {};\n devDependencies = packageJson.devDependencies ?? {};\n esmPackage = packageJson.type === 'module';\n }\n\n let releaseBranches: string[] = [];\n let releasePlugins: string[] = [];\n try {\n const releasercJsonPath = path.resolve(dirPath, '.releaserc.json');\n const json = JSON.parse(await fsp.readFile(releasercJsonPath, 'utf8'));\n releaseBranches = json?.branches || [];\n releasePlugins = json?.plugins?.flat() || [];\n } catch {\n // do nothing\n }\n\n const isRoot =\n path.basename(path.resolve(dirPath, '..')) !== 'packages' ||\n !fs.existsSync(path.resolve(dirPath, '..', '..', 'package.json'));\n\n let repoInfo: Record<string, unknown> | undefined;\n if (isRoot) {\n repoInfo = await fetchRepoInfo(dirPath, packageJson);\n }\n\n let versionsText = '';\n try {\n const content = await fsp.readFile(path.resolve(dirPath, '.tool-versions'), 'utf8');\n versionsText += content.trim();\n } catch {\n // do nothing\n }\n for (const [prefix, name] of [\n ['java', 'java'],\n ['node', 'nodejs'],\n ['python', 'python'],\n ]) {\n try {\n const nodeVersionContent = await fsp.readFile(path.resolve(dirPath, `.${prefix}-version`), 'utf8');\n if (versionsText) {\n versionsText += '\\n';\n }\n versionsText += name + ' ' + nodeVersionContent.trim();\n } catch {\n // do nothing\n }\n }\n\n let dockerfile = '';\n try {\n dockerfile = await fsp.readFile(path.resolve(dirPath, 'Dockerfile'), 'utf8');\n } catch {\n // do nothing\n }\n\n // Read wbfy.json\n const wbfyJsonPath = path.resolve(dirPath, 'wbfy.json');\n let wbfyJson: WbfyJson | undefined;\n try {\n const wbfyJsonText = await fsp.readFile(wbfyJsonPath, 'utf8');\n wbfyJson = wbfyJsonSchema.parse(JSON.parse(wbfyJsonText));\n } catch {\n // do nothing\n }\n\n const config: PackageConfig = {\n dirPath,\n dockerfile,\n root: isRoot,\n publicRepo: repoInfo?.private === false,\n referredByOtherRepo: !!packageJson.files,\n repository: repoInfo?.full_name ? `github:${repoInfo?.full_name}` : undefined,\n esmPackage,\n willBoosterConfigs: packageJsonPath.includes(`${path.sep}willbooster-configs`),\n containingSubPackageJsons: containsAny('packages/**/package.json', dirPath),\n containingDockerfile: !!dockerfile || fs.existsSync(path.resolve(dirPath, 'docker-compose.yml')),\n containingGemfile: fs.existsSync(path.resolve(dirPath, 'Gemfile')),\n containingGoMod: fs.existsSync(path.resolve(dirPath, 'go.mod')),\n containingPackageJson: fs.existsSync(path.resolve(dirPath, 'package.json')),\n containingPoetryLock: fs.existsSync(path.resolve(dirPath, 'poetry.lock')),\n containingPomXml: fs.existsSync(path.resolve(dirPath, 'pom.xml')),\n containingPubspecYaml: fs.existsSync(path.resolve(dirPath, 'pubspec.yaml')),\n containingTemplateYaml: fs.existsSync(path.resolve(dirPath, 'template.yaml')),\n containingVscodeSettingsJson: fs.existsSync(path.resolve(dirPath, '.vscode', 'settings.json')),\n containingJavaScript: containsAny('{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}', dirPath),\n containingTypeScript: containsAny('{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}', dirPath),\n containingJsxOrTsx: containsAny('{app,src,tests}/**/*.{t,j}sx', dirPath),\n containingJavaScriptInPackages: containsAny('packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}', dirPath),\n containingTypeScriptInPackages: containsAny('packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}', dirPath),\n containingJsxOrTsxInPackages: containsAny('packages/**/{app,src,tests}/**/*.{t,j}sx', dirPath),\n depending: {\n blitz: !!dependencies['blitz'],\n firebase: !!devDependencies['firebase-tools'],\n litestream: dockerfile.includes('install-litestream.sh'),\n next: !!dependencies['next'],\n playwrightTest:\n !!dependencies['@playwright/test'] ||\n !!devDependencies['@playwright/test'] ||\n !!devDependencies['playwright'],\n prisma: !!dependencies['@prisma/client'] || !!devDependencies['prisma'],\n pyright: !!devDependencies['pyright'],\n reactNative: !!dependencies['react-native'],\n semanticRelease: !!(\n devDependencies['semantic-release'] ||\n releaseBranches.length > 0 ||\n releasePlugins.length > 0\n ),\n storybook: !!devDependencies['@storybook/react'],\n wb:\n !!dependencies['@willbooster/wb'] ||\n !!devDependencies['@willbooster/wb'] ||\n // TODO: remove the following migration code in future\n !!dependencies['@willbooster/shared-scripts'] ||\n !!devDependencies['@willbooster/shared-scripts'],\n },\n release: {\n branches: releaseBranches,\n github: releasePlugins.includes('@semantic-release/github'),\n npm: releasePlugins.includes('@semantic-release/npm'),\n },\n versionsText,\n packageJson,\n wbfyJson,\n };\n config.eslintBase = getEslintExtensionBase(config);\n if (\n config.containingGemfile ||\n config.containingGoMod ||\n config.containingPackageJson ||\n config.containingPoetryLock ||\n config.containingPomXml ||\n config.containingPubspecYaml ||\n config.containingTemplateYaml\n ) {\n return config;\n }\n } catch {\n // do nothing\n }\n}\n\nfunction containsAny(pattern: string, dirPath: string): boolean {\n return globbySync(pattern, { dot: true, cwd: dirPath }).length > 0;\n}\n\nexport type EslintExtensionBase =\n | '@willbooster/eslint-config-ts-react'\n | '@willbooster/eslint-config-ts'\n | '@willbooster/eslint-config-js-react'\n | '@willbooster/eslint-config-js'\n | '@willbooster/eslint-config-next'\n | '@willbooster/eslint-config-blitz-next';\n\nfunction getEslintExtensionBase(config: PackageConfig): EslintExtensionBase | undefined {\n if (config.depending.blitz) {\n return '@willbooster/eslint-config-blitz-next';\n } else if (config.depending.next) {\n return '@willbooster/eslint-config-next';\n } else if (config.containingTypeScript) {\n return config.containingJsxOrTsx ? '@willbooster/eslint-config-ts-react' : '@willbooster/eslint-config-ts';\n } else {\n if (config.containingJsxOrTsx) {\n return '@willbooster/eslint-config-js-react';\n } else if (config.containingJavaScript) {\n return '@willbooster/eslint-config-js';\n }\n }\n}\n\nasync function fetchRepoInfo(dirPath: string, packageJson: PackageJson): Promise<Record<string, unknown> | undefined> {\n const git = simpleGit(dirPath);\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === 'origin');\n const remoteUrl = origin?.refs?.fetch ?? origin?.refs?.push;\n if (typeof remoteUrl === 'string') {\n const json = await requestRepoInfo(remoteUrl);\n if (json) return json;\n }\n\n const url = typeof packageJson.repository === 'string' ? packageJson.repository : packageJson.repository?.url;\n if (url) {\n const json = await requestRepoInfo(url);\n if (json && json.message !== 'Not Found') return json;\n }\n}\n\nasync function requestRepoInfo(urlOrFullName: string): Promise<Record<string, unknown> | undefined> {\n const [org, name] = gitHubUtil.getOrgAndName(urlOrFullName);\n if (!org || !name) return;\n\n const ret = { full_name: `${org}/${name}` };\n try {\n const response = await octokit.request('GET /repos/{owner}/{repo}', {\n owner: org,\n repo: name,\n });\n Object.assign(ret, response.data);\n } catch {\n // do nothing\n }\n return ret;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { ignoreErrorAsync } from '@willbooster/shared-lib';\nimport yargs from 'yargs';\n\nimport { fixDockerfile } from './fixers/dockerfile.js';\nimport { fixPlaywrightConfig } from './fixers/playwrightConfig.js';\nimport { fixPrismaEnvFiles } from './fixers/prisma.js';\nimport { fixTestDirectories } from './fixers/testDirectory.js';\nimport { fixTypeDefinitions } from './fixers/typeDefinition.js';\nimport { fixTypos } from './fixers/typos.js';\nimport { generateVersionConfigs } from './generators/asdf.js';\nimport { generateDockerignore } from './generators/dockerignore.js';\nimport { generateEditorconfig } from './generators/editorconfig.js';\nimport { generateEslintignore } from './generators/eslintignore.js';\nimport { generateEslintrc } from './generators/eslintrc.js';\nimport { generateGitattributes } from './generators/gitattributes.js';\nimport { generateGitignore } from './generators/gitignore.js';\nimport { generateHuskyrc } from './generators/huskyrc.js';\nimport { generateIdeaSettings } from './generators/idea.js';\nimport { generateLintstagedrc } from './generators/lintstagedrc.js';\nimport { generateNextConfigJson } from './generators/nextconfig.js';\nimport { generatePackageJson } from './generators/packageJson.js';\nimport { generatePrettierignore } from './generators/prettierignore.js';\nimport { generatePyrightConfigJson } from './generators/pyrightconfig.js';\nimport { generateReadme } from './generators/readme.js';\nimport { generateReleaserc } from './generators/releaserc.js';\nimport { generateRenovateJson } from './generators/renovaterc.js';\nimport { generateTsconfig } from './generators/tsconfig.js';\nimport { generateVscodeSettings } from './generators/vscodeSettings.js';\nimport { generateWorkflows } from './generators/workflow.js';\nimport { generateYarnrcYml } from './generators/yarnrc.js';\nimport { setupLabels } from './github/label.js';\nimport { setupSecrets } from './github/secret.js';\nimport { setupGitHubSettings } from './github/settings.js';\nimport { generateGitHubTemplates } from './github/template.js';\nimport { options } from './options.js';\nimport type { PackageConfig } from './packageConfig.js';\nimport { getPackageConfig } from './packageConfig.js';\nimport { promisePool } from './utils/promisePool.js';\nimport { spawnSync } from './utils/spawnUtil.js';\n\nasync function main(): Promise<void> {\n const argv = await yargs(process.argv.slice(2))\n .command('$0 [paths..]', 'Make a given project follow the WillBooster standard', (yargs) => {\n yargs.positional('paths', {\n describe: 'project paths to be wbfied',\n array: true,\n type: 'string',\n default: ['.'],\n });\n })\n .options({\n env: {\n description: 'Upload environment variables as secrets to GitHub',\n type: 'boolean',\n default: false,\n alias: 'e',\n },\n skipDeps: {\n description: 'Skip dependency installation',\n type: 'boolean',\n default: false,\n alias: 'd',\n },\n verbose: {\n description: 'Whether or not to enable verbose mode',\n type: 'boolean',\n default: false,\n alias: 'v',\n },\n })\n .strict().argv;\n options.isVerbose = argv.verbose;\n options.doesUploadEnvVars = argv.env;\n\n for (const rootDirPath of argv.paths as string[]) {\n const packagesDirPath = path.join(rootDirPath, 'packages');\n const dirents = (await ignoreErrorAsync(() => fs.readdir(packagesDirPath, { withFileTypes: true }))) ?? [];\n const subDirPaths = dirents.filter((d) => d.isDirectory()).map((d) => path.join(packagesDirPath, d.name));\n\n await fixTestDirectories([rootDirPath, ...subDirPaths]);\n\n const rootConfig = await getPackageConfig(rootDirPath);\n if (!rootConfig) {\n console.error(`there is no valid package.json in ${rootDirPath}`);\n continue;\n }\n const abbreviationPromise = fixTypos(rootConfig);\n\n const nullableSubPackageConfigs = await Promise.all(subDirPaths.map((subDirPath) => getPackageConfig(subDirPath)));\n const subPackageConfigs = nullableSubPackageConfigs.filter((config) => !!config) as PackageConfig[];\n const allPackageConfigs = [rootConfig, ...subPackageConfigs];\n\n if (options.isVerbose) {\n for (const config of allPackageConfigs) {\n console.info(config);\n }\n }\n\n // Install tools via asdf at first\n await generateVersionConfigs(rootConfig);\n // Install yarn berry\n await generateYarnrcYml(rootConfig);\n await Promise.all([\n fixDockerfile(rootConfig),\n fixPrismaEnvFiles(rootConfig),\n abbreviationPromise.then(() => generateReadme(rootConfig)),\n generateDockerignore(rootConfig),\n generateEditorconfig(rootConfig),\n generateGitattributes(rootConfig),\n generateGitHubTemplates(rootConfig),\n generateHuskyrc(rootConfig),\n generateIdeaSettings(rootConfig),\n generateLintstagedrc(rootConfig),\n generateRenovateJson(rootConfig),\n generateReleaserc(rootConfig),\n generateWorkflows(rootConfig),\n setupLabels(rootConfig),\n setupSecrets(rootConfig),\n setupGitHubSettings(rootConfig),\n ]);\n await promisePool.promiseAll();\n\n const promises: Promise<void>[] = [];\n for (const config of allPackageConfigs) {\n if (config.containingTypeScript || config.containingTypeScriptInPackages) {\n promises.push(fixTypeDefinitions(config, config.root ? allPackageConfigs : [config]));\n }\n if (config.depending.playwrightTest) {\n promises.push(fixPlaywrightConfig(config));\n }\n if (config.depending.next) {\n promises.push(generateNextConfigJson(config));\n }\n await generateGitignore(config, rootConfig);\n await promisePool.promiseAll();\n if (!config.root && !config.containingPackageJson) {\n continue;\n }\n await generatePrettierignore(config);\n await generatePackageJson(config, rootConfig, argv.skipDeps);\n\n promises.push(generateLintstagedrc(config));\n if (config.containingVscodeSettingsJson && config.containingPackageJson) {\n promises.push(generateVscodeSettings(config));\n }\n if (config.containingTypeScript || config.containingTypeScriptInPackages) {\n promises.push(generateTsconfig(config));\n }\n if (\n config.containingJavaScript ||\n config.containingJavaScriptInPackages ||\n config.containingTypeScript ||\n config.containingTypeScriptInPackages\n ) {\n if (!rootConfig.willBoosterConfigs) {\n promises.push(generateEslintrc(config, rootConfig));\n }\n promises.push(generateEslintignore(config));\n }\n if (config.depending.pyright) {\n promises.push(generatePyrightConfigJson(config));\n }\n }\n await Promise.all(promises);\n await promisePool.promiseAll();\n\n spawnSync('yarn', ['cleanup'], rootDirPath);\n // 'yarn install' should be after `yarn cleanup` because yarn berry generates yarn.lock\n // corresponding to the contents of dependant sub-package in monorepo\n spawnSync('yarn', ['install'], rootDirPath);\n }\n}\n\nawait main();\n"],"names":["options","constructor","this","isVerbose","doesUploadEnvVars","logger","functionIgnoringException","name","func","console","info","error","Error","stack","async","fixDockerfile","config","containingDockerfile","oldContent","dockerfile","newContent","fs","writeFile","path","join","dirPath","fixPlaywrightConfig","filePath","existsSync","promises","readFile","replace","fixPrismaEnvFiles","envFiles","globby","dot","cwd","envFile","envFilePath","resolve","fixTestDirectories","packageDirPaths","Promise","all","map","oldTestDirPath","packageDirPath","newTestDirPath","rename","replaceAll","promisePool","PromisePool","fixTypeDefinitions","configsIncludingChildren","libTypeDirPath","srcTypeDirPath","root","containingSubPackageJsons","undefined","dirents","ignoreEnoentAsync","readdir","withFileTypes","dirent","dirName","slice","hasTypeDeclarationExtension","endsWith","packageName","includes","hasLibrary","some","packageJson","dependencies","devDependencies","isFile","mkdir","run","recursive","isDirectory","fsUtil","readFileIgnoringError","fsp","generateFile","content","fixTypos","packageConfig","docFiles","gitignore","length","mdFile","fixAbbreviationsInText","replaceWithConfig","tsFiles","tsFile","textBasedFiles","file","promiseAll","propName","before","after","Object","entries","wbfyJson","typos","spawnSync","command","args","retry","newCmd","newArgs","getSpawnSyncArgs","child_process","status","spawnSyncWithStringResult","stdio","proc","stderr","toString","trim","s","stdout","env","process","PATH","BERRY_BIN_FOLDER","ASDF_DIR","shell","convertVersionIntoNumber","version","numbers","split","Number","filter","isNaN","versionNumber","divisor","num","PYTHON_VERSION","JAVA_VERSION","BLITZ_VERSION","NEXT_VERSION","generateVersionConfigs","versionsText","duplicatableLines","line","CORE_TOOLS","has","sort","lines","Set","containingPoetryLock","response","fetch","json","poetryVersion","updateVersion","depending","firebase","containingPackageJson","prefix","DEPRECATED_VERSION_PREFIXES","versionPath","rm","force","toolVersionsPath","core","toolName","newVersion","head","index","findIndex","l","newLine","splice","userContentHeader","userContentHeaderRegex","separator","defaultHeadUserContent","defaultTailUserContent","ignoreFileUtil","separatorPrefix","readGitignoreWithoutSeparators","lastHeaderIndex","getIndexOfTailUserContentHeader","getHeadUserContent","indexOf","getTailUserContent","isBerryZeroInstallEnabled","lastIndex","lastIndexOf","commonContent","generateDockerignore","headUserContent","tailUserContent","extensions","codeWith2IndentSize","codeWith4IndentSize","codeWith8IndentSize","markdownLike","eslint","prettier","generateExtensions","generateEditorconfig","generateEslintignore","gitignoreFilePath","gitignoreContent","overwriteMerge","destinationArray","sourceArray","combineMerge","target","source","destination","item","cloneUnlessOtherwiseSpecified","isMergeableObject","merge","push","generateEslintrc","rootConfig","bases","eslintBase","newSettings","extends","oldSettings","JSON","parse","ext","startsWith","newExtends","arrayMerge","blitz","stringify","generateGitattributes","defaultNames","generateGitignore","names","containingGemfile","containingGoMod","basename","containingPomXml","containingPubspecYaml","containingTemplateYaml","next","prisma","playwrightTest","reactNative","storybook","litestream","generated","readCache","url","responseText","text","ok","writeCache","os","homedir","stat","Date","now","mtimeMs","EslintUtil","getLintFixSuffix","containingJsxOrTsx","token","GH_BOT_PAT","PUBLIC_GH_BOT_PAT","GH_TOKEN","GITHUB_TOKEN","hasGitHubToken","octokit","Octokit","auth","gitHubUtil","getOrgAndName","urlOrFullName","urlWithoutProtocol","at","srcDirectories","node","getSrcDirs","jsCommonDeps","tsCommonDeps","reactCommonDeps","eslintDeps","generatePackageJson","skipAddingDeps","jsonText","jsonObj","scripts","peerDependencies","author","deps","values","dep","removeDeprecatedStuff","key","value","generateScripts","prettify","existingContent","originalContent","generatePrettierSuffix","poetryDevDependencies","publicRepo","referredByOtherRepo","semanticRelease","workspaces","Array","isArray","workspace","globbySync","wb","containingJavaScript","containingJavaScriptInPackages","containingTypeScript","containingTypeScriptInPackages","willBoosterConfigs","private","license","publishConfig","access","owner","repository","main","resolutions","lint","cleanup","dirs","dir","format","postinstall","pythonFiles","ignore","dirNameSet","pythonFile","first","second","add","size","dirNamesStr","d","keys","newJsonText","oldAndNewScriptNames","oldName","newName","files","fixScriptNames","typecheck","oldTest","test","pyright","settings","preCommit","prePush","prePushForLab","postMerge","generateHuskyrc","packageJsonPath","preCommitFilePath","mode","postMergeCommands","rmNextDirectory","postMergeCommand","generateIdeaSettings","generateLintstagedrc","packagePrefix","getEslintKey","packagesFilter","getEslintFilterForPrettier","generateNextConfigJson","find","p","_","settingsText","generatePrettierignore","additionalContent","venvPath","venv","generatePyrightConfigJson","cloneDeep","semanticReleaseBadge","generateReadme","insertBadge","fileNames","readdirSync","fileName","badgeName","toUpperCase","badge","readme","i","generateReleaserc","plugins","plugin","oldConfig","preset","successComment","failComment","labels","releasedLabels","$schema","generateRenovateJson","packageRules","rule","packageNames","enabled","sortKeys","obj","keyAndValues","key1","key2","localeCompare","rootJsonObj","compilerOptions","module","moduleResolution","jsx","alwaysStrict","strict","skipLibCheck","allowSyntheticDefaultImports","esModuleInterop","resolveJsonModule","declaration","sourceMap","importHelpers","outDir","typeRoots","include","subJsonObj","generateTsconfig","containingJsxOrTsxInPackages","esmPackage","experimentalDecorators","excludeFilePatterns","generateVscodeSettings","excludeFilePattern","excludeSetting","workflows","on","pull_request","branches","concurrency","group","jobs","uses","release","wbfy","workflow_dispatch","pull_request_target","types","sync","issues","secrets","DISCORD_WEBHOOK_URL","GH_PROJECT_URL","with","label","labeled","labelOperator","generateWorkflows","workflowsPath","semanticYmlPath","fileNameSet","kind","writeWorkflowYaml","yaml","load","moveToBottom","job","normalizeJob","schedule","branch","setSchedule","migrateWorkflow","writeYaml","params","sync_params_without_dest","npm","server_url","migrateJob","newSecrets","inclusiveMinHourJst","exclusiveMaxHourJst","minuteUtc","hourUtc","cron","isInteger","hourJst","Math","floor","random","yamlText","dump","lineWidth","noCompatMode","styles","generateYarnrcYml","currentVersion","latestVersion","versionsJson","getLatestVersion","getMajorNumber","releasesPath","yarnrcPath","yarnrcYmlPath","defaultSemverRangePrefix","nodeLinker","nmMode","compressionLevel","injectEnvironmentFiles","enableGlobalCache","originalLength","pluginPath","major","setupLabels","repo","setupLabel","deleteLabel","warn","color","request","deprecatedSecretNames","setupSecrets","parsed","dotenv","secretName","secret_name","key_id","keyId","data","sodium","ready","secret","rawKey","from_base64","base64_variants","ORIGINAL","rawSec","from_string","encBytes","crypto_box_seal","encBase64","to_base64","encrypted_value","setupGitHubSettings","withRetry","allow_merge_commit","allow_squash_merge","allow_rebase_merge","delete_branch_on_merge","squash_merge_commit_title","squash_merge_commit_message","headers","allow_auto_merge","templates","generateGitHubTemplates","distance","wbfyJsonSchema","z","object","record","string","optional","doc","ts","getPackageConfig","packageJsonText","readFileSync","type","releaseBranches","releasePlugins","releasercJsonPath","flat","isRoot","repoInfo","git","simpleGit","origin","getRemotes","r","remoteUrl","refs","requestRepoInfo","message","fetchRepoInfo","nodeVersionContent","wbfyJsonPath","wbfyJsonText","full_name","sep","containsAny","containingVscodeSettingsJson","github","getEslintExtensionBase","pattern","org","ret","assign","argv","yargs","positional","describe","array","default","description","alias","skipDeps","verbose","rootDirPath","paths","packagesDirPath","subDirPaths","ignoreErrorAsync","abbreviationPromise","subPackageConfigs","subDirPath","allPackageConfigs","then"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/options.ts","../src/logger.ts","../src/fixers/dockerfile.ts","../src/fixers/playwrightConfig.ts","../src/fixers/prisma.ts","../src/fixers/testDirectory.ts","../src/utils/promisePool.ts","../src/fixers/typeDefinition.ts","../src/utils/fsUtil.ts","../src/fixers/typos.ts","../src/utils/spawnUtil.ts","../src/utils/version.ts","../src/utils/versionConstants.ts","../src/generators/asdf.ts","../src/utils/ignoreFileUtil.ts","../src/generators/dockerignore.ts","../src/utils/extensions.ts","../src/generators/editorconfig.ts","../src/generators/eslintignore.ts","../src/utils/mergeUtil.ts","../src/generators/eslintrc.ts","../src/generators/gitattributes.ts","../src/generators/gitignore.ts","../src/utils/eslintUtil.ts","../src/utils/githubUtil.ts","../src/utils/srcDirectories.ts","../src/generators/packageJson.ts","../src/generators/huskyrc.ts","../src/generators/idea.ts","../src/generators/lintstagedrc.ts","../src/generators/nextconfig.ts","../src/generators/prettierignore.ts","../src/generators/pyrightconfig.ts","../src/generators/readme.ts","../src/generators/releaserc.ts","../src/generators/renovaterc.ts","../src/utils/objectUtil.ts","../src/generators/tsconfig.ts","../src/generators/vscodeSettings.ts","../src/generators/workflow.ts","../src/generators/yarnrc.ts","../src/github/label.ts","../src/github/secret.ts","../src/github/settings.ts","../src/github/template.ts","../src/packageConfig.ts","../src/index.ts"],"sourcesContent":["class Options {\n isVerbose: boolean;\n doesUploadEnvVars: boolean;\n\n constructor() {\n this.isVerbose = false;\n this.doesUploadEnvVars = false;\n }\n}\n\nexport const options = new Options();\n","import { options } from './options.js';\n\nclass Logger {\n async functionIgnoringException(name: string, func: () => Promise<void>): Promise<void> {\n if (options.isVerbose) {\n console.info(`--------- ${name} start ---------`);\n }\n try {\n await func();\n } catch (error) {\n console.info(`Error occurred in ${name}: ${error instanceof Error ? error.stack : error}}`);\n }\n if (options.isVerbose) {\n console.info(`---------- ${name} end ----------`);\n }\n }\n}\n\nexport const logger = new Logger();\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\n\nexport async function fixDockerfile(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixDockerfile', async () => {\n if (!config.doesContainsDockerfile) return;\n\n const oldContent = config.dockerfile;\n const newContent = oldContent;\n\n if (oldContent === newContent) return;\n await fs.writeFile(path.join(config.dirPath, 'Dockerfile'), newContent);\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\n\nexport async function fixPlaywrightConfig(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixPlaywrightConfig', async () => {\n const filePath = path.join(config.dirPath, 'playwright.config.ts');\n if (!fs.existsSync(filePath)) return;\n\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n\n const newContent = oldContent.replace(/retries:.+,/, 'retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,');\n if (oldContent === newContent) return;\n\n await fs.promises.writeFile(filePath, newContent);\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { globby } from 'globby';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\n\nexport async function fixPrismaEnvFiles(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixPrismaEnvFiles', async () => {\n const envFiles = await globby(['*.env', '*.env.*'], { dot: true, cwd: config.dirPath });\n for (const envFile of envFiles) {\n const envFilePath = path.resolve(config.dirPath, envFile);\n const content = await fs.readFile(envFilePath, 'utf8');\n const newContent = content.replace(\n /DATABASE_URL=\"?(.+\\.sqlite3)\"?[\\n$]/,\n 'DATABASE_URL=\"$1?connection_limit=1\"\\n'\n );\n await fs.writeFile(envFilePath, newContent);\n }\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\n\nexport async function fixTestDirectories(packageDirPaths: string[]): Promise<void> {\n return logger.functionIgnoringException('fixTestDirectories', async () => {\n await Promise.all(\n packageDirPaths.map(async (packageDirPath) => {\n const oldTestDirPath = path.join(packageDirPath, '__tests__');\n const newTestDirPath = path.join(packageDirPath, 'tests');\n try {\n await fs.promises.rename(oldTestDirPath, newTestDirPath);\n const oldContent = await fs.promises.readFile(path.join(packageDirPath, 'package.json'), 'utf8');\n const newContent = oldContent.replaceAll('__tests__', 'tests');\n if (oldContent === newContent) return;\n\n await fs.promises.writeFile(path.join(packageDirPath, 'package.json'), newContent);\n } catch {\n // do nothing\n }\n })\n );\n });\n}\n","import { PromisePool } from 'minimal-promise-pool';\n\nexport const promisePool = new PromisePool();\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { ignoreEnoentAsync } from '@willbooster/shared-lib';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function fixTypeDefinitions(\n config: PackageConfig,\n configsIncludingChildren: PackageConfig[]\n): Promise<void> {\n return logger.functionIgnoringException('fixTypeDefinitions', async () => {\n const libTypeDirPath = path.resolve(config.dirPath, '@types');\n const srcTypeDirPath =\n config.isRoot && config.doesContainsSubPackageJsons ? undefined : path.resolve(config.dirPath, 'src', 'types');\n\n const dirents = await ignoreEnoentAsync(() => fs.readdir(libTypeDirPath, { withFileTypes: true }));\n if (!dirents) return;\n\n for (const dirent of dirents) {\n const dirName = dirent.name.slice(0, -5);\n const hasTypeDeclarationExtension = dirent.name.endsWith('.d.ts');\n let packageName = hasTypeDeclarationExtension ? dirName : dirent.name;\n if (packageName.includes('__')) {\n packageName = `@${packageName.replace('__', '/')}`;\n }\n const hasLibrary = configsIncludingChildren.some(\n (config) =>\n config.packageJson?.dependencies?.[packageName] || config.packageJson?.devDependencies?.[packageName]\n );\n\n if (dirent.isFile() && hasTypeDeclarationExtension) {\n if (hasLibrary) {\n // Move @types/<name>/index.d.ts if installed\n await fs.mkdir(path.join(libTypeDirPath, dirName));\n await promisePool.run(() =>\n fs.rename(path.join(libTypeDirPath, dirent.name), path.join(libTypeDirPath, dirName, 'index.d.ts'))\n );\n } else if (srcTypeDirPath) {\n // Move src/types/<name> if not installed\n await fs.mkdir(srcTypeDirPath, { recursive: true });\n await promisePool.run(() =>\n fs.rename(path.join(libTypeDirPath, dirent.name), path.join(srcTypeDirPath, dirent.name))\n );\n }\n } else if (dirent.isDirectory() && srcTypeDirPath && !hasLibrary) {\n // Move src/types/<name>.d.ts if not installed\n await fs.mkdir(srcTypeDirPath, { recursive: true });\n await promisePool.run(() =>\n ignoreEnoentAsync(() =>\n fs.rename(\n path.join(libTypeDirPath, dirent.name, 'index.d.ts'),\n path.join(srcTypeDirPath, `${dirent.name}.d.ts`)\n )\n )\n );\n }\n }\n });\n}\n","import fsp from 'node:fs/promises';\n\nexport const fsUtil = {\n async readFileIgnoringError(filePath: string): Promise<string | undefined> {\n try {\n return await fsp.readFile(filePath, 'utf8');\n } catch {\n // do nothing\n }\n },\n async generateFile(filePath: string, content: string): Promise<void> {\n await fsp.writeFile(filePath, content);\n console.log(`Generated/Updated ${filePath}`);\n },\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { globby } from 'globby';\n\nimport { logger } from '../logger.js';\nimport { options } from '../options.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function fixTypos(packageConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('fixAbbreviations', async () => {\n const dirPath = packageConfig.dirPath;\n const docFiles = await globby('**/*.md', { dot: true, cwd: dirPath, gitignore: true });\n if (options.isVerbose) {\n console.info(`Found ${docFiles.length} markdown files in ${dirPath}`);\n }\n for (const mdFile of docFiles) {\n const filePath = path.join(dirPath, mdFile);\n await promisePool.run(async () => {\n const content = await fs.promises.readFile(filePath, 'utf8');\n let newContent = fixAbbreviationsInText(content);\n newContent = replaceWithConfig(newContent, packageConfig, 'doc');\n if (content !== newContent) {\n await fsUtil.generateFile(filePath, newContent);\n }\n });\n }\n\n const tsFiles = await globby(\n [\n '{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}',\n 'packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}',\n ],\n { dot: true, cwd: dirPath, gitignore: true }\n );\n if (options.isVerbose) {\n console.info(`Found ${tsFiles.length} TypeScript files in ${dirPath}`);\n }\n for (const tsFile of tsFiles) {\n const filePath = path.join(dirPath, tsFile);\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n let newContent = oldContent\n .replaceAll(/\\/\\/(.*)c\\.f\\./g, '//$1cf.')\n .replaceAll(/\\/\\/(.*)eg\\./g, '//$1e.g.')\n .replaceAll(/\\/\\/(.*)ie\\./g, '//$1i.e.');\n newContent = replaceWithConfig(newContent, packageConfig, 'ts');\n\n if (oldContent === newContent) continue;\n await fsUtil.generateFile(filePath, newContent);\n }\n\n const textBasedFiles = await globby('**/*.{csv,htm,html,tsv,xml,yaml,yml}', {\n dot: true,\n cwd: dirPath,\n gitignore: true,\n });\n if (options.isVerbose) {\n console.info(`Found ${textBasedFiles.length} text-based files in ${dirPath}`);\n }\n for (const file of textBasedFiles) {\n const filePath = path.join(dirPath, file);\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n let newContent = oldContent\n .replaceAll(/\\/\\/(.*)c\\.f\\./g, '//$1cf.')\n .replaceAll(/\\/\\/(.*)eg\\./g, '//$1e.g.')\n .replaceAll(/\\/\\/(.*)ie\\./g, '//$1i.e.');\n newContent = replaceWithConfig(newContent, packageConfig, 'text');\n\n if (oldContent === newContent) continue;\n await fsUtil.generateFile(filePath, newContent);\n }\n\n await promisePool.promiseAll();\n });\n}\n\nexport function fixAbbreviationsInText(content: string): string {\n return content\n .replaceAll(/\\bc\\.f\\.([^$])/g, 'cf.$1')\n .replaceAll(/\\beg\\.([^$])/g, 'e.g.$1')\n .replaceAll(/\\bie\\.([^$])/g, 'i.e.$1');\n}\n\nfunction replaceWithConfig(newContent: string, packageConfig: PackageConfig, propName: 'doc' | 'ts' | 'text'): string {\n for (const [before, after] of Object.entries(packageConfig.wbfyJson?.typos?.all ?? {})) {\n newContent = newContent.replaceAll(before, after);\n }\n for (const [before, after] of Object.entries(packageConfig.wbfyJson?.typos?.[propName] ?? {})) {\n newContent = newContent.replaceAll(before, after);\n }\n return newContent;\n}\n","import type { SpawnSyncOptions } from 'node:child_process';\nimport child_process from 'node:child_process';\n\nexport function spawnSync(command: string, args: string[], cwd: string, retry = 0): void {\n do {\n const [newCmd, newArgs, options] = getSpawnSyncArgs(command, args, cwd);\n console.log(`$ ${newCmd} ${newArgs.join(' ')} at ${options.cwd}`);\n const ret = child_process.spawnSync(newCmd, newArgs, options);\n if (ret.status === 0) break;\n } while (--retry >= 0);\n}\n\nexport function spawnSyncWithStringResult(command: string, args: string[], cwd: string): string {\n const [newCmd, newArgs, options] = getSpawnSyncArgs(command, args, cwd);\n options.stdio = 'pipe';\n const proc = child_process.spawnSync(newCmd, newArgs, options);\n const error = proc.stderr.toString().trim();\n if (error) {\n console.error(`${newCmd} [${newArgs.map((s) => `\"${s}\"`)}] caused the following error:\\n ${error}`);\n }\n return proc.stdout.toString().trim();\n}\n\nexport function getSpawnSyncArgs(command: string, args: string[], cwd: string): [string, string[], SpawnSyncOptions] {\n const env = { ...process.env };\n // Remove berry from PATH\n if (env.PATH && env.BERRY_BIN_FOLDER) {\n env.PATH = env.PATH.replace(`${env.BERRY_BIN_FOLDER}:`, '');\n }\n\n if (env.ASDF_DIR) {\n args = ['-l', '-c', `. ${env.ASDF_DIR}/asdf.sh && ${command} ${args.join(' ')}`];\n command = 'bash';\n }\n return [\n command,\n args,\n {\n cwd,\n env,\n shell: false,\n stdio: 'inherit',\n },\n ];\n}\n","export function convertVersionIntoNumber(version: string): number {\n // e.g. java adoptopenjdk-11.0.17+8\n const numbers = version.split(/[+.-]/).map(Number).filter(Number.isNaN);\n let versionNumber = 0;\n let divisor = 1;\n for (const num of numbers) {\n versionNumber += num * divisor;\n divisor /= 1000;\n }\n return versionNumber;\n}\n","export const PYTHON_VERSION = '3.9.18';\nexport const JAVA_VERSION = 'zulu-11.68.17';\nexport const BLITZ_VERSION = '2.0.4';\nexport const NEXT_VERSION = '14.1.0';\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync, spawnSyncWithStringResult } from '../utils/spawnUtil.js';\nimport { convertVersionIntoNumber } from '../utils/version.js';\nimport { JAVA_VERSION, PYTHON_VERSION } from '../utils/versionConstants.js';\n\nexport async function generateVersionConfigs(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateVersionConfigs', async () => {\n await core(config);\n });\n}\n\nconst CORE_TOOLS = new Set(['java', 'nodejs', 'python']);\nconst DEPRECATED_VERSION_PREFIXES = ['java', 'node', 'python'];\n\nasync function core(config: PackageConfig): Promise<void> {\n if (!config.versionsText) return;\n\n const duplicatableLines = config.versionsText\n .trim()\n .split('\\n')\n .map((line) => {\n const [name, version] = line.trim().split(/\\s+/);\n return `${CORE_TOOLS.has(name) ? ' ' : ''}${name} ${version}`;\n })\n .sort()\n .map((line) => line.trim());\n const lines = [...new Set(duplicatableLines)];\n\n if (config.doesContainsPoetryLock) {\n const response = await fetch('https://pypi.org/pypi/poetry/json');\n const json = await response.json();\n const poetryVersion = json?.info?.version;\n if (poetryVersion) {\n updateVersion(lines, 'poetry', json?.info?.version);\n }\n updateVersion(lines, 'python', PYTHON_VERSION, true);\n }\n if (config.depending.firebase) {\n updateVersion(lines, 'java', JAVA_VERSION, true);\n }\n if (config.doesContainsPackageJson) {\n const version = spawnSyncWithStringResult('npm', ['show', 'yarn', 'version'], config.dirPath);\n updateVersion(lines, 'yarn', version);\n }\n\n for (const prefix of DEPRECATED_VERSION_PREFIXES) {\n const versionPath = path.resolve(config.dirPath, `.${prefix}-version`);\n void fs.promises.rm(versionPath, { force: true });\n }\n\n const toolVersionsPath = path.resolve(config.dirPath, '.tool-versions');\n await (lines.length > 0\n ? promisePool.run(() => fs.promises.writeFile(toolVersionsPath, lines.join('\\n') + '\\n'))\n : promisePool.run(() => fs.promises.rm(toolVersionsPath, { force: true })));\n await promisePool.promiseAll();\n spawnSync('asdf', ['plugin', 'update', '--all'], config.dirPath);\n spawnSync('asdf', ['install'], config.dirPath);\n}\n\nfunction updateVersion(lines: string[], toolName: string, newVersion: string, head = false): void {\n const index = lines.findIndex((l) => l.split(/\\s+/)[0] === toolName);\n const newLine = `${toolName} ${newVersion}`;\n if (index >= 0) {\n const [, version] = lines[index].split(/\\s+/);\n if (convertVersionIntoNumber(newVersion) > convertVersionIntoNumber(version)) {\n lines[index] = newLine;\n }\n } else {\n lines.splice(head ? 0 : lines.length, 0, newLine);\n }\n}\n","import fs from 'node:fs';\n\nconst userContentHeader = '# Project-specific settings';\nconst userContentHeaderRegex = /# Project-specific settings[^\\n]*\\n/gm;\nconst separator = '# Generated by wbfy';\nconst separatorPrefix = '# Generated by ';\nconst defaultHeadUserContent = `${userContentHeader} (head)\n\n\n${separator}\n`;\nconst defaultTailUserContent = `\n${userContentHeader} (tail)\n`;\n\nexport const ignoreFileUtil = {\n separator,\n separatorPrefix,\n defaultHeadUserContent,\n defaultTailUserContent,\n async readGitignoreWithoutSeparators(filePath: string): Promise<string | undefined> {\n try {\n let content = await fs.promises.readFile(filePath, 'utf8');\n const lastHeaderIndex = getIndexOfTailUserContentHeader(content);\n if (lastHeaderIndex > 0) {\n content = content.slice(0, lastHeaderIndex - 1);\n }\n return (\n content\n .replaceAll(userContentHeaderRegex, '')\n .replaceAll(/# Generated by [^\\n]*\\n/gm, '')\n .replaceAll(/\\r?\\n\\r?\\n(\\r?\\n)+/gm, '\\n\\n')\n .trim() + '\\n'\n );\n } catch {\n // do nothing\n }\n },\n getHeadUserContent(content: string): string {\n const index = content.indexOf(this.separatorPrefix);\n if (index >= 0) {\n return content\n .slice(0, content.indexOf('\\n', index) + 1)\n .replaceAll(userContentHeaderRegex, `${userContentHeader} (head)\\n`);\n }\n return defaultHeadUserContent;\n },\n getTailUserContent(content: string): string | undefined {\n const lastHeaderIndex = getIndexOfTailUserContentHeader(content);\n if (lastHeaderIndex > 0) {\n return content.slice(lastHeaderIndex - 1);\n }\n return defaultTailUserContent;\n },\n async isBerryZeroInstallEnabled(filePath: string): Promise<boolean> {\n try {\n const content = await fs.promises.readFile(filePath, 'utf8');\n return content.includes('\\n!.yarn/cache');\n } catch {\n return false;\n }\n },\n};\n\nfunction getIndexOfTailUserContentHeader(content: string): number {\n const index = content.indexOf(userContentHeader);\n const lastIndex = content.lastIndexOf(userContentHeader);\n return lastIndex > index ? lastIndex : -1;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\n// Exercodeではnode_modulesをCOPYする必要があるため、node_modulesを除外してはいけない。\nconst commonContent = `\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n`;\n\nexport async function generateDockerignore(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateDockerignore', async () => {\n const filePath = path.resolve(config.dirPath, '.dockerignore');\n if (config.doesContainsDockerfile) {\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n const headUserContent = ignoreFileUtil.getHeadUserContent(content);\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const newContent = headUserContent + commonContent + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n } else {\n await fs.promises.rm(filePath, { force: true });\n }\n });\n}\n","export const extensions = {\n codeWith2IndentSize: [\n 'cjs',\n 'mjs',\n 'js',\n 'jsx',\n 'cts',\n 'mts',\n 'ts',\n 'tsx',\n 'json',\n 'json5',\n 'jsonc',\n 'cpp',\n 'dart',\n 'htm',\n 'html',\n 'pu',\n 'puml',\n 'rb',\n 'vue',\n 'xml',\n 'yaml',\n 'yml',\n ].sort(),\n codeWith4IndentSize: ['go', 'gradle', 'py'].sort(),\n codeWith8IndentSize: ['sh'].sort(),\n markdownLike: ['md'].sort(),\n eslint: ['cjs', 'mjs', 'js', 'cts', 'mts', 'ts', 'tsx', 'jsx'].sort(),\n prettier: [\n 'cjs',\n 'mjs',\n 'js',\n 'jsx',\n 'cts',\n 'mts',\n 'ts',\n 'tsx',\n 'json',\n 'json5',\n 'jsonc',\n 'css',\n 'htm',\n 'html',\n 'md',\n 'scss',\n 'vue',\n 'yaml',\n 'yml',\n ].sort(),\n // cf. https://biomejs.dev/internals/language-support/\n biome: [\n 'cjs',\n 'mjs',\n 'js',\n 'jsx',\n 'cts',\n 'mts',\n 'ts',\n 'tsx',\n 'json',\n 'json5',\n 'jsonc',\n 'htm',\n 'html',\n 'vue',\n 'svelte',\n 'astro',\n 'css',\n 'yaml',\n 'yml',\n 'gql',\n ].sort(),\n};\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst newContent = `root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${generateExtensions(extensions.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${generateExtensions(extensions.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${generateExtensions(extensions.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${generateExtensions(extensions.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;\n\nexport async function generateEditorconfig(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateEditorconfig', async () => {\n const filePath = path.resolve(config.dirPath, '.editorconfig');\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n\nfunction generateExtensions(extensions: string[]): string {\n return extensions.length > 1 ? `[*.{${extensions.join(',')}}]` : `[*.${extensions[0]}]`;\n}\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst commonContent = `\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`;\n\nexport async function generateEslintignore(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateEslintignore', async () => {\n const filePath = path.resolve(config.dirPath, '.eslintignore');\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n const headUserContent = ignoreFileUtil.getHeadUserContent(content);\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const gitignoreFilePath = path.resolve(config.dirPath, '.gitignore');\n const gitignoreContent = (await ignoreFileUtil.readGitignoreWithoutSeparators(gitignoreFilePath)) || '';\n\n const newContent = headUserContent + commonContent + gitignoreContent + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import merge from 'deepmerge';\n\nexport function overwriteMerge<T>(destinationArray: T[], sourceArray: T[]): T[] {\n return sourceArray;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function combineMerge(target: any[], source: any[], options: any): any[] {\n const destination = [...target];\n\n for (const [index, item] of source.entries()) {\n if (destination[index] === undefined) {\n destination[index] = options.cloneUnlessOtherwiseSpecified(item, options);\n } else if (options.isMergeableObject(item)) {\n destination[index] = merge(target[index], item, options);\n } else if (!target.includes(item)) {\n destination.push(item);\n }\n }\n return destination;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function generateEslintrc(config: PackageConfig, rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateEslintrc', async () => {\n const bases = [];\n if (config.eslintBase) {\n bases.push(config.eslintBase);\n }\n if (config !== rootConfig) {\n bases.push('../../.eslintrc.json');\n }\n let newSettings = { root: true, extends: bases };\n\n const filePath = path.resolve(config.dirPath, '.eslintrc.json');\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(oldContent);\n if (oldSettings.extends) {\n oldSettings.extends = oldSettings.extends.filter(\n (ext: string) => !ext.startsWith('@willbooster/') && ext !== '../../.eslintrc.json'\n );\n }\n if (bases.length === 0) {\n oldSettings.extends = [];\n }\n const newExtends = newSettings.extends;\n newSettings.extends = oldSettings.extends;\n oldSettings.extends = newExtends;\n newSettings = merge.all([newSettings, oldSettings, newSettings], {\n arrayMerge: combineMerge,\n }) as typeof newSettings;\n // TODO: Remove the following code after all Blitz.js projects are updated.\n if (config.depending.blitz) {\n newSettings.extends = newSettings.extends.filter(\n (ext: string) => ext !== './node_modules/@blitzjs/next/eslint'\n );\n }\n } catch {\n // do nothing\n }\n const newContent = JSON.stringify(newSettings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst newContent = `* text=auto\n\n*.vcproj text eol=crlf\n\n${[...extensions.codeWith2IndentSize, ...extensions.codeWith4IndentSize, ...extensions.markdownLike]\n .map((ext) => `*.${ext} text eol=lf`)\n .join('\\n')}\n\ndist/** linguist-generated=true\n`;\n\nexport async function generateGitattributes(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateGitattributes', async () => {\n const filePath = path.resolve(config.dirPath, '.gitattributes');\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport { options } from '../options.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst defaultNames = ['windows', 'macos', 'linux', 'jetbrains', 'visualstudiocode', 'emacs', 'vim', 'yarn'];\n\nconst commonContent = `\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\nIcon[\\r]\n!.keep\n*/mount/*.hash\n\n`;\n\nexport async function generateGitignore(config: PackageConfig, rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateGitignore', async () => {\n const filePath = path.resolve(config.dirPath, '.gitignore');\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n let headUserContent = ignoreFileUtil.getHeadUserContent(content) + commonContent;\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const names = [...defaultNames];\n if (config.doesContainsGemfile) {\n names.push('ruby');\n }\n if (config.doesContainsGoMod) {\n names.push('go');\n headUserContent += `${path.basename(config.dirPath)}\n`;\n }\n if (config.doesContainsPackageJson) {\n names.push('node');\n }\n if (config.doesContainsPomXml) {\n names.push('maven');\n headUserContent += `.idea/google-java-format.xml\n`;\n }\n if (config.doesContainsPubspecYaml) {\n names.push('flutter', 'AndroidStudio', 'ruby');\n headUserContent += `.flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n`;\n }\n if (config.doesContainsTemplateYaml) {\n headUserContent += `.aws-sam/\npackaged.yaml\n`;\n }\n // Because .venv should be ignored on root directory\n if (config.doesContainsPoetryLock) {\n names.push('python');\n headUserContent += `.venv/\n`;\n }\n\n if (config.depending.blitz) {\n headUserContent += `.blitz/\n.blitz**\n`;\n }\n if (config.depending.next) {\n names.push('nextjs');\n }\n if (rootConfig.depending.firebase || config.depending.firebase) {\n names.push('firebase');\n }\n if (rootConfig.depending.prisma) {\n headUserContent += `*.sqlite3*\n*.sqlite3-journal\n`;\n }\n if (config.depending.playwrightTest) {\n headUserContent += `test-results/\n`;\n }\n if (rootConfig.depending.reactNative || config.depending.reactNative) {\n names.push('reactnative');\n headUserContent += `google-services.json\nandroid/app/src/main/assets/\n`;\n }\n if (config.depending.storybook) {\n names.push('storybookjs');\n }\n if (config.depending.litestream) {\n headUserContent += `gcp-sa-key.json\n`;\n }\n\n let generated = '';\n for (const name of names) {\n let content = (await readCache(name)) ?? '';\n if (!content) {\n const url = `https://www.toptal.com/developers/gitignore/api/${name}`;\n const response = await fetch(url);\n const responseText = await response.text();\n if (!response.ok || responseText.includes('Attention Required!') || responseText.includes('<title>')) {\n console.error(`Failed to fetch ${url}`);\n return;\n }\n content = responseText.trim();\n await promisePool.run(() => writeCache(name, content));\n if (options.isVerbose) {\n console.info(`Fetched ${url}`);\n }\n }\n if (generated) generated += '\\n';\n generated += content + '\\n';\n }\n if (!(await ignoreFileUtil.isBerryZeroInstallEnabled(filePath))) {\n generated = generated.replace('!.yarn/cache', '# !.yarn/cache').replace('# .pnp.*', '.pnp.*');\n }\n if (config.doesContainsPomXml || config.doesContainsPubspecYaml) {\n generated = generated\n .replaceAll(/^# .idea\\/artifacts$/gm, '.idea/artifacts')\n .replaceAll(/^# .idea\\/compiler.xml$/gm, '.idea/compiler.xml')\n .replaceAll(/^# .idea\\/jarRepositories.xml$/gm, '.idea/jarRepositories.xml')\n .replaceAll(/^# .idea\\/modules.xml$/gm, '.idea/modules.xml')\n .replaceAll(/^# .idea\\/*.iml$/gm, '.idea/*.iml')\n .replaceAll(/^# .idea\\/modules$/gm, '.idea/modules')\n .replaceAll(/^# *.iml$/gm, '*.iml')\n .replaceAll(/^# *.ipr$/gm, '*.ipr');\n if (config.doesContainsPubspecYaml) {\n generated = generated.replaceAll(/^.idea\\/modules.xml$/gm, '# .idea/modules.xml');\n }\n }\n generated = generated.replaceAll(/^.idea\\/?$/gm, '# .idea');\n if (rootConfig.depending.reactNative || config.depending.reactNative || config.doesContainsPubspecYaml) {\n generated = generated.replaceAll(/^(.idea\\/.+)$/gm, '$1\\nandroid/$1');\n }\n const newContent = headUserContent + generated + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n\nconst dirPath = path.join(os.homedir(), '.cache', 'wbfy', 'gitignore');\n\nasync function writeCache(name: string, content: string): Promise<void> {\n await fs.promises.mkdir(dirPath, { recursive: true });\n await fs.promises.writeFile(path.join(dirPath, name), content);\n}\n\nasync function readCache(name: string): Promise<string | undefined> {\n try {\n const stat = await fs.promises.stat(path.join(dirPath, name));\n if (Date.now() - stat.mtimeMs > 6 * 60 * 60 * 1000) {\n return;\n }\n return await fs.promises.readFile(path.join(dirPath, name), 'utf8');\n } catch {\n // do nothing\n }\n}\n","import type { PackageConfig } from '../packageConfig.js';\n\nexport const EslintUtil = {\n getLintFixSuffix(config: PackageConfig): string {\n return config.doesContainsJsxOrTsx ? ' --rule \"{ react-hooks/exhaustive-deps: 0 }\"' : '';\n },\n};\n","import { Octokit } from '@octokit/core';\n\nconst token =\n process.env.GH_BOT_PAT || process.env.PUBLIC_GH_BOT_PAT || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;\nexport const hasGitHubToken = !!token;\nexport const octokit = new Octokit({\n auth: token,\n});\n\nclass GitHubUtil {\n getOrgAndName(urlOrFullName: string): [string, string] {\n const urlWithoutProtocol = urlOrFullName.split(':').at(-1);\n const names = urlWithoutProtocol?.split('/');\n const org = names?.at(-2) ?? '';\n const name = names?.at(-1)?.replace(/.git$/, '') ?? '';\n return [org, name];\n }\n}\n\nexport const gitHubUtil = new GitHubUtil();\n","import type { PackageConfig } from '../packageConfig.js';\n\nconst srcDirectories = {\n node: ['src', 'tests', 'scripts'].sort(),\n blitz: ['src', 'tests', 'scripts', 'db', 'integrations', 'mailers'].sort(),\n};\n\nexport function getSrcDirs(config: PackageConfig): string[] {\n if (config.depending.blitz) {\n return srcDirectories.blitz;\n }\n return srcDirectories.node;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport { globby, globbySync } from 'globby';\nimport type { PackageJson, SetRequired } from 'type-fest';\n\nimport { logger } from '../logger.js';\nimport type { EslintExtensionBase, PackageConfig } from '../packageConfig.js';\nimport { EslintUtil } from '../utils/eslintUtil.js';\nimport { extensions } from '../utils/extensions.js';\nimport { gitHubUtil } from '../utils/githubUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync } from '../utils/spawnUtil.js';\nimport { getSrcDirs } from '../utils/srcDirectories.js';\nimport { BLITZ_VERSION, NEXT_VERSION } from '../utils/versionConstants.js';\n\nconst jsCommonDeps = [\n 'eslint@8.57.0',\n 'eslint-config-prettier',\n 'eslint-plugin-import',\n 'eslint-plugin-sort-class-members',\n 'eslint-plugin-sort-destructure-keys',\n 'eslint-plugin-unicorn',\n];\n\nconst tsCommonDeps = [\n ...jsCommonDeps,\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'eslint-import-resolver-typescript',\n];\n\nconst reactCommonDeps = ['eslint-plugin-react', 'eslint-plugin-react-hooks'];\n\nconst eslintDeps: Record<EslintExtensionBase, string[]> = {\n '@willbooster/eslint-config-js': ['@willbooster/eslint-config-js', ...jsCommonDeps],\n '@willbooster/eslint-config-js-react': ['@willbooster/eslint-config-js-react', ...jsCommonDeps, ...reactCommonDeps],\n '@willbooster/eslint-config-ts': ['@willbooster/eslint-config-ts', ...tsCommonDeps],\n '@willbooster/eslint-config-ts-react': ['@willbooster/eslint-config-ts-react', ...tsCommonDeps, ...reactCommonDeps],\n '@willbooster/eslint-config-blitz-next': [\n '@willbooster/eslint-config-blitz-next',\n 'eslint-config-next',\n ...tsCommonDeps,\n ...reactCommonDeps,\n ],\n '@willbooster/eslint-config-next': [\n '@willbooster/eslint-config-next',\n 'eslint-config-next',\n ...tsCommonDeps,\n ...reactCommonDeps,\n ],\n};\n\nexport async function generatePackageJson(\n config: PackageConfig,\n rootConfig: PackageConfig,\n skipAddingDeps: boolean\n): Promise<void> {\n return logger.functionIgnoringException('generatePackageJson', async () => {\n await core(config, rootConfig, skipAddingDeps);\n });\n}\n\nasync function core(config: PackageConfig, rootConfig: PackageConfig, skipAddingDeps: boolean): Promise<void> {\n const filePath = path.resolve(config.dirPath, 'package.json');\n const jsonText = await fs.promises.readFile(filePath, 'utf8');\n const jsonObj = JSON.parse(jsonText) as PackageJson;\n jsonObj.scripts = jsonObj.scripts || {};\n jsonObj.dependencies = jsonObj.dependencies || {};\n jsonObj.devDependencies = jsonObj.devDependencies || {};\n jsonObj.peerDependencies = jsonObj.peerDependencies || {};\n\n await removeDeprecatedStuff(jsonObj as SetRequired<PackageJson, 'scripts' | 'dependencies' | 'devDependencies'>);\n\n if (jsonObj.name !== '@willbooster/prettier-config') {\n jsonObj.prettier = '@willbooster/prettier-config';\n }\n\n for (const [key, value] of Object.entries(jsonObj.scripts as Record<string, string>)) {\n // Fresh repo still requires 'yarn install'\n if (!value.includes('git clone')) {\n jsonObj.scripts[key] = value.replace(/yarn\\s*&&\\s*/, '').replace(/yarn\\s*install\\s*&&\\s*/, '');\n }\n }\n\n jsonObj.scripts = merge(jsonObj.scripts, generateScripts(config));\n jsonObj.scripts.prettify += await generatePrettierSuffix(config.dirPath);\n // Deal with breaking changes in yarn berry 4.0.0-rc.49\n for (const [key, value] of Object.entries(jsonObj.scripts)) {\n if (!value?.includes('yarn workspaces foreach')) continue;\n if (\n value.includes('--all') ||\n value.includes('--recursive') ||\n value.includes('--since') ||\n value.includes('--worktree')\n )\n continue;\n jsonObj.scripts[key] = value.replace('yarn workspaces foreach', 'yarn workspaces foreach --all');\n }\n\n let dependencies: string[] = [];\n let devDependencies = ['lint-staged', 'prettier', 'sort-package-json', '@willbooster/prettier-config'];\n const poetryDevDependencies: string[] = [];\n\n if (config.isRoot) {\n // To install the latest pinst\n devDependencies.push('husky');\n // '|| true' avoids errors when husky is not installed.\n jsonObj.scripts['prepare'] = 'husky || true'; // for non-yarn package managers.\n jsonObj.scripts['postinstall'] = 'husky || true'; // for yarn.\n if (config.isPublicRepo || config.isReferredByOtherRepo) {\n // https://typicode.github.io/husky/#/?id=install-1\n devDependencies.push('pinst');\n jsonObj.scripts['prepack'] = 'pinst --disable';\n jsonObj.scripts['postpack'] = 'pinst --enable';\n }\n if (config.depending.semanticRelease) {\n const version =\n jsonObj.devDependencies['multi-semantic-release'] || jsonObj.devDependencies['@qiwi/multi-semantic-release']\n ? // TODO: remove the version specification after multi-semantic-release supports version 7+\n '@6.1.0'\n : '';\n devDependencies.push(`conventional-changelog-conventionalcommits${version}`);\n if (\n !jsonObj.devDependencies['semantic-release'] &&\n !jsonObj.devDependencies['multi-semantic-release'] &&\n !jsonObj.devDependencies['@qiwi/multi-semantic-release']\n ) {\n devDependencies.push('semantic-release');\n }\n jsonObj.version = '0.0.0-semantically-released';\n }\n if (config.depending.playwrightTest) {\n // Since llm-toolbox requires @playwright/test in dependencies\n if (!jsonObj.dependencies['@playwright/test']) {\n devDependencies.push('@playwright/test');\n delete jsonObj.dependencies['@playwright/test'];\n }\n delete jsonObj.dependencies['playwright'];\n delete jsonObj.devDependencies['playwright'];\n }\n if (config.doesContainsSubPackageJsons) {\n // We don't allow non-array workspaces in monorepo.\n jsonObj.workspaces = Array.isArray(jsonObj.workspaces)\n ? merge.all([jsonObj.workspaces, ['packages/*']], {\n arrayMerge: combineMerge,\n })\n : ['packages/*'];\n } else if (Array.isArray(jsonObj.workspaces)) {\n jsonObj.workspaces = jsonObj.workspaces.filter(\n (workspace) =>\n globbySync(workspace, {\n dot: true,\n cwd: config.dirPath,\n gitignore: true,\n }).length > 0\n );\n if (jsonObj.workspaces.length === 0) {\n delete jsonObj.workspaces;\n }\n }\n }\n if (config.depending.wb) {\n if (jsonObj.dependencies['@willbooster/shared-scripts'] || jsonObj.dependencies['@willbooster/wb']) {\n dependencies.push('@willbooster/wb');\n } else {\n devDependencies.push('@willbooster/wb');\n }\n for (const [key, value] of Object.entries(jsonObj.scripts as Record<string, string>)) {\n jsonObj.scripts[key] = value.replace(/wb\\s+db/, 'wb prisma');\n }\n }\n\n if (\n config.doesContainsJavaScript ||\n config.doesContainsJavaScriptInPackages ||\n config.doesContainsTypeScript ||\n config.doesContainsTypeScriptInPackages\n ) {\n devDependencies.push('eslint@8.57.0', 'micromatch');\n // TODO: not needed anymore?\n if (config.doesContainsTypeScriptInPackages) {\n devDependencies.push('@typescript-eslint/parser');\n }\n }\n\n if (config.doesContainsTypeScript || config.doesContainsTypeScriptInPackages) {\n devDependencies.push('typescript');\n }\n\n if (config.eslintBase) {\n devDependencies.push(...eslintDeps[config.eslintBase]);\n }\n\n if (config.isWillBoosterConfigs) {\n dependencies = dependencies.filter((dep) => !dep.includes('@willbooster/'));\n devDependencies = devDependencies.filter((dep) => !dep.includes('@willbooster/'));\n }\n\n if (!jsonObj.name) {\n jsonObj.name = path.basename(config.dirPath);\n }\n\n if (config.doesContainsSubPackageJsons) {\n jsonObj.private = true;\n }\n if (!jsonObj.license) {\n jsonObj.license = 'UNLICENSED';\n }\n if (!jsonObj.private && jsonObj.license !== 'UNLICENSED' && rootConfig.isPublicRepo) {\n jsonObj.publishConfig ??= {};\n jsonObj.publishConfig.access ??= 'public';\n }\n const [owner] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (owner === 'WillBooster' || owner === 'WillBoosterLab') {\n jsonObj.author = 'WillBooster Inc.';\n }\n if (!config.isRoot && jsonObj.private && !jsonObj.main) {\n // Make VSCode possible to refactor code across subpackages.\n jsonObj.main = './src';\n }\n\n // Since `\"resolutions\": { \"npm/chalk\": \"^4.1.2\" },` causes \"Invalid npm token\"\n delete jsonObj.resolutions?.['npm/chalk'];\n\n if (!config.doesContainsSubPackageJsons) {\n if (!config.doesContainsJavaScript && !config.doesContainsTypeScript) {\n delete jsonObj.scripts.lint;\n delete jsonObj.scripts['lint-fix'];\n jsonObj.scripts.cleanup = jsonObj.scripts.cleanup?.replace(' && yarn lint-fix', '');\n } else {\n jsonObj.scripts['lint-fix'] += EslintUtil.getLintFixSuffix(config);\n }\n\n if (config.doesContainsPubspecYaml) {\n jsonObj.scripts.lint = 'flutter analyze';\n jsonObj.scripts['lint-fix'] = 'yarn lint';\n const dirs = ['lib', 'test', 'test_driver'].filter((dir) => fs.existsSync(path.resolve(config.dirPath, dir)));\n if (dirs.length > 0) {\n jsonObj.scripts['format-code'] = `flutter format $(find ${dirs.join(\n ' '\n )} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`;\n jsonObj.scripts.format += ` && yarn format-code`;\n }\n }\n\n if (config.doesContainsPoetryLock) {\n if (jsonObj.scripts.postinstall === 'poetry install') {\n delete jsonObj.scripts.postinstall;\n }\n const pythonFiles = await globby('**/*.py', {\n cwd: config.dirPath,\n dot: true,\n gitignore: true,\n ignore: ['test-fixtures'],\n });\n const dirNameSet = new Set<string>();\n for (const pythonFile of pythonFiles) {\n const [first, second] = pythonFile.split(/[/\\\\]/);\n if (second) {\n dirNameSet.add(first);\n }\n }\n if (dirNameSet.size > 0) {\n const dirNamesStr = [...dirNameSet].join(' ');\n jsonObj.scripts['format-code'] =\n `poetry run isort --profile black ${dirNamesStr} && poetry run black ${dirNamesStr}`;\n if (jsonObj.scripts.lint) {\n jsonObj.scripts.lint = `poetry run flake8 ${dirNamesStr} && ${jsonObj.scripts.lint}`;\n } else {\n jsonObj.scripts.lint = `poetry run flake8 ${dirNamesStr}`;\n jsonObj.scripts['lint-fix'] = 'yarn lint';\n }\n jsonObj.scripts.format += ` && yarn format-code`;\n poetryDevDependencies.push('black', 'isort', 'flake8');\n }\n }\n\n if (config.repository) {\n jsonObj.repository = config.repository;\n }\n }\n\n if (config.depending.blitz) {\n dependencies.push(\n `blitz@${BLITZ_VERSION}`,\n `@blitzjs/auth@${BLITZ_VERSION}`,\n `@blitzjs/next@${BLITZ_VERSION}`,\n `@blitzjs/rpc@${BLITZ_VERSION}`,\n `next@${NEXT_VERSION}`\n );\n // Prefer eslint-config-next's dependencies\n devDependencies = devDependencies.filter((d) => d !== 'eslint-plugin-react' && d !== 'eslint-plugin-react-hooks');\n if (!jsonObj.scripts['gen-code']?.startsWith('blitz codegen')) {\n jsonObj.scripts['gen-code'] = 'blitz codegen';\n } else if (!jsonObj.scripts['gen-code'].includes('blitz prisma generate')) {\n jsonObj.scripts['gen-code'] = jsonObj.scripts['gen-code'].replace(\n 'blitz codegen',\n 'blitz codegen && blitz prisma generate'\n );\n }\n } else if (config.depending.prisma && !jsonObj.scripts['gen-code']?.startsWith('prisma generate')) {\n jsonObj.scripts['gen-code'] = 'prisma generate';\n }\n\n if (config.depending.next) {\n // To prevent multiple versions of @types/react from mixing.\n delete jsonObj.devDependencies['@types/react'];\n }\n\n if (!jsonObj.dependencies?.prettier) {\n // Because @types/prettier blocks prettier execution.\n delete jsonObj.devDependencies['@types/prettier'];\n }\n\n if (Object.keys(jsonObj.dependencies).length === 0) {\n delete jsonObj.dependencies;\n }\n if (Object.keys(jsonObj.devDependencies).length === 0) {\n delete jsonObj.devDependencies;\n }\n if (Object.keys(jsonObj.peerDependencies).length === 0) {\n delete jsonObj.peerDependencies;\n }\n\n let newJsonText = JSON.stringify(jsonObj);\n newJsonText = await fixScriptNames(jsonObj.scripts, newJsonText, config);\n await fs.promises.writeFile(filePath, newJsonText);\n\n if (!skipAddingDeps) {\n // We cannot add dependencies which are already included in devDependencies.\n dependencies = dependencies.filter((dep) => !jsonObj.devDependencies?.[dep]);\n if (dependencies.length > 0) {\n spawnSync('yarn', ['add', ...new Set(dependencies)], config.dirPath);\n }\n // We cannot add devDependencies which are already included in dependencies.\n devDependencies = devDependencies.filter((dep) => !jsonObj.dependencies?.[dep]);\n if (devDependencies.length > 0) {\n spawnSync('yarn', ['add', '-D', ...new Set(devDependencies)], config.dirPath);\n }\n if (poetryDevDependencies.length > 0) {\n spawnSync('poetry', ['add', '--group', 'dev', ...new Set(poetryDevDependencies)], config.dirPath);\n }\n }\n}\n\n// TODO: remove the following migration code in future\nasync function removeDeprecatedStuff(\n jsonObj: SetRequired<PackageJson, 'scripts' | 'dependencies' | 'devDependencies'>\n): Promise<void> {\n if (jsonObj.author === 'WillBooster LLC') {\n jsonObj.author = 'WillBooster Inc.';\n }\n delete jsonObj.scripts['sort-package-json'];\n delete jsonObj.scripts['sort-all-package-json'];\n delete jsonObj.scripts['typecheck/warn'];\n delete jsonObj.scripts['typecheck:gen-code'];\n delete jsonObj.scripts['typecheck:codegen'];\n delete jsonObj.dependencies['@willbooster/shared-scripts'];\n delete jsonObj.dependencies['tslib'];\n delete jsonObj.devDependencies['@willbooster/eslint-config'];\n delete jsonObj.devDependencies['@willbooster/eslint-config-react'];\n delete jsonObj.devDependencies['@willbooster/renovate-config'];\n delete jsonObj.devDependencies['@willbooster/shared-scripts'];\n delete jsonObj.devDependencies['@willbooster/tsconfig'];\n delete jsonObj.devDependencies['eslint-import-resolver-node'];\n delete jsonObj.devDependencies['eslint-plugin-prettier'];\n delete jsonObj.devDependencies['lerna'];\n // To install the latest pinst\n delete jsonObj.devDependencies['pinst'];\n delete jsonObj.scripts['flutter-format'];\n delete jsonObj.scripts['format-flutter'];\n delete jsonObj.scripts['python-format'];\n delete jsonObj.scripts['format-python'];\n delete jsonObj.scripts['prettier'];\n for (const deps of Object.values(eslintDeps)) {\n for (const dep of deps) {\n delete jsonObj.devDependencies[dep];\n }\n }\n await promisePool.run(() => fs.promises.rm('lerna.json', { force: true }));\n}\n\nexport function generateScripts(config: PackageConfig): Record<string, string> {\n let scripts: Record<string, string> = {\n cleanup: 'yarn format && yarn lint-fix',\n format: `sort-package-json && yarn prettify`,\n lint: `eslint --color \"./{${getSrcDirs(config)}}/**/*.{${extensions.eslint.join(',')}}\"`,\n 'lint-fix': 'yarn lint --fix',\n prettify: `prettier --cache --color --write \"**/{.*/,}*.{${extensions.prettier.join(',')}}\" \"!**/test-fixtures/**\"`,\n typecheck: 'tsc --noEmit --Pretty',\n };\n if (config.doesContainsSubPackageJsons) {\n const oldTest = scripts.test;\n scripts = merge(\n { ...scripts },\n {\n format: `sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format`,\n lint: `yarn workspaces foreach --all --parallel --verbose run lint`,\n 'lint-fix': 'yarn workspaces foreach --all --parallel --verbose run lint-fix',\n prettify: `prettier --cache --color --write \"**/{.*/,}*.{${extensions.prettier.join(\n ','\n )}}\" \"!**/packages/**\" \"!**/test-fixtures/**\"`,\n // CI=1 prevents vitest from enabling watch.\n // FORCE_COLOR=3 make wb enable color output.\n test: 'CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test',\n typecheck: 'yarn workspaces foreach --all --parallel --verbose run typecheck',\n }\n );\n if (oldTest?.includes('wb test')) {\n scripts.test = oldTest;\n }\n } else if (config.depending.pyright) {\n scripts.typecheck = scripts.typecheck ? `${scripts.typecheck} && ` : '';\n scripts.typecheck += 'pyright';\n }\n\n if (!config.doesContainsTypeScript && !config.doesContainsTypeScriptInPackages) {\n delete scripts.typecheck;\n } else if (config.depending.wb) {\n scripts.typecheck = 'wb typecheck';\n }\n return scripts;\n}\n\nasync function generatePrettierSuffix(dirPath: string): Promise<string> {\n const filePath = path.resolve(dirPath, '.prettierignore');\n const existingContent = await fs.promises.readFile(filePath, 'utf8');\n const index = existingContent.indexOf(ignoreFileUtil.separatorPrefix);\n if (index < 0) return '';\n\n const originalContent = existingContent.slice(0, index);\n const lines = originalContent\n .split('\\n')\n .map((line) => {\n const newLine = line.trim();\n return newLine.endsWith('/') ? newLine.slice(0, -1) : newLine;\n })\n .filter((l) => l && !l.startsWith('#') && !l.includes('/'));\n\n return lines.map((line) => ` \"!**/${line}/**\"`).join('');\n}\n\nasync function fixScriptNames(\n scripts: PackageJson.Scripts,\n newJsonText: string,\n config: PackageConfig\n): Promise<string> {\n const oldAndNewScriptNames: [string, string][] = [];\n for (const [key] of Object.keys(scripts)) {\n if (key[0] !== ':' && key.includes(':')) {\n oldAndNewScriptNames.push([key, key.replaceAll(':', '-')]);\n }\n }\n if (oldAndNewScriptNames.length === 0) return newJsonText;\n\n for (const [oldName, newName] of oldAndNewScriptNames) {\n newJsonText = newJsonText.replaceAll(oldName, newName);\n }\n const files = await globby(['**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}', '**/Dockerfile'], {\n cwd: config.dirPath,\n dot: true,\n gitignore: true,\n });\n for (const file of files) {\n await promisePool.run(async () => {\n const filePath = path.join(config.dirPath, file);\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n let newContent = oldContent;\n for (const [oldName, newName] of oldAndNewScriptNames) {\n newContent = newContent.replaceAll(oldName, newName);\n }\n if (newContent !== oldContent) {\n await fs.promises.writeFile(filePath, newContent);\n }\n });\n }\n await promisePool.promiseAll();\n return newJsonText;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync } from '../utils/spawnUtil.js';\n\nimport { generateScripts } from './packageJson.js';\n\nconst settings = {\n preCommit: 'node node_modules/.bin/lint-staged',\n prePush: `yarn typecheck`,\n 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(),\n 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(),\n};\n\nexport async function generateHuskyrc(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateHuskyrc', async () => {\n await core(config);\n });\n}\n\nasync function core(config: PackageConfig): Promise<void> {\n const packageJsonPath = path.resolve(config.dirPath, 'package.json');\n const jsonText = await fs.promises.readFile(packageJsonPath, 'utf8');\n const packageJson = JSON.parse(jsonText);\n packageJson.scripts ||= {};\n delete packageJson.scripts['postinstall'];\n delete packageJson.scripts['postpublish'];\n delete packageJson.scripts['prepare'];\n delete packageJson.scripts['prepublishOnly'];\n delete packageJson.scripts['prepack'];\n delete packageJson.scripts['postpack'];\n\n const dirPath = path.resolve(config.dirPath, '.husky');\n await Promise.all([\n fs.promises.writeFile(packageJsonPath, JSON.stringify(packageJson, undefined, 2)),\n fs.promises.rm(dirPath, { force: true, recursive: true }),\n ]);\n spawnSync('yarn', ['dlx', 'husky-init', '--yarn2'], config.dirPath);\n\n const preCommitFilePath = path.resolve(dirPath, 'pre-commit');\n\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.huskyrc.json'), { force: true }));\n await promisePool.run(() => fs.promises.writeFile(preCommitFilePath, settings.preCommit + '\\n'));\n\n const { typecheck } = generateScripts(config);\n if (typecheck) {\n let prePush = config.repository?.startsWith('github:WillBoosterLab/') ? settings.prePushForLab : settings.prePush;\n prePush = prePush.replace(\n 'yarn typecheck',\n typecheck\n .replace('tsc ', 'node node_modules/.bin/tsc ')\n .replace('wb ', 'node node_modules/.bin/wb ')\n // pyright has no arguments\n .replace('pyright', 'node node_modules/.bin/pyright')\n );\n await promisePool.run(() =>\n fs.promises.writeFile(path.resolve(dirPath, 'pre-push'), prePush + '\\n', {\n mode: 0o755,\n })\n );\n }\n\n const postMergeCommands: string[] = [];\n if (config.versionsText) {\n postMergeCommands.push('run_if_changed \"\\\\..+-version\" \"asdf plugin update --all\"');\n }\n // Pythonがないとインストールできない処理系が存在するため、強制的に最初にインストールする。\n if (config.versionsText?.includes('python ')) {\n postMergeCommands.push('run_if_changed \"\\\\..+-version\" \"asdf install python\"');\n }\n if (config.versionsText) {\n postMergeCommands.push('run_if_changed \"\\\\..+-version\" \"asdf install\"');\n }\n const rmNextDirectory = config.depending.blitz || config.depending.next ? ' && rm -Rf .next' : '';\n postMergeCommands.push(`run_if_changed \"package\\\\.json\" \"yarn${rmNextDirectory}\"`);\n if (config.doesContainsPoetryLock) {\n postMergeCommands.push('run_if_changed \"poetry\\\\.lock\" \"poetry install\"');\n }\n if (config.depending.blitz) {\n postMergeCommands.push(\n 'run_if_changed \"db/schema.prisma\" \"node node_modules/.bin/blitz prisma migrate deploy\"',\n 'run_if_changed \"db/schema.prisma\" \"node node_modules/.bin/blitz prisma generate\"',\n 'run_if_changed \"db/schema.prisma\" \"node node_modules/.bin/blitz codegen\"'\n );\n } else if (config.depending.prisma) {\n postMergeCommands.push(\n 'run_if_changed \"prisma/schema.prisma\" \"node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy\"',\n 'run_if_changed \"prisma/schema.prisma\" \"node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate\"'\n );\n }\n const postMergeCommand = `${settings.postMerge}\\n\\n${postMergeCommands.join('\\n')}\\n`;\n await promisePool.run(() =>\n fs.promises.writeFile(path.resolve(dirPath, 'post-merge'), postMergeCommand, {\n mode: 0o755,\n })\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nfunction createTaskOptions(runner: string, args: string, name: string, extension: string): string {\n return ` <TaskOptions isEnabled=\"true\">\n <option name=\"arguments\" value=\"${args} $FilePathRelativeToProjectRoot$\" />\n <option name=\"checkSyntaxErrors\" value=\"false\" />\n <option name=\"description\" />\n <option name=\"exitCodeBehavior\" value=\"ERROR\" />\n <option name=\"fileExtension\" value=\"${extension}\" />\n <option name=\"immediateSync\" value=\"false\" />\n <option name=\"name\" value=\"${name} (.${extension})\" />\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=\"${runner}\" />\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`;\n}\n\nconst prettierContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectTasksOptions\">\n ${extensions.prettier.map((ext) => createTaskOptions('node', 'node_modules/.bin/prettier --cache --write', 'Prettier', ext)).join('')}\n </component>\n</project>\n`;\n\nconst biomeContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectTasksOptions\">\n ${extensions.prettier.map((ext) => createTaskOptions('bun', 'node_modules/.bin/biome check --apply', 'Biome', ext)).join('')}\n </component>\n</project>\n`;\n\nexport async function generateIdeaSettings(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateIdeaSettings', async () => {\n const dirPath = path.resolve(config.dirPath, '.idea');\n if (fs.existsSync(dirPath)) {\n const filePath = path.resolve(dirPath, 'watcherTasks.xml');\n await (config.doesContainsJavaScript ||\n config.doesContainsJavaScriptInPackages ||\n config.doesContainsTypeScript ||\n config.doesContainsTypeScriptInPackages ||\n (config.doesContainsPackageJson &&\n !config.doesContainsPubspecYaml &&\n !config.doesContainsGemfile &&\n !config.doesContainsGoMod &&\n !config.doesContainsPomXml)\n ? promisePool.run(() => fsUtil.generateFile(filePath, config.isBun ? biomeContent : prettierContent))\n : promisePool.run(() => fs.promises.rm(filePath, { force: true })));\n }\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { EslintUtil } from '../utils/eslintUtil.js';\nimport { extensions } from '../utils/extensions.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { getSrcDirs } from '../utils/srcDirectories.js';\n\nexport async function generateLintstagedrc(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateLintstagedrc', async () => {\n await core(config);\n });\n}\n\nasync function core(config: PackageConfig): Promise<void> {\n const packagePrefix = config.isRoot ? 'node node_modules/.bin/' : 'node ../../node_modules/.bin/';\n const lines: string[] = [];\n if (config.doesContainsJavaScript || config.doesContainsTypeScript) {\n const eslint = `\n '${getEslintKey(config)}': [${JSON.stringify(\n `${packagePrefix}eslint --fix${EslintUtil.getLintFixSuffix(config)}`\n )}, '${packagePrefix}prettier --cache --write'],`;\n lines.push(eslint);\n }\n const packagesFilter = config.isRoot ? \" && !file.includes('/packages/')\" : '';\n lines.push(`\n './**/*.{${extensions.prettier.join(',')}}': files => {\n ${config.doesContainsJavaScript || config.doesContainsTypeScript ? getEslintFilterForPrettier(config) : ''}\n const filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${packagesFilter});\n if (filteredFiles.length === 0) return [];\n const commands = [\\`${packagePrefix}prettier --cache --write \\${filteredFiles.join(' ')}\\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${packagePrefix}sort-package-json');\n }\n return commands;\n },`);\n if (config.doesContainsPubspecYaml) {\n lines.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 },`);\n }\n if (config.doesContainsPoetryLock) {\n lines.push(`\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],`);\n }\n\n const newContent = `${\n config.doesContainsJavaScript || config.doesContainsTypeScript ? \"const micromatch = require('micromatch');\" : ''\n }\n\nmodule.exports = {${lines.join('')}\n};\n`;\n\n const filePath = path.resolve(config.dirPath, '.lintstagedrc.cjs');\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.lintstagedrc.js'), { force: true }));\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.lintstagedrc.json'), { force: true }));\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n}\n\nfunction getEslintKey(config: PackageConfig): string {\n const dirs = getSrcDirs(config);\n return `./{${dirs.join(',')}}/**/*.{${extensions.eslint.join(',')}}`;\n}\n\nfunction getEslintFilterForPrettier(config: PackageConfig): string {\n return `files = micromatch.not(files, '${getEslintKey(config)}');`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function generateNextConfigJson(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateNextConfigJson', async () => {\n const filePath = ['js', 'mjs', 'cjs']\n .map((ext) => path.resolve(config.dirPath, `next.config.${ext}`))\n .find((p) => fs.existsSync(p));\n if (!filePath) return;\n\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n // Replace the JSON object from the file\n const newContent = oldContent.replace(/=\\s*{([\\S\\s]*)};/, (_, settingsText) => {\n if (!settingsText.includes('eslint:')) {\n settingsText += 'eslint: { ignoreDuringBuilds: true },';\n }\n if (!settingsText.includes('typescript:')) {\n settingsText += 'typescript: { ignoreBuildErrors: true },';\n }\n return `= {${settingsText}};`;\n });\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { ignoreFileUtil } from '../utils/ignoreFileUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst commonContent = `\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n`;\n\nexport async function generatePrettierignore(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generatePrettierignore', async () => {\n const filePath = path.resolve(config.dirPath, '.prettierignore');\n const content = (await fsUtil.readFileIgnoringError(filePath)) ?? '';\n const headUserContent = ignoreFileUtil.getHeadUserContent(content);\n const tailUserContent = ignoreFileUtil.getTailUserContent(content);\n\n const gitignoreFilePath = path.resolve(config.dirPath, '.gitignore');\n const gitignoreContent = (await ignoreFileUtil.readGitignoreWithoutSeparators(gitignoreFilePath)) || '';\n\n let additionalContent = '';\n if (config.doesContainsPubspecYaml) {\n additionalContent = `\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n`;\n }\n\n const newContent = headUserContent + commonContent + additionalContent + gitignoreContent + tailUserContent;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { overwriteMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst jsonObj = {\n venvPath: '.',\n venv: '.venv',\n};\n\nexport async function generatePyrightConfigJson(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generatePyrightConfigJson', async () => {\n let newSettings: unknown = cloneDeep(jsonObj);\n const filePath = path.resolve(config.dirPath, 'pyrightconfig.json');\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(oldContent);\n newSettings = merge.all([newSettings, oldSettings, newSettings], { arrayMerge: overwriteMerge });\n } catch {\n // do nothing\n }\n const newContent = JSON.stringify(newSettings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst semanticReleaseBadge =\n '[![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)';\n\nexport async function generateReadme(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateReadme', async () => {\n const filePath = path.resolve(config.dirPath, 'README.md');\n let newContent = await fs.promises.readFile(filePath, 'utf8');\n\n if (fs.existsSync(path.resolve(config.dirPath, '.releaserc.json'))) {\n newContent = insertBadge(newContent, semanticReleaseBadge);\n }\n\n const repository = config.repository?.slice(config.repository?.indexOf(':') + 1);\n const fileNames = fs.readdirSync(`${config.dirPath}/.github/workflows`);\n for (const fileName of fileNames) {\n if (!fileName.startsWith('test') && !fileName.startsWith('deploy')) continue;\n\n let badgeName = fileName;\n badgeName = badgeName[0].toUpperCase() + badgeName.slice(1, badgeName.indexOf('.'));\n badgeName = badgeName.replace('-', ' ');\n const badge = `[![${badgeName}](https://github.com/${repository}/actions/workflows/${fileName}/badge.svg)](https://github.com/${repository}/actions/workflows/${fileName})`;\n if (fs.existsSync(path.resolve(config.dirPath, `.github/workflows/${fileName}`))) {\n newContent = insertBadge(newContent, badge);\n }\n }\n\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n\nexport function insertBadge(readme: string, badge: string): string {\n // 既にbadgeがある場合は削除\n readme = readme.replace(badge, '').replaceAll(/\\n\\n\\n+/g, '\\n\\n');\n\n for (let i = 0; i < readme.length; i++) {\n if (readme[i - 1] === '\\n' && readme[i] === '\\n') {\n const before = readme.slice(0, i + 1);\n let after = readme.slice(i + 1);\n if (!after.startsWith('[') && !after.startsWith('!')) {\n after = `\\n${after}`;\n }\n return `${before}${badge}\\n${after}`;\n }\n }\n return `${readme}\\n${badge}\\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { overwriteMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nexport async function generateReleaserc(rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateReleaserc', async () => {\n const filePath = path.resolve(rootConfig.dirPath, '.releaserc.json');\n const settings = JSON.parse(await fs.promises.readFile(filePath, 'utf8'));\n const plugins = settings?.plugins || [];\n for (let i = 0; i < plugins.length; i++) {\n const plugin = Array.isArray(plugins[i]) ? plugins[i][0] : plugins[i];\n const oldConfig = (Array.isArray(plugins[i]) && plugins[i][1]) || {};\n if (plugin === '@semantic-release/commit-analyzer') {\n plugins[i] = [\n '@semantic-release/commit-analyzer',\n merge.all(\n [\n oldConfig,\n {\n preset: 'conventionalcommits',\n },\n ],\n { arrayMerge: overwriteMerge }\n ),\n ];\n } else if (plugin === '@semantic-release/github') {\n plugins[i] = [\n '@semantic-release/github',\n merge.all(\n [\n oldConfig,\n {\n // cf. https://github.com/semantic-release/semantic-release/issues/2204#issuecomment-1508417704\n successComment: false,\n failComment: false,\n labels: ['r: semantic-release'],\n releasedLabels: ['released :bookmark:'],\n },\n ],\n { arrayMerge: overwriteMerge }\n ),\n ];\n }\n }\n const newContent = JSON.stringify(settings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { overwriteMerge } from '../utils/mergeUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst jsonObj = {\n $schema: 'https://docs.renovatebot.com/renovate-schema.json',\n extends: ['github>WillBooster/willbooster-configs:renovate.json5'],\n};\n\ntype Settings = typeof jsonObj & { packageRules: { packageNames: string[]; enabled?: boolean }[] };\n\nexport async function generateRenovateJson(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateRenovateJson', async () => {\n let newSettings = cloneDeep(jsonObj) as Settings;\n const filePath = path.resolve(config.dirPath, 'renovate.json');\n if (fs.existsSync(`${filePath}5`)) {\n // Since it is difficult for parsing renovate.json5, we do nothing\n return;\n }\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(oldContent);\n newSettings = merge.all([newSettings, oldSettings, newSettings], {\n arrayMerge: overwriteMerge,\n }) as Settings;\n newSettings.extends = newSettings.extends.filter((item: string) => item !== '@willbooster');\n } catch {\n // do nothing\n }\n\n // Don't upgrade Next.js automatically\n if (config.depending.blitz) {\n newSettings.packageRules ??= [];\n if (!newSettings.packageRules.some((rule: { packageNames: string[] }) => rule.packageNames.includes('next'))) {\n newSettings.packageRules.push({ packageNames: ['next'], enabled: false });\n }\n }\n\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.dependabot'), { force: true }));\n await promisePool.run(() => fs.promises.rm(path.resolve(config.dirPath, '.renovaterc.json'), { force: true }));\n const newContent = JSON.stringify(newSettings);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","export function moveToBottom<TObj extends Record<TKey, unknown>, TKey extends string | number | symbol>(\n obj: TObj,\n key: TKey\n): TObj {\n const value = obj[key];\n delete obj[key];\n (obj as Record<TKey, unknown>)[key] = value;\n return obj;\n}\n\nexport function sortKeys<T extends Record<string, unknown>>(obj: T): T {\n const keyAndValues = Object.entries(obj).sort(([key1], [key2]) => key1.localeCompare(key2));\n for (const [key, value] of keyAndValues) {\n delete obj[key];\n (obj as Record<string, unknown>)[key] = value;\n\n // if value is an object, sort the keys of the object\n if (typeof value === 'object' && value !== null) {\n sortKeys(value as Record<string, unknown>);\n }\n }\n return obj;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport cloneDeep from 'lodash.clonedeep';\nimport type { TsConfigJson } from 'type-fest';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { sortKeys } from '../utils/objectUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst rootJsonObj = {\n compilerOptions: {\n target: 'ES2022', // because decorators should be transpiled to ES2022 on Node.js\n module: 'ESNext',\n moduleResolution: 'Node',\n jsx: 'react-jsx',\n alwaysStrict: true,\n strict: true,\n skipLibCheck: true, // because libraries may have broken types\n allowSyntheticDefaultImports: true, // allow `import React from 'react'`\n esModuleInterop: true, // allow default import from CommonJS/AMD/UMD modules\n resolveJsonModule: true, // allow to import JSON files\n declaration: true,\n sourceMap: true,\n importHelpers: false,\n outDir: 'dist',\n typeRoots: ['./node_modules/@types', './@types'],\n },\n include: [\n 'src/**/*',\n 'tests/**/*',\n 'scripts/**/*',\n 'packages/*/src/**/*',\n 'packages/*/tests/**/*',\n 'packages/*/scripts/**/*',\n ],\n};\n\nconst subJsonObj = {\n compilerOptions: {\n target: 'ES2022', // because decorators should be transpiled to ES2022 on Node.js\n module: 'ESNext',\n moduleResolution: 'Node',\n jsx: 'react-jsx',\n alwaysStrict: true,\n strict: true,\n skipLibCheck: true, // because libraries may have broken types\n allowSyntheticDefaultImports: true, // allow `import React from 'react'`\n esModuleInterop: true, // allow default import from CommonJS/AMD/UMD modules\n resolveJsonModule: true, // allow to import JSON files\n declaration: true,\n sourceMap: true,\n importHelpers: false,\n outDir: 'dist',\n typeRoots: ['../../node_modules/@types', '../../@types', './@types'],\n },\n include: ['src/**/*', 'tests/**/*', 'scripts/**/*'],\n};\n\nexport async function generateTsconfig(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateTsconfig', async () => {\n if (config.depending.blitz || config.depending.next) return;\n\n let newSettings = cloneDeep(config.isRoot ? rootJsonObj : subJsonObj) as TsConfigJson;\n if (!config.doesContainsJsxOrTsx && !config.doesContainsJsxOrTsxInPackages) {\n delete newSettings.compilerOptions?.jsx;\n }\n if (config.isRoot && !config.doesContainsSubPackageJsons) {\n newSettings.include = newSettings.include?.filter((dirPath: string) => !dirPath.startsWith('packages/*/'));\n }\n if (config.isEsmPackage) {\n newSettings.compilerOptions = {\n ...newSettings.compilerOptions,\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n };\n }\n\n const filePath = path.resolve(config.dirPath, 'tsconfig.json');\n try {\n const existingContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = JSON.parse(existingContent) as TsConfigJson;\n if (oldSettings.extends === './node_modules/@willbooster/tsconfig/tsconfig.json') {\n delete oldSettings.extends;\n }\n // Don't modify \"target\", \"module\" and \"moduleResolution\".\n delete newSettings.compilerOptions?.target;\n if (!config.isEsmPackage) {\n delete newSettings.compilerOptions?.module;\n delete newSettings.compilerOptions?.moduleResolution;\n }\n if (oldSettings.compilerOptions?.jsx) {\n delete newSettings.compilerOptions?.jsx;\n }\n newSettings = merge.all([newSettings, oldSettings, newSettings], { arrayMerge: combineMerge });\n newSettings.include = newSettings.include?.filter(\n (dirPath: string) => !dirPath.includes('@types') && !dirPath.includes('__tests__')\n );\n } catch {\n // do nothing\n }\n sortKeys(newSettings);\n newSettings.include?.sort();\n const newContent = JSON.stringify(newSettings);\n // Don't use old decorator\n delete newSettings.compilerOptions?.experimentalDecorators;\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { sortKeys } from '../utils/objectUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst excludeFilePatterns = [\n '**/.git/objects/**',\n '**/.git/subtree-cache/**',\n '**/node_modules/**',\n '**/tmp/**',\n '**/temp/**',\n '**/dist/**',\n];\n\nexport async function generateVscodeSettings(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateVscodeSettings', async () => {\n try {\n const filePath = path.resolve(config.dirPath, '.vscode', 'settings.json');\n const existingContent = await fs.promises.readFile(filePath, 'utf8');\n let settings = JSON.parse(existingContent);\n for (const excludeFilePattern of excludeFilePatterns) {\n settings = merge.all([settings, excludeSetting(excludeFilePattern)]);\n }\n if (config.doesContainsPoetryLock) {\n settings = merge.all([settings, excludeSetting('**/.venv/**')]);\n }\n if (config.depending.next) {\n settings = merge.all([settings, excludeSetting('**/.next/**')]);\n }\n sortKeys(settings ?? {});\n const newContent = JSON.stringify(settings, undefined, 2);\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n } catch {\n // do nothing\n }\n });\n}\n\nfunction excludeSetting(excludeFilePattern: string): unknown {\n return {\n 'files.watcherExclude': {\n [excludeFilePattern]: true,\n },\n };\n}\n","/* eslint-disable unicorn/no-null */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport merge from 'deepmerge';\nimport yaml from 'js-yaml';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { combineMerge } from '../utils/mergeUtil.js';\nimport { moveToBottom, sortKeys } from '../utils/objectUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\ninterface Workflow {\n name: string;\n on: On;\n concurrency?: Concurrency;\n jobs: { [key: string]: Job };\n}\n\ninterface Concurrency {\n group: string;\n 'cancel-in-progress': boolean;\n}\n\ninterface On {\n issues?: Types;\n pull_request?: PullRequest;\n pull_request_target?: Types;\n push?: Push;\n schedule?: Schedule[];\n workflow_dispatch?: null;\n}\n\ninterface PullRequest {\n 'paths-ignore'?: string[];\n types?: string[];\n}\n\ninterface Push {\n branches: string[];\n 'paths-ignore'?: string[];\n}\n\ninterface Schedule {\n cron: string;\n}\n\ninterface Types {\n types: string[];\n}\n\ninterface Job {\n uses: string;\n secrets?: Record<string, unknown>;\n with?: Record<string, unknown>;\n}\n\nconst workflows = {\n test: {\n name: 'Test',\n on: {\n pull_request: {\n 'paths-ignore': ['**.md', '**/docs/**'],\n },\n push: {\n branches: ['main', 'wbfy'],\n 'paths-ignore': ['**.md', '**/docs/**'],\n },\n },\n // cf. https://docs.github.com/en/actions/using-jobs/using-concurrency#example-only-cancel-in-progress-jobs-or-runs-for-the-current-workflow\n concurrency: {\n group: '${{ github.workflow }}-${{ github.ref }}',\n 'cancel-in-progress': true,\n },\n jobs: {\n test: {\n uses: 'WillBooster/reusable-workflows/.github/workflows/test.yml@main',\n },\n },\n },\n release: {\n name: 'Release',\n on: {\n push: {\n branches: [],\n },\n },\n concurrency: {\n group: '${{ github.workflow }}',\n 'cancel-in-progress': false,\n },\n jobs: {\n release: {\n uses: 'WillBooster/reusable-workflows/.github/workflows/release.yml@main',\n },\n },\n },\n wbfy: {\n name: 'Willboosterify',\n on: {\n workflow_dispatch: null,\n },\n jobs: {\n wbfy: {\n uses: 'WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main',\n },\n },\n },\n 'wbfy-merge': {\n name: 'Merge wbfy',\n on: {\n workflow_dispatch: null,\n },\n jobs: {\n 'wbfy-merge': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main',\n },\n },\n },\n 'semantic-pr': {\n name: 'Lint PR title',\n on: {\n pull_request_target: {\n types: ['opened', 'edited', 'synchronize'],\n },\n },\n jobs: {\n 'semantic-pr': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main',\n },\n },\n },\n sync: {\n name: 'Sync',\n on: {},\n jobs: {\n sync: { uses: 'WillBooster/reusable-workflows/.github/workflows/sync.yml@main' },\n },\n },\n 'notify-ready': {\n name: 'Notify ready',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'notify-ready': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main',\n secrets: {\n DISCORD_WEBHOOK_URL: '${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}',\n },\n },\n },\n },\n 'close-comment': {\n name: 'Add close comment',\n on: {\n pull_request: {\n types: ['opened'],\n },\n },\n jobs: {\n 'close-comment': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main',\n },\n },\n },\n 'add-issue-to-project': {\n name: 'Add issue to GitHub project',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'add-issue-to-project': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main',\n secrets: {\n GH_PROJECT_URL: '${{ secrets.GH_PROJECT_URL }}',\n },\n },\n },\n },\n 'add-focused-issue-to-project': {\n name: 'Add focused issue to GitHub project',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'add-focused-issue-to-project': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main',\n with: {\n label: 'focused :dart:',\n },\n secrets: {\n GH_PROJECT_URL: 'https://github.com/orgs/WillBooster/projects/7',\n },\n },\n },\n },\n 'add-ready-issue-to-project': {\n name: 'Add ready issue to GitHub project',\n on: {\n issues: {\n types: ['labeled'],\n },\n },\n jobs: {\n 'add-ready-issue-to-project': {\n uses: 'WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main',\n with: {\n labeled: 'ready :rocket:',\n labelOperator: 'OR',\n },\n secrets: {\n GH_PROJECT_URL: 'https://github.com/orgs/WillBoosterLab/projects/5',\n },\n },\n },\n },\n} as const;\n\ntype KnownKind = keyof typeof workflows | 'deploy';\n\nexport async function generateWorkflows(rootConfig: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateWorkflow', async () => {\n const workflowsPath = path.resolve(rootConfig.dirPath, '.github', 'workflows');\n await fs.promises.mkdir(workflowsPath, { recursive: true });\n\n // Remove config of semantic pull request\n const semanticYmlPath = path.resolve(rootConfig.dirPath, '.github', 'semantic.yml');\n await promisePool.run(() => fs.promises.rm(semanticYmlPath, { force: true, recursive: true }));\n\n const entries = await fs.promises.readdir(workflowsPath, { withFileTypes: true });\n const fileNameSet = new Set([\n 'test.yml',\n 'wbfy.yml',\n 'wbfy-merge.yml',\n 'semantic-pr.yml',\n 'close-comment.yml',\n 'add-issue-to-project.yml',\n 'add-focused-issue-to-project.yml',\n ...entries.filter((dirent) => dirent.isFile() && dirent.name.endsWith('.yml')).map((dirent) => dirent.name),\n ]);\n if (rootConfig.depending.semanticRelease) {\n fileNameSet.add('release.yml');\n }\n if (rootConfig.isPublicRepo || rootConfig.repository?.startsWith('github:WillBoosterLab/')) {\n fileNameSet.add('add-ready-issue-to-project.yml');\n fileNameSet.add('notify-ready.yml');\n }\n\n for (const fileName of fileNameSet) {\n // 実際はKnownKind以外の値も代入されることに注意\n const kind = path.basename(fileName, '.yml') as KnownKind;\n await promisePool.run(() => writeWorkflowYaml(rootConfig, workflowsPath, kind));\n }\n });\n}\n\nasync function writeWorkflowYaml(config: PackageConfig, workflowsPath: string, kind: KnownKind): Promise<void> {\n let newSettings = cloneDeep(workflows[kind as keyof typeof workflows] ?? {}) as Workflow;\n const filePath = path.join(workflowsPath, `${kind}.yml`);\n try {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n const oldSettings = yaml.load(oldContent) as Workflow;\n newSettings = merge.all([newSettings, oldSettings, newSettings], { arrayMerge: combineMerge }) as Workflow;\n } catch {\n // do nothing\n }\n\n if (kind.startsWith('deploy')) {\n newSettings = {\n ...newSettings,\n concurrency: {\n group: '${{ github.workflow }}',\n 'cancel-in-progress': false,\n },\n };\n // Move jobs to the bottom\n if (newSettings.jobs) {\n moveToBottom(newSettings, 'jobs');\n }\n if (newSettings.on?.push) {\n newSettings.on.push['paths-ignore'] = [\n ...new Set<string>([...(newSettings.on.push['paths-ignore'] ?? []), '**.md', '**/docs/**']),\n ];\n }\n }\n\n for (const job of Object.values(newSettings.jobs)) {\n // Ignore non-reusable workflows\n if (!job.uses?.includes?.('/reusable-workflows/')) return;\n\n normalizeJob(config, job, kind);\n }\n\n switch (kind) {\n case 'release': {\n if (newSettings.on?.schedule) {\n delete newSettings.on.push;\n } else if (newSettings.on?.push && config.release.branches.length > 0) {\n newSettings.on.push.branches = config.release.branches;\n } else {\n // Don't use release.yml if release branch is not specified\n await fs.promises.rm(path.join(workflowsPath, 'release.yml'), { force: true });\n return;\n }\n break;\n }\n case 'test': {\n if (newSettings.on?.push) {\n newSettings.on.push.branches = newSettings.on.push.branches.filter((branch) => branch !== 'renovate/**');\n }\n break;\n }\n case 'wbfy': {\n if (newSettings.on) setSchedule(newSettings, 20, 24);\n break;\n }\n case 'wbfy-merge': {\n setSchedule(newSettings, 1, 4);\n break;\n }\n // No default\n }\n migrateWorkflow(newSettings);\n await writeYaml(newSettings, filePath);\n\n if (kind === 'release') {\n await fs.promises.rm(path.join(workflowsPath, 'semantic-release.yml'), { force: true });\n } else if (kind === 'sync') {\n await fs.promises.rm(path.join(workflowsPath, 'sync-init.yml'), { force: true });\n if (!newSettings.jobs.sync || !newSettings.jobs.sync.with) return;\n\n newSettings.jobs['sync-force'] = newSettings.jobs.sync;\n const params = newSettings.jobs.sync.with.sync_params_without_dest;\n if (!params) return;\n\n newSettings.jobs.sync.with.sync_params_without_dest = `--force ${params}`;\n newSettings.name = 'Force to Sync';\n newSettings.on = { workflow_dispatch: null };\n delete newSettings.jobs.sync;\n await writeYaml(newSettings, path.join(workflowsPath, 'sync-force.yml'));\n }\n}\n\nfunction normalizeJob(config: PackageConfig, job: Job, kind: KnownKind): void {\n job.with ||= {};\n job.secrets ||= {};\n\n if (\n kind === 'test' ||\n kind === 'release' ||\n kind === 'wbfy' ||\n kind === 'wbfy-merge' ||\n kind === 'add-issue-to-project' ||\n kind === 'add-focused-issue-to-project' ||\n kind === 'add-ready-issue-to-project'\n ) {\n job.secrets['GH_TOKEN'] = config.isPublicRepo ? '${{ secrets.PUBLIC_GH_BOT_PAT }}' : '${{ secrets.GH_BOT_PAT }}';\n }\n if (config.release.npm && (kind === 'release' || kind === 'test')) {\n job.secrets['NPM_TOKEN'] = '${{ secrets.NPM_TOKEN }}';\n }\n if (job.secrets['FIREBASE_TOKEN']) {\n job.secrets['GCP_SA_KEY_JSON_FOR_FIREBASE'] = '${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}';\n delete job.secrets['FIREBASE_TOKEN'];\n }\n if (\n (job.secrets['DISCORD_WEBHOOK_URL'] && (kind === 'release' || kind.startsWith('deploy'))) ||\n (job.with.server_url && kind.startsWith('deploy'))\n ) {\n job.secrets['DISCORD_WEBHOOK_URL'] = '${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}';\n }\n\n if (kind === 'sync') {\n const params = job.with?.sync_params_without_dest;\n if (params) {\n job.with.sync_params_without_dest = params.toString().replace('sync ', '');\n }\n }\n\n if (config.repository?.startsWith('github:WillBooster/')) {\n job.uses = job.uses.replace('WillBoosterLab/', 'WillBooster/');\n } else if (config.repository?.startsWith('github:WillBoosterLab/')) {\n job.uses = job.uses.replace('WillBooster/', 'WillBoosterLab/');\n }\n\n // Remove deprecated parameters\n migrateJob(job);\n\n // Don't use `fly deploy --json` since it causes an error\n if (kind.startsWith('deploy') && job.secrets['FLY_API_TOKEN'] && job.with['deploy_command']) {\n job.with['deploy_command'] = job.with['deploy_command'].toString().replace(/\\s+--json/, '');\n }\n if (config.doesContainsDockerfile) {\n if (job.with['ci_size'] !== 'extra-large' && (kind.startsWith('deploy') || kind.startsWith('test'))) {\n job.with['ci_size'] = 'large';\n }\n if (kind.startsWith('deploy')) {\n job.with['cpu_arch'] = 'X64';\n }\n }\n // Because github.event.repository.private is always true if job is scheduled\n if (kind === 'release' || kind === 'test' || kind === 'wbfy' || kind === 'wbfy-merge' || kind.startsWith('deploy')) {\n if (config.isPublicRepo) {\n job.with['github_hosted_runner'] = true;\n }\n } else {\n delete job.with['github_hosted_runner'];\n }\n\n if (Object.keys(job.with).length > 0) {\n sortKeys(job.with);\n } else {\n delete job.with;\n }\n if (Object.keys(job.secrets).length > 0) {\n // Move secrets prop after with prop\n const newSecrets = sortKeys(job.secrets);\n delete job.secrets;\n job.secrets = newSecrets;\n } else {\n delete job.secrets;\n }\n}\n\nfunction setSchedule(newSettings: Workflow, inclusiveMinHourJst: number, exclusiveMaxHourJst: number): void {\n const [minuteUtc, hourUtc] = ((newSettings.on.schedule?.[0]?.cron as string) ?? '').split(' ').map(Number);\n if (minuteUtc !== 0 && Number.isInteger(hourUtc)) {\n const hourJst = (hourUtc + 9) % 24;\n const inRange =\n inclusiveMinHourJst < exclusiveMaxHourJst\n ? inclusiveMinHourJst <= hourJst && hourJst < exclusiveMaxHourJst\n : inclusiveMinHourJst <= hourJst || hourJst < exclusiveMaxHourJst;\n if (inRange) return;\n }\n\n const minJst = 1 + Math.floor(Math.random() * 59);\n const hourJst = inclusiveMinHourJst + Math.floor(Math.random() * (exclusiveMaxHourJst - inclusiveMinHourJst));\n const cron = `${minJst} ${(hourJst - 9 + 24) % 24} * * *`;\n newSettings.on.schedule = [{ cron }];\n}\n\nasync function writeYaml(newSettings: Workflow, filePath: string): Promise<void> {\n const yamlText = yaml.dump(newSettings, {\n lineWidth: -1,\n noCompatMode: true,\n styles: {\n '!!null': 'empty',\n },\n });\n await fs.promises.writeFile(filePath, yamlText);\n}\n\nfunction migrateWorkflow(newSettings: Workflow): void {\n // TODO: Remove them after 2023-03-31\n delete newSettings.jobs['add-to-project'];\n}\n\nfunction migrateJob(job: Job): void {\n // TODO: Remove them after 2023-03-31\n if (!job.with) return;\n delete job.with['non_self_hosted'];\n delete job.with['notify_discord'];\n delete job.with['require_fly'];\n delete job.with['require_gcloud'];\n if (job.with['dot_env_path'] === '.env') {\n delete job.with['dot_env_path'];\n }\n delete job.with['cpu_arch'];\n delete job.with['label'];\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { ConfigurationValueMap } from '@yarnpkg/core';\nimport yaml from 'js-yaml';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { promisePool } from '../utils/promisePool.js';\nimport { spawnSync, spawnSyncWithStringResult } from '../utils/spawnUtil.js';\n\ninterface Settings extends Partial<ConfigurationValueMap> {\n defaultSemverRangePrefix: string;\n nmMode: string;\n nodeLinker: string;\n plugins?: Plugin[];\n}\n\ninterface Plugin {\n checksum: string;\n path: string;\n spec: string;\n}\n\nexport async function generateYarnrcYml(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateYarnrcYml', async () => {\n const currentVersion = spawnSyncWithStringResult('yarn', ['--version'], config.dirPath);\n const latestVersion = getLatestVersion('@yarnpkg/cli', config.dirPath);\n if (getMajorNumber(currentVersion) <= getMajorNumber(latestVersion) && currentVersion !== latestVersion) {\n spawnSync('yarn', ['set', 'version', latestVersion], config.dirPath, 1);\n }\n\n const releasesPath = path.join(config.dirPath, '.yarn', 'releases');\n await fs.promises.mkdir(releasesPath, { recursive: true });\n for (const file of await fs.promises.readdir(releasesPath)) {\n if (file.startsWith('yarn-') && !file.startsWith(`yarn-${latestVersion}.`)) {\n await promisePool.run(() => fs.promises.rm(path.join(releasesPath, file)));\n console.log('Removed', path.join(releasesPath, file));\n }\n }\n\n const yarnrcPath = path.resolve(config.dirPath, '.yarnrc');\n await promisePool.run(() => fs.promises.rm(yarnrcPath, { force: true }));\n\n const yarnrcYmlPath = path.resolve(config.dirPath, '.yarnrc.yml');\n const settings = yaml.load(await fs.promises.readFile(yarnrcYmlPath, 'utf8')) as Settings;\n settings.defaultSemverRangePrefix = '';\n settings.nodeLinker = 'node-modules';\n settings.nmMode = 'hardlinks-global';\n delete settings.compressionLevel;\n if (settings.injectEnvironmentFiles?.length === 0) {\n delete settings.injectEnvironmentFiles;\n }\n // cf. https://github.com/yarnpkg/berry/pull/4698\n settings.enableGlobalCache = true;\n const originalLength = settings.plugins?.length ?? 0;\n settings.plugins = settings.plugins?.filter((p) => p.path !== '.yarn/plugins/undefined.cjs') ?? [];\n if (settings.plugins.length !== originalLength) {\n const pluginPath = path.resolve(config.dirPath, '.yarnrc', 'undefined.cjs');\n await promisePool.run(() => fs.promises.rm(pluginPath, { force: true }));\n }\n if (settings.plugins.length === 0) {\n delete settings.plugins;\n }\n await fs.promises.writeFile(yarnrcYmlPath, yaml.dump(settings, { lineWidth: -1 }));\n\n spawnSync('yarn', ['dlx', 'yarn-plugin-auto-install'], config.dirPath);\n });\n}\n\nexport function getLatestVersion(packageName: string, dirPath: string): string {\n const versionsJson = spawnSyncWithStringResult('npm', ['show', packageName, 'versions', '--json'], dirPath);\n const versions = JSON.parse(versionsJson) as string[];\n return versions.at(-1) as string;\n}\nfunction getMajorNumber(version: string): number {\n const [major] = version.split('.');\n return Number(major);\n}\n","import { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { gitHubUtil, hasGitHubToken, octokit } from '../utils/githubUtil.js';\n\nexport async function setupLabels(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('setupLabels', async () => {\n if (!hasGitHubToken) return;\n\n const [owner, repo] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (!owner || !repo) return;\n if (owner !== 'WillBooster' && owner !== 'WillBoosterLab') return;\n\n try {\n await setupLabel(owner, repo, 'd1: x-easy :hedgehog:', 'EDE9FE');\n await setupLabel(owner, repo, 'd2: easy :rabbit2:', 'DDD6FE');\n await setupLabel(owner, repo, 'd3: medium :ox:', 'C4B5FD');\n await setupLabel(owner, repo, 'd4: hard :squid:', 'A78BFA');\n await setupLabel(owner, repo, 'd5: x-hard :whale2:', '8B5CF6');\n await setupLabel(owner, repo, 'p1: critical :fire::fire::fire:', 'EF4444');\n await setupLabel(owner, repo, 'p2: urgent :fire::fire:', 'F87171');\n await setupLabel(owner, repo, 'p3: important :fire:', 'FCA5A5');\n await setupLabel(owner, repo, 'p4: nice to have :droplet:', 'FECACA');\n await setupLabel(owner, repo, 'r: blitz', '5300bc');\n await setupLabel(owner, repo, 'r: firebase', 'ffca28');\n await setupLabel(owner, repo, 'r: prisma', '0c344b');\n await setupLabel(owner, repo, 'r: react', '61dafb');\n await setupLabel(owner, repo, 'r: svelte', 'ff3e00');\n await setupLabel(owner, repo, 'r: semantic-release', '494949');\n await setupLabel(owner, repo, 'ready :rocket:', '22C55E');\n await setupLabel(owner, repo, 'review requested :mag:', 'FBCA04');\n await setupLabel(owner, repo, 'released :bookmark:', '6366F1');\n await setupLabel(owner, repo, 's: 0.5h :clock1230:', 'F3F4F6');\n await setupLabel(owner, repo, 's: 1h :clock1:', 'E5E7EB');\n await setupLabel(owner, repo, 's: 2h :clock2:', 'D1D5DB');\n await setupLabel(owner, repo, 's: 3h :clock3:', '9CA3AF');\n await setupLabel(owner, repo, 's: 5h :clock5:', '6B7280');\n await setupLabel(owner, repo, 's: 8h :clock8:', '4B5563');\n await setupLabel(owner, repo, 's: 13h :clock1:', '374151');\n await setupLabel(owner, repo, 't: build :hammer:', 'BFDBFE');\n await setupLabel(owner, repo, 't: chore :broom:', 'BFDBFE');\n await setupLabel(owner, repo, 't: ci :construction_worker:', 'BFDBFE');\n await setupLabel(owner, repo, 't: docs :memo:', 'BFDBFE');\n await setupLabel(owner, repo, 't: feat :sparkles:', 'BFDBFE');\n await setupLabel(owner, repo, 't: fix :bug:', 'BFDBFE');\n await setupLabel(owner, repo, 't: perf :zap:', 'BFDBFE');\n await setupLabel(owner, repo, 't: refactor :recycle:', 'BFDBFE');\n await setupLabel(owner, repo, 't: style :lipstick:', 'BFDBFE');\n await setupLabel(owner, repo, 't: test :test_tube:', 'BFDBFE');\n await setupLabel(owner, repo, 'project', '24292F');\n await setupLabel(owner, repo, 'focused :dart:', '22C55E');\n\n await deleteLabel(owner, repo, 'bug');\n await deleteLabel(owner, repo, 'documentation');\n await deleteLabel(owner, repo, 'duplicate');\n await deleteLabel(owner, repo, 'enhancement');\n await deleteLabel(owner, repo, 'good first issue');\n await deleteLabel(owner, repo, 'help wanted');\n await deleteLabel(owner, repo, 'invalid');\n await deleteLabel(owner, repo, 'question');\n await deleteLabel(owner, repo, 'wontfix');\n\n await deleteLabel(owner, repo, 'ready');\n await deleteLabel(owner, repo, 'review requested');\n await deleteLabel(owner, repo, 'released');\n await deleteLabel(owner, repo, 'semantic-release');\n } catch (error) {\n console.warn('Skip setupLabels due to:', (error as Error)?.stack ?? error);\n }\n });\n}\n\nasync function setupLabel(owner: string, repo: string, name: string, color: string): Promise<void> {\n try {\n await octokit.request('POST /repos/{owner}/{repo}/labels', {\n owner,\n repo,\n name,\n color,\n });\n } catch {\n await octokit.request('PATCH /repos/{owner}/{repo}/labels/{name}', {\n owner,\n repo,\n name,\n color,\n });\n }\n}\n\nasync function deleteLabel(owner: string, repo: string, name: string): Promise<void> {\n try {\n await octokit.request('DELETE /repos/{owner}/{repo}/labels/{name}', {\n owner,\n repo,\n name,\n });\n } catch {\n // do nothing\n }\n}\n","/* eslint-disable import/no-named-as-default-member */\n\nimport dotenv from 'dotenv';\nimport sodium from 'libsodium-wrappers';\n\nimport { logger } from '../logger.js';\nimport { options } from '../options.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { gitHubUtil, hasGitHubToken, octokit } from '../utils/githubUtil.js';\n\nconst deprecatedSecretNames = ['READY_DISCORD_WEBHOOK_URL'];\n\nexport async function setupSecrets(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('setupSecrets', async () => {\n if (!hasGitHubToken || !options.doesUploadEnvVars) return;\n\n const [owner, repo] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (!owner || !repo || owner !== 'WillBoosterLab') return;\n\n const parsed = dotenv.config().parsed || {};\n if (Object.keys(parsed).length === 0) return;\n\n try {\n for (const secretName of deprecatedSecretNames) {\n try {\n await octokit.request('DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}', {\n owner,\n repo,\n secret_name: secretName,\n });\n } catch {\n // do nothing\n }\n }\n\n const response = await octokit.request('GET /repos/{owner}/{repo}/actions/secrets/public-key', {\n owner,\n repo,\n });\n const { key, key_id: keyId } = response.data;\n\n await sodium.ready;\n\n for (const [name, secret] of Object.entries(parsed)) {\n if (config.isPublicRepo && name === 'GH_BOT_PAT') continue;\n if (!config.isPublicRepo && name === 'PUBLIC_GH_BOT_PAT') continue;\n\n // Convert Secret & Base64 key to Uint8Array.\n const rawKey = sodium.from_base64(key, sodium.base64_variants.ORIGINAL);\n const rawSec = sodium.from_string(secret);\n\n // Encrypt the secret using LibSodium\n const encBytes = sodium.crypto_box_seal(rawSec, rawKey);\n\n // Convert encrypted Uint8Array to Base64\n const encBase64 = sodium.to_base64(encBytes, sodium.base64_variants.ORIGINAL);\n\n await octokit.request('PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}', {\n owner,\n repo,\n secret_name: name,\n encrypted_value: encBase64,\n key_id: keyId,\n });\n }\n } catch (error) {\n console.warn('Skip setupSecrets due to:', (error as Error)?.stack ?? error);\n }\n });\n}\n","import { withRetry } from '@willbooster/shared-lib';\n\nimport type { PackageConfig } from '../packageConfig.js';\nimport { gitHubUtil, octokit } from '../utils/githubUtil.js';\n\nexport async function setupGitHubSettings(config: PackageConfig): Promise<void> {\n const [owner, repo] = gitHubUtil.getOrgAndName(config.repository ?? '');\n if (!owner || !repo) return;\n if (owner !== 'WillBooster' && owner !== 'WillBoosterLab') return;\n\n await withRetry(() =>\n octokit.request('PATCH /repos/{owner}/{repo}', {\n owner,\n repo,\n allow_merge_commit: false,\n allow_squash_merge: true,\n allow_rebase_merge: false,\n delete_branch_on_merge: true,\n squash_merge_commit_title: 'PR_TITLE',\n squash_merge_commit_message: 'BLANK',\n headers: {\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n ...(config.repository?.startsWith('github:WillBooster/') ? { allow_auto_merge: true } : {}),\n })\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { distance } from 'fastest-levenshtein';\n\nimport { logger } from '../logger.js';\nimport type { PackageConfig } from '../packageConfig.js';\nimport { fsUtil } from '../utils/fsUtil.js';\nimport { promisePool } from '../utils/promisePool.js';\n\nconst templates = {\n 'pull_request_template.md': `\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \\`All checks have passed\\` on PR page. (You may leave this box unchecked due to long workflows.)\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \\`WIP:\\`.\n - All tests are passed.\n - Test command (e.g., \\`yarn test\\`) is passed.\n - Lint command (e.g., \\`yarn lint\\`) is passed.\n- [ ] I've reviewed my changes on PR's diff view.\n\n<!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src=\"\" width=\"400\"> | <img src=\"\" width=\"400\"> |\n-->\n`.trim(),\n};\n\nexport async function generateGitHubTemplates(config: PackageConfig): Promise<void> {\n return logger.functionIgnoringException('generateGitHubTemplates', async () => {\n for (const [fileName, newContent] of Object.entries(templates)) {\n const filePath = path.resolve(config.dirPath, '.github', fileName);\n if (fs.existsSync(filePath)) {\n const oldContent = await fs.promises.readFile(filePath, 'utf8');\n if (distance(oldContent, newContent) > newContent.length / 2) {\n continue;\n }\n }\n\n await fs.promises.mkdir(path.resolve(config.dirPath, '.github'), { recursive: true });\n await promisePool.run(() => fsUtil.generateFile(filePath, newContent));\n }\n });\n}\n","import fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { globbySync } from 'globby';\nimport { simpleGit } from 'simple-git';\nimport type { PackageJson } from 'type-fest';\nimport { z } from 'zod';\n\nimport { gitHubUtil, octokit } from './utils/githubUtil.js';\n\nexport interface PackageConfig {\n dirPath: string;\n dockerfile: string;\n isRoot: boolean;\n isPublicRepo: boolean;\n isReferredByOtherRepo: boolean;\n repository?: string;\n isBun: boolean;\n isEsmPackage: boolean;\n isWillBoosterConfigs: boolean;\n doesContainsSubPackageJsons: boolean;\n doesContainsDockerfile: boolean;\n doesContainsGemfile: boolean;\n doesContainsGoMod: boolean;\n doesContainsPackageJson: boolean;\n doesContainsPoetryLock: boolean;\n doesContainsPomXml: boolean;\n doesContainsPubspecYaml: boolean;\n doesContainsTemplateYaml: boolean;\n doesContainsVscodeSettingsJson: boolean;\n\n doesContainsJavaScript: boolean;\n doesContainsTypeScript: boolean;\n doesContainsJsxOrTsx: boolean;\n doesContainsJavaScriptInPackages: boolean;\n doesContainsTypeScriptInPackages: boolean;\n doesContainsJsxOrTsxInPackages: boolean;\n depending: {\n blitz: boolean;\n firebase: boolean;\n litestream: boolean;\n next: boolean;\n playwrightTest: boolean;\n prisma: boolean;\n pyright: boolean;\n reactNative: boolean;\n semanticRelease: boolean;\n storybook: boolean;\n wb: boolean;\n };\n release: {\n branches: string[];\n github: boolean;\n npm: boolean;\n };\n eslintBase?: EslintExtensionBase;\n versionsText?: string;\n packageJson?: PackageJson;\n wbfyJson?: WbfyJson;\n}\n\ntype WbfyJson = z.infer<typeof wbfyJsonSchema>;\n\nconst wbfyJsonSchema = z.object({\n typos: z\n .object({\n all: z.record(z.string()).optional(),\n doc: z.record(z.string()).optional(),\n ts: z.record(z.string()).optional(),\n text: z.record(z.string()).optional(),\n })\n .optional(),\n});\n\nexport async function getPackageConfig(dirPath: string): Promise<PackageConfig | undefined> {\n const packageJsonPath = path.resolve(dirPath, 'package.json');\n try {\n const doesContainsPackageJson = fs.existsSync(packageJsonPath);\n let dependencies: PackageJson['dependencies'] = {};\n let devDependencies: PackageJson['devDependencies'] = {};\n let packageJson: PackageJson = {};\n let esmPackage = false;\n if (doesContainsPackageJson) {\n const packageJsonText = fs.readFileSync(packageJsonPath, 'utf8');\n packageJson = JSON.parse(packageJsonText);\n dependencies = packageJson.dependencies ?? {};\n devDependencies = packageJson.devDependencies ?? {};\n esmPackage = packageJson.type === 'module';\n }\n\n let releaseBranches: string[] = [];\n let releasePlugins: string[] = [];\n try {\n const releasercJsonPath = path.resolve(dirPath, '.releaserc.json');\n const json = JSON.parse(await fsp.readFile(releasercJsonPath, 'utf8'));\n releaseBranches = json?.branches || [];\n releasePlugins = json?.plugins?.flat() || [];\n } catch {\n // do nothing\n }\n\n const isRoot =\n path.basename(path.resolve(dirPath, '..')) !== 'packages' ||\n !fs.existsSync(path.resolve(dirPath, '..', '..', 'package.json'));\n\n let repoInfo: Record<string, unknown> | undefined;\n if (isRoot) {\n repoInfo = await fetchRepoInfo(dirPath, packageJson);\n }\n\n let versionsText = '';\n try {\n const content = await fsp.readFile(path.resolve(dirPath, '.tool-versions'), 'utf8');\n versionsText += content.trim();\n } catch {\n // do nothing\n }\n for (const [prefix, name] of [\n ['java', 'java'],\n ['node', 'nodejs'],\n ['python', 'python'],\n ]) {\n try {\n const nodeVersionContent = await fsp.readFile(path.resolve(dirPath, `.${prefix}-version`), 'utf8');\n if (versionsText) {\n versionsText += '\\n';\n }\n versionsText += name + ' ' + nodeVersionContent.trim();\n } catch {\n // do nothing\n }\n }\n\n let dockerfile = '';\n try {\n dockerfile = await fsp.readFile(path.resolve(dirPath, 'Dockerfile'), 'utf8');\n } catch {\n // do nothing\n }\n\n // Read wbfy.json\n const wbfyJsonPath = path.resolve(dirPath, 'wbfy.json');\n let wbfyJson: WbfyJson | undefined;\n try {\n const wbfyJsonText = await fsp.readFile(wbfyJsonPath, 'utf8');\n wbfyJson = wbfyJsonSchema.parse(JSON.parse(wbfyJsonText));\n } catch {\n // do nothing\n }\n\n const config: PackageConfig = {\n dirPath,\n dockerfile,\n isRoot,\n isPublicRepo: repoInfo?.private === false,\n isReferredByOtherRepo: !!packageJson.files,\n repository: repoInfo?.full_name ? `github:${repoInfo?.full_name}` : undefined,\n isBun: versionsText.includes('bun') && fs.existsSync(path.join(dirPath, 'bunfig.toml')),\n isEsmPackage: esmPackage,\n isWillBoosterConfigs: packageJsonPath.includes(`${path.sep}willbooster-configs`),\n doesContainsSubPackageJsons: containsAny('packages/**/package.json', dirPath),\n doesContainsDockerfile: !!dockerfile || fs.existsSync(path.resolve(dirPath, 'docker-compose.yml')),\n doesContainsGemfile: fs.existsSync(path.resolve(dirPath, 'Gemfile')),\n doesContainsGoMod: fs.existsSync(path.resolve(dirPath, 'go.mod')),\n doesContainsPackageJson: fs.existsSync(path.resolve(dirPath, 'package.json')),\n doesContainsPoetryLock: fs.existsSync(path.resolve(dirPath, 'poetry.lock')),\n doesContainsPomXml: fs.existsSync(path.resolve(dirPath, 'pom.xml')),\n doesContainsPubspecYaml: fs.existsSync(path.resolve(dirPath, 'pubspec.yaml')),\n doesContainsTemplateYaml: fs.existsSync(path.resolve(dirPath, 'template.yaml')),\n doesContainsVscodeSettingsJson: fs.existsSync(path.resolve(dirPath, '.vscode', 'settings.json')),\n doesContainsJavaScript: containsAny('{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}', dirPath),\n doesContainsTypeScript: containsAny('{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}', dirPath),\n doesContainsJsxOrTsx: containsAny('{app,src,tests}/**/*.{t,j}sx', dirPath),\n doesContainsJavaScriptInPackages: containsAny(\n 'packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}',\n dirPath\n ),\n doesContainsTypeScriptInPackages: containsAny(\n 'packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}',\n dirPath\n ),\n doesContainsJsxOrTsxInPackages: containsAny('packages/**/{app,src,tests}/**/*.{t,j}sx', dirPath),\n depending: {\n blitz: !!dependencies['blitz'],\n firebase: !!devDependencies['firebase-tools'],\n litestream: dockerfile.includes('install-litestream.sh'),\n next: !!dependencies['next'],\n playwrightTest:\n !!dependencies['@playwright/test'] ||\n !!devDependencies['@playwright/test'] ||\n !!devDependencies['playwright'],\n prisma: !!dependencies['@prisma/client'] || !!devDependencies['prisma'],\n pyright: !!devDependencies['pyright'],\n reactNative: !!dependencies['react-native'],\n semanticRelease: !!(\n devDependencies['semantic-release'] ||\n releaseBranches.length > 0 ||\n releasePlugins.length > 0\n ),\n storybook: !!devDependencies['@storybook/react'],\n wb:\n !!dependencies['@willbooster/wb'] ||\n !!devDependencies['@willbooster/wb'] ||\n // TODO: remove the following migration code in future\n !!dependencies['@willbooster/shared-scripts'] ||\n !!devDependencies['@willbooster/shared-scripts'],\n },\n release: {\n branches: releaseBranches,\n github: releasePlugins.includes('@semantic-release/github'),\n npm: releasePlugins.includes('@semantic-release/npm'),\n },\n versionsText,\n packageJson,\n wbfyJson,\n };\n config.eslintBase = getEslintExtensionBase(config);\n if (\n config.doesContainsGemfile ||\n config.doesContainsGoMod ||\n config.doesContainsPackageJson ||\n config.doesContainsPoetryLock ||\n config.doesContainsPomXml ||\n config.doesContainsPubspecYaml ||\n config.doesContainsTemplateYaml\n ) {\n return config;\n }\n } catch {\n // do nothing\n }\n}\n\nfunction containsAny(pattern: string, dirPath: string): boolean {\n return globbySync(pattern, { dot: true, cwd: dirPath }).length > 0;\n}\n\nexport type EslintExtensionBase =\n | '@willbooster/eslint-config-ts-react'\n | '@willbooster/eslint-config-ts'\n | '@willbooster/eslint-config-js-react'\n | '@willbooster/eslint-config-js'\n | '@willbooster/eslint-config-next'\n | '@willbooster/eslint-config-blitz-next';\n\nfunction getEslintExtensionBase(config: PackageConfig): EslintExtensionBase | undefined {\n if (config.depending.blitz) {\n return '@willbooster/eslint-config-blitz-next';\n } else if (config.depending.next) {\n return '@willbooster/eslint-config-next';\n } else if (config.doesContainsTypeScript) {\n return config.doesContainsJsxOrTsx ? '@willbooster/eslint-config-ts-react' : '@willbooster/eslint-config-ts';\n } else {\n if (config.doesContainsJsxOrTsx) {\n return '@willbooster/eslint-config-js-react';\n } else if (config.doesContainsJavaScript) {\n return '@willbooster/eslint-config-js';\n }\n }\n}\n\nasync function fetchRepoInfo(dirPath: string, packageJson: PackageJson): Promise<Record<string, unknown> | undefined> {\n const git = simpleGit(dirPath);\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === 'origin');\n const remoteUrl = origin?.refs?.fetch ?? origin?.refs?.push;\n if (typeof remoteUrl === 'string') {\n const json = await requestRepoInfo(remoteUrl);\n if (json) return json;\n }\n\n const url = typeof packageJson.repository === 'string' ? packageJson.repository : packageJson.repository?.url;\n if (url) {\n const json = await requestRepoInfo(url);\n if (json && json.message !== 'Not Found') return json;\n }\n}\n\nasync function requestRepoInfo(urlOrFullName: string): Promise<Record<string, unknown> | undefined> {\n const [org, name] = gitHubUtil.getOrgAndName(urlOrFullName);\n if (!org || !name) return;\n\n const ret = { full_name: `${org}/${name}` };\n try {\n const response = await octokit.request('GET /repos/{owner}/{repo}', {\n owner: org,\n repo: name,\n });\n Object.assign(ret, response.data);\n } catch {\n // do nothing\n }\n return ret;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { ignoreErrorAsync } from '@willbooster/shared-lib';\nimport yargs from 'yargs';\n\nimport { fixDockerfile } from './fixers/dockerfile.js';\nimport { fixPlaywrightConfig } from './fixers/playwrightConfig.js';\nimport { fixPrismaEnvFiles } from './fixers/prisma.js';\nimport { fixTestDirectories } from './fixers/testDirectory.js';\nimport { fixTypeDefinitions } from './fixers/typeDefinition.js';\nimport { fixTypos } from './fixers/typos.js';\nimport { generateVersionConfigs } from './generators/asdf.js';\nimport { generateDockerignore } from './generators/dockerignore.js';\nimport { generateEditorconfig } from './generators/editorconfig.js';\nimport { generateEslintignore } from './generators/eslintignore.js';\nimport { generateEslintrc } from './generators/eslintrc.js';\nimport { generateGitattributes } from './generators/gitattributes.js';\nimport { generateGitignore } from './generators/gitignore.js';\nimport { generateHuskyrc } from './generators/huskyrc.js';\nimport { generateIdeaSettings } from './generators/idea.js';\nimport { generateLintstagedrc } from './generators/lintstagedrc.js';\nimport { generateNextConfigJson } from './generators/nextconfig.js';\nimport { generatePackageJson } from './generators/packageJson.js';\nimport { generatePrettierignore } from './generators/prettierignore.js';\nimport { generatePyrightConfigJson } from './generators/pyrightconfig.js';\nimport { generateReadme } from './generators/readme.js';\nimport { generateReleaserc } from './generators/releaserc.js';\nimport { generateRenovateJson } from './generators/renovaterc.js';\nimport { generateTsconfig } from './generators/tsconfig.js';\nimport { generateVscodeSettings } from './generators/vscodeSettings.js';\nimport { generateWorkflows } from './generators/workflow.js';\nimport { generateYarnrcYml } from './generators/yarnrc.js';\nimport { setupLabels } from './github/label.js';\nimport { setupSecrets } from './github/secret.js';\nimport { setupGitHubSettings } from './github/settings.js';\nimport { generateGitHubTemplates } from './github/template.js';\nimport { options } from './options.js';\nimport type { PackageConfig } from './packageConfig.js';\nimport { getPackageConfig } from './packageConfig.js';\nimport { promisePool } from './utils/promisePool.js';\nimport { spawnSync } from './utils/spawnUtil.js';\n\nasync function main(): Promise<void> {\n const argv = await yargs(process.argv.slice(2))\n .command('$0 [paths..]', 'Make a given project follow the WillBooster standard', (yargs) => {\n yargs.positional('paths', {\n describe: 'project paths to be wbfied',\n array: true,\n type: 'string',\n default: ['.'],\n });\n })\n .options({\n env: {\n description: 'Upload environment variables as secrets to GitHub',\n type: 'boolean',\n default: false,\n alias: 'e',\n },\n skipDeps: {\n description: 'Skip dependency installation',\n type: 'boolean',\n default: false,\n alias: 'd',\n },\n verbose: {\n description: 'Whether or not to enable verbose mode',\n type: 'boolean',\n default: false,\n alias: 'v',\n },\n })\n .strict().argv;\n options.isVerbose = argv.verbose;\n options.doesUploadEnvVars = argv.env;\n\n for (const rootDirPath of argv.paths as string[]) {\n const packagesDirPath = path.join(rootDirPath, 'packages');\n const dirents = (await ignoreErrorAsync(() => fs.readdir(packagesDirPath, { withFileTypes: true }))) ?? [];\n const subDirPaths = dirents.filter((d) => d.isDirectory()).map((d) => path.join(packagesDirPath, d.name));\n\n await fixTestDirectories([rootDirPath, ...subDirPaths]);\n\n const rootConfig = await getPackageConfig(rootDirPath);\n if (!rootConfig) {\n console.error(`there is no valid package.json in ${rootDirPath}`);\n continue;\n }\n const abbreviationPromise = fixTypos(rootConfig);\n\n const nullableSubPackageConfigs = await Promise.all(subDirPaths.map((subDirPath) => getPackageConfig(subDirPath)));\n const subPackageConfigs = nullableSubPackageConfigs.filter((config) => !!config) as PackageConfig[];\n const allPackageConfigs = [rootConfig, ...subPackageConfigs];\n\n if (options.isVerbose) {\n for (const config of allPackageConfigs) {\n console.info(config);\n }\n }\n\n // Install tools via asdf at first\n await generateVersionConfigs(rootConfig);\n // Install yarn berry\n await generateYarnrcYml(rootConfig);\n await Promise.all([\n fixDockerfile(rootConfig),\n fixPrismaEnvFiles(rootConfig),\n abbreviationPromise.then(() => generateReadme(rootConfig)),\n generateDockerignore(rootConfig),\n generateEditorconfig(rootConfig),\n generateGitattributes(rootConfig),\n generateGitHubTemplates(rootConfig),\n generateHuskyrc(rootConfig),\n generateIdeaSettings(rootConfig),\n generateLintstagedrc(rootConfig),\n generateRenovateJson(rootConfig),\n generateReleaserc(rootConfig),\n generateWorkflows(rootConfig),\n setupLabels(rootConfig),\n setupSecrets(rootConfig),\n setupGitHubSettings(rootConfig),\n ]);\n await promisePool.promiseAll();\n\n const promises: Promise<void>[] = [];\n for (const config of allPackageConfigs) {\n if (config.doesContainsTypeScript || config.doesContainsTypeScriptInPackages) {\n promises.push(fixTypeDefinitions(config, config.isRoot ? allPackageConfigs : [config]));\n }\n if (config.depending.playwrightTest) {\n promises.push(fixPlaywrightConfig(config));\n }\n if (config.depending.next) {\n promises.push(generateNextConfigJson(config));\n }\n await generateGitignore(config, rootConfig);\n await promisePool.promiseAll();\n if (!config.isRoot && !config.doesContainsPackageJson) {\n continue;\n }\n await generatePrettierignore(config);\n await generatePackageJson(config, rootConfig, argv.skipDeps);\n\n promises.push(generateLintstagedrc(config));\n if (config.doesContainsVscodeSettingsJson && config.doesContainsPackageJson) {\n promises.push(generateVscodeSettings(config));\n }\n if (config.doesContainsTypeScript || config.doesContainsTypeScriptInPackages) {\n promises.push(generateTsconfig(config));\n }\n if (\n config.doesContainsJavaScript ||\n config.doesContainsJavaScriptInPackages ||\n config.doesContainsTypeScript ||\n config.doesContainsTypeScriptInPackages\n ) {\n if (!rootConfig.isWillBoosterConfigs) {\n promises.push(generateEslintrc(config, rootConfig));\n }\n promises.push(generateEslintignore(config));\n }\n if (config.depending.pyright) {\n promises.push(generatePyrightConfigJson(config));\n }\n }\n await Promise.all(promises);\n await promisePool.promiseAll();\n\n spawnSync('yarn', ['cleanup'], rootDirPath);\n // 'yarn install' should be after `yarn cleanup` because yarn berry generates yarn.lock\n // corresponding to the contents of dependant sub-package in monorepo\n spawnSync('yarn', ['install'], rootDirPath);\n }\n}\n\nawait main();\n"],"names":["options","constructor","this","isVerbose","doesUploadEnvVars","logger","functionIgnoringException","name","func","console","info","error","Error","stack","async","fixDockerfile","config","doesContainsDockerfile","oldContent","dockerfile","newContent","fs","writeFile","path","join","dirPath","fixPlaywrightConfig","filePath","existsSync","promises","readFile","replace","fixPrismaEnvFiles","envFiles","globby","dot","cwd","envFile","envFilePath","resolve","fixTestDirectories","packageDirPaths","Promise","all","map","oldTestDirPath","packageDirPath","newTestDirPath","rename","replaceAll","promisePool","PromisePool","fixTypeDefinitions","configsIncludingChildren","libTypeDirPath","srcTypeDirPath","isRoot","doesContainsSubPackageJsons","undefined","dirents","ignoreEnoentAsync","readdir","withFileTypes","dirent","dirName","slice","hasTypeDeclarationExtension","endsWith","packageName","includes","hasLibrary","some","packageJson","dependencies","devDependencies","isFile","mkdir","run","recursive","isDirectory","fsUtil","readFileIgnoringError","fsp","generateFile","content","fixTypos","packageConfig","docFiles","gitignore","length","mdFile","fixAbbreviationsInText","replaceWithConfig","tsFiles","tsFile","textBasedFiles","file","promiseAll","propName","before","after","Object","entries","wbfyJson","typos","spawnSync","command","args","retry","newCmd","newArgs","getSpawnSyncArgs","child_process","status","spawnSyncWithStringResult","stdio","proc","stderr","toString","trim","s","stdout","env","process","PATH","BERRY_BIN_FOLDER","ASDF_DIR","shell","convertVersionIntoNumber","version","numbers","split","Number","filter","isNaN","versionNumber","divisor","num","PYTHON_VERSION","JAVA_VERSION","BLITZ_VERSION","NEXT_VERSION","generateVersionConfigs","versionsText","duplicatableLines","line","CORE_TOOLS","has","sort","lines","Set","doesContainsPoetryLock","response","fetch","json","poetryVersion","updateVersion","depending","firebase","doesContainsPackageJson","prefix","DEPRECATED_VERSION_PREFIXES","versionPath","rm","force","toolVersionsPath","core","toolName","newVersion","head","index","findIndex","l","newLine","splice","userContentHeader","userContentHeaderRegex","separator","defaultHeadUserContent","defaultTailUserContent","ignoreFileUtil","separatorPrefix","readGitignoreWithoutSeparators","lastHeaderIndex","getIndexOfTailUserContentHeader","getHeadUserContent","indexOf","getTailUserContent","isBerryZeroInstallEnabled","lastIndex","lastIndexOf","commonContent","generateDockerignore","headUserContent","tailUserContent","extensions","codeWith2IndentSize","codeWith4IndentSize","codeWith8IndentSize","markdownLike","eslint","prettier","biome","generateExtensions","generateEditorconfig","generateEslintignore","gitignoreFilePath","gitignoreContent","overwriteMerge","destinationArray","sourceArray","combineMerge","target","source","destination","item","cloneUnlessOtherwiseSpecified","isMergeableObject","merge","push","generateEslintrc","rootConfig","bases","eslintBase","newSettings","root","extends","oldSettings","JSON","parse","ext","startsWith","newExtends","arrayMerge","blitz","stringify","generateGitattributes","defaultNames","generateGitignore","names","doesContainsGemfile","doesContainsGoMod","basename","doesContainsPomXml","doesContainsPubspecYaml","doesContainsTemplateYaml","next","prisma","playwrightTest","reactNative","storybook","litestream","generated","readCache","url","responseText","text","ok","writeCache","os","homedir","stat","Date","now","mtimeMs","EslintUtil","getLintFixSuffix","doesContainsJsxOrTsx","token","GH_BOT_PAT","PUBLIC_GH_BOT_PAT","GH_TOKEN","GITHUB_TOKEN","hasGitHubToken","octokit","Octokit","auth","gitHubUtil","getOrgAndName","urlOrFullName","urlWithoutProtocol","at","srcDirectories","node","getSrcDirs","jsCommonDeps","tsCommonDeps","reactCommonDeps","eslintDeps","generatePackageJson","skipAddingDeps","jsonText","jsonObj","scripts","peerDependencies","author","deps","values","dep","removeDeprecatedStuff","key","value","generateScripts","prettify","existingContent","originalContent","generatePrettierSuffix","poetryDevDependencies","isPublicRepo","isReferredByOtherRepo","semanticRelease","workspaces","Array","isArray","workspace","globbySync","wb","doesContainsJavaScript","doesContainsJavaScriptInPackages","doesContainsTypeScript","doesContainsTypeScriptInPackages","isWillBoosterConfigs","private","license","publishConfig","access","owner","repository","main","resolutions","lint","cleanup","dirs","dir","format","postinstall","pythonFiles","ignore","dirNameSet","pythonFile","first","second","add","size","dirNamesStr","d","keys","newJsonText","oldAndNewScriptNames","oldName","newName","files","fixScriptNames","typecheck","oldTest","test","pyright","settings","preCommit","prePush","prePushForLab","postMerge","generateHuskyrc","packageJsonPath","preCommitFilePath","mode","postMergeCommands","rmNextDirectory","postMergeCommand","createTaskOptions","runner","extension","prettierContent","biomeContent","generateIdeaSettings","isBun","generateLintstagedrc","packagePrefix","getEslintKey","packagesFilter","getEslintFilterForPrettier","generateNextConfigJson","find","p","_","settingsText","generatePrettierignore","additionalContent","venvPath","venv","generatePyrightConfigJson","cloneDeep","semanticReleaseBadge","generateReadme","insertBadge","fileNames","readdirSync","fileName","badgeName","toUpperCase","badge","readme","i","generateReleaserc","plugins","plugin","oldConfig","preset","successComment","failComment","labels","releasedLabels","$schema","generateRenovateJson","packageRules","rule","packageNames","enabled","sortKeys","obj","keyAndValues","key1","key2","localeCompare","rootJsonObj","compilerOptions","module","moduleResolution","jsx","alwaysStrict","strict","skipLibCheck","allowSyntheticDefaultImports","esModuleInterop","resolveJsonModule","declaration","sourceMap","importHelpers","outDir","typeRoots","include","subJsonObj","generateTsconfig","doesContainsJsxOrTsxInPackages","isEsmPackage","experimentalDecorators","excludeFilePatterns","generateVscodeSettings","excludeFilePattern","excludeSetting","workflows","on","pull_request","branches","concurrency","group","jobs","uses","release","wbfy","workflow_dispatch","pull_request_target","types","sync","issues","secrets","DISCORD_WEBHOOK_URL","GH_PROJECT_URL","with","label","labeled","labelOperator","generateWorkflows","workflowsPath","semanticYmlPath","fileNameSet","kind","writeWorkflowYaml","yaml","load","moveToBottom","job","normalizeJob","schedule","branch","setSchedule","migrateWorkflow","writeYaml","params","sync_params_without_dest","npm","server_url","migrateJob","newSecrets","inclusiveMinHourJst","exclusiveMaxHourJst","minuteUtc","hourUtc","cron","isInteger","hourJst","Math","floor","random","yamlText","dump","lineWidth","noCompatMode","styles","generateYarnrcYml","currentVersion","latestVersion","versionsJson","getLatestVersion","getMajorNumber","releasesPath","yarnrcPath","yarnrcYmlPath","defaultSemverRangePrefix","nodeLinker","nmMode","compressionLevel","injectEnvironmentFiles","enableGlobalCache","originalLength","pluginPath","major","setupLabels","repo","setupLabel","deleteLabel","warn","color","request","deprecatedSecretNames","setupSecrets","parsed","dotenv","secretName","secret_name","key_id","keyId","data","sodium","ready","secret","rawKey","from_base64","base64_variants","ORIGINAL","rawSec","from_string","encBytes","crypto_box_seal","encBase64","to_base64","encrypted_value","setupGitHubSettings","withRetry","allow_merge_commit","allow_squash_merge","allow_rebase_merge","delete_branch_on_merge","squash_merge_commit_title","squash_merge_commit_message","headers","allow_auto_merge","templates","generateGitHubTemplates","distance","wbfyJsonSchema","z","object","record","string","optional","doc","ts","getPackageConfig","esmPackage","packageJsonText","readFileSync","type","releaseBranches","releasePlugins","releasercJsonPath","flat","repoInfo","git","simpleGit","origin","getRemotes","r","remoteUrl","refs","requestRepoInfo","message","fetchRepoInfo","nodeVersionContent","wbfyJsonPath","wbfyJsonText","full_name","sep","containsAny","doesContainsVscodeSettingsJson","github","getEslintExtensionBase","pattern","org","ret","assign","argv","yargs","positional","describe","array","default","description","alias","skipDeps","verbose","rootDirPath","paths","packagesDirPath","subDirPaths","ignoreErrorAsync","abbreviationPromise","subPackageConfigs","subDirPath","allPackageConfigs","then"],"mappings":"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"}