@idealyst/cli 1.0.40 → 1.0.43

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 (89) hide show
  1. package/dist/generators/api.js +1 -2
  2. package/dist/generators/api.js.map +1 -1
  3. package/dist/generators/database.js +1 -2
  4. package/dist/generators/database.js.map +1 -1
  5. package/dist/generators/fullstack.js +371 -0
  6. package/dist/generators/fullstack.js.map +1 -0
  7. package/dist/generators/index.js +5 -0
  8. package/dist/generators/index.js.map +1 -1
  9. package/dist/generators/native.js +2 -1
  10. package/dist/generators/native.js.map +1 -1
  11. package/dist/generators/shared.js +1 -2
  12. package/dist/generators/shared.js.map +1 -1
  13. package/dist/generators/utils.js +71 -7
  14. package/dist/generators/utils.js.map +1 -1
  15. package/dist/generators/web.js +1 -2
  16. package/dist/generators/web.js.map +1 -1
  17. package/dist/generators/workspace.js +56 -2
  18. package/dist/generators/workspace.js.map +1 -1
  19. package/dist/index.js +50 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/templates/database/.env.example +1 -8
  22. package/dist/templates/database/README.md +29 -74
  23. package/dist/templates/database/package.json +20 -34
  24. package/dist/templates/database/prisma/seed.ts +11 -11
  25. package/dist/templates/database/schema.prisma +97 -0
  26. package/dist/templates/database/src/index.ts +12 -8
  27. package/dist/templates/database/src/validators.ts +10 -0
  28. package/dist/templates/database/tsconfig.json +9 -23
  29. package/dist/templates/native/src/App-with-trpc-and-shared.tsx +266 -0
  30. package/dist/templates/shared/package.json +28 -3
  31. package/dist/templates/shared/src/components/index.ts +392 -0
  32. package/dist/templates/shared/src/index.ts +59 -1
  33. package/dist/templates/shared/src/types/index.ts +148 -0
  34. package/dist/templates/shared/src/utils/index.ts +278 -0
  35. package/dist/templates/web/package.json +2 -2
  36. package/dist/templates/web/src/App-with-trpc-and-shared.tsx +304 -0
  37. package/dist/templates/workspace/.devcontainer/Dockerfile +1 -1
  38. package/dist/templates/workspace/.devcontainer/devcontainer.json +7 -2
  39. package/dist/templates/workspace/.devcontainer/docker-compose.yml +14 -0
  40. package/dist/templates/workspace/.devcontainer/figma-mcp.sh +32 -0
  41. package/dist/templates/workspace/.devcontainer/setup.sh +3 -0
  42. package/dist/templates/workspace/setup.sh +22 -197
  43. package/dist/templates/workspace/tsconfig.json +32 -0
  44. package/dist/types/generators/fullstack.d.ts +2 -0
  45. package/dist/types/generators/index.d.ts +1 -0
  46. package/dist/types/generators/utils.d.ts +4 -1
  47. package/dist/types/types.d.ts +3 -1
  48. package/package.json +1 -1
  49. package/templates/database/.env.example +1 -8
  50. package/templates/database/README.md +29 -74
  51. package/templates/database/package.json +20 -34
  52. package/templates/database/prisma/seed.ts +11 -11
  53. package/templates/database/schema.prisma +97 -0
  54. package/templates/database/src/index.ts +12 -8
  55. package/templates/database/src/validators.ts +10 -0
  56. package/templates/database/tsconfig.json +9 -23
  57. package/templates/native/src/App-with-trpc-and-shared.tsx +266 -0
  58. package/templates/shared/package.json +28 -3
  59. package/templates/shared/src/components/index.ts +392 -0
  60. package/templates/shared/src/index.ts +59 -1
  61. package/templates/shared/src/types/index.ts +148 -0
  62. package/templates/shared/src/utils/index.ts +278 -0
  63. package/templates/web/package.json +1 -1
  64. package/templates/web/src/App-with-trpc-and-shared.tsx +304 -0
  65. package/templates/workspace/.devcontainer/devcontainer.json +7 -2
  66. package/templates/workspace/.devcontainer/docker-compose.yml +14 -0
  67. package/templates/workspace/.devcontainer/figma-mcp.sh +32 -0
  68. package/templates/workspace/.devcontainer/setup.sh +3 -0
  69. package/templates/workspace/setup.sh +22 -197
  70. package/templates/workspace/tsconfig.json +32 -0
  71. package/dist/templates/database/__tests__/database.test.ts +0 -14
  72. package/dist/templates/database/jest.config.js +0 -19
  73. package/dist/templates/database/jest.setup.js +0 -11
  74. package/dist/templates/database/prisma/schema.prisma +0 -21
  75. package/dist/templates/database/src/client.ts +0 -18
  76. package/dist/templates/database/src/schemas.ts +0 -26
  77. package/dist/templates/workspace/scripts/docker/db-backup.sh +0 -230
  78. package/dist/templates/workspace/scripts/docker/deploy.sh +0 -212
  79. package/dist/templates/workspace/scripts/test-runner.js +0 -120
  80. package/templates/database/__tests__/database.test.ts +0 -14
  81. package/templates/database/jest.config.js +0 -19
  82. package/templates/database/jest.setup.js +0 -11
  83. package/templates/database/prisma/schema.prisma +0 -21
  84. package/templates/database/src/client.ts +0 -18
  85. package/templates/database/src/schemas.ts +0 -26
  86. package/templates/workspace/scripts/docker/db-backup.sh +0 -230
  87. package/templates/workspace/scripts/docker/deploy.sh +0 -212
  88. package/templates/workspace/scripts/docker-build.sh +0 -151
  89. package/templates/workspace/scripts/test-runner.js +0 -120
@@ -1,11 +1,15 @@
1
- // Export Prisma client
2
- export { PrismaClient } from '@prisma/client';
1
+ import { PrismaClient } from '../generated/client';
3
2
 
4
- // Export database client instance
5
- export { default as db } from './client';
3
+ declare global {
4
+ var __prisma: PrismaClient | undefined;
5
+ }
6
6
 
7
- // Export Zod schemas
8
- export * from './schemas';
7
+ export const prisma = globalThis.__prisma || new PrismaClient();
9
8
 
10
- // Export types from Prisma
11
- export type * from '@prisma/client';
9
+ if (process.env.NODE_ENV !== 'production') {
10
+ globalThis.__prisma = prisma;
11
+ }
12
+
13
+ export * from './validators';
14
+ export * from '../generated/client';
15
+ export default prisma;
@@ -0,0 +1,10 @@
1
+ // Create model validators for each model defined in the Prisma schema using Zod
2
+ // E.g
3
+ import { z } from 'zod';
4
+
5
+ export const TestValidator = z.object({
6
+ id: z.string().uuid(),
7
+ email: z.string().email(),
8
+ name: z.string().min(2).max(100),
9
+ age: z.number().min(0).optional()
10
+ });
@@ -1,32 +1,18 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "ES2020",
4
+ "module": "commonjs",
4
5
  "lib": ["ES2020"],
5
- "module": "ESNext",
6
- "moduleResolution": "node",
7
- "allowSyntheticDefaultImports": true,
8
- "esModuleInterop": true,
9
- "forceConsistentCasingInFileNames": true,
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
10
8
  "strict": true,
9
+ "esModuleInterop": true,
11
10
  "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
12
  "declaration": true,
13
13
  "declarationMap": true,
14
- "sourceMap": true,
15
- "outDir": "./dist",
16
- "rootDir": "./src",
17
- "resolveJsonModule": true,
18
- "allowJs": false,
19
- "noUncheckedIndexedAccess": true,
20
- "experimentalDecorators": true,
21
- "emitDecoratorMetadata": true
14
+ "sourceMap": true
22
15
  },
23
- "include": [
24
- "src/**/*",
25
- "prisma/**/*"
26
- ],
27
- "exclude": [
28
- "node_modules",
29
- "dist",
30
- "__tests__"
31
- ]
32
- }
16
+ "include": ["src/**/*"],
17
+ "exclude": ["node_modules", "dist"]
18
+ }
@@ -0,0 +1,266 @@
1
+ import React, { useState } from 'react';
2
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
3
+ import { httpBatchLink } from '@trpc/client';
4
+ import { Screen, Text, View, Button, ScrollView } from '@idealyst/components';
5
+ import { trpc } from './utils/trpc';
6
+
7
+ // Import shared components and utilities
8
+ import {
9
+ UserCard,
10
+ PostCard,
11
+ LoadingSpinner,
12
+ ErrorMessage,
13
+ FeatureCard,
14
+ TabButton,
15
+ DEMO_USERS,
16
+ DEMO_POSTS,
17
+ formatRelativeTime,
18
+ type User,
19
+ type Post
20
+ } from '{{workspaceScope}}/shared';
21
+
22
+ // Create tRPC client
23
+ const queryClient = new QueryClient();
24
+
25
+ const trpcClient = trpc.createClient({
26
+ links: [
27
+ httpBatchLink({
28
+ url: 'http://localhost:3001/trpc', // Update this to your API URL
29
+ // For device testing, you might need: 'http://192.168.1.xxx:3001/trpc'
30
+ // Optional: Add headers for authentication
31
+ // headers() {
32
+ // return {
33
+ // authorization: getAuthToken(),
34
+ // };
35
+ // },
36
+ }),
37
+ ],
38
+ });
39
+
40
+ function App() {
41
+ const [currentTab, setCurrentTab] = useState<'home' | 'users' | 'posts'>('home');
42
+
43
+ // Example tRPC usage
44
+ const { data: helloData, isLoading: helloLoading, error: helloError } = trpc.hello.useQuery({ name: 'Mobile User' });
45
+ const { data: usersData, isLoading: usersLoading } = trpc.users.getAll.useQuery();
46
+ const { data: postsData, isLoading: postsLoading } = trpc.posts.getAll.useQuery();
47
+
48
+ const renderHome = () => (
49
+ <ScrollView style={{ flex: 1 }}>
50
+ <View style={{ padding: 20 }}>
51
+ {/* Welcome Section */}
52
+ <View style={{ marginBottom: 32, alignItems: 'center' }}>
53
+ <Text variant="h1" style={{ textAlign: 'center', marginBottom: 16 }}>
54
+ Welcome to {{appName}}! 📱
55
+ </Text>
56
+ <Text variant="body" style={{ textAlign: 'center', marginBottom: 16, fontSize: 18 }}>
57
+ A cross-platform mobile app built with React Native and the Idealyst Framework
58
+ </Text>
59
+
60
+ {/* tRPC Connection Test */}
61
+ <View style={{
62
+ padding: 16,
63
+ backgroundColor: '#e3f2fd',
64
+ borderRadius: 8,
65
+ marginBottom: 24,
66
+ width: '100%'
67
+ }}>
68
+ <Text variant="h3" style={{ marginBottom: 8, textAlign: 'center' }}>🔗 API Connection</Text>
69
+ {helloLoading && <Text style={{ textAlign: 'center' }}>Testing connection...</Text>}
70
+ {helloError && <Text style={{ color: 'red', textAlign: 'center' }}>Error: {helloError.message}</Text>}
71
+ {helloData && <Text style={{ color: 'green', textAlign: 'center' }}>✅ {helloData.greeting}</Text>}
72
+ </View>
73
+ </View>
74
+
75
+ {/* Features Overview */}
76
+ <View style={{ marginBottom: 32 }}>
77
+ <Text variant="h2" style={{ marginBottom: 16, textAlign: 'center' }}>🏗️ What's Included</Text>
78
+ <FeatureCard
79
+ icon="🔗"
80
+ title="Full Integration"
81
+ description="Connected to your database and API with end-to-end type safety"
82
+ />
83
+ <FeatureCard
84
+ icon="📦"
85
+ title="Shared Components"
86
+ description="Cross-platform UI components that work on web and mobile"
87
+ />
88
+ <FeatureCard
89
+ icon="🎨"
90
+ title="Idealyst Design"
91
+ description="Beautiful, consistent styling with the Idealyst component library"
92
+ />
93
+ <FeatureCard
94
+ icon="⚡"
95
+ title="Real-time Updates"
96
+ description="tRPC provides instant synchronization with your backend"
97
+ />
98
+ </View>
99
+
100
+ {/* Quick Data Preview */}
101
+ <View style={{ marginBottom: 32 }}>
102
+ <Text variant="h2" style={{ marginBottom: 16, textAlign: 'center' }}>📊 Live Data</Text>
103
+
104
+ {/* Users Preview */}
105
+ <View style={{ marginBottom: 20 }}>
106
+ <Text variant="h3" style={{ marginBottom: 12 }}>👥 Users ({usersLoading ? '...' : usersData?.length || DEMO_USERS.length})</Text>
107
+ {usersLoading ? (
108
+ <LoadingSpinner message="Loading users..." />
109
+ ) : (
110
+ <View>
111
+ {(usersData || DEMO_USERS.slice(0, 2)).map((user: User) => (
112
+ <UserCard
113
+ key={user.id}
114
+ user={user}
115
+ showBio={false}
116
+ onPress={() => console.log('View profile:', user.name)}
117
+ />
118
+ ))}
119
+ </View>
120
+ )}
121
+ </View>
122
+
123
+ {/* Posts Preview */}
124
+ <View style={{ marginBottom: 20 }}>
125
+ <Text variant="h3" style={{ marginBottom: 12 }}>📝 Recent Posts ({postsLoading ? '...' : postsData?.length || DEMO_POSTS.length})</Text>
126
+ {postsLoading ? (
127
+ <LoadingSpinner message="Loading posts..." />
128
+ ) : (
129
+ <View>
130
+ {(postsData || DEMO_POSTS.slice(0, 1)).map((post: Post) => {
131
+ const author = DEMO_USERS.find(u => u.id === post.authorId);
132
+ return (
133
+ <PostCard
134
+ key={post.id}
135
+ post={post}
136
+ author={author}
137
+ onPress={() => console.log('Read post:', post.title)}
138
+ onLike={() => console.log('Like post:', post.title)}
139
+ />
140
+ );
141
+ })}
142
+ </View>
143
+ )}
144
+ </View>
145
+ </View>
146
+
147
+ {/* Development Info */}
148
+ <View style={{
149
+ padding: 20,
150
+ backgroundColor: '#f8f9fa',
151
+ borderRadius: 8,
152
+ marginBottom: 24
153
+ }}>
154
+ <Text variant="h3" style={{ marginBottom: 12, textAlign: 'center' }}>🚀 Development</Text>
155
+ <Text variant="body" style={{ textAlign: 'center', marginBottom: 12 }}>
156
+ This app is part of your full-stack workspace. Make changes to see them reflected instantly!
157
+ </Text>
158
+ <Text variant="caption" style={{ textAlign: 'center', fontStyle: 'italic' }}>
159
+ Edit packages/mobile/src/App.tsx to customize this screen
160
+ </Text>
161
+ </View>
162
+ </View>
163
+ </ScrollView>
164
+ );
165
+
166
+ const renderUsers = () => {
167
+ const { data: users, isLoading, error } = trpc.users.getAll.useQuery();
168
+
169
+ if (isLoading) return <LoadingSpinner message="Loading users..." />;
170
+ if (error) return <ErrorMessage message={error.message} />;
171
+
172
+ const allUsers = users || DEMO_USERS;
173
+
174
+ return (
175
+ <ScrollView style={{ flex: 1, padding: 20 }}>
176
+ <Text variant="h1" style={{ marginBottom: 20, textAlign: 'center' }}>👥 All Users ({allUsers.length})</Text>
177
+ <View>
178
+ {allUsers.map((user: User) => (
179
+ <UserCard
180
+ key={user.id}
181
+ user={user}
182
+ showBio={true}
183
+ onPress={() => console.log('View profile:', user.name)}
184
+ />
185
+ ))}
186
+ </View>
187
+ </ScrollView>
188
+ );
189
+ };
190
+
191
+ const renderPosts = () => {
192
+ const { data: posts, isLoading, error } = trpc.posts.getAll.useQuery();
193
+
194
+ if (isLoading) return <LoadingSpinner message="Loading posts..." />;
195
+ if (error) return <ErrorMessage message={error.message} />;
196
+
197
+ const allPosts = posts || DEMO_POSTS;
198
+
199
+ return (
200
+ <ScrollView style={{ flex: 1, padding: 20 }}>
201
+ <Text variant="h1" style={{ marginBottom: 20, textAlign: 'center' }}>📝 All Posts ({allPosts.length})</Text>
202
+ <View>
203
+ {allPosts.map((post: Post) => {
204
+ const author = DEMO_USERS.find(u => u.id === post.authorId);
205
+ return (
206
+ <PostCard
207
+ key={post.id}
208
+ post={post}
209
+ author={author}
210
+ showFullContent={false}
211
+ onPress={() => console.log('Read post:', post.title)}
212
+ onLike={() => console.log('Like post:', post.title)}
213
+ />
214
+ );
215
+ })}
216
+ </View>
217
+ </ScrollView>
218
+ );
219
+ };
220
+
221
+ const renderTabBar = () => (
222
+ <View style={{
223
+ flexDirection: 'row',
224
+ backgroundColor: '#f8f9fa',
225
+ borderTopWidth: 1,
226
+ borderTopColor: '#e9ecef',
227
+ paddingVertical: 10
228
+ }}>
229
+ <TabButton
230
+ title="Home"
231
+ icon="🏠"
232
+ active={currentTab === 'home'}
233
+ onPress={() => setCurrentTab('home')}
234
+ />
235
+ <TabButton
236
+ title="Users"
237
+ icon="👥"
238
+ active={currentTab === 'users'}
239
+ onPress={() => setCurrentTab('users')}
240
+ />
241
+ <TabButton
242
+ title="Posts"
243
+ icon="📝"
244
+ active={currentTab === 'posts'}
245
+ onPress={() => setCurrentTab('posts')}
246
+ />
247
+ </View>
248
+ );
249
+
250
+ return (
251
+ <trpc.Provider client={trpcClient} queryClient={queryClient}>
252
+ <QueryClientProvider client={queryClient}>
253
+ <Screen>
254
+ <View style={{ flex: 1 }}>
255
+ {currentTab === 'home' && renderHome()}
256
+ {currentTab === 'users' && renderUsers()}
257
+ {currentTab === 'posts' && renderPosts()}
258
+ {renderTabBar()}
259
+ </View>
260
+ </Screen>
261
+ </QueryClientProvider>
262
+ </trpc.Provider>
263
+ );
264
+ }
265
+
266
+ export default App;
@@ -2,9 +2,31 @@
2
2
  "name": "{{packageName}}",
3
3
  "version": "{{version}}",
4
4
  "description": "{{description}}",
5
- "main": "src/index.ts",
6
- "module": "src/index.ts",
7
- "types": "src/index.ts",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./types": {
15
+ "import": "./dist/types/index.js",
16
+ "require": "./dist/types/index.js",
17
+ "types": "./dist/types/index.d.ts"
18
+ },
19
+ "./components": {
20
+ "import": "./dist/components/index.js",
21
+ "require": "./dist/components/index.js",
22
+ "types": "./dist/components/index.d.ts"
23
+ },
24
+ "./utils": {
25
+ "import": "./dist/utils/index.js",
26
+ "require": "./dist/utils/index.js",
27
+ "types": "./dist/utils/index.d.ts"
28
+ }
29
+ },
8
30
  "scripts": {
9
31
  "build": "tsc",
10
32
  "test": "jest",
@@ -12,6 +34,9 @@
12
34
  "test:coverage": "jest --coverage",
13
35
  "type-check": "tsc --noEmit"
14
36
  },
37
+ "dependencies": {
38
+ "zod": "^3.22.4"
39
+ },
15
40
  "peerDependencies": {
16
41
  "@idealyst/components": "^1.0.21",
17
42
  "@idealyst/navigation": "^1.0.21",