mirror of
https://github.com/expo/eas-cli.git
synced 2026-11-14 17:50:32 -10:00
Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9088dbb93 | ||
|
|
f08392888d | ||
|
|
fbcc04eb62 | ||
|
|
42940b7c4c | ||
|
|
d29a88eafd | ||
|
|
67087e9471 | ||
|
|
96dc437217 | ||
|
|
f68cbb48d7 | ||
|
|
50f1269a9c | ||
|
|
3bc8a8e3e1 |
No files matched your search
@@ -1,3 +1,5 @@
|
||||
* text eol=lf
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
|
||||
**/yarn.lock linguist-generated
|
||||
@@ -31,17 +31,17 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup-mise
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: bun run build
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
- run: yarn build
|
||||
- name: Ensure GraphQL schema and generated code is up-to-date
|
||||
working-directory: ${{ github.workspace }}/packages/eas-cli
|
||||
run: |
|
||||
bun run verify-graphql-code
|
||||
yarn verify-graphql-code
|
||||
- name: Build tarballs
|
||||
working-directory: ${{ github.workspace }}/packages/eas-cli
|
||||
run: |
|
||||
bun run pretarball-ci
|
||||
bunx oclif pack:tarballs --no-xz --targets linux-x64,linux-arm
|
||||
yarn pretarball-ci
|
||||
yarn oclif pack:tarballs --no-xz --targets linux-x64,linux-arm
|
||||
- id: x64
|
||||
run: echo "filename=$(ls eas-*-x64.tar.gz)" >> $GITHUB_OUTPUT
|
||||
working-directory: ${{ github.workspace }}/packages/eas-cli/dist
|
||||
@@ -79,13 +79,13 @@ jobs:
|
||||
- run: brew install python-setuptools
|
||||
env:
|
||||
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: bun run build
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
- run: yarn build
|
||||
- name: Build tarballs
|
||||
working-directory: ${{ github.workspace }}/packages/eas-cli
|
||||
run: |
|
||||
bun run pretarball-ci
|
||||
bunx oclif pack:tarballs --no-xz --targets darwin-x64,darwin-arm64
|
||||
yarn pretarball-ci
|
||||
yarn oclif pack:tarballs --no-xz --targets darwin-x64,darwin-arm64
|
||||
- id: x64
|
||||
run: echo "filename=$(ls eas-*-x64.tar.gz)" >> $GITHUB_OUTPUT
|
||||
working-directory: ${{ github.workspace }}/packages/eas-cli/dist
|
||||
@@ -119,12 +119,12 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup-mise
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
- run: sudo apt-get install nsis
|
||||
- run: bun run build
|
||||
- run: yarn build
|
||||
- run: |
|
||||
bun run pretarball-ci
|
||||
bunx oclif pack:win
|
||||
yarn pretarball-ci
|
||||
yarn oclif pack:win
|
||||
working-directory: ${{ github.workspace }}/packages/eas-cli
|
||||
- id: x64
|
||||
run: echo "filename=$(ls eas-*-x64.exe)" >> $GITHUB_OUTPUT
|
||||
@@ -160,11 +160,11 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup-mise
|
||||
- name: Install dependencies
|
||||
run: bun install --frozen-lockfile
|
||||
run: yarn install --frozen-lockfile --check-files
|
||||
- name: Build
|
||||
run: bun run build
|
||||
run: yarn build
|
||||
- name: Publish packages to npm
|
||||
run: bunx lerna publish from-package --yes --no-verify-access
|
||||
run: yarn lerna publish from-package --yes --no-verify-access
|
||||
- name: Add latest-eas-build-staging tag
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}
|
||||
@@ -192,12 +192,12 @@ jobs:
|
||||
- uses: ./.github/actions/setup-mise
|
||||
- name: Install dependencies
|
||||
working-directory: ./scripts
|
||||
run: bun install --frozen-lockfile
|
||||
run: yarn install --frozen-lockfile --check-files
|
||||
- name: Resolve version
|
||||
run: echo "EAS_CLI_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
- name: Update changelog
|
||||
working-directory: ./scripts
|
||||
run: bun run release-changelog $EAS_CLI_VERSION > /tmp/current-changelog
|
||||
run: yarn --silent release-changelog $EAS_CLI_VERSION > /tmp/current-changelog
|
||||
- name: Publish release
|
||||
run: gh release edit v$EAS_CLI_VERSION --draft=false -F /tmp/current-changelog
|
||||
env:
|
||||
|
||||
@@ -20,6 +20,6 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup tools
|
||||
uses: ./.github/actions/setup-mise
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: bun run verify-graphql-code
|
||||
- run: yarn install --frozen-lockfile
|
||||
- run: yarn verify-graphql-code
|
||||
working-directory: packages/eas-cli
|
||||
@@ -24,5 +24,5 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup tools
|
||||
uses: ./.github/actions/setup-mise
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: bun run typecheck
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
- run: yarn typecheck
|
||||
@@ -26,13 +26,8 @@ jobs:
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- uses: jdx/mise-action@146a28175021df8ca24f8ee1828cc2a60f980bd5 # v3.5.1
|
||||
with:
|
||||
install: false
|
||||
- name: Install Bun via mise
|
||||
run: mise install bun
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: bun run typecheck
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
- run: yarn typecheck
|
||||
- run: |
|
||||
git config --global user.email "[email protected]"
|
||||
git config --global user.name "Test"
|
||||
@@ -43,31 +38,31 @@ jobs:
|
||||
- name: Run tests (affected)
|
||||
# PRs: only run tests for changed packages + dependents.
|
||||
if: ${{ !matrix.coverage && github.event_name == 'pull_request' }}
|
||||
run: bun run test -- --since ${{ github.event.pull_request.base.sha }} --include-dependents
|
||||
run: yarn lerna run test --since ${{ github.event.pull_request.base.sha }} --include-dependents
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
- name: Run tests (all)
|
||||
# Pushes to main: run all package tests.
|
||||
if: ${{ !matrix.coverage && github.event_name == 'push' }}
|
||||
run: bun run test
|
||||
run: yarn lerna run test
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
- name: Run tests (coverage)
|
||||
# Coverage on PRs and main; per-package reports are uploaded to Codecov.
|
||||
if: ${{ matrix.coverage }}
|
||||
run: bun run test -- -- --coverage
|
||||
run: yarn lerna run test -- -- --coverage
|
||||
env:
|
||||
# Oclif seems to cause OOM errors when testing with coverage enabled.
|
||||
# Remove this whenever we solved those OOM errors.
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
- run: bun run lint -- --max-warnings=0
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: yarn lint --max-warnings=0
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
working-directory: ./scripts
|
||||
- uses: codecov/codecov-action@v1
|
||||
if: ${{ matrix.coverage }}
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
- run: bun run lint-changelog
|
||||
- run: yarn lint-changelog
|
||||
|
||||
notify-slack:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -35,12 +35,12 @@ jobs:
|
||||
git checkout main
|
||||
git config --global user.email "[email protected]"
|
||||
git config --global user.name "Expo CI"
|
||||
bun install --frozen-lockfile
|
||||
bun run build
|
||||
yarn install --frozen-lockfile --check-files
|
||||
yarn build
|
||||
if [[ "$INPUT_VERSION" == "" ]]; then
|
||||
echo "Releasing with default version"
|
||||
bun run release
|
||||
yarn release
|
||||
else
|
||||
echo "Releasing with version $INPUT_VERSION"
|
||||
bun run release $INPUT_VERSION
|
||||
yarn release $INPUT_VERSION
|
||||
fi
|
||||
@@ -14,7 +14,7 @@ on:
|
||||
- "packages/turtle-spawn/**"
|
||||
- .github/workflows/worker.yml
|
||||
- .github/workflows/build-and-deploy-worker.yml
|
||||
- bun.lock
|
||||
- yarn.lock
|
||||
|
||||
concurrency:
|
||||
group: worker-${{ github.ref }}-${{ github.event_name }}
|
||||
@@ -28,17 +28,17 @@ jobs:
|
||||
|
||||
- uses: ./.github/actions/setup-mise
|
||||
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
|
||||
- run: bun run typecheck
|
||||
- run: yarn typecheck
|
||||
|
||||
- name: Run unit tests
|
||||
working-directory: packages/worker
|
||||
run: bun run test:unit
|
||||
run: yarn test:unit
|
||||
|
||||
- name: Run integration tests
|
||||
working-directory: packages/worker
|
||||
run: bun run test:integration
|
||||
run: yarn test:integration
|
||||
|
||||
worker-build:
|
||||
needs:
|
||||
|
||||
@@ -2,7 +2,5 @@
|
||||
|
||||
When working with this repository follow instructions from CLAUDE.md.
|
||||
|
||||
Use Bun for installs and scripts unless a command explicitly requires a different tool.
|
||||
|
||||
- [./CLAUDE.md](./CLAUDE.md)
|
||||
|
||||
+7
-1
@@ -10,16 +10,22 @@ This is the log of notable changes to EAS CLI and related packages.
|
||||
|
||||
### 🎉 New features
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- Hide progress bar in build credits warning when usage reaches 100%. ([#3371](https://github.com/expo/eas-cli/pull/3371) by [@mackenco](https://github.com/mackenco))
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- Fix `--non-interactive` mode prompting for git initialization. Now auto-initializes git with an initial commit when needed. Set `EAS_NO_VCS=1` to skip. ([#3387](https://github.com/expo/eas-cli/pull/3387) by [@evanbacon](https://github.com/evanbacon))
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
- Upgrade `tar` to v7. ([#3327](https://github.com/expo/eas-cli/pull/3327) by [@KarolRzeminski](https://github.com/KarolRzeminski))
|
||||
|
||||
## [16.32.0](https://github.com/expo/eas-cli/releases/tag/v16.32.0) - 2026-01-30
|
||||
|
||||
### 🎉 New features
|
||||
|
||||
- Add `--browser` flag to `eas login` for browser-based authentication. ([#3312](https://github.com/expo/eas-cli/pull/3312) by [@byronkarlen](https://github.com/byronkarlen))
|
||||
- List available options in non-interactive mode errors instead of generic "unable to select" messages, making CLI usable by agents and scripts. ([#3359](https://github.com/expo/eas-cli/pull/3359) by [@EvanBacon](https://github.com/EvanBacon))
|
||||
- Hidden beta version of new `eas account:usage` command for viewing account usage and billing estimates. ([#3334](https://github.com/expo/eas-cli/pull/3334) by [@douglowder](https://github.com/douglowder), [@EvanBacon](https://github.com/EvanBacon))
|
||||
- Add `--no-bytecode` and `--source-maps [mode]` flags to `eas update`. ([#3339](https://github.com/expo/eas-cli/pull/3339) by [@brentvatne](https://github.com/brentvatne))
|
||||
|
||||
@@ -89,51 +89,49 @@ This is a **Lerna-based monorepo** containing the EAS CLI and all supporting bui
|
||||
### Setup
|
||||
|
||||
```bash
|
||||
bun install # Install all dependencies
|
||||
bun run build # Build all packages in the monorepo
|
||||
yarn install # Install all dependencies
|
||||
yarn build # Build all packages in the monorepo
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
bun run start # Watch mode with parallel builds across all packages
|
||||
bun run watch # Alias for start
|
||||
yarn start # Watch mode with parallel builds across all packages
|
||||
yarn watch # Alias for start
|
||||
|
||||
# Development with relaxed TypeScript rules (allows unused variables)
|
||||
bun run start-allow-unused
|
||||
yarn start-allow-unused
|
||||
```
|
||||
|
||||
### Testing
|
||||
|
||||
```bash
|
||||
# Run all tests across packages
|
||||
bun run test
|
||||
# Watch mode across packages (heavier)
|
||||
bun run test -- --watch
|
||||
yarn lerna run test # Run all tests across packages
|
||||
yarn lerna run test -- --watch # Watch mode across packages (heavier)
|
||||
#
|
||||
# If you use `bun run test`, remember to pass args through two separators:
|
||||
# bun run test -- -- --watch
|
||||
# If you use `yarn test`, remember to pass args through two separators:
|
||||
# yarn test -- -- --watch
|
||||
|
||||
# Run tests for a specific package
|
||||
cd packages/eas-cli && bun run test
|
||||
cd packages/eas-json && bun run test
|
||||
cd packages/worker && bun run test
|
||||
cd packages/build-tools && bun run test
|
||||
cd packages/steps && bun run test
|
||||
cd packages/eas-cli && yarn test
|
||||
cd packages/eas-json && yarn test
|
||||
cd packages/worker && yarn test
|
||||
cd packages/build-tools && yarn test
|
||||
cd packages/steps && yarn test
|
||||
```
|
||||
|
||||
### Type Checking & Linting
|
||||
|
||||
```bash
|
||||
bun run typecheck # TypeScript type check all packages
|
||||
bun run lint # ESLint across all packages
|
||||
yarn typecheck # TypeScript type check all packages
|
||||
yarn lint # ESLint across all packages
|
||||
```
|
||||
|
||||
### Running EAS CLI Locally
|
||||
|
||||
```bash
|
||||
# From repository root:
|
||||
bun run eas <command> # Run via root package script
|
||||
yarn eas <command> # Run via root package script
|
||||
|
||||
# Or use the binary directly:
|
||||
packages/eas-cli/bin/run <command>
|
||||
@@ -259,9 +257,9 @@ Most packages depend on `@expo/eas-build-job` as the source of truth for types.
|
||||
Run a single test file:
|
||||
|
||||
```bash
|
||||
cd packages/eas-cli && bun run test <path-to-test-file>
|
||||
cd packages/eas-cli && yarn test <path-to-test-file>
|
||||
# Example:
|
||||
cd packages/eas-cli && bun run test src/project/__tests__/projectUtils-test.ts
|
||||
cd packages/eas-cli && yarn test src/project/__tests__/projectUtils-test.ts
|
||||
```
|
||||
|
||||
## Common Development Scenarios
|
||||
@@ -308,8 +306,8 @@ export EXPO_DEBUG=1 # Enable debug logging
|
||||
All changes should be validated with TypeScript and the linter before committing:
|
||||
|
||||
```bash
|
||||
bun run typecheck # Validate TypeScript types
|
||||
bun run lint # Run ESLint
|
||||
yarn typecheck # Validate TypeScript types
|
||||
yarn lint # Run ESLint
|
||||
```
|
||||
|
||||
### Logging
|
||||
@@ -357,5 +355,5 @@ See `LICENSE` (MIT) and `LICENSE-BUSL` (BUSL-1.1) for details.
|
||||
## Important Notes
|
||||
|
||||
- **Node Version**: Requires Node.js (managed via Mise)
|
||||
- **Package Manager**: Uses Bun
|
||||
- **Package Manager**: Uses Yarn 1.22.21
|
||||
- **Compilation Target**: CommonJS with Node resolution
|
||||
+6
-6
@@ -5,13 +5,13 @@
|
||||
If this is your first time running `eas-cli` locally, make sure you install and build the packages. In the project root, run:
|
||||
|
||||
```sh
|
||||
bun install
|
||||
bun run build
|
||||
yarn install
|
||||
yarn build
|
||||
```
|
||||
|
||||
From there, set up an alias for the EAS CLI so you can try it in projects all around your computer. The project is compiled on the fly so you don't need to run a build (watch) command.
|
||||
|
||||
> The only exception is if there have been changes in `packages/eas-json`. In that case, you'll have to run `bun run build` in the root.
|
||||
> The only exception is if there have been changes in `packages/eas-json`. In that case, you'll have to run `yarn build` in the root.
|
||||
|
||||
Open your `.zshrc` or other config file and add:
|
||||
|
||||
@@ -24,7 +24,7 @@ Then use it with `easd` like `easd build`.
|
||||
If you're making changes to `packages/eas-json` or prefer/need to work with production code, start the build command in watch mode with:
|
||||
|
||||
```sh
|
||||
bun run start
|
||||
yarn start
|
||||
```
|
||||
|
||||
If it is easier for you to work with the code locally with compiler options set to:
|
||||
@@ -43,7 +43,7 @@ If it is easier for you to work with the code locally with compiler options set
|
||||
you can consider using:
|
||||
|
||||
```sh
|
||||
bun run start-allow-unused
|
||||
yarn start-allow-unused
|
||||
```
|
||||
|
||||
## Format
|
||||
@@ -69,7 +69,7 @@ See [`CLAUDE.md`](./CLAUDE.md) for how to set up your environment when making ch
|
||||
|
||||
## Testing
|
||||
|
||||
From the repository root, run `bun run test`. For a single package, run `bun run test` in that package directory.
|
||||
From the repository root, run `yarn lerna run test`. For a single package, run `yarn test` in that package directory.
|
||||
|
||||
## Releasing
|
||||
|
||||
|
||||
+2
-1
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"version": "16.32.0",
|
||||
"npmClient": "yarn",
|
||||
"version": "17.0.0",
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
|
||||
}
|
||||
+3
-3
@@ -6,12 +6,12 @@
|
||||
],
|
||||
"scripts": {
|
||||
"build": "lerna run build",
|
||||
"build:tarballs:linux": "bun run build-for-size-check",
|
||||
"build-for-size-check": "bun run build && lerna run pretarball-ci --scope eas-cli && CLI_SIZE_CHECK=1 lerna exec --scope eas-cli -- oclif pack:tarballs --no-xz --targets linux-x64",
|
||||
"build:tarballs:linux": "yarn build-for-size-check",
|
||||
"build-for-size-check": "yarn build && yarn workspace eas-cli pretarball-ci && CLI_SIZE_CHECK=1 yarn workspace eas-cli oclif pack:tarballs --no-xz --targets linux-x64",
|
||||
"typecheck": "lerna run typecheck",
|
||||
"start": "lerna run watch --stream --parallel",
|
||||
"start-allow-unused": "lerna run watch-allow-unused --stream --parallel",
|
||||
"watch": "bun run start",
|
||||
"watch": "yarn start",
|
||||
"eas": "packages/eas-cli/bin/run",
|
||||
"lint": "eslint .",
|
||||
"lint-changelog": "./scripts/bin/run lint-changelog",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/build-tools"
|
||||
},
|
||||
"version": "1.0.272",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
@@ -15,10 +15,10 @@
|
||||
"bin"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"prewatch": "bun run gql",
|
||||
"start": "yarn watch",
|
||||
"prewatch": "yarn gql",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"prebuild": "bun run gql",
|
||||
"prebuild": "yarn gql",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
"prepack": "rm -rf dist && tsc -p tsconfig.build.json",
|
||||
@@ -28,8 +28,8 @@
|
||||
"jest-integration-watch": "jest --config jest/integration-config.ts --watch",
|
||||
"clean": "rm -rf node_modules dist coverage *.tsbuildinfo",
|
||||
"gql": "gql.tada generate-schema ${API_SERVER_URL:-https://api.expo.dev}/graphql --output ./schema.graphql && gql.tada generate-output",
|
||||
"gql:local": "API_SERVER_URL=http://api.expo.test bun run gql",
|
||||
"test": "bun run jest-unit"
|
||||
"gql:local": "API_SERVER_URL=http://api.expo.test yarn gql",
|
||||
"test": "yarn jest-unit"
|
||||
},
|
||||
"author": "Expo <[email protected]>",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
@@ -37,17 +37,17 @@
|
||||
"dependencies": {
|
||||
"@expo/config": "10.0.6",
|
||||
"@expo/config-plugins": "9.0.12",
|
||||
"@expo/downloader": "1.0.260",
|
||||
"@expo/eas-build-job": "1.0.265",
|
||||
"@expo/downloader": "17.0.0",
|
||||
"@expo/eas-build-job": "17.0.0",
|
||||
"@expo/env": "^0.4.0",
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/logger": "17.0.0",
|
||||
"@expo/package-manager": "1.9.10",
|
||||
"@expo/plist": "^0.2.0",
|
||||
"@expo/results": "^1.0.0",
|
||||
"@expo/spawn-async": "1.7.2",
|
||||
"@expo/steps": "1.0.271",
|
||||
"@expo/template-file": "1.0.260",
|
||||
"@expo/turtle-spawn": "1.0.260",
|
||||
"@expo/steps": "17.0.0",
|
||||
"@expo/template-file": "17.0.0",
|
||||
"@expo/turtle-spawn": "17.0.0",
|
||||
"@expo/xcpretty": "^4.3.1",
|
||||
"@google-cloud/storage": "^7.11.2",
|
||||
"@urql/core": "^6.0.1",
|
||||
@@ -55,6 +55,7 @@
|
||||
"fs-extra": "^11.2.0",
|
||||
"gql.tada": "^1.8.13",
|
||||
"joi": "^17.13.1",
|
||||
"jose": "5.10.0",
|
||||
"lodash": "^4.17.21",
|
||||
"node-fetch": "^2.7.0",
|
||||
"node-forge": "^1.3.1",
|
||||
@@ -65,7 +66,7 @@
|
||||
"resolve-from": "^5.0.0",
|
||||
"retry": "^0.13.1",
|
||||
"semver": "^7.6.2",
|
||||
"tar": "^7.4.3",
|
||||
"tar": "7.5.7",
|
||||
"uuid": "9.0.1",
|
||||
"yaml": "^2.8.1",
|
||||
"zod": "^4.3.5"
|
||||
@@ -86,6 +87,7 @@
|
||||
"bunyan": "^1.8.15",
|
||||
"jest": "^29.7.0",
|
||||
"memfs": "^4.17.1",
|
||||
"nock": "13.4.0",
|
||||
"ts-jest": "^29.1.4",
|
||||
"ts-mockito": "^2.6.1",
|
||||
"tslib": "^2.6.3",
|
||||
|
||||
@@ -36,6 +36,7 @@ import { createStartAndroidEmulatorBuildFunction } from './functions/startAndroi
|
||||
import { createStartCuttlefishDeviceBuildFunction } from './functions/startCuttlefishDevice';
|
||||
import { createStartIosSimulatorBuildFunction } from './functions/startIosSimulator';
|
||||
import { createUploadArtifactBuildFunction } from './functions/uploadArtifact';
|
||||
import { createUploadToAscBuildFunction } from './functions/uploadToAsc';
|
||||
import { createSetUpNpmrcBuildFunction } from './functions/useNpmToken';
|
||||
import { CustomBuildContext } from '../customBuildContext';
|
||||
|
||||
@@ -75,6 +76,7 @@ export function getEasFunctions(ctx: CustomBuildContext): BuildFunction[] {
|
||||
calculateEASUpdateRuntimeVersionFunction(),
|
||||
|
||||
createSubmissionEntityFunction(),
|
||||
createUploadToAscBuildFunction(),
|
||||
|
||||
createInternalEasMaestroTestFunction(ctx),
|
||||
];
|
||||
|
||||
@@ -0,0 +1,330 @@
|
||||
import {
|
||||
BuildFunction,
|
||||
BuildStepInput,
|
||||
BuildStepInputValueTypeName,
|
||||
BuildStepOutput,
|
||||
} from '@expo/steps';
|
||||
import fs from 'fs-extra';
|
||||
import * as jose from 'jose';
|
||||
import fetch from 'node-fetch';
|
||||
import path from 'node:path';
|
||||
import { setTimeout } from 'node:timers/promises';
|
||||
import { z } from 'zod';
|
||||
|
||||
import { AscApiClient, AscApiClientPostApi } from '../utils/ios/AscApiClient';
|
||||
|
||||
export function createUploadToAscBuildFunction(): BuildFunction {
|
||||
return new BuildFunction({
|
||||
namespace: 'eas',
|
||||
id: 'upload_to_asc',
|
||||
name: 'Upload to App Store Connect',
|
||||
__metricsId: 'eas/upload_to_asc',
|
||||
inputProviders: [
|
||||
BuildStepInput.createProvider({
|
||||
id: 'ipa_path',
|
||||
required: true,
|
||||
allowedValueTypeName: BuildStepInputValueTypeName.STRING,
|
||||
}),
|
||||
BuildStepInput.createProvider({
|
||||
id: 'asc_api_key_path',
|
||||
required: true,
|
||||
allowedValueTypeName: BuildStepInputValueTypeName.STRING,
|
||||
}),
|
||||
BuildStepInput.createProvider({
|
||||
id: 'apple_app_identifier',
|
||||
required: true,
|
||||
allowedValueTypeName: BuildStepInputValueTypeName.STRING,
|
||||
}),
|
||||
BuildStepInput.createProvider({
|
||||
id: 'bundle_version',
|
||||
required: true,
|
||||
allowedValueTypeName: BuildStepInputValueTypeName.STRING,
|
||||
}),
|
||||
BuildStepInput.createProvider({
|
||||
id: 'bundle_short_version',
|
||||
required: true,
|
||||
allowedValueTypeName: BuildStepInputValueTypeName.STRING,
|
||||
}),
|
||||
BuildStepInput.createProvider({
|
||||
id: 'wait_for_processing',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
allowedValueTypeName: BuildStepInputValueTypeName.BOOLEAN,
|
||||
}),
|
||||
],
|
||||
outputProviders: [
|
||||
BuildStepOutput.createProvider({
|
||||
id: 'build_upload_id',
|
||||
required: false,
|
||||
}),
|
||||
BuildStepOutput.createProvider({
|
||||
id: 'build_upload_url',
|
||||
required: false,
|
||||
}),
|
||||
],
|
||||
fn: async (stepsCtx, { inputs, outputs }) => {
|
||||
const ipaPathInput = z.string().parse(inputs.ipa_path.value);
|
||||
const ascApiKeyPathInput = z.string().parse(inputs.asc_api_key_path.value);
|
||||
const appleAppIdentifier = z.string().parse(inputs.apple_app_identifier.value);
|
||||
const bundleVersion = z.string().parse(inputs.bundle_version.value);
|
||||
const bundleShortVersion = z.string().parse(inputs.bundle_short_version.value);
|
||||
const waitForProcessing = Boolean(inputs.wait_for_processing.value);
|
||||
|
||||
const ipaPath = path.resolve(stepsCtx.workingDirectory, ipaPathInput);
|
||||
if (!(await fs.pathExists(ipaPath))) {
|
||||
throw new Error(`IPA file not found: ${ipaPath}`);
|
||||
}
|
||||
const fileSize = (await fs.stat(ipaPath)).size;
|
||||
const fileName = path.basename(ipaPath);
|
||||
|
||||
const ascApiKeyPath = path.resolve(stepsCtx.workingDirectory, ascApiKeyPathInput);
|
||||
if (!(await fs.pathExists(ascApiKeyPath))) {
|
||||
throw new Error(`ASC API Key file not found: ${ascApiKeyPath}`);
|
||||
}
|
||||
|
||||
const ascApiKeyJson = await fs.readJson(ascApiKeyPath);
|
||||
const ascApiKey = z
|
||||
.object({
|
||||
issuer_id: z.string(),
|
||||
key_id: z.string(),
|
||||
key: z.string(),
|
||||
})
|
||||
.parse(ascApiKeyJson);
|
||||
|
||||
const privateKey = await jose.importPKCS8(ascApiKey.key, 'ES256');
|
||||
const token = await new jose.SignJWT({})
|
||||
.setProtectedHeader({ alg: 'ES256', kid: ascApiKey.key_id })
|
||||
.setIssuer(ascApiKey.issuer_id)
|
||||
.setAudience('appstoreconnect-v1')
|
||||
.setExpirationTime('20m')
|
||||
.sign(privateKey);
|
||||
|
||||
const client = new AscApiClient({ token, logger: stepsCtx.logger });
|
||||
|
||||
stepsCtx.logger.info('Reading App information...');
|
||||
const appResponse = await client.getAsync(
|
||||
'/v1/apps/:id',
|
||||
{ 'fields[apps]': ['bundleId', 'name'] },
|
||||
{ id: appleAppIdentifier }
|
||||
);
|
||||
stepsCtx.logger.info(
|
||||
`Uploading Build to "${appResponse.data.attributes.name}" (${appResponse.data.attributes.bundleId})...`
|
||||
);
|
||||
|
||||
stepsCtx.logger.info('Creating Build Upload...');
|
||||
const buildUploadResponse = await client.postAsync('/v1/buildUploads', {
|
||||
data: {
|
||||
type: 'buildUploads',
|
||||
attributes: {
|
||||
platform: 'IOS',
|
||||
cfBundleShortVersionString: bundleShortVersion,
|
||||
cfBundleVersion: bundleVersion,
|
||||
},
|
||||
relationships: {
|
||||
app: {
|
||||
data: {
|
||||
type: 'apps',
|
||||
id: appleAppIdentifier,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const buildUploadId = buildUploadResponse.data.id;
|
||||
const buildUploadUrl = `https://appstoreconnect.apple.com/apps/${appleAppIdentifier}/testflight/ios/${buildUploadId}`;
|
||||
outputs.build_upload_id.set(buildUploadId);
|
||||
outputs.build_upload_url.set(buildUploadUrl);
|
||||
|
||||
stepsCtx.logger.info(
|
||||
`Build Upload initialized (ID: ${buildUploadId}). Preparing IPA upload...`
|
||||
);
|
||||
const buildFileResponse = await client.postAsync('/v1/buildUploadFiles', {
|
||||
data: {
|
||||
type: 'buildUploadFiles',
|
||||
attributes: {
|
||||
assetType: 'ASSET',
|
||||
fileName,
|
||||
fileSize,
|
||||
uti: 'com.apple.ipa',
|
||||
},
|
||||
relationships: {
|
||||
buildUpload: {
|
||||
data: {
|
||||
type: 'buildUploads',
|
||||
id: buildUploadId,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
stepsCtx.logger.info(
|
||||
`IPA Upload initialized (ID: ${buildFileResponse.data.id}). Uploading IPA...`
|
||||
);
|
||||
await uploadChunksAsync({
|
||||
uploadOperations: buildFileResponse.data.attributes.uploadOperations,
|
||||
ipaPath,
|
||||
logger: stepsCtx.logger,
|
||||
});
|
||||
|
||||
stepsCtx.logger.info('Committing upload...');
|
||||
await client.patchAsync(
|
||||
`/v1/buildUploadFiles/:id`,
|
||||
{
|
||||
data: {
|
||||
type: 'buildUploadFiles',
|
||||
id: buildFileResponse.data.id,
|
||||
attributes: {
|
||||
uploaded: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
id: buildFileResponse.data.id,
|
||||
}
|
||||
);
|
||||
|
||||
stepsCtx.logger.info('Checking upload file status...');
|
||||
const waitingForFileStartedAt = Date.now();
|
||||
while (Date.now() - waitingForFileStartedAt < 60 * 1000 /* 60 seconds */) {
|
||||
const {
|
||||
data: {
|
||||
attributes: { assetDeliveryState },
|
||||
},
|
||||
} = await client.getAsync(
|
||||
`/v1/buildUploadFiles/:id`,
|
||||
{ 'fields[buildUploadFiles]': ['assetDeliveryState'] },
|
||||
{ id: buildFileResponse.data.id }
|
||||
);
|
||||
|
||||
if (assetDeliveryState.state === 'AWAITING_UPLOAD') {
|
||||
stepsCtx.logger.info(
|
||||
`Waiting for file upload to complete processing... (state = ${assetDeliveryState.state})`
|
||||
);
|
||||
await setTimeout(2000);
|
||||
continue;
|
||||
}
|
||||
|
||||
const { errors = [], warnings = [] } = assetDeliveryState;
|
||||
if (warnings.length > 0) {
|
||||
stepsCtx.logger.warn(`Warnings:\n${itemizeMessages(warnings)}\n`);
|
||||
}
|
||||
if (errors.length > 0) {
|
||||
stepsCtx.logger.error(`Errors:\n${itemizeMessages(errors)}\n`);
|
||||
}
|
||||
|
||||
if (assetDeliveryState.state === 'FAILED') {
|
||||
throw new Error(`File upload (ID: ${buildFileResponse.data.id}) failed.`);
|
||||
} else if (
|
||||
assetDeliveryState.state === 'COMPLETE' ||
|
||||
assetDeliveryState.state === 'UPLOAD_COMPLETE'
|
||||
) {
|
||||
stepsCtx.logger.info(`File upload (ID: ${buildFileResponse.data.id}) completed!`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
stepsCtx.logger.info(`See your build in App Store Connect: ${buildUploadUrl}`);
|
||||
|
||||
if (!waitForProcessing) {
|
||||
stepsCtx.logger.info('Skipping waiting for processing.');
|
||||
return;
|
||||
}
|
||||
|
||||
stepsCtx.logger.info('Checking build upload status...');
|
||||
const waitingForBuildStartedAt = Date.now();
|
||||
while (Date.now() - waitingForBuildStartedAt < 10 * 60 * 1000 /* 10 minutes */) {
|
||||
const {
|
||||
data: {
|
||||
attributes: { state },
|
||||
},
|
||||
} = await client.getAsync(
|
||||
`/v1/buildUploads/:id`,
|
||||
{ 'fields[buildUploads]': ['state', 'build'], include: ['build'] },
|
||||
{ id: buildUploadId }
|
||||
);
|
||||
|
||||
if (state.state === 'AWAITING_UPLOAD' || state.state === 'PROCESSING') {
|
||||
stepsCtx.logger.info(`Waiting for build upload to complete... (status = ${state.state})`);
|
||||
await setTimeout(2000);
|
||||
continue;
|
||||
}
|
||||
|
||||
stepsCtx.logger.info('\n');
|
||||
|
||||
const { errors = [], warnings = [], infos = [] } = state;
|
||||
if (infos.length > 0) {
|
||||
stepsCtx.logger.info(`Infos:\n${itemizeMessages(infos)}\n`);
|
||||
}
|
||||
if (warnings.length > 0) {
|
||||
stepsCtx.logger.warn(`Warnings:\n${itemizeMessages(warnings)}\n`);
|
||||
}
|
||||
if (errors.length > 0) {
|
||||
stepsCtx.logger.error(`Errors:\n${itemizeMessages(errors)}\n`);
|
||||
}
|
||||
|
||||
if (state.state === 'FAILED') {
|
||||
throw new Error(`Build upload (ID: ${buildUploadId}) failed.`);
|
||||
} else if (state.state === 'COMPLETE') {
|
||||
stepsCtx.logger.info(`Build upload (ID: ${buildUploadId}) complete!`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function itemizeMessages(messages: { description: string; code: string }[]): string {
|
||||
return `- ${messages.map(m => `${m.description} (${m.code})`).join('\n- ')}`;
|
||||
}
|
||||
|
||||
async function uploadChunksAsync({
|
||||
uploadOperations,
|
||||
ipaPath,
|
||||
logger,
|
||||
}: {
|
||||
uploadOperations: AscApiClientPostApi['/v1/buildUploadFiles']['response']['data']['attributes']['uploadOperations'];
|
||||
ipaPath: string;
|
||||
logger: { info: (message: string) => void };
|
||||
}): Promise<void> {
|
||||
const fd = await fs.open(ipaPath, 'r');
|
||||
try {
|
||||
const promises = uploadOperations.map(async (op, index) => {
|
||||
logger.info(
|
||||
` Uploading chunk ${index + 1}/${uploadOperations.length} (offset: ${op.offset}, length: ${
|
||||
op.length
|
||||
})...`
|
||||
);
|
||||
|
||||
const buffer = new Uint8Array(op.length);
|
||||
await fs.read(fd, buffer, 0, op.length, op.offset);
|
||||
|
||||
const headers: Record<string, string> = {
|
||||
'Content-Type': 'application/octet-stream',
|
||||
};
|
||||
|
||||
for (const { name, value } of op.requestHeaders) {
|
||||
headers[name] = value;
|
||||
}
|
||||
|
||||
const response = await fetch(op.url, {
|
||||
method: op.method,
|
||||
headers,
|
||||
body: buffer,
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text();
|
||||
throw new Error(
|
||||
`Failed to upload chunk ${index + 1}: ${response.status} ${response.statusText}\n${text}`
|
||||
);
|
||||
}
|
||||
logger.info(` Chunk ${index + 1}/${uploadOperations.length} uploaded.`);
|
||||
});
|
||||
|
||||
await Promise.all(promises);
|
||||
} finally {
|
||||
await fs.close(fd);
|
||||
}
|
||||
}
|
||||
+15
-5
@@ -1,9 +1,8 @@
|
||||
import { bunyan } from '@expo/logger';
|
||||
import { asyncResult } from '@expo/results';
|
||||
import fetch from 'node-fetch';
|
||||
import { ZodError, z } from 'zod';
|
||||
|
||||
import Log from '../../log';
|
||||
|
||||
type ApiSchema = {
|
||||
[Path in string]: {
|
||||
path?: z.ZodType<Record<string, string>>;
|
||||
@@ -240,9 +239,11 @@ export type AscApiClientPatchApi = {
|
||||
export class AscApiClient {
|
||||
private readonly baseUrl = 'https://api.appstoreconnect.apple.com';
|
||||
private readonly token: string;
|
||||
private readonly logger?: bunyan;
|
||||
|
||||
constructor({ token }: { token: string }) {
|
||||
constructor({ token, logger }: { token: string; logger?: bunyan }) {
|
||||
this.token = token;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
public async getAsync<TPath extends keyof typeof GetApi>(
|
||||
@@ -257,9 +258,18 @@ export class AscApiClient {
|
||||
effectivePath = effectivePath.replace(`:${key}`, String(value));
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
for (const [key, value] of Object.entries(body)) {
|
||||
if (Array.isArray(value)) {
|
||||
searchParams.set(key, value.join(','));
|
||||
} else {
|
||||
searchParams.set(key, String(value));
|
||||
}
|
||||
}
|
||||
|
||||
return await this.sendRequestAsync({
|
||||
method: 'GET',
|
||||
path: `${effectivePath}?${new URLSearchParams(body).toString()}`,
|
||||
path: `${effectivePath}?${searchParams.toString()}`,
|
||||
body,
|
||||
requestSchema: schema.request,
|
||||
responseSchema: schema.response,
|
||||
@@ -343,7 +353,7 @@ export class AscApiClient {
|
||||
|
||||
const json = await response.json();
|
||||
|
||||
Log.debug(`Response from App Store Connect: ${JSON.stringify(json, null, 2)}`);
|
||||
this.logger?.debug(`Response from App Store Connect: ${JSON.stringify(json, null, 2)}`);
|
||||
|
||||
const parsedResponse = await asyncResult((async () => responseSchema.parse(json))());
|
||||
if (!parsedResponse.ok) {
|
||||
+3
@@ -2,6 +2,9 @@ import nock from 'nock';
|
||||
|
||||
import { AscApiClient } from '../AscApiClient';
|
||||
|
||||
// nock needs real fetch implementation
|
||||
jest.unmock('node-fetch');
|
||||
|
||||
describe(AscApiClient, () => {
|
||||
const token = 'test-token';
|
||||
const client = new AscApiClient({ token });
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -12,9 +12,6 @@
|
||||
# With NPM
|
||||
npx create-eas-build-function
|
||||
|
||||
# With Bun
|
||||
bunx create-eas-build-function
|
||||
|
||||
# With Yarn
|
||||
yarn create eas-build-function
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/create-eas-build-function"
|
||||
},
|
||||
"version": "1.0.271",
|
||||
"version": "17.0.0",
|
||||
"bin": {
|
||||
"create-eas-build-function": "./build/index.js"
|
||||
},
|
||||
@@ -24,17 +24,17 @@
|
||||
"templates"
|
||||
],
|
||||
"scripts": {
|
||||
"prepack": "bun run clean && bun run build",
|
||||
"prepack": "yarn run clean && yarn run build",
|
||||
"lint": "eslint .",
|
||||
"test": "echo 'No tests yet.'",
|
||||
"watch": "bun run build:dev -w",
|
||||
"watch": "yarn run build:dev -w",
|
||||
"build:dev": "ncc build ./src/index.ts -o build/",
|
||||
"build": "ncc build ./src/index.ts -o build/ --minify --no-cache --no-source-map-register",
|
||||
"typecheck": "tsc",
|
||||
"clean": "rimraf ./build/ *.tsbuildinfo"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/steps": "1.0.271"
|
||||
"@expo/steps": "17.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@expo/package-manager": "1.9.10",
|
||||
|
||||
@@ -11,6 +11,6 @@
|
||||
},
|
||||
"scripts": {
|
||||
"babel": "babel src --out-dir babel",
|
||||
"build": "bun run babel && ncc build ./babel/index.js -o build/ --minify --no-cache --no-source-map-register"
|
||||
"build": "yarn babel && ncc build ./babel/index.js -o build/ --minify --no-cache --no-source-map-register"
|
||||
}
|
||||
}
|
||||
@@ -5,14 +5,14 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/downloader"
|
||||
},
|
||||
"version": "1.0.260",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
|
||||
@@ -13,10 +13,10 @@ A build cache provider plugin for Expo CLI. Published as `eas-build-cache-provid
|
||||
## Development Commands
|
||||
|
||||
```bash
|
||||
bun run build # TypeScript compilation (src → build)
|
||||
bun run watch # Watch mode
|
||||
bun run typecheck # Type check
|
||||
bun run test # Run tests
|
||||
yarn build # TypeScript compilation (src → build)
|
||||
yarn watch # Watch mode
|
||||
yarn typecheck # Type check
|
||||
yarn test # Run tests
|
||||
```
|
||||
|
||||
## Usage
|
||||
@@ -28,8 +28,6 @@ Install as a dev dependency in your Expo project:
|
||||
```bash
|
||||
npm install --save-dev eas-build-cache-provider
|
||||
# or
|
||||
bun add --dev eas-build-cache-provider
|
||||
# or
|
||||
yarn add --dev eas-build-cache-provider
|
||||
```
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "eas-build-cache-provider",
|
||||
"description": "A build cache provider plugin for the Expo CLI",
|
||||
"version": "16.30.0",
|
||||
"version": "17.0.0",
|
||||
"author": "Expo <[email protected]>",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"dependencies": {
|
||||
@@ -41,13 +41,13 @@
|
||||
"scripts": {
|
||||
"build": "tsc --project tsconfig.build.json",
|
||||
"build-allow-unused": "tsc --project tsconfig.allowUnused.json",
|
||||
"watch": "bun run build --watch --preserveWatchOutput",
|
||||
"watch-allow-unused": "bun run build-allow-unused --watch --preserveWatchOutput",
|
||||
"watch": "yarn build --watch --preserveWatchOutput",
|
||||
"watch-allow-unused": "yarn build-allow-unused --watch --preserveWatchOutput",
|
||||
"typecheck": "tsc",
|
||||
"prepack": "bun run rebuild",
|
||||
"rebuild": "rimraf build && bun run build",
|
||||
"prepack": "yarn rebuild",
|
||||
"rebuild": "rimraf build && yarn build",
|
||||
"test": "jest --passWithNoTests",
|
||||
"clean": "rimraf build node_modules *.tsbuildinfo"
|
||||
"clean": "rimraf build node_modules yarn-error.log *.tsbuildinfo"
|
||||
},
|
||||
"files": [
|
||||
"/build"
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/eas-build-job"
|
||||
},
|
||||
"version": "1.0.265",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
@@ -32,7 +32,7 @@
|
||||
"typescript": "^5.5.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/logger": "17.0.0",
|
||||
"joi": "^17.13.1",
|
||||
"semver": "^7.6.2",
|
||||
"zod": "^4.3.5"
|
||||
|
||||
+12
-12
@@ -15,7 +15,7 @@ The main CLI tool for Expo Application Services (EAS). Published as `eas-cli` on
|
||||
### Running Locally
|
||||
```bash
|
||||
# From repository root:
|
||||
bun run eas <command>
|
||||
yarn eas <command>
|
||||
|
||||
# Or use the binary directly:
|
||||
packages/eas-cli/bin/run <command>
|
||||
@@ -27,23 +27,23 @@ easd build --help
|
||||
|
||||
### Build & Development
|
||||
```bash
|
||||
bun run build # TypeScript compilation (src → build)
|
||||
bun run watch # Watch mode
|
||||
bun run watch-allow-unused # Watch mode with relaxed TS rules
|
||||
bun run typecheck # Type check without building
|
||||
bun run typecheck-for-build # Type check for production build
|
||||
yarn build # TypeScript compilation (src → build)
|
||||
yarn watch # Watch mode
|
||||
yarn watch-allow-unused # Watch mode with relaxed TS rules
|
||||
yarn typecheck # Type check without building
|
||||
yarn typecheck-for-build # Type check for production build
|
||||
```
|
||||
|
||||
### Testing
|
||||
```bash
|
||||
bun run test # Run all tests
|
||||
bun run test <path-to-file> # Run specific test file
|
||||
yarn test # Run all tests
|
||||
yarn test <path-to-file> # Run specific test file
|
||||
```
|
||||
|
||||
### GraphQL Code Generation
|
||||
```bash
|
||||
bun run generate-graphql-code # Generate TypeScript types from GraphQL schema
|
||||
bun run verify-graphql-code # Verify GraphQL code is up to date (CI check)
|
||||
yarn generate-graphql-code # Generate TypeScript types from GraphQL schema
|
||||
yarn verify-graphql-code # Verify GraphQL code is up to date (CI check)
|
||||
```
|
||||
|
||||
The GraphQL schema is fetched from `https://staging-api.expo.dev/graphql` and generates:
|
||||
@@ -52,7 +52,7 @@ The GraphQL schema is fetched from `https://staging-api.expo.dev/graphql` and ge
|
||||
|
||||
### oclif Commands
|
||||
```bash
|
||||
bunx oclif readme # Auto-generate README.md from command metadata
|
||||
yarn oclif readme # Auto-generate README.md from command metadata
|
||||
```
|
||||
|
||||
## Command Architecture
|
||||
@@ -283,7 +283,7 @@ describe('MyCommand', () => {
|
||||
## Important Notes
|
||||
|
||||
- **oclif**: Commands auto-discovered from `build/commands/`
|
||||
- **README**: Auto-generated from oclif - update via `bunx oclif readme`
|
||||
- **README**: Auto-generated from oclif - update via `yarn oclif readme`
|
||||
- **Manifest**: Generated during `prepack` step
|
||||
- **Templates**: `src/commandUtils/new/templates` are copied to `build/` during build
|
||||
- **Node Version**: >= 18.0.0
|
||||
+93
-93
@@ -16,7 +16,7 @@ EAS command line tool
|
||||
```sh
|
||||
npm install -g eas-cli
|
||||
# or
|
||||
bun add -g eas-cli
|
||||
yarn global add eas-cli
|
||||
```
|
||||
|
||||
## Enforcing eas-cli version for your project
|
||||
@@ -177,7 +177,7 @@ ALIASES
|
||||
$ eas login
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/account/login.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/account/login.ts)_
|
||||
|
||||
## `eas account:logout`
|
||||
|
||||
@@ -194,7 +194,7 @@ ALIASES
|
||||
$ eas logout
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/account/logout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/account/logout.ts)_
|
||||
|
||||
## `eas account:usage [ACCOUNT_NAME]`
|
||||
|
||||
@@ -216,7 +216,7 @@ DESCRIPTION
|
||||
view account usage and billing for the current cycle
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/usage.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/account/usage.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/usage.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/account/usage.ts)_
|
||||
|
||||
## `eas account:view`
|
||||
|
||||
@@ -233,7 +233,7 @@ ALIASES
|
||||
$ eas whoami
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/account/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/account/view.ts)_
|
||||
|
||||
## `eas analytics [STATUS]`
|
||||
|
||||
@@ -247,7 +247,7 @@ DESCRIPTION
|
||||
display or change analytics settings
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/analytics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/analytics.ts)_
|
||||
|
||||
## `eas autocomplete [SHELL]`
|
||||
|
||||
@@ -299,7 +299,7 @@ DESCRIPTION
|
||||
create a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/branch/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/branch/create.ts)_
|
||||
|
||||
## `eas branch:delete [NAME]`
|
||||
|
||||
@@ -320,7 +320,7 @@ DESCRIPTION
|
||||
delete a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/branch/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/branch/delete.ts)_
|
||||
|
||||
## `eas branch:list`
|
||||
|
||||
@@ -340,7 +340,7 @@ DESCRIPTION
|
||||
list all branches
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/branch/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/branch/list.ts)_
|
||||
|
||||
## `eas branch:rename`
|
||||
|
||||
@@ -360,7 +360,7 @@ DESCRIPTION
|
||||
rename a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/branch/rename.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/branch/rename.ts)_
|
||||
|
||||
## `eas branch:view [NAME]`
|
||||
|
||||
@@ -383,7 +383,7 @@ DESCRIPTION
|
||||
view a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/branch/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/branch/view.ts)_
|
||||
|
||||
## `eas build`
|
||||
|
||||
@@ -424,7 +424,7 @@ DESCRIPTION
|
||||
start a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/index.ts)_
|
||||
|
||||
## `eas build:cancel [BUILD_ID]`
|
||||
|
||||
@@ -443,7 +443,7 @@ DESCRIPTION
|
||||
cancel a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/cancel.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/cancel.ts)_
|
||||
|
||||
## `eas build:configure`
|
||||
|
||||
@@ -460,7 +460,7 @@ DESCRIPTION
|
||||
configure the project to support EAS Build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/configure.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/configure.ts)_
|
||||
|
||||
## `eas build:delete [BUILD_ID]`
|
||||
|
||||
@@ -479,7 +479,7 @@ DESCRIPTION
|
||||
delete a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/delete.ts)_
|
||||
|
||||
## `eas build:dev`
|
||||
|
||||
@@ -499,7 +499,7 @@ DESCRIPTION
|
||||
run dev client simulator/emulator build with matching fingerprint or create a new one
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/dev.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/dev.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/dev.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/dev.ts)_
|
||||
|
||||
## `eas build:download`
|
||||
|
||||
@@ -520,7 +520,7 @@ DESCRIPTION
|
||||
download simulator/emulator builds for a given fingerprint hash
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/download.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/download.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/download.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/download.ts)_
|
||||
|
||||
## `eas build:inspect`
|
||||
|
||||
@@ -555,7 +555,7 @@ DESCRIPTION
|
||||
inspect the state of the project at specific build stages, useful for troubleshooting
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/inspect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/inspect.ts)_
|
||||
|
||||
## `eas build:list`
|
||||
|
||||
@@ -607,7 +607,7 @@ DESCRIPTION
|
||||
list all builds for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/list.ts)_
|
||||
|
||||
## `eas build:resign`
|
||||
|
||||
@@ -636,7 +636,7 @@ DESCRIPTION
|
||||
re-sign a build archive
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/resign.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/resign.ts)_
|
||||
|
||||
## `eas build:run`
|
||||
|
||||
@@ -662,7 +662,7 @@ DESCRIPTION
|
||||
run simulator/emulator builds from eas-cli
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/run.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/run.ts)_
|
||||
|
||||
## `eas build:submit`
|
||||
|
||||
@@ -716,7 +716,7 @@ DESCRIPTION
|
||||
get the latest version from EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/version/get.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/version/get.ts)_
|
||||
|
||||
## `eas build:version:set`
|
||||
|
||||
@@ -735,7 +735,7 @@ DESCRIPTION
|
||||
update version of an app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/version/set.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/version/set.ts)_
|
||||
|
||||
## `eas build:version:sync`
|
||||
|
||||
@@ -754,7 +754,7 @@ DESCRIPTION
|
||||
update a version in native code with a value stored on EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/version/sync.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/version/sync.ts)_
|
||||
|
||||
## `eas build:view [BUILD_ID]`
|
||||
|
||||
@@ -771,7 +771,7 @@ DESCRIPTION
|
||||
view a build for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/build/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/build/view.ts)_
|
||||
|
||||
## `eas channel:create [NAME]`
|
||||
|
||||
@@ -792,7 +792,7 @@ DESCRIPTION
|
||||
create a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/create.ts)_
|
||||
|
||||
## `eas channel:delete [NAME]`
|
||||
|
||||
@@ -813,7 +813,7 @@ DESCRIPTION
|
||||
Delete a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/delete.ts)_
|
||||
|
||||
## `eas channel:edit [NAME]`
|
||||
|
||||
@@ -835,7 +835,7 @@ DESCRIPTION
|
||||
point a channel at a new branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/edit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/edit.ts)_
|
||||
|
||||
## `eas channel:list`
|
||||
|
||||
@@ -855,7 +855,7 @@ DESCRIPTION
|
||||
list all channels
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/list.ts)_
|
||||
|
||||
## `eas channel:pause [NAME]`
|
||||
|
||||
@@ -877,7 +877,7 @@ DESCRIPTION
|
||||
pause a channel to stop it from sending updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/pause.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/pause.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/pause.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/pause.ts)_
|
||||
|
||||
## `eas channel:resume [NAME]`
|
||||
|
||||
@@ -899,7 +899,7 @@ DESCRIPTION
|
||||
resume a channel to start sending updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/resume.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/resume.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/resume.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/resume.ts)_
|
||||
|
||||
## `eas channel:rollout [CHANNEL]`
|
||||
|
||||
@@ -932,7 +932,7 @@ DESCRIPTION
|
||||
Roll a new branch out on a channel incrementally.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/rollout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/rollout.ts)_
|
||||
|
||||
## `eas channel:view [NAME]`
|
||||
|
||||
@@ -955,7 +955,7 @@ DESCRIPTION
|
||||
view a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/channel/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/channel/view.ts)_
|
||||
|
||||
## `eas config`
|
||||
|
||||
@@ -976,7 +976,7 @@ DESCRIPTION
|
||||
display project configuration (app.json + eas.json)
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/config.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/config.ts)_
|
||||
|
||||
## `eas credentials`
|
||||
|
||||
@@ -993,7 +993,7 @@ DESCRIPTION
|
||||
manage credentials
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/credentials/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/credentials/index.ts)_
|
||||
|
||||
## `eas credentials:configure-build`
|
||||
|
||||
@@ -1011,7 +1011,7 @@ DESCRIPTION
|
||||
Set up credentials for building your project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/credentials/configure-build.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/credentials/configure-build.ts)_
|
||||
|
||||
## `eas deploy [options]`
|
||||
|
||||
@@ -1039,7 +1039,7 @@ ALIASES
|
||||
$ eas worker:deploy
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/index.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/deploy/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/index.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/deploy/index.ts)_
|
||||
|
||||
## `eas deploy:alias`
|
||||
|
||||
@@ -1064,7 +1064,7 @@ ALIASES
|
||||
$ eas deploy:promote
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/index.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/deploy/alias/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/index.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/deploy/alias/index.ts)_
|
||||
|
||||
## `eas deploy:alias:delete [ALIAS_NAME]`
|
||||
|
||||
@@ -1085,7 +1085,7 @@ ALIASES
|
||||
$ eas worker:alias:delete
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/deploy/alias/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/deploy/alias/delete.ts)_
|
||||
|
||||
## `eas deploy:delete [DEPLOYMENT_ID]`
|
||||
|
||||
@@ -1106,7 +1106,7 @@ ALIASES
|
||||
$ eas worker:delete
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/deploy/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/deploy/delete.ts)_
|
||||
|
||||
## `eas deploy:promote`
|
||||
|
||||
@@ -1143,7 +1143,7 @@ DESCRIPTION
|
||||
register new Apple Devices to use for internal distribution
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/device/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/device/create.ts)_
|
||||
|
||||
## `eas device:delete`
|
||||
|
||||
@@ -1163,7 +1163,7 @@ DESCRIPTION
|
||||
remove a registered device from your account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/device/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/device/delete.ts)_
|
||||
|
||||
## `eas device:list`
|
||||
|
||||
@@ -1184,7 +1184,7 @@ DESCRIPTION
|
||||
list all registered devices for your account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/device/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/device/list.ts)_
|
||||
|
||||
## `eas device:rename`
|
||||
|
||||
@@ -1205,7 +1205,7 @@ DESCRIPTION
|
||||
rename a registered device
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/device/rename.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/device/rename.ts)_
|
||||
|
||||
## `eas device:view [UDID]`
|
||||
|
||||
@@ -1219,7 +1219,7 @@ DESCRIPTION
|
||||
view a device for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/device/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/device/view.ts)_
|
||||
|
||||
## `eas diagnostics`
|
||||
|
||||
@@ -1233,7 +1233,7 @@ DESCRIPTION
|
||||
display environment info
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/diagnostics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/diagnostics.ts)_
|
||||
|
||||
## `eas env:create [ENVIRONMENT]`
|
||||
|
||||
@@ -1263,7 +1263,7 @@ DESCRIPTION
|
||||
create an environment variable for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/create.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/create.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/create.ts)_
|
||||
|
||||
## `eas env:delete [ENVIRONMENT]`
|
||||
|
||||
@@ -1288,7 +1288,7 @@ DESCRIPTION
|
||||
delete an environment variable for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/delete.ts)_
|
||||
|
||||
## `eas env:exec ENVIRONMENT BASH_COMMAND`
|
||||
|
||||
@@ -1310,7 +1310,7 @@ DESCRIPTION
|
||||
execute a command with environment variables from the selected environment
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/exec.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/exec.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/exec.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/exec.ts)_
|
||||
|
||||
## `eas env:get [ENVIRONMENT]`
|
||||
|
||||
@@ -1335,7 +1335,7 @@ DESCRIPTION
|
||||
view an environment variable for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/get.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/get.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/get.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/get.ts)_
|
||||
|
||||
## `eas env:list [ENVIRONMENT]`
|
||||
|
||||
@@ -1361,7 +1361,7 @@ DESCRIPTION
|
||||
list environment variables for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/list.ts)_
|
||||
|
||||
## `eas env:pull [ENVIRONMENT]`
|
||||
|
||||
@@ -1383,7 +1383,7 @@ DESCRIPTION
|
||||
pull environment variables for the selected environment to .env file
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/pull.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/pull.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/pull.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/pull.ts)_
|
||||
|
||||
## `eas env:push [ENVIRONMENT]`
|
||||
|
||||
@@ -1405,7 +1405,7 @@ DESCRIPTION
|
||||
push environment variables from .env file to the selected environment
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/push.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/push.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/push.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/push.ts)_
|
||||
|
||||
## `eas env:update [ENVIRONMENT]`
|
||||
|
||||
@@ -1437,7 +1437,7 @@ DESCRIPTION
|
||||
update an environment variable on the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/update.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/env/update.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/update.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/env/update.ts)_
|
||||
|
||||
## `eas fingerprint:compare [HASH1] [HASH2]`
|
||||
|
||||
@@ -1481,7 +1481,7 @@ EXAMPLES
|
||||
$ eas fingerprint:compare <FINGERPRINT-HASH> --update-id <UPDATE-ID> # Compare fingerprint from update against provided fingerprint
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/compare.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/fingerprint/compare.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/compare.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/fingerprint/compare.ts)_
|
||||
|
||||
## `eas fingerprint:generate`
|
||||
|
||||
@@ -1511,7 +1511,7 @@ EXAMPLES
|
||||
$ eas fingerprint:generate --json --non-interactive --platform android # Output fingerprint json to stdout
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/generate.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/fingerprint/generate.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/generate.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/fingerprint/generate.ts)_
|
||||
|
||||
## `eas help [COMMAND]`
|
||||
|
||||
@@ -1619,7 +1619,7 @@ DESCRIPTION
|
||||
validate the local store configuration
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/metadata/lint.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/metadata/lint.ts)_
|
||||
|
||||
## `eas metadata:pull`
|
||||
|
||||
@@ -1636,7 +1636,7 @@ DESCRIPTION
|
||||
generate the local store configuration from the app stores
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/metadata/pull.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/metadata/pull.ts)_
|
||||
|
||||
## `eas metadata:push`
|
||||
|
||||
@@ -1653,7 +1653,7 @@ DESCRIPTION
|
||||
sync the local store configuration to the app stores
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/metadata/push.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/metadata/push.ts)_
|
||||
|
||||
## `eas new [PATH]`
|
||||
|
||||
@@ -1661,13 +1661,13 @@ Create a new project configured with Expo Application Services (EAS)
|
||||
|
||||
```
|
||||
USAGE
|
||||
$ eas new [PATH] [-p bun|npm|pnpm]
|
||||
$ eas new [PATH] [-p bun|npm|pnpm|yarn]
|
||||
|
||||
ARGUMENTS
|
||||
PATH Path to create the project (defaults to current directory)
|
||||
|
||||
FLAGS
|
||||
-p, --package-manager=(bun|npm|pnpm) [default: bun] Package manager to use for installing dependencies
|
||||
-p, --package-manager=(bun|npm|pnpm|yarn) [default: npm] Package manager to use for installing dependencies
|
||||
|
||||
DESCRIPTION
|
||||
Create a new project configured with Expo Application Services (EAS)
|
||||
@@ -1704,7 +1704,7 @@ DESCRIPTION
|
||||
open the project page in a web browser
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/open.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/open.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/open.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/open.ts)_
|
||||
|
||||
## `eas project:info`
|
||||
|
||||
@@ -1718,7 +1718,7 @@ DESCRIPTION
|
||||
information about the current project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/project/info.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/project/info.ts)_
|
||||
|
||||
## `eas project:init`
|
||||
|
||||
@@ -1741,7 +1741,7 @@ ALIASES
|
||||
$ eas init
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/project/init.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/project/init.ts)_
|
||||
|
||||
## `eas project:new [PATH]`
|
||||
|
||||
@@ -1749,13 +1749,13 @@ Create a new project configured with Expo Application Services (EAS)
|
||||
|
||||
```
|
||||
USAGE
|
||||
$ eas project:new [PATH] [-p bun|npm|pnpm]
|
||||
$ eas project:new [PATH] [-p bun|npm|pnpm|yarn]
|
||||
|
||||
ARGUMENTS
|
||||
PATH Path to create the project (defaults to current directory)
|
||||
|
||||
FLAGS
|
||||
-p, --package-manager=(bun|npm|pnpm) [default: bun] Package manager to use for installing dependencies
|
||||
-p, --package-manager=(bun|npm|pnpm|yarn) [default: npm] Package manager to use for installing dependencies
|
||||
|
||||
DESCRIPTION
|
||||
Create a new project configured with Expo Application Services (EAS)
|
||||
@@ -1764,7 +1764,7 @@ ALIASES
|
||||
$ eas new
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/new.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/project/new.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/new.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/project/new.ts)_
|
||||
|
||||
## `eas project:onboarding [TARGET_PROJECT_DIRECTORY]`
|
||||
|
||||
@@ -1782,7 +1782,7 @@ ALIASES
|
||||
$ eas onboarding
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/onboarding.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/project/onboarding.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/onboarding.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/project/onboarding.ts)_
|
||||
|
||||
## `eas submit`
|
||||
|
||||
@@ -1817,7 +1817,7 @@ ALIASES
|
||||
$ eas build:submit
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/submit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/submit.ts)_
|
||||
|
||||
## `eas update`
|
||||
|
||||
@@ -1857,7 +1857,7 @@ DESCRIPTION
|
||||
publish an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/index.ts)_
|
||||
|
||||
## `eas update:configure`
|
||||
|
||||
@@ -1877,7 +1877,7 @@ DESCRIPTION
|
||||
configure the project to support EAS Update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/configure.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/configure.ts)_
|
||||
|
||||
## `eas update:delete GROUPID`
|
||||
|
||||
@@ -1898,7 +1898,7 @@ DESCRIPTION
|
||||
delete all the updates in an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/delete.ts)_
|
||||
|
||||
## `eas update:edit [GROUPID]`
|
||||
|
||||
@@ -1922,7 +1922,7 @@ DESCRIPTION
|
||||
edit all the updates in an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/edit.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/edit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/edit.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/edit.ts)_
|
||||
|
||||
## `eas update:list`
|
||||
|
||||
@@ -1947,7 +1947,7 @@ DESCRIPTION
|
||||
view the recent updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/list.ts)_
|
||||
|
||||
## `eas update:republish`
|
||||
|
||||
@@ -1983,7 +1983,7 @@ DESCRIPTION
|
||||
roll back to an existing update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/republish.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/republish.ts)_
|
||||
|
||||
## `eas update:revert-update-rollout`
|
||||
|
||||
@@ -2010,7 +2010,7 @@ DESCRIPTION
|
||||
revert a rollout update for a project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/revert-update-rollout.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/revert-update-rollout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/revert-update-rollout.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/revert-update-rollout.ts)_
|
||||
|
||||
## `eas update:roll-back-to-embedded`
|
||||
|
||||
@@ -2038,7 +2038,7 @@ DESCRIPTION
|
||||
roll back to the embedded update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_
|
||||
|
||||
## `eas update:rollback`
|
||||
|
||||
@@ -2059,7 +2059,7 @@ DESCRIPTION
|
||||
instead execute "eas update:republish" or "eas update:roll-back-to-embedded".
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/rollback.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/rollback.ts)_
|
||||
|
||||
## `eas update:view GROUPID`
|
||||
|
||||
@@ -2079,7 +2079,7 @@ DESCRIPTION
|
||||
update group details
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/update/view.ts)_
|
||||
|
||||
## `eas upload`
|
||||
|
||||
@@ -2100,7 +2100,7 @@ DESCRIPTION
|
||||
upload a local build and generate a sharable link
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/upload.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/upload.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/upload.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/upload.ts)_
|
||||
|
||||
## `eas webhook:create`
|
||||
|
||||
@@ -2121,7 +2121,7 @@ DESCRIPTION
|
||||
create a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/webhook/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/webhook/create.ts)_
|
||||
|
||||
## `eas webhook:delete [ID]`
|
||||
|
||||
@@ -2141,7 +2141,7 @@ DESCRIPTION
|
||||
delete a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/webhook/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/webhook/delete.ts)_
|
||||
|
||||
## `eas webhook:list`
|
||||
|
||||
@@ -2159,7 +2159,7 @@ DESCRIPTION
|
||||
list webhooks
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/webhook/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/webhook/list.ts)_
|
||||
|
||||
## `eas webhook:update`
|
||||
|
||||
@@ -2181,7 +2181,7 @@ DESCRIPTION
|
||||
update a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/webhook/update.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/webhook/update.ts)_
|
||||
|
||||
## `eas webhook:view ID`
|
||||
|
||||
@@ -2198,7 +2198,7 @@ DESCRIPTION
|
||||
view a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/webhook/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/webhook/view.ts)_
|
||||
|
||||
## `eas whoami`
|
||||
|
||||
@@ -2318,7 +2318,7 @@ DESCRIPTION
|
||||
to cancel.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/cancel.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/cancel.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/cancel.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/cancel.ts)_
|
||||
|
||||
## `eas workflow:create [NAME]`
|
||||
|
||||
@@ -2338,7 +2338,7 @@ DESCRIPTION
|
||||
create a new workflow configuration YAML file
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/create.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/create.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/create.ts)_
|
||||
|
||||
## `eas workflow:logs [ID]`
|
||||
|
||||
@@ -2362,7 +2362,7 @@ DESCRIPTION
|
||||
If no ID is passed in, you will be prompted to select from recent workflow runs for the current project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/logs.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/logs.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/logs.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/logs.ts)_
|
||||
|
||||
## `eas workflow:run [FILE]`
|
||||
|
||||
@@ -2402,7 +2402,7 @@ FLAG DESCRIPTIONS
|
||||
Exit codes: 0 = success, 11 = failure, 12 = canceled, 13 = wait aborted.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/run.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/run.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/run.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/run.ts)_
|
||||
|
||||
## `eas workflow:runs`
|
||||
|
||||
@@ -2427,7 +2427,7 @@ DESCRIPTION
|
||||
list recent workflow runs for this project, with their IDs, statuses, and timestamps
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/runs.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/runs.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/runs.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/runs.ts)_
|
||||
|
||||
## `eas workflow:status [WORKFLOW_RUN_ID]`
|
||||
|
||||
@@ -2455,7 +2455,7 @@ FLAG DESCRIPTIONS
|
||||
Exit codes: 0 = success, 11 = failure, 12 = canceled, 13 = wait aborted.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/status.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/status.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/status.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/status.ts)_
|
||||
|
||||
## `eas workflow:validate PATH`
|
||||
|
||||
@@ -2475,7 +2475,7 @@ DESCRIPTION
|
||||
validate a workflow configuration yaml file
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/validate.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/validate.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/validate.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/validate.ts)_
|
||||
|
||||
## `eas workflow:view [ID]`
|
||||
|
||||
@@ -2497,5 +2497,5 @@ DESCRIPTION
|
||||
workflow runs for the current project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/view.ts](https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/workflow/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/view.ts](https://github.com/expo/eas-cli/blob/v17.0.0/packages/eas-cli/src/commands/workflow/view.ts)_
|
||||
<!-- commandsstop -->
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "eas-cli",
|
||||
"description": "EAS command line tool",
|
||||
"version": "16.32.0",
|
||||
"version": "17.0.0",
|
||||
"author": "Expo <[email protected]>",
|
||||
"bin": {
|
||||
"eas": "./bin/run"
|
||||
@@ -12,11 +12,11 @@
|
||||
"@expo/code-signing-certificates": "0.0.5",
|
||||
"@expo/config": "10.0.6",
|
||||
"@expo/config-plugins": "9.0.12",
|
||||
"@expo/eas-build-job": "1.0.265",
|
||||
"@expo/eas-json": "16.30.0",
|
||||
"@expo/eas-build-job": "17.0.0",
|
||||
"@expo/eas-json": "17.0.0",
|
||||
"@expo/env": "^1.0.0",
|
||||
"@expo/json-file": "8.3.3",
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/logger": "17.0.0",
|
||||
"@expo/multipart-body-parser": "2.0.0",
|
||||
"@expo/osascript": "2.1.4",
|
||||
"@expo/package-manager": "1.9.10",
|
||||
@@ -28,7 +28,7 @@
|
||||
"@expo/results": "1.0.0",
|
||||
"@expo/rudder-sdk-node": "1.1.1",
|
||||
"@expo/spawn-async": "1.7.2",
|
||||
"@expo/steps": "1.0.271",
|
||||
"@expo/steps": "17.0.0",
|
||||
"@expo/timeago.js": "1.0.0",
|
||||
"@oclif/core": "^1.26.2",
|
||||
"@oclif/plugin-autocomplete": "^2.3.10",
|
||||
@@ -61,7 +61,6 @@
|
||||
"invariant": "^2.2.2",
|
||||
"jks-js": "1.1.0",
|
||||
"joi": "17.11.0",
|
||||
"jsonwebtoken": "9.0.0",
|
||||
"keychain": "1.5.0",
|
||||
"log-symbols": "4.1.0",
|
||||
"mime": "3.0.0",
|
||||
@@ -83,7 +82,7 @@
|
||||
"semver": "7.5.4",
|
||||
"set-interval-async": "3.0.3",
|
||||
"slash": "3.0.0",
|
||||
"tar": "6.2.1",
|
||||
"tar": "7.5.7",
|
||||
"tar-stream": "3.1.7",
|
||||
"terminal-link": "2.1.1",
|
||||
"ts-deepmerge": "6.2.0",
|
||||
@@ -109,7 +108,6 @@
|
||||
"@types/fs-extra": "11.0.4",
|
||||
"@types/getenv": "^1.0.0",
|
||||
"@types/invariant": "^2.2.37",
|
||||
"@types/jsonwebtoken": "8.5.1",
|
||||
"@types/mime": "3.0.1",
|
||||
"@types/node-fetch": "2.6.12",
|
||||
"@types/node-forge": "1.3.1",
|
||||
@@ -229,20 +227,20 @@
|
||||
},
|
||||
"scripts": {
|
||||
"postpack": "rimraf oclif.manifest.json",
|
||||
"prepack": "bun run rebuild && node ./scripts/prepack.js",
|
||||
"rebuild": "rimraf build && bun run build",
|
||||
"prepack": "yarn rebuild && node ./scripts/prepack.js",
|
||||
"rebuild": "rimraf build && yarn build",
|
||||
"pretarball-ci": "./scripts/pretarball-ci.sh",
|
||||
"build": "bun run typecheck-for-build && bun run copy-new-templates",
|
||||
"build": "yarn typecheck-for-build && yarn copy-new-templates",
|
||||
"build-allow-unused": "tsc --project tsconfig.allowUnused.json",
|
||||
"watch": "bun run typecheck-for-build --watch --preserveWatchOutput",
|
||||
"watch-allow-unused": "bun run build-allow-unused --watch --preserveWatchOutput",
|
||||
"watch": "yarn typecheck-for-build --watch --preserveWatchOutput",
|
||||
"watch-allow-unused": "yarn build-allow-unused --watch --preserveWatchOutput",
|
||||
"typecheck": "tsc",
|
||||
"typecheck-for-build": "tsc --project tsconfig.build.json",
|
||||
"test": "jest",
|
||||
"version": "bunx oclif readme && node scripts/patch-readme && git add README.md",
|
||||
"version": "yarn oclif readme && node scripts/patch-readme && git add README.md",
|
||||
"generate-graphql-code": "graphql-codegen --config graphql-codegen.yml",
|
||||
"verify-graphql-code": "./scripts/verify-graphql.sh",
|
||||
"clean": "rimraf dist build tmp node_modules *.tsbuildinfo",
|
||||
"clean": "rimraf dist build tmp node_modules yarn-error.log *.tsbuildinfo",
|
||||
"copy-new-templates": "rimraf build/commandUtils/new/templates && mkdir -p build/commandUtils/new && cp -r src/commandUtils/new/templates build/commandUtils/new"
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ const path = './src/graphql/generated.ts';
|
||||
const generatedCode = await fs.readFile(path, 'utf8');
|
||||
const comment = `/**
|
||||
* This file was generated using GraphQL Codegen
|
||||
* Command: bun run generate-graphql-code
|
||||
* Command: yarn generate-graphql-code
|
||||
* Run this during development for automatic type generation when editing GraphQL documents
|
||||
* For more info and docs, visit https://graphql-code-generator.com/
|
||||
*/\n\n`;
|
||||
|
||||
@@ -2,6 +2,6 @@ const spawn = require('@expo/spawn-async');
|
||||
|
||||
(async () => {
|
||||
if (!process.env.CLI_SIZE_CHECK) {
|
||||
await spawn('bunx', ['oclif', 'manifest'], { stdio: 'inherit' });
|
||||
await spawn('yarn', ['oclif', 'manifest'], { stdio: 'inherit' });
|
||||
}
|
||||
})();
|
||||
@@ -5,8 +5,57 @@ set -eo pipefail
|
||||
EAS_CLI_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
|
||||
PACKAGE_JSON_PATH="$EAS_CLI_DIR/package.json"
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
sed -i '' "s/\\\"@expo\/eas-json\\\": \\\".*\\\"/\\\"@expo\/eas-json\\\": \\\"file:..\/..\/..\/eas-json\\\"/g" $PACKAGE_JSON_PATH
|
||||
else
|
||||
sed -i "s/\\\"@expo\/eas-json\\\": \\\".*\\\"/\\\"@expo\/eas-json\\\": \\\"file:..\/..\/..\/eas-json\\\"/g" $PACKAGE_JSON_PATH
|
||||
fi
|
||||
# Define local packages and their directory names
|
||||
# Only include packages that both exist in packages/ and are dependencies of the packages we care about
|
||||
# We start with direct dependencies of eas-cli and their own local dependencies
|
||||
PACKAGES=(
|
||||
"@expo/eas-json:eas-json"
|
||||
"@expo/eas-build-job:eas-build-job"
|
||||
"@expo/logger:logger"
|
||||
"@expo/steps:steps"
|
||||
)
|
||||
|
||||
# Function to rewrite dependencies in a package.json file
|
||||
rewrite_deps() {
|
||||
local PKG_JSON=$1
|
||||
local IS_EAS_CLI=$2
|
||||
|
||||
for package in "${PACKAGES[@]}" ; do
|
||||
KEY="${package%%:*}"
|
||||
DIR="${package##*:}"
|
||||
|
||||
# Determine the relative path. If IS_EAS_CLI we go one level deeper because oclif builds in `tmp` in current directory.
|
||||
if [[ "$IS_EAS_CLI" == "true" ]]; then
|
||||
REL_PATH="file:../../../$DIR"
|
||||
else
|
||||
REL_PATH="file:../$DIR"
|
||||
fi
|
||||
|
||||
# Replace version with relative path
|
||||
# Using # delimiter for sed to handle slashes
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
sed -i '' "s#\"$KEY\": \".*\"#\"$KEY\": \"$REL_PATH\"#g" "$PKG_JSON"
|
||||
else
|
||||
sed -i "s#\"$KEY\": \".*\"#\"$KEY\": \"$REL_PATH\"#g" "$PKG_JSON"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Update eas-cli/package.json
|
||||
echo "Updating eas-cli/package.json"
|
||||
rewrite_deps "$PACKAGE_JSON_PATH" "true"
|
||||
|
||||
# Update other relevant local packages
|
||||
# We iterate the PACKAGES list itself to find their locations and update them
|
||||
# This ensures we only touch packages that are part of the dependency graph we care about
|
||||
WORKSPACE_ROOT="$(cd "$EAS_CLI_DIR/.." && pwd)"
|
||||
|
||||
for package in "${PACKAGES[@]}" ; do
|
||||
DIR="${package##*:}"
|
||||
PKG_JSON="$WORKSPACE_ROOT/$DIR/package.json"
|
||||
|
||||
if [[ -f "$PKG_JSON" ]]; then
|
||||
echo "Updating $DIR/package.json"
|
||||
rewrite_deps "$PKG_JSON" "false"
|
||||
fi
|
||||
done
|
||||
@@ -14,20 +14,20 @@ trap cleanup EXIT
|
||||
cp graphql.schema.json graphql.schema.json.bak
|
||||
cp src/graphql/generated.ts src/graphql/generated.ts.bak
|
||||
|
||||
bun run generate-graphql-code
|
||||
yarn generate-graphql-code
|
||||
if cmp -s graphql.schema.json graphql.schema.json.bak; then
|
||||
echo "GraphQL schema is up-to-date"
|
||||
if cmp -s src/graphql/generated.ts src/graphql/generated.ts.bak; then
|
||||
echo "GraphQL generated code is up-to-date"
|
||||
exit 0
|
||||
else
|
||||
echo "GraphQL code has changed but has not been regenerated. Run `bun run generate-graphql-code` and commit the changes."
|
||||
echo "GraphQL code has changed but has not been regenerated. Run `yarn generate-graphql-code` and commit the changes."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "GraphQL schema has changed on the server."
|
||||
echo "Building eas-cli and its dependencies"
|
||||
bunx lerna run build --scope eas-cli --include-dependencies
|
||||
yarn lerna run build --scope eas-cli --include-dependencies
|
||||
# If there are no errors, then the schema is backwards compatible
|
||||
exit 0
|
||||
fi
|
||||
@@ -128,7 +128,7 @@ export async function runBuildAndSubmitAsync({
|
||||
buildIds: string[];
|
||||
buildProfiles?: ProfileData<'build'>[];
|
||||
}> {
|
||||
await vcsClient.ensureRepoExistsAsync();
|
||||
await vcsClient.ensureRepoExistsAsync({ nonInteractive: flags.nonInteractive });
|
||||
await ensureRepoIsCleanAsync(vcsClient, flags.nonInteractive);
|
||||
|
||||
await ensureProjectConfiguredAsync({
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import chalk from 'chalk';
|
||||
import fs from 'fs-extra';
|
||||
import path from 'path';
|
||||
import tar from 'tar';
|
||||
import * as tar from 'tar';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import Log, { learnMore } from '../../log';
|
||||
|
||||
@@ -17,6 +17,11 @@ export default class AccountLogin extends EasCommand {
|
||||
char: 's',
|
||||
default: false,
|
||||
}),
|
||||
browser: Flags.boolean({
|
||||
description: 'Login with your browser',
|
||||
char: 'b',
|
||||
default: false,
|
||||
}),
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
@@ -26,7 +31,7 @@ export default class AccountLogin extends EasCommand {
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
const {
|
||||
flags: { sso },
|
||||
flags: { sso, browser },
|
||||
} = await this.parse(AccountLogin);
|
||||
|
||||
const {
|
||||
@@ -51,7 +56,7 @@ export default class AccountLogin extends EasCommand {
|
||||
}
|
||||
}
|
||||
|
||||
await sessionManager.showLoginPromptAsync({ sso });
|
||||
await sessionManager.showLoginPromptAsync({ sso, browser });
|
||||
Log.log('Logged in');
|
||||
}
|
||||
}
|
||||
@@ -46,9 +46,7 @@ export default class BuildConfigure extends EasCommand {
|
||||
'💡 The following process will configure your iOS and/or Android project to be compatible with EAS Build. These changes only apply to your local project files and you can safely revert them at any time.'
|
||||
);
|
||||
|
||||
// BuildConfigure.ContextOptions.Vcs.client.getValueAsync()
|
||||
|
||||
await vcsClient.ensureRepoExistsAsync();
|
||||
await vcsClient.ensureRepoExistsAsync({ nonInteractive: false });
|
||||
|
||||
const expoUpdatesIsInstalled = isExpoUpdatesInstalled(projectDir);
|
||||
|
||||
|
||||
@@ -74,8 +74,8 @@ export default class BuildDev extends EasCommand {
|
||||
Errors.error('Running iOS builds in simulator is only supported on macOS.', { exit: 1 });
|
||||
}
|
||||
|
||||
await vcsClient.ensureRepoExistsAsync();
|
||||
await ensureRepoIsCleanAsync(vcsClient, flags.nonInteractive);
|
||||
await vcsClient.ensureRepoExistsAsync({ nonInteractive: false });
|
||||
await ensureRepoIsCleanAsync(vcsClient, false);
|
||||
await ensureProjectConfiguredAsync({
|
||||
projectDir,
|
||||
nonInteractive: false,
|
||||
|
||||
@@ -94,7 +94,7 @@ export default class BuildInspect extends EasCommand {
|
||||
await this.prepareOutputDirAsync(outputDirectory, flags.force);
|
||||
|
||||
if (flags.stage === InspectStage.ARCHIVE) {
|
||||
await vcsClient.ensureRepoExistsAsync();
|
||||
await vcsClient.ensureRepoExistsAsync({ nonInteractive: false });
|
||||
await vcsClient.makeShallowCopyAsync(tmpWorkingdir);
|
||||
await this.copyToOutputDirAsync(tmpWorkingdir, outputDirectory);
|
||||
} else {
|
||||
|
||||
@@ -1,287 +0,0 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import fs from 'fs-extra';
|
||||
import jwt from 'jsonwebtoken';
|
||||
import fetch from 'node-fetch';
|
||||
import path from 'path';
|
||||
import { setTimeout } from 'timers/promises';
|
||||
import { z } from 'zod';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import Log from '../../log';
|
||||
import { AscApiClient, AscApiClientPostApi } from '../../submit/ios/AscApiClient';
|
||||
|
||||
export default class SubmitUploadToAsc extends EasCommand {
|
||||
static override hidden = true;
|
||||
|
||||
static override flags = {
|
||||
path: Flags.string({
|
||||
description: 'Path to the IPA file',
|
||||
required: true,
|
||||
}),
|
||||
key: Flags.string({
|
||||
description: 'Path to the ASC API Key JSON file',
|
||||
required: true,
|
||||
}),
|
||||
'app-id': Flags.string({
|
||||
description: 'App Store Connect App ID (e.g. 1491144534)',
|
||||
required: true,
|
||||
}),
|
||||
'bundle-version': Flags.string({
|
||||
description: 'CFBundleVersion (Build Version, e.g. 13)',
|
||||
required: true,
|
||||
}),
|
||||
'bundle-short-version': Flags.string({
|
||||
description: 'CFBundleShortVersionString (Marketing Version, e.g. 1.0.0)',
|
||||
required: true,
|
||||
}),
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
const { flags } = await this.parse(SubmitUploadToAsc);
|
||||
|
||||
const ipaPath = path.resolve(flags.path);
|
||||
if (!(await fs.pathExists(ipaPath))) {
|
||||
throw new Error(`IPA file not found: ${ipaPath}`);
|
||||
}
|
||||
const fileSize = (await fs.stat(ipaPath)).size;
|
||||
const fileName = path.basename(ipaPath);
|
||||
|
||||
const keyPath = path.resolve(flags.key);
|
||||
if (!(await fs.pathExists(keyPath))) {
|
||||
throw new Error(`Key file not found: ${keyPath}`);
|
||||
}
|
||||
|
||||
const keyJson = await fs.readJson(keyPath);
|
||||
const apiKey = z
|
||||
.object({
|
||||
issuer_id: z.string(),
|
||||
key_id: z.string(),
|
||||
key: z.string(),
|
||||
})
|
||||
.parse(keyJson);
|
||||
|
||||
Log.log('Generating JWT...');
|
||||
const token = jwt.sign({}, apiKey.key, {
|
||||
algorithm: 'ES256',
|
||||
issuer: apiKey.issuer_id,
|
||||
expiresIn: '20m',
|
||||
audience: 'appstoreconnect-v1',
|
||||
header: {
|
||||
kid: apiKey.key_id,
|
||||
},
|
||||
});
|
||||
|
||||
const client = new AscApiClient({ token });
|
||||
|
||||
Log.log('Reading App information...');
|
||||
const appResponse = await client.getAsync(
|
||||
'/v1/apps/:id',
|
||||
{ 'fields[apps]': ['bundleId', 'name'] as const },
|
||||
{ id: flags['app-id'] }
|
||||
);
|
||||
Log.log(
|
||||
`Uploading Build to "${appResponse.data.attributes.name}" (${appResponse.data.attributes.bundleId})...`
|
||||
);
|
||||
|
||||
Log.log('Creating Build Upload...');
|
||||
const buildUploadResponse = await client.postAsync('/v1/buildUploads', {
|
||||
data: {
|
||||
type: 'buildUploads',
|
||||
attributes: {
|
||||
platform: 'IOS',
|
||||
cfBundleShortVersionString: flags['bundle-short-version'],
|
||||
cfBundleVersion: flags['bundle-version'],
|
||||
},
|
||||
relationships: {
|
||||
app: {
|
||||
data: {
|
||||
type: 'apps',
|
||||
id: flags['app-id'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const buildUploadId = buildUploadResponse.data.id;
|
||||
|
||||
Log.log(`Build Upload initialized (ID: ${buildUploadId}). Preparing IPA upload...`);
|
||||
const buildFileResponse = await client.postAsync('/v1/buildUploadFiles', {
|
||||
data: {
|
||||
type: 'buildUploadFiles',
|
||||
attributes: {
|
||||
assetType: 'ASSET',
|
||||
fileName,
|
||||
fileSize,
|
||||
uti: 'com.apple.ipa',
|
||||
},
|
||||
relationships: {
|
||||
buildUpload: {
|
||||
data: {
|
||||
type: 'buildUploads',
|
||||
id: buildUploadId,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
Log.log(`IPA Upload initialized (ID: ${buildFileResponse.data.id}). Uploading IPA...`);
|
||||
await uploadChunksAsync({
|
||||
uploadOperations: buildFileResponse.data.attributes.uploadOperations,
|
||||
ipaPath,
|
||||
});
|
||||
|
||||
Log.log('Committing upload...');
|
||||
await client.patchAsync(
|
||||
`/v1/buildUploadFiles/:id`,
|
||||
{
|
||||
data: {
|
||||
type: 'buildUploadFiles',
|
||||
id: buildFileResponse.data.id,
|
||||
attributes: {
|
||||
uploaded: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
id: buildFileResponse.data.id,
|
||||
}
|
||||
);
|
||||
|
||||
Log.log('Checking upload file status...');
|
||||
const waitingForFileStartedAt = performance.now();
|
||||
while (performance.now() - waitingForFileStartedAt < 60 * 1000 /* 60 seconds */) {
|
||||
const buildFileStatusResponse = await client.getAsync(
|
||||
`/v1/buildUploadFiles/:id`,
|
||||
{ 'fields[buildUploadFiles]': ['assetDeliveryState'] },
|
||||
{ id: buildFileResponse.data.id }
|
||||
);
|
||||
|
||||
if (buildFileStatusResponse.data.attributes.assetDeliveryState.state === 'AWAITING_UPLOAD') {
|
||||
Log.log(
|
||||
`Waiting for file upload to finish processing... (state = ${buildFileStatusResponse.data.attributes.assetDeliveryState.state})`
|
||||
);
|
||||
await setTimeout(2000);
|
||||
continue;
|
||||
}
|
||||
|
||||
const { errors = [], warnings = [] } =
|
||||
buildFileStatusResponse.data.attributes.assetDeliveryState;
|
||||
if (warnings.length > 0) {
|
||||
Log.warn(
|
||||
`Warnings:\n- ${warnings.map(w => `${w.description} (${w.code})`).join('\n- ')}\n`
|
||||
);
|
||||
}
|
||||
if (errors.length > 0) {
|
||||
Log.error(`Errors:\n- ${errors.map(e => `${e.description} (${e.code})`).join('\n- ')}\n`);
|
||||
}
|
||||
|
||||
if (buildFileStatusResponse.data.attributes.assetDeliveryState.state === 'FAILED') {
|
||||
throw new Error(`File upload (ID: ${buildFileResponse.data.id}) failed.`);
|
||||
} else if (buildFileStatusResponse.data.attributes.assetDeliveryState.state === 'COMPLETE') {
|
||||
Log.log(`File upload (ID: ${buildFileResponse.data.id}) complete!`);
|
||||
} else if (
|
||||
buildFileStatusResponse.data.attributes.assetDeliveryState.state === 'UPLOAD_COMPLETE'
|
||||
) {
|
||||
Log.log(`File upload (ID: ${buildFileResponse.data.id}) finished!`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Log.log('Checking build upload status...');
|
||||
const waitingForBuildStartedAt = performance.now();
|
||||
while (performance.now() - waitingForBuildStartedAt < 60 * 1000 /* 60 seconds */) {
|
||||
const buildUploadStatusResponse = await client.getAsync(
|
||||
`/v1/buildUploads/:id`,
|
||||
{ 'fields[buildUploads]': ['state', 'build'], include: ['build'] },
|
||||
{ id: buildUploadId }
|
||||
);
|
||||
|
||||
if (
|
||||
buildUploadStatusResponse.data.attributes.state.state === 'AWAITING_UPLOAD' ||
|
||||
buildUploadStatusResponse.data.attributes.state.state === 'PROCESSING'
|
||||
) {
|
||||
Log.log(
|
||||
`Waiting for build upload to finish... (status = ${buildUploadStatusResponse.data.attributes.state.state})`
|
||||
);
|
||||
await setTimeout(2000);
|
||||
continue;
|
||||
}
|
||||
|
||||
Log.log('\n');
|
||||
|
||||
const {
|
||||
errors = [],
|
||||
warnings = [],
|
||||
infos = [],
|
||||
} = buildUploadStatusResponse.data.attributes.state;
|
||||
if (infos.length > 0) {
|
||||
Log.log(`Infos:\n- ${infos.map(i => `${i.description} (${i.code})`).join('\n- ')}\n`);
|
||||
}
|
||||
if (warnings.length > 0) {
|
||||
Log.warn(
|
||||
`Warnings:\n- ${warnings.map(w => `${w.description} (${w.code})`).join('\n- ')}\n`
|
||||
);
|
||||
}
|
||||
if (errors.length > 0) {
|
||||
Log.error(`Errors:\n- ${errors.map(e => `${e.description} (${e.code})`).join('\n- ')}\n`);
|
||||
}
|
||||
|
||||
if (buildUploadStatusResponse.data.attributes.state.state === 'FAILED') {
|
||||
throw new Error(`Build upload (ID: ${buildUploadId}) failed.`);
|
||||
} else if (buildUploadStatusResponse.data.attributes.state.state === 'COMPLETE') {
|
||||
Log.log(`Build upload (ID: ${buildUploadId}) complete!`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function uploadChunksAsync({
|
||||
uploadOperations,
|
||||
ipaPath,
|
||||
}: {
|
||||
uploadOperations: AscApiClientPostApi['/v1/buildUploadFiles']['response']['data']['attributes']['uploadOperations'];
|
||||
ipaPath: string;
|
||||
}): Promise<void> {
|
||||
const fd = await fs.open(ipaPath, 'r');
|
||||
try {
|
||||
const promises = uploadOperations.map(async (op, index) => {
|
||||
Log.log(
|
||||
` Uploading chunk ${index + 1}/${uploadOperations.length} (offset: ${op.offset}, length: ${
|
||||
op.length
|
||||
})...`
|
||||
);
|
||||
|
||||
const buffer = new Uint8Array(op.length);
|
||||
await fs.read(fd, buffer, 0, op.length, op.offset);
|
||||
|
||||
const headers: Record<string, string> = {
|
||||
'Content-Type': 'application/octet-stream',
|
||||
};
|
||||
|
||||
for (const { name, value } of op.requestHeaders) {
|
||||
headers[name] = value;
|
||||
}
|
||||
|
||||
const response = await fetch(op.url, {
|
||||
method: op.method,
|
||||
headers,
|
||||
body: buffer,
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text();
|
||||
throw new Error(
|
||||
`Failed to upload chunk ${index + 1}: ${response.status} ${response.statusText}\n${text}`
|
||||
);
|
||||
}
|
||||
Log.log(` Chunk ${index + 1}/${uploadOperations.length} uploaded.`);
|
||||
});
|
||||
|
||||
await Promise.all(promises);
|
||||
} finally {
|
||||
await fs.close(fd);
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,7 @@ export default class UpdateConfigure extends EasCommand {
|
||||
'💡 The following process will configure your project to use EAS Update. These changes only apply to your local project files and you can safely revert them at any time.'
|
||||
);
|
||||
|
||||
await vcsClient.ensureRepoExistsAsync();
|
||||
await vcsClient.ensureRepoExistsAsync({ nonInteractive: flags['non-interactive'] });
|
||||
|
||||
const easJsonAccessor = EasJsonAccessor.fromProjectPath(projectDir);
|
||||
const easJsonCliConfig: EasJson['cli'] =
|
||||
|
||||
@@ -240,7 +240,7 @@ export default class UpdatePublish extends EasCommand {
|
||||
enableJsonOutput();
|
||||
}
|
||||
|
||||
await vcsClient.ensureRepoExistsAsync();
|
||||
await vcsClient.ensureRepoExistsAsync({ nonInteractive });
|
||||
await ensureRepoIsCleanAsync(vcsClient, nonInteractive);
|
||||
|
||||
const {
|
||||
|
||||
@@ -5,7 +5,7 @@ import fg from 'fast-glob';
|
||||
import fs from 'fs-extra';
|
||||
import StreamZip from 'node-stream-zip';
|
||||
import path from 'path';
|
||||
import tar from 'tar';
|
||||
import * as tar from 'tar';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { getBuildLogsUrl } from '../build/utils/url';
|
||||
|
||||
+1178
-8184
File diff suppressed because it is too large.
Load diff
@@ -69,7 +69,7 @@ function importMetroConfigFromProject(projectDir: string): typeof MetroConfig {
|
||||
'Missing package "metro-config" in the project. ' +
|
||||
'This usually means `react-native` is not installed. ' +
|
||||
'Verify that dependencies in package.json include "react-native" ' +
|
||||
'and run `bun install` or `npm install`.'
|
||||
'and run `yarn` or `npm install`.'
|
||||
);
|
||||
}
|
||||
return require(resolvedPath);
|
||||
|
||||
@@ -4,8 +4,8 @@ import assert from 'assert';
|
||||
import chalk from 'chalk';
|
||||
import nullthrows from 'nullthrows';
|
||||
|
||||
import { fetchSessionSecretAndSsoUserAsync } from './fetchSessionSecretAndSsoUser';
|
||||
import { fetchSessionSecretAndUserAsync } from './fetchSessionSecretAndUser';
|
||||
import { fetchSessionSecretAndUserFromBrowserAuthFlowAsync } from './fetchSessionSecretAndUserFromBrowserAuthFlow';
|
||||
import { ApiV2Error } from '../ApiV2Error';
|
||||
import { AnalyticsWithOrchestration } from '../analytics/AnalyticsManager';
|
||||
import { ApiV2Client } from '../api';
|
||||
@@ -149,6 +149,7 @@ export default class SessionManager {
|
||||
nonInteractive = false,
|
||||
printNewLine = false,
|
||||
sso = false,
|
||||
browser = false,
|
||||
} = {}): Promise<void> {
|
||||
if (nonInteractive) {
|
||||
Errors.error(
|
||||
@@ -164,8 +165,8 @@ export default class SessionManager {
|
||||
Log.newLine();
|
||||
}
|
||||
|
||||
if (sso) {
|
||||
await this.ssoLoginAsync();
|
||||
if (sso || browser) {
|
||||
await this.browserLoginAsync({ sso });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -205,8 +206,10 @@ export default class SessionManager {
|
||||
}
|
||||
}
|
||||
|
||||
private async ssoLoginAsync(): Promise<void> {
|
||||
const { sessionSecret, id, username } = await fetchSessionSecretAndSsoUserAsync();
|
||||
private async browserLoginAsync({ sso = false }): Promise<void> {
|
||||
const { sessionSecret, id, username } = await fetchSessionSecretAndUserFromBrowserAuthFlowAsync(
|
||||
{ sso }
|
||||
);
|
||||
await this.setSessionAsync({
|
||||
sessionSecret,
|
||||
userId: id,
|
||||
|
||||
@@ -9,8 +9,8 @@ import Log from '../../log';
|
||||
import { promptAsync, selectAsync } from '../../prompts';
|
||||
import { getStateJsonPath } from '../../utils/paths';
|
||||
import SessionManager, { UserSecondFactorDeviceMethod } from '../SessionManager';
|
||||
import { fetchSessionSecretAndSsoUserAsync } from '../fetchSessionSecretAndSsoUser';
|
||||
import { fetchSessionSecretAndUserAsync } from '../fetchSessionSecretAndUser';
|
||||
import { fetchSessionSecretAndUserFromBrowserAuthFlowAsync } from '../fetchSessionSecretAndUserFromBrowserAuthFlow';
|
||||
|
||||
jest.mock('../../prompts');
|
||||
jest.mock('../../log');
|
||||
@@ -25,7 +25,7 @@ jest.mock('../../graphql/queries/UserQuery', () => ({
|
||||
},
|
||||
}));
|
||||
jest.mock('../fetchSessionSecretAndUser');
|
||||
jest.mock('../fetchSessionSecretAndSsoUser');
|
||||
jest.mock('../fetchSessionSecretAndUserFromBrowserAuthFlow');
|
||||
jest.mock('../../api');
|
||||
|
||||
const authStub: any = {
|
||||
@@ -156,15 +156,15 @@ describe(SessionManager, () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('ssoLoginAsync', () => {
|
||||
it('saves user data to ~/.expo/state.json', async () => {
|
||||
jest.mocked(fetchSessionSecretAndSsoUserAsync).mockResolvedValue({
|
||||
describe('browserLoginAsync', () => {
|
||||
it('saves user data to ~/.expo/state.json with sso', async () => {
|
||||
jest.mocked(fetchSessionSecretAndUserFromBrowserAuthFlowAsync).mockResolvedValue({
|
||||
sessionSecret: 'SESSION_SECRET',
|
||||
id: 'USER_ID',
|
||||
username: 'USERNAME',
|
||||
});
|
||||
const sessionManager = new SessionManager(analytics);
|
||||
await sessionManager['ssoLoginAsync']();
|
||||
await sessionManager['browserLoginAsync']({ sso: true });
|
||||
expect(await fs.readFile(getStateJsonPath(), 'utf8')).toMatchInlineSnapshot(`
|
||||
"{
|
||||
"auth": {
|
||||
@@ -176,6 +176,31 @@ describe(SessionManager, () => {
|
||||
}
|
||||
"
|
||||
`);
|
||||
expect(fetchSessionSecretAndUserFromBrowserAuthFlowAsync).toHaveBeenCalledWith({ sso: true });
|
||||
});
|
||||
|
||||
it('saves user data to ~/.expo/state.json without sso', async () => {
|
||||
jest.mocked(fetchSessionSecretAndUserFromBrowserAuthFlowAsync).mockResolvedValue({
|
||||
sessionSecret: 'SESSION_SECRET',
|
||||
id: 'USER_ID',
|
||||
username: 'USERNAME',
|
||||
});
|
||||
const sessionManager = new SessionManager(analytics);
|
||||
await sessionManager['browserLoginAsync']({ sso: false });
|
||||
expect(await fs.readFile(getStateJsonPath(), 'utf8')).toMatchInlineSnapshot(`
|
||||
"{
|
||||
"auth": {
|
||||
"sessionSecret": "SESSION_SECRET",
|
||||
"userId": "USER_ID",
|
||||
"username": "USERNAME",
|
||||
"currentConnection": "Browser-Flow-Authentication"
|
||||
}
|
||||
}
|
||||
"
|
||||
`);
|
||||
expect(fetchSessionSecretAndUserFromBrowserAuthFlowAsync).toHaveBeenCalledWith({
|
||||
sso: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -292,7 +317,18 @@ describe(SessionManager, () => {
|
||||
// SSO login
|
||||
await sessionManager.showLoginPromptAsync({ sso: true });
|
||||
expect(promptAsync).not.toHaveBeenCalled();
|
||||
expect(fetchSessionSecretAndSsoUserAsync).toHaveBeenCalled();
|
||||
expect(fetchSessionSecretAndUserFromBrowserAuthFlowAsync).toHaveBeenCalledWith({ sso: true });
|
||||
});
|
||||
|
||||
it('calls browser login if the browser flag is true', async () => {
|
||||
const sessionManager = new SessionManager(analytics);
|
||||
|
||||
// Browser login (not SSO)
|
||||
await sessionManager.showLoginPromptAsync({ browser: true });
|
||||
expect(promptAsync).not.toHaveBeenCalled();
|
||||
expect(fetchSessionSecretAndUserFromBrowserAuthFlowAsync).toHaveBeenCalledWith({
|
||||
sso: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
+23
-51
@@ -4,53 +4,22 @@ import http from 'http';
|
||||
import { Socket } from 'node:net';
|
||||
import querystring from 'querystring';
|
||||
|
||||
import { getExpoWebsiteBaseUrl } from '../api';
|
||||
import Log from '../log';
|
||||
|
||||
const successBody = `
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Expo SSO Login</title>
|
||||
<meta charset="utf-8">
|
||||
<style type="text/css">
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #fff;
|
||||
font-family: Tahoma,Verdana;
|
||||
font-size: 16px;
|
||||
color: #000;
|
||||
max-width: 100%;
|
||||
box-sizing: border-box;
|
||||
padding: .5rem;
|
||||
margin: 1em;
|
||||
overflow-wrap: break-word
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
SSO login complete. You may now close this tab and return to the command prompt.
|
||||
</body>
|
||||
</html>`;
|
||||
|
||||
export async function getSessionUsingBrowserAuthFlowAsync({
|
||||
expoWebsiteUrl,
|
||||
}: {
|
||||
expoWebsiteUrl: string;
|
||||
}): Promise<string> {
|
||||
export async function getSessionUsingBrowserAuthFlowAsync({ sso = false }): Promise<string> {
|
||||
const scheme = 'http';
|
||||
const hostname = 'localhost';
|
||||
const path = '/auth/callback';
|
||||
|
||||
const buildExpoSsoLoginUrl = (port: number): string => {
|
||||
const data = {
|
||||
const expoWebsiteUrl = getExpoWebsiteBaseUrl();
|
||||
|
||||
const buildExpoLoginUrl = (port: number, sso: boolean): string => {
|
||||
const params = querystring.stringify({
|
||||
confirm_account: true,
|
||||
app_redirect_uri: `${scheme}://${hostname}:${port}${path}`,
|
||||
};
|
||||
const params = querystring.stringify(data);
|
||||
return `${expoWebsiteUrl}/sso-login?${params}`;
|
||||
});
|
||||
return `${expoWebsiteUrl}${sso ? '/sso-login' : '/login'}?${params}`;
|
||||
};
|
||||
|
||||
// Start server and begin auth flow
|
||||
@@ -60,9 +29,19 @@ export async function getSessionUsingBrowserAuthFlowAsync({
|
||||
|
||||
const server = http.createServer(
|
||||
(request: http.IncomingMessage, response: http.ServerResponse) => {
|
||||
const redirectAndCleanup = (result: 'success' | 'error'): void => {
|
||||
const redirectUrl = `${expoWebsiteUrl}/oauth/expo-cli?result=${result}`;
|
||||
response.writeHead(302, { Location: redirectUrl });
|
||||
response.end();
|
||||
server.close();
|
||||
for (const connection of connections) {
|
||||
connection.destroy();
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
if (!(request.method === 'GET' && request.url?.includes('/auth/callback'))) {
|
||||
throw new Error('Unexpected SSO login response.');
|
||||
throw new Error('Unexpected login response.');
|
||||
}
|
||||
const url = new URL(request.url, `http:${request.headers.host}`);
|
||||
const sessionSecret = url.searchParams.get('session_secret');
|
||||
@@ -71,17 +50,10 @@ export async function getSessionUsingBrowserAuthFlowAsync({
|
||||
throw new Error('Request missing session_secret search parameter.');
|
||||
}
|
||||
resolve(sessionSecret);
|
||||
response.writeHead(200, { 'Content-Type': 'text/html' });
|
||||
response.write(successBody);
|
||||
response.end();
|
||||
redirectAndCleanup('success');
|
||||
} catch (error) {
|
||||
redirectAndCleanup('error');
|
||||
reject(error);
|
||||
} finally {
|
||||
server.close();
|
||||
// Ensure that the server shuts down
|
||||
for (const connection of connections) {
|
||||
connection.destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -95,7 +67,7 @@ export async function getSessionUsingBrowserAuthFlowAsync({
|
||||
'Server address and port should be set after listening has begun'
|
||||
);
|
||||
const port = address.port;
|
||||
const authorizeUrl = buildExpoSsoLoginUrl(port);
|
||||
const authorizeUrl = buildExpoLoginUrl(port, sso);
|
||||
Log.log(
|
||||
`If your browser doesn't automatically open, visit this link to log in: ${authorizeUrl}`
|
||||
);
|
||||
+3
-6
@@ -1,15 +1,12 @@
|
||||
import { getSessionUsingBrowserAuthFlowAsync } from './expoSsoLauncher';
|
||||
import { getSessionUsingBrowserAuthFlowAsync } from './expoBrowserAuthFlowLauncher';
|
||||
import { fetchUserAsync } from './fetchUser';
|
||||
import { getExpoWebsiteBaseUrl } from '../api';
|
||||
|
||||
export async function fetchSessionSecretAndSsoUserAsync(): Promise<{
|
||||
export async function fetchSessionSecretAndUserFromBrowserAuthFlowAsync({ sso = false }): Promise<{
|
||||
sessionSecret: string;
|
||||
id: string;
|
||||
username: string;
|
||||
}> {
|
||||
const sessionSecret = await getSessionUsingBrowserAuthFlowAsync({
|
||||
expoWebsiteUrl: getExpoWebsiteBaseUrl(),
|
||||
});
|
||||
const sessionSecret = await getSessionUsingBrowserAuthFlowAsync({ sso });
|
||||
|
||||
const userData = await fetchUserAsync({ sessionSecret });
|
||||
|
||||
@@ -31,7 +31,11 @@ export default class GitClient extends Client {
|
||||
this.requireCommit = options.requireCommit;
|
||||
}
|
||||
|
||||
public override async ensureRepoExistsAsync(): Promise<void> {
|
||||
public override async ensureRepoExistsAsync(options?: {
|
||||
nonInteractive?: boolean;
|
||||
}): Promise<void> {
|
||||
const nonInteractive = options?.nonInteractive ?? false;
|
||||
|
||||
try {
|
||||
if (!(await isGitInstalledAsync())) {
|
||||
Log.error(
|
||||
@@ -66,11 +70,26 @@ export default class GitClient extends Client {
|
||||
return;
|
||||
}
|
||||
|
||||
const cwd = process.cwd();
|
||||
const repoRoot = PackageManagerUtils.resolveWorkspaceRoot(cwd) ?? cwd;
|
||||
|
||||
if (nonInteractive) {
|
||||
Log.log(
|
||||
`No git repository found. Auto initializing in ${this.maybeCwdOverride ?? repoRoot}. ` +
|
||||
`Set ${chalk.bold('EAS_NO_VCS=1')} to skip.`
|
||||
);
|
||||
await spawnAsync('git', ['init'], { cwd: this.maybeCwdOverride ?? repoRoot });
|
||||
await this.commitAsync({
|
||||
commitAllFiles: true,
|
||||
commitMessage: 'Initial commit',
|
||||
nonInteractive: true,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
Log.warn("It looks like you haven't initialized the git repository yet.");
|
||||
Log.warn('EAS requires you to use a git repository for your project.');
|
||||
|
||||
const cwd = process.cwd();
|
||||
const repoRoot = PackageManagerUtils.resolveWorkspaceRoot(cwd) ?? cwd;
|
||||
const confirmInit = await confirmAsync({
|
||||
message: `Would you like us to run 'git init' in ${
|
||||
this.maybeCwdOverride ?? repoRoot
|
||||
@@ -419,16 +438,22 @@ export default class GitClient extends Client {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.warn(
|
||||
`You need to configure Git with your ${[
|
||||
!usernameConfigured && 'username (user.name)',
|
||||
!emailConfigured && 'email address (user.email)',
|
||||
const missingConfig = [
|
||||
!usernameConfigured && 'username (user.name)',
|
||||
!emailConfigured && 'email address (user.email)',
|
||||
].filter(i => i);
|
||||
|
||||
Log.warn(`You need to configure Git with your ${missingConfig.join(' and ')}`);
|
||||
if (nonInteractive) {
|
||||
const configCommands = [
|
||||
!usernameConfigured && 'git config --global user.name "Your Name"',
|
||||
!emailConfigured && 'git config --global user.email "[email protected]"',
|
||||
]
|
||||
.filter(i => i)
|
||||
.join(' and ')}`
|
||||
);
|
||||
if (nonInteractive) {
|
||||
throw new Error('Git cannot be configured automatically in non-interactive mode');
|
||||
.join(' && ');
|
||||
throw new Error(
|
||||
`Git ${missingConfig.join(' and ')} must be configured. Run: ${configCommands}`
|
||||
);
|
||||
}
|
||||
if (!usernameConfigured) {
|
||||
const { username } = await promptAsync({
|
||||
|
||||
@@ -14,7 +14,7 @@ export abstract class Client {
|
||||
|
||||
// (optional) ensureRepoExistsAsync should verify whether repository exists and tooling is installed
|
||||
// it's not required for minimal support, but lack of validation might cause the failure at a later stage.
|
||||
public async ensureRepoExistsAsync(): Promise<void> {}
|
||||
public async ensureRepoExistsAsync(_options?: { nonInteractive?: boolean }): Promise<void> {}
|
||||
|
||||
// (optional) checks whether commit is necessary before calling makeShallowCopyAsync
|
||||
//
|
||||
|
||||
@@ -14,10 +14,10 @@ A library for parsing and validating `eas.json` configuration files. Published a
|
||||
## Development Commands
|
||||
|
||||
```bash
|
||||
bun run build # TypeScript compilation (src → build)
|
||||
bun run watch # Watch mode
|
||||
bun run typecheck # Type check
|
||||
bun run test # Run tests
|
||||
yarn build # TypeScript compilation (src → build)
|
||||
yarn watch # Watch mode
|
||||
yarn typecheck # Type check
|
||||
yarn test # Run tests
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@expo/eas-json",
|
||||
"description": "A library for interacting with eas.json",
|
||||
"version": "16.30.0",
|
||||
"version": "17.0.0",
|
||||
"author": "Expo <[email protected]>",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "7.23.5",
|
||||
"@expo/eas-build-job": "1.0.265",
|
||||
"@expo/eas-build-job": "17.0.0",
|
||||
"chalk": "4.1.2",
|
||||
"env-string": "1.0.1",
|
||||
"fs-extra": "11.2.0",
|
||||
@@ -40,13 +40,13 @@
|
||||
"scripts": {
|
||||
"build": "tsc --project tsconfig.build.json",
|
||||
"build-allow-unused": "tsc --project tsconfig.allowUnused.json",
|
||||
"watch": "bun run build --watch --preserveWatchOutput",
|
||||
"watch-allow-unused": "bun run build-allow-unused --watch --preserveWatchOutput",
|
||||
"watch": "yarn build --watch --preserveWatchOutput",
|
||||
"watch-allow-unused": "yarn build-allow-unused --watch --preserveWatchOutput",
|
||||
"typecheck": "tsc",
|
||||
"prepack": "bun run rebuild",
|
||||
"rebuild": "rimraf build && bun run build",
|
||||
"prepack": "yarn rebuild",
|
||||
"rebuild": "rimraf build && yarn build",
|
||||
"test": "jest",
|
||||
"clean": "rimraf build node_modules *.tsbuildinfo"
|
||||
"clean": "rimraf build node_modules yarn-error.log *.tsbuildinfo"
|
||||
},
|
||||
"files": [
|
||||
"/build"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/local-build-plugin"
|
||||
},
|
||||
"version": "1.0.272",
|
||||
"version": "17.0.0",
|
||||
"description": "Tool for running EAS compatible builds on a local machine.",
|
||||
"main": "dist/main.js",
|
||||
"files": [
|
||||
@@ -16,7 +16,7 @@
|
||||
"eas-cli-local-build-plugin": "./bin/run"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
@@ -31,11 +31,11 @@
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"license": "BUSL-1.1",
|
||||
"dependencies": {
|
||||
"@expo/build-tools": "1.0.272",
|
||||
"@expo/eas-build-job": "1.0.265",
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/build-tools": "17.0.0",
|
||||
"@expo/eas-build-job": "17.0.0",
|
||||
"@expo/logger": "17.0.0",
|
||||
"@expo/spawn-async": "^1.7.2",
|
||||
"@expo/turtle-spawn": "1.0.260",
|
||||
"@expo/turtle-spawn": "17.0.0",
|
||||
"bunyan": "^1.8.15",
|
||||
"chalk": "4.1.2",
|
||||
"env-paths": "^2.2.1",
|
||||
@@ -44,7 +44,7 @@
|
||||
"lodash": "^4.17.21",
|
||||
"nullthrows": "^1.1.1",
|
||||
"semver": "^7.6.2",
|
||||
"tar": "^7.2.0",
|
||||
"tar": "7.5.7",
|
||||
"uuid": "^9.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/logger"
|
||||
},
|
||||
"version": "1.0.260",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
|
||||
@@ -6,7 +6,7 @@ TBD
|
||||
|
||||
If you want to run config examples from the **examples** directory, e.g. **examples/simple**, follow the steps:
|
||||
|
||||
- Run `bun install` and `bun run build` in the root of the monorepo.
|
||||
- Run `yarn` and `yarn build` in the root of the monorepo.
|
||||
- Add `alias eas-steps="/REPLACE/WITH/PATH/TO/eas-cli/packages/steps/cli.sh"` to your **.zshrc**/**.bashrc**/etc.
|
||||
- cd into **examples/simple** and run `eas-steps config.yml project [darwin|linux]`. The first argument is the config file, and the second is the default working directory for the config file. The third argument is the platform for which you want to simulate running a custom build, it defaults to the platform of the device on which the CLI is currently being run.
|
||||
|
||||
|
||||
@@ -4,4 +4,4 @@ set -eo pipefail
|
||||
|
||||
STEPS_ROOT_DIR=$( dirname "${BASH_SOURCE[0]}" )
|
||||
|
||||
node $STEPS_ROOT_DIR/dist/cli/cli.js $@ | bunx bunyan -o short
|
||||
node $STEPS_ROOT_DIR/dist/cli/cli.js $@ | yarn run bunyan -o short
|
||||
@@ -5,7 +5,7 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/steps"
|
||||
},
|
||||
"version": "1.0.271",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
@@ -13,14 +13,14 @@
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"build": "tsc --project tsconfig.build.json",
|
||||
"typecheck": "tsc",
|
||||
"prepack": "rm -rf dist && tsc --project tsconfig.build.json",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"test": "jest --config jest.config.ts",
|
||||
"test:coverage": "jest --config jest.config.ts --coverage",
|
||||
"test:watch": "bun run test --watch",
|
||||
"test:watch": "yarn test --watch",
|
||||
"clean": "rm -rf node_modules dist coverage *.tsbuildinfo"
|
||||
},
|
||||
"author": "Expo <[email protected]>",
|
||||
@@ -43,8 +43,8 @@
|
||||
"node": ">=18"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/eas-build-job": "1.0.265",
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/eas-build-job": "17.0.0",
|
||||
"@expo/logger": "17.0.0",
|
||||
"@expo/spawn-async": "^1.7.2",
|
||||
"arg": "^5.0.2",
|
||||
"fs-extra": "^11.2.0",
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/template-file"
|
||||
},
|
||||
"version": "1.0.260",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
"url": "https://github.com/expo/eas-cli.git",
|
||||
"directory": "packages/turtle-spawn"
|
||||
},
|
||||
"version": "1.0.260",
|
||||
"version": "17.0.0",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"start": "yarn watch",
|
||||
"watch": "tsc --watch --preserveWatchOutput",
|
||||
"build": "tsc",
|
||||
"typecheck": "tsc",
|
||||
@@ -25,7 +25,7 @@
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"license": "BUSL-1.1",
|
||||
"dependencies": {
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/logger": "17.0.0",
|
||||
"@expo/spawn-async": "^1.7.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -22,15 +22,15 @@ cp ./.direnv/local/.envrc.example ./.direnv/local/.envrc
|
||||
# Then load it with direnv or source it manually
|
||||
|
||||
# Install dependencies (from repo root)
|
||||
bun install
|
||||
yarn install
|
||||
|
||||
# Build
|
||||
bun run build
|
||||
yarn build
|
||||
```
|
||||
|
||||
### Development
|
||||
```bash
|
||||
bun run start # Start the worker in development mode
|
||||
yarn start # Start the worker in development mode
|
||||
|
||||
# If you made changes in packages from libs/ directory:
|
||||
# Type 'rs' in the console and press ENTER
|
||||
@@ -39,7 +39,7 @@ bun run start # Start the worker in development mode
|
||||
|
||||
### Testing
|
||||
```bash
|
||||
bun run test # Run unit tests
|
||||
yarn test # Run unit tests
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
@@ -23,7 +23,7 @@ If for some reason the launcher is down when the build has finished then the new
|
||||
## Development
|
||||
|
||||
- Run `cp ./.direnv/local/.envrc.example ./.direnv/local/.envrc` and fill out the new file with your secrets.
|
||||
- Run `bun install` (if you haven't run it in the root dir of the repo) and then `bun run start`.
|
||||
- Run `yarn` (if you haven't run it in the root dir of the repo) and then `yarn start`.
|
||||
- If you made a change in packages from directory `libs`, type `rs` in the console and press ENTER (or `CTRL+C`, `UP`, `ENTER`).
|
||||
|
||||
## Deployment
|
||||
|
||||
@@ -9,6 +9,10 @@ process.env.WORKER_RUNTIME_CONFIG_BASE64 = 'eyAiaW1hZ2UiOiAiIiB9'; // { "image":
|
||||
process.env.__API_SERVER_URL = 'http://api.expo.test';
|
||||
process.env.PORT = '3015';
|
||||
|
||||
jest.mock('fs');
|
||||
jest.mock('fs/promises');
|
||||
jest.mock('node:fs', () => jest.requireMock('fs'));
|
||||
|
||||
// Always mock:
|
||||
jest.mock('@expo/build-tools', () => {
|
||||
return {
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"name": "@expo/worker",
|
||||
"version": "16.32.0",
|
||||
"version": "17.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "bun run watch",
|
||||
"watch": "bun run compile --watch --preserveWatchOutput",
|
||||
"start": "yarn watch",
|
||||
"watch": "yarn compile --watch --preserveWatchOutput",
|
||||
"build": "npm run clean && npm run compile",
|
||||
"clean": "rm -rf ./dist",
|
||||
"clean-all": "bun run clean && rm -rf node_modules",
|
||||
"clean-all": "yarn clean && rm -rf node_modules",
|
||||
"compile": "tsc -p tsconfig.build.json",
|
||||
"prepublishOnly": "npm run build",
|
||||
"test": "bun run test:unit",
|
||||
"test": "yarn test:unit",
|
||||
"test:unit": "./resources/jest --config jest.config.unit.ts",
|
||||
"test:unit:watch": "./resources/jest --config jest.config.unit.ts --watch",
|
||||
"test:integration": "./resources/jest --runInBand --config jest.config.integration.ts",
|
||||
@@ -22,18 +22,18 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "7.24.7",
|
||||
"@expo/build-tools": "1.0.272",
|
||||
"@expo/build-tools": "17.0.0",
|
||||
"@expo/config-plugins": "8.0.8",
|
||||
"@expo/config-types": "52.0.1",
|
||||
"@expo/downloader": "1.0.260",
|
||||
"@expo/eas-build-job": "1.0.265",
|
||||
"@expo/logger": "1.0.260",
|
||||
"@expo/downloader": "17.0.0",
|
||||
"@expo/eas-build-job": "17.0.0",
|
||||
"@expo/logger": "17.0.0",
|
||||
"@expo/results": "1.0.0",
|
||||
"@expo/rudder-sdk-node": "1.1.1",
|
||||
"@expo/spawn-async": "1.7.2",
|
||||
"@expo/steps": "1.0.271",
|
||||
"@expo/template-file": "1.0.260",
|
||||
"@expo/turtle-spawn": "1.0.260",
|
||||
"@expo/steps": "17.0.0",
|
||||
"@expo/template-file": "17.0.0",
|
||||
"@expo/turtle-spawn": "17.0.0",
|
||||
"@hapi/boom": "10.0.1",
|
||||
"@sentry/node": "7.77.0",
|
||||
"check-disk-space": "3.4.0",
|
||||
@@ -50,7 +50,7 @@
|
||||
"node-os-utils": "1.3.7",
|
||||
"nullthrows": "1.1.1",
|
||||
"semver": "7.6.3",
|
||||
"tar": "6.2.1",
|
||||
"tar": "7.5.7",
|
||||
"uuid": "3.4.0",
|
||||
"ws": "8.18.0",
|
||||
"xml2js": "0.6.2",
|
||||
|
||||
@@ -45,7 +45,7 @@ copy_package() {
|
||||
fi
|
||||
}
|
||||
|
||||
cp "$ROOT_DIR/bun.lock" $target_root_dir
|
||||
cp "$ROOT_DIR/yarn.lock" $target_root_dir
|
||||
cp "$ROOT_DIR/package.json" $target_root_dir
|
||||
cp "$ROOT_DIR/lerna.json" $target_root_dir
|
||||
|
||||
@@ -53,13 +53,13 @@ copy_package $WORKER_DIR $target_worker_dir
|
||||
while IFS= read -r package_dir; do
|
||||
package_name=$(basename "$package_dir")
|
||||
copy_package "$package_dir" "$target_root_dir/packages/$package_name"
|
||||
done <<< "$(bunx --silent lerna list --scope "@expo/worker" --include-dependencies --parseable --loglevel silent)"
|
||||
done <<< "$(yarn --silent lerna list --scope "@expo/worker" --include-dependencies --parseable --loglevel silent)"
|
||||
|
||||
|
||||
pushd $target_root_dir >/dev/null 2>&1
|
||||
bun install --silent --frozen-lockfile
|
||||
bun run build
|
||||
bun install --silent --production --frozen-lockfile
|
||||
yarn install --silent --frozen-lockfile
|
||||
yarn build
|
||||
yarn install --silent --production=true --frozen-lockfile
|
||||
rm -rf tsconfig.json tsconfig.build.json
|
||||
popd >/dev/null 2>&1
|
||||
|
||||
|
||||
@@ -9,4 +9,4 @@ ROOT_DIR="$( cd "$DIR/../../../.." && pwd)"
|
||||
# shellcheck source=test-env.sh
|
||||
source "$DIR/test-env.sh"
|
||||
|
||||
bun run jest "$@"
|
||||
yarn run jest "$@"
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Links/unlinks local eas-build packages for development.
|
||||
#
|
||||
# Prerequisites:
|
||||
# Run `yarn link` in each package directory in eas-build repo first:
|
||||
# cd /path/to/eas-build
|
||||
# for pkg in build-tools steps eas-build-job downloader logger template-file turtle-spawn; do
|
||||
# (cd packages/$pkg && yarn link)
|
||||
# done
|
||||
#
|
||||
# Usage:
|
||||
# ./resources/link-eas-build-packages.sh # Link all packages
|
||||
# ./resources/link-eas-build-packages.sh --unlink # Unlink and restore npm versions
|
||||
|
||||
set -e
|
||||
|
||||
PACKAGES=(
|
||||
"@expo/build-tools"
|
||||
"@expo/steps"
|
||||
"@expo/eas-build-job"
|
||||
"@expo/downloader"
|
||||
"@expo/logger"
|
||||
"@expo/template-file"
|
||||
"@expo/turtle-spawn"
|
||||
)
|
||||
|
||||
if [[ "$1" == "--unlink" ]]; then
|
||||
CMD="unlink"
|
||||
echo "Unlinking eas-build packages..."
|
||||
else
|
||||
CMD="link"
|
||||
echo "Linking eas-build packages..."
|
||||
fi
|
||||
|
||||
for PACKAGE in "${PACKAGES[@]}"; do
|
||||
echo "yarn $CMD $PACKAGE"
|
||||
yarn $CMD "$PACKAGE"
|
||||
done
|
||||
|
||||
if [[ "$1" == "--unlink" ]]; then
|
||||
echo ""
|
||||
echo "Restoring npm versions..."
|
||||
yarn install --force
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Done!"
|
||||
@@ -4,7 +4,7 @@ import { BuildJob } from '@expo/eas-build-job';
|
||||
import filesize from 'filesize';
|
||||
import fs from 'fs-extra';
|
||||
import path from 'path';
|
||||
import tar from 'tar';
|
||||
import * as tar from 'tar';
|
||||
|
||||
import config from './config';
|
||||
|
||||
@@ -87,7 +87,7 @@ export class GCSCacheManager implements CacheManager {
|
||||
this.skipCacheUpdate = true; // if restore failed we don't want to update cache with new values
|
||||
return;
|
||||
}
|
||||
// @ts-expect-error
|
||||
|
||||
await tar.extract(
|
||||
{
|
||||
file: archivePath,
|
||||
|
||||
@@ -3,13 +3,18 @@ import downloadFile from '@expo/downloader';
|
||||
import { Cache, Platform } from '@expo/eas-build-job';
|
||||
import { randomUUID } from 'crypto';
|
||||
import fs from 'fs-extra';
|
||||
import { vol } from 'memfs';
|
||||
import os from 'os';
|
||||
import path from 'path';
|
||||
import { Readable } from 'stream';
|
||||
|
||||
import { GCSCacheManager } from '../CacheManager';
|
||||
// These tests use real fs and directories in os.tmpdir().
|
||||
// Something about tar v7 makes mocking fs with memfs problematic.
|
||||
// Mocking all variants of fs/node:fs/fs/promises does not help.
|
||||
// Last Codex research indicated it might be something related to fs-minipass
|
||||
// and fs.writev, mocking fs.writev did not help though.
|
||||
jest.unmock('fs');
|
||||
jest.unmock('node:fs');
|
||||
|
||||
jest.mock('fs');
|
||||
jest.mock('fs/promises');
|
||||
jest.mock('@expo/downloader', () => {
|
||||
return jest.fn();
|
||||
});
|
||||
@@ -23,59 +28,67 @@ jest.mock('../sentry', () => ({
|
||||
handleError: jest.fn(),
|
||||
}));
|
||||
|
||||
async function saveAndRestoreCacheAsync(
|
||||
setupBeforeSave: () => Promise<void> | void,
|
||||
setupBeforeRestore: () => Promise<void> | void,
|
||||
cacheConfig: Partial<Cache>
|
||||
): Promise<void> {
|
||||
await setupBeforeSave();
|
||||
const manager = new GCSCacheManager();
|
||||
const mockCtx = {
|
||||
logger: { info: jest.fn(), error: console.error },
|
||||
workingdir: '/projectRoot',
|
||||
buildDirectory: '/projectRoot/build',
|
||||
job: {
|
||||
platform: Platform.ANDROID,
|
||||
projectRootDirectory: '.',
|
||||
cache: cacheConfig,
|
||||
},
|
||||
} as any;
|
||||
let tarReadStream: Readable;
|
||||
jest.mocked(GCS.uploadWithSignedUrl).mockImplementation(async ({ srcGeneratorAsync }) => {
|
||||
const result = await srcGeneratorAsync();
|
||||
tarReadStream = result;
|
||||
return randomUUID();
|
||||
});
|
||||
|
||||
await manager.saveCache(mockCtx);
|
||||
const chunks = [];
|
||||
for await (const chunk of tarReadStream!) {
|
||||
chunks.push(chunk);
|
||||
}
|
||||
const tarContent = Buffer.concat(chunks);
|
||||
vol.reset();
|
||||
await setupBeforeRestore();
|
||||
jest.mocked(downloadFile).mockImplementation(async (_url, archivePath: string) => {
|
||||
await fs.mkdirp(mockCtx.workingdir);
|
||||
await fs.writeFile(archivePath, tarContent);
|
||||
});
|
||||
await manager.restoreCache(mockCtx);
|
||||
}
|
||||
const { GCSCacheManager } = require('../CacheManager');
|
||||
|
||||
describe(GCSCacheManager, () => {
|
||||
beforeEach(() => {
|
||||
vol.reset();
|
||||
let tmpDir: string;
|
||||
let outsideDir: string;
|
||||
beforeEach(async () => {
|
||||
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'eas-cli-test-'));
|
||||
outsideDir = await fs.mkdtemp(path.join(os.tmpdir(), 'eas-cli-outside-test-'));
|
||||
});
|
||||
afterEach(() => {
|
||||
|
||||
afterEach(async () => {
|
||||
await fs.rm(tmpDir, { recursive: true, force: true });
|
||||
await fs.rm(outsideDir, { recursive: true, force: true });
|
||||
jest.mocked(GCS.uploadWithSignedUrl).mockReset();
|
||||
jest.mocked(downloadFile).mockReset();
|
||||
});
|
||||
|
||||
async function saveAndRestoreCacheAsync(
|
||||
setupBeforeSave: () => Promise<void> | void,
|
||||
setupBeforeRestore: () => Promise<void> | void,
|
||||
cacheConfig: Partial<Cache>
|
||||
): Promise<void> {
|
||||
await setupBeforeSave();
|
||||
const manager = new GCSCacheManager();
|
||||
const mockCtx = {
|
||||
logger: { info: jest.fn(), error: console.error },
|
||||
workingdir: tmpDir,
|
||||
buildDirectory: `${tmpDir}/build`,
|
||||
job: {
|
||||
platform: Platform.ANDROID,
|
||||
projectRootDirectory: '.',
|
||||
cache: cacheConfig,
|
||||
},
|
||||
} as any;
|
||||
let tarReadStream: Readable;
|
||||
jest.mocked(GCS.uploadWithSignedUrl).mockImplementation(async ({ srcGeneratorAsync }) => {
|
||||
const result = await srcGeneratorAsync();
|
||||
tarReadStream = result;
|
||||
return randomUUID();
|
||||
});
|
||||
|
||||
await manager.saveCache(mockCtx);
|
||||
const chunks = [];
|
||||
for await (const chunk of tarReadStream!) {
|
||||
chunks.push(chunk);
|
||||
}
|
||||
const tarContent = Buffer.concat(chunks);
|
||||
await fs.rm(tmpDir, { recursive: true, force: true });
|
||||
await fs.rm(outsideDir, { recursive: true, force: true });
|
||||
await setupBeforeRestore();
|
||||
jest.mocked(downloadFile).mockImplementation(async (_url, archivePath: string) => {
|
||||
await fs.mkdirp(mockCtx.workingdir);
|
||||
await fs.writeFile(archivePath, tarContent);
|
||||
});
|
||||
await manager.restoreCache(mockCtx);
|
||||
}
|
||||
|
||||
test('save and restore for a single file', async () => {
|
||||
await saveAndRestoreCacheAsync(
|
||||
() => {
|
||||
vol.fromJSON({
|
||||
'/projectRoot/build/index.ts': 'index.ts',
|
||||
});
|
||||
return fs.outputFile(path.join(tmpDir, 'build', 'index.ts'), 'index.ts');
|
||||
},
|
||||
() => {},
|
||||
{
|
||||
@@ -83,18 +96,18 @@ describe(GCSCacheManager, () => {
|
||||
}
|
||||
);
|
||||
|
||||
expect(vol.toJSON()).toStrictEqual({
|
||||
'/projectRoot/build/index.ts': 'index.ts',
|
||||
'/projectRoot/cache-restore.tar.gz': expect.anything(),
|
||||
});
|
||||
await expect(fs.readFile(path.join(tmpDir, 'build', 'index.ts'), 'utf8')).resolves.toBe(
|
||||
'index.ts'
|
||||
);
|
||||
await expect(fs.pathExists(path.join(tmpDir, 'cache-restore.tar.gz'))).resolves.toBe(true);
|
||||
});
|
||||
test('save and restore for a single directory', async () => {
|
||||
await saveAndRestoreCacheAsync(
|
||||
() => {
|
||||
vol.fromJSON({
|
||||
'/projectRoot/build/src/index.ts': 'index.ts',
|
||||
'/projectRoot/build/src/main.ts': 'index.ts',
|
||||
});
|
||||
async () => {
|
||||
await Promise.all([
|
||||
fs.outputFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'index.ts'),
|
||||
fs.outputFile(path.join(tmpDir, 'build', 'src', 'main.ts'), 'index.ts'),
|
||||
]);
|
||||
},
|
||||
() => {},
|
||||
{
|
||||
@@ -102,73 +115,78 @@ describe(GCSCacheManager, () => {
|
||||
}
|
||||
);
|
||||
|
||||
expect(vol.toJSON()).toStrictEqual({
|
||||
'/projectRoot/build/src/index.ts': 'index.ts',
|
||||
'/projectRoot/build/src/main.ts': 'index.ts',
|
||||
'/projectRoot/cache-restore.tar.gz': expect.anything(),
|
||||
});
|
||||
await expect(fs.readFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'utf8')).resolves.toBe(
|
||||
'index.ts'
|
||||
);
|
||||
await expect(fs.readFile(path.join(tmpDir, 'build', 'src', 'main.ts'), 'utf8')).resolves.toBe(
|
||||
'index.ts'
|
||||
);
|
||||
await expect(fs.pathExists(path.join(tmpDir, 'cache-restore.tar.gz'))).resolves.toBe(true);
|
||||
});
|
||||
test('save and restore for a single directory outside of the project structure', async () => {
|
||||
await saveAndRestoreCacheAsync(
|
||||
() => {
|
||||
vol.fromJSON({
|
||||
'/projectRoot/build/src/index.ts': 'index.ts',
|
||||
'/outsideProjectRoot/build/src/index.ts': 'index.ts',
|
||||
});
|
||||
async () => {
|
||||
await Promise.all([
|
||||
fs.outputFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'index.ts'),
|
||||
fs.outputFile(path.join(outsideDir, 'build', 'src', 'index.ts'), 'index.ts'),
|
||||
]);
|
||||
},
|
||||
() => {},
|
||||
{
|
||||
paths: ['/outsideProjectRoot/build'],
|
||||
paths: [path.join(outsideDir, 'build')],
|
||||
}
|
||||
);
|
||||
|
||||
expect(vol.toJSON()).toStrictEqual({
|
||||
'/outsideProjectRoot/build/src/index.ts': 'index.ts',
|
||||
'/projectRoot/cache-restore.tar.gz': expect.anything(),
|
||||
});
|
||||
await expect(
|
||||
fs.readFile(path.join(outsideDir, 'build', 'src', 'index.ts'), 'utf8')
|
||||
).resolves.toBe('index.ts');
|
||||
await expect(fs.pathExists(path.join(tmpDir, 'build', 'src', 'index.ts'))).resolves.toBe(false);
|
||||
await expect(fs.pathExists(path.join(tmpDir, 'cache-restore.tar.gz'))).resolves.toBe(true);
|
||||
});
|
||||
test('that save and restore does not override existing files', async () => {
|
||||
await saveAndRestoreCacheAsync(
|
||||
() => {
|
||||
vol.fromJSON({
|
||||
'/projectRoot/build/src/index.ts': 'index.ts',
|
||||
'/projectRoot/build/src/main': 'index.ts',
|
||||
});
|
||||
async () => {
|
||||
await Promise.all([
|
||||
fs.outputFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'index.ts'),
|
||||
fs.outputFile(path.join(tmpDir, 'build', 'src', 'main'), 'index.ts'),
|
||||
]);
|
||||
},
|
||||
() => {
|
||||
vol.fromJSON({
|
||||
'/projectRoot/build/src/index.ts': 'index2.ts',
|
||||
});
|
||||
return fs.outputFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'index2.ts');
|
||||
},
|
||||
{
|
||||
paths: ['src'],
|
||||
}
|
||||
);
|
||||
|
||||
expect(vol.toJSON()).toStrictEqual({
|
||||
'/projectRoot/build/src/index.ts': 'index2.ts',
|
||||
'/projectRoot/build/src/main': 'index.ts',
|
||||
'/projectRoot/cache-restore.tar.gz': expect.anything(),
|
||||
});
|
||||
await expect(fs.readFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'utf8')).resolves.toBe(
|
||||
'index2.ts'
|
||||
);
|
||||
await expect(fs.readFile(path.join(tmpDir, 'build', 'src', 'main'), 'utf8')).resolves.toBe(
|
||||
'index.ts'
|
||||
);
|
||||
await expect(fs.pathExists(path.join(tmpDir, 'cache-restore.tar.gz'))).resolves.toBe(true);
|
||||
});
|
||||
test('save and restore for multiple locations', async () => {
|
||||
await saveAndRestoreCacheAsync(
|
||||
() => {
|
||||
vol.fromJSON({
|
||||
'/projectRoot/build/src/index.ts': 'index.ts',
|
||||
'/outsideProjectRoot/build/src/index.ts': 'index.ts',
|
||||
});
|
||||
async () => {
|
||||
await Promise.all([
|
||||
fs.outputFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'index.ts'),
|
||||
fs.outputFile(path.join(outsideDir, 'build', 'src', 'index.ts'), 'index.ts'),
|
||||
]);
|
||||
},
|
||||
() => {},
|
||||
{
|
||||
paths: ['src', '/outsideProjectRoot/build'],
|
||||
paths: ['src', path.join(outsideDir, 'build')],
|
||||
}
|
||||
);
|
||||
|
||||
expect(vol.toJSON()).toStrictEqual({
|
||||
'/outsideProjectRoot/build/src/index.ts': 'index.ts',
|
||||
'/projectRoot/build/src/index.ts': 'index.ts',
|
||||
'/projectRoot/cache-restore.tar.gz': expect.anything(),
|
||||
});
|
||||
await expect(fs.readFile(path.join(tmpDir, 'build', 'src', 'index.ts'), 'utf8')).resolves.toBe(
|
||||
'index.ts'
|
||||
);
|
||||
await expect(
|
||||
fs.readFile(path.join(outsideDir, 'build', 'src', 'index.ts'), 'utf8')
|
||||
).resolves.toBe('index.ts');
|
||||
await expect(fs.pathExists(path.join(tmpDir, 'cache-restore.tar.gz'))).resolves.toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -5,7 +5,7 @@ import { asyncResult } from '@expo/results';
|
||||
import fs from 'fs-extra';
|
||||
import nullthrows from 'nullthrows';
|
||||
import path from 'path';
|
||||
import tar from 'tar';
|
||||
import * as tar from 'tar';
|
||||
import { z } from 'zod';
|
||||
|
||||
import config from './config';
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@ SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/.. && pwd )"
|
||||
|
||||
pushd $SCRIPTS_DIR >/dev/null 2>&1
|
||||
# Install modules
|
||||
bun install --silent
|
||||
yarn --silent
|
||||
# Run script
|
||||
bun run --silent $@
|
||||
yarn --silent $@
|
||||
popd >/dev/null 2>&1
|
||||
@@ -1,108 +0,0 @@
|
||||
{
|
||||
"lockfileVersion": 1,
|
||||
"configVersion": 0,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "scripts",
|
||||
"dependencies": {
|
||||
"chalk": "5.2.0",
|
||||
"dateformat": "4.5.1",
|
||||
"fs-extra": "11.2.0",
|
||||
"lodash-es": "4.17.21",
|
||||
"marked": "3.0.4",
|
||||
"semver": "7.5.4",
|
||||
"tslib": "2.6.2",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/dateformat": "3.0.1",
|
||||
"@types/fs-extra": "11.0.4",
|
||||
"@types/lodash-es": "4.17.12",
|
||||
"@types/node": "20.11.0",
|
||||
"@types/semver": "7.5.6",
|
||||
"ts-node": "10.9.2",
|
||||
"typescript": "5.3.3",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@cspotcode/source-map-support": ["@cspotcode/[email protected]", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
|
||||
|
||||
"@jridgewell/resolve-uri": ["@jridgewell/[email protected]", "", {}, "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="],
|
||||
|
||||
"@jridgewell/sourcemap-codec": ["@jridgewell/[email protected]", "", {}, "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="],
|
||||
|
||||
"@jridgewell/trace-mapping": ["@jridgewell/[email protected]", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
|
||||
|
||||
"@tsconfig/node10": ["@tsconfig/[email protected]", "", {}, "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg=="],
|
||||
|
||||
"@tsconfig/node12": ["@tsconfig/[email protected]", "", {}, "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw=="],
|
||||
|
||||
"@tsconfig/node14": ["@tsconfig/[email protected]", "", {}, "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg=="],
|
||||
|
||||
"@tsconfig/node16": ["@tsconfig/[email protected]", "", {}, "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA=="],
|
||||
|
||||
"@types/dateformat": ["@types/[email protected]", "", {}, "sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g=="],
|
||||
|
||||
"@types/fs-extra": ["@types/[email protected]", "", { "dependencies": { "@types/jsonfile": "*", "@types/node": "*" } }, "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ=="],
|
||||
|
||||
"@types/jsonfile": ["@types/[email protected]", "", { "dependencies": { "@types/node": "*" } }, "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ=="],
|
||||
|
||||
"@types/lodash": ["@types/[email protected]", "", {}, "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="],
|
||||
|
||||
"@types/lodash-es": ["@types/[email protected]", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ=="],
|
||||
|
||||
"@types/node": ["@types/[email protected]", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ=="],
|
||||
|
||||
"@types/semver": ["@types/[email protected]", "", {}, "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A=="],
|
||||
|
||||
"acorn": ["[email protected]", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q=="],
|
||||
|
||||
"acorn-walk": ["[email protected]", "", {}, "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="],
|
||||
|
||||
"arg": ["[email protected]", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="],
|
||||
|
||||
"chalk": ["[email protected]", "", {}, "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA=="],
|
||||
|
||||
"create-require": ["[email protected]", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="],
|
||||
|
||||
"dateformat": ["[email protected]", "", {}, "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q=="],
|
||||
|
||||
"diff": ["[email protected]", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="],
|
||||
|
||||
"fs-extra": ["[email protected]", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw=="],
|
||||
|
||||
"graceful-fs": ["[email protected]", "", {}, "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="],
|
||||
|
||||
"jsonfile": ["[email protected]", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="],
|
||||
|
||||
"lodash-es": ["[email protected]", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="],
|
||||
|
||||
"lru-cache": ["[email protected]", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
|
||||
"make-error": ["[email protected]", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="],
|
||||
|
||||
"marked": ["[email protected]", "", { "bin": { "marked": "bin/marked" } }, "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA=="],
|
||||
|
||||
"semver": ["[email protected]", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="],
|
||||
|
||||
"ts-node": ["[email protected]", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="],
|
||||
|
||||
"tslib": ["[email protected]", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="],
|
||||
|
||||
"typescript": ["[email protected]", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw=="],
|
||||
|
||||
"undici-types": ["[email protected]", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
|
||||
|
||||
"universalify": ["[email protected]", "", {}, "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="],
|
||||
|
||||
"v8-compile-cache-lib": ["[email protected]", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="],
|
||||
|
||||
"yallist": ["[email protected]", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
|
||||
|
||||
"yn": ["[email protected]", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="],
|
||||
|
||||
"@types/fs-extra/@types/node": ["@types/[email protected]", "", {}, "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ=="],
|
||||
|
||||
"@types/jsonfile/@types/node": ["@types/[email protected]", "", {}, "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ=="],
|
||||
}
|
||||
}
|
||||
@@ -64,7 +64,7 @@ function sanitizeInput(
|
||||
): [category: EntryCategory, message: string] {
|
||||
if (!rawCategory || !rawMessage) {
|
||||
throw new Error(
|
||||
'Usage: bun run changelog-entry [breaking-change|new-feature|bug-fix|chore] [message]'
|
||||
'Usage: yarn changelog-entry [breaking-change|new-feature|bug-fix|chore] [message]'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ const FORMAT_RELEASE_HEADING = (version: string): markdown.Token =>
|
||||
|
||||
(async function main(version: string): Promise<void> {
|
||||
if (!semver.valid(version)) {
|
||||
throw new Error(`Usage: bun run release-changelog SEMVER`);
|
||||
throw new Error(`Usage: yarn release-changelog SEMVER`);
|
||||
}
|
||||
|
||||
const tokens = await readAndParseChangelogAsync();
|
||||
|
||||
Generated
+238
@@ -0,0 +1,238 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@cspotcode/source-map-support@^0.8.0":
|
||||
version "0.8.1"
|
||||
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
|
||||
integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
|
||||
dependencies:
|
||||
"@jridgewell/trace-mapping" "0.3.9"
|
||||
|
||||
"@jridgewell/resolve-uri@^3.0.3":
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
|
||||
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
|
||||
|
||||
"@jridgewell/sourcemap-codec@^1.4.10":
|
||||
version "1.4.14"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
|
||||
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
|
||||
|
||||
"@jridgewell/[email protected]":
|
||||
version "0.3.9"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
|
||||
integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
|
||||
dependencies:
|
||||
"@jridgewell/resolve-uri" "^3.0.3"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||
|
||||
"@tsconfig/node10@^1.0.7":
|
||||
version "1.0.8"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
|
||||
integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
|
||||
|
||||
"@tsconfig/node12@^1.0.7":
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
|
||||
integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
|
||||
|
||||
"@tsconfig/node14@^1.0.0":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
|
||||
integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
|
||||
|
||||
"@tsconfig/node16@^1.0.2":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
|
||||
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
|
||||
|
||||
"@types/[email protected]":
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc"
|
||||
integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g==
|
||||
|
||||
"@types/[email protected]":
|
||||
version "11.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.4.tgz#e16a863bb8843fba8c5004362b5a73e17becca45"
|
||||
integrity sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==
|
||||
dependencies:
|
||||
"@types/jsonfile" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/jsonfile@*":
|
||||
version "6.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702"
|
||||
integrity sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/[email protected]":
|
||||
version "4.17.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b"
|
||||
integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
|
||||
dependencies:
|
||||
"@types/lodash" "*"
|
||||
|
||||
"@types/lodash@*":
|
||||
version "4.14.182"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2"
|
||||
integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==
|
||||
|
||||
"@types/node@*":
|
||||
version "16.10.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5"
|
||||
integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==
|
||||
|
||||
"@types/[email protected]":
|
||||
version "20.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.0.tgz#8e0b99e70c0c1ade1a86c4a282f7b7ef87c9552f"
|
||||
integrity sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==
|
||||
dependencies:
|
||||
undici-types "~5.26.4"
|
||||
|
||||
"@types/[email protected]":
|
||||
version "7.5.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339"
|
||||
integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==
|
||||
|
||||
acorn-walk@^8.1.1:
|
||||
version "8.2.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
|
||||
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
|
||||
|
||||
acorn@^8.4.1:
|
||||
version "8.5.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
|
||||
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
|
||||
|
||||
arg@^4.1.0:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
|
||||
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
|
||||
|
||||
[email protected]:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3"
|
||||
integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
|
||||
|
||||
create-require@^1.1.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
|
||||
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
|
||||
|
||||
[email protected]:
|
||||
version "4.5.1"
|
||||
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c"
|
||||
integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==
|
||||
|
||||
diff@^4.0.1:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
|
||||
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
|
||||
|
||||
[email protected]:
|
||||
version "11.2.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
|
||||
integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.8"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
|
||||
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
||||
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
|
||||
dependencies:
|
||||
universalify "^2.0.0"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
[email protected]:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
|
||||
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
|
||||
|
||||
lru-cache@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
|
||||
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
make-error@^1.1.1:
|
||||
version "1.3.6"
|
||||
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
|
||||
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
|
||||
|
||||
[email protected]:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.4.tgz#b8a1539e5e05c6ea9e93f15c0bad1d54ce890406"
|
||||
integrity sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==
|
||||
|
||||
[email protected]:
|
||||
version "7.5.4"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
|
||||
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
|
||||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
[email protected]:
|
||||
version "10.9.2"
|
||||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
|
||||
integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
|
||||
dependencies:
|
||||
"@cspotcode/source-map-support" "^0.8.0"
|
||||
"@tsconfig/node10" "^1.0.7"
|
||||
"@tsconfig/node12" "^1.0.7"
|
||||
"@tsconfig/node14" "^1.0.0"
|
||||
"@tsconfig/node16" "^1.0.2"
|
||||
acorn "^8.4.1"
|
||||
acorn-walk "^8.1.1"
|
||||
arg "^4.1.0"
|
||||
create-require "^1.1.0"
|
||||
diff "^4.0.1"
|
||||
make-error "^1.1.1"
|
||||
v8-compile-cache-lib "^3.0.1"
|
||||
yn "3.1.1"
|
||||
|
||||
[email protected]:
|
||||
version "2.6.2"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
|
||||
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
|
||||
|
||||
[email protected]:
|
||||
version "5.3.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
|
||||
integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
||||
|
||||
v8-compile-cache-lib@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
|
||||
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
[email protected]:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
|
||||
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
|
||||
Reference in new issue
Block a user