create-100x-mobile 0.3.3 → 0.4.1

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.
@@ -0,0 +1,7 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ *No recent activity*
7
+ </claude-mem-context>
@@ -87,13 +87,59 @@ async function cmdNew(args) {
87
87
  }
88
88
  await (0, fs_1.removeDir)(projectDir);
89
89
  }
90
+ // ── Expo SDK version selection ───────────────────────────
91
+ let expoVersion = "latest";
92
+ const sdkSpinner = (0, prompts_1.spinner)();
93
+ sdkSpinner.start("Fetching available Expo SDK versions");
94
+ try {
95
+ const latestVersion = (await (0, run_1.runCapture)("npm", ["view", "expo", "version"])).trim();
96
+ const latestMajor = parseInt(latestVersion.split(".")[0], 10);
97
+ if (!isNaN(latestMajor)) {
98
+ const prevMajor = latestMajor - 1;
99
+ const prevJson = await (0, run_1.runCapture)("npm", [
100
+ "view",
101
+ `expo@^${prevMajor}.0.0`,
102
+ "version",
103
+ "--json",
104
+ ]);
105
+ const prevParsed = JSON.parse(prevJson);
106
+ const prevVersion = Array.isArray(prevParsed)
107
+ ? prevParsed[prevParsed.length - 1]
108
+ : prevParsed;
109
+ sdkSpinner.stop("Expo SDK versions fetched.");
110
+ const sdkChoice = await (0, prompts_1.select)({
111
+ message: "Which Expo SDK version?",
112
+ options: [
113
+ {
114
+ value: latestVersion,
115
+ label: `SDK ${latestMajor} (latest)`,
116
+ hint: `expo ~${latestVersion}`,
117
+ },
118
+ {
119
+ value: prevVersion,
120
+ label: `SDK ${prevMajor}`,
121
+ hint: `expo ~${prevVersion}`,
122
+ },
123
+ ],
124
+ });
125
+ if (!(0, prompts_1.isCancel)(sdkChoice)) {
126
+ expoVersion = `~${sdkChoice}`;
127
+ }
128
+ }
129
+ else {
130
+ sdkSpinner.stop("Could not parse Expo version.");
131
+ }
132
+ }
133
+ catch {
134
+ sdkSpinner.stop("Could not fetch Expo versions, using latest.");
135
+ }
90
136
  // ── Determine total steps ────────────────────────────────
91
137
  // Steps: 1=Project structure, 2=Dependencies, 3=Convex setup,
92
138
  // 4=Convex env (if clerkDomain), 5=Git init, 6=Health check
93
139
  // We'll calculate totalSteps after Clerk prompts, but we create the
94
140
  // counter now. We'll adjust totalSteps after Clerk prompts.
95
141
  let currentStep = 0;
96
- let totalSteps = 5; // base: structure, deps, convex, git, health check
142
+ let totalSteps = 6; // base: structure, deps, expo deps, convex, git, health check
97
143
  // totalSteps += 1 if clerkDomain (convex env step) — adjusted after Clerk prompts
98
144
  const stepLabel = () => `(${currentStep}/${totalSteps})`;
99
145
  // ── Step: Create directories ─────────────────────────
@@ -115,7 +161,7 @@ async function cmdNew(args) {
115
161
  // ── Step 3: Write all template files ───────────────────
116
162
  const files = [
117
163
  // Config
118
- ["package.json", (0, packageJson_1.packageJsonTemplate)(projectName)],
164
+ ["package.json", (0, packageJson_1.packageJsonTemplate)(projectName, expoVersion)],
119
165
  ["app.json", (0, appJson_1.appJsonTemplate)(projectName)],
120
166
  ["tsconfig.json", (0, tsconfig_1.tsconfigTemplate)()],
121
167
  [".gitignore", (0, gitignore_1.gitignoreTemplate)()],
@@ -168,6 +214,40 @@ async function cmdNew(args) {
168
214
  }
169
215
  }
170
216
  prompts_1.log.success("Dependencies installed.");
217
+ // ── Step: Resolve Expo dependencies ────────────────────
218
+ currentStep++;
219
+ prompts_1.log.step(`Installing Expo dependencies ${stepLabel()}`);
220
+ const expoPackages = [
221
+ "expo-router",
222
+ "@expo/vector-icons",
223
+ "expo-auth-session",
224
+ "expo-blur",
225
+ "expo-constants",
226
+ "expo-font",
227
+ "expo-haptics",
228
+ "expo-linking",
229
+ "expo-secure-store",
230
+ "expo-splash-screen",
231
+ "expo-status-bar",
232
+ "expo-system-ui",
233
+ "expo-web-browser",
234
+ "react-native-gesture-handler",
235
+ "react-native-reanimated",
236
+ "react-native-safe-area-context",
237
+ "react-native-screens",
238
+ "react-native-svg",
239
+ "react-native-web",
240
+ ];
241
+ try {
242
+ await (0, run_1.run)("npx", ["expo", "install", ...expoPackages], {
243
+ cwd: projectDir,
244
+ });
245
+ prompts_1.log.success("Expo dependencies resolved.");
246
+ }
247
+ catch {
248
+ prompts_1.log.warn("Could not resolve Expo deps automatically.");
249
+ prompts_1.log.info(picocolors_1.default.dim(" Run manually: npx expo install --fix"));
250
+ }
171
251
  // ── Step 5: Prompt for Clerk keys ──────────────────────
172
252
  // Moved BEFORE Convex init so we only need a single `convex dev --once` run.
173
253
  prompts_1.log.info("");
@@ -225,7 +305,7 @@ async function cmdNew(args) {
225
305
  }
226
306
  // Adjust total steps if Clerk domain is configured
227
307
  if (clerkDomain) {
228
- totalSteps = 6; // adds convex env step
308
+ totalSteps = 7; // adds convex env step
229
309
  }
230
310
  // ── Write Clerk env vars to .env.local ─────────
231
311
  const envLocalPath = (0, node_path_1.join)(projectDir, ".env.local");
@@ -0,0 +1,7 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ *No recent activity*
7
+ </claude-mem-context>
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.packageJsonTemplate = packageJsonTemplate;
4
- function packageJsonTemplate(appName) {
4
+ function packageJsonTemplate(appName, expoVersion = "latest") {
5
5
  const pkg = {
6
6
  name: appName,
7
7
  main: "expo-router/entry",
@@ -15,33 +15,11 @@ function packageJsonTemplate(appName) {
15
15
  },
16
16
  dependencies: {
17
17
  "@clerk/clerk-expo": "^2.14.24",
18
- "@expo/vector-icons": "^15.0.3",
19
18
  "@react-navigation/bottom-tabs": "^7.3.10",
20
19
  "@react-navigation/native": "^7.1.6",
21
20
  convex: "^1.26.1",
22
- expo: "~54.0.31",
23
- "expo-auth-session": "~7.0.10",
24
- "expo-blur": "~15.0.8",
25
- "expo-constants": "~18.0.13",
26
- "expo-font": "~14.0.10",
27
- "expo-haptics": "~15.0.8",
28
- "expo-linking": "~8.0.11",
29
- "expo-router": "~6.0.21",
30
- "expo-secure-store": "~15.0.8",
31
- "expo-splash-screen": "~31.0.13",
32
- "expo-status-bar": "~3.0.9",
33
- "expo-system-ui": "~6.0.9",
34
- "expo-web-browser": "~15.0.10",
21
+ expo: expoVersion,
35
22
  "lucide-react-native": "^0.542.0",
36
- react: "19.1.0",
37
- "react-dom": "19.1.0",
38
- "react-native": "0.81.5",
39
- "react-native-gesture-handler": "~2.28.0",
40
- "react-native-reanimated": "~3.16.1",
41
- "react-native-safe-area-context": "~5.6.0",
42
- "react-native-screens": "~4.16.0",
43
- "react-native-svg": "15.12.1",
44
- "react-native-web": "^0.21.0",
45
23
  },
46
24
  devDependencies: {
47
25
  "@babel/core": "^7.25.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-100x-mobile",
3
- "version": "0.3.3",
3
+ "version": "0.4.1",
4
4
  "description": "Scaffold a full-stack mobile app with Expo + Convex + Clerk in seconds",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {