/
├── assets/
├── src/
│ ├── styles/
│ ├── methods/
│ ├── components/
│ ├── hooks/
│ ├── interfaces/
│ ├── types/
│ ├── enums/
│ ├── classes/
│ ├── ui/ (shadcn/ui)
-
Use camelCase for all folders
-
Root contains config files (
package.json,eslint.config.js, etc.) -
Entry file must be:
index.tsorindex.tsx- ❌
main.tsis forbidden
- Must start with uppercase
- File name = component name
- One component per file
- Must be a default export
- Must be a function declaration (NOT arrow function)
export default function Component() {
return <h1>Component</h1>
}export default const Component = () => {} // arrow function not allowedexport default function () {} // must be named- Define a
Propsinterface at top of file - Only local unless moved to
/interfaces
interface Props {
name: string
}
export default function Component({ name }: Props) {
return <h1>{name}</h1>
}export interface Props {} // must not be exportedinterface ComponentProperties {} // must be named Propsexport default function Component({ name }: { name: string }) {}- Max ~100 lines
- Move logic to custom hooks if too large
- PascalCase naming (
UserData) - File name = interface name
- One interface per file
- Must be default export
export default interface UserData {
username: string
}export default interface UserDataInterface {}- ❌ Do NOT use prefix
I(e.g.,IUserData)
-
Same rules as interfaces, except:
- Cannot directly default export
enum View {
DAY = 'day',
WEEK = 'week',
MONTH = 'month'
}
export default Viewexport enum View {} // not allowed- camelCase
- One method per file
- Must be default exported
export default function getRandomNumber() {}export function a() {}
export function b() {}- Must use function declaration
- ❌ No arrow functions
- Must use arrow functions
const update = () => {}- Use
useMemo/useCallbackfor performance
- Optional
Optionsinterface allowed - Only local unless moved to
/interfaces
interface Options {
option: boolean
}
export default function method(param: string, options: Options) {}- Use UPPERCASE_SNAKE_CASE
- Group into a single object
- Must be default exported
const API = {
path: '/api/v1/',
port: '4000'
}
export default APIconst API_PATH = '/api/v1/'
export default API_PATH- Always wrap even single constants in an object
- Must start with
use - File name = hook name
- One hook per file
- Must be default export
- Must be function declaration (NOT arrow)
export default function useOnlineStatus() {
const [online, setOnline] = useState(false)
return { online }
}export default const useOnlineStatus = () => {}export default function () {} // must be named- Same rule as method options (
Optionsinterface)
A file that re-exports modules (usually index.ts)
- ✅ Allowed ONLY for libraries
- ❌ Forbidden in application code
- Consistency over flexibility
- Strict file isolation (1 entity per file)
- Prefer explicit structure over shortcuts
- Optimize readability and maintainability