chore: Updated CONTRIBUTING.md c653e497
Steve · 2025-08-09 14:28 1 file(s) · +101 −1
CONTRIBUTING.md +101 −1
18 18
2.  Run `bun install` to install the dependencies.
19 19
3.  Make your changes.
20 20
4.  Run `bun run build` to make sure your changes build correctly.
21 -
5.  Issue that pull request!
21 +
5.  Use `bun dist` to run the CLI and test your new changes.
22 +
6.  Use `bun lint` and `bun format` to apply Biome formatting and lint checking.
23 +
7.  Use `bun test` to run unit tests. Depending on your PR consider adding tests.
24 +
8.  Issue that pull request!
25 +
26 +
## Repo Structure
27 +
28 +
`create-bhvr` is a CLI tool that generates full-stack TypeScript projects using the Bun + Hono + Vite + React (BHVR) stack. The tool scaffolds projects from GitHub templates and allows users to add various extensions like TanStack Query, React Router, and more.
29 +
30 +
### Project Architecture
31 +
32 +
```
33 +
src/
34 +
├── commands/           # CLI command handlers
35 +
│   └── create.ts      # Main create command implementation
36 +
├── installers/        # Extension installers
37 +
│   ├── react-router.ts      # React Router setup
38 +
│   ├── rpc.ts              # RPC integration
39 +
│   ├── tanstack-query.ts   # TanStack Query setup
40 +
│   └── tanstack-router.ts  # TanStack Router setup
41 +
├── lib/               # Core functionality
42 +
│   ├── create-project.ts    # Main project creation orchestrator
43 +
│   ├── scaffold-template.ts # Template downloading and setup
44 +
│   ├── install-dependencies.ts
45 +
│   ├── prompt-for-options.ts
46 +
│   └── ...
47 +
├── templates/extras/  # Template variations for extensions
48 +
│   └── client/
49 +
│       ├── src/App.tsx/     # App.tsx variants for different combinations
50 +
│       ├── src/main.tsx/    # Entry point variants
51 +
│       ├── src/components/  # Component variants
52 +
│       └── vite.config.ts/  # Vite config variants
53 +
├── utils/             # Utility functions
54 +
│   ├── name-generator.ts    # Generates template file names
55 +
│   ├── templates.ts         # Template configurations
56 +
│   └── constants.ts
57 +
└── types.ts           # TypeScript definitions
58 +
```
59 +
60 +
### How Extensions Work
61 +
62 +
Extensions in create-bhvr follow a modular architecture where each extension has:
63 +
64 +
1. **An Installer** (`src/installers/*.ts`) that handles:
65 +
   - Adding dependencies via `addPackageDependency()`
66 +
   - Copying appropriate template files using the `nameGenerator()` utility
67 +
   - Managing configuration changes
68 +
69 +
2. **Template variants** (`src/templates/extras/`) that provide:
70 +
   - Pre-configured code for different extension combinations
71 +
   - File variants named using a convention like `App-with-rpc-tailwind-tanstackquery.tsx`
72 +
   - Smart file selection based on enabled options
73 +
74 +
#### Adding New Extensions
75 +
76 +
To add a new extension (e.g., "myextension"):
77 +
78 +
1. **Create the installer** (`src/installers/myextension.ts`):
79 +
   ```typescript
80 +
   export const myExtensionInstaller = async (options: Required<ProjectOptions>) => {
81 +
     // Install dependencies
82 +
     await addPackageDependency({
83 +
       dependencies: ["my-package"],
84 +
       target: "client",
85 +
       projectName: options.projectName,
86 +
     });
87 +
88 +
     // Copy appropriate template files
89 +
     const selectedTemplate = nameGenerator("App.tsx", {
90 +
       myExtension: options.myExtension,
91 +
       // ... other options
92 +
     });
93 +
   };
94 +
   ```
95 +
96 +
2. **Add template variants** in `src/templates/extras/client/src/`:
97 +
   - Create files like `App-with-myextension.tsx`
98 +
   - Support all possible combinations like `App-with-myextension-tailwind.tsx`
99 +
100 +
3. **Update types** (`src/types.ts`):
101 +
   ```typescript
102 +
   export type ProjectOptions = {
103 +
     // ... existing options
104 +
     myExtension?: boolean;
105 +
   };
106 +
   ```
107 +
108 +
4. **Update the name generator logic** (`src/utils/name-generator.ts`) if needed for special naming rules.
109 +
110 +
#### Template File Naming Convention
111 +
112 +
The `nameGenerator()` utility creates file names based on enabled options:
113 +
- Base file: `App.tsx`
114 +
- With TanStack Query: `App-with-tanstackquery.tsx`
115 +
- Multiple extensions: `App-with-rpc-tailwind-tanstackquery.tsx`
116 +
117 +
Options are sorted alphabetically to ensure consistent naming.
118 +
119 +
#### Updating GitHub Actions
120 +
121 +
To make sure your new addition to extensions work, please add your combination to `.github/workflows/test-cli-options.yml` to make sure it does not break other builds. In order to do this you need to add your combination to the matrix and make sure a flag is included in `src/index.ts`.
22 122
23 123
## License
24 124