@ramonclaudio/vexpo 0.1.1 → 0.1.3

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 (3) hide show
  1. package/README.md +5 -1
  2. package/dist/cli.js +18 -7
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -31,6 +31,10 @@ vexpo convex Provision Convex deployment + write .env.local
31
31
  vexpo better-auth Set BETTER_AUTH_SECRET, SITE_URL, APP_NAME on Convex
32
32
  vexpo resend Provision Resend sending key + webhook, flip REQUIRE_EMAIL_VERIFICATION=true
33
33
  vexpo env push .env.local + .env.prod → Convex + EAS (one pass)
34
+ vexpo env convex-key Sync Convex deploy key + selector to EAS env (post-migration fix)
35
+ vexpo adopt Finish a project created by `eas integrations:convex:connect`
36
+ vexpo convex:migrate Copy server-side Convex env from another deployment
37
+ vexpo asc:connect Re-link the EAS project to its ASC app (standalone, wraps `eas integrations:asc:connect`)
34
38
  ```
35
39
 
36
40
  ## Apple
@@ -85,7 +89,7 @@ npx eas env [...] # env:push, env:pull, env:get, env:delete, env:
85
89
  npx eas integrations:asc [...] # status, connect, disconnect
86
90
  ```
87
91
 
88
- `vexpo full` orchestrates `eas init`, `eas env:push`, `eas credentials -p ios` (via `eas credentials:configure-build`), and `eas integrations:asc:connect` internally as setup steps, none are exposed as standalone `vexpo` commands. The ASC API key flows through to both wizards via `EXPO_ASC_API_KEY_PATH` / `EXPO_ASC_KEY_ID` / `EXPO_ASC_ISSUER_ID` env vars pre-set from the cached `asc-key` state. These env vars set `AppStoreApi.defaultAuthenticationMode = API_KEY` inside eas-cli, so when the wizard reaches the Apple auth step during ASC key generation, it uses our cached key instead of prompting for Apple ID + password. The manual paste step doesn't auto-fill — the wizard skips it by auto-generating the key instead.
92
+ `vexpo full` orchestrates `eas init`, `eas env:push`, `eas credentials -p ios` (via `eas credentials:configure-build`), and `eas integrations:asc:connect` internally as setup steps. Only the ASC link step is also exposed standalone as `vexpo asc:connect` (re-link without re-running `full`); the rest are setup-only. The ASC API key flows through to both wizards via `EXPO_ASC_API_KEY_PATH` / `EXPO_ASC_KEY_ID` / `EXPO_ASC_ISSUER_ID` env vars pre-set from the cached `asc-key` state. These env vars set `AppStoreApi.defaultAuthenticationMode = API_KEY` inside eas-cli, so when the wizard reaches the Apple auth step during ASC key generation, it uses our cached key instead of prompting for Apple ID + password. The manual paste step doesn't auto-fill — the wizard skips it by auto-generating the key instead.
89
93
 
90
94
  Earlier vexpo versions passed `--api-key-id <apple-key-id>` to `integrations:asc:connect`. That flag matches against EAS's uploaded key resources, not Apple-side identifiers, so it failed with `No App Store Connect API key found with Apple key identifier ...` whenever the key hadn't been uploaded to EAS yet (the common case on fresh projects). The current orchestration drops the flag and relies on the env vars + the wizard's "Create new or use existing" prompt instead.
91
95
 
package/dist/cli.js CHANGED
@@ -13,7 +13,7 @@ import { createSign } from 'crypto';
13
13
 
14
14
  // package.json
15
15
  var package_default = {
16
- version: "0.1.1"};
16
+ version: "0.1.3"};
17
17
  function deploymentName(value) {
18
18
  if (!value) return void 0;
19
19
  const m = /^(?:dev|prod|preview):(.+)$/.exec(value);
@@ -1090,6 +1090,12 @@ function describeDeployment(d) {
1090
1090
  // src/commands/convex.ts
1091
1091
  var BUNDLE_ID_RE = /^[A-Za-z0-9.-]+$/;
1092
1092
  var TEAM_ID_RE = /^[A-Z0-9]{10}$/;
1093
+ function resolveTeamIdInput(raw, fromConfig) {
1094
+ const value = raw.trim().toUpperCase() || (fromConfig ?? "");
1095
+ if (!value) return { kind: "skip" };
1096
+ if (!TEAM_ID_RE.test(value)) return { kind: "invalid", value };
1097
+ return { kind: "ok", value };
1098
+ }
1093
1099
  function planConvexDev(options2, needsProvisioning, projectName) {
1094
1100
  const devArgs = ["convex", "dev", "--once", "--tail-logs", "disable"];
1095
1101
  if (needsProvisioning) {
@@ -1234,13 +1240,18 @@ async function ensureIdentity(localEnv) {
1234
1240
  ` Apple Team id ${DIM}(10-char alphanumeric, find at developer.apple.com/account)${RESET}${cachedHint}
1235
1241
  ${DIM}> ${RESET}`
1236
1242
  )).trim().toUpperCase();
1237
- const value = raw || (fromConfig ?? "");
1238
- if (!TEAM_ID_RE.test(value)) {
1239
- throw new Error(`invalid Apple Team id '${value}' (must be 10 uppercase alphanumeric)`);
1243
+ const resolved = resolveTeamIdInput(raw, fromConfig);
1244
+ if (resolved.kind === "skip") {
1245
+ yep("EXPO_PUBLIC_APPLE_TEAM_ID not set (optional for lite; `vexpo full` asks again)");
1246
+ } else if (resolved.kind === "invalid") {
1247
+ throw new Error(
1248
+ `invalid Apple Team id '${resolved.value}' (must be 10 uppercase alphanumeric)`
1249
+ );
1250
+ } else {
1251
+ teamId = resolved.value;
1252
+ await ensureLine("EXPO_PUBLIC_APPLE_TEAM_ID", teamId);
1253
+ ok(`wrote EXPO_PUBLIC_APPLE_TEAM_ID=${teamId}`);
1240
1254
  }
1241
- teamId = value;
1242
- await ensureLine("EXPO_PUBLIC_APPLE_TEAM_ID", teamId);
1243
- ok(`wrote EXPO_PUBLIC_APPLE_TEAM_ID=${teamId}`);
1244
1255
  }
1245
1256
  } else {
1246
1257
  nop(`EXPO_PUBLIC_APPLE_TEAM_ID already set (${teamId})`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ramonclaudio/vexpo",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Operational CLI for vexpo projects: setup orchestration, drift detection, env sync, Apple JWT signing, ASC API integration.",
5
5
  "keywords": [
6
6
  "apple-sign-in",