@idealyst/cli 1.0.45 → 1.0.48

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.
Files changed (121) hide show
  1. package/dist/generators/fullstack.js +61 -3
  2. package/dist/generators/fullstack.js.map +1 -1
  3. package/dist/generators/native.js +12 -0
  4. package/dist/generators/native.js.map +1 -1
  5. package/dist/generators/utils.js +64 -31
  6. package/dist/generators/utils.js.map +1 -1
  7. package/dist/templates/api/README.md +207 -130
  8. package/dist/templates/api/package.json +5 -5
  9. package/dist/templates/api/src/controllers/TestController.ts +0 -0
  10. package/dist/templates/api/src/index.ts +2 -7
  11. package/dist/templates/api/src/lib/crud.ts +150 -0
  12. package/dist/templates/api/src/lib/database.ts +23 -0
  13. package/dist/templates/api/src/router/index.ts +104 -71
  14. package/dist/templates/api/src/routers/test.ts +59 -0
  15. package/dist/templates/api/src/routers/user.example.ts +83 -0
  16. package/dist/templates/api/src/server.ts +1 -1
  17. package/dist/templates/api/tsconfig.json +0 -1
  18. package/dist/templates/database/README.md +115 -1
  19. package/dist/templates/database/package.json +2 -0
  20. package/dist/templates/database/prisma/seed.ts +37 -1
  21. package/dist/templates/database/schema.prisma +11 -1
  22. package/dist/templates/native/index.js +1 -1
  23. package/dist/templates/native/metro.config.js +1 -1
  24. package/dist/templates/native/package.json +4 -0
  25. package/dist/templates/native/src/App.tsx +16 -0
  26. package/dist/templates/native/src/utils/trpc.ts +7 -127
  27. package/dist/templates/native/tsconfig.json +0 -2
  28. package/dist/templates/shared/README.md +31 -5
  29. package/dist/templates/shared/__tests__/shared.test.ts +17 -5
  30. package/dist/templates/shared/package.json +14 -30
  31. package/dist/templates/shared/src/components/App.tsx +57 -0
  32. package/dist/templates/shared/src/components/HelloWorld.tsx +307 -0
  33. package/dist/templates/shared/src/components/index.ts +1 -392
  34. package/dist/templates/shared/src/index.ts +9 -57
  35. package/dist/templates/shared/src/trpc/client.ts +39 -0
  36. package/dist/templates/shared/tsconfig.json +4 -7
  37. package/dist/templates/web/README.md +65 -8
  38. package/dist/templates/web/package.json +3 -3
  39. package/dist/templates/web/src/App-with-trpc-and-shared.tsx +11 -299
  40. package/dist/templates/web/src/components/TestDemo.tsx +164 -0
  41. package/dist/templates/web/src/utils/trpc.ts +7 -93
  42. package/dist/templates/web/tsconfig.json +0 -1
  43. package/dist/templates/workspace/.devcontainer/devcontainer.json +4 -9
  44. package/dist/templates/workspace/.devcontainer/docker-compose.yml +1 -2
  45. package/dist/templates/workspace/.devcontainer/setup.sh +1 -1
  46. package/dist/templates/workspace/.env.example +1 -1
  47. package/dist/templates/workspace/Dockerfile +4 -4
  48. package/dist/templates/workspace/docker/nginx/prod.conf +2 -2
  49. package/dist/templates/workspace/docker/nginx.conf +1 -1
  50. package/dist/templates/workspace/docker/prometheus/prometheus.yml +1 -1
  51. package/dist/templates/workspace/docker-compose.yml +4 -5
  52. package/dist/templates/workspace/tsconfig.json +0 -1
  53. package/package.json +1 -1
  54. package/templates/api/README.md +207 -130
  55. package/templates/api/package.json +5 -5
  56. package/templates/api/src/controllers/TestController.ts +0 -0
  57. package/templates/api/src/index.ts +2 -7
  58. package/templates/api/src/lib/crud.ts +150 -0
  59. package/templates/api/src/lib/database.ts +23 -0
  60. package/templates/api/src/router/index.ts +104 -71
  61. package/templates/api/src/routers/test.ts +59 -0
  62. package/templates/api/src/routers/user.example.ts +83 -0
  63. package/templates/api/src/server.ts +1 -1
  64. package/templates/api/tsconfig.json +0 -1
  65. package/templates/database/README.md +115 -1
  66. package/templates/database/package.json +2 -0
  67. package/templates/database/prisma/seed.ts +37 -1
  68. package/templates/database/schema.prisma +11 -1
  69. package/templates/native/index.js +1 -1
  70. package/templates/native/metro.config.js +1 -1
  71. package/templates/native/package.json +4 -0
  72. package/templates/native/src/App.tsx +16 -0
  73. package/templates/native/src/utils/trpc.ts +7 -127
  74. package/templates/native/tsconfig.json +0 -2
  75. package/templates/shared/README.md +31 -5
  76. package/templates/shared/__tests__/shared.test.ts +17 -5
  77. package/templates/shared/package.json +14 -30
  78. package/templates/shared/src/components/App.tsx +57 -0
  79. package/templates/shared/src/components/HelloWorld.tsx +307 -0
  80. package/templates/shared/src/components/index.ts +1 -392
  81. package/templates/shared/src/index.ts +9 -57
  82. package/templates/shared/src/trpc/client.ts +39 -0
  83. package/templates/shared/tsconfig.json +4 -7
  84. package/templates/web/README.md +65 -8
  85. package/templates/web/package.json +3 -3
  86. package/templates/web/src/App-with-trpc-and-shared.tsx +11 -299
  87. package/templates/web/src/components/TestDemo.tsx +164 -0
  88. package/templates/web/src/utils/trpc.ts +7 -93
  89. package/templates/web/tsconfig.json +0 -1
  90. package/templates/workspace/.devcontainer/devcontainer.json +4 -9
  91. package/templates/workspace/.devcontainer/docker-compose.yml +1 -2
  92. package/templates/workspace/.devcontainer/setup.sh +1 -1
  93. package/templates/workspace/.env.example +1 -1
  94. package/templates/workspace/Dockerfile +4 -4
  95. package/templates/workspace/docker/nginx/prod.conf +2 -2
  96. package/templates/workspace/docker/nginx.conf +1 -1
  97. package/templates/workspace/docker/prometheus/prometheus.yml +1 -1
  98. package/templates/workspace/docker-compose.yml +4 -5
  99. package/templates/workspace/tsconfig.json +0 -1
  100. package/dist/templates/api/src/controllers/UserController.ts +0 -102
  101. package/dist/templates/api/src/lib/controller.ts +0 -90
  102. package/dist/templates/api/src/lib/middleware.ts +0 -170
  103. package/dist/templates/api/src/middleware/auth.ts +0 -75
  104. package/dist/templates/api/src/middleware/common.ts +0 -103
  105. package/dist/templates/database/.env.example +0 -1
  106. package/dist/templates/native/App.tsx +0 -23
  107. package/dist/templates/native/src/App-with-trpc-and-shared.tsx +0 -266
  108. package/dist/templates/shared/rollup.config.js +0 -43
  109. package/dist/templates/shared/src/types/index.ts +0 -148
  110. package/dist/templates/shared/src/utils/index.ts +0 -278
  111. package/templates/api/src/controllers/UserController.ts +0 -102
  112. package/templates/api/src/lib/controller.ts +0 -90
  113. package/templates/api/src/lib/middleware.ts +0 -170
  114. package/templates/api/src/middleware/auth.ts +0 -75
  115. package/templates/api/src/middleware/common.ts +0 -103
  116. package/templates/database/.env.example +0 -1
  117. package/templates/native/App.tsx +0 -23
  118. package/templates/native/src/App-with-trpc-and-shared.tsx +0 -266
  119. package/templates/shared/rollup.config.js +0 -43
  120. package/templates/shared/src/types/index.ts +0 -148
  121. package/templates/shared/src/utils/index.ts +0 -278
@@ -1,278 +0,0 @@
1
- // Date and time utilities
2
- export const formatDate = (date: Date | string): string => {
3
- const d = typeof date === 'string' ? new Date(date) : date;
4
- return d.toLocaleDateString('en-US', {
5
- year: 'numeric',
6
- month: 'long',
7
- day: 'numeric'
8
- });
9
- };
10
-
11
- export const formatDateTime = (date: Date | string): string => {
12
- const d = typeof date === 'string' ? new Date(date) : date;
13
- return d.toLocaleString('en-US', {
14
- year: 'numeric',
15
- month: 'short',
16
- day: 'numeric',
17
- hour: '2-digit',
18
- minute: '2-digit'
19
- });
20
- };
21
-
22
- export const formatRelativeTime = (date: Date | string): string => {
23
- const d = typeof date === 'string' ? new Date(date) : date;
24
- const now = new Date();
25
- const diffInSeconds = Math.floor((now.getTime() - d.getTime()) / 1000);
26
-
27
- if (diffInSeconds < 60) return 'just now';
28
- if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)} minutes ago`;
29
- if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)} hours ago`;
30
- if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / 86400)} days ago`;
31
- return formatDate(d);
32
- };
33
-
34
- // String utilities
35
- export const truncateText = (text: string, maxLength: number): string => {
36
- if (text.length <= maxLength) return text;
37
- return text.substring(0, maxLength).trim() + '...';
38
- };
39
-
40
- export const capitalizeFirst = (text: string): string => {
41
- if (!text) return text;
42
- return text.charAt(0).toUpperCase() + text.slice(1);
43
- };
44
-
45
- export const slugify = (text: string): string => {
46
- return text
47
- .toLowerCase()
48
- .replace(/[^\w\s-]/g, '') // Remove special chars
49
- .replace(/[\s_-]+/g, '-') // Replace spaces and underscores with hyphens
50
- .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens
51
- };
52
-
53
- // Array utilities
54
- export const paginate = <T>(array: T[], page: number, pageSize: number) => {
55
- const startIndex = (page - 1) * pageSize;
56
- const endIndex = startIndex + pageSize;
57
-
58
- return {
59
- items: array.slice(startIndex, endIndex),
60
- total: array.length,
61
- page,
62
- pageSize,
63
- hasMore: endIndex < array.length,
64
- totalPages: Math.ceil(array.length / pageSize)
65
- };
66
- };
67
-
68
- export const sortBy = <T>(array: T[], key: keyof T, order: 'asc' | 'desc' = 'asc'): T[] => {
69
- return [...array].sort((a, b) => {
70
- const aVal = a[key];
71
- const bVal = b[key];
72
-
73
- if (aVal < bVal) return order === 'asc' ? -1 : 1;
74
- if (aVal > bVal) return order === 'asc' ? 1 : -1;
75
- return 0;
76
- });
77
- };
78
-
79
- // Object utilities
80
- export const pick = <T extends object, K extends keyof T>(
81
- obj: T,
82
- keys: K[]
83
- ): Pick<T, K> => {
84
- const result = {} as Pick<T, K>;
85
- keys.forEach(key => {
86
- if (key in obj) {
87
- result[key] = obj[key];
88
- }
89
- });
90
- return result;
91
- };
92
-
93
- export const omit = <T extends object, K extends keyof T>(
94
- obj: T,
95
- keys: K[]
96
- ): Omit<T, K> => {
97
- const result = { ...obj };
98
- keys.forEach(key => {
99
- delete result[key];
100
- });
101
- return result as Omit<T, K>;
102
- };
103
-
104
- // Validation utilities
105
- export const isValidEmail = (email: string): boolean => {
106
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
107
- return emailRegex.test(email);
108
- };
109
-
110
- export const isValidUrl = (url: string): boolean => {
111
- try {
112
- new URL(url);
113
- return true;
114
- } catch {
115
- return false;
116
- }
117
- };
118
-
119
- // Local storage utilities (with fallbacks for environments without localStorage)
120
- export const storage = {
121
- get: (key: string): string | null => {
122
- try {
123
- if (typeof localStorage !== 'undefined') {
124
- return localStorage.getItem(key);
125
- }
126
- } catch (error) {
127
- console.warn('localStorage not available:', error);
128
- }
129
- return null;
130
- },
131
-
132
- set: (key: string, value: string): void => {
133
- try {
134
- if (typeof localStorage !== 'undefined') {
135
- localStorage.setItem(key, value);
136
- }
137
- } catch (error) {
138
- console.warn('localStorage not available:', error);
139
- }
140
- },
141
-
142
- remove: (key: string): void => {
143
- try {
144
- if (typeof localStorage !== 'undefined') {
145
- localStorage.removeItem(key);
146
- }
147
- } catch (error) {
148
- console.warn('localStorage not available:', error);
149
- }
150
- },
151
-
152
- getObject: <T>(key: string): T | null => {
153
- const value = storage.get(key);
154
- if (value) {
155
- try {
156
- return JSON.parse(value);
157
- } catch (error) {
158
- console.warn('Failed to parse stored object:', error);
159
- }
160
- }
161
- return null;
162
- },
163
-
164
- setObject: <T>(key: string, value: T): void => {
165
- try {
166
- storage.set(key, JSON.stringify(value));
167
- } catch (error) {
168
- console.warn('Failed to stringify object for storage:', error);
169
- }
170
- }
171
- };
172
-
173
- // Debounce utility for search and input handling
174
- export const debounce = <T extends (...args: any[]) => any>(
175
- func: T,
176
- delay: number
177
- ): ((...args: Parameters<T>) => void) => {
178
- let timeoutId: NodeJS.Timeout;
179
-
180
- return (...args: Parameters<T>) => {
181
- clearTimeout(timeoutId);
182
- timeoutId = setTimeout(() => func(...args), delay);
183
- };
184
- };
185
-
186
- // Theme utilities
187
- export const getSystemTheme = (): 'light' | 'dark' => {
188
- if (typeof window !== 'undefined' && window.matchMedia) {
189
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
190
- }
191
- return 'light';
192
- };
193
-
194
- // Error handling utilities
195
- export const getErrorMessage = (error: unknown): string => {
196
- if (error instanceof Error) {
197
- return error.message;
198
- }
199
- if (typeof error === 'string') {
200
- return error;
201
- }
202
- return 'An unexpected error occurred';
203
- };
204
-
205
- // Platform detection utilities
206
- export const isWeb = (): boolean => {
207
- return typeof window !== 'undefined';
208
- };
209
-
210
- export const isMobile = (): boolean => {
211
- return typeof navigator !== 'undefined' && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
212
- };
213
-
214
- // Constants for demo data
215
- export const DEMO_USERS = [
216
- {
217
- id: '1',
218
- name: 'Alice Johnson',
219
- email: 'alice@example.com',
220
- avatar: 'https://via.placeholder.com/150/4CAF50/white?text=AJ',
221
- bio: 'Full-stack developer passionate about React and TypeScript',
222
- location: 'San Francisco, CA',
223
- website: 'https://alice-dev.com'
224
- },
225
- {
226
- id: '2',
227
- name: 'Bob Smith',
228
- email: 'bob@example.com',
229
- avatar: 'https://via.placeholder.com/150/2196F3/white?text=BS',
230
- bio: 'UI/UX designer and frontend enthusiast',
231
- location: 'New York, NY',
232
- website: 'https://bobdesigns.co'
233
- },
234
- {
235
- id: '3',
236
- name: 'Carol Williams',
237
- email: 'carol@example.com',
238
- avatar: 'https://via.placeholder.com/150/FF9800/white?text=CW',
239
- bio: 'Product manager with a love for user research',
240
- location: 'Austin, TX'
241
- }
242
- ];
243
-
244
- export const DEMO_POSTS = [
245
- {
246
- id: '1',
247
- title: 'Getting Started with React Native',
248
- content: 'React Native is a powerful framework for building cross-platform mobile applications...',
249
- excerpt: 'Learn the basics of React Native development',
250
- authorId: '1',
251
- tags: ['react-native', 'mobile', 'javascript'],
252
- published: true,
253
- views: 234,
254
- likes: 15
255
- },
256
- {
257
- id: '2',
258
- title: 'Design Systems in Modern Web Development',
259
- content: 'A design system is a complete set of standards intended to manage design at scale...',
260
- excerpt: 'Building consistent user interfaces across applications',
261
- authorId: '2',
262
- tags: ['design-systems', 'ui-ux', 'frontend'],
263
- published: true,
264
- views: 189,
265
- likes: 23
266
- },
267
- {
268
- id: '3',
269
- title: 'User Research Best Practices',
270
- content: 'Understanding your users is crucial for building successful products...',
271
- excerpt: 'How to conduct effective user research',
272
- authorId: '3',
273
- tags: ['user-research', 'product-management', 'ux'],
274
- published: true,
275
- views: 156,
276
- likes: 31
277
- }
278
- ];