cursor-kit-cli 1.2.0-beta → 1.2.0-beta.3
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/bin/cursor-reinstall-instance.sh +102 -0
- package/dist/cli.cjs +366 -69
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +367 -70
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +39 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +33 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/commands/docs.md +5 -3
- package/templates/commands/explain.md +5 -3
- package/templates/commands/fix.md +5 -3
- package/templates/commands/implement.md +5 -3
- package/templates/commands/refactor.md +5 -3
- package/templates/commands/review.md +5 -3
- package/templates/commands/test.md +5 -3
- package/templates/manifest.json +11 -8
- package/templates/rules/git.mdc +0 -2
- package/templates/rules/toc.mdc +17 -9
- package/templates/skills/aesthetic/SKILL.md +121 -0
- package/templates/skills/aesthetic/assets/design-guideline-template.md +163 -0
- package/templates/skills/aesthetic/assets/design-story-template.md +135 -0
- package/templates/skills/aesthetic/references/design-principles.md +62 -0
- package/templates/skills/aesthetic/references/design-resources.md +75 -0
- package/templates/skills/aesthetic/references/micro-interactions.md +53 -0
- package/templates/skills/aesthetic/references/storytelling-design.md +50 -0
- package/templates/skills/backend-development/SKILL.mdc +95 -0
- package/templates/skills/backend-development/references/backend-api-design.md +495 -0
- package/templates/skills/backend-development/references/backend-architecture.md +454 -0
- package/templates/skills/backend-development/references/backend-authentication.md +338 -0
- package/templates/skills/backend-development/references/backend-code-quality.md +659 -0
- package/templates/skills/backend-development/references/backend-debugging.md +904 -0
- package/templates/skills/backend-development/references/backend-devops.md +494 -0
- package/templates/skills/backend-development/references/backend-mindset.md +387 -0
- package/templates/skills/backend-development/references/backend-performance.md +397 -0
- package/templates/skills/backend-development/references/backend-security.md +290 -0
- package/templates/skills/backend-development/references/backend-technologies.md +256 -0
- package/templates/skills/backend-development/references/backend-testing.md +429 -0
- package/templates/skills/frontend-design/SKILL.mdc +41 -0
- package/templates/skills/frontend-design/references/animejs.md +396 -0
- package/templates/skills/frontend-development/SKILL.mdc +399 -0
- package/templates/skills/frontend-development/resources/common-patterns.md +331 -0
- package/templates/skills/frontend-development/resources/complete-examples.md +872 -0
- package/templates/skills/frontend-development/resources/component-patterns.md +502 -0
- package/templates/skills/frontend-development/resources/data-fetching.md +767 -0
- package/templates/skills/frontend-development/resources/file-organization.md +502 -0
- package/templates/skills/frontend-development/resources/loading-and-error-states.md +501 -0
- package/templates/skills/frontend-development/resources/performance.md +406 -0
- package/templates/skills/frontend-development/resources/routing-guide.md +364 -0
- package/templates/skills/frontend-development/resources/styling-guide.md +428 -0
- package/templates/skills/frontend-development/resources/typescript-standards.md +418 -0
- package/templates/skills/problem-solving/SKILL.mdc +96 -0
- package/templates/skills/problem-solving/references/attribution.md +69 -0
- package/templates/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/templates/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/templates/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/templates/skills/problem-solving/references/scale-game.md +95 -0
- package/templates/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/templates/skills/problem-solving/references/when-stuck.md +72 -0
- package/templates/skills/research/SKILL.mdc +168 -0
- package/templates/skills/sequential-thinking/.env.example +8 -0
- package/templates/skills/sequential-thinking/README.md +183 -0
- package/templates/skills/sequential-thinking/SKILL.mdc +94 -0
- package/templates/skills/sequential-thinking/package.json +31 -0
- package/templates/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/templates/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/templates/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/templates/skills/sequential-thinking/references/examples-api.md +88 -0
- package/templates/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/templates/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/templates/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/templates/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/templates/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/templates/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/templates/skills/ui-styling/LICENSE.txt +202 -0
- package/templates/skills/ui-styling/SKILL.mdc +321 -0
- package/templates/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/templates/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/templates/skills/ui-styling/references/shadcn-components.md +424 -0
- package/templates/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/templates/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/templates/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/templates/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/templates/rules/frontend-design.mdc +0 -48
- package/templates/rules/performance.mdc +0 -54
- package/templates/rules/react.mdc +0 -58
- package/templates/rules/security.mdc +0 -50
- package/templates/rules/testing.mdc +0 -54
- package/templates/rules/typescript.mdc +0 -36
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
# File Organization
|
|
2
|
+
|
|
3
|
+
Proper file and directory structure for maintainable, scalable frontend code in the the application.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## features/ vs components/ Distinction
|
|
8
|
+
|
|
9
|
+
### features/ Directory
|
|
10
|
+
|
|
11
|
+
**Purpose**: Domain-specific features with their own logic, API, and components
|
|
12
|
+
|
|
13
|
+
**When to use:**
|
|
14
|
+
- Feature has multiple related components
|
|
15
|
+
- Feature has its own API endpoints
|
|
16
|
+
- Feature has domain-specific logic
|
|
17
|
+
- Feature has custom hooks/utilities
|
|
18
|
+
|
|
19
|
+
**Examples:**
|
|
20
|
+
- `features/posts/` - Project catalog/post management
|
|
21
|
+
- `features/blogs/` - Blog builder and rendering
|
|
22
|
+
- `features/auth/` - Authentication flows
|
|
23
|
+
|
|
24
|
+
**Structure:**
|
|
25
|
+
```
|
|
26
|
+
features/
|
|
27
|
+
my-feature/
|
|
28
|
+
api/
|
|
29
|
+
myFeatureApi.ts # API service layer
|
|
30
|
+
components/
|
|
31
|
+
MyFeatureMain.tsx # Main component
|
|
32
|
+
SubComponents/ # Related components
|
|
33
|
+
hooks/
|
|
34
|
+
useMyFeature.ts # Custom hooks
|
|
35
|
+
useSuspenseMyFeature.ts # Suspense hooks
|
|
36
|
+
helpers/
|
|
37
|
+
myFeatureHelpers.ts # Utility functions
|
|
38
|
+
types/
|
|
39
|
+
index.ts # TypeScript types
|
|
40
|
+
index.ts # Public exports
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### components/ Directory
|
|
44
|
+
|
|
45
|
+
**Purpose**: Truly reusable components used across multiple features
|
|
46
|
+
|
|
47
|
+
**When to use:**
|
|
48
|
+
- Component is used in 3+ places
|
|
49
|
+
- Component is generic (no feature-specific logic)
|
|
50
|
+
- Component is a UI primitive or pattern
|
|
51
|
+
|
|
52
|
+
**Examples:**
|
|
53
|
+
- `components/SuspenseLoader/` - Loading wrapper
|
|
54
|
+
- `components/CustomAppBar/` - Application header
|
|
55
|
+
- `components/ErrorBoundary/` - Error handling
|
|
56
|
+
- `components/LoadingOverlay/` - Loading overlay
|
|
57
|
+
|
|
58
|
+
**Structure:**
|
|
59
|
+
```
|
|
60
|
+
components/
|
|
61
|
+
SuspenseLoader/
|
|
62
|
+
SuspenseLoader.tsx
|
|
63
|
+
SuspenseLoader.test.tsx
|
|
64
|
+
CustomAppBar/
|
|
65
|
+
CustomAppBar.tsx
|
|
66
|
+
CustomAppBar.test.tsx
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Feature Directory Structure (Detailed)
|
|
72
|
+
|
|
73
|
+
### Complete Feature Example
|
|
74
|
+
|
|
75
|
+
Based on `features/posts/` structure:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
features/
|
|
79
|
+
posts/
|
|
80
|
+
api/
|
|
81
|
+
postApi.ts # API service layer (GET, POST, PUT, DELETE)
|
|
82
|
+
|
|
83
|
+
components/
|
|
84
|
+
PostTable.tsx # Main container component
|
|
85
|
+
grids/
|
|
86
|
+
PostDataGrid/
|
|
87
|
+
PostDataGrid.tsx
|
|
88
|
+
drawers/
|
|
89
|
+
ProjectPostDrawer/
|
|
90
|
+
ProjectPostDrawer.tsx
|
|
91
|
+
cells/
|
|
92
|
+
editors/
|
|
93
|
+
TextEditCell.tsx
|
|
94
|
+
renderers/
|
|
95
|
+
DateCell.tsx
|
|
96
|
+
toolbar/
|
|
97
|
+
CustomToolbar.tsx
|
|
98
|
+
|
|
99
|
+
hooks/
|
|
100
|
+
usePostQueries.ts # Regular queries
|
|
101
|
+
useSuspensePost.ts # Suspense queries
|
|
102
|
+
usePostMutations.ts # Mutations
|
|
103
|
+
useGridLayout.ts # Feature-specific hooks
|
|
104
|
+
|
|
105
|
+
helpers/
|
|
106
|
+
postHelpers.ts # Utility functions
|
|
107
|
+
validation.ts # Validation logic
|
|
108
|
+
|
|
109
|
+
types/
|
|
110
|
+
index.ts # TypeScript types/interfaces
|
|
111
|
+
|
|
112
|
+
queries/
|
|
113
|
+
postQueries.ts # Query key factories (optional)
|
|
114
|
+
|
|
115
|
+
context/
|
|
116
|
+
PostContext.tsx # React context (if needed)
|
|
117
|
+
|
|
118
|
+
index.ts # Public API exports
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Subdirectory Guidelines
|
|
122
|
+
|
|
123
|
+
#### api/ Directory
|
|
124
|
+
|
|
125
|
+
**Purpose**: Centralized API calls for the feature
|
|
126
|
+
|
|
127
|
+
**Files:**
|
|
128
|
+
- `{feature}Api.ts` - Main API service
|
|
129
|
+
|
|
130
|
+
**Pattern:**
|
|
131
|
+
```typescript
|
|
132
|
+
// features/my-feature/api/myFeatureApi.ts
|
|
133
|
+
import apiClient from '@/lib/apiClient';
|
|
134
|
+
|
|
135
|
+
export const myFeatureApi = {
|
|
136
|
+
getItem: async (id: number) => {
|
|
137
|
+
const { data } = await apiClient.get(`/blog/items/${id}`);
|
|
138
|
+
return data;
|
|
139
|
+
},
|
|
140
|
+
createItem: async (payload) => {
|
|
141
|
+
const { data } = await apiClient.post('/blog/items', payload);
|
|
142
|
+
return data;
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### components/ Directory
|
|
148
|
+
|
|
149
|
+
**Purpose**: Feature-specific components
|
|
150
|
+
|
|
151
|
+
**Organization:**
|
|
152
|
+
- Flat structure if <5 components
|
|
153
|
+
- Subdirectories by responsibility if >5 components
|
|
154
|
+
|
|
155
|
+
**Examples:**
|
|
156
|
+
```
|
|
157
|
+
components/
|
|
158
|
+
MyFeatureMain.tsx # Main component
|
|
159
|
+
MyFeatureHeader.tsx # Supporting components
|
|
160
|
+
MyFeatureFooter.tsx
|
|
161
|
+
|
|
162
|
+
# OR with subdirectories:
|
|
163
|
+
containers/
|
|
164
|
+
MyFeatureContainer.tsx
|
|
165
|
+
presentational/
|
|
166
|
+
MyFeatureDisplay.tsx
|
|
167
|
+
blogs/
|
|
168
|
+
MyFeatureBlog.tsx
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### hooks/ Directory
|
|
172
|
+
|
|
173
|
+
**Purpose**: Custom hooks for the feature
|
|
174
|
+
|
|
175
|
+
**Naming:**
|
|
176
|
+
- `use` prefix (camelCase)
|
|
177
|
+
- Descriptive of what they do
|
|
178
|
+
|
|
179
|
+
**Examples:**
|
|
180
|
+
```
|
|
181
|
+
hooks/
|
|
182
|
+
useMyFeature.ts # Main hook
|
|
183
|
+
useSuspenseMyFeature.ts # Suspense version
|
|
184
|
+
useMyFeatureMutations.ts # Mutations
|
|
185
|
+
useMyFeatureFilters.ts # Filters/search
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
#### helpers/ Directory
|
|
189
|
+
|
|
190
|
+
**Purpose**: Utility functions specific to the feature
|
|
191
|
+
|
|
192
|
+
**Examples:**
|
|
193
|
+
```
|
|
194
|
+
helpers/
|
|
195
|
+
myFeatureHelpers.ts # General utilities
|
|
196
|
+
validation.ts # Validation logic
|
|
197
|
+
transblogers.ts # Data transblogations
|
|
198
|
+
constants.ts # Constants
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
#### types/ Directory
|
|
202
|
+
|
|
203
|
+
**Purpose**: TypeScript types and interfaces
|
|
204
|
+
|
|
205
|
+
**Files:**
|
|
206
|
+
```
|
|
207
|
+
types/
|
|
208
|
+
index.ts # Main types, exported
|
|
209
|
+
internal.ts # Internal types (not exported)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Import Aliases (Vite Configuration)
|
|
215
|
+
|
|
216
|
+
### Available Aliases
|
|
217
|
+
|
|
218
|
+
From `vite.config.ts` lines 180-185:
|
|
219
|
+
|
|
220
|
+
| Alias | Resolves To | Use For |
|
|
221
|
+
|-------|-------------|---------|
|
|
222
|
+
| `@/` | `src/` | Absolute imports from src root |
|
|
223
|
+
| `~types` | `src/types` | Shared TypeScript types |
|
|
224
|
+
| `~components` | `src/components` | Reusable components |
|
|
225
|
+
| `~features` | `src/features` | Feature imports |
|
|
226
|
+
|
|
227
|
+
### Usage Examples
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
// ✅ PREFERRED - Use aliases for absolute imports
|
|
231
|
+
import { apiClient } from '@/lib/apiClient';
|
|
232
|
+
import { SuspenseLoader } from '~components/SuspenseLoader';
|
|
233
|
+
import { postApi } from '~features/posts/api/postApi';
|
|
234
|
+
import type { User } from '~types/user';
|
|
235
|
+
|
|
236
|
+
// ❌ AVOID - Relative paths from deep nesting
|
|
237
|
+
import { apiClient } from '../../../lib/apiClient';
|
|
238
|
+
import { SuspenseLoader } from '../../../components/SuspenseLoader';
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### When to Use Which Alias
|
|
242
|
+
|
|
243
|
+
**@/ (General)**:
|
|
244
|
+
- Lib utilities: `@/lib/apiClient`
|
|
245
|
+
- Hooks: `@/hooks/useAuth`
|
|
246
|
+
- Config: `@/config/theme`
|
|
247
|
+
- Shared services: `@/services/authService`
|
|
248
|
+
|
|
249
|
+
**~types (Type Imports)**:
|
|
250
|
+
```typescript
|
|
251
|
+
import type { Post } from '~types/post';
|
|
252
|
+
import type { User, UserRole } from '~types/user';
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**~components (Reusable Components)**:
|
|
256
|
+
```typescript
|
|
257
|
+
import { SuspenseLoader } from '~components/SuspenseLoader';
|
|
258
|
+
import { CustomAppBar } from '~components/CustomAppBar';
|
|
259
|
+
import { ErrorBoundary } from '~components/ErrorBoundary';
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**~features (Feature Imports)**:
|
|
263
|
+
```typescript
|
|
264
|
+
import { postApi } from '~features/posts/api/postApi';
|
|
265
|
+
import { useAuth } from '~features/auth/hooks/useAuth';
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## File Naming Conventions
|
|
271
|
+
|
|
272
|
+
### Components
|
|
273
|
+
|
|
274
|
+
**Pattern**: PascalCase with `.tsx` extension
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
MyComponent.tsx
|
|
278
|
+
PostDataGrid.tsx
|
|
279
|
+
CustomAppBar.tsx
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Avoid:**
|
|
283
|
+
- camelCase: `myComponent.tsx` ❌
|
|
284
|
+
- kebab-case: `my-component.tsx` ❌
|
|
285
|
+
- All caps: `MYCOMPONENT.tsx` ❌
|
|
286
|
+
|
|
287
|
+
### Hooks
|
|
288
|
+
|
|
289
|
+
**Pattern**: camelCase with `use` prefix, `.ts` extension
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
useMyFeature.ts
|
|
293
|
+
useSuspensePost.ts
|
|
294
|
+
useAuth.ts
|
|
295
|
+
useGridLayout.ts
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### API Services
|
|
299
|
+
|
|
300
|
+
**Pattern**: camelCase with `Api` suffix, `.ts` extension
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
myFeatureApi.ts
|
|
304
|
+
postApi.ts
|
|
305
|
+
userApi.ts
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Helpers/Utilities
|
|
309
|
+
|
|
310
|
+
**Pattern**: camelCase with descriptive name, `.ts` extension
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
myFeatureHelpers.ts
|
|
314
|
+
validation.ts
|
|
315
|
+
transblogers.ts
|
|
316
|
+
constants.ts
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Types
|
|
320
|
+
|
|
321
|
+
**Pattern**: camelCase, `index.ts` or descriptive name
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
types/index.ts
|
|
325
|
+
types/post.ts
|
|
326
|
+
types/user.ts
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## When to Create a New Feature
|
|
332
|
+
|
|
333
|
+
### Create New Feature When:
|
|
334
|
+
|
|
335
|
+
- Multiple related components (>3)
|
|
336
|
+
- Has own API endpoints
|
|
337
|
+
- Domain-specific logic
|
|
338
|
+
- Will grow over time
|
|
339
|
+
- Reused across multiple routes
|
|
340
|
+
|
|
341
|
+
**Example:** `features/posts/`
|
|
342
|
+
- 20+ components
|
|
343
|
+
- Own API service
|
|
344
|
+
- Complex state management
|
|
345
|
+
- Used in multiple routes
|
|
346
|
+
|
|
347
|
+
### Add to Existing Feature When:
|
|
348
|
+
|
|
349
|
+
- Related to existing feature
|
|
350
|
+
- Shares same API
|
|
351
|
+
- Logically grouped
|
|
352
|
+
- Extends existing functionality
|
|
353
|
+
|
|
354
|
+
**Example:** Adding export dialog to posts feature
|
|
355
|
+
|
|
356
|
+
### Create Reusable Component When:
|
|
357
|
+
|
|
358
|
+
- Used across 3+ features
|
|
359
|
+
- Generic, no domain logic
|
|
360
|
+
- Pure presentation
|
|
361
|
+
- Shared pattern
|
|
362
|
+
|
|
363
|
+
**Example:** `components/SuspenseLoader/`
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Import Organization
|
|
368
|
+
|
|
369
|
+
### Import Order (Recommended)
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
// 1. React and React-related
|
|
373
|
+
import React, { useState, useCallback, useMemo } from 'react';
|
|
374
|
+
import { lazy } from 'react';
|
|
375
|
+
|
|
376
|
+
// 2. Third-party libraries (alphabetical)
|
|
377
|
+
import { Box, Paper, Button, Grid } from '@mui/material';
|
|
378
|
+
import type { SxProps, Theme } from '@mui/material';
|
|
379
|
+
import { useSuspenseQuery, useQueryClient } from '@tanstack/react-query';
|
|
380
|
+
import { createFileRoute } from '@tanstack/react-router';
|
|
381
|
+
|
|
382
|
+
// 3. Alias imports (@ first, then ~)
|
|
383
|
+
import { apiClient } from '@/lib/apiClient';
|
|
384
|
+
import { useAuth } from '@/hooks/useAuth';
|
|
385
|
+
import { useMuiSnackbar } from '@/hooks/useMuiSnackbar';
|
|
386
|
+
import { SuspenseLoader } from '~components/SuspenseLoader';
|
|
387
|
+
import { postApi } from '~features/posts/api/postApi';
|
|
388
|
+
|
|
389
|
+
// 4. Type imports (grouped)
|
|
390
|
+
import type { Post } from '~types/post';
|
|
391
|
+
import type { User } from '~types/user';
|
|
392
|
+
|
|
393
|
+
// 5. Relative imports (same feature)
|
|
394
|
+
import { MySubComponent } from './MySubComponent';
|
|
395
|
+
import { useMyFeature } from '../hooks/useMyFeature';
|
|
396
|
+
import { myFeatureHelpers } from '../helpers/myFeatureHelpers';
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Use single quotes** for all imports (project standard)
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Public API Pattern
|
|
404
|
+
|
|
405
|
+
### feature/index.ts
|
|
406
|
+
|
|
407
|
+
Export public API from feature for clean imports:
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
// features/my-feature/index.ts
|
|
411
|
+
|
|
412
|
+
// Export main components
|
|
413
|
+
export { MyFeatureMain } from './components/MyFeatureMain';
|
|
414
|
+
export { MyFeatureHeader } from './components/MyFeatureHeader';
|
|
415
|
+
|
|
416
|
+
// Export hooks
|
|
417
|
+
export { useMyFeature } from './hooks/useMyFeature';
|
|
418
|
+
export { useSuspenseMyFeature } from './hooks/useSuspenseMyFeature';
|
|
419
|
+
|
|
420
|
+
// Export API
|
|
421
|
+
export { myFeatureApi } from './api/myFeatureApi';
|
|
422
|
+
|
|
423
|
+
// Export types
|
|
424
|
+
export type { MyFeatureData, MyFeatureConfig } from './types';
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Usage:**
|
|
428
|
+
```typescript
|
|
429
|
+
// ✅ Clean import from feature index
|
|
430
|
+
import { MyFeatureMain, useMyFeature } from '~features/my-feature';
|
|
431
|
+
|
|
432
|
+
// ❌ Avoid deep imports (but OK if needed)
|
|
433
|
+
import { MyFeatureMain } from '~features/my-feature/components/MyFeatureMain';
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Directory Structure Visualization
|
|
439
|
+
|
|
440
|
+
```
|
|
441
|
+
src/
|
|
442
|
+
├── features/ # Domain-specific features
|
|
443
|
+
│ ├── posts/
|
|
444
|
+
│ │ ├── api/
|
|
445
|
+
│ │ ├── components/
|
|
446
|
+
│ │ ├── hooks/
|
|
447
|
+
│ │ ├── helpers/
|
|
448
|
+
│ │ ├── types/
|
|
449
|
+
│ │ └── index.ts
|
|
450
|
+
│ ├── blogs/
|
|
451
|
+
│ └── auth/
|
|
452
|
+
│
|
|
453
|
+
├── components/ # Reusable components
|
|
454
|
+
│ ├── SuspenseLoader/
|
|
455
|
+
│ ├── CustomAppBar/
|
|
456
|
+
│ ├── ErrorBoundary/
|
|
457
|
+
│ └── LoadingOverlay/
|
|
458
|
+
│
|
|
459
|
+
├── routes/ # TanStack Router routes
|
|
460
|
+
│ ├── __root.tsx
|
|
461
|
+
│ ├── index.tsx
|
|
462
|
+
│ ├── project-catalog/
|
|
463
|
+
│ │ ├── index.tsx
|
|
464
|
+
│ │ └── create/
|
|
465
|
+
│ └── blogs/
|
|
466
|
+
│
|
|
467
|
+
├── hooks/ # Shared hooks
|
|
468
|
+
│ ├── useAuth.ts
|
|
469
|
+
│ ├── useMuiSnackbar.ts
|
|
470
|
+
│ └── useDebounce.ts
|
|
471
|
+
│
|
|
472
|
+
├── lib/ # Shared utilities
|
|
473
|
+
│ ├── apiClient.ts
|
|
474
|
+
│ └── utils.ts
|
|
475
|
+
│
|
|
476
|
+
├── types/ # Shared TypeScript types
|
|
477
|
+
│ ├── user.ts
|
|
478
|
+
│ ├── post.ts
|
|
479
|
+
│ └── common.ts
|
|
480
|
+
│
|
|
481
|
+
├── config/ # Configuration
|
|
482
|
+
│ └── theme.ts
|
|
483
|
+
│
|
|
484
|
+
└── App.tsx # Root component
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Summary
|
|
490
|
+
|
|
491
|
+
**Key Principles:**
|
|
492
|
+
1. **features/** for domain-specific code
|
|
493
|
+
2. **components/** for truly reusable UI
|
|
494
|
+
3. Use subdirectories: api/, components/, hooks/, helpers/, types/
|
|
495
|
+
4. Import aliases for clean imports (@/, ~types, ~components, ~features)
|
|
496
|
+
5. Consistent naming: PascalCase components, camelCase utilities
|
|
497
|
+
6. Export public API from feature index.ts
|
|
498
|
+
|
|
499
|
+
**See Also:**
|
|
500
|
+
- [component-patterns.md](component-patterns.md) - Component structure
|
|
501
|
+
- [data-fetching.md](data-fetching.md) - API service patterns
|
|
502
|
+
- [complete-examples.md](complete-examples.md) - Full feature example
|