vite-on-github 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts","../src/utils/detect.ts","../src/utils/fs.ts","../src/utils/git.ts","../src/utils/package-json.ts","../src/utils/vite-config.ts","../src/utils/router.ts","../src/utils/ci.ts","../src/utils/exec.ts","../src/utils/logger.ts"],"sourcesContent":["import * as p from '@clack/prompts';\r\nimport pc from 'picocolors';\r\nimport { join } from 'node:path';\r\nimport {\r\n buildCommand,\r\n detectProject,\r\n findRouterEntryFiles,\r\n installCommand,\r\n} from '../utils/detect.js';\r\nimport { detectGitRemote } from '../utils/git.js';\r\nimport {\r\n ensureBuildScript,\r\n hasDevDependency,\r\n readPackageJson,\r\n writePackageJson,\r\n} from '../utils/package-json.js';\r\nimport { createDefaultViteConfig, patchViteConfig } from '../utils/vite-config.js';\r\nimport { patchRouterFiles } from '../utils/router.js';\r\nimport { writeWorkflow } from '../utils/ci.js';\r\nimport { runCommand } from '../utils/exec.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport type { InitOptions, InitResult } from '../types.js';\r\n\r\nfunction getPagesUrl(owner: string, repo: string, isUserSite: boolean): string {\r\n if (isUserSite) return `https://${owner}.github.io/`;\r\n return `https://${owner}.github.io/${repo}/`;\r\n}\r\n\r\nexport async function init(options: InitOptions = {}): Promise<InitResult> {\r\n const cwd = options.cwd ?? process.cwd();\r\n const steps: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n const project = detectProject(cwd);\r\n if (!project) {\r\n return {\r\n success: false,\r\n steps,\r\n warnings: ['Not a Vite project — run this inside a folder with vite in package.json'],\r\n };\r\n }\r\n\r\n const gitRemote = detectGitRemote(cwd);\r\n let pagesUrl: string | undefined;\r\n\r\n if (!options.yes) {\r\n p.intro(pc.bgCyan(pc.black(' vite-on-github ')));\r\n\r\n const confirm = await p.confirm({\r\n message: `Prepare ${pc.bold(project.cwd)} for GitHub Pages?`,\r\n initialValue: true,\r\n });\r\n\r\n if (p.isCancel(confirm) || !confirm) {\r\n p.cancel('Setup cancelled.');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n const spinner = p.spinner();\r\n let installOk = options.skipInstall;\r\n\r\n // 1. Install vite-basepath\r\n if (!options.skipInstall) {\r\n spinner.start('Installing vite-basepath…');\r\n const pkg = readPackageJson(project.packageJsonPath);\r\n const alreadyInstalled = pkg ? hasDevDependency(pkg, 'vite-basepath') : false;\r\n\r\n if (alreadyInstalled) {\r\n spinner.stop('vite-basepath already installed');\r\n steps.push('vite-basepath already present');\r\n installOk = true;\r\n } else {\r\n try {\r\n const cmd = installCommand(project.packageManager, ['vite-basepath']);\r\n runCommand(cmd, cwd, true);\r\n spinner.stop('Installed vite-basepath');\r\n steps.push('Installed vite-basepath');\r\n installOk = true;\r\n } catch {\r\n spinner.stop('Failed to install vite-basepath');\r\n warnings.push(\r\n 'Could not install vite-basepath — install it manually, then run init again',\r\n );\r\n }\r\n }\r\n }\r\n\r\n // 2. Ensure build script\r\n spinner.start('Checking package.json…');\r\n const pkg = readPackageJson(project.packageJsonPath);\r\n if (pkg) {\r\n const addedBuild = ensureBuildScript(pkg);\r\n if (addedBuild) {\r\n writePackageJson(project.packageJsonPath, pkg);\r\n steps.push('Added build script to package.json');\r\n }\r\n }\r\n spinner.stop('package.json ready');\r\n\r\n // 3. Patch or create vite config (only when vite-basepath is available)\r\n if (!options.skipViteConfig && installOk) {\r\n spinner.start('Configuring Vite…');\r\n\r\n if (project.viteConfigPath) {\r\n const result = patchViteConfig(project.viteConfigPath);\r\n if (result.changed) {\r\n steps.push(result.message);\r\n } else if (!result.message.includes('already')) {\r\n warnings.push(result.message);\r\n } else {\r\n steps.push(result.message);\r\n }\r\n } else {\r\n const useTs = fileExists(join(cwd, 'tsconfig.json'));\r\n const created = createDefaultViteConfig(cwd, useTs, project.framework);\r\n steps.push(`Created ${created}`);\r\n }\r\n\r\n spinner.stop('Vite configured with vite-basepath');\r\n } else if (!options.skipViteConfig && !installOk) {\r\n warnings.push('Skipped vite config — install vite-basepath first');\r\n }\r\n\r\n // 4. Patch router if needed\r\n if (!options.skipRouter) {\r\n const needsRouter =\r\n (project.framework === 'react' && project.hasReactRouter) ||\r\n (project.framework === 'vue' && project.hasVueRouter);\r\n\r\n if (needsRouter) {\r\n spinner.start('Configuring client-side router…');\r\n const routerFiles = findRouterEntryFiles(cwd, project.framework);\r\n const results = patchRouterFiles(routerFiles, project.framework);\r\n\r\n for (const r of results) {\r\n if (r.changed) steps.push(r.message);\r\n else warnings.push(r.message);\r\n }\r\n\r\n if (results.length === 0) {\r\n warnings.push(\r\n `Found ${project.framework} router dependency but could not locate entry file — add basename={getBase()} manually`,\r\n );\r\n }\r\n\r\n spinner.stop('Router setup complete');\r\n }\r\n }\r\n\r\n // 5. Create GitHub Actions workflow\r\n if (!options.skipCi) {\r\n spinner.start('Creating GitHub Actions workflow…');\r\n const { path, created } = writeWorkflow({\r\n cwd,\r\n packageManager: project.packageManager,\r\n nodeVersion: options.nodeVersion,\r\n buildOutputDir: options.outDir,\r\n });\r\n steps.push(created ? `Created ${path}` : `Updated ${path}`);\r\n spinner.stop('CI workflow ready');\r\n }\r\n\r\n if (gitRemote) {\r\n pagesUrl = getPagesUrl(gitRemote.owner, gitRemote.repo, gitRemote.isUserSite);\r\n }\r\n\r\n return { success: true, steps, warnings, pagesUrl };\r\n}\r\n\r\nexport function printSummary(result: InitResult, packageManager: string): void {\r\n if (!result.success) {\r\n p.log.error(result.warnings[0] ?? 'Setup failed');\r\n return;\r\n }\r\n\r\n p.note(\r\n [\r\n 'Push your code to GitHub',\r\n 'Go to repo → Settings → Pages',\r\n 'Set Source to \"GitHub Actions\"',\r\n `Run ${pc.cyan(buildCommand(packageManager as 'npm'))} locally to verify`,\r\n ].join('\\n'),\r\n 'Next steps',\r\n );\r\n\r\n if (result.pagesUrl) {\r\n p.log.success(`Your site will be live at: ${pc.cyan(pc.underline(result.pagesUrl))}`);\r\n }\r\n\r\n if (result.warnings.length > 0) {\r\n p.log.warn('Notes:');\r\n for (const w of result.warnings) {\r\n p.log.message(` • ${w}`);\r\n }\r\n }\r\n\r\n p.outro(pc.green('Done! Your Vite app is ready for GitHub Pages.'));\r\n}\r\n","import { existsSync, readdirSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { findFirstExisting, readText } from './fs.js';\r\n\r\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\r\n\r\nexport type Framework = 'react' | 'vue' | 'svelte' | 'solid' | 'unknown';\r\n\r\nexport interface ProjectInfo {\r\n cwd: string;\r\n packageManager: PackageManager;\r\n viteConfigPath: string | null;\r\n framework: Framework;\r\n hasReactRouter: boolean;\r\n hasVueRouter: boolean;\r\n packageJsonPath: string;\r\n}\r\n\r\nconst VITE_CONFIG_CANDIDATES = [\r\n 'vite.config.ts',\r\n 'vite.config.js',\r\n 'vite.config.mts',\r\n 'vite.config.mjs',\r\n 'vite.config.cjs',\r\n];\r\n\r\nexport function detectPackageManager(cwd: string): PackageManager {\r\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(cwd, 'bun.lockb')) || existsSync(join(cwd, 'bun.lock'))) return 'bun';\r\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\r\n return 'npm';\r\n}\r\n\r\nfunction readPackageJson(cwd: string): Record<string, unknown> | null {\r\n const path = join(cwd, 'package.json');\r\n const text = readText(path);\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text) as Record<string, unknown>;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction getDeps(pkg: Record<string, unknown>): Record<string, string> {\r\n const deps = {\r\n ...(pkg.dependencies as Record<string, string> | undefined),\r\n ...(pkg.devDependencies as Record<string, string> | undefined),\r\n };\r\n return deps;\r\n}\r\n\r\nexport function detectFramework(deps: Record<string, string>): Framework {\r\n if (deps['react'] || deps['@vitejs/plugin-react'] || deps['@vitejs/plugin-react-swc']) {\r\n return 'react';\r\n }\r\n if (deps['vue'] || deps['@vitejs/plugin-vue']) return 'vue';\r\n if (deps['svelte'] || deps['@sveltejs/vite-plugin-svelte']) return 'svelte';\r\n if (deps['solid-js'] || deps['vite-plugin-solid']) return 'solid';\r\n return 'unknown';\r\n}\r\n\r\nexport function detectProject(cwd: string): ProjectInfo | null {\r\n const packageJsonPath = join(cwd, 'package.json');\r\n if (!existsSync(packageJsonPath)) return null;\r\n\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) return null;\r\n\r\n const deps = getDeps(pkg);\r\n const hasVite = Boolean(deps.vite) || existsSync(join(cwd, 'node_modules', 'vite'));\r\n if (!hasVite) return null;\r\n\r\n const viteConfigPath = findFirstExisting(cwd, VITE_CONFIG_CANDIDATES);\r\n const framework = detectFramework(deps);\r\n\r\n return {\r\n cwd,\r\n packageManager: detectPackageManager(cwd),\r\n viteConfigPath,\r\n framework,\r\n hasReactRouter: Boolean(deps['react-router-dom'] || deps['react-router']),\r\n hasVueRouter: Boolean(deps['vue-router']),\r\n packageJsonPath,\r\n };\r\n}\r\n\r\nexport function findRouterEntryFiles(cwd: string, framework: Framework): string[] {\r\n const found: string[] = [];\r\n\r\n if (framework === 'react') {\r\n const candidates = [\r\n 'src/main.tsx',\r\n 'src/main.ts',\r\n 'src/main.jsx',\r\n 'src/main.js',\r\n 'src/index.tsx',\r\n 'src/index.jsx',\r\n 'src/App.tsx',\r\n 'src/App.jsx',\r\n ];\r\n for (const c of candidates) {\r\n const full = join(cwd, c);\r\n if (!existsSync(full)) continue;\r\n const text = readText(full);\r\n if (text && /<BrowserRouter|createBrowserRouter/.test(text)) {\r\n found.push(full);\r\n } else if (/main\\.(tsx|ts|jsx|js)$/.test(c)) {\r\n found.push(full);\r\n }\r\n }\r\n }\r\n\r\n if (framework === 'vue') {\r\n const routerDirs = ['src/router', 'src/routers'];\r\n for (const dir of routerDirs) {\r\n const fullDir = join(cwd, dir);\r\n if (!existsSync(fullDir)) continue;\r\n for (const file of readdirSync(fullDir)) {\r\n if (/\\.(ts|js|mts|mjs)$/.test(file)) {\r\n found.push(join(fullDir, file));\r\n }\r\n }\r\n }\r\n const rootCandidates = ['src/router.ts', 'src/router.js', 'src/router/index.ts', 'src/router/index.js'];\r\n for (const c of rootCandidates) {\r\n const full = join(cwd, c);\r\n if (existsSync(full)) found.push(full);\r\n }\r\n }\r\n\r\n return found;\r\n}\r\n\r\nexport function installCommand(pm: PackageManager, packages: string[], dev = true): string {\r\n const flag = dev ? '--save-dev' : '--save';\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm add ${flag} ${packages.join(' ')}`;\r\n case 'yarn':\r\n return `yarn add ${dev ? '-D' : ''} ${packages.join(' ')}`.replace(/\\s+/g, ' ').trim();\r\n case 'bun':\r\n return `bun add ${dev ? '-d' : ''} ${packages.join(' ')}`;\r\n default:\r\n return `npm install ${flag} ${packages.join(' ')}`;\r\n }\r\n}\r\n\r\nexport function buildCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm':\r\n return 'pnpm run build';\r\n case 'yarn':\r\n return 'yarn build';\r\n case 'bun':\r\n return 'bun run build';\r\n default:\r\n return 'npm run build';\r\n }\r\n}\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nexport function readText(filePath: string): string | null {\r\n if (!existsSync(filePath)) return null;\r\n return readFileSync(filePath, 'utf-8');\r\n}\r\n\r\nexport function writeText(filePath: string, content: string): void {\r\n mkdirSync(dirname(filePath), { recursive: true });\r\n writeFileSync(filePath, content, 'utf-8');\r\n}\r\n\r\nexport function fileExists(filePath: string): boolean {\r\n return existsSync(filePath);\r\n}\r\n\r\nexport function findFirstExisting(cwd: string, candidates: string[]): string | null {\r\n for (const candidate of candidates) {\r\n const full = join(cwd, candidate);\r\n if (existsSync(full)) return full;\r\n }\r\n return null;\r\n}\r\n","import { execSync } from 'node:child_process';\r\n\r\nexport interface GitRemoteInfo {\r\n owner: string;\r\n repo: string;\r\n isUserSite: boolean;\r\n}\r\n\r\nexport function detectGitRemote(cwd: string): GitRemoteInfo | null {\r\n try {\r\n const url = execSync('git remote get-url origin', {\r\n cwd,\r\n encoding: 'utf-8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n }).trim();\r\n\r\n const match =\r\n url.match(/github\\.com[:/]([^/]+)\\/(.+?)(?:\\.git)?$/i) ??\r\n url.match(/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\r\n\r\n if (!match) return null;\r\n\r\n const owner = match[1];\r\n const repo = match[2].replace(/\\.git$/, '');\r\n const isUserSite = repo === `${owner}.github.io`;\r\n\r\n return { owner, repo, isUserSite };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { readText, writeText } from './fs.js';\r\n\r\nexport interface PackageJson {\r\n name?: string;\r\n scripts?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n dependencies?: Record<string, string>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport function readPackageJson(path: string): PackageJson | null {\r\n const text = readText(path);\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text) as PackageJson;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writePackageJson(path: string, pkg: PackageJson): void {\r\n writeText(path, `${JSON.stringify(pkg, null, 2)}\\n`);\r\n}\r\n\r\nexport function ensureBuildScript(pkg: PackageJson): boolean {\r\n if (!pkg.scripts) pkg.scripts = {};\r\n if (pkg.scripts.build) return false;\r\n pkg.scripts.build = 'vite build';\r\n return true;\r\n}\r\n\r\nexport function hasDevDependency(pkg: PackageJson, name: string): boolean {\r\n return Boolean(pkg.devDependencies?.[name] || pkg.dependencies?.[name]);\r\n}\r\n","import { readText, writeText } from './fs.js';\r\n\r\nexport interface ViteConfigPatchResult {\r\n changed: boolean;\r\n message: string;\r\n}\r\n\r\nfunction hasViteBasepathImport(content: string): boolean {\r\n return /from\\s+['\"]vite-basepath['\"]/.test(content) || /require\\s*\\(\\s*['\"]vite-basepath['\"]\\s*\\)/.test(content);\r\n}\r\n\r\nfunction hasViteBasepathPlugin(content: string): boolean {\r\n return /viteBasepath\\s*\\(/.test(content);\r\n}\r\n\r\nfunction isCommonJsConfig(path: string): boolean {\r\n return /\\.cjs$/.test(path);\r\n}\r\n\r\nfunction addImport(content: string, configPath: string): string {\r\n if (hasViteBasepathImport(content)) return content;\r\n\r\n const importLine = isCommonJsConfig(configPath)\r\n ? \"const viteBasepath = require('vite-basepath');\\n\"\r\n : \"import viteBasepath from 'vite-basepath';\\n\";\r\n\r\n const importMatch = content.match(/^import .+?;[\\r\\n]/m) ?? content.match(/^const .+ = require\\(.+?\\);[\\r\\n]/m);\r\n if (importMatch && importMatch.index !== undefined) {\r\n const lastImportEnd = findLastImportEnd(content);\r\n return content.slice(0, lastImportEnd) + importLine + content.slice(lastImportEnd);\r\n }\r\n\r\n return importLine + content;\r\n}\r\n\r\nfunction findLastImportEnd(content: string): number {\r\n const importBlock = /^(?:import\\s[\\s\\S]*?from\\s+['\"][^'\"]+['\"];|const\\s+\\w+\\s*=\\s*require\\(['\"][^'\"]+['\"]\\);)/gm;\r\n let lastEnd = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = importBlock.exec(content)) !== null) {\r\n lastEnd = match.index + match[0].length;\r\n }\r\n if (lastEnd > 0) {\r\n const after = content.slice(lastEnd).match(/^[\\r\\n]+/);\r\n return lastEnd + (after ? after[0].length : 0);\r\n }\r\n return 0;\r\n}\r\n\r\nfunction addPluginToArray(content: string): string {\r\n const pluginsArrayMatch = content.match(/plugins\\s*:\\s*\\[/);\r\n if (pluginsArrayMatch && pluginsArrayMatch.index !== undefined) {\r\n const bracketIndex = content.indexOf('[', pluginsArrayMatch.index);\r\n const insertAt = bracketIndex + 1;\r\n const afterBracket = content.slice(insertAt).match(/^\\s*\\n?/);\r\n const gap = afterBracket ? afterBracket[0] : '\\n ';\r\n return (\r\n content.slice(0, insertAt) +\r\n `${gap}viteBasepath(), ` +\r\n content.slice(insertAt)\r\n );\r\n }\r\n\r\n const defineConfigMatch = content.match(/defineConfig\\s*\\(\\s*\\{/);\r\n if (defineConfigMatch && defineConfigMatch.index !== undefined) {\r\n const braceIndex = content.indexOf('{', defineConfigMatch.index);\r\n const insertAt = braceIndex + 1;\r\n return (\r\n content.slice(0, insertAt) +\r\n '\\n plugins: [viteBasepath()],' +\r\n content.slice(insertAt)\r\n );\r\n }\r\n\r\n const exportDefaultMatch = content.match(/export\\s+default\\s*\\{/);\r\n if (exportDefaultMatch && exportDefaultMatch.index !== undefined) {\r\n const braceIndex = content.indexOf('{', exportDefaultMatch.index);\r\n const insertAt = braceIndex + 1;\r\n return (\r\n content.slice(0, insertAt) +\r\n '\\n plugins: [viteBasepath()],' +\r\n content.slice(insertAt)\r\n );\r\n }\r\n\r\n return content;\r\n}\r\n\r\nexport function patchViteConfig(configPath: string): ViteConfigPatchResult {\r\n const content = readText(configPath);\r\n if (!content) {\r\n return { changed: false, message: `Could not read ${configPath}` };\r\n }\r\n\r\n if (hasViteBasepathPlugin(content)) {\r\n return { changed: false, message: 'vite-basepath already configured in vite config' };\r\n }\r\n\r\n let updated = addImport(content, configPath);\r\n updated = addPluginToArray(updated);\r\n\r\n if (updated === content) {\r\n return {\r\n changed: false,\r\n message:\r\n 'Could not auto-patch vite config — add viteBasepath() to plugins manually',\r\n };\r\n }\r\n\r\n writeText(configPath, updated);\r\n return { changed: true, message: `Updated ${configPath}` };\r\n}\r\n\r\nfunction frameworkPluginImport(framework: string): { importLine: string; pluginCall: string } | null {\r\n switch (framework) {\r\n case 'react':\r\n return {\r\n importLine: \"import react from '@vitejs/plugin-react';\\n\",\r\n pluginCall: 'react()',\r\n };\r\n case 'vue':\r\n return {\r\n importLine: \"import vue from '@vitejs/plugin-vue';\\n\",\r\n pluginCall: 'vue()',\r\n };\r\n case 'svelte':\r\n return {\r\n importLine: \"import { svelte } from '@sveltejs/vite-plugin-svelte';\\n\",\r\n pluginCall: 'svelte()',\r\n };\r\n case 'solid':\r\n return {\r\n importLine: \"import solid from 'vite-plugin-solid';\\n\",\r\n pluginCall: 'solid()',\r\n };\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nexport function createDefaultViteConfig(\r\n cwd: string,\r\n isTs: boolean,\r\n framework = 'unknown',\r\n): string {\r\n const filename = isTs ? 'vite.config.ts' : 'vite.config.js';\r\n const path = `${cwd}/${filename}`.replace(/\\\\/g, '/');\r\n const fw = frameworkPluginImport(framework);\r\n const plugins = fw ? `viteBasepath(), ${fw.pluginCall}` : 'viteBasepath()';\r\n const content = `import { defineConfig } from 'vite';\r\nimport viteBasepath from 'vite-basepath';\r\n${fw?.importLine ?? ''}\r\nexport default defineConfig({\r\n plugins: [${plugins}],\r\n});\r\n`;\r\n\r\n writeText(path, content);\r\n return path;\r\n}\r\n","import { readText, writeText } from './fs.js';\r\nimport type { Framework } from './detect.js';\r\n\r\nexport interface RouterPatchResult {\r\n file: string;\r\n changed: boolean;\r\n message: string;\r\n}\r\n\r\nfunction hasRuntimeImport(content: string): boolean {\r\n return /from\\s+['\"]vite-basepath\\/runtime['\"]/.test(content);\r\n}\r\n\r\nfunction patchReactRouter(content: string): string | null {\r\n if (content.includes('getBase()') || hasRuntimeImport(content)) {\r\n return null;\r\n }\r\n\r\n if (!/<BrowserRouter[\\s>/]/.test(content) && !/BrowserRouter\\s*\\(/.test(content)) {\r\n return null;\r\n }\r\n\r\n let updated = content;\r\n\r\n if (!hasRuntimeImport(updated)) {\r\n const runtimeImport = \"import { getBase } from 'vite-basepath/runtime';\\n\";\r\n const lastImportEnd = findLastImportEnd(updated);\r\n updated = updated.slice(0, lastImportEnd) + runtimeImport + updated.slice(lastImportEnd);\r\n }\r\n\r\n // Replace existing static or dynamic basename props\r\n updated = updated.replace(\r\n /<BrowserRouter([^>]*)\\s+basename=\\{[^}]+\\}/g,\r\n '<BrowserRouter$1 basename={getBase()}',\r\n );\r\n updated = updated.replace(\r\n /<BrowserRouter([^>]*)\\s+basename=[\"'][^\"']*[\"']/g,\r\n '<BrowserRouter$1 basename={getBase()}',\r\n );\r\n\r\n // Add basename only when not already set\r\n updated = updated.replace(\r\n /<BrowserRouter(?![^>]*\\bbasename=)([\\s/>])/g,\r\n '<BrowserRouter basename={getBase()}$1',\r\n );\r\n\r\n updated = updated.replace(\r\n /BrowserRouter\\s*\\(\\s*\\{/g,\r\n 'BrowserRouter({ basename: getBase(), ',\r\n );\r\n\r\n return updated !== content ? updated : null;\r\n}\r\n\r\nfunction patchVueRouter(content: string): string | null {\r\n if (content.includes('getBase()') || hasRuntimeImport(content)) {\r\n return null;\r\n }\r\n\r\n if (!/createWebHistory\\s*\\(/.test(content)) {\r\n return null;\r\n }\r\n\r\n let updated = content;\r\n\r\n if (!hasRuntimeImport(updated)) {\r\n const runtimeImport = \"import { getBase } from 'vite-basepath/runtime';\\n\";\r\n const lastImportEnd = findLastImportEnd(updated);\r\n updated = updated.slice(0, lastImportEnd) + runtimeImport + updated.slice(lastImportEnd);\r\n }\r\n\r\n updated = updated.replace(\r\n /createWebHistory\\s*\\(\\s*[^)]*\\)/g,\r\n 'createWebHistory(getBase())',\r\n );\r\n\r\n return updated !== content ? updated : null;\r\n}\r\n\r\nfunction findLastImportEnd(content: string): number {\r\n const importBlock = /^(?:import\\s[\\s\\S]*?from\\s+['\"][^'\"]+['\"];|const\\s+\\w+\\s*=\\s*require\\(['\"][^'\"]+['\"]\\);)/gm;\r\n let lastEnd = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = importBlock.exec(content)) !== null) {\r\n lastEnd = match.index + match[0].length;\r\n }\r\n if (lastEnd > 0) {\r\n const after = content.slice(lastEnd).match(/^[\\r\\n]+/);\r\n return lastEnd + (after ? after[0].length : 0);\r\n }\r\n return 0;\r\n}\r\n\r\nexport function patchRouterFiles(\r\n files: string[],\r\n framework: Framework,\r\n): RouterPatchResult[] {\r\n const results: RouterPatchResult[] = [];\r\n\r\n for (const file of files) {\r\n const content = readText(file);\r\n if (!content) continue;\r\n\r\n let patched: string | null = null;\r\n\r\n if (framework === 'react') {\r\n patched = patchReactRouter(content);\r\n } else if (framework === 'vue') {\r\n patched = patchVueRouter(content);\r\n }\r\n\r\n if (patched) {\r\n writeText(file, patched);\r\n results.push({ file, changed: true, message: `Updated router in ${file}` });\r\n } else if (\r\n (framework === 'react' && /<BrowserRouter/.test(content)) ||\r\n (framework === 'vue' && /createWebHistory/.test(content))\r\n ) {\r\n results.push({\r\n file,\r\n changed: false,\r\n message: `Router in ${file} already configured or needs manual update`,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n","import { existsSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { fileExists, writeText } from './fs.js';\r\nimport { buildCommand, type PackageManager } from './detect.js';\r\n\r\nexport interface CiOptions {\r\n cwd: string;\r\n packageManager: PackageManager;\r\n nodeVersion?: string;\r\n buildOutputDir?: string;\r\n}\r\n\r\nconst DEFAULT_NODE_VERSION = '22';\r\n\r\nfunction getSetupAction(pm: PackageManager, cwd: string): { install: string; cache?: string } {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { install: 'pnpm install --frozen-lockfile', cache: 'pnpm' };\r\n case 'yarn':\r\n return { install: 'yarn install --frozen-lockfile', cache: 'yarn' };\r\n case 'bun':\r\n return { install: 'bun install --frozen-lockfile' };\r\n default:\r\n return {\r\n install: existsSync(join(cwd, 'package-lock.json')) ? 'npm ci' : 'npm install',\r\n };\r\n }\r\n}\r\n\r\nfunction getSetupNodeCache(pm: PackageManager, cwd: string): string {\r\n const { cache } = getSetupAction(pm, cwd);\r\n if (!cache) return '';\r\n return `\\n cache: '${cache}'`;\r\n}\r\n\r\nfunction getPnpmSetupStep(pm: PackageManager): string {\r\n if (pm !== 'pnpm') return '';\r\n return `\r\n - name: Setup pnpm\r\n uses: pnpm/action-setup@v4\r\n with:\r\n version: 9\r\n`;\r\n}\r\n\r\nexport function generateWorkflow(options: CiOptions): string {\r\n const nodeVersion = options.nodeVersion ?? DEFAULT_NODE_VERSION;\r\n const outDir = options.buildOutputDir ?? 'dist';\r\n const { install } = getSetupAction(options.packageManager, options.cwd);\r\n const cacheLine = getSetupNodeCache(options.packageManager, options.cwd);\r\n const build = buildCommand(options.packageManager);\r\n\r\n return `# Generated by vite-on-github — deploys Vite app to GitHub Pages\r\nname: Deploy to GitHub Pages\r\n\r\non:\r\n push:\r\n branches: [main, master]\r\n workflow_dispatch:\r\n\r\npermissions:\r\n contents: read\r\n pages: write\r\n id-token: write\r\n\r\nconcurrency:\r\n group: pages\r\n cancel-in-progress: true\r\n\r\njobs:\r\n build:\r\n runs-on: ubuntu-latest\r\n steps:\r\n - name: Checkout\r\n uses: actions/checkout@v4\r\n${getPnpmSetupStep(options.packageManager)}\r\n - name: Setup Node.js\r\n uses: actions/setup-node@v4\r\n with:\r\n node-version: '${nodeVersion}'${cacheLine}\r\n\r\n - name: Install dependencies\r\n run: ${install}\r\n\r\n - name: Build\r\n run: ${build}\r\n\r\n - name: SPA fallback for client-side routing\r\n run: cp ${outDir}/index.html ${outDir}/404.html\r\n\r\n - name: Setup Pages\r\n uses: actions/configure-pages@v5\r\n\r\n - name: Upload artifact\r\n uses: actions/upload-pages-artifact@v3\r\n with:\r\n path: ${outDir}\r\n\r\n deploy:\r\n needs: build\r\n runs-on: ubuntu-latest\r\n environment:\r\n name: github-pages\r\n url: \\${{ steps.deployment.outputs.page_url }}\r\n steps:\r\n - name: Deploy to GitHub Pages\r\n id: deployment\r\n uses: actions/deploy-pages@v4\r\n`;\r\n}\r\n\r\nexport function writeWorkflow(options: CiOptions): { path: string; created: boolean } {\r\n const workflowPath = join(options.cwd, '.github', 'workflows', 'deploy.yml');\r\n const exists = fileExists(workflowPath);\r\n writeText(workflowPath, generateWorkflow(options));\r\n return { path: workflowPath, created: !exists };\r\n}\r\n","import { execSync } from 'node:child_process';\r\nimport { log } from './logger.js';\r\n\r\nexport function runCommand(command: string, cwd: string, silent = false): void {\r\n log.dim(` $ ${command}`);\r\n execSync(command, {\r\n cwd,\r\n stdio: silent ? 'pipe' : 'inherit',\r\n encoding: 'utf-8',\r\n });\r\n}\r\n","import pc from 'picocolors';\r\n\r\nexport const log = {\r\n info: (msg: string) => console.log(pc.cyan('ℹ'), msg),\r\n success: (msg: string) => console.log(pc.green('✔'), msg),\r\n warn: (msg: string) => console.log(pc.yellow('⚠'), msg),\r\n error: (msg: string) => console.error(pc.red('✖'), msg),\r\n step: (msg: string) => console.log(pc.bold(pc.blue('→')), msg),\r\n dim: (msg: string) => console.log(pc.dim(msg)),\r\n};\r\n"],"mappings":"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","names":["pc","join","existsSync","join","existsSync","join","readPackageJson","findLastImportEnd","existsSync","join","existsSync","join","execSync","execSync","pc","confirm","spinner","pkg","readPackageJson","join"]}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "vite-on-github",
3
+ "version": "1.0.0",
4
+ "description": "One command to prepare any Vite project for GitHub Pages — auto config, base paths, CI, and router setup",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "vite-on-github": "./bin/vite-on-github.js"
10
+ },
11
+ "files": [
12
+ "bin",
13
+ "dist",
14
+ "assets",
15
+ "README.md",
16
+ "LICENSE"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "typecheck": "tsc --noEmit",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "vite",
26
+ "github",
27
+ "github-pages",
28
+ "deploy",
29
+ "ci",
30
+ "base-path",
31
+ "vite-basepath",
32
+ "automation",
33
+ "cli"
34
+ ],
35
+ "author": "Foisalislambd",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/Foisalislambd/vite-on-github.git"
40
+ },
41
+ "homepage": "https://github.com/Foisalislambd/vite-on-github#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/Foisalislambd/vite-on-github/issues"
44
+ },
45
+ "engines": {
46
+ "node": ">=18"
47
+ },
48
+ "dependencies": {
49
+ "@clack/prompts": "^0.10.0",
50
+ "picocolors": "^1.1.1"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^22.10.0",
54
+ "tsup": "^8.4.0",
55
+ "typescript": "^5.7.0"
56
+ },
57
+ "peerDependencies": {
58
+ "vite": ">=3.0.0"
59
+ },
60
+ "peerDependenciesMeta": {
61
+ "vite": {
62
+ "optional": true
63
+ }
64
+ }
65
+ }