Compare commits

...
Author SHA1 Message Date
Dominik Sokal f33d859d75 random change 2022-07-15 11:13:39 +02:00
Dominik Sokal 69515ab47b fix S3 upload URLs (#1207) 2022-07-13 13:00:30 +02:00
Will Schurman ac5f7ab186 [eas-cli] Show spinner instead of silently timing out during asset upload (#1206) 2022-07-12 16:41:51 -07:00
Wojciech Kozyra 265c7eacc5 [eas-json] Increase max number of chained "extends" in build profiles (#1208) 2022-07-12 13:46:40 +02:00
Expo CI 98229581ca update CHANGELOG.md 2022-07-12 00:36:36 +00:00
Will Schurman a718fd10d3 v0.55.1 2022-07-11 17:25:37 -07:00
Will Schurman 78a63b8ca1 [eas-cli] Fix asset upload crash (#1205) 2022-07-11 16:50:09 -07:00
Cedric van Putten 7487f413de [eas-cli] Temporarily increase coverage memory to stabilize CI (#1196) 2022-07-11 19:40:32 +02:00
Expo CI da5f4e644a update CHANGELOG.md 2022-07-11 10:28:38 +00:00
Dominik Sokal be38117012 v0.55.0 2022-07-11 11:49:04 +02:00
Wojciech Kozyra 8f3314f188 [eas-cli] Keep using AndroidManifest.xml as a workflow marker (#1204) 2022-07-11 11:05:36 +02:00
Wojciech KozyraandDominik Sokal 31b6cc9ab6 [eas-cli] allow applicationId override (#1203)
* allow applicationId override

* Apply suggestions from code review

Co-authored-by: Dominik Sokal <[email protected]>

* update CHANGELOG.md

* update CHANGELOG.md

Co-authored-by: Dominik Sokal <[email protected]>
2022-07-11 10:19:06 +02:00
Dominik Sokal 04a8b08f59 [ENG-4579][scripts] convert to ESM (#1192)
* upgrade typescript to 4.7.4

* [scripts] add extensions to imports

* [scripts] configure as ESM

* [scripts] fix after converting to ESM

* [scripts] fix lint

* [scripts] require node >= 14.16

* [scripts] add node: protocol

* add scripts/build to .gitignore

* [scripts] add typecheck script

* add workflow for testing scripts

* address PR feedback
2022-07-04 11:50:57 +02:00
Cedric van Putten 8bce9b19b2 [eas-cli] Remove deprecated idfa and price tier from store config (#1193)
* [eas-cli] Drop deprecated idfa from store config

* [eas-cli] Drop deprecated price tier from store config

* update CHANGELOG.md
2022-07-02 02:52:35 +02:00
Cedric van Putten d3d6d41f9f [eas-cli] Improve store config categories configuration (#1187)
* [eas-cli] Improve EAS metadata category configuration

* [eas-cli] Update category types for apple store configuration

* [eas-cli] Add tests for the behavior of the categories from store configuration

* [eas-cli] Update apple store config with new categories

* [eas-cli] Simplify parent vs normal categories in schema

* [eas-cli] Fix serialization issue with empty secondary sub category

* [eas-cli] Relax the apple category types to allow strings

* [eas-cli] Fix an issue in reader related to the category types

* [eas-cli] Add comments about string vs category enum

* update CHANGELOG.md
2022-07-02 02:02:37 +02:00
Brent Vatne 0534328dfc [github] Add issue triage workflows 2022-06-30 17:45:44 -07:00
38 changed files with 837 additions and 443 deletions

No files matched your search

+146
View File
@@ -0,0 +1,146 @@
name: Issue Triage
on:
issues:
types: [labeled]
jobs:
needs-repro:
runs-on: ubuntu-20.04
if: "${{ contains(github.event.label.name, 'incomplete issue: missing or invalid repro') }}"
steps:
- uses: actions/github-script@v3
with:
github-token: ${{ secrets.EXPO_BOT_GITHUB_TOKEN }}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Hi there! It looks like your issue requires a minimal reproducible example, but it is invalid or absent. Please prepare such an example and share it in a new issue.
**The best way to get attention to your issue is to provide a clean and easy way for a developer to reproduce the issue on their own machine.** Please do not provide your entire project, or a project with more code than is necessary to reproduce the issue.
A side benefit of going through the process of narrowing down the minimal amount of code needed to reproduce the issue is that you may get lucky and discover that the bug is due to a mistake in your application code that you can quickly fix on your own.
### Resources
- ["How to create a Minimal, Reproducible Example"](https://stackoverflow.com/help/minimal-reproducible-example)
- ["How to narrow down the source of an error"](https://expo.fyi/manual-debugging)
### Common concerns
#### "I've only been able to reproduce it in private, proprietary code"
You may not have spent enough time narrowing down the root cause of the issue. Try out the techniques discussed in this [manual debugging guide](https://expo.fyi/manual-debugging) to learn how to isolate the problem from the rest of your codebase.
#### "I didn't have time to create one"
That's understandable, it can take some time to prepare. We ask that you hold off on filing an issue until you are able to fully complete the required fields in the issue template.
#### "You can reproduce it by yourself by creating a project and following these steps"
This is useful knowledge, but it's still valuable to have the resulting project that is produced from running the steps, where you have verified you can reproduce the issue.
`})
github.issues.update({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
state: 'closed'
})
needs-info:
runs-on: ubuntu-20.04
if: "${{ contains(github.event.label.name, 'incomplete issue: missing info') }}"
steps:
- uses: actions/github-script@v3
with:
github-token: ${{ secrets.EXPO_BOT_GITHUB_TOKEN }}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Hello! There isn't enough information provided in your issue description for us to be able to help you. The best way to get help is to provide information to enable other developers to understand the issue and reproduce it on their own machines.
Please create a new issue and fill out the entire issue template to the best of your ability. Refer to the following resources for more information on how to create a good issue report.
### Resources
- ["How do I ask a good question?"](https://stackoverflow.com/help/how-to-ask)
- ["How to create a Minimal, Reproducible Example"](https://stackoverflow.com/help/minimal-reproducible-example)
- ["How to narrow down the source of an error"](https://expo.fyi/manual-debugging)
`})
github.issues.update({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
state: 'closed'
})
issue-accepted:
runs-on: ubuntu-20.04
if: github.event.label.name == 'issue accepted'
steps:
- uses: actions/github-script@v3
with:
github-token: ${{ secrets.EXPO_BOT_GITHUB_TOKEN }}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Thank you for filing this issue!
This comment acknowledges we believe this may be a bug and there’s enough information to investigate it.
However, we can’t promise any sort of timeline for resolution. We prioritize issues based on severity, breadth of impact, and alignment with our roadmap. If you’d like to help move it more quickly, you can continue to investigate it more deeply and/or you can open a pull request that fixes the cause.
`})
question:
runs-on: ubuntu-20.04
if: "${{ contains(github.event.label.name, 'invalid issue: question') }}"
steps:
- uses: actions/github-script@v3
with:
github-token: ${{ secrets.EXPO_BOT_GITHUB_TOKEN }}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Hello! Our GitHub issues are reserved for bug reports.
If you have a question about Expo or related tools, please post on our forums at https://forums.expo.dev/ or join our Discord at https://chat.expo.dev/.
### Resources
- ["How do I ask a good question?"](https://stackoverflow.com/help/how-to-ask)
- ["Join the community"](https://docs.expo.dev/next-steps/community/)
`})
github.issues.update({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
state: 'closed'
})
feature-request:
runs-on: ubuntu-20.04
if: "${{ contains(github.event.label.name, 'invalid issue: feature request') }}"
steps:
- uses: actions/github-script@v3
with:
github-token: ${{ secrets.EXPO_BOT_GITHUB_TOKEN }}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Hello! Our GitHub issues are reserved for bug reports.
If you would like to request a feature, please post to https://expo.canny.io/feature-requests.
`})
github.issues.update({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
state: 'closed'
})
+26
View File
@@ -0,0 +1,26 @@
name: Test scripts
defaults:
run:
working-directory: scripts
on:
push:
branches: [main]
paths:
- 'scripts/**'
pull_request:
paths:
- 'scripts/**'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup node
uses: actions/setup-node@v2
with:
node-version: 18
- run: yarn install --frozen-lockfile --check-files
- run: yarn typecheck
+4
View File
@@ -27,6 +27,10 @@ jobs:
if: ${{ !matrix.coverage }}
- run: yarn test --coverage
if: ${{ matrix.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=4096
- run: yarn lint --max-warnings=0
- run: shellcheck bin/*.sh
- uses: codecov/codecov-action@v1
+1
View File
@@ -2,6 +2,7 @@
packages/*/build
packages/eas-cli/dist
packages/eas-cli/tmp
scripts/build
# Code editors
.idea
+22
View File
@@ -8,11 +8,31 @@ This is the log of notable changes to EAS CLI and related packages.
### 🎉 New features
### 🐛 Bug fixes
- Show spinner instead of silently timing out during asset upload. ([#1206](https://github.com/expo/eas-cli/pull/1206) by [@wschurman](https://github.com/wschurman))
- Fix build archive S3 URLs. ([#1207](https://github.com/expo/eas-cli/pull/1207) by [@dsokal](https://github.com/dsokal))
### 🧹 Chores
- Increase max number of chained "extends" in build profiles. ([#1208](https://github.com/expo/eas-cli/pull/1208) by [@wkozyra95](https://github.com/wkozyra95))
## [0.55.1](https://github.com/expo/eas-cli/releases/tag/v0.55.1) - 2022-07-12
### 🐛 Bug fixes
- Fix asset upload crash. ([#1205](https://github.com/expo/eas-cli/pull/1205) by [@wschurman](https://github.com/wschurman))
## [0.55.0](https://github.com/expo/eas-cli/releases/tag/v0.55.0) - 2022-07-11
### 🎉 New features
- Show bundler output by default for eas update command. ([#1171](https://github.com/expo/eas-cli/pull/1171) by [@kgc00](https://github.com/kgc00/))
- Allow users to skip metadata validation. ([#1175](https://github.com/expo/eas-cli/pull/1175) by [@byCedric](https://github.com/byCedric))
- Add experimental `--resource-class` flag for Build commands. ([#1138](https://github.com/expo/eas-cli/pull/1138) by [@christopherwalter](https://github.com/christopherwalter))
- Truncate long messages for `eas update` command, rather than failing. ([#1178](https://github.com/expo/eas-cli/pull/1178) by [@kgc00](https://github.com/kgc00))
- Add review details to metadata store configuration. ([#1184](https://github.com/expo/eas-cli/pull/1184) by [@byCedric](https://github.com/byCedric))
- Override applicationId via env. ([#1203](https://github.com/expo/eas-cli/pull/1203) by [@wkozyra95](https://github.com/wkozyra95))
### 🐛 Bug fixes
@@ -22,6 +42,8 @@ This is the log of notable changes to EAS CLI and related packages.
- Update validation rules for metadata info locales. ([#1174](https://github.com/expo/eas-cli/pull/1174) by [@byCedric](https://github.com/byCedric))
- Improve store configuration defaults and schema documentation. ([#1183](https://github.com/expo/eas-cli/pull/1183) by [@byCedric](https://github.com/byCedric))
- Improve store config categories configuration. ([#1187](https://github.com/expo/eas-cli/pull/1187) by [@byCedric](https://github.com/byCedric))
- Remove deprecated idfa and price tier from store config. ([#1193](https://github.com/expo/eas-cli/pull/1193) by [@byCedric](https://github.com/byCedric))
## [0.54.1](https://github.com/expo/eas-cli/releases/tag/v0.54.1) - 2022-06-15
+1 -1
View File
@@ -1,5 +1,5 @@
{
"npmClient": "yarn",
"useWorkspaces": true,
"version": "0.54.1"
"version": "0.55.1"
}
+1 -1
View File
@@ -29,7 +29,7 @@
"oclif": "3.0.1",
"prettier": "2.6.2",
"ts-jest": "28.0.2",
"typescript": "4.6.4"
"typescript": "4.7.4"
},
"volta": {
"node": "18.2.0",
+100 -98
View File
@@ -22,68 +22,69 @@ yarn global add eas-cli
# Usage
```sh
eas COMMAND
# runs the command
eas (-v|--version|version)
eas COMMAND
# prints the version
eas --help COMMAND
eas (-v|--version|version)
# outputs help for specific command
eas --help COMMAND
```
# Commands
<!-- commands -->
* [`eas account:login`](#eas-accountlogin)
* [`eas account:logout`](#eas-accountlogout)
* [`eas account:view`](#eas-accountview)
* [`eas analytics [STATUS]`](#eas-analytics-status)
* [`eas autocomplete [SHELL]`](#eas-autocomplete-shell)
* [`eas branch:create [NAME]`](#eas-branchcreate-name)
* [`eas branch:delete [NAME]`](#eas-branchdelete-name)
* [`eas branch:list`](#eas-branchlist)
* [`eas branch:rename`](#eas-branchrename)
* [`eas branch:view [NAME]`](#eas-branchview-name)
* [`eas build`](#eas-build)
* [`eas build:cancel [BUILD_ID]`](#eas-buildcancel-build_id)
* [`eas build:configure`](#eas-buildconfigure)
* [`eas build:inspect`](#eas-buildinspect)
* [`eas build:list`](#eas-buildlist)
* [`eas build:submit`](#eas-buildsubmit)
* [`eas build:view [BUILD_ID]`](#eas-buildview-build_id)
* [`eas channel:create [NAME]`](#eas-channelcreate-name)
* [`eas channel:edit [NAME]`](#eas-channeledit-name)
* [`eas channel:list`](#eas-channellist)
* [`eas channel:view [NAME]`](#eas-channelview-name)
* [`eas config`](#eas-config)
* [`eas credentials`](#eas-credentials)
* [`eas device:create`](#eas-devicecreate)
* [`eas device:delete`](#eas-devicedelete)
* [`eas device:list`](#eas-devicelist)
* [`eas device:view [UDID]`](#eas-deviceview-udid)
* [`eas diagnostics`](#eas-diagnostics)
* [`eas help [COMMAND]`](#eas-help-command)
* [`eas init`](#eas-init)
* [`eas login`](#eas-login)
* [`eas logout`](#eas-logout)
* [`eas metadata:pull`](#eas-metadatapull)
* [`eas metadata:push`](#eas-metadatapush)
* [`eas project:info`](#eas-projectinfo)
* [`eas project:init`](#eas-projectinit)
* [`eas secret:create`](#eas-secretcreate)
* [`eas secret:delete`](#eas-secretdelete)
* [`eas secret:list`](#eas-secretlist)
* [`eas submit`](#eas-submit)
* [`eas update`](#eas-update)
* [`eas update:configure`](#eas-updateconfigure)
* [`eas update:delete GROUPID`](#eas-updatedelete-groupid)
* [`eas update:list`](#eas-updatelist)
* [`eas update:view GROUPID`](#eas-updateview-groupid)
* [`eas webhook:create`](#eas-webhookcreate)
* [`eas webhook:delete [ID]`](#eas-webhookdelete-id)
* [`eas webhook:list`](#eas-webhooklist)
* [`eas webhook:update`](#eas-webhookupdate)
* [`eas webhook:view ID`](#eas-webhookview-id)
* [`eas whoami`](#eas-whoami)
- [`eas account:login`](#eas-accountlogin)
- [`eas account:logout`](#eas-accountlogout)
- [`eas account:view`](#eas-accountview)
- [`eas analytics [STATUS]`](#eas-analytics-status)
- [`eas autocomplete [SHELL]`](#eas-autocomplete-shell)
- [`eas branch:create [NAME]`](#eas-branchcreate-name)
- [`eas branch:delete [NAME]`](#eas-branchdelete-name)
- [`eas branch:list`](#eas-branchlist)
- [`eas branch:rename`](#eas-branchrename)
- [`eas branch:view [NAME]`](#eas-branchview-name)
- [`eas build`](#eas-build)
- [`eas build:cancel [BUILD_ID]`](#eas-buildcancel-build_id)
- [`eas build:configure`](#eas-buildconfigure)
- [`eas build:inspect`](#eas-buildinspect)
- [`eas build:list`](#eas-buildlist)
- [`eas build:submit`](#eas-buildsubmit)
- [`eas build:view [BUILD_ID]`](#eas-buildview-build_id)
- [`eas channel:create [NAME]`](#eas-channelcreate-name)
- [`eas channel:edit [NAME]`](#eas-channeledit-name)
- [`eas channel:list`](#eas-channellist)
- [`eas channel:view [NAME]`](#eas-channelview-name)
- [`eas config`](#eas-config)
- [`eas credentials`](#eas-credentials)
- [`eas device:create`](#eas-devicecreate)
- [`eas device:delete`](#eas-devicedelete)
- [`eas device:list`](#eas-devicelist)
- [`eas device:view [UDID]`](#eas-deviceview-udid)
- [`eas diagnostics`](#eas-diagnostics)
- [`eas help [COMMAND]`](#eas-help-command)
- [`eas init`](#eas-init)
- [`eas login`](#eas-login)
- [`eas logout`](#eas-logout)
- [`eas metadata:pull`](#eas-metadatapull)
- [`eas metadata:push`](#eas-metadatapush)
- [`eas project:info`](#eas-projectinfo)
- [`eas project:init`](#eas-projectinit)
- [`eas secret:create`](#eas-secretcreate)
- [`eas secret:delete`](#eas-secretdelete)
- [`eas secret:list`](#eas-secretlist)
- [`eas submit`](#eas-submit)
- [`eas update`](#eas-update)
- [`eas update:configure`](#eas-updateconfigure)
- [`eas update:delete GROUPID`](#eas-updatedelete-groupid)
- [`eas update:list`](#eas-updatelist)
- [`eas update:view GROUPID`](#eas-updateview-groupid)
- [`eas webhook:create`](#eas-webhookcreate)
- [`eas webhook:delete [ID]`](#eas-webhookdelete-id)
- [`eas webhook:list`](#eas-webhooklist)
- [`eas webhook:update`](#eas-webhookupdate)
- [`eas webhook:view ID`](#eas-webhookview-id)
- [`eas whoami`](#eas-whoami)
## `eas account:login`
@@ -100,7 +101,7 @@ ALIASES
$ eas login
```
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/account/login.ts)_
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/account/login.ts)_
## `eas account:logout`
@@ -117,7 +118,7 @@ ALIASES
$ eas logout
```
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/account/logout.ts)_
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/account/logout.ts)_
## `eas account:view`
@@ -134,7 +135,7 @@ ALIASES
$ eas whoami
```
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/account/view.ts)_
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/account/view.ts)_
## `eas analytics [STATUS]`
@@ -148,7 +149,7 @@ DESCRIPTION
display or change analytics settings
```
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/analytics.ts)_
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/analytics.ts)_
## `eas autocomplete [SHELL]`
@@ -197,7 +198,7 @@ DESCRIPTION
create a branch
```
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/branch/create.ts)_
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/branch/create.ts)_
## `eas branch:delete [NAME]`
@@ -217,7 +218,7 @@ DESCRIPTION
delete a branch
```
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/branch/delete.ts)_
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/branch/delete.ts)_
## `eas branch:list`
@@ -234,7 +235,7 @@ DESCRIPTION
list all branches
```
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/branch/list.ts)_
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/branch/list.ts)_
## `eas branch:rename`
@@ -253,7 +254,7 @@ DESCRIPTION
rename a branch
```
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/branch/rename.ts)_
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/branch/rename.ts)_
## `eas branch:view [NAME]`
@@ -273,7 +274,7 @@ DESCRIPTION
view a branch
```
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/branch/view.ts)_
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/branch/view.ts)_
## `eas build`
@@ -302,7 +303,7 @@ DESCRIPTION
start a build
```
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/build/index.ts)_
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/build/index.ts)_
## `eas build:cancel [BUILD_ID]`
@@ -316,7 +317,7 @@ DESCRIPTION
cancel a build
```
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/build/cancel.ts)_
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/build/cancel.ts)_
## `eas build:configure`
@@ -333,7 +334,7 @@ DESCRIPTION
configure the project to support EAS Build
```
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/build/configure.ts)_
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/build/configure.ts)_
## `eas build:inspect`
@@ -368,7 +369,7 @@ DESCRIPTION
inspect the state of the project at specific build stages, useful for troubleshooting
```
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/build/inspect.ts)_
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/build/inspect.ts)_
## `eas build:list`
@@ -401,7 +402,7 @@ DESCRIPTION
list all builds for your project
```
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/build/list.ts)_
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/build/list.ts)_
## `eas build:submit`
@@ -446,7 +447,7 @@ DESCRIPTION
view a build for your project
```
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/build/view.ts)_
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/build/view.ts)_
## `eas channel:create [NAME]`
@@ -466,7 +467,7 @@ DESCRIPTION
create a channel
```
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/channel/create.ts)_
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/channel/create.ts)_
## `eas channel:edit [NAME]`
@@ -487,7 +488,7 @@ DESCRIPTION
point a channel at a new branch
```
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/channel/edit.ts)_
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/channel/edit.ts)_
## `eas channel:list`
@@ -504,7 +505,7 @@ DESCRIPTION
list all channels
```
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/channel/list.ts)_
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/channel/list.ts)_
## `eas channel:view [NAME]`
@@ -524,7 +525,7 @@ DESCRIPTION
view a channel
```
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/channel/view.ts)_
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/channel/view.ts)_
## `eas config`
@@ -542,7 +543,7 @@ DESCRIPTION
display project configuration (app.json + eas.json)
```
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/config.ts)_
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/config.ts)_
## `eas credentials`
@@ -556,7 +557,7 @@ DESCRIPTION
manage credentials
```
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/credentials.ts)_
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/credentials.ts)_
## `eas device:create`
@@ -570,7 +571,7 @@ DESCRIPTION
register new Apple Devices to use for internal distribution
```
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/device/create.ts)_
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/device/create.ts)_
## `eas device:delete`
@@ -588,7 +589,7 @@ DESCRIPTION
remove a registered device from your account
```
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/device/delete.ts)_
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/device/delete.ts)_
## `eas device:list`
@@ -605,7 +606,7 @@ DESCRIPTION
list all registered devices for your account
```
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/device/list.ts)_
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/device/list.ts)_
## `eas device:view [UDID]`
@@ -619,7 +620,7 @@ DESCRIPTION
view a device for your project
```
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/device/view.ts)_
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/device/view.ts)_
## `eas diagnostics`
@@ -633,7 +634,7 @@ DESCRIPTION
display environment info
```
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/diagnostics.ts)_
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/diagnostics.ts)_
## `eas help [COMMAND]`
@@ -715,7 +716,7 @@ DESCRIPTION
generate the local store configuration from the app stores
```
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/metadata/pull.ts)_
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/metadata/pull.ts)_
## `eas metadata:push`
@@ -732,7 +733,7 @@ DESCRIPTION
sync the local store configuration to the app stores
```
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/metadata/push.ts)_
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/metadata/push.ts)_
## `eas project:info`
@@ -746,7 +747,7 @@ DESCRIPTION
information about the current project
```
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/project/info.ts)_
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/project/info.ts)_
## `eas project:init`
@@ -763,7 +764,7 @@ ALIASES
$ eas init
```
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/project/init.ts)_
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/project/init.ts)_
## `eas secret:create`
@@ -783,7 +784,7 @@ DESCRIPTION
create an environment secret on the current project or owner account
```
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/secret/create.ts)_
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/secret/create.ts)_
## `eas secret:delete`
@@ -800,7 +801,7 @@ DESCRIPTION
delete an environment secret by ID
```
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/secret/delete.ts)_
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/secret/delete.ts)_
## `eas secret:list`
@@ -814,7 +815,7 @@ DESCRIPTION
list environment secrets available for your current app
```
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/secret/list.ts)_
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/secret/list.ts)_
## `eas submit`
@@ -844,7 +845,7 @@ ALIASES
$ eas build:submit
```
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/submit.ts)_
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/submit.ts)_
## `eas update`
@@ -874,7 +875,7 @@ DESCRIPTION
publish an update group
```
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/update/index.ts)_
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/update/index.ts)_
## `eas update:configure`
@@ -891,7 +892,7 @@ DESCRIPTION
configure the project to support EAS Update
```
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/update/configure.ts)_
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/update/configure.ts)_
## `eas update:delete GROUPID`
@@ -911,7 +912,7 @@ DESCRIPTION
delete all the updates in an update group
```
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/update/delete.ts)_
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/update/delete.ts)_
## `eas update:list`
@@ -930,7 +931,7 @@ DESCRIPTION
view the recent updates for a branch
```
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/update/list.ts)_
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/update/list.ts)_
## `eas update:view GROUPID`
@@ -950,7 +951,7 @@ DESCRIPTION
update group details
```
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/update/view.ts)_
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/update/view.ts)_
## `eas webhook:create`
@@ -970,7 +971,7 @@ DESCRIPTION
create a webhook
```
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/webhook/create.ts)_
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/webhook/create.ts)_
## `eas webhook:delete [ID]`
@@ -987,7 +988,7 @@ DESCRIPTION
delete a webhook
```
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/webhook/delete.ts)_
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/webhook/delete.ts)_
## `eas webhook:list`
@@ -1004,7 +1005,7 @@ DESCRIPTION
list webhooks
```
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/webhook/list.ts)_
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/webhook/list.ts)_
## `eas webhook:update`
@@ -1025,7 +1026,7 @@ DESCRIPTION
update a webhook
```
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/webhook/update.ts)_
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/webhook/update.ts)_
## `eas webhook:view ID`
@@ -1042,7 +1043,7 @@ DESCRIPTION
view a webhook
```
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v0.54.1/packages/eas-cli/src/commands/webhook/view.ts)_
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v0.55.1/packages/eas-cli/src/commands/webhook/view.ts)_
## `eas whoami`
@@ -1058,4 +1059,5 @@ DESCRIPTION
ALIASES
$ eas whoami
```
<!-- commandsstop -->
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "eas-cli",
"description": "EAS command line tool",
"version": "0.54.1",
"version": "0.55.1",
"author": "Expo <[email protected]>",
"bin": {
"eas": "./bin/run"
@@ -14,7 +14,7 @@
"@expo/config-plugins": "4.1.4",
"@expo/config-types": "45.0.0",
"@expo/eas-build-job": "0.2.77",
"@expo/eas-json": "0.54.0",
"@expo/eas-json": "0.55.0",
"@expo/json-file": "8.2.36",
"@expo/multipart-body-parser": "1.1.0",
"@expo/pkcs12": "0.0.8",
@@ -103,7 +103,7 @@
"nock": "13.2.4",
"tempy": "0.7.0",
"ts-deepmerge": "2.0.1",
"typescript": "4.6.4"
"typescript": "4.7.4"
},
"engines": {
"node": ">=14.0.0"
+140 -163
View File
@@ -33,96 +33,152 @@
]
},
"AppleCategory": {
"enum": [
"FOOD_AND_DRINK",
"BUSINESS",
"EDUCATION",
"SOCIAL_NETWORKING",
"BOOKS",
"SPORTS",
"FINANCE",
"REFERENCE",
"GRAPHICS_AND_DESIGN",
"DEVELOPER_TOOLS",
"HEALTH_AND_FITNESS",
"MUSIC",
"WEATHER",
"TRAVEL",
"ENTERTAINMENT",
"STICKERS",
"GAMES",
"LIFESTYLE",
"MEDICAL",
"MAGAZINES_AND_NEWSPAPERS",
"UTILITIES",
"SHOPPING",
"PRODUCTIVITY",
"NEWS",
"PHOTO_AND_VIDEO",
"NAVIGATION"
]
},
"AppleSubcategory": {
"enum": [
"STICKERS_PLACES_AND_OBJECTS",
"STICKERS_EMOJI_AND_EXPRESSIONS",
"STICKERS_CELEBRATIONS",
"STICKERS_CELEBRITIES",
"STICKERS_MOVIES_AND_TV",
"STICKERS_SPORTS_AND_ACTIVITIES",
"STICKERS_EATING_AND_DRINKING",
"STICKERS_CHARACTERS",
"STICKERS_ANIMALS",
"STICKERS_FASHION",
"STICKERS_ART",
"STICKERS_GAMING",
"STICKERS_KIDS_AND_FAMILY",
"STICKERS_PEOPLE",
"STICKERS_MUSIC",
"GAMES_SPORTS",
"GAMES_WORD",
"GAMES_MUSIC",
"GAMES_ADVENTURE",
"GAMES_ACTION",
"GAMES_ROLE_PLAYING",
"GAMES_CASUAL",
"GAMES_BOARD",
"GAMES_TRIVIA",
"GAMES_CARD",
"GAMES_PUZZLE",
"GAMES_CASINO",
"GAMES_STRATEGY",
"GAMES_SIMULATION",
"GAMES_RACING",
"GAMES_FAMILY"
]
},
"AppleIdfa": {
"description": "Identifier for Advertisers",
"type": "object",
"additionalProperties": false,
"type": "array",
"description": "App Store categories for the app, can add up to two categories. The first item in this list is the primary category, the second is the secondary and optional category. `STICKERS` and `GAMES` categories can add up to two additional subcategories, written as nested array.",
"markdownDescription": "App Store categories for the app, can add up to two categories. The first item in this list is the primary category, the second is the secondary and optional category. `STICKERS` and `GAMES` categories can add up to two additional subcategories, written as nested array. E.g.\n\n- `[\"SPORTS\"]`\n- `[\"SPORTS\", \"LIFESTYLE\"]`\n- `[[\"GAMES\", \"GAMES_CARD\"], \"ENTERTAINMENT\"]`\n- `[\"GAMES\", \"WEATHER\"]`",
"minItems": 1,
"maxItems": 2,
"uniqueItems": true,
"defaultSnippets": [
{
"body": {
"servesAds": false,
"attributesAppInstallationToPreviousAd": false,
"attributesActionWithPreviousAd": false,
"honorsLimitedAdTracking": false
}
"label": "Basic categories",
"description": "Add two simple categories",
"body": [
"$1",
"$2"
]
},
{
"label": "Category with subcategories",
"description": "Add a category containing subcategories",
"body": [
[
"${1|GAMES,STICKERS|}",
"$3",
"$4"
]
]
}
],
"properties": {
"servesAds": {
"type": "boolean"
"items": {
"oneOf": [
{
"$ref": "#/definitions/apple/AppleCategory/categories/root"
},
{
"$ref": "#/definitions/apple/AppleCategory/categories/parent"
},
{
"type": "array",
"description": "The GAMES category can have additional subcategories",
"minItems": 1,
"maxItems": 3,
"uniqueItems": true,
"items": [
{
"const": "GAMES"
},
{
"$ref": "#/definitions/apple/AppleCategory/categories/games"
},
{
"$ref": "#/definitions/apple/AppleCategory/categories/games"
}
]
},
{
"type": "array",
"description": "The STICKERS category can have additional subcategories",
"minItems": 1,
"maxItems": 3,
"uniqueItems": true,
"items": [
{
"const": "STICKERS"
},
{
"$ref": "#/definitions/apple/AppleCategory/categories/stickers"
},
{
"$ref": "#/definitions/apple/AppleCategory/categories/stickers"
}
]
}
]
},
"categories": {
"root": {
"enum": [
"BUSINESS",
"SOCIAL_NETWORKING",
"MEDICAL",
"FOOD_AND_DRINK",
"EDUCATION",
"BOOKS",
"SPORTS",
"FINANCE",
"REFERENCE",
"GRAPHICS_AND_DESIGN",
"DEVELOPER_TOOLS",
"HEALTH_AND_FITNESS",
"MUSIC",
"WEATHER",
"TRAVEL",
"ENTERTAINMENT",
"LIFESTYLE",
"MAGAZINES_AND_NEWSPAPERS",
"UTILITIES",
"SHOPPING",
"PRODUCTIVITY",
"NEWS",
"PHOTO_AND_VIDEO",
"NAVIGATION"
]
},
"attributesAppInstallationToPreviousAd": {
"type": "boolean"
"parent": {
"enum": [
"GAMES",
"STICKERS"
]
},
"attributesActionWithPreviousAd": {
"type": "boolean"
"games": {
"enum": [
"GAMES_SPORTS",
"GAMES_WORD",
"GAMES_MUSIC",
"GAMES_ADVENTURE",
"GAMES_ACTION",
"GAMES_ROLE_PLAYING",
"GAMES_CASUAL",
"GAMES_BOARD",
"GAMES_TRIVIA",
"GAMES_CARD",
"GAMES_PUZZLE",
"GAMES_CASINO",
"GAMES_STRATEGY",
"GAMES_SIMULATION",
"GAMES_RACING",
"GAMES_FAMILY"
]
},
"honorsLimitedAdTracking": {
"type": "boolean"
"stickers": {
"enum": [
"STICKERS_PLACES_AND_OBJECTS",
"STICKERS_EMOJI_AND_EXPRESSIONS",
"STICKERS_CELEBRATIONS",
"STICKERS_CELEBRITIES",
"STICKERS_MOVIES_AND_TV",
"STICKERS_SPORTS_AND_ACTIVITIES",
"STICKERS_EATING_AND_DRINKING",
"STICKERS_CHARACTERS",
"STICKERS_ANIMALS",
"STICKERS_FASHION",
"STICKERS_ART",
"STICKERS_GAMING",
"STICKERS_KIDS_AND_FAMILY",
"STICKERS_PEOPLE",
"STICKERS_MUSIC"
]
}
}
},
@@ -554,79 +610,7 @@
"$ref": "#/definitions/apple/AppleAdvisory"
},
"categories": {
"type": "array",
"maxItems": 2,
"description": "App Store categories for the app. Can add up to two categories. STICKERS and GAMES categories can add an additional subcategory.",
"items": {
"anyOf": [
{
"$ref": "#/definitions/apple/AppleCategory"
},
{
"type": "array",
"maxItems": 2,
"items": [
{
"enum": [
"GAMES"
]
},
{
"enum": [
"GAMES_SPORTS",
"GAMES_WORD",
"GAMES_MUSIC",
"GAMES_ADVENTURE",
"GAMES_ACTION",
"GAMES_ROLE_PLAYING",
"GAMES_CASUAL",
"GAMES_BOARD",
"GAMES_TRIVIA",
"GAMES_CARD",
"GAMES_PUZZLE",
"GAMES_CASINO",
"GAMES_STRATEGY",
"GAMES_SIMULATION",
"GAMES_RACING",
"GAMES_FAMILY"
]
}
],
"additionalItems": false
},
{
"type": "array",
"maxItems": 2,
"items": [
{
"enum": [
"STICKERS"
]
},
{
"enum": [
"STICKERS_PLACES_AND_OBJECTS",
"STICKERS_EMOJI_AND_EXPRESSIONS",
"STICKERS_CELEBRATIONS",
"STICKERS_CELEBRITIES",
"STICKERS_MOVIES_AND_TV",
"STICKERS_SPORTS_AND_ACTIVITIES",
"STICKERS_EATING_AND_DRINKING",
"STICKERS_CHARACTERS",
"STICKERS_ANIMALS",
"STICKERS_FASHION",
"STICKERS_ART",
"STICKERS_GAMING",
"STICKERS_KIDS_AND_FAMILY",
"STICKERS_PEOPLE",
"STICKERS_MUSIC"
]
}
],
"additionalItems": false
}
]
}
"$ref": "#/definitions/apple/AppleCategory"
},
"copyright": {
"type": "string",
@@ -642,9 +626,6 @@
"storeInfo": "The name of the person or entity that owns the exclusive rights to your app, preceded by the year the rights were obtained (for example, \"2008 Acme Inc.\"). Do not provide a URL."
}
},
"idfa": {
"$ref": "#/definitions/apple/AppleIdfa"
},
"info": {
"description": "Localized core app info",
"type": "object",
@@ -986,10 +967,6 @@
"review": {
"$ref": "#/definitions/apple/AppleReview",
"description": "Info for the App Store reviewer"
},
"priceTier": {
"type": "number",
"description": "App price tier. 0 is Free."
}
}
}
@@ -1,17 +1,17 @@
import { fixArchiveUrl } from '../uploads';
import { fixS3Url } from '../uploads';
describe(fixArchiveUrl, () => {
describe(fixS3Url, () => {
it('fixes broken links', () => {
const input =
'https://submission-service-archives.s3.amazonaws.com/production%2Fdc98ca84-1473-4cb3-ae81-8c7b291cb27e%2F4424aa95-b985-4e2f-8755-9507b1037c1c';
const expectedOutput =
'https://submission-service-archives.s3.amazonaws.com/production/dc98ca84-1473-4cb3-ae81-8c7b291cb27e/4424aa95-b985-4e2f-8755-9507b1037c1c';
expect(fixArchiveUrl(input)).toBe(expectedOutput);
expect(fixS3Url(input)).toBe(expectedOutput);
});
it('does not change correct urls', () => {
const correctUrl =
'https://submission-service-archives.s3.amazonaws.com/production/dc98ca84-1473-4cb3-ae81-8c7b291cb27e/4424aa95-b985-4e2f-8755-9507b1037c1c';
expect(fixArchiveUrl(correctUrl)).toBe(correctUrl);
expect(fixS3Url(correctUrl)).toBe(correctUrl);
});
});
@@ -443,7 +443,11 @@ export default class UpdatePublish extends EasCommand {
const assets = await collectAssetsAsync({ inputDir: inputDir!, platforms });
const { uniqueUploadedAssetCount } = await uploadAssetsAsync(
assets,
spinnerText => (assetSpinner.text = `Uploading assets... ${spinnerText}`)
(totalAssets, missingAssets) => {
assetSpinner.text = `Uploading assets. Finished (${
totalAssets - missingAssets
}/${totalAssets})`;
}
);
uploadedAssetCount = uniqueUploadedAssetCount;
unsortedUpdateInfoGroups = await buildUnsortedUpdateInfoGroupAsync(assets, exp);
+11
View File
@@ -0,0 +1,11 @@
export default {
/**
* Dangerous overrides, use only if you know what you are doing
*/
/**
* Overrides applicationId from Android project, setting this option will also
* ignore failures when parsing build.gradle.
*/
overrideAndroidApplicationId: process.env.EAS_DANGEROUS_OVERRIDE_ANDROID_APPLICATION_ID,
};
@@ -1,23 +1,37 @@
import { AppCategory, AppInfo, BundleIdPlatform } from '@expo/apple-utils';
import { AppCategory, AppCategoryId, AppSubcategoryId, BundleIdPlatform } from '@expo/apple-utils';
import { AttributesOf } from '../../../../utils/asc';
import { AppleConfigWriter } from '../../writer';
export const primaryOnlyCategory: Pick<AttributesOf<AppInfo>, 'primaryCategory'> = {
primaryCategory: new AppCategory({} as any, 'ENTERTAINMENT', {
/** Infered type of the AppleConfigWriter.setCategories attributes */
type CategoryInfoProps = Parameters<typeof AppleConfigWriter.prototype.setCategories>[0];
/**
* Export a factory method instead of fixed categories.
* In the tests, we need to create a couple of different categories,
* adding them here as fixed objects won't be readable.
*/
export function makeCategory(id?: AppCategoryId | AppSubcategoryId): AppCategory | undefined {
if (!id) {
return undefined;
}
return new AppCategory({} as any, id, {
platforms: [BundleIdPlatform.IOS, BundleIdPlatform.MAC_OS],
}),
};
});
}
export const secondaryOnlyCategory: Pick<AttributesOf<AppInfo>, 'secondaryCategory'> = {
secondaryCategory: new AppCategory({} as any, 'GAMES', {
platforms: [BundleIdPlatform.IOS, BundleIdPlatform.MAC_OS],
}),
};
export const primaryAndSecondaryCategory: Pick<
AttributesOf<AppInfo>,
'primaryCategory' | 'secondaryCategory'
> = {
...primaryOnlyCategory,
...secondaryOnlyCategory,
};
/**
* Export a helper method to create the AppInfo object, using only AppCategoryIds or AppSubcategoryId.
*/
export function makeCategoryInfo(
attributes: Partial<Record<keyof CategoryInfoProps, AppCategoryId | AppSubcategoryId>>
): CategoryInfoProps {
return {
primaryCategory: makeCategory(attributes.primaryCategory),
primarySubcategoryOne: makeCategory(attributes.primarySubcategoryOne),
primarySubcategoryTwo: makeCategory(attributes.primarySubcategoryTwo),
secondaryCategory: makeCategory(attributes.secondaryCategory),
secondarySubcategoryOne: makeCategory(attributes.secondarySubcategoryOne),
secondarySubcategoryTwo: makeCategory(attributes.secondarySubcategoryTwo),
};
}
@@ -1,7 +1,73 @@
import { AppCategoryId, AppSubcategoryId } from '@expo/apple-utils';
import { AppleConfigReader } from '../reader';
import { leastRestrictiveAdvisory, mostRestrictiveAdvisory } from './fixtures/ageRatingDeclaration';
describe('setAgeRating', () => {
describe('getCategories', () => {
it('ignores categories when not set', () => {
const reader = new AppleConfigReader({ categories: undefined });
expect(reader.getCategories()).toBeNull();
});
it('returns primary category only', () => {
const reader = new AppleConfigReader({ categories: [AppCategoryId.ENTERTAINMENT] });
expect(reader.getCategories()).toMatchObject({
primaryCategory: AppCategoryId.ENTERTAINMENT,
secondaryCategory: undefined,
});
});
it('returns primary and secondary categories', () => {
const reader = new AppleConfigReader({
categories: [AppCategoryId.ENTERTAINMENT, AppCategoryId.FOOD_AND_DRINK],
});
expect(reader.getCategories()).toMatchObject({
primaryCategory: AppCategoryId.ENTERTAINMENT,
secondaryCategory: AppCategoryId.FOOD_AND_DRINK,
});
});
it('returns primary category without subcategory', () => {
const reader = new AppleConfigReader({ categories: [AppCategoryId.GAMES] });
expect(reader.getCategories()).toMatchObject({
primaryCategory: AppCategoryId.GAMES,
secondaryCategory: undefined,
});
});
it('returns primary category with two subcategories', () => {
const reader = new AppleConfigReader({
categories: [
[AppCategoryId.GAMES, AppSubcategoryId.GAMES_CARD, AppSubcategoryId.GAMES_ADVENTURE],
],
});
expect(reader.getCategories()).toMatchObject({
primaryCategory: AppCategoryId.GAMES,
primarySubcategoryOne: AppSubcategoryId.GAMES_CARD,
primarySubcategoryTwo: AppSubcategoryId.GAMES_ADVENTURE,
secondaryCategory: undefined,
});
});
it('returns primary and secondary categories with two subcategories', () => {
const reader = new AppleConfigReader({
categories: [
AppCategoryId.ENTERTAINMENT,
[AppCategoryId.GAMES, AppSubcategoryId.GAMES_CARD, AppSubcategoryId.GAMES_ADVENTURE],
],
});
expect(reader.getCategories()).toMatchObject({
primaryCategory: AppCategoryId.ENTERTAINMENT,
secondaryCategory: AppCategoryId.GAMES,
secondarySubcategoryOne: AppSubcategoryId.GAMES_CARD,
secondarySubcategoryTwo: AppSubcategoryId.GAMES_ADVENTURE,
});
expect(reader.getCategories()).not.toHaveProperty('primarySubcategoryOne');
expect(reader.getCategories()).not.toHaveProperty('primarySubcategoryTwo');
});
});
describe('getAgeRating', () => {
it('ignores advisory when not set', () => {
const reader = new AppleConfigReader({ advisory: undefined });
expect(reader.getAgeRating()).toBeNull();
@@ -1,3 +1,5 @@
import { AppCategoryId, AppSubcategoryId } from '@expo/apple-utils';
import { AppleConfigWriter } from '../writer';
import {
emptyAdvisory,
@@ -5,7 +7,7 @@ import {
leastRestrictiveAdvisory,
mostRestrictiveAdvisory,
} from './fixtures/ageRatingDeclaration';
import { primaryAndSecondaryCategory, secondaryOnlyCategory } from './fixtures/appInfo';
import { makeCategoryInfo } from './fixtures/appInfo';
import { dutchInfo, englishInfo } from './fixtures/appInfoLocalization';
import { nameAndDemoReviewDetails, nameOnlyReviewDetails } from './fixtures/appStoreReviewDetail';
import { automaticRelease, manualRelease, scheduledRelease } from './fixtures/appStoreVersion';
@@ -73,22 +75,109 @@ describe('setInfoLocale', () => {
});
describe('setCategories', () => {
it('modifies the categories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(primaryAndSecondaryCategory as any);
expect(writer.schema.categories).toHaveLength(2);
expect((writer.schema.categories as any)[0]).toBe(
primaryAndSecondaryCategory.primaryCategory?.id
);
expect((writer.schema.categories as any)[1]).toBe(
primaryAndSecondaryCategory.secondaryCategory?.id
);
});
it('skips secondary category without primary category', () => {
const writer = new AppleConfigWriter();
writer.setCategories(secondaryOnlyCategory as any);
expect(writer.schema.categories).toHaveLength(0);
writer.setCategories(makeCategoryInfo({}));
expect(writer.schema.categories).toBeUndefined();
});
it('removes existing values when undefined', () => {
const writer = new AppleConfigWriter();
writer.setCategories(makeCategoryInfo({ primaryCategory: AppCategoryId.BUSINESS }));
writer.setCategories(makeCategoryInfo({}));
expect(writer.schema.categories).toBeUndefined();
});
it('modifies primary category only', () => {
const writer = new AppleConfigWriter();
writer.setCategories(makeCategoryInfo({ primaryCategory: AppCategoryId.ENTERTAINMENT }));
expect(writer.schema.categories).toEqual([AppCategoryId.ENTERTAINMENT]);
});
it('modifies primary and secondary categories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(
makeCategoryInfo({
primaryCategory: AppCategoryId.ENTERTAINMENT,
secondaryCategory: AppCategoryId.FOOD_AND_DRINK,
})
);
expect(writer.schema.categories).toEqual([
AppCategoryId.ENTERTAINMENT,
AppCategoryId.FOOD_AND_DRINK,
]);
});
it('modifies primary category without subcategories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(makeCategoryInfo({ primaryCategory: AppCategoryId.GAMES }));
expect(writer.schema.categories).toEqual([AppCategoryId.GAMES]);
});
it('modifies primary category with one subcategories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(
makeCategoryInfo({
primaryCategory: AppCategoryId.GAMES,
primarySubcategoryOne: AppSubcategoryId.GAMES_CARD,
})
);
expect(writer.schema.categories).toEqual([[AppCategoryId.GAMES, AppSubcategoryId.GAMES_CARD]]);
// We need to filter the lists to avoid writing `[GAMES, GAMES_CARD, null]`
expect(writer.schema.categories![0]).toHaveLength(2);
});
it('modifies primary category with two subcategories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(
makeCategoryInfo({
primaryCategory: AppCategoryId.GAMES,
primarySubcategoryOne: AppSubcategoryId.GAMES_CARD,
primarySubcategoryTwo: AppSubcategoryId.GAMES_ADVENTURE,
})
);
expect(writer.schema.categories).toEqual([
[AppCategoryId.GAMES, AppSubcategoryId.GAMES_CARD, AppSubcategoryId.GAMES_ADVENTURE],
]);
});
it('modifies primary and secondary categories with one subcategories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(
makeCategoryInfo({
primaryCategory: AppCategoryId.ENTERTAINMENT,
secondaryCategory: AppCategoryId.GAMES,
secondarySubcategoryOne: AppSubcategoryId.GAMES_CARD,
})
);
expect(writer.schema.categories).toEqual([
AppCategoryId.ENTERTAINMENT,
[AppCategoryId.GAMES, AppSubcategoryId.GAMES_CARD],
]);
// We need to filter the lists to avoid writing `[GAMES, GAMES_CARD, null]`
expect(writer.schema.categories![1]).toHaveLength(2);
});
it('modifies primary and secondary categories with two subcategories', () => {
const writer = new AppleConfigWriter();
writer.setCategories(
makeCategoryInfo({
primaryCategory: AppCategoryId.ENTERTAINMENT,
secondaryCategory: AppCategoryId.GAMES,
secondarySubcategoryOne: AppSubcategoryId.GAMES_CARD,
secondarySubcategoryTwo: AppSubcategoryId.GAMES_ADVENTURE,
})
);
expect(writer.schema.categories).toEqual([
AppCategoryId.ENTERTAINMENT,
[AppCategoryId.GAMES, AppSubcategoryId.GAMES_CARD, AppSubcategoryId.GAMES_ADVENTURE],
]);
});
it('modifies secondary category without primary', () => {
const writer = new AppleConfigWriter();
writer.setCategories(makeCategoryInfo({ secondaryCategory: AppCategoryId.GAMES }));
expect(writer.schema.categories).toEqual(['', AppCategoryId.GAMES]);
});
});
@@ -78,14 +78,33 @@ export class AppleConfigReader {
}
public getCategories(): CategoryIds | null {
if (Array.isArray(this.schema.categories) && this.schema.categories.length > 0) {
return {
primaryCategory: this.schema.categories[0],
secondaryCategory: this.schema.categories[1],
};
const { categories } = this.schema;
if (!categories || categories.length <= 0) {
return null;
}
return null;
// We validate the categories based on enums, but they will still be strings here.
const categoryIds: Partial<Record<keyof CategoryIds, string>> = {};
if (Array.isArray(categories[0])) {
categoryIds.primaryCategory = categories[0][0];
categoryIds.primarySubcategoryOne = categories[0][1];
categoryIds.primarySubcategoryTwo = categories[0][2];
} else {
categoryIds.primaryCategory = categories[0];
}
if (Array.isArray(categories[1])) {
categoryIds.secondaryCategory = categories[1][0];
categoryIds.secondarySubcategoryOne = categories[1][1];
categoryIds.secondarySubcategoryTwo = categories[1][2];
} else {
categoryIds.secondaryCategory = categories[1];
}
// Because we handle categories as normal strings,
// the type doesn't match with the actual CategoryIds types.
return categoryIds as CategoryIds;
}
/** Get the `AppStoreVersion` object. */
@@ -64,15 +64,44 @@ export class AppleConfigWriter {
};
}
public setCategories({ primaryCategory, secondaryCategory }: AttributesOf<AppInfo>): void {
public setCategories(
attributes: Pick<
AttributesOf<AppInfo>,
| 'primaryCategory'
| 'primarySubcategoryOne'
| 'primarySubcategoryTwo'
| 'secondaryCategory'
| 'secondarySubcategoryOne'
| 'secondarySubcategoryTwo'
>
): void {
this.schema.categories = undefined;
if (!attributes.primaryCategory && !attributes.secondaryCategory) {
return;
}
this.schema.categories = [];
// TODO: see why these types are conflicting
if (primaryCategory) {
this.schema.categories.push(primaryCategory.id as any);
if (secondaryCategory) {
this.schema.categories.push(secondaryCategory.id as any);
}
if (attributes.primaryCategory && attributes.primarySubcategoryOne) {
this.schema.categories[0] = [
attributes.primaryCategory.id,
attributes.primarySubcategoryOne?.id,
attributes.primarySubcategoryTwo?.id,
].filter(Boolean) as string[];
} else {
// If only the secondaryCategory was provided,
// autofill with an empty string and cause a store config error.
this.schema.categories[0] = attributes.primaryCategory?.id ?? '';
}
if (attributes.secondaryCategory && attributes.secondarySubcategoryOne) {
this.schema.categories[1] = [
attributes.secondaryCategory.id,
attributes.secondarySubcategoryOne?.id,
attributes.secondarySubcategoryTwo?.id,
].filter(Boolean) as string[];
} else if (attributes.secondaryCategory) {
this.schema.categories[1] = attributes.secondaryCategory.id;
}
}
+4 -6
View File
@@ -1,11 +1,11 @@
import type { AgeRatingDeclarationProps, AppCategoryId, AppSubcategoryId } from '@expo/apple-utils';
import type { AgeRatingDeclarationProps } from '@expo/apple-utils';
export type AppleLocale = string;
export interface AppleMetadata {
copyright?: string;
info?: Record<AppleLocale, AppleInfo>;
categories?: AppCategoryId[] | AppleCategory;
categories?: AppleCategory;
release?: AppleRelease;
advisory?: AppleAdvisory;
preview?: Record<string, string[]>;
@@ -14,10 +14,8 @@ export interface AppleMetadata {
export type AppleAdvisory = Partial<AgeRatingDeclarationProps>;
export interface AppleCategory {
category: AppCategoryId;
subcategory?: AppSubcategoryId[];
}
/** Apps can define up to two categories, or categories with up to two subcategories */
export type AppleCategory = (string | string[])[];
export interface AppleRelease {
isPhasedReleaseEnabled?: boolean;
@@ -9,7 +9,6 @@ import { PublishMutation } from '../../graphql/mutations/PublishMutation';
import { PublishQuery } from '../../graphql/queries/PublishQuery';
import {
MetadataJoi,
TIMEOUT_LIMIT,
buildUnsortedUpdateInfoGroupAsync,
collectAssetsAsync,
convertAssetToUpdateInfoGroupFormatAsync,
@@ -412,38 +411,6 @@ describe(uploadAssetsAsync, () => {
return { specifications: ['{}', '{}', '{}'] };
});
// beforeEach(() => {
// jest.useFakeTimers();
// });
it('throws an error if the upload exceeds TIMEOUT_LIMIT', async () => {
jest.spyOn(PublishQuery, 'getAssetMetadataAsync').mockImplementation(async () => {
const status = AssetMetadataStatus.DoesNotExist;
mockdate.set(Date.now() + TIMEOUT_LIMIT + 1);
jest.runAllTimers();
return [
{
storageKey: 'qbgckgkgfdjnNuf9dQd7FDTWUmlEEzg7l1m1sKzQaq0',
status,
__typename: 'AssetMetadataResult',
}, // userDefinedAsset
{
storageKey: 'bbjgXFSIXtjviGwkaPFY0HG4dVVIGiXHAboRFQEqVa4',
status,
__typename: 'AssetMetadataResult',
}, // android.code
{
storageKey: 'dP-nC8EJXKz42XKh_Rc9tYxiGAT-ilpkRltEi6HIKeQ',
status,
__typename: 'AssetMetadataResult',
}, // ios.code
];
});
mockdate.set(0);
await expect(uploadAssetsAsync(assetsForUpdateInfoGroup)).rejects.toThrow(
'Asset upload timed out. Please try again.'
);
});
it('resolves if the assets are already uploaded', async () => {
jest.spyOn(PublishQuery, 'getAssetMetadataAsync').mockImplementation(async () => {
const status = AssetMetadataStatus.Exists;
@@ -530,15 +497,15 @@ describe(uploadAssetsAsync, () => {
}, // ios.code
];
});
const updateSpinnerFn = jest.fn(_text => {});
const updateSpinnerFn = jest.fn((_totalAssets, _missingAssets) => {});
mockdate.set(0);
await uploadAssetsAsync(assetsForUpdateInfoGroup, updateSpinnerFn);
const calls = updateSpinnerFn.mock.calls;
expect(calls).toEqual([
['6 assets present'],
['3 unique assets found'],
['2 new assets uploading'],
[3, 3],
[3, 2],
[3, 0],
]);
});
});
@@ -7,6 +7,7 @@ import fs from 'fs-extra';
import nullthrows from 'nullthrows';
import { readAppJson } from '../../build/utils/appJson';
import env from '../../env';
import Log, { learnMore } from '../../log';
import { getProjectConfigDescription, getUsername } from '../../project/projectUtils';
import { promptAsync } from '../../prompts';
@@ -43,6 +44,9 @@ export async function getApplicationIdFromBareAsync(
projectDir: string,
gradleContext?: GradleBuildContext
): Promise<string> {
if (env.overrideAndroidApplicationId) {
return env.overrideAndroidApplicationId;
}
const errorMessage = 'Could not read applicationId from Android project.';
if (gradleContext) {
+12 -18
View File
@@ -15,8 +15,6 @@ import { uploadWithPresignedPostAsync } from '../uploads';
import { expoCommandAsync } from '../utils/expoCli';
import uniqBy from '../utils/expodash/uniqBy';
export const TIMEOUT_LIMIT = 60_000; // 1 minute
export type PublishPlatform = Extract<'android' | 'ios', Platform>;
type Metadata = {
version: number;
@@ -255,7 +253,7 @@ type AssetUploadResult = {
export async function uploadAssetsAsync(
assetsForUpdateInfoGroup: CollectedAssets,
updateSpinnerText?: (updatedText: string) => void
updateSpinnerText?: (totalAssets: number, missingAssets: number) => void
): Promise<AssetUploadResult> {
let assets: RawAsset[] = [];
let platform: keyof CollectedAssets;
@@ -266,7 +264,6 @@ export async function uploadAssetsAsync(
...assetsForUpdateInfoGroup[platform]!.assets,
];
}
updateSpinnerText?.(`${assets.length} ${assets.length === 1 ? 'asset' : 'assets'} present`);
const assetsWithStorageKey = await Promise.all(
assets.map(async asset => {
@@ -281,9 +278,10 @@ export async function uploadAssetsAsync(
storageKey: string;
}
>(assetsWithStorageKey, asset => asset.storageKey);
updateSpinnerText?.(
`${uniqueAssets.length} unique ${uniqueAssets.length === 1 ? 'asset' : 'assets'} found`
);
const totalAssets = uniqueAssets.length;
updateSpinnerText?.(totalAssets, totalAssets);
let missingAssets = await filterOutAssetsThatAlreadyExistAsync(uniqueAssets);
const uniqueUploadedAssetCount = missingAssets.length;
@@ -291,32 +289,28 @@ export async function uploadAssetsAsync(
missingAssets.map(ma => ma.contentType)
);
updateSpinnerText?.(totalAssets, missingAssets.length);
const assetUploadPromiseLimit = promiseLimit(15);
await Promise.all(
missingAssets.map((missingAsset, i) => {
assetUploadPromiseLimit(async () => {
const presignedPost: PresignedPost = JSON.parse(specifications[i]);
return uploadWithPresignedPostAsync(missingAsset.path, presignedPost);
await uploadWithPresignedPostAsync(missingAsset.path, presignedPost);
});
})
);
updateSpinnerText?.(
`${missingAssets.length} new ${missingAssets.length === 1 ? 'asset' : 'assets'} uploading`
);
// Wait up to TIMEOUT_LIMIT for assets to be uploaded and processed
const start = Date.now();
let timeout = 1;
while (missingAssets.length > 0) {
const timeoutPromise = new Promise(resolve => setTimeout(resolve, timeout * 1000)); // linear backoff
const timeoutPromise = new Promise(resolve =>
setTimeout(resolve, Math.min(timeout * 1000, 5000))
); // linear backoff
missingAssets = await filterOutAssetsThatAlreadyExistAsync(missingAssets);
await timeoutPromise; // await after filterOutAssetsThatAlreadyExistAsync for easy mocking with jest.runAllTimers
timeout += 1;
if (Date.now() - start > TIMEOUT_LIMIT) {
throw new Error('Asset upload timed out. Please try again.');
}
updateSpinnerText?.(totalAssets, missingAssets.length);
}
return {
assetCount: assets.length,
+15 -12
View File
@@ -9,23 +9,26 @@ export async function resolveWorkflowAsync(
projectDir: string,
platform: Platform
): Promise<Workflow> {
let platformWorkflowMarker;
let platformWorkflowMarkers: string[];
try {
platformWorkflowMarker =
platformWorkflowMarkers =
platform === Platform.ANDROID
? await AndroidConfig.Paths.getAndroidManifestAsync(projectDir)
: IOSConfig.Paths.getPBXProjectPath(projectDir);
? [
path.join(projectDir, 'android/app/build.gradle'),
await AndroidConfig.Paths.getAndroidManifestAsync(projectDir),
]
: [IOSConfig.Paths.getPBXProjectPath(projectDir)];
} catch {
return Workflow.MANAGED;
}
if (await fs.pathExists(platformWorkflowMarker)) {
return (await getVcsClient().isFileIgnoredAsync(
path.relative(projectDir, platformWorkflowMarker)
))
? Workflow.MANAGED
: Workflow.GENERIC;
} else {
return Workflow.MANAGED;
for (const marker of platformWorkflowMarkers) {
if (
(await fs.pathExists(marker)) &&
!(await getVcsClient().isFileIgnoredAsync(path.relative(projectDir, marker)))
) {
return Workflow.GENERIC;
}
}
return Workflow.MANAGED;
}
@@ -242,6 +242,7 @@ describe(getArchiveAsync, () => {
it('handles path source', async () => {
const path = '/archive.apk';
await fs.writeFile(path, 'some content');
jest.mocked(uploadAsync).mockResolvedValueOnce({ url: ARCHIVE_URL, bucketKey: 'wat' });
const archive = await getArchiveAsync({
+13 -6
View File
@@ -1,6 +1,8 @@
import assert from 'assert';
import FormData from 'form-data';
import fs from 'fs-extra';
import { Response } from 'node-fetch';
import nullthrows from 'nullthrows';
import { URL } from 'url';
import fetch from './fetch';
@@ -14,8 +16,14 @@ export async function uploadAsync(
handleProgressEvent: ProgressHandler
): Promise<{ url: string; bucketKey: string }> {
const presignedPost = await UploadSessionMutation.createUploadSessionAsync(type);
const url = await uploadWithPresignedPostAsync(path, presignedPost, handleProgressEvent);
assert(presignedPost.fields.key, 'key is not specified in in presigned post');
const response = await uploadWithPresignedPostAsync(path, presignedPost, handleProgressEvent);
const location = nullthrows(
response.headers.get('location'),
`location does not exist in response headers (make sure you're uploading to AWS S3)`
);
const url = fixS3Url(location);
return { url, bucketKey: presignedPost.fields.key };
}
@@ -23,7 +31,7 @@ export async function uploadWithPresignedPostAsync(
file: string,
presignedPost: PresignedPost,
handleProgressEvent?: ProgressHandler
): Promise<string> {
): Promise<Response> {
const fileStat = await fs.stat(file);
const fileSize = fileStat.size;
const form = new FormData();
@@ -55,14 +63,13 @@ export async function uploadWithPresignedPostAsync(
try {
const response = await uploadPromise;
handleProgressEvent({ isComplete: true });
return fixArchiveUrl(String(response.headers.get('location')));
return response;
} catch (error: any) {
handleProgressEvent({ isComplete: true, error });
throw error;
}
} else {
const response = await uploadPromise;
return fixArchiveUrl(String(response.headers.get('location')));
return await uploadPromise;
}
}
@@ -71,7 +78,7 @@ export async function uploadWithPresignedPostAsync(
* https://submission-service-archives.s3.amazonaws.com/production%2Fdc98ca84-1473-4cb3-ae81-8c7b291cb27e%2F4424aa95-b985-4e2f-8755-9507b1037c1c
* This function replaces %2F with /.
*/
export function fixArchiveUrl(archiveUrl: string): string {
export function fixS3Url(archiveUrl: string): string {
const parsed = new URL(archiveUrl);
parsed.pathname = decodeURIComponent(parsed.pathname);
return parsed.toString();
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@expo/eas-json",
"description": "A library for interacting with eas.json",
"version": "0.54.0",
"version": "0.55.0",
"author": "Expo <[email protected]>",
"bugs": "https://github.com/expo/eas-cli/issues",
"dependencies": {
@@ -18,7 +18,7 @@
"devDependencies": {
"@types/fs-extra": "9.0.13",
"memfs": "3.4.3",
"typescript": "4.6.4"
"typescript": "4.7.4"
},
"engines": {
"node": ">=14.0.0"
+1 -1
View File
@@ -34,7 +34,7 @@ function resolveProfile({
profileName: string;
depth?: number;
}): EasJsonBuildProfileResolved {
if (depth >= 2) {
if (depth >= 5) {
throw new Error(
'Too long chain of profile extensions, make sure "extends" keys do not make a cycle'
);
File renamed without changes.
+9 -8
View File
@@ -1,33 +1,34 @@
{
"name": "scripts",
"private": true,
"type": "module",
"version": "0.31.0",
"scripts": {
"changelog-entry": "ts-node src/changelogEntry.ts",
"release-changelog": "ts-node src/releaseChangelog.ts",
"update-local-plugin": "./src/updateLocalPlugin.sh"
"changelog-entry": "ts-node-esm src/changelogEntry.ts",
"release-changelog": "ts-node-esm src/releaseChangelog.ts",
"update-local-plugin": "./src/updateLocalPlugin.sh",
"typecheck": "tsc"
},
"author": "Expo <[email protected]>",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
"node": ">=14.16"
},
"dependencies": {
"dateformat": "4.5.1",
"fs-extra": "10.1.0",
"lodash": "4.17.21",
"lodash-es": "4.17.21",
"marked": "3.0.4",
"nullthrows": "1.1.1",
"semver": "7.3.7",
"tslib": "2.4.0"
},
"devDependencies": {
"@types/dateformat": "3.0.1",
"@types/fs-extra": "9.0.13",
"@types/lodash": "4.14.182",
"@types/lodash-es": "4.17.6",
"@types/node": "17.0.32",
"@types/semver": "7.3.9",
"ts-node": "10.7.0",
"typescript": "4.6.4"
"typescript": "4.7.4"
}
}
+2 -2
View File
@@ -1,4 +1,4 @@
import path from 'path';
import { URL } from 'node:url';
export enum EntryCategory {
BreakingChange = 'breaking-change',
@@ -7,7 +7,7 @@ export enum EntryCategory {
Chore = 'chore',
}
export const CHANGELOG_PATH = path.join(__dirname, '../../../CHANGELOG.md');
export const CHANGELOG_PATH = new URL('../../../CHANGELOG.md', import.meta.url);
export const CATEGORY_HEADERS: Record<EntryCategory, string> = {
[EntryCategory.BreakingChange]: '🛠 Breaking changes',
+2 -2
View File
@@ -1,7 +1,7 @@
import fs from 'fs-extra';
import * as markdown from '../markdown';
import { CHANGELOG_PATH } from './consts';
import * as markdown from '../markdown.js';
import { CHANGELOG_PATH } from './consts.js';
export async function readAndParseChangelogAsync(): Promise<markdown.Tokens> {
const contents = await fs.readFile(CHANGELOG_PATH, 'utf8');
+4 -5
View File
@@ -1,8 +1,7 @@
import nullthrows from 'nullthrows';
import { CATEGORY_HEADERS, EntryCategory } from './changelog/consts';
import { readAndParseChangelogAsync, writeChangelogAsync } from './changelog/file';
import * as markdown from './markdown';
import { CATEGORY_HEADERS, EntryCategory } from './changelog/consts.js';
import { readAndParseChangelogAsync, writeChangelogAsync } from './changelog/file.js';
import * as markdown from './markdown.js';
import { nullthrows } from './nullthrows.js';
const [rawCategory, ...rest] = process.argv.slice(2);
const message = rest.join(' ');
+1 -1
View File
@@ -1,6 +1,6 @@
// this is mostly copy-pasted from https://github.com/expo/expo/blob/master/tools/src/Markdown.ts
import { unescape } from 'lodash';
import { unescape } from 'lodash-es';
import marked from 'marked';
export enum TokenType {
+9
View File
@@ -0,0 +1,9 @@
export function nullthrows<T>(value: T | null | undefined, message?: string): T {
if (value !== null && value !== undefined) {
return value;
}
const error = new Error(message !== undefined ? message : `Got unexpected ${value}`);
(error as any).framesToPop = 1; // Skip nullthrows's own stack frame.
throw error;
}
+3 -3
View File
@@ -1,9 +1,9 @@
import dateFormat from 'dateformat';
import semver from 'semver';
import { CATEGORY_HEADERS } from './changelog/consts';
import { readAndParseChangelogAsync, writeChangelogAsync } from './changelog/file';
import * as markdown from './markdown';
import { CATEGORY_HEADERS } from './changelog/consts.js';
import { readAndParseChangelogAsync, writeChangelogAsync } from './changelog/file.js';
import * as markdown from './markdown.js';
const MAIN_CATEGORIES = Object.values(CATEGORY_HEADERS).map(text =>
markdown.createHeadingToken(text, 3)
+3 -4
View File
@@ -1,12 +1,11 @@
{
"compilerOptions": {
"declaration": true,
"importHelpers": true,
"module": "commonjs",
"esModuleInterop": true,
"module": "node16",
"moduleResolution": "node16",
"noImplicitReturns": true,
"strict": true,
"target": "ES2019",
"target": "ES2020",
"outDir": "build",
"rootDir": "src",
"typeRoots": [
+15 -13
View File
@@ -46,7 +46,14 @@
dependencies:
"@types/node" "*"
"@types/[email protected]4.182":
"@types/lodash-es@4.17.6":
version "4.17.6"
resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.6.tgz#c2ed4c8320ffa6f11b43eb89e9eaeec65966a0a0"
integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==
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==
@@ -119,10 +126,10 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
[email protected]:
lodash-es@4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
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"
@@ -141,11 +148,6 @@ [email protected]:
resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.4.tgz#b8a1539e5e05c6ea9e93f15c0bad1d54ce890406"
integrity sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==
[email protected]:
version "1.1.1"
resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"
integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==
[email protected]:
version "7.3.7"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
@@ -177,10 +179,10 @@ [email protected]:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
typescript@4.6.4:
version "4.6.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"
integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==
typescript@4.7.4:
version "4.7.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
universalify@^2.0.0:
version "2.0.0"
Generated
+4 -4
View File
@@ -12288,10 +12288,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@4.6.4:
version "4.6.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"
integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==
typescript@4.7.4:
version "4.7.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
ua-parser-js@^0.7.30:
version "0.7.31"