diff --git a/cli/setup-project.js b/cli/setup-project.js index a1fcad9d3..f79bfb02c 100755 --- a/cli/setup-project.js +++ b/cli/setup-project.js @@ -54,8 +54,12 @@ const updateProjectConfig = async (projectName) => { const contents = fs.readFileSync(configPath, { encoding: 'utf-8', }); + // Schemes first, lowercase only. /ObytesApp/gi also matches `obytesapp` + // and would copy PascalCase from the project name (breaks EAS Update). + const scheme = projectName.toLowerCase().replace(/[^a-z0-9+.-]/g, ''); const replaced = contents - .replace(/ObytesApp/gi, projectName) + .replace(/obytesapp/g, scheme) + .replace(/ObytesApp/g, projectName) .replace(/com.obytes/gi, `com.${projectName.toLowerCase()}`) .replace(/obytes/gi, 'expo-owner'); diff --git a/docs/src/assets/eas-update-scheme-validation-error.png b/docs/src/assets/eas-update-scheme-validation-error.png new file mode 100644 index 000000000..db46a5bdb Binary files /dev/null and b/docs/src/assets/eas-update-scheme-validation-error.png differ diff --git a/env.ts b/env.ts index 9c3024cbf..3402637b6 100644 --- a/env.ts +++ b/env.ts @@ -6,7 +6,7 @@ import packageJSON from './package.json'; const envSchema = z.object({ EXPO_PUBLIC_APP_ENV: z.enum(['development', 'preview', 'production']), EXPO_PUBLIC_NAME: z.string(), - EXPO_PUBLIC_SCHEME: z.string(), + EXPO_PUBLIC_SCHEME: z.string().regex(/^[a-z][a-z0-9+.-]*$/), EXPO_PUBLIC_BUNDLE_ID: z.string(), EXPO_PUBLIC_PACKAGE: z.string(), EXPO_PUBLIC_VERSION: z.string(), @@ -35,10 +35,13 @@ const PACKAGES = { production: 'com.obytes', } as const; +// URL schemes must be lowercase. EAS Update rejects PascalCase +// (e.g. obytesApp) with: scheme must match ^[a-z][a-z0-9+.-]*$. +// Display NAME can stay mixed-case. const SCHEMES = { - development: 'obytesApp', - preview: 'obytesApp.preview', - production: 'obytesApp', + development: 'obytesapp', + preview: 'obytesapp.preview', + production: 'obytesapp', } as const; const NAME = 'ObytesApp';