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.
package/dist/commands/new.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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");
|
|
@@ -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:
|
|
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",
|