create-ern-boilerplate 0.0.16 → 0.0.18
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/create.js +13 -7
- package/package.json +1 -1
- package/templates/default/.gitignore-template +71 -0
- package/templates/improved/README.md +274 -0
- package/templates/improved/app/(admin)/profile.tsx +589 -0
- package/templates/improved/app/(admin)/user-management.tsx +604 -0
- package/templates/improved/app/(auth)/_layout.tsx +25 -0
- package/templates/improved/app/(auth)/login.tsx +782 -0
- package/templates/improved/app/(auth)/register.tsx +547 -0
- package/templates/improved/app/(protected)/_layout.tsx +91 -0
- package/templates/improved/app/(protected)/home.tsx +665 -0
- package/templates/improved/app/(protected)/settings.tsx +332 -0
- package/templates/improved/app/_layout.tsx +24 -0
- package/templates/improved/app.json +58 -0
- package/templates/improved/babel.config.js +29 -0
- package/templates/improved/global.css +3 -0
- package/templates/improved/metro.config.js +6 -0
- package/templates/improved/nativewind-env.d.ts +3 -0
- package/templates/improved/package.json +54 -0
- package/templates/improved/server/db.json +78 -0
- package/templates/improved/src/assets/images/adaptive-icon.png +0 -0
- package/templates/improved/src/assets/images/favicon.png +0 -0
- package/templates/improved/src/assets/images/icon.png +0 -0
- package/templates/improved/src/assets/images/splash-icon.png +0 -0
- package/templates/improved/src/components/auth/ProtectedRoute.tsx +105 -0
- package/templates/improved/src/components/common/Button.tsx +70 -0
- package/templates/improved/src/components/common/Card.tsx +32 -0
- package/templates/improved/src/components/common/Input.tsx +75 -0
- package/templates/improved/src/components/common/Loading.tsx +41 -0
- package/templates/improved/src/components/config/ToastConfig.tsx +109 -0
- package/templates/improved/src/components/header/AppHeader.tsx +160 -0
- package/templates/improved/src/components/shared/ConfirmDialog.tsx +151 -0
- package/templates/improved/src/components/shared/FormInput.tsx +67 -0
- package/templates/improved/src/components/shared/LucideIcon.tsx +18 -0
- package/templates/improved/src/components/shared/RoleSelector.tsx +63 -0
- package/templates/improved/src/components/users/EmptyState.tsx +70 -0
- package/templates/improved/src/components/users/ErrorState.tsx +64 -0
- package/templates/improved/src/components/users/FilterModal.tsx +264 -0
- package/templates/improved/src/components/users/UserCard.tsx +230 -0
- package/templates/improved/src/components/users/UserFormModal.tsx +230 -0
- package/templates/improved/src/contexts/AuthContext.tsx +93 -0
- package/templates/improved/src/contexts/ThemeContext.tsx +56 -0
- package/templates/improved/src/hooks/useAuth.ts +12 -0
- package/templates/improved/src/hooks/useTheme.ts +12 -0
- package/templates/improved/src/hooks/useUsers.ts +261 -0
- package/templates/improved/src/services/api.ts +97 -0
- package/templates/improved/src/services/authService.ts +42 -0
- package/templates/improved/src/services/mockApi/auth.mock.ts +89 -0
- package/templates/improved/src/services/mockApi/categories.mock.ts +75 -0
- package/templates/improved/src/services/mockApi/index.ts +79 -0
- package/templates/improved/src/services/mockApi/products.mock.ts +125 -0
- package/templates/improved/src/services/mockApi/users.mock.ts +83 -0
- package/templates/improved/src/services/productService.ts +143 -0
- package/templates/improved/src/services/userServices.ts +49 -0
- package/templates/improved/src/theme/colors.ts +32 -0
- package/templates/improved/src/types/api.types.ts +28 -0
- package/templates/improved/src/types/auth.types.ts +38 -0
- package/templates/improved/src/types/product.types.ts +49 -0
- package/templates/improved/src/types/user.types.ts +40 -0
- package/templates/improved/src/utils/constants.ts +47 -0
- package/templates/improved/src/utils/storage.ts +73 -0
- package/templates/improved/src/utils/validation.ts +54 -0
- package/templates/improved/tailwind.config.js +33 -0
- package/templates/improved/tsconfig.json +57 -0
package/create.js
CHANGED
|
@@ -78,8 +78,7 @@ async function main() {
|
|
|
78
78
|
autoInstall = hasInstall; // ✅ install hanya kalau ada flag --install
|
|
79
79
|
console.log(
|
|
80
80
|
chalk.green(
|
|
81
|
-
`📦 Membuat proyek ${projectName}... (mode cepat${
|
|
82
|
-
autoInstall ? " + install dependencies" : ""
|
|
81
|
+
`📦 Membuat proyek ${projectName}... (mode cepat${autoInstall ? " + install dependencies" : ""
|
|
83
82
|
})`
|
|
84
83
|
)
|
|
85
84
|
);
|
|
@@ -104,6 +103,14 @@ async function main() {
|
|
|
104
103
|
try {
|
|
105
104
|
await fs.copy(templateDir, targetDir);
|
|
106
105
|
|
|
106
|
+
// === Rename .gitignore-template ke .gitignore ===
|
|
107
|
+
const gitignoreTemplatePath = path.join(targetDir, ".gitignore-template");
|
|
108
|
+
const gitignorePath = path.join(targetDir, ".gitignore");
|
|
109
|
+
|
|
110
|
+
if (await fs.pathExists(gitignoreTemplatePath)) {
|
|
111
|
+
await fs.move(gitignoreTemplatePath, gitignorePath);
|
|
112
|
+
}
|
|
113
|
+
|
|
107
114
|
// === Update package.json ===
|
|
108
115
|
const pkgPath = path.join(targetDir, "package.json");
|
|
109
116
|
if (fs.existsSync(pkgPath)) {
|
|
@@ -154,11 +161,10 @@ async function main() {
|
|
|
154
161
|
${chalk.green("🎉 Selesai!")}
|
|
155
162
|
Langkah selanjutnya:
|
|
156
163
|
${chalk.cyan(`boilerplate ${projectName} berhasil dibuat, silahkan mulai code berdasarkan kebutuhan anda... atau sesuaikan aja`)}
|
|
157
|
-
${
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
164
|
+
${autoInstall
|
|
165
|
+
? chalk.dim("(dependencies sudah terinstall ✅)")
|
|
166
|
+
: chalk.cyan("")
|
|
167
|
+
}
|
|
162
168
|
${chalk.cyan("")}
|
|
163
169
|
|
|
164
170
|
Happy coding! 💻
|
package/package.json
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# OSX
|
|
2
|
+
.DS_Store
|
|
3
|
+
|
|
4
|
+
# Xcode
|
|
5
|
+
build/
|
|
6
|
+
*.pbxuser
|
|
7
|
+
!default.pbxuser
|
|
8
|
+
*.mode1v3
|
|
9
|
+
!default.mode1v3
|
|
10
|
+
*.mode2v3
|
|
11
|
+
!default.mode2v3
|
|
12
|
+
*.perspectivev3
|
|
13
|
+
!default.perspectivev3
|
|
14
|
+
xcuserdata
|
|
15
|
+
*.xccheckout
|
|
16
|
+
*.moved-aside
|
|
17
|
+
DerivedData
|
|
18
|
+
*.hmap
|
|
19
|
+
*.ipa
|
|
20
|
+
*.xcuserstate
|
|
21
|
+
project.xcworkspace
|
|
22
|
+
|
|
23
|
+
# Android
|
|
24
|
+
*.iml
|
|
25
|
+
.gradle
|
|
26
|
+
/local.properties
|
|
27
|
+
/.idea/caches
|
|
28
|
+
/.idea/libraries
|
|
29
|
+
/.idea/modules.xml
|
|
30
|
+
/.idea/workspace.xml
|
|
31
|
+
/.idea/navEditor.xml
|
|
32
|
+
/.idea/assetWizardSettings.xml
|
|
33
|
+
.DS_Store
|
|
34
|
+
/build
|
|
35
|
+
/captures
|
|
36
|
+
.externalNativeBuild
|
|
37
|
+
.cxx
|
|
38
|
+
|
|
39
|
+
# Node
|
|
40
|
+
node_modules/
|
|
41
|
+
npm-debug.log
|
|
42
|
+
yarn-error.log
|
|
43
|
+
|
|
44
|
+
# Expo
|
|
45
|
+
.expo/
|
|
46
|
+
dist/
|
|
47
|
+
web-build/
|
|
48
|
+
|
|
49
|
+
# Environment
|
|
50
|
+
.env
|
|
51
|
+
.env.local
|
|
52
|
+
.env.development.local
|
|
53
|
+
.env.test.local
|
|
54
|
+
.env.production.local
|
|
55
|
+
|
|
56
|
+
# TypeScript
|
|
57
|
+
*.tsbuildinfo
|
|
58
|
+
|
|
59
|
+
# Metro
|
|
60
|
+
.metro-health-check*
|
|
61
|
+
|
|
62
|
+
# Debug
|
|
63
|
+
*.log*
|
|
64
|
+
# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb
|
|
65
|
+
# The following patterns were generated by expo-cli
|
|
66
|
+
|
|
67
|
+
expo-env.d.ts
|
|
68
|
+
# @end expo-cli
|
|
69
|
+
|
|
70
|
+
# Other
|
|
71
|
+
structure.txt
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Expo React Native Boilerplate
|
|
2
|
+
|
|
3
|
+
A comprehensive boilerplate for building React Native applications with Expo, featuring authentication, theming, and a clean architecture.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- ✅ **Expo Router** - File-based routing
|
|
8
|
+
- ✅ **TypeScript** - Type-safe development
|
|
9
|
+
- ✅ **NativeWind (Tailwind CSS)** - Utility-first styling
|
|
10
|
+
- ✅ **Authentication Context** - Global auth state management
|
|
11
|
+
- ✅ **Theme Support** - Light/Dark mode with system preference
|
|
12
|
+
- ✅ **Mock API Server** - JSON Server for development
|
|
13
|
+
- ✅ **Secure Storage** - Expo SecureStore for sensitive data
|
|
14
|
+
- ✅ **Path Aliases** - Clean imports with `@` prefix
|
|
15
|
+
- ✅ **Form Validation** - Built-in validation utilities
|
|
16
|
+
- ✅ **Reusable Components** - Button, Input, Card, Loading, etc.
|
|
17
|
+
|
|
18
|
+
## Project Structure
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
.
|
|
22
|
+
├── app
|
|
23
|
+
│ ├── (admin) # Halaman & route khusus admin
|
|
24
|
+
│ ├── (auth) # Halaman auth (login, register, dsb)
|
|
25
|
+
│ ├── (protected) # Halaman yang membutuhkan autentikasi
|
|
26
|
+
│ └── _layout.tsx # Root layout untuk Expo Router
|
|
27
|
+
│
|
|
28
|
+
├── server
|
|
29
|
+
│ ├── db.json # Mock data untuk JSON Server
|
|
30
|
+
│
|
|
31
|
+
├── src
|
|
32
|
+
│ ├── assets # Gambar, font, dan aset statis
|
|
33
|
+
│ ├── components # Komponen UI reusable
|
|
34
|
+
│ ├── contexts # Context API (Auth, Theme, dsb)
|
|
35
|
+
│ ├── hooks # Custom React hooks
|
|
36
|
+
│ ├── services # API service (Axios, interceptors, dll)
|
|
37
|
+
│ ├── theme # Konfigurasi tema (warna, dark mode)
|
|
38
|
+
│ ├── types # TypeScript type definitions
|
|
39
|
+
│ └── utils # Helper functions & constants
|
|
40
|
+
│
|
|
41
|
+
├── app.json # Konfigurasi Expo project
|
|
42
|
+
├── babel.config.js # Konfigurasi Babel
|
|
43
|
+
├── expo-env.d.ts # Type definitions untuk Expo environment
|
|
44
|
+
├── global.css # Global style untuk Tailwind / NativeWind
|
|
45
|
+
├── index.ts # Entry point utama aplikasi
|
|
46
|
+
├── LICENSE # Lisensi project
|
|
47
|
+
├── metro.config.js # Konfigurasi Metro bundler
|
|
48
|
+
├── nativewind-env.d.ts # Type support untuk NativeWind
|
|
49
|
+
├── package.json # Dependency & script project
|
|
50
|
+
├── package-lock.json # Lock file npm
|
|
51
|
+
├── README.md # Dokumentasi project
|
|
52
|
+
├── structure.txt # Struktur folder (auto-generated)
|
|
53
|
+
├── tailwind.config.js # Konfigurasi TailwindCSS
|
|
54
|
+
└── tsconfig.json # Konfigurasi TypeScript
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Getting Started
|
|
59
|
+
|
|
60
|
+
### Prerequisites
|
|
61
|
+
|
|
62
|
+
- Node.js 18+
|
|
63
|
+
- npm or yarn
|
|
64
|
+
- Expo CLI
|
|
65
|
+
|
|
66
|
+
### Installation
|
|
67
|
+
|
|
68
|
+
1. Clone the repository:
|
|
69
|
+
```bash
|
|
70
|
+
git clone <your-repo-url>
|
|
71
|
+
cd <your-repo-folder>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
2. Install dependencies:
|
|
75
|
+
```bash
|
|
76
|
+
npm install
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
3. Start the development server:
|
|
80
|
+
```bash
|
|
81
|
+
npm run start
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This will start both the Expo development server and the mock API server.
|
|
85
|
+
|
|
86
|
+
### Available Scripts
|
|
87
|
+
|
|
88
|
+
- `npm start` - Start Expo development server
|
|
89
|
+
- `npm run android` - Run on Android
|
|
90
|
+
- `npm run ios` - Run on iOS
|
|
91
|
+
- `npm run web` - Run on web
|
|
92
|
+
- `npm run lint` - Run ESLint
|
|
93
|
+
- `npm run type-check` - Run TypeScript type checking
|
|
94
|
+
|
|
95
|
+
## Configuration
|
|
96
|
+
|
|
97
|
+
### API Configuration
|
|
98
|
+
|
|
99
|
+
Edit `src/utils/constants.ts` to configure your API endpoints:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
export const API_CONFIG = {
|
|
103
|
+
BASE_URL: __DEV__ ? 'http://localhost:3001' : 'https://api.yourapp.com',
|
|
104
|
+
TIMEOUT: 10000,
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Theme Configuration
|
|
109
|
+
|
|
110
|
+
Customize colors in `src/theme/colors.ts`:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
export const colors = {
|
|
114
|
+
light: {
|
|
115
|
+
primary: '#3b82f6',
|
|
116
|
+
// ... other colors
|
|
117
|
+
},
|
|
118
|
+
dark: {
|
|
119
|
+
primary: '#3b82f6',
|
|
120
|
+
// ... other colors
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Authentication
|
|
126
|
+
|
|
127
|
+
The boilerplate includes a complete authentication flow:
|
|
128
|
+
|
|
129
|
+
### Default Credentials
|
|
130
|
+
|
|
131
|
+
- **Admin**: developer@localhost.com / @developer
|
|
132
|
+
- **User**: user@localhost.com / @developer
|
|
133
|
+
|
|
134
|
+
### Using Authentication
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { useAuth } from '@hooks/useAuth';
|
|
138
|
+
|
|
139
|
+
function MyComponent() {
|
|
140
|
+
const { user, login, logout, isAuthenticated } = useAuth();
|
|
141
|
+
|
|
142
|
+
// Use authentication methods
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Theming
|
|
147
|
+
|
|
148
|
+
Switch between light and dark themes:
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { useTheme } from '@hooks/useTheme';
|
|
152
|
+
|
|
153
|
+
function MyComponent() {
|
|
154
|
+
const { theme, colors, setThemeMode } = useTheme();
|
|
155
|
+
|
|
156
|
+
// theme: 'light' | 'dark'
|
|
157
|
+
// colors: current theme colors
|
|
158
|
+
// setThemeMode: 'light' | 'dark' | 'auto'
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## API Services
|
|
163
|
+
|
|
164
|
+
### Making API Calls
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
import { newsService } from '@services/newsService';
|
|
168
|
+
|
|
169
|
+
// Get all news
|
|
170
|
+
const news = await newsService.getNews({ limit: 10 });
|
|
171
|
+
|
|
172
|
+
// Get single news item
|
|
173
|
+
const newsItem = await newsService.getNewsById('1');
|
|
174
|
+
|
|
175
|
+
// Create news
|
|
176
|
+
const newNews = await newsService.createNews({
|
|
177
|
+
title: 'New Article',
|
|
178
|
+
content: 'Content here',
|
|
179
|
+
// ...
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Custom Hooks
|
|
184
|
+
|
|
185
|
+
### useAuth
|
|
186
|
+
|
|
187
|
+
Access authentication state and methods.
|
|
188
|
+
|
|
189
|
+
### useTheme
|
|
190
|
+
|
|
191
|
+
Access theme configuration and toggle themes.
|
|
192
|
+
|
|
193
|
+
## Components
|
|
194
|
+
|
|
195
|
+
### Button
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
<Button
|
|
199
|
+
title="Click Me"
|
|
200
|
+
variant="primary"
|
|
201
|
+
size="md"
|
|
202
|
+
onPress={() => {}}
|
|
203
|
+
loading={false}
|
|
204
|
+
fullWidth
|
|
205
|
+
/>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Input
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
<Input
|
|
212
|
+
label="Email"
|
|
213
|
+
placeholder="Enter email"
|
|
214
|
+
value={email}
|
|
215
|
+
onChangeText={setEmail}
|
|
216
|
+
error={emailError}
|
|
217
|
+
secureTextEntry
|
|
218
|
+
/>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Card
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
<Card className="mb-4">
|
|
225
|
+
<Text>Card content</Text>
|
|
226
|
+
</Card>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Loading
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
<Loading text="Loading..." fullScreen />
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Path Aliases
|
|
236
|
+
|
|
237
|
+
Use clean imports with configured path aliases:
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
import { Button } from '@components/common/Button';
|
|
241
|
+
import { useAuth } from '@hooks/useAuth';
|
|
242
|
+
import { newsService } from '@services/newsService';
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Deployment
|
|
246
|
+
|
|
247
|
+
### Building for Production
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
# For Android
|
|
251
|
+
eas build --platform android
|
|
252
|
+
|
|
253
|
+
# For iOS
|
|
254
|
+
eas build --platform ios
|
|
255
|
+
|
|
256
|
+
# For both
|
|
257
|
+
eas build --platform all
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Contributing
|
|
261
|
+
|
|
262
|
+
1. Fork the repository
|
|
263
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
264
|
+
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
|
|
265
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
266
|
+
5. Open a Pull Request
|
|
267
|
+
|
|
268
|
+
## License
|
|
269
|
+
|
|
270
|
+
MIT License - feel free to use this boilerplate for your projects!
|
|
271
|
+
|
|
272
|
+
## Support
|
|
273
|
+
|
|
274
|
+
For issues and questions, please open an issue on GitHub.
|