forked from cerc-io/snowballtools-base
Compare commits
64
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a9f50a02f0 | ||
|
|
e10c8f4818 | ||
|
|
e3931b4bf8 | ||
|
|
443a3f2b6e | ||
|
|
9d8d2199e2 | ||
|
|
f374fa69ff | ||
|
|
55e238d0b9 | ||
|
|
bf75dc8acc | ||
|
|
e45cc45f38 | ||
|
|
ed2badebb6 | ||
|
|
b63837d432 | ||
|
|
b3ac6e1367 | ||
|
|
508b4c7367 | ||
|
|
a662ebc018 | ||
|
|
614405a2f4 | ||
|
|
fb873d9bc1 | ||
|
|
f67dbd0ff3 | ||
|
|
22fb9323d7 | ||
|
|
a9e69afe08 | ||
|
|
5fe04dd691 | ||
|
|
012dd63a45 | ||
|
|
52ae15bf62 | ||
|
|
82dab8ce21 | ||
|
|
853a1024b3 | ||
|
|
dfeb281586 | ||
|
|
b58d9e6c21 | ||
|
|
42d35cae84 | ||
|
|
8c824f065b | ||
|
|
2a3c5de132 | ||
|
|
13730655a4 | ||
|
|
ee9bf2de1c | ||
|
|
9931bc74d1 | ||
|
|
0e0e5e888f | ||
|
|
d77e41f796 | ||
|
|
42bdd21089 | ||
|
|
e5a00016c1 | ||
|
|
13b912d318 | ||
|
|
059863c4b9 | ||
|
|
58906844cc | ||
|
|
9f0a2ad548 | ||
|
|
bd10e2cb35 | ||
|
|
eb32385cf3 | ||
|
|
aebb20b987 | ||
|
|
8a2b51952f | ||
|
|
94f46f9621 | ||
|
|
e751addcce | ||
|
|
c01f8fdabf | ||
|
|
2b60114dab | ||
|
|
9a1c0e8338 | ||
|
|
1b038476c7 | ||
|
|
4a78eb13f6 | ||
|
|
41bcb2e7d0 | ||
|
|
f981f1a3f6 | ||
|
|
dee84f18cb | ||
|
|
44015d5451 | ||
|
|
a684743bd6 | ||
|
|
b12c95b2ff | ||
|
|
a4d9211ffe | ||
|
|
af31fac3ee | ||
|
|
54ae3f429d | ||
|
|
acfe78bf07 | ||
|
|
ce1833cb51 | ||
|
|
f2e59c11fd | ||
|
|
b261e7e436 |
@@ -0,0 +1,29 @@
|
|||||||
|
name: Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.x]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Download yarn
|
||||||
|
run: |
|
||||||
|
curl -fsSL -o /usr/local/bin/yarn https://github.com/yarnpkg/yarn/releases/download/v1.22.21/yarn-1.22.21.js
|
||||||
|
chmod +x /usr/local/bin/yarn
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- run: yarn
|
||||||
|
- name: Build libs
|
||||||
|
run: yarn workspace gql-client run build
|
||||||
|
- name: Linter check
|
||||||
|
run: yarn lint
|
||||||
@@ -7,3 +7,6 @@ yarn-error.log
|
|||||||
packages/backend/environments/local.toml
|
packages/backend/environments/local.toml
|
||||||
packages/backend/dev/
|
packages/backend/dev/
|
||||||
packages/frontend/dist/
|
packages/frontend/dist/
|
||||||
|
|
||||||
|
# ignore all .DS_Store files
|
||||||
|
**/.DS_Store
|
||||||
|
|||||||
@@ -1,220 +1,23 @@
|
|||||||
# snowballtools-base
|
# snowballtools-base
|
||||||
|
|
||||||
## Setup
|
This is a [yarn workspace](https://yarnpkg.com/features/workspaces) monorepo for the dashboard.
|
||||||
|
|
||||||
- Clone the `snowballtools-base` repo
|
## Getting Started
|
||||||
|
|
||||||
```bash
|
### Install dependencies
|
||||||
git clone git@github.com:snowball-tools/snowballtools-base.git
|
|
||||||
cd snowballtools-base
|
|
||||||
```
|
|
||||||
|
|
||||||
- Install dependencies in root
|
In the root of the project, run:
|
||||||
|
|
||||||
```bash
|
```zsh
|
||||||
yarn
|
yarn
|
||||||
```
|
```
|
||||||
|
|
||||||
- Build packages
|
### Build backend
|
||||||
|
|
||||||
```bash
|
```zsh
|
||||||
yarn build --ignore frontend
|
yarn build --ignore frontend
|
||||||
```
|
```
|
||||||
|
|
||||||
Let us assume the following domains for backend and frontend
|
### Environment variables, running the development server, and deployment
|
||||||
- Backend server: `api.snowballtools.com`
|
|
||||||
- Frontend app: `dashboard.snowballtools.com`
|
|
||||||
|
|
||||||
- Configuration Files
|
Follow the instructions in the README.md files of the [backend](packages/backend/README.md) and [frontend](packages/frontend/README.md) packages.
|
||||||
|
|
||||||
- For Backend:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp packages/backend/environments/local.toml.example packages/backend/environments/local.toml
|
|
||||||
```
|
|
||||||
|
|
||||||
- Production
|
|
||||||
|
|
||||||
- Update the following in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[server]
|
|
||||||
...
|
|
||||||
[server.session]
|
|
||||||
# Secret should be changed to a different random string
|
|
||||||
secret = "p4yfpkqnddkui2iw7t6hbhwq74lbqs7sidnc382"
|
|
||||||
# Set URL of the frontend app
|
|
||||||
appOriginUrl = "https://dashboard.snowballtools.com"
|
|
||||||
# Set to true for session cookies to work behind proxy
|
|
||||||
trustProxy = true
|
|
||||||
# Set empty domain when using secure connection
|
|
||||||
domain = ""
|
|
||||||
```
|
|
||||||
|
|
||||||
- Set `gitHub.oAuth.clientId` and `gitHub.oAuth.clientSecret` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
- [OAuth App Creation](https://github.com/organizations/<org>/settings/applications/new)
|
|
||||||
- Homepage URL: `https://dashboard.snowballtools.com`
|
|
||||||
- Authorization callback URL: `https://dashboard.snowballtools.com/organization/projects/create`
|
|
||||||
- Generate a new client secret after app is created
|
|
||||||
|
|
||||||
- Set `gitHub.webhookUrl` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[gitHub]
|
|
||||||
webhookUrl = "https://api.snowballtools.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
- Let us assume domain for Laconicd to be `api.laconic.com` and set the following in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[registryConfig]
|
|
||||||
fetchDeploymentRecordDelay = 5000
|
|
||||||
# Use actual port for REST endpoint
|
|
||||||
restEndpoint = "http://api.laconic.com:1317"
|
|
||||||
# Use actual port for GQL endpoint
|
|
||||||
gqlEndpoint = "http://api.laconic.com:9473/api"
|
|
||||||
# Set private key of account to be used in Laconicd
|
|
||||||
privateKey = "0wtu92cd4f1y791ezpjwgzzazni4dmd3q3mzqc3t6i6r9v06ji784tey6hwmnn69"
|
|
||||||
# Set Bond ID to be used for publishing records
|
|
||||||
bondId = "8xk8c2pb61kajwixpm223zvptr2x2ncajq0vd998p6aqhvqqep2reu6pik245epf"
|
|
||||||
chainId = "laconic_9000-1"
|
|
||||||
# Set authority that is existing in the chain
|
|
||||||
authority = "laconic"
|
|
||||||
[registryConfig.fee]
|
|
||||||
amount = "200000"
|
|
||||||
denom = "aphoton"
|
|
||||||
gas = "750000"
|
|
||||||
```
|
|
||||||
|
|
||||||
- Development
|
|
||||||
|
|
||||||
- Set `gitHub.oAuth.clientId` and `gitHub.oAuth.clientSecret` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
- [OAuth App Creation](https://github.com/organizations/<org>/settings/applications/new)
|
|
||||||
- Homepage URL: `http://localhost:3000`
|
|
||||||
- Authorization callback URL: `http://localhost:3000/organization/projects/create`
|
|
||||||
- Generate a new client secret after app is created
|
|
||||||
|
|
||||||
- Setup Laconicd
|
|
||||||
- Run the laconicd stack following this [doc](https://git.vdb.to/cerc-io/stack-orchestrator/src/branch/main/docs/laconicd-with-console.md)
|
|
||||||
- Get the private key and set `registryConfig.privateKey` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
laconic-so deployment --dir laconic-loaded-deployment exec laconicd "laconicd keys export mykey --unarmored-hex --unsafe"
|
|
||||||
# WARNING: The private key will be exported as an unarmored hexadecimal string. USE AT YOUR OWN RISK. Continue? [y/N]: y
|
|
||||||
# 754cca7b4b729a99d156913aea95366411d072856666e95ba09ef6c664357d81
|
|
||||||
```
|
|
||||||
|
|
||||||
- Set authority in `registryConfig.authority` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
- Run the script to create bond, reserve the authority and set authority bond
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn test:registry:init
|
|
||||||
# snowball:initialize-registry bondId: 6af0ab81973b93d3511ae79841756fb5da3fd2f70ea1279e81fae7c9b19af6c4 +0ms
|
|
||||||
```
|
|
||||||
|
|
||||||
- Get the bond id and set `registryConfig.bondId` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
- Setup ngrok for GitHub webhooks
|
|
||||||
- [ngrok getting started](https://ngrok.com/docs/getting-started/)
|
|
||||||
- Start ngrok and point to backend server endpoint
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ngrok http http://localhost:8000
|
|
||||||
```
|
|
||||||
|
|
||||||
- Look for the forwarding URL in ngrok
|
|
||||||
|
|
||||||
```bash
|
|
||||||
Forwarding https://19c1-61-95-158-116.ngrok-free.app -> http://localhost:8000
|
|
||||||
```
|
|
||||||
|
|
||||||
- Set `gitHub.webhookUrl` in backend [config file](packages/backend/environments/local.toml)
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[gitHub]
|
|
||||||
webhookUrl = "https://19c1-61-95-158-116.ngrok-free.app"
|
|
||||||
```
|
|
||||||
|
|
||||||
- For Frontend:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp packages/frontend/.env.example packages/frontend/.env
|
|
||||||
```
|
|
||||||
|
|
||||||
- Copy the GitHub OAuth app client ID from previous steps and set it in frontend [.env](packages/frontend/.env) file
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_GITHUB_CLIENT_ID = <CLIENT_ID>
|
|
||||||
```
|
|
||||||
|
|
||||||
- Set `VITE_GITHUB_PWA_TEMPLATE_REPO` and `VITE_GITHUB_IMAGE_UPLOAD_PWA_TEMPLATE_REPO` in [.env](packages/frontend/.env) file
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_GITHUB_PWA_TEMPLATE_REPO = 'cerc-io/test-progressive-web-app' # Set actual owner/name of the template repo that will be used for creating new repo
|
|
||||||
VITE_GITHUB_IMAGE_UPLOAD_PWA_TEMPLATE_REPO = 'cerc-io/image-upload-pwa-example' # Set actual owner/name of the template repo that will be used for creating new repo
|
|
||||||
```
|
|
||||||
|
|
||||||
- Production
|
|
||||||
|
|
||||||
- Set the following values in [.env](packages/frontend/.env) file
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_SERVER_URL = 'https://api.snowballtools.com' # Backend server endpoint
|
|
||||||
```
|
|
||||||
|
|
||||||
- Sign in to [wallet connect](https://cloud.walletconnect.com/sign-in) to create a project ID
|
|
||||||
- Create a project and add information to use wallet connect SDK
|
|
||||||
- Add project name and select project type as `App`
|
|
||||||
- Set project home page URL to `https://dashboard.snowballtools.com`
|
|
||||||
- On creation of project, use the `Project ID` and set it in `VITE_WALLET_CONNECT_ID` in [.env](packages/frontend/.env) file
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_WALLET_CONNECT_ID = <PROJECT_ID>
|
|
||||||
```
|
|
||||||
|
|
||||||
- Build the React application
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn build
|
|
||||||
```
|
|
||||||
|
|
||||||
- Use a web server for hosting static built files
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 -m http.server -d build 3000
|
|
||||||
```
|
|
||||||
|
|
||||||
- Development
|
|
||||||
|
|
||||||
- Copy the graphQL endpoint from terminal and add the endpoint in the [.env](packages/frontend/.env) file present in `packages/frontend`
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_SERVER_URL = 'http://localhost:8000'
|
|
||||||
```
|
|
||||||
|
|
||||||
- Sign in to [wallet connect](https://cloud.walletconnect.com/sign-in) to create a project ID.
|
|
||||||
- Create a project and add information to use wallet connect SDK
|
|
||||||
- Add project name and select project type as `App`
|
|
||||||
- Project home page URL is not required to be set
|
|
||||||
- On creation of project, use the `Project ID` and set it in `VITE_WALLET_CONNECT_ID` in [.env](packages/frontend/.env) file
|
|
||||||
|
|
||||||
```env
|
|
||||||
VITE_WALLET_CONNECT_ID = <Project_ID>
|
|
||||||
```
|
|
||||||
|
|
||||||
- The React application will be running in `http://localhost:3000/`
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
- Start the backend server
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn start:backend
|
|
||||||
```
|
|
||||||
|
|
||||||
- Start the frontend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn start
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1 +1,76 @@
|
|||||||
# Backend for Snowball Tools
|
# backend
|
||||||
|
|
||||||
|
This backend is a [node.js](https://nodejs.org/) [express.js](https://expressjs.com/) [apollo server](https://www.apollographql.com/docs/apollo-server/) project in a [yarn workspace](https://yarnpkg.com/features/workspaces).
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
### Install dependencies
|
||||||
|
|
||||||
|
In the root of the project, run:
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build backend
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
yarn build --ignore frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment variables
|
||||||
|
|
||||||
|
#### Local
|
||||||
|
|
||||||
|
Copy the `environments/local.toml.example` file to `environments/local.toml`:
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
cp environments/local.toml.example environments/local.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Staging environment variables
|
||||||
|
|
||||||
|
In the deployment repository, update staging [staging/configmaps/config/prod.toml](https://git.vdb.to/cerc-io/snowballtools-base-api-deployments/src/commit/318c2bc09f334dca79c3501838512749f9431bf1/deployments/staging/configmaps/config/prod.toml)
|
||||||
|
|
||||||
|
#### Production environment variables
|
||||||
|
|
||||||
|
In the deployment repository, update production [production/configmaps/config/prod.toml](https://git.vdb.to/cerc-io/snowballtools-base-api-deployments/src/commit/318c2bc09f334dca79c3501838512749f9431bf1/deployments/production/configmaps/config/prod.toml)
|
||||||
|
|
||||||
|
### Run development server
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
yarn start
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
Clone the [deployer repository](https://git.vdb.to/cerc-io/snowballtools-base-api-deployments):
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
git clone git@git.vdb.to:cerc-io/snowballtools-base-api-deployments.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### Staging
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
echo trigger >> .gitea/workflows/triggers/staging-deploy
|
||||||
|
git commit -a -m "Deploy v0.0.8" # replace with version number
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
echo trigger >> .gitea/workflows/triggers/production-deploy
|
||||||
|
git commit -a -m "Deploy v0.0.8" # replace with version number
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deployment status
|
||||||
|
|
||||||
|
Dumb for now
|
||||||
|
|
||||||
|
- [Staging](https://snowballtools-base-api.staging.apps.snowballtools.com/staging/version)
|
||||||
|
- [Production](https://snowballtools-base-api.apps.snowballtools.com/staging/version)
|
||||||
|
|
||||||
|
Update version number manually in [routes/staging.ts](/packages/backend/src/routes/staging.ts)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
port = 8000
|
port = 8000
|
||||||
gqlPath = "/graphql"
|
gqlPath = "/graphql"
|
||||||
[server.session]
|
[server.session]
|
||||||
secret = "p4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi"
|
secret = ""
|
||||||
appOriginUrl = "http://localhost:3000"
|
appOriginUrl = "http://localhost:3000"
|
||||||
trustProxy = false
|
trustProxy = false
|
||||||
domain = "localhost"
|
domain = "localhost"
|
||||||
@@ -17,8 +17,19 @@
|
|||||||
clientId = ""
|
clientId = ""
|
||||||
clientSecret = ""
|
clientSecret = ""
|
||||||
|
|
||||||
|
[google]
|
||||||
|
clientId = ""
|
||||||
|
clientSecret = ""
|
||||||
|
|
||||||
|
[turnkey]
|
||||||
|
apiBaseUrl = "https://api.turnkey.com"
|
||||||
|
apiPrivateKey = ""
|
||||||
|
apiPublicKey = ""
|
||||||
|
defaultOrganizationId = ""
|
||||||
|
|
||||||
[registryConfig]
|
[registryConfig]
|
||||||
fetchDeploymentRecordDelay = 5000
|
fetchDeploymentRecordDelay = 5000
|
||||||
|
checkAuctionStatusDelay = 5000
|
||||||
restEndpoint = "http://localhost:1317"
|
restEndpoint = "http://localhost:1317"
|
||||||
gqlEndpoint = "http://localhost:9473/api"
|
gqlEndpoint = "http://localhost:9473/api"
|
||||||
chainId = "laconic_9000-1"
|
chainId = "laconic_9000-1"
|
||||||
@@ -26,9 +37,16 @@
|
|||||||
bondId = ""
|
bondId = ""
|
||||||
authority = ""
|
authority = ""
|
||||||
[registryConfig.fee]
|
[registryConfig.fee]
|
||||||
amount = "200000"
|
gas = ""
|
||||||
denom = "aphoton"
|
fees = ""
|
||||||
gas = "750000"
|
gasPrice = "1alnt"
|
||||||
|
|
||||||
|
[auction]
|
||||||
|
commitFee = "1000"
|
||||||
|
commitsDuration = "60s"
|
||||||
|
revealFee = "1000"
|
||||||
|
revealsDuration = "60s"
|
||||||
|
denom = "alnt"
|
||||||
|
|
||||||
[misc]
|
[misc]
|
||||||
projectDomain = "apps.snowballtools.com"
|
projectDomain = "apps.snowballtools.com"
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@cerc-io/registry-sdk": "^0.2.11",
|
||||||
"@graphql-tools/schema": "^10.0.2",
|
"@graphql-tools/schema": "^10.0.2",
|
||||||
"@graphql-tools/utils": "^10.0.12",
|
"@graphql-tools/utils": "^10.0.12",
|
||||||
"@octokit/oauth-app": "^6.1.0",
|
"@octokit/oauth-app": "^6.1.0",
|
||||||
"@snowballtools/laconic-sdk": "^0.1.17",
|
|
||||||
"@turnkey/sdk-server": "^0.1.0",
|
"@turnkey/sdk-server": "^0.1.0",
|
||||||
"@types/debug": "^4.1.5",
|
"@types/debug": "^4.1.5",
|
||||||
"@types/express": "^4.17.21",
|
"@types/express": "^4.17.21",
|
||||||
|
|||||||
@@ -34,14 +34,23 @@ export interface RegistryConfig {
|
|||||||
privateKey: string;
|
privateKey: string;
|
||||||
bondId: string;
|
bondId: string;
|
||||||
fetchDeploymentRecordDelay: number;
|
fetchDeploymentRecordDelay: number;
|
||||||
|
checkAuctionStatusDelay: number;
|
||||||
authority: string;
|
authority: string;
|
||||||
fee: {
|
fee: {
|
||||||
amount: string;
|
|
||||||
denom: string;
|
|
||||||
gas: string;
|
gas: string;
|
||||||
|
fees: string;
|
||||||
|
gasPrice: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AuctionConfig {
|
||||||
|
commitFee: string;
|
||||||
|
commitsDuration: string;
|
||||||
|
revealFee: string;
|
||||||
|
revealsDuration: string;
|
||||||
|
denom: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface MiscConfig {
|
export interface MiscConfig {
|
||||||
projectDomain: string;
|
projectDomain: string;
|
||||||
}
|
}
|
||||||
@@ -51,6 +60,7 @@ export interface Config {
|
|||||||
database: DatabaseConfig;
|
database: DatabaseConfig;
|
||||||
gitHub: GitHubConfig;
|
gitHub: GitHubConfig;
|
||||||
registryConfig: RegistryConfig;
|
registryConfig: RegistryConfig;
|
||||||
|
auction: AuctionConfig;
|
||||||
misc: MiscConfig;
|
misc: MiscConfig;
|
||||||
turnkey: {
|
turnkey: {
|
||||||
apiBaseUrl: string;
|
apiBaseUrl: string;
|
||||||
|
|||||||
@@ -465,8 +465,6 @@ export class Database {
|
|||||||
id: organizationId
|
id: organizationId
|
||||||
});
|
});
|
||||||
|
|
||||||
newProject.subDomain = `${newProject.name}.${this.projectDomain}`;
|
|
||||||
|
|
||||||
return projectRepository.save(newProject);
|
return projectRepository.save(newProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ export interface ApplicationDeploymentRequest {
|
|||||||
version: string;
|
version: string;
|
||||||
name: string;
|
name: string;
|
||||||
application: string;
|
application: string;
|
||||||
|
lrn?: string;
|
||||||
|
auction?: string;
|
||||||
config: string;
|
config: string;
|
||||||
meta: string;
|
meta: string;
|
||||||
}
|
}
|
||||||
@@ -125,6 +127,9 @@ export class Deployment {
|
|||||||
@Column('simple-json', { nullable: true })
|
@Column('simple-json', { nullable: true })
|
||||||
applicationDeploymentRemovalRecordData!: AppDeploymentRemovalRecordAttributes | null;
|
applicationDeploymentRemovalRecordData!: AppDeploymentRemovalRecordAttributes | null;
|
||||||
|
|
||||||
|
@Column('varchar')
|
||||||
|
deployerLrn!: string;
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
enum: Environment
|
enum: Environment
|
||||||
})
|
})
|
||||||
@@ -133,6 +138,9 @@ export class Deployment {
|
|||||||
@Column('boolean', { default: false })
|
@Column('boolean', { default: false })
|
||||||
isCurrent!: boolean;
|
isCurrent!: boolean;
|
||||||
|
|
||||||
|
@Column('varchar', { nullable: true })
|
||||||
|
baseDomain!: string | null;
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
enum: DeploymentStatus
|
enum: DeploymentStatus
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -46,6 +46,12 @@ export class Project {
|
|||||||
@Column('text', { default: '' })
|
@Column('text', { default: '' })
|
||||||
description!: string;
|
description!: string;
|
||||||
|
|
||||||
|
@Column('varchar', { nullable: true })
|
||||||
|
auctionId!: string | null;
|
||||||
|
|
||||||
|
@Column({ type: 'simple-array', nullable: true })
|
||||||
|
deployerLrns!: string[] | null;
|
||||||
|
|
||||||
// TODO: Compute template & framework in import repository
|
// TODO: Compute template & framework in import repository
|
||||||
@Column('varchar', { nullable: true })
|
@Column('varchar', { nullable: true })
|
||||||
template!: string | null;
|
template!: string | null;
|
||||||
@@ -61,8 +67,8 @@ export class Project {
|
|||||||
@Column('varchar')
|
@Column('varchar')
|
||||||
icon!: string;
|
icon!: string;
|
||||||
|
|
||||||
@Column('varchar')
|
@Column({ type: 'simple-array', nullable: true })
|
||||||
subDomain!: string;
|
baseDomains!: string[] | null;
|
||||||
|
|
||||||
@CreateDateColumn()
|
@CreateDateColumn()
|
||||||
createdAt!: Date;
|
createdAt!: Date;
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import debug from 'debug';
|
|
||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
import { inc as semverInc } from 'semver';
|
import debug from 'debug';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
|
import { Octokit } from 'octokit';
|
||||||
|
import { inc as semverInc } from 'semver';
|
||||||
|
import { DeepPartial } from 'typeorm';
|
||||||
|
|
||||||
import { Registry as LaconicRegistry } from '@snowballtools/laconic-sdk';
|
import { Registry as LaconicRegistry, getGasPrice, parseGasAndFees } from '@cerc-io/registry-sdk';
|
||||||
|
|
||||||
import { RegistryConfig } from './config';
|
import { RegistryConfig } from './config';
|
||||||
import {
|
import {
|
||||||
@@ -12,49 +14,53 @@ import {
|
|||||||
ApplicationDeploymentRequest,
|
ApplicationDeploymentRequest,
|
||||||
ApplicationDeploymentRemovalRequest
|
ApplicationDeploymentRemovalRequest
|
||||||
} from './entity/Deployment';
|
} from './entity/Deployment';
|
||||||
import { AppDeploymentRecord, AppDeploymentRemovalRecord, PackageJSON } from './types';
|
import { AppDeploymentRecord, AppDeploymentRemovalRecord, AuctionData } from './types';
|
||||||
import { sleep } from './utils';
|
import { getConfig, getRepoDetails, sleep } from './utils';
|
||||||
|
import { Auction } from '@cerc-io/registry-sdk/dist/proto/cerc/auction/v1/auction';
|
||||||
|
|
||||||
const log = debug('snowball:registry');
|
const log = debug('snowball:registry');
|
||||||
|
|
||||||
const APP_RECORD_TYPE = 'ApplicationRecord';
|
const APP_RECORD_TYPE = 'ApplicationRecord';
|
||||||
|
const APP_DEPLOYMENT_AUCTION_RECORD_TYPE = 'ApplicationDeploymentAuction';
|
||||||
const APP_DEPLOYMENT_REQUEST_TYPE = 'ApplicationDeploymentRequest';
|
const APP_DEPLOYMENT_REQUEST_TYPE = 'ApplicationDeploymentRequest';
|
||||||
const APP_DEPLOYMENT_REMOVAL_REQUEST_TYPE = 'ApplicationDeploymentRemovalRequest';
|
const APP_DEPLOYMENT_REMOVAL_REQUEST_TYPE = 'ApplicationDeploymentRemovalRequest';
|
||||||
const APP_DEPLOYMENT_RECORD_TYPE = 'ApplicationDeploymentRecord';
|
const APP_DEPLOYMENT_RECORD_TYPE = 'ApplicationDeploymentRecord';
|
||||||
const APP_DEPLOYMENT_REMOVAL_RECORD_TYPE = 'ApplicationDeploymentRemovalRecord';
|
const APP_DEPLOYMENT_REMOVAL_RECORD_TYPE = 'ApplicationDeploymentRemovalRecord';
|
||||||
const SLEEP_DURATION = 1000;
|
const SLEEP_DURATION = 1000;
|
||||||
|
|
||||||
// TODO: Move registry code to laconic-sdk/watcher-ts
|
// TODO: Move registry code to registry-sdk/watcher-ts
|
||||||
export class Registry {
|
export class Registry {
|
||||||
private registry: LaconicRegistry;
|
private registry: LaconicRegistry;
|
||||||
private registryConfig: RegistryConfig;
|
private registryConfig: RegistryConfig;
|
||||||
|
|
||||||
constructor(registryConfig: RegistryConfig) {
|
constructor(registryConfig: RegistryConfig) {
|
||||||
this.registryConfig = registryConfig;
|
this.registryConfig = registryConfig;
|
||||||
|
|
||||||
|
const gasPrice = getGasPrice(registryConfig.fee.gasPrice);
|
||||||
|
|
||||||
this.registry = new LaconicRegistry(
|
this.registry = new LaconicRegistry(
|
||||||
registryConfig.gqlEndpoint,
|
registryConfig.gqlEndpoint,
|
||||||
registryConfig.restEndpoint,
|
registryConfig.restEndpoint,
|
||||||
registryConfig.chainId
|
{ chainId: registryConfig.chainId, gasPrice }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async createApplicationRecord({
|
async createApplicationRecord({
|
||||||
appName,
|
octokit,
|
||||||
packageJSON,
|
repository,
|
||||||
commitHash,
|
commitHash,
|
||||||
appType,
|
appType,
|
||||||
repoUrl
|
|
||||||
}: {
|
}: {
|
||||||
appName: string;
|
octokit: Octokit
|
||||||
packageJSON: PackageJSON;
|
repository: string;
|
||||||
commitHash: string;
|
commitHash: string;
|
||||||
appType: string;
|
appType: string;
|
||||||
repoUrl: string;
|
|
||||||
}): Promise<{
|
}): Promise<{
|
||||||
applicationRecordId: string;
|
applicationRecordId: string;
|
||||||
applicationRecordData: ApplicationRecord;
|
applicationRecordData: ApplicationRecord;
|
||||||
}> {
|
}> {
|
||||||
// Use laconic-sdk to publish record
|
const { repo, repoUrl, packageJSON } = await getRepoDetails(octokit, repository, commitHash)
|
||||||
|
// Use registry-sdk to publish record
|
||||||
// Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts/publish-app-record.sh
|
// Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts/publish-app-record.sh
|
||||||
// Fetch previous records
|
// Fetch previous records
|
||||||
const records = await this.registry.queryRecords(
|
const records = await this.registry.queryRecords(
|
||||||
@@ -87,7 +93,7 @@ export class Registry {
|
|||||||
repository_ref: commitHash,
|
repository_ref: commitHash,
|
||||||
repository: [repoUrl],
|
repository: [repoUrl],
|
||||||
app_type: appType,
|
app_type: appType,
|
||||||
name: appName,
|
name: repo,
|
||||||
...(packageJSON.description && { description: packageJSON.description }),
|
...(packageJSON.description && { description: packageJSON.description }),
|
||||||
...(packageJSON.homepage && { homepage: packageJSON.homepage }),
|
...(packageJSON.homepage && { homepage: packageJSON.homepage }),
|
||||||
...(packageJSON.license && { license: packageJSON.license }),
|
...(packageJSON.license && { license: packageJSON.license }),
|
||||||
@@ -100,68 +106,145 @@ export class Registry {
|
|||||||
...(packageJSON.version && { app_version: packageJSON.version })
|
...(packageJSON.version && { app_version: packageJSON.version })
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(this.registryConfig.fee.gas, this.registryConfig.fee.fees);
|
||||||
|
|
||||||
const result = await this.registry.setRecord(
|
const result = await this.registry.setRecord(
|
||||||
{
|
{
|
||||||
privateKey: this.registryConfig.privateKey,
|
privateKey: this.registryConfig.privateKey,
|
||||||
record: applicationRecord,
|
record: applicationRecord,
|
||||||
bondId: this.registryConfig.bondId
|
bondId: this.registryConfig.bondId
|
||||||
},
|
},
|
||||||
'',
|
this.registryConfig.privateKey,
|
||||||
this.registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
|
|
||||||
|
log(`Published application record ${result.id}`);
|
||||||
log('Application record data:', applicationRecord);
|
log('Application record data:', applicationRecord);
|
||||||
|
|
||||||
// TODO: Discuss computation of CRN
|
// TODO: Discuss computation of LRN
|
||||||
const crn = this.getCrn(appName);
|
const lrn = this.getLrn(repo);
|
||||||
log(`Setting name: ${crn} for record ID: ${result.data.id}`);
|
log(`Setting name: ${lrn} for record ID: ${result.id}`);
|
||||||
|
|
||||||
await sleep(SLEEP_DURATION);
|
await sleep(SLEEP_DURATION);
|
||||||
await this.registry.setName(
|
await this.registry.setName(
|
||||||
{ cid: result.data.id, crn },
|
{
|
||||||
|
cid: result.id,
|
||||||
|
lrn
|
||||||
|
},
|
||||||
this.registryConfig.privateKey,
|
this.registryConfig.privateKey,
|
||||||
this.registryConfig.fee
|
fee
|
||||||
);
|
|
||||||
|
|
||||||
await sleep(SLEEP_DURATION);
|
|
||||||
await this.registry.setName(
|
|
||||||
{ cid: result.data.id, crn: `${crn}@${applicationRecord.app_version}` },
|
|
||||||
this.registryConfig.privateKey,
|
|
||||||
this.registryConfig.fee
|
|
||||||
);
|
);
|
||||||
|
|
||||||
await sleep(SLEEP_DURATION);
|
await sleep(SLEEP_DURATION);
|
||||||
await this.registry.setName(
|
await this.registry.setName(
|
||||||
{
|
{
|
||||||
cid: result.data.id,
|
cid: result.id,
|
||||||
crn: `${crn}@${applicationRecord.repository_ref}`
|
lrn: `${lrn}@${applicationRecord.app_version}`
|
||||||
},
|
},
|
||||||
this.registryConfig.privateKey,
|
this.registryConfig.privateKey,
|
||||||
this.registryConfig.fee
|
fee
|
||||||
|
);
|
||||||
|
|
||||||
|
await sleep(SLEEP_DURATION);
|
||||||
|
await this.registry.setName(
|
||||||
|
{
|
||||||
|
cid: result.id,
|
||||||
|
lrn: `${lrn}@${applicationRecord.repository_ref}`
|
||||||
|
},
|
||||||
|
this.registryConfig.privateKey,
|
||||||
|
fee
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
applicationRecordId: result.data.id,
|
applicationRecordId: result.id,
|
||||||
applicationRecordData: applicationRecord
|
applicationRecordData: applicationRecord
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async createApplicationDeploymentAuction(
|
||||||
|
appName: string,
|
||||||
|
octokit: Octokit,
|
||||||
|
auctionData: AuctionData,
|
||||||
|
data: DeepPartial<Deployment>,
|
||||||
|
): Promise<{
|
||||||
|
applicationDeploymentAuctionId: string;
|
||||||
|
}> {
|
||||||
|
assert(data.project?.repository, 'Project repository not found');
|
||||||
|
|
||||||
|
await this.createApplicationRecord({
|
||||||
|
octokit,
|
||||||
|
repository: data.project.repository,
|
||||||
|
appType: data.project!.template!,
|
||||||
|
commitHash: data.commitHash!,
|
||||||
|
});
|
||||||
|
|
||||||
|
const lrn = this.getLrn(appName);
|
||||||
|
const config = await getConfig();
|
||||||
|
const auctionConfig = config.auction;
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(this.registryConfig.fee.gas, this.registryConfig.fee.fees);
|
||||||
|
const auctionResult = await this.registry.createProviderAuction(
|
||||||
|
{
|
||||||
|
commitFee: auctionConfig.commitFee,
|
||||||
|
commitsDuration: auctionConfig.commitsDuration,
|
||||||
|
revealFee: auctionConfig.revealFee,
|
||||||
|
revealsDuration: auctionConfig.revealsDuration,
|
||||||
|
denom: auctionConfig.denom,
|
||||||
|
maxPrice: auctionData.maxPrice,
|
||||||
|
numProviders: auctionData.numProviders,
|
||||||
|
},
|
||||||
|
this.registryConfig.privateKey,
|
||||||
|
fee
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!auctionResult.auction) {
|
||||||
|
throw new Error('Error creating auction');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create record of type applicationDeploymentAuction and publish
|
||||||
|
const applicationDeploymentAuction = {
|
||||||
|
application: lrn,
|
||||||
|
auction: auctionResult.auction.id,
|
||||||
|
type: APP_DEPLOYMENT_AUCTION_RECORD_TYPE,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = await this.registry.setRecord(
|
||||||
|
{
|
||||||
|
privateKey: this.registryConfig.privateKey,
|
||||||
|
record: applicationDeploymentAuction,
|
||||||
|
bondId: this.registryConfig.bondId
|
||||||
|
},
|
||||||
|
this.registryConfig.privateKey,
|
||||||
|
fee
|
||||||
|
);
|
||||||
|
|
||||||
|
log(`Application deployment auction created: ${auctionResult.auction.id}`);
|
||||||
|
log(`Application deployment auction record published: ${result.id}`);
|
||||||
|
log('Application deployment auction data:', applicationDeploymentAuction);
|
||||||
|
|
||||||
|
return {
|
||||||
|
applicationDeploymentAuctionId: auctionResult.auction.id,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async createApplicationDeploymentRequest(data: {
|
async createApplicationDeploymentRequest(data: {
|
||||||
deployment: Deployment,
|
deployment: Deployment,
|
||||||
appName: string,
|
appName: string,
|
||||||
repository: string,
|
repository: string,
|
||||||
|
auctionId?: string,
|
||||||
|
lrn: string,
|
||||||
environmentVariables: { [key: string]: string },
|
environmentVariables: { [key: string]: string },
|
||||||
dns: string,
|
dns: string,
|
||||||
}): Promise<{
|
}): Promise<{
|
||||||
applicationDeploymentRequestId: string;
|
applicationDeploymentRequestId: string;
|
||||||
applicationDeploymentRequestData: ApplicationDeploymentRequest;
|
applicationDeploymentRequestData: ApplicationDeploymentRequest;
|
||||||
}> {
|
}> {
|
||||||
const crn = this.getCrn(data.appName);
|
const lrn = this.getLrn(data.appName);
|
||||||
const records = await this.registry.resolveNames([crn]);
|
const records = await this.registry.resolveNames([lrn]);
|
||||||
const applicationRecord = records[0];
|
const applicationRecord = records[0];
|
||||||
|
|
||||||
if (!applicationRecord) {
|
if (!applicationRecord) {
|
||||||
throw new Error(`No record found for ${crn}`);
|
throw new Error(`No record found for ${lrn}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create record of type ApplicationDeploymentRequest and publish
|
// Create record of type ApplicationDeploymentRequest and publish
|
||||||
@@ -169,12 +252,10 @@ export class Registry {
|
|||||||
type: APP_DEPLOYMENT_REQUEST_TYPE,
|
type: APP_DEPLOYMENT_REQUEST_TYPE,
|
||||||
version: '1.0.0',
|
version: '1.0.0',
|
||||||
name: `${applicationRecord.attributes.name}@${applicationRecord.attributes.app_version}`,
|
name: `${applicationRecord.attributes.name}@${applicationRecord.attributes.app_version}`,
|
||||||
application: `${crn}@${applicationRecord.attributes.app_version}`,
|
application: `${lrn}@${applicationRecord.attributes.app_version}`,
|
||||||
dns: data.dns,
|
dns: data.dns,
|
||||||
|
|
||||||
// TODO: Not set in test-progressive-web-app CI
|
// TODO: Not set in test-progressive-web-app CI
|
||||||
// deployment: '$CERC_REGISTRY_DEPLOYMENT_CRN',
|
|
||||||
|
|
||||||
// https://git.vdb.to/cerc-io/laconic-registry-cli/commit/129019105dfb93bebcea02fde0ed64d0f8e5983b
|
// https://git.vdb.to/cerc-io/laconic-registry-cli/commit/129019105dfb93bebcea02fde0ed64d0f8e5983b
|
||||||
config: JSON.stringify({
|
config: JSON.stringify({
|
||||||
env: data.environmentVariables
|
env: data.environmentVariables
|
||||||
@@ -185,28 +266,61 @@ export class Registry {
|
|||||||
)}`,
|
)}`,
|
||||||
repository: data.repository,
|
repository: data.repository,
|
||||||
repository_ref: data.deployment.commitHash
|
repository_ref: data.deployment.commitHash
|
||||||
})
|
}),
|
||||||
|
deployer: data.lrn,
|
||||||
|
...(data.auctionId && { auction: data.auctionId }),
|
||||||
};
|
};
|
||||||
|
|
||||||
await sleep(SLEEP_DURATION);
|
await sleep(SLEEP_DURATION);
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(this.registryConfig.fee.gas, this.registryConfig.fee.fees);
|
||||||
|
|
||||||
const result = await this.registry.setRecord(
|
const result = await this.registry.setRecord(
|
||||||
{
|
{
|
||||||
privateKey: this.registryConfig.privateKey,
|
privateKey: this.registryConfig.privateKey,
|
||||||
record: applicationDeploymentRequest,
|
record: applicationDeploymentRequest,
|
||||||
bondId: this.registryConfig.bondId
|
bondId: this.registryConfig.bondId
|
||||||
},
|
},
|
||||||
'',
|
this.registryConfig.privateKey,
|
||||||
this.registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
log(`Application deployment request record published: ${result.data.id}`);
|
log(`Application deployment request record published: ${result.id}`);
|
||||||
log('Application deployment request data:', applicationDeploymentRequest);
|
log('Application deployment request data:', applicationDeploymentRequest);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
applicationDeploymentRequestId: result.data.id,
|
applicationDeploymentRequestId: result.id,
|
||||||
applicationDeploymentRequestData: applicationDeploymentRequest
|
applicationDeploymentRequestData: applicationDeploymentRequest
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getAuctionWinningDeployers(
|
||||||
|
auctionId: string
|
||||||
|
): Promise<string[]> {
|
||||||
|
const records = await this.registry.getAuctionsByIds([auctionId]);
|
||||||
|
const auctionResult = records[0];
|
||||||
|
|
||||||
|
let deployerLrns = [];
|
||||||
|
const { winnerAddresses } = auctionResult;
|
||||||
|
|
||||||
|
for (const auctionWinner of winnerAddresses) {
|
||||||
|
const deployerRecords = await this.registry.queryRecords(
|
||||||
|
{
|
||||||
|
paymentAddress: auctionWinner,
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const record of deployerRecords) {
|
||||||
|
if (record.names && record.names.length > 0) {
|
||||||
|
deployerLrns.push(record.names[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return deployerLrns;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch ApplicationDeploymentRecords for deployments
|
* Fetch ApplicationDeploymentRecords for deployments
|
||||||
*/
|
*/
|
||||||
@@ -222,11 +336,11 @@ export class Registry {
|
|||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
// Filter records with ApplicationRecord ID and Deployment specific URL
|
// Filter records with ApplicationDeploymentRequestId ID and Deployment specific URL
|
||||||
return records.filter((record: AppDeploymentRecord) =>
|
return records.filter((record: AppDeploymentRecord) =>
|
||||||
deployments.some(
|
deployments.some(
|
||||||
(deployment) =>
|
(deployment) =>
|
||||||
deployment.applicationRecordId === record.attributes.application &&
|
deployment.applicationDeploymentRequestId === record.attributes.request &&
|
||||||
record.attributes.url.includes(deployment.id)
|
record.attributes.url.includes(deployment.id)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -271,6 +385,7 @@ export class Registry {
|
|||||||
|
|
||||||
async createApplicationDeploymentRemovalRequest(data: {
|
async createApplicationDeploymentRemovalRequest(data: {
|
||||||
deploymentId: string;
|
deploymentId: string;
|
||||||
|
deployerLrn: string;
|
||||||
}): Promise<{
|
}): Promise<{
|
||||||
applicationDeploymentRemovalRequestId: string;
|
applicationDeploymentRemovalRequestId: string;
|
||||||
applicationDeploymentRemovalRequestData: ApplicationDeploymentRemovalRequest;
|
applicationDeploymentRemovalRequestData: ApplicationDeploymentRemovalRequest;
|
||||||
@@ -278,30 +393,57 @@ export class Registry {
|
|||||||
const applicationDeploymentRemovalRequest = {
|
const applicationDeploymentRemovalRequest = {
|
||||||
type: APP_DEPLOYMENT_REMOVAL_REQUEST_TYPE,
|
type: APP_DEPLOYMENT_REMOVAL_REQUEST_TYPE,
|
||||||
version: '1.0.0',
|
version: '1.0.0',
|
||||||
deployment: data.deploymentId
|
deployment: data.deploymentId,
|
||||||
|
deployer: data.deployerLrn
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(this.registryConfig.fee.gas, this.registryConfig.fee.fees);
|
||||||
|
|
||||||
const result = await this.registry.setRecord(
|
const result = await this.registry.setRecord(
|
||||||
{
|
{
|
||||||
privateKey: this.registryConfig.privateKey,
|
privateKey: this.registryConfig.privateKey,
|
||||||
record: applicationDeploymentRemovalRequest,
|
record: applicationDeploymentRemovalRequest,
|
||||||
bondId: this.registryConfig.bondId
|
bondId: this.registryConfig.bondId
|
||||||
},
|
},
|
||||||
'',
|
this.registryConfig.privateKey,
|
||||||
this.registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
|
|
||||||
log(`Application deployment removal request record published: ${result.data.id}`);
|
log(`Application deployment removal request record published: ${result.id}`);
|
||||||
log('Application deployment removal request data:', applicationDeploymentRemovalRequest);
|
log('Application deployment removal request data:', applicationDeploymentRemovalRequest);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
applicationDeploymentRemovalRequestId: result.data.id,
|
applicationDeploymentRemovalRequestId: result.id,
|
||||||
applicationDeploymentRemovalRequestData: applicationDeploymentRemovalRequest
|
applicationDeploymentRemovalRequestData: applicationDeploymentRemovalRequest
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
getCrn (appName: string): string {
|
async getCompletedAuctionIds(auctionIds: (string | null | undefined)[]): Promise<string[] | null> {
|
||||||
|
const validAuctionIds = auctionIds.filter((id): id is string => id !== null && id !== undefined);
|
||||||
|
|
||||||
|
if (!validAuctionIds.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auctions = await this.registry.getAuctionsByIds(validAuctionIds);
|
||||||
|
|
||||||
|
const completedAuctions = auctions
|
||||||
|
.filter((auction: Auction) => auction.status === 'completed')
|
||||||
|
.map((auction: Auction) => auction.id);
|
||||||
|
|
||||||
|
return completedAuctions;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getRecordsByName(name: string): Promise<any> {
|
||||||
|
return this.registry.resolveNames([name]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAuctionData(auctionId: string): Promise<any> {
|
||||||
|
return this.registry.getAuctionsByIds([auctionId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
getLrn(appName: string): string {
|
||||||
assert(this.registryConfig.authority, "Authority doesn't exist");
|
assert(this.registryConfig.authority, "Authority doesn't exist");
|
||||||
return `crn://${this.registryConfig.authority}/applications/${appName}`;
|
return `lrn://${this.registryConfig.authority}/applications/${appName}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { Permission } from './entity/ProjectMember';
|
|||||||
import { Domain } from './entity/Domain';
|
import { Domain } from './entity/Domain';
|
||||||
import { Project } from './entity/Project';
|
import { Project } from './entity/Project';
|
||||||
import { EnvironmentVariable } from './entity/EnvironmentVariable';
|
import { EnvironmentVariable } from './entity/EnvironmentVariable';
|
||||||
|
import { AddProjectFromTemplateInput, AuctionData } from './types';
|
||||||
|
|
||||||
const log = debug('snowball:resolver');
|
const log = debug('snowball:resolver');
|
||||||
|
|
||||||
@@ -68,6 +69,13 @@ export const createResolvers = async (service: Service): Promise<any> => {
|
|||||||
) => {
|
) => {
|
||||||
return service.getDomainsByProjectId(projectId, filter);
|
return service.getDomainsByProjectId(projectId, filter);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getAuctionData: async (
|
||||||
|
_: any,
|
||||||
|
{ auctionId }: { auctionId: string },
|
||||||
|
) => {
|
||||||
|
return service.getAuctionData(auctionId);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO: Return error in GQL response
|
// TODO: Return error in GQL response
|
||||||
@@ -197,16 +205,42 @@ export const createResolvers = async (service: Service): Promise<any> => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addProjectFromTemplate: async (
|
||||||
|
_: any,
|
||||||
|
{
|
||||||
|
organizationSlug,
|
||||||
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
}: { organizationSlug: string; data: AddProjectFromTemplateInput; lrn: string; auctionData: AuctionData },
|
||||||
|
context: any,
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
return await service.addProjectFromTemplate(
|
||||||
|
context.user,
|
||||||
|
organizationSlug,
|
||||||
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
);
|
||||||
|
} catch (err) {
|
||||||
|
log(err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
addProject: async (
|
addProject: async (
|
||||||
_: any,
|
_: any,
|
||||||
{
|
{
|
||||||
organizationSlug,
|
organizationSlug,
|
||||||
data,
|
data,
|
||||||
}: { organizationSlug: string; data: DeepPartial<Project> },
|
lrn,
|
||||||
|
auctionData
|
||||||
|
}: { organizationSlug: string; data: DeepPartial<Project>; lrn: string; auctionData: AuctionData },
|
||||||
context: any,
|
context: any,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
return await service.addProject(context.user, organizationSlug, data);
|
return await service.addProject(context.user, organizationSlug, data, lrn, auctionData);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log(err);
|
log(err);
|
||||||
throw err;
|
throw err;
|
||||||
|
|||||||
@@ -5,10 +5,13 @@ import { authenticateUser, createUser } from '../turnkey-backend';
|
|||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Access Code
|
||||||
|
//
|
||||||
router.post('/accesscode', async (req, res) => {
|
router.post('/accesscode', async (req, res) => {
|
||||||
console.log('Access Code', req.body);
|
console.log('Access Code', req.body);
|
||||||
const { accesscode } = req.body;
|
const { accesscode } = req.body;
|
||||||
if (accesscode === '444444') {
|
if (accesscode === '44444') {
|
||||||
return res.send({ isValid: true });
|
return res.send({ isValid: true });
|
||||||
} else {
|
} else {
|
||||||
return res.sendStatus(204);
|
return res.sendStatus(204);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Router } from 'express';
|
|||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
router.get('/version', async (req, res) => {
|
router.get('/version', async (req, res) => {
|
||||||
return res.send({ version: '0.0.7' });
|
return res.send({ version: '0.0.9' });
|
||||||
});
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
@@ -22,6 +22,13 @@ enum DeploymentStatus {
|
|||||||
Deleting
|
Deleting
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum AuctionStatus {
|
||||||
|
completed
|
||||||
|
reveal
|
||||||
|
commit
|
||||||
|
expired
|
||||||
|
}
|
||||||
|
|
||||||
enum DomainStatus {
|
enum DomainStatus {
|
||||||
Live
|
Live
|
||||||
Pending
|
Pending
|
||||||
@@ -65,6 +72,8 @@ type Project {
|
|||||||
repository: String!
|
repository: String!
|
||||||
prodBranch: String!
|
prodBranch: String!
|
||||||
description: String
|
description: String
|
||||||
|
deployerLrns: [String]
|
||||||
|
auctionId: String
|
||||||
template: String
|
template: String
|
||||||
framework: String
|
framework: String
|
||||||
webhooks: [String!]
|
webhooks: [String!]
|
||||||
@@ -74,7 +83,7 @@ type Project {
|
|||||||
updatedAt: String!
|
updatedAt: String!
|
||||||
organization: Organization!
|
organization: Organization!
|
||||||
icon: String
|
icon: String
|
||||||
subDomain: String
|
baseDomains: [String!]
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProjectMember {
|
type ProjectMember {
|
||||||
@@ -94,7 +103,9 @@ type Deployment {
|
|||||||
commitMessage: String!
|
commitMessage: String!
|
||||||
url: String
|
url: String
|
||||||
environment: Environment!
|
environment: Environment!
|
||||||
|
deployerLrn: String
|
||||||
isCurrent: Boolean!
|
isCurrent: Boolean!
|
||||||
|
baseDomain: String
|
||||||
status: DeploymentStatus!
|
status: DeploymentStatus!
|
||||||
createdAt: String!
|
createdAt: String!
|
||||||
updatedAt: String!
|
updatedAt: String!
|
||||||
@@ -130,6 +141,14 @@ input AddEnvironmentVariableInput {
|
|||||||
value: String!
|
value: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input AddProjectFromTemplateInput {
|
||||||
|
templateOwner: String!
|
||||||
|
templateRepo: String!
|
||||||
|
owner: String!
|
||||||
|
name: String!
|
||||||
|
isPrivate: Boolean!
|
||||||
|
}
|
||||||
|
|
||||||
input AddProjectInput {
|
input AddProjectInput {
|
||||||
name: String!
|
name: String!
|
||||||
repository: String!
|
repository: String!
|
||||||
@@ -174,6 +193,48 @@ input FilterDomainsInput {
|
|||||||
status: DomainStatus
|
status: DomainStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Fee {
|
||||||
|
type: String!
|
||||||
|
quantity: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Bid {
|
||||||
|
auctionId: String!
|
||||||
|
bidderAddress: String!
|
||||||
|
status: String!
|
||||||
|
commitHash: String!
|
||||||
|
commitTime: String
|
||||||
|
commitFee: Fee
|
||||||
|
revealTime: String
|
||||||
|
revealFee: Fee
|
||||||
|
bidAmount: Fee
|
||||||
|
}
|
||||||
|
|
||||||
|
type Auction {
|
||||||
|
id: String!
|
||||||
|
kind: String!
|
||||||
|
status: String!
|
||||||
|
ownerAddress: String!
|
||||||
|
createTime: String!
|
||||||
|
commitsEndTime: String!
|
||||||
|
revealsEndTime: String!
|
||||||
|
commitFee: Fee!
|
||||||
|
revealFee: Fee!
|
||||||
|
minimumBid: Fee
|
||||||
|
winnerAddresses: [String!]!
|
||||||
|
winnerBids: [Fee!]
|
||||||
|
winnerPrice: Fee
|
||||||
|
maxPrice: Fee
|
||||||
|
numProviders: Int!
|
||||||
|
fundsReleased: Boolean!
|
||||||
|
bids: [Bid!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
input AuctionData {
|
||||||
|
maxPrice: String,
|
||||||
|
numProviders: Int,
|
||||||
|
}
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
user: User!
|
user: User!
|
||||||
organizations: [Organization!]
|
organizations: [Organization!]
|
||||||
@@ -184,6 +245,7 @@ type Query {
|
|||||||
environmentVariables(projectId: String!): [EnvironmentVariable!]
|
environmentVariables(projectId: String!): [EnvironmentVariable!]
|
||||||
projectMembers(projectId: String!): [ProjectMember!]
|
projectMembers(projectId: String!): [ProjectMember!]
|
||||||
searchProjects(searchText: String!): [Project!]
|
searchProjects(searchText: String!): [Project!]
|
||||||
|
getAuctionData(auctionId: String!): Auction!
|
||||||
domains(projectId: String!, filter: FilterDomainsInput): [Domain]
|
domains(projectId: String!, filter: FilterDomainsInput): [Domain]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,7 +266,18 @@ type Mutation {
|
|||||||
): Boolean!
|
): Boolean!
|
||||||
removeEnvironmentVariable(environmentVariableId: String!): Boolean!
|
removeEnvironmentVariable(environmentVariableId: String!): Boolean!
|
||||||
updateDeploymentToProd(deploymentId: String!): Boolean!
|
updateDeploymentToProd(deploymentId: String!): Boolean!
|
||||||
addProject(organizationSlug: String!, data: AddProjectInput): Project!
|
addProjectFromTemplate(
|
||||||
|
organizationSlug: String!
|
||||||
|
data: AddProjectFromTemplateInput
|
||||||
|
lrn: String
|
||||||
|
auctionData: AuctionData
|
||||||
|
): Project!
|
||||||
|
addProject(
|
||||||
|
organizationSlug: String!
|
||||||
|
data: AddProjectInput!
|
||||||
|
lrn: String
|
||||||
|
auctionData: AuctionData
|
||||||
|
): Project!
|
||||||
updateProject(projectId: String!, data: UpdateProjectInput): Boolean!
|
updateProject(projectId: String!, data: UpdateProjectInput): Boolean!
|
||||||
redeployToProd(deploymentId: String!): Boolean!
|
redeployToProd(deploymentId: String!): Boolean!
|
||||||
deleteProject(projectId: String!): Boolean!
|
deleteProject(projectId: String!): Boolean!
|
||||||
|
|||||||
+356
-105
@@ -1,12 +1,12 @@
|
|||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
import debug from 'debug';
|
import debug from 'debug';
|
||||||
import { DeepPartial, FindOptionsWhere } from 'typeorm';
|
import { DeepPartial, FindOptionsWhere, IsNull, Not } from 'typeorm';
|
||||||
import { Octokit, RequestError } from 'octokit';
|
import { Octokit, RequestError } from 'octokit';
|
||||||
|
|
||||||
import { OAuthApp } from '@octokit/oauth-app';
|
import { OAuthApp } from '@octokit/oauth-app';
|
||||||
|
|
||||||
import { Database } from './database';
|
import { Database } from './database';
|
||||||
import { Deployment, DeploymentStatus, Environment } from './entity/Deployment';
|
import { ApplicationRecord, Deployment, DeploymentStatus, Environment } from './entity/Deployment';
|
||||||
import { Domain } from './entity/Domain';
|
import { Domain } from './entity/Domain';
|
||||||
import { EnvironmentVariable } from './entity/EnvironmentVariable';
|
import { EnvironmentVariable } from './entity/EnvironmentVariable';
|
||||||
import { Organization } from './entity/Organization';
|
import { Organization } from './entity/Organization';
|
||||||
@@ -16,12 +16,14 @@ import { User } from './entity/User';
|
|||||||
import { Registry } from './registry';
|
import { Registry } from './registry';
|
||||||
import { GitHubConfig, RegistryConfig } from './config';
|
import { GitHubConfig, RegistryConfig } from './config';
|
||||||
import {
|
import {
|
||||||
|
AddProjectFromTemplateInput,
|
||||||
AppDeploymentRecord,
|
AppDeploymentRecord,
|
||||||
AppDeploymentRemovalRecord,
|
AppDeploymentRemovalRecord,
|
||||||
|
AuctionData,
|
||||||
GitPushEventPayload,
|
GitPushEventPayload,
|
||||||
PackageJSON,
|
|
||||||
} from './types';
|
} from './types';
|
||||||
import { Role } from './entity/UserOrganization';
|
import { Role } from './entity/UserOrganization';
|
||||||
|
import { getRepoDetails } from './utils';
|
||||||
|
|
||||||
const log = debug('snowball:service');
|
const log = debug('snowball:service');
|
||||||
|
|
||||||
@@ -38,7 +40,7 @@ interface Config {
|
|||||||
export class Service {
|
export class Service {
|
||||||
private db: Database;
|
private db: Database;
|
||||||
private oauthApp: OAuthApp;
|
private oauthApp: OAuthApp;
|
||||||
private registry: Registry;
|
private laconicRegistry: Registry;
|
||||||
private config: Config;
|
private config: Config;
|
||||||
|
|
||||||
private deployRecordCheckTimeout?: NodeJS.Timeout;
|
private deployRecordCheckTimeout?: NodeJS.Timeout;
|
||||||
@@ -46,7 +48,7 @@ export class Service {
|
|||||||
constructor(config: Config, db: Database, app: OAuthApp, registry: Registry) {
|
constructor(config: Config, db: Database, app: OAuthApp, registry: Registry) {
|
||||||
this.db = db;
|
this.db = db;
|
||||||
this.oauthApp = app;
|
this.oauthApp = app;
|
||||||
this.registry = registry;
|
this.laconicRegistry = registry;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.init();
|
this.init();
|
||||||
}
|
}
|
||||||
@@ -59,6 +61,8 @@ export class Service {
|
|||||||
this.checkDeployRecordsAndUpdate();
|
this.checkDeployRecordsAndUpdate();
|
||||||
// Start check for ApplicationDeploymentRemovalRecords asynchronously
|
// Start check for ApplicationDeploymentRemovalRecords asynchronously
|
||||||
this.checkDeploymentRemovalRecordsAndUpdate();
|
this.checkDeploymentRemovalRecordsAndUpdate();
|
||||||
|
// Start check for Deployment Auctions asynchronously
|
||||||
|
this.checkAuctionStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -107,7 +111,7 @@ export class Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch ApplicationDeploymentRecord for deployments
|
// Fetch ApplicationDeploymentRecord for deployments
|
||||||
const records = await this.registry.getDeploymentRecords(deployments);
|
const records = await this.laconicRegistry.getDeploymentRecords(deployments);
|
||||||
log(`Found ${records.length} ApplicationDeploymentRecords`);
|
log(`Found ${records.length} ApplicationDeploymentRecords`);
|
||||||
|
|
||||||
// Update deployments for which ApplicationDeploymentRecords were returned
|
// Update deployments for which ApplicationDeploymentRecords were returned
|
||||||
@@ -140,7 +144,7 @@ export class Service {
|
|||||||
|
|
||||||
// Fetch ApplicationDeploymentRemovalRecords for deployments
|
// Fetch ApplicationDeploymentRemovalRecords for deployments
|
||||||
const records =
|
const records =
|
||||||
await this.registry.getDeploymentRemovalRecords(deployments);
|
await this.laconicRegistry.getDeploymentRemovalRecords(deployments);
|
||||||
log(`Found ${records.length} ApplicationDeploymentRemovalRecords`);
|
log(`Found ${records.length} ApplicationDeploymentRemovalRecords`);
|
||||||
|
|
||||||
// Update deployments for which ApplicationDeploymentRemovalRecords were returned
|
// Update deployments for which ApplicationDeploymentRemovalRecords were returned
|
||||||
@@ -161,36 +165,40 @@ export class Service {
|
|||||||
records: AppDeploymentRecord[],
|
records: AppDeploymentRecord[],
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
// Get deployments for ApplicationDeploymentRecords
|
// Get deployments for ApplicationDeploymentRecords
|
||||||
|
// Deployments that are completed but not updated(are in building state and ApplicationDeploymentRecord is present)
|
||||||
const deployments = await this.db.getDeployments({
|
const deployments = await this.db.getDeployments({
|
||||||
where: records.map((record) => ({
|
where: records.map((record) => ({
|
||||||
applicationRecordId: record.attributes.application,
|
applicationRecordId: record.attributes.application,
|
||||||
|
// Only for the specific deployer
|
||||||
|
deployerLrn: record.attributes.deployer
|
||||||
})),
|
})),
|
||||||
order: {
|
order: {
|
||||||
createdAt: 'DESC',
|
createdAt: 'DESC',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Get project IDs of deployments that are in production environment
|
// Get deployment IDs of deployments that are in production environment
|
||||||
const productionDeploymentProjectIds = deployments.reduce(
|
const productionDeploymentIds: string[] = [];
|
||||||
(acc, deployment): Set<string> => {
|
deployments.forEach(deployment => {
|
||||||
if (deployment.environment === Environment.Production) {
|
if (deployment.environment === Environment.Production) {
|
||||||
acc.add(deployment.projectId);
|
if (!productionDeploymentIds.includes(deployment.id)) {
|
||||||
|
productionDeploymentIds.push(deployment.id);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return acc;
|
});
|
||||||
},
|
|
||||||
new Set<string>(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Set old deployments isCurrent to false
|
// Set old deployments isCurrent to false
|
||||||
await this.db.updateDeploymentsByProjectIds(
|
// TODO: Only set isCurrent to false for the deployment for that specific deployer
|
||||||
Array.from(productionDeploymentProjectIds),
|
for (const deploymentId of productionDeploymentIds) {
|
||||||
{ isCurrent: false },
|
await this.db.updateDeployment(
|
||||||
|
{ id: deploymentId },
|
||||||
|
{ isCurrent: false }
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const recordToDeploymentsMap = deployments.reduce(
|
const recordToDeploymentsMap = deployments.reduce(
|
||||||
(acc: { [key: string]: Deployment }, deployment) => {
|
(acc: { [key: string]: Deployment }, deployment) => {
|
||||||
acc[deployment.applicationRecordId] = deployment;
|
acc[deployment.applicationDeploymentRequestId!] = deployment;
|
||||||
return acc;
|
return acc;
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
@@ -198,16 +206,32 @@ export class Service {
|
|||||||
|
|
||||||
// Update deployment data for ApplicationDeploymentRecords
|
// Update deployment data for ApplicationDeploymentRecords
|
||||||
const deploymentUpdatePromises = records.map(async (record) => {
|
const deploymentUpdatePromises = records.map(async (record) => {
|
||||||
const deployment = recordToDeploymentsMap[record.attributes.application];
|
const deployment = recordToDeploymentsMap[record.attributes.request];
|
||||||
|
const project = await this.getProjectById(deployment.projectId)
|
||||||
|
assert(project)
|
||||||
|
|
||||||
|
const parts = record.attributes.url.replace('https://', '').split('.');
|
||||||
|
const baseDomain = parts.slice(1).join('.');
|
||||||
|
|
||||||
await this.db.updateDeploymentById(deployment.id, {
|
await this.db.updateDeploymentById(deployment.id, {
|
||||||
applicationDeploymentRecordId: record.id,
|
applicationDeploymentRecordId: record.id,
|
||||||
applicationDeploymentRecordData: record.attributes,
|
applicationDeploymentRecordData: record.attributes,
|
||||||
url: record.attributes.url,
|
url: record.attributes.url,
|
||||||
|
baseDomain,
|
||||||
status: DeploymentStatus.Ready,
|
status: DeploymentStatus.Ready,
|
||||||
isCurrent: deployment.environment === Environment.Production,
|
isCurrent: deployment.environment === Environment.Production,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const baseDomains = project.baseDomains || [];
|
||||||
|
|
||||||
|
if (!baseDomains.includes(baseDomain)) {
|
||||||
|
baseDomains.push(baseDomain);
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.db.updateProjectById(project.id, {
|
||||||
|
baseDomains
|
||||||
|
})
|
||||||
|
|
||||||
log(
|
log(
|
||||||
`Updated deployment ${deployment.id} with URL ${record.attributes.url}`,
|
`Updated deployment ${deployment.id} with URL ${record.attributes.url}`,
|
||||||
);
|
);
|
||||||
@@ -256,11 +280,69 @@ export class Service {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await this.db.deleteDeploymentById(deployment.id);
|
await this.db.deleteDeploymentById(deployment.id);
|
||||||
|
const project = await this.db.getProjectById(deployment.projectId);
|
||||||
|
|
||||||
|
const updatedBaseDomains = project!.baseDomains!.filter(baseDomain => baseDomain !== deployment.baseDomain);
|
||||||
|
|
||||||
|
await this.db.updateProjectById(deployment.projectId, {
|
||||||
|
baseDomains: updatedBaseDomains
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
await Promise.all(deploymentUpdatePromises);
|
await Promise.all(deploymentUpdatePromises);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the status for all ongoing auctions
|
||||||
|
* Calls the createDeploymentFromAuction method for deployments with completed auctions
|
||||||
|
*/
|
||||||
|
async checkAuctionStatus(): Promise<void> {
|
||||||
|
const allProjects = await this.db.getProjects({
|
||||||
|
where: {
|
||||||
|
auctionId: Not(IsNull()),
|
||||||
|
},
|
||||||
|
relations: ['deployments'],
|
||||||
|
withDeleted: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Should only check on the first deployment
|
||||||
|
const projects = allProjects.filter(project => {
|
||||||
|
if (project.deletedAt !== null) return false;
|
||||||
|
|
||||||
|
const deletedDeployments = project.deployments.filter(deployment => deployment.deletedAt !== null).length;
|
||||||
|
|
||||||
|
return project.deployments.length === 0 && deletedDeployments === 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
const auctionIds = projects.map((project) => project.auctionId);
|
||||||
|
const completedAuctionIds = await this.laconicRegistry.getCompletedAuctionIds(auctionIds);
|
||||||
|
|
||||||
|
if (completedAuctionIds) {
|
||||||
|
const projectsToBedeployed = projects.filter((project) =>
|
||||||
|
completedAuctionIds.includes(project.auctionId!)
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const project of projectsToBedeployed) {
|
||||||
|
log(`Auction ${project!.auctionId} completed`);
|
||||||
|
|
||||||
|
const deployerLrns = await this.laconicRegistry.getAuctionWinningDeployers(project!.auctionId!);
|
||||||
|
// Update project with deployer LRNs
|
||||||
|
await this.db.updateProjectById(project.id!, {
|
||||||
|
deployerLrns
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const deployer of deployerLrns) {
|
||||||
|
log(`Creating deployment for deployer LRN ${deployer}`);
|
||||||
|
await this.createDeploymentFromAuction(project, deployer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.deployRecordCheckTimeout = setTimeout(() => {
|
||||||
|
this.checkAuctionStatus();
|
||||||
|
}, this.config.registryConfig.checkAuctionStatusDelay);
|
||||||
|
}
|
||||||
|
|
||||||
async getUser(userId: string): Promise<User | null> {
|
async getUser(userId: string): Promise<User | null> {
|
||||||
return this.db.getUser({
|
return this.db.getUser({
|
||||||
where: {
|
where: {
|
||||||
@@ -518,7 +600,7 @@ export class Service {
|
|||||||
domain: prodBranchDomains[0],
|
domain: prodBranchDomains[0],
|
||||||
commitHash: oldDeployment.commitHash,
|
commitHash: oldDeployment.commitHash,
|
||||||
commitMessage: oldDeployment.commitMessage,
|
commitMessage: oldDeployment.commitMessage,
|
||||||
});
|
}, oldDeployment.deployerLrn);
|
||||||
|
|
||||||
return newDeployment;
|
return newDeployment;
|
||||||
}
|
}
|
||||||
@@ -527,44 +609,20 @@ export class Service {
|
|||||||
userId: string,
|
userId: string,
|
||||||
octokit: Octokit,
|
octokit: Octokit,
|
||||||
data: DeepPartial<Deployment>,
|
data: DeepPartial<Deployment>,
|
||||||
|
deployerLrn: string
|
||||||
): Promise<Deployment> {
|
): Promise<Deployment> {
|
||||||
assert(data.project?.repository, 'Project repository not found');
|
assert(data.project?.repository, 'Project repository not found');
|
||||||
log(
|
log(
|
||||||
`Creating deployment in project ${data.project.name} from branch ${data.branch}`,
|
`Creating deployment in project ${data.project.name} from branch ${data.branch}`,
|
||||||
);
|
);
|
||||||
const [owner, repo] = data.project.repository.split('/');
|
|
||||||
|
|
||||||
const { data: packageJSONData } = await octokit.rest.repos.getContent({
|
|
||||||
owner,
|
|
||||||
repo,
|
|
||||||
path: 'package.json',
|
|
||||||
ref: data.commitHash,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!packageJSONData) {
|
|
||||||
throw new Error('Package.json file not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!Array.isArray(packageJSONData) && packageJSONData.type === 'file');
|
|
||||||
const packageJSON: PackageJSON = JSON.parse(atob(packageJSONData.content));
|
|
||||||
|
|
||||||
assert(packageJSON.name, "name field doesn't exist in package.json");
|
|
||||||
|
|
||||||
const repoUrl = (
|
|
||||||
await octokit.rest.repos.get({
|
|
||||||
owner,
|
|
||||||
repo,
|
|
||||||
})
|
|
||||||
).data.html_url;
|
|
||||||
|
|
||||||
// TODO: Set environment variables for each deployment (environment variables can`t be set in application record)
|
// TODO: Set environment variables for each deployment (environment variables can`t be set in application record)
|
||||||
const { applicationRecordId, applicationRecordData } =
|
const { applicationRecordId, applicationRecordData } =
|
||||||
await this.registry.createApplicationRecord({
|
await this.laconicRegistry.createApplicationRecord({
|
||||||
appName: repo,
|
octokit,
|
||||||
packageJSON,
|
repository: data.project.repository,
|
||||||
appType: data.project!.template!,
|
appType: data.project!.template!,
|
||||||
commitHash: data.commitHash!,
|
commitHash: data.commitHash!,
|
||||||
repoUrl,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update previous deployment with prod branch domain
|
// Update previous deployment with prod branch domain
|
||||||
@@ -580,6 +638,130 @@ export class Service {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const newDeployment = await this.createDeploymentFromData(userId, data, deployerLrn, applicationRecordId, applicationRecordData);
|
||||||
|
|
||||||
|
const { repo, repoUrl } = await getRepoDetails(octokit, data.project.repository, data.commitHash);
|
||||||
|
const environmentVariablesObj = await this.getEnvVariables(data.project!.id!);
|
||||||
|
// To set project DNS
|
||||||
|
if (data.environment === Environment.Production) {
|
||||||
|
// On deleting deployment later, project DNS deployment is also deleted
|
||||||
|
// So publish project DNS deployment first so that ApplicationDeploymentRecord for the same is available when deleting deployment later
|
||||||
|
await this.laconicRegistry.createApplicationDeploymentRequest({
|
||||||
|
deployment: newDeployment,
|
||||||
|
appName: repo,
|
||||||
|
repository: repoUrl,
|
||||||
|
environmentVariables: environmentVariablesObj,
|
||||||
|
dns: `${newDeployment.project.name}`,
|
||||||
|
lrn: deployerLrn
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const { applicationDeploymentRequestId, applicationDeploymentRequestData } =
|
||||||
|
await this.laconicRegistry.createApplicationDeploymentRequest({
|
||||||
|
deployment: newDeployment,
|
||||||
|
appName: repo,
|
||||||
|
repository: repoUrl,
|
||||||
|
lrn: deployerLrn,
|
||||||
|
environmentVariables: environmentVariablesObj,
|
||||||
|
dns: `${newDeployment.project.name}-${newDeployment.id}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
await this.db.updateDeploymentById(newDeployment.id, {
|
||||||
|
applicationDeploymentRequestId,
|
||||||
|
applicationDeploymentRequestData,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save deployer lrn only if present
|
||||||
|
if (deployerLrn) {
|
||||||
|
newDeployment.project.deployerLrns = [deployerLrn];
|
||||||
|
}
|
||||||
|
|
||||||
|
return newDeployment;
|
||||||
|
}
|
||||||
|
|
||||||
|
async createDeploymentFromAuction(
|
||||||
|
project: DeepPartial<Project>,
|
||||||
|
deployerLrn: string
|
||||||
|
): Promise<Deployment> {
|
||||||
|
const octokit = await this.getOctokit(project.ownerId!);
|
||||||
|
const [owner, repo] = project.repository!.split('/');
|
||||||
|
|
||||||
|
const repoUrl = (
|
||||||
|
await octokit.rest.repos.get({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
})
|
||||||
|
).data.html_url;
|
||||||
|
|
||||||
|
const {
|
||||||
|
data: [latestCommit],
|
||||||
|
} = await octokit.rest.repos.listCommits({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
sha: project.prodBranch,
|
||||||
|
per_page: 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
const lrn = this.laconicRegistry.getLrn(repo);
|
||||||
|
const [record] = await this.laconicRegistry.getRecordsByName(lrn);
|
||||||
|
const applicationRecordId = record.id;
|
||||||
|
const applicationRecordData = record.attributes;
|
||||||
|
|
||||||
|
// Create deployment with prod branch and latest commit
|
||||||
|
const deploymentData = {
|
||||||
|
project,
|
||||||
|
branch: project.prodBranch,
|
||||||
|
environment: Environment.Production,
|
||||||
|
domain: null,
|
||||||
|
commitHash: latestCommit.sha,
|
||||||
|
commitMessage: latestCommit.commit.message,
|
||||||
|
};
|
||||||
|
|
||||||
|
const newDeployment = await this.createDeploymentFromData(project.ownerId!, deploymentData, deployerLrn, applicationRecordId, applicationRecordData);
|
||||||
|
|
||||||
|
const environmentVariablesObj = await this.getEnvVariables(project!.id!);
|
||||||
|
// To set project DNS
|
||||||
|
if (deploymentData.environment === Environment.Production) {
|
||||||
|
// On deleting deployment later, project DNS deployment is also deleted
|
||||||
|
// So publish project DNS deployment first so that ApplicationDeploymentRecord for the same is available when deleting deployment later
|
||||||
|
await this.laconicRegistry.createApplicationDeploymentRequest({
|
||||||
|
deployment: newDeployment,
|
||||||
|
appName: repo,
|
||||||
|
repository: repoUrl,
|
||||||
|
environmentVariables: environmentVariablesObj,
|
||||||
|
dns: `${newDeployment.project.name}`,
|
||||||
|
auctionId: project.auctionId!,
|
||||||
|
lrn: deployerLrn,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const { applicationDeploymentRequestId, applicationDeploymentRequestData } =
|
||||||
|
// Create requests for all the deployers
|
||||||
|
await this.laconicRegistry.createApplicationDeploymentRequest({
|
||||||
|
deployment: newDeployment,
|
||||||
|
appName: repo,
|
||||||
|
repository: repoUrl,
|
||||||
|
auctionId: project.auctionId!,
|
||||||
|
lrn: deployerLrn,
|
||||||
|
environmentVariables: environmentVariablesObj,
|
||||||
|
dns: `${newDeployment.project.name}-${newDeployment.id}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
await this.db.updateDeploymentById(newDeployment.id, {
|
||||||
|
applicationDeploymentRequestId,
|
||||||
|
applicationDeploymentRequestData,
|
||||||
|
});
|
||||||
|
|
||||||
|
return newDeployment;
|
||||||
|
}
|
||||||
|
|
||||||
|
async createDeploymentFromData(
|
||||||
|
userId: string,
|
||||||
|
data: DeepPartial<Deployment>,
|
||||||
|
deployerLrn: string,
|
||||||
|
applicationRecordId: string,
|
||||||
|
applicationRecordData: ApplicationRecord,
|
||||||
|
): Promise<Deployment> {
|
||||||
const newDeployment = await this.db.addDeployment({
|
const newDeployment = await this.db.addDeployment({
|
||||||
project: data.project,
|
project: data.project,
|
||||||
branch: data.branch,
|
branch: data.branch,
|
||||||
@@ -593,60 +775,69 @@ export class Service {
|
|||||||
createdBy: Object.assign(new User(), {
|
createdBy: Object.assign(new User(), {
|
||||||
id: userId,
|
id: userId,
|
||||||
}),
|
}),
|
||||||
|
deployerLrn,
|
||||||
});
|
});
|
||||||
|
|
||||||
log(
|
log(`Created deployment ${newDeployment.id}`);
|
||||||
`Created deployment ${newDeployment.id} and published application record ${applicationRecordId}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
const environmentVariables =
|
|
||||||
await this.db.getEnvironmentVariablesByProjectId(data.project.id!, {
|
|
||||||
environment: Environment.Production,
|
|
||||||
});
|
|
||||||
|
|
||||||
const environmentVariablesObj = environmentVariables.reduce(
|
|
||||||
(acc, env) => {
|
|
||||||
acc[env.key] = env.value;
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
},
|
|
||||||
{} as { [key: string]: string },
|
|
||||||
);
|
|
||||||
|
|
||||||
// To set project DNS
|
|
||||||
if (data.environment === Environment.Production) {
|
|
||||||
// On deleting deployment later, project DNS deployment is also deleted
|
|
||||||
// So publish project DNS deployment first so that ApplicationDeploymentRecord for the same is available when deleting deployment later
|
|
||||||
await this.registry.createApplicationDeploymentRequest({
|
|
||||||
deployment: newDeployment,
|
|
||||||
appName: repo,
|
|
||||||
repository: repoUrl,
|
|
||||||
environmentVariables: environmentVariablesObj,
|
|
||||||
dns: `${newDeployment.project.name}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const { applicationDeploymentRequestId, applicationDeploymentRequestData } =
|
|
||||||
await this.registry.createApplicationDeploymentRequest({
|
|
||||||
deployment: newDeployment,
|
|
||||||
appName: repo,
|
|
||||||
repository: repoUrl,
|
|
||||||
environmentVariables: environmentVariablesObj,
|
|
||||||
dns: `${newDeployment.project.name}-${newDeployment.id}`,
|
|
||||||
});
|
|
||||||
|
|
||||||
await this.db.updateDeploymentById(newDeployment.id, {
|
|
||||||
applicationDeploymentRequestId,
|
|
||||||
applicationDeploymentRequestData,
|
|
||||||
});
|
|
||||||
|
|
||||||
return newDeployment;
|
return newDeployment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async addProjectFromTemplate(
|
||||||
|
user: User,
|
||||||
|
organizationSlug: string,
|
||||||
|
data: AddProjectFromTemplateInput,
|
||||||
|
lrn?: string,
|
||||||
|
auctionData?: AuctionData
|
||||||
|
): Promise<Project | undefined> {
|
||||||
|
try {
|
||||||
|
const octokit = await this.getOctokit(user.id);
|
||||||
|
|
||||||
|
const gitRepo = await octokit?.rest.repos.createUsingTemplate({
|
||||||
|
template_owner: data.templateOwner,
|
||||||
|
template_repo: data.templateRepo,
|
||||||
|
owner: data.owner,
|
||||||
|
name: data.name,
|
||||||
|
include_all_branches: false,
|
||||||
|
private: data.isPrivate,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!gitRepo) {
|
||||||
|
throw new Error('Failed to create repository from template');
|
||||||
|
}
|
||||||
|
|
||||||
|
const createdTemplateRepo = await octokit.rest.repos.get({
|
||||||
|
owner: data.owner,
|
||||||
|
repo: data.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
const prodBranch = createdTemplateRepo.data.default_branch ?? 'main';
|
||||||
|
|
||||||
|
const project = await this.addProject(user, organizationSlug, {
|
||||||
|
name: `${gitRepo.data.owner!.login}-${gitRepo.data.name}`,
|
||||||
|
prodBranch,
|
||||||
|
repository: gitRepo.data.full_name,
|
||||||
|
// TODO: Set selected template
|
||||||
|
template: 'webapp',
|
||||||
|
}, lrn, auctionData);
|
||||||
|
|
||||||
|
if (!project || !project.id) {
|
||||||
|
throw new Error('Failed to create project from template');
|
||||||
|
}
|
||||||
|
|
||||||
|
return project;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error creating project from template:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async addProject(
|
async addProject(
|
||||||
user: User,
|
user: User,
|
||||||
organizationSlug: string,
|
organizationSlug: string,
|
||||||
data: DeepPartial<Project>,
|
data: DeepPartial<Project>,
|
||||||
|
lrn?: string,
|
||||||
|
auctionData?: AuctionData
|
||||||
): Promise<Project | undefined> {
|
): Promise<Project | undefined> {
|
||||||
const organization = await this.db.getOrganization({
|
const organization = await this.db.getOrganization({
|
||||||
where: {
|
where: {
|
||||||
@@ -658,6 +849,7 @@ export class Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const project = await this.db.addProject(user, organization.id, data);
|
const project = await this.db.addProject(user, organization.id, data);
|
||||||
|
log(`Project created ${project.id}`);
|
||||||
|
|
||||||
const octokit = await this.getOctokit(user.id);
|
const octokit = await this.getOctokit(user.id);
|
||||||
const [owner, repo] = project.repository.split('/');
|
const [owner, repo] = project.repository.split('/');
|
||||||
@@ -672,14 +864,21 @@ export class Service {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Create deployment with prod branch and latest commit
|
// Create deployment with prod branch and latest commit
|
||||||
await this.createDeployment(user.id, octokit, {
|
const deploymentData = {
|
||||||
project,
|
project,
|
||||||
branch: project.prodBranch,
|
branch: project.prodBranch,
|
||||||
environment: Environment.Production,
|
environment: Environment.Production,
|
||||||
domain: null,
|
domain: null,
|
||||||
commitHash: latestCommit.sha,
|
commitHash: latestCommit.sha,
|
||||||
commitMessage: latestCommit.commit.message,
|
commitMessage: latestCommit.commit.message,
|
||||||
});
|
};
|
||||||
|
|
||||||
|
if (auctionData) {
|
||||||
|
const { applicationDeploymentAuctionId } = await this.laconicRegistry.createApplicationDeploymentAuction(repo, octokit, auctionData!, deploymentData);
|
||||||
|
await this.updateProject(project.id, { auctionId: applicationDeploymentAuctionId })
|
||||||
|
} else {
|
||||||
|
await this.createDeployment(user.id, octokit, deploymentData, lrn!);
|
||||||
|
}
|
||||||
|
|
||||||
await this.createRepoHook(octokit, project);
|
await this.createRepoHook(octokit, project);
|
||||||
|
|
||||||
@@ -748,8 +947,15 @@ export class Service {
|
|||||||
branch,
|
branch,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const deployers = project.deployerLrns;
|
||||||
|
if (!deployers) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const deployer of deployers) {
|
||||||
// Create deployment with branch and latest commit in GitHub data
|
// Create deployment with branch and latest commit in GitHub data
|
||||||
await this.createDeployment(project.ownerId, octokit, {
|
await this.createDeployment(project.ownerId, octokit,
|
||||||
|
{
|
||||||
project,
|
project,
|
||||||
branch,
|
branch,
|
||||||
environment:
|
environment:
|
||||||
@@ -759,10 +965,14 @@ export class Service {
|
|||||||
domain,
|
domain,
|
||||||
commitHash: headCommit.id,
|
commitHash: headCommit.id,
|
||||||
commitMessage: headCommit.message,
|
commitMessage: headCommit.message,
|
||||||
});
|
},
|
||||||
|
deployer
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
async updateProject(
|
async updateProject(
|
||||||
projectId: string,
|
projectId: string,
|
||||||
data: DeepPartial<Project>,
|
data: DeepPartial<Project>,
|
||||||
@@ -809,7 +1019,13 @@ export class Service {
|
|||||||
|
|
||||||
const octokit = await this.getOctokit(user.id);
|
const octokit = await this.getOctokit(user.id);
|
||||||
|
|
||||||
const newDeployment = await this.createDeployment(user.id, octokit, {
|
let newDeployment: Deployment;
|
||||||
|
|
||||||
|
if (oldDeployment.project.auctionId) {
|
||||||
|
newDeployment = await this.createDeploymentFromAuction(oldDeployment.project, oldDeployment.deployerLrn);
|
||||||
|
} else {
|
||||||
|
newDeployment = await this.createDeployment(user.id, octokit,
|
||||||
|
{
|
||||||
project: oldDeployment.project,
|
project: oldDeployment.project,
|
||||||
// TODO: Put isCurrent field in project
|
// TODO: Put isCurrent field in project
|
||||||
branch: oldDeployment.branch,
|
branch: oldDeployment.branch,
|
||||||
@@ -817,7 +1033,10 @@ export class Service {
|
|||||||
domain: oldDeployment.domain,
|
domain: oldDeployment.domain,
|
||||||
commitHash: oldDeployment.commitHash,
|
commitHash: oldDeployment.commitHash,
|
||||||
commitMessage: oldDeployment.commitMessage,
|
commitMessage: oldDeployment.commitMessage,
|
||||||
});
|
},
|
||||||
|
oldDeployment.deployerLrn
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return newDeployment;
|
return newDeployment;
|
||||||
}
|
}
|
||||||
@@ -869,10 +1088,11 @@ export class Service {
|
|||||||
if (deployment && deployment.applicationDeploymentRecordId) {
|
if (deployment && deployment.applicationDeploymentRecordId) {
|
||||||
// If deployment is current, remove deployment for project subdomain as well
|
// If deployment is current, remove deployment for project subdomain as well
|
||||||
if (deployment.isCurrent) {
|
if (deployment.isCurrent) {
|
||||||
const currentDeploymentURL = `https://${deployment.project.subDomain}`;
|
const currentDeploymentURL = `https://${(deployment.project.name).toLowerCase()}.${deployment.baseDomain}`;
|
||||||
|
|
||||||
|
// TODO: Store the latest DNS deployment record
|
||||||
const deploymentRecords =
|
const deploymentRecords =
|
||||||
await this.registry.getDeploymentRecordsByFilter({
|
await this.laconicRegistry.getDeploymentRecordsByFilter({
|
||||||
application: deployment.applicationRecordId,
|
application: deployment.applicationRecordId,
|
||||||
url: currentDeploymentURL,
|
url: currentDeploymentURL,
|
||||||
});
|
});
|
||||||
@@ -885,14 +1105,20 @@ export class Service {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.registry.createApplicationDeploymentRemovalRequest({
|
// Multiple records are fetched, take the latest record
|
||||||
deploymentId: deploymentRecords[0].id,
|
const latestRecord = deploymentRecords
|
||||||
|
.sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime())[0];
|
||||||
|
|
||||||
|
await this.laconicRegistry.createApplicationDeploymentRemovalRequest({
|
||||||
|
deploymentId: latestRecord.id,
|
||||||
|
deployerLrn: deployment.deployerLrn
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const result =
|
const result =
|
||||||
await this.registry.createApplicationDeploymentRemovalRequest({
|
await this.laconicRegistry.createApplicationDeploymentRemovalRequest({
|
||||||
deploymentId: deployment.applicationDeploymentRecordId,
|
deploymentId: deployment.applicationDeploymentRecordId,
|
||||||
|
deployerLrn: deployment.deployerLrn
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.db.updateDeploymentById(deployment.id, {
|
await this.db.updateDeploymentById(deployment.id, {
|
||||||
@@ -1027,4 +1253,29 @@ export class Service {
|
|||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
return this.db.updateUser(user, data);
|
return this.db.updateUser(user, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getEnvVariables(
|
||||||
|
projectId: string,
|
||||||
|
): Promise<{ [key: string]: string }> {
|
||||||
|
const environmentVariables = await this.db.getEnvironmentVariablesByProjectId(projectId, {
|
||||||
|
environment: Environment.Production,
|
||||||
|
});
|
||||||
|
|
||||||
|
const environmentVariablesObj = environmentVariables.reduce(
|
||||||
|
(acc, env) => {
|
||||||
|
acc[env.key] = env.value;
|
||||||
|
return acc;
|
||||||
|
},
|
||||||
|
{} as { [key: string]: string },
|
||||||
|
);
|
||||||
|
|
||||||
|
return environmentVariablesObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAuctionData(
|
||||||
|
auctionId: string
|
||||||
|
): Promise<any> {
|
||||||
|
const auctions = await this.laconicRegistry.getAuctionData(auctionId);
|
||||||
|
return auctions[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ export interface GitPushEventPayload {
|
|||||||
|
|
||||||
export interface AppDeploymentRecordAttributes {
|
export interface AppDeploymentRecordAttributes {
|
||||||
application: string;
|
application: string;
|
||||||
|
auction: string;
|
||||||
|
deployer: string;
|
||||||
dns: string;
|
dns: string;
|
||||||
meta: string;
|
meta: string;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -41,7 +43,7 @@ export interface AppDeploymentRecordAttributes {
|
|||||||
export interface AppDeploymentRemovalRecordAttributes {
|
export interface AppDeploymentRemovalRecordAttributes {
|
||||||
deployment: string;
|
deployment: string;
|
||||||
request: string;
|
request: string;
|
||||||
type: "ApplicationDeploymentRemovalRecord";
|
type: 'ApplicationDeploymentRemovalRecord';
|
||||||
version: string;
|
version: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,3 +63,36 @@ export interface AppDeploymentRecord extends RegistryRecord {
|
|||||||
export interface AppDeploymentRemovalRecord extends RegistryRecord {
|
export interface AppDeploymentRemovalRecord extends RegistryRecord {
|
||||||
attributes: AppDeploymentRemovalRecordAttributes;
|
attributes: AppDeploymentRemovalRecordAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AddProjectFromTemplateInput {
|
||||||
|
templateOwner: string;
|
||||||
|
templateRepo: string;
|
||||||
|
owner: string;
|
||||||
|
name: string;
|
||||||
|
isPrivate: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Auction {
|
||||||
|
id: string;
|
||||||
|
kind: string;
|
||||||
|
status: string;
|
||||||
|
ownerAddress: string;
|
||||||
|
createTime: Date;
|
||||||
|
commitsEndTime: Date;
|
||||||
|
revealsEndTime: Date;
|
||||||
|
commitFee: string;
|
||||||
|
revealFee: string;
|
||||||
|
minimumBid?: string;
|
||||||
|
winnerAddresses: string[];
|
||||||
|
winnerBids?: string[];
|
||||||
|
winnerPrice?: string;
|
||||||
|
maxPrice?: string;
|
||||||
|
numProviders: number;
|
||||||
|
fundsReleased: boolean;
|
||||||
|
bids: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AuctionData {
|
||||||
|
maxPrice: string,
|
||||||
|
numProviders: number,
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
|
import assert from 'assert';
|
||||||
|
import debug from 'debug';
|
||||||
import fs from 'fs-extra';
|
import fs from 'fs-extra';
|
||||||
|
import { Octokit } from 'octokit';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import toml from 'toml';
|
import toml from 'toml';
|
||||||
import debug from 'debug';
|
|
||||||
import { DataSource, DeepPartial, EntityTarget, ObjectLiteral } from 'typeorm';
|
import { DataSource, DeepPartial, EntityTarget, ObjectLiteral } from 'typeorm';
|
||||||
|
|
||||||
import { Config } from './config';
|
import { Config } from './config';
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from './constants';
|
import { DEFAULT_CONFIG_FILE_PATH } from './constants';
|
||||||
|
import { PackageJSON } from './types';
|
||||||
|
|
||||||
const log = debug('snowball:utils');
|
const log = debug('snowball:utils');
|
||||||
|
|
||||||
@@ -76,3 +80,43 @@ export const loadAndSaveData = async <Entity extends ObjectLiteral>(
|
|||||||
|
|
||||||
export const sleep = async (ms: number): Promise<void> =>
|
export const sleep = async (ms: number): Promise<void> =>
|
||||||
new Promise((resolve) => setTimeout(resolve, ms));
|
new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
|
||||||
|
export const getRepoDetails = async (
|
||||||
|
octokit: Octokit,
|
||||||
|
repository: string,
|
||||||
|
commitHash: string | undefined,
|
||||||
|
): Promise<{
|
||||||
|
repo: string;
|
||||||
|
packageJSON: PackageJSON;
|
||||||
|
repoUrl: string;
|
||||||
|
}> => {
|
||||||
|
const [owner, repo] = repository.split('/');
|
||||||
|
const { data: packageJSONData } = await octokit.rest.repos.getContent({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
path: 'package.json',
|
||||||
|
ref: commitHash,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!packageJSONData) {
|
||||||
|
throw new Error('Package.json file not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(!Array.isArray(packageJSONData) && packageJSONData.type === 'file');
|
||||||
|
const packageJSON: PackageJSON = JSON.parse(atob(packageJSONData.content));
|
||||||
|
|
||||||
|
assert(packageJSON.name, "name field doesn't exist in package.json");
|
||||||
|
|
||||||
|
const repoUrl = (
|
||||||
|
await octokit.rest.repos.get({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
})
|
||||||
|
).data.html_url;
|
||||||
|
|
||||||
|
return {
|
||||||
|
repo,
|
||||||
|
packageJSON,
|
||||||
|
repoUrl
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ import * as fs from 'fs/promises';
|
|||||||
import debug from 'debug';
|
import debug from 'debug';
|
||||||
|
|
||||||
import { getConfig } from '../src/utils';
|
import { getConfig } from '../src/utils';
|
||||||
import { Config } from '../src/config';
|
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
|
||||||
|
|
||||||
const log = debug('snowball:delete-database');
|
const log = debug('snowball:delete-database');
|
||||||
|
|
||||||
@@ -13,7 +11,7 @@ const deleteFile = async (filePath: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const config = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH);
|
const config = await getConfig();
|
||||||
|
|
||||||
deleteFile(config.database.dbPath);
|
deleteFile(config.database.dbPath);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,8 +16,6 @@ import {
|
|||||||
getEntities,
|
getEntities,
|
||||||
loadAndSaveData
|
loadAndSaveData
|
||||||
} from '../src/utils';
|
} from '../src/utils';
|
||||||
import { Config } from '../src/config';
|
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
|
||||||
|
|
||||||
const log = debug('snowball:initialize-database');
|
const log = debug('snowball:initialize-database');
|
||||||
|
|
||||||
@@ -156,7 +154,7 @@ const generateTestData = async (dataSource: DataSource) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const config = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH);
|
const config = await getConfig();
|
||||||
const isDbPresent = await checkFileExists(config.database.dbPath);
|
const isDbPresent = await checkFileExists(config.database.dbPath);
|
||||||
|
|
||||||
if (!isDbPresent) {
|
if (!isDbPresent) {
|
||||||
|
|||||||
@@ -1,39 +1,40 @@
|
|||||||
import debug from 'debug';
|
import debug from 'debug';
|
||||||
|
|
||||||
import { Registry } from '@snowballtools/laconic-sdk';
|
import { parseGasAndFees, Registry } from '@cerc-io/registry-sdk';
|
||||||
|
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
|
||||||
import { Config } from '../src/config';
|
|
||||||
import { getConfig } from '../src/utils';
|
import { getConfig } from '../src/utils';
|
||||||
|
|
||||||
const log = debug('snowball:initialize-registry');
|
const log = debug('snowball:initialize-registry');
|
||||||
|
|
||||||
const DENOM = 'aphoton';
|
const DENOM = 'alnt';
|
||||||
const BOND_AMOUNT = '1000000000';
|
const BOND_AMOUNT = '1000000000';
|
||||||
|
|
||||||
async function main () {
|
async function main () {
|
||||||
const { registryConfig } = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH);
|
const { registryConfig } = await getConfig();
|
||||||
|
|
||||||
// TODO: Get authority names from args
|
// TODO: Get authority names from args
|
||||||
const authorityNames = ['snowballtools', registryConfig.authority];
|
const authorityNames = ['snowballtools', registryConfig.authority];
|
||||||
|
|
||||||
const registry = new Registry(registryConfig.gqlEndpoint, registryConfig.restEndpoint, registryConfig.chainId);
|
const registry = new Registry(registryConfig.gqlEndpoint, registryConfig.restEndpoint, {chainId: registryConfig.chainId});
|
||||||
|
|
||||||
const bondId = await registry.getNextBondId(registryConfig.privateKey);
|
const bondId = await registry.getNextBondId(registryConfig.privateKey);
|
||||||
log('bondId:', bondId);
|
log('bondId:', bondId);
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(registryConfig.fee.gas, registryConfig.fee.fees);
|
||||||
|
|
||||||
await registry.createBond(
|
await registry.createBond(
|
||||||
{ denom: DENOM, amount: BOND_AMOUNT },
|
{ denom: DENOM, amount: BOND_AMOUNT },
|
||||||
registryConfig.privateKey,
|
registryConfig.privateKey,
|
||||||
registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
|
|
||||||
for await (const name of authorityNames) {
|
for await (const name of authorityNames) {
|
||||||
await registry.reserveAuthority({ name }, registryConfig.privateKey, registryConfig.fee);
|
await registry.reserveAuthority({ name }, registryConfig.privateKey, fee);
|
||||||
log('Reserved authority name:', name);
|
log('Reserved authority name:', name);
|
||||||
await registry.setAuthorityBond(
|
await registry.setAuthorityBond(
|
||||||
{ name, bondId },
|
{ name, bondId },
|
||||||
registryConfig.privateKey,
|
registryConfig.privateKey,
|
||||||
registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
log(`Bond ${bondId} set for authority ${name}`);
|
log(`Bond ${bondId} set for authority ${name}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,22 +2,20 @@ import debug from 'debug';
|
|||||||
import { DataSource } from 'typeorm';
|
import { DataSource } from 'typeorm';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
import { Registry } from '@snowballtools/laconic-sdk';
|
import { parseGasAndFees, Registry } from '@cerc-io/registry-sdk';
|
||||||
|
|
||||||
import { Config } from '../src/config';
|
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
|
||||||
import { getConfig } from '../src/utils';
|
import { getConfig } from '../src/utils';
|
||||||
import { Deployment, DeploymentStatus, Environment } from '../src/entity/Deployment';
|
import { Deployment, DeploymentStatus, Environment } from '../src/entity/Deployment';
|
||||||
|
|
||||||
const log = debug('snowball:publish-deploy-records');
|
const log = debug('snowball:publish-deploy-records');
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
const { registryConfig, database, misc } = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH);
|
const { registryConfig, database, misc } = await getConfig();
|
||||||
|
|
||||||
const registry = new Registry(
|
const registry = new Registry(
|
||||||
registryConfig.gqlEndpoint,
|
registryConfig.gqlEndpoint,
|
||||||
registryConfig.restEndpoint,
|
registryConfig.restEndpoint,
|
||||||
registryConfig.chainId
|
{ chainId: registryConfig.chainId }
|
||||||
);
|
);
|
||||||
|
|
||||||
const dataSource = new DataSource({
|
const dataSource = new DataSource({
|
||||||
@@ -61,6 +59,8 @@ async function main () {
|
|||||||
url
|
url
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(registryConfig.fee.gas, registryConfig.fee.fees);
|
||||||
|
|
||||||
const result = await registry.setRecord(
|
const result = await registry.setRecord(
|
||||||
{
|
{
|
||||||
privateKey: registryConfig.privateKey,
|
privateKey: registryConfig.privateKey,
|
||||||
@@ -68,12 +68,12 @@ async function main () {
|
|||||||
bondId: registryConfig.bondId
|
bondId: registryConfig.bondId
|
||||||
},
|
},
|
||||||
'',
|
'',
|
||||||
registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
|
|
||||||
// Remove deployment for project subdomain if deployment is for production environment
|
// Remove deployment for project subdomain if deployment is for production environment
|
||||||
if (deployment.environment === Environment.Production) {
|
if (deployment.environment === Environment.Production) {
|
||||||
applicationDeploymentRecord.url = `https://${deployment.project.subDomain}`
|
applicationDeploymentRecord.url = `https://${deployment.project.name}.${deployment.baseDomain}`;
|
||||||
|
|
||||||
await registry.setRecord(
|
await registry.setRecord(
|
||||||
{
|
{
|
||||||
@@ -82,12 +82,12 @@ async function main () {
|
|||||||
bondId: registryConfig.bondId
|
bondId: registryConfig.bondId
|
||||||
},
|
},
|
||||||
'',
|
'',
|
||||||
registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
log('Application deployment record data:', applicationDeploymentRecord);
|
log('Application deployment record data:', applicationDeploymentRecord);
|
||||||
log(`Application deployment record published: ${result.data.id}`);
|
log(`Application deployment record published: ${result.id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,22 +2,20 @@ import debug from 'debug';
|
|||||||
import { DataSource } from 'typeorm';
|
import { DataSource } from 'typeorm';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
import { Registry } from '@cerc-io/laconic-sdk';
|
import { parseGasAndFees, Registry } from '@cerc-io/registry-sdk';
|
||||||
|
|
||||||
import { Config } from '../src/config';
|
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
|
||||||
import { getConfig } from '../src/utils';
|
import { getConfig } from '../src/utils';
|
||||||
import { Deployment, DeploymentStatus } from '../src/entity/Deployment';
|
import { Deployment, DeploymentStatus } from '../src/entity/Deployment';
|
||||||
|
|
||||||
const log = debug('snowball:publish-deployment-removal-records');
|
const log = debug('snowball:publish-deployment-removal-records');
|
||||||
|
|
||||||
async function main () {
|
async function main () {
|
||||||
const { registryConfig, database, misc } = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH);
|
const { registryConfig, database } = await getConfig();
|
||||||
|
|
||||||
const registry = new Registry(
|
const registry = new Registry(
|
||||||
registryConfig.gqlEndpoint,
|
registryConfig.gqlEndpoint,
|
||||||
registryConfig.restEndpoint,
|
registryConfig.restEndpoint,
|
||||||
registryConfig.chainId
|
{ chainId: registryConfig.chainId }
|
||||||
);
|
);
|
||||||
|
|
||||||
const dataSource = new DataSource({
|
const dataSource = new DataSource({
|
||||||
@@ -47,6 +45,8 @@ async function main () {
|
|||||||
request: deployment.applicationDeploymentRemovalRequestId,
|
request: deployment.applicationDeploymentRemovalRequestId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fee = parseGasAndFees(registryConfig.fee.gas, registryConfig.fee.fees);
|
||||||
|
|
||||||
const result = await registry.setRecord(
|
const result = await registry.setRecord(
|
||||||
{
|
{
|
||||||
privateKey: registryConfig.privateKey,
|
privateKey: registryConfig.privateKey,
|
||||||
@@ -54,11 +54,11 @@ async function main () {
|
|||||||
bondId: registryConfig.bondId
|
bondId: registryConfig.bondId
|
||||||
},
|
},
|
||||||
'',
|
'',
|
||||||
registryConfig.fee
|
fee
|
||||||
);
|
);
|
||||||
|
|
||||||
log('Application deployment removal record data:', applicationDeploymentRemovalRecord);
|
log('Application deployment removal record data:', applicationDeploymentRemovalRecord);
|
||||||
log(`Application deployment removal record published: ${result.data.id}`);
|
log(`Application deployment removal record published: ${result.id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
# deployer
|
# deployer
|
||||||
|
|
||||||
- Install dependencies
|
- Install dependencies
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn
|
yarn
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
brew install jq # if you do not have jq installed already
|
brew install jq # if you do not have jq installed already
|
||||||
```
|
```
|
||||||
@@ -12,13 +14,13 @@
|
|||||||
|
|
||||||
- To deploy frontend app to `dashboard.staging.apps.snowballtools.com`
|
- To deploy frontend app to `dashboard.staging.apps.snowballtools.com`
|
||||||
|
|
||||||
```
|
```bash
|
||||||
./deploy-frontend.staging.sh
|
./deploy-frontend.staging.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
- To deploy frontend app to `dashboard.apps.snowballtools.com`
|
- To deploy frontend app to `dashboard.apps.snowballtools.com`
|
||||||
|
|
||||||
```
|
```bash
|
||||||
./deploy-frontend.sh
|
./deploy-frontend.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -27,6 +29,7 @@
|
|||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- Any config env can be updated in [records/application-deployment-request.yml](records/application-deployment-request.yml)
|
- Any config env can be updated in [records/application-deployment-request.yml](records/application-deployment-request.yml)
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
record:
|
record:
|
||||||
...
|
...
|
||||||
@@ -35,6 +38,7 @@
|
|||||||
LACONIC_HOSTED_CONFIG_app_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
|
LACONIC_HOSTED_CONFIG_app_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
- On changing `LACONIC_HOSTED_CONFIG_app_github_clientid`, the GitHub client ID and secret need to be changed in backend config too
|
- On changing `LACONIC_HOSTED_CONFIG_app_github_clientid`, the GitHub client ID and secret need to be changed in backend config too
|
||||||
|
|
||||||
## Troubleshoot
|
## Troubleshoot
|
||||||
@@ -44,14 +48,17 @@
|
|||||||
|
|
||||||
- If deployment fails due to low bond balance
|
- If deployment fails due to low bond balance
|
||||||
- Check balances
|
- Check balances
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Account balance
|
# Account balance
|
||||||
yarn laconic cns account get
|
yarn laconic registry account get
|
||||||
|
|
||||||
# Bond balance
|
# Bond balance
|
||||||
yarn laconic cns bond get --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32
|
yarn laconic registry bond get --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32
|
||||||
```
|
```
|
||||||
|
|
||||||
- Command to refill bond
|
- Command to refill bond
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn laconic cns bond refill --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32 --type aphoton --quantity 10000000
|
yarn laconic registry bond refill --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32 --type alnt --quantity 10000000
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
services:
|
services:
|
||||||
cns:
|
registry:
|
||||||
restEndpoint: 'http://console.laconic.com:1317'
|
restEndpoint: 'http://console.laconic.com:1317'
|
||||||
gqlEndpoint: 'http://console.laconic.com:9473/api'
|
gqlEndpoint: 'http://console.laconic.com:9473/api'
|
||||||
userKey: 87d00f66a73e2ca428adeb49ba9164d0ad9a87edc60e33d46ad3031b9c5701fe
|
userKey: 87d00f66a73e2ca428adeb49ba9164d0ad9a87edc60e33d46ad3031b9c5701fe
|
||||||
bondId: 89c75c7bc5759861d10285aff6f9e7227d6855e446b77ad5d8324822dfec7deb
|
bondId: 89c75c7bc5759861d10285aff6f9e7227d6855e446b77ad5d8324822dfec7deb
|
||||||
chainId: laconic_9000-1
|
chainId: laconic_9000-1
|
||||||
gas: 1200000
|
gas:
|
||||||
fees: 200000aphoton
|
fees:
|
||||||
|
gasPrice: 1
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
services:
|
services:
|
||||||
cns:
|
registry:
|
||||||
restEndpoint: http://console.laconic.com:1317
|
restEndpoint: http://console.laconic.com:1317
|
||||||
gqlEndpoint: http://console.laconic.com:9473/api
|
gqlEndpoint: http://console.laconic.com:9473/api
|
||||||
userKey: 489c9dd3931c2a2d4dd77973302dc5eb01e2a49552f9d932c58d9da823512311
|
userKey: 489c9dd3931c2a2d4dd77973302dc5eb01e2a49552f9d932c58d9da823512311
|
||||||
bondId: 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32
|
bondId: 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32
|
||||||
chainId: laconic_9000-1
|
chainId: laconic_9000-1
|
||||||
gas: 1200000
|
gas:
|
||||||
fees: 200000aphoton
|
fees:
|
||||||
|
gasPrice: 1
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Repository URL
|
# Repository URL
|
||||||
REPO_URL="https://git.vdb.to/cerc-io/snowballtools-base"
|
REPO_URL="https://github.com/snowball-tools/snowballtools-base"
|
||||||
|
|
||||||
# Get the latest commit hash from the repository
|
# Get the latest commit hash from the repository
|
||||||
LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}')
|
LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}')
|
||||||
@@ -18,7 +18,7 @@ REGISTRY_BOND_ID="99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be
|
|||||||
# Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts
|
# Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts
|
||||||
|
|
||||||
# Get latest version from registry and increment application-record version
|
# Get latest version from registry and increment application-record version
|
||||||
NEW_APPLICATION_VERSION=$(yarn --silent laconic -c $CONFIG_FILE cns record list --type ApplicationRecord --all --name "snowballtools-base-frontend" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
NEW_APPLICATION_VERSION=$(yarn --silent laconic -c $CONFIG_FILE registry record list --type ApplicationRecord --all --name "snowballtools-base-frontend" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
||||||
|
|
||||||
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
|
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
|
||||||
# Set application-record version if no previous records were found
|
# Set application-record version if no previous records were found
|
||||||
@@ -31,15 +31,15 @@ record:
|
|||||||
type: ApplicationDeploymentRequest
|
type: ApplicationDeploymentRequest
|
||||||
version: '1.0.0'
|
version: '1.0.0'
|
||||||
name: snowballtools-base-frontend@$PACKAGE_VERSION
|
name: snowballtools-base-frontend@$PACKAGE_VERSION
|
||||||
application: crn://snowballtools/applications/snowballtools-base-frontend@$PACKAGE_VERSION
|
application: lrn://snowballtools/applications/snowballtools-base-frontend@$PACKAGE_VERSION
|
||||||
dns: dashboard
|
dns: dashboard
|
||||||
config:
|
config:
|
||||||
env:
|
env:
|
||||||
LACONIC_HOSTED_CONFIG_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
|
LACONIC_HOSTED_CONFIG_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
|
||||||
LACONIC_HOSTED_CONFIG_github_clientid: b7c63b235ca1dd5639ab
|
LACONIC_HOSTED_CONFIG_github_clientid: b7c63b235ca1dd5639ab
|
||||||
LACONIC_HOSTED_CONFIG_github_templaterepo: snowball-tools-platform/test-progressive-web-app
|
LACONIC_HOSTED_CONFIG_github_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: snowball-tools-platform/test-progressive-web-app
|
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: snowball-tools-platform/image-upload-pwa-example
|
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: snowball-tools/image-upload-pwa-example
|
||||||
LACONIC_HOSTED_CONFIG_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
LACONIC_HOSTED_CONFIG_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
||||||
meta:
|
meta:
|
||||||
note: Added by Snowball @ $CURRENT_DATE_TIME
|
note: Added by Snowball @ $CURRENT_DATE_TIME
|
||||||
@@ -64,7 +64,7 @@ echo "Files generated successfully."
|
|||||||
RECORD_FILE=records/application-record.yml
|
RECORD_FILE=records/application-record.yml
|
||||||
|
|
||||||
# Publish ApplicationRecord
|
# Publish ApplicationRecord
|
||||||
publish_response=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $RECORD_FILE)
|
publish_response=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $RECORD_FILE)
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to publish record"
|
echo "FATAL: Failed to publish record"
|
||||||
@@ -75,17 +75,17 @@ echo "ApplicationRecord published"
|
|||||||
echo $RECORD_ID
|
echo $RECORD_ID
|
||||||
|
|
||||||
# Set name to record
|
# Set name to record
|
||||||
REGISTRY_APP_CRN="crn://snowballtools/applications/snowballtools-base-frontend"
|
REGISTRY_APP_LRN="lrn://snowballtools/applications/snowballtools-base-frontend"
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN@${PACKAGE_VERSION}" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${PACKAGE_VERSION}" "$RECORD_ID"
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to set name: $REGISTRY_APP_CRN@${PACKAGE_VERSION}"
|
echo "FATAL: Failed to set name: $REGISTRY_APP_LRN@${PACKAGE_VERSION}"
|
||||||
exit $rc
|
exit $rc
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN@${LATEST_HASH}" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${LATEST_HASH}" "$RECORD_ID"
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to set hash"
|
echo "FATAL: Failed to set hash"
|
||||||
@@ -93,16 +93,16 @@ if [ $rc -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
# Set name if latest release
|
# Set name if latest release
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN" "$RECORD_ID"
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to set release"
|
echo "FATAL: Failed to set release"
|
||||||
exit $rc
|
exit $rc
|
||||||
fi
|
fi
|
||||||
echo "$REGISTRY_APP_CRN set for ApplicationRecord"
|
echo "$REGISTRY_APP_LRN set for ApplicationRecord"
|
||||||
|
|
||||||
# Check if record found for REGISTRY_APP_CRN
|
# Check if record found for REGISTRY_APP_LRN
|
||||||
query_response=$(yarn --silent laconic -c $CONFIG_FILE cns name resolve "$REGISTRY_APP_CRN")
|
query_response=$(yarn --silent laconic -c $CONFIG_FILE registry name resolve "$REGISTRY_APP_LRN")
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to query name"
|
echo "FATAL: Failed to query name"
|
||||||
@@ -110,14 +110,14 @@ if [ $rc -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
APP_RECORD=$(echo $query_response | jq '.[0]')
|
APP_RECORD=$(echo $query_response | jq '.[0]')
|
||||||
if [ -z "$APP_RECORD" ] || [ "null" == "$APP_RECORD" ]; then
|
if [ -z "$APP_RECORD" ] || [ "null" == "$APP_RECORD" ]; then
|
||||||
echo "No record found for $REGISTRY_APP_CRN."
|
echo "No record found for $REGISTRY_APP_LRN."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RECORD_FILE=records/application-deployment-request.yml
|
RECORD_FILE=records/application-deployment-request.yml
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
deployment_response=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $RECORD_FILE)
|
deployment_response=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $RECORD_FILE)
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to query deployment request"
|
echo "FATAL: Failed to query deployment request"
|
||||||
exit $rc
|
exit $rc
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Repository URL
|
# Repository URL
|
||||||
REPO_URL="https://git.vdb.to/cerc-io/snowballtools-base"
|
REPO_URL="https://github.com/snowball-tools/snowballtools-base"
|
||||||
|
|
||||||
# Get the latest commit hash from the repository
|
# Get the latest commit hash from the repository
|
||||||
LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}')
|
LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}')
|
||||||
@@ -18,7 +18,7 @@ REGISTRY_BOND_ID="098c906850b87412f02200e41f449bc79e055eab77acfef32c0b22443bb466
|
|||||||
# Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts
|
# Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts
|
||||||
|
|
||||||
# Get latest version from registry and increment application-record version
|
# Get latest version from registry and increment application-record version
|
||||||
NEW_APPLICATION_VERSION=$(yarn --silent laconic -c $CONFIG_FILE cns record list --type ApplicationRecord --all --name "staging-snowballtools-base-frontend" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
NEW_APPLICATION_VERSION=$(yarn --silent laconic -c $CONFIG_FILE registry record list --type ApplicationRecord --all --name "staging-snowballtools-base-frontend" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
||||||
|
|
||||||
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
|
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
|
||||||
# Set application-record version if no previous records were found
|
# Set application-record version if no previous records were found
|
||||||
@@ -31,15 +31,15 @@ record:
|
|||||||
type: ApplicationDeploymentRequest
|
type: ApplicationDeploymentRequest
|
||||||
version: '1.0.0'
|
version: '1.0.0'
|
||||||
name: staging-snowballtools-base-frontend@$PACKAGE_VERSION
|
name: staging-snowballtools-base-frontend@$PACKAGE_VERSION
|
||||||
application: crn://staging-snowballtools/applications/staging-snowballtools-base-frontend@$PACKAGE_VERSION
|
application: lrn://staging-snowballtools/applications/staging-snowballtools-base-frontend@$PACKAGE_VERSION
|
||||||
dns: dashboard.staging.apps.snowballtools.com
|
dns: dashboard.staging.apps.snowballtools.com
|
||||||
config:
|
config:
|
||||||
env:
|
env:
|
||||||
LACONIC_HOSTED_CONFIG_server_url: https://snowballtools-base-api.staging.apps.snowballtools.com
|
LACONIC_HOSTED_CONFIG_server_url: https://snowballtools-base-api.staging.apps.snowballtools.com
|
||||||
LACONIC_HOSTED_CONFIG_github_clientid: 905c09553f527d2cdff5
|
LACONIC_HOSTED_CONFIG_github_clientid: Ov23liOaoahRTYd4nSCV
|
||||||
LACONIC_HOSTED_CONFIG_github_templaterepo: snowball-tools/test-progressive-web-app
|
LACONIC_HOSTED_CONFIG_github_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: snowball-tools/image-upload-pwa-example
|
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: snowball-tools-platform/image-upload-pwa-example
|
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: snowball-tools/image-upload-pwa-example
|
||||||
LACONIC_HOSTED_CONFIG_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
LACONIC_HOSTED_CONFIG_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
||||||
LACONIC_HOSTED_CONFIG_lit_relay_api_key: 15DDD969-E75F-404D-AAD9-58A37C4FD354_snowball
|
LACONIC_HOSTED_CONFIG_lit_relay_api_key: 15DDD969-E75F-404D-AAD9-58A37C4FD354_snowball
|
||||||
LACONIC_HOSTED_CONFIG_aplchemy_api_key: THvPart_gqI5x02RNYSBntlmwA66I_qc
|
LACONIC_HOSTED_CONFIG_aplchemy_api_key: THvPart_gqI5x02RNYSBntlmwA66I_qc
|
||||||
@@ -70,7 +70,7 @@ echo "Files generated successfully."
|
|||||||
RECORD_FILE=staging-records/application-record.yml
|
RECORD_FILE=staging-records/application-record.yml
|
||||||
|
|
||||||
# Publish ApplicationRecord
|
# Publish ApplicationRecord
|
||||||
publish_response=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $RECORD_FILE)
|
publish_response=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $RECORD_FILE)
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to publish record"
|
echo "FATAL: Failed to publish record"
|
||||||
@@ -81,17 +81,17 @@ echo "ApplicationRecord published"
|
|||||||
echo $RECORD_ID
|
echo $RECORD_ID
|
||||||
|
|
||||||
# Set name to record
|
# Set name to record
|
||||||
REGISTRY_APP_CRN="crn://staging-snowballtools/applications/staging-snowballtools-base-frontend"
|
REGISTRY_APP_LRN="lrn://staging-snowballtools/applications/staging-snowballtools-base-frontend"
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN@${PACKAGE_VERSION}" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${PACKAGE_VERSION}" "$RECORD_ID"
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to set name: $REGISTRY_APP_CRN@${PACKAGE_VERSION}"
|
echo "FATAL: Failed to set name: $REGISTRY_APP_LRN@${PACKAGE_VERSION}"
|
||||||
exit $rc
|
exit $rc
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN@${LATEST_HASH}" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${LATEST_HASH}" "$RECORD_ID"
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to set hash"
|
echo "FATAL: Failed to set hash"
|
||||||
@@ -99,16 +99,16 @@ if [ $rc -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
# Set name if latest release
|
# Set name if latest release
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN" "$RECORD_ID"
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to set release"
|
echo "FATAL: Failed to set release"
|
||||||
exit $rc
|
exit $rc
|
||||||
fi
|
fi
|
||||||
echo "$REGISTRY_APP_CRN set for ApplicationRecord"
|
echo "$REGISTRY_APP_LRN set for ApplicationRecord"
|
||||||
|
|
||||||
# Check if record found for REGISTRY_APP_CRN
|
# Check if record found for REGISTRY_APP_LRN
|
||||||
query_response=$(yarn --silent laconic -c $CONFIG_FILE cns name resolve "$REGISTRY_APP_CRN")
|
query_response=$(yarn --silent laconic -c $CONFIG_FILE registry name resolve "$REGISTRY_APP_LRN")
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to query name"
|
echo "FATAL: Failed to query name"
|
||||||
@@ -116,14 +116,14 @@ if [ $rc -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
APP_RECORD=$(echo $query_response | jq '.[0]')
|
APP_RECORD=$(echo $query_response | jq '.[0]')
|
||||||
if [ -z "$APP_RECORD" ] || [ "null" == "$APP_RECORD" ]; then
|
if [ -z "$APP_RECORD" ] || [ "null" == "$APP_RECORD" ]; then
|
||||||
echo "No record found for $REGISTRY_APP_CRN."
|
echo "No record found for $REGISTRY_APP_LRN."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RECORD_FILE=staging-records/application-deployment-request.yml
|
RECORD_FILE=staging-records/application-deployment-request.yml
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
deployment_response=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $RECORD_FILE)
|
deployment_response=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $RECORD_FILE)
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
echo "FATAL: Failed to query deployment request"
|
echo "FATAL: Failed to query deployment request"
|
||||||
exit $rc
|
exit $rc
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
record:
|
record:
|
||||||
type: ApplicationDeploymentRequest
|
type: ApplicationDeploymentRequest
|
||||||
version: '1.0.0'
|
version: "1.0.0"
|
||||||
name: snowballtools-base-frontend@0.1.8
|
name: snowballtools-base-frontend@0.1.8
|
||||||
application: crn://snowballtools/applications/snowballtools-base-frontend@0.1.8
|
application: crn://snowballtools/applications/snowballtools-base-frontend@0.1.8
|
||||||
dns: dashboard
|
dns: dashboard
|
||||||
@@ -8,11 +8,11 @@ record:
|
|||||||
env:
|
env:
|
||||||
LACONIC_HOSTED_CONFIG_app_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
|
LACONIC_HOSTED_CONFIG_app_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
|
||||||
LACONIC_HOSTED_CONFIG_app_github_clientid: b7c63b235ca1dd5639ab
|
LACONIC_HOSTED_CONFIG_app_github_clientid: b7c63b235ca1dd5639ab
|
||||||
LACONIC_HOSTED_CONFIG_app_github_templaterepo: snowball-tools-platform/test-progressive-web-app
|
LACONIC_HOSTED_CONFIG_app_github_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_app_github_pwa_templaterepo: snowball-tools-platform/test-progressive-web-app
|
LACONIC_HOSTED_CONFIG_app_github_pwa_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_app_github_image_upload_templaterepo: snowball-tools-platform/image-upload-pwa-example
|
LACONIC_HOSTED_CONFIG_app_github_image_upload_templaterepo: snowball-tools/image-upload-pwa-example
|
||||||
LACONIC_HOSTED_CONFIG_app_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
LACONIC_HOSTED_CONFIG_app_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
||||||
meta:
|
meta:
|
||||||
note: Added by Snowball @ Thu Apr 4 14:49:41 UTC 2024
|
note: Added by Snowball @ Thu Apr 4 14:49:41 UTC 2024
|
||||||
repository: "https://git.vdb.to/cerc-io/snowballtools-base"
|
repository: "https://github.com/snowball-tools/snowballtools-base"
|
||||||
repository_ref: 351db16336eacc3e1f9119ceb8d1282b8e27a27e
|
repository_ref: 351db16336eacc3e1f9119ceb8d1282b8e27a27e
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ record:
|
|||||||
type: ApplicationRecord
|
type: ApplicationRecord
|
||||||
version: 0.0.2
|
version: 0.0.2
|
||||||
repository_ref: 351db16336eacc3e1f9119ceb8d1282b8e27a27e
|
repository_ref: 351db16336eacc3e1f9119ceb8d1282b8e27a27e
|
||||||
repository: ["https://git.vdb.to/cerc-io/snowballtools-base"]
|
repository: ["https://github.com/snowball-tools/snowballtools-base"]
|
||||||
app_type: webapp
|
app_type: webapp
|
||||||
name: snowballtools-base-frontend
|
name: snowballtools-base-frontend
|
||||||
app_version: 0.1.8
|
app_version: 0.1.8
|
||||||
|
|||||||
@@ -7,18 +7,18 @@ record:
|
|||||||
config:
|
config:
|
||||||
env:
|
env:
|
||||||
LACONIC_HOSTED_CONFIG_server_url: https://snowballtools-base-api.staging.apps.snowballtools.com
|
LACONIC_HOSTED_CONFIG_server_url: https://snowballtools-base-api.staging.apps.snowballtools.com
|
||||||
LACONIC_HOSTED_CONFIG_github_clientid: 905c09553f527d2cdff5
|
LACONIC_HOSTED_CONFIG_github_clientid: Ov23liOaoahRTYd4nSCV
|
||||||
LACONIC_HOSTED_CONFIG_github_templaterepo: snowball-tools/test-progressive-web-app
|
LACONIC_HOSTED_CONFIG_github_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: snowball-tools/image-upload-pwa-example
|
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: snowball-tools/test-progressive-web-app
|
||||||
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: snowball-tools-platform/image-upload-pwa-example
|
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: snowball-tools/image-upload-pwa-example
|
||||||
LACONIC_HOSTED_CONFIG_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
LACONIC_HOSTED_CONFIG_wallet_connect_id: eda9ba18042a5ea500f358194611ece2
|
||||||
LACONIC_HOSTED_CONFIG_lit_relay_api_key: 15DDD969-E75F-404D-AAD9-58A37C4FD354_snowball
|
LACONIC_HOSTED_CONFIG_lit_relay_api_key: 15DDD969-E75F-404D-AAD9-58A37C4FD354_snowball
|
||||||
LACONIC_HOSTED_CONFIG_aplchemy_api_key: THvPart_gqI5x02RNYSBntlmwA66I_qc
|
LACONIC_HOSTED_CONFIG_aplchemy_api_key: THvPart_gqI5x02RNYSBntlmwA66I_qc
|
||||||
LACONIC_HOSTED_CONFIG_bugsnag_api_key: 8c480cd5386079f9dd44f9581264a073
|
LACONIC_HOSTED_CONFIG_bugsnag_api_key: 8c480cd5386079f9dd44f9581264a073
|
||||||
LACONIC_HOSTED_CONFIG_passkey_wallet_rpid: localhost
|
LACONIC_HOSTED_CONFIG_passkey_wallet_rpid: dashboard.staging.apps.snowballtools.com
|
||||||
LACONIC_HOSTED_CONFIG_turnkey_api_base_url: https://api.turnkey.com/
|
LACONIC_HOSTED_CONFIG_turnkey_api_base_url: https://api.turnkey.com
|
||||||
LACONIC_HOSTED_CONFIG_turnkey_organization_id: 5049ae99-5bca-40b3-8317-504384d4e591
|
LACONIC_HOSTED_CONFIG_turnkey_organization_id: 5049ae99-5bca-40b3-8317-504384d4e591
|
||||||
meta:
|
meta:
|
||||||
note: Added by Snowball @ Tuesday 21 May 2024 06:17:23 AM UTC
|
note: Added by Snowball @ Mon Jun 24 23:51:48 UTC 2024
|
||||||
repository: "https://git.vdb.to/cerc-io/snowballtools-base"
|
repository: "https://github.com/snowball-tools/snowballtools-base"
|
||||||
repository_ref: 8488cfab8353321ed05c4234bf1b914c9ad3aa99
|
repository_ref: 61e3e88a6c9d57e95441059369ee5a46f5c07601
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
record:
|
record:
|
||||||
type: ApplicationRecord
|
type: ApplicationRecord
|
||||||
version: 0.0.2
|
version: 0.0.1
|
||||||
repository_ref: 8488cfab8353321ed05c4234bf1b914c9ad3aa99
|
repository_ref: 61e3e88a6c9d57e95441059369ee5a46f5c07601
|
||||||
repository: ["https://git.vdb.to/cerc-io/snowballtools-base"]
|
repository: ["https://github.com/snowball-tools/snowballtools-base"]
|
||||||
app_type: webapp
|
app_type: webapp
|
||||||
name: staging-snowballtools-base-frontend
|
name: staging-snowballtools-base-frontend
|
||||||
app_version: 0.0.0
|
app_version: 0.0.0
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Check if the live web app deployer is in a working state
|
Check if the live web app deployer is in a working state
|
||||||
|
|
||||||
- Web app repo used: https://github.com/snowball-tools-platform/test-progressive-web-app (main branch)
|
- Web app repo used: <https://github.com/snowball-tools/test-progressive-web-app> (main branch)
|
||||||
- Config used: [../config.yml](../config.yml)
|
- Config used: [../config.yml](../config.yml)
|
||||||
- The script [test-webapp-deployment-undeployment.sh](./test-webapp-deployment-undeployment.sh) performs the following:
|
- The script [test-webapp-deployment-undeployment.sh](./test-webapp-deployment-undeployment.sh) performs the following:
|
||||||
- Create / update [`ApplicationRecord`](./records/application-record.yml) and [`ApplicationDeploymentRequest`](./records/application-deployment-request.yml) records with latest meta data from the repo
|
- Create / update [`ApplicationRecord`](./records/application-record.yml) and [`ApplicationDeploymentRequest`](./records/application-deployment-request.yml) records with latest meta data from the repo
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
record:
|
record:
|
||||||
type: ApplicationDeploymentRequest
|
type: ApplicationDeploymentRequest
|
||||||
version: '1.0.0'
|
version: "1.0.0"
|
||||||
name: deployment-test-app@0.1.24
|
name: deployment-test-app@0.1.24
|
||||||
application: crn://snowballtools/applications/deployment-test-app@0.1.24
|
application: crn://snowballtools/applications/deployment-test-app@0.1.24
|
||||||
dns: deployment-ci-test
|
dns: deployment-ci-test
|
||||||
@@ -11,5 +11,5 @@ record:
|
|||||||
CERC_WEBAPP_DEBUG: 0
|
CERC_WEBAPP_DEBUG: 0
|
||||||
meta:
|
meta:
|
||||||
note: Deployment test @ Thu 11 Apr 2024 07:29:19 AM UTC
|
note: Deployment test @ Thu 11 Apr 2024 07:29:19 AM UTC
|
||||||
repository: "https://github.com/snowball-tools-platform/test-progressive-web-app"
|
repository: "https://github.com/snowball-tools/test-progressive-web-app"
|
||||||
repository_ref: 05819619487a0d2dbc5453b6d1ccff3044c0dd26
|
repository_ref: 05819619487a0d2dbc5453b6d1ccff3044c0dd26
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ record:
|
|||||||
type: ApplicationRecord
|
type: ApplicationRecord
|
||||||
version: 0.0.1
|
version: 0.0.1
|
||||||
repository_ref: 05819619487a0d2dbc5453b6d1ccff3044c0dd26
|
repository_ref: 05819619487a0d2dbc5453b6d1ccff3044c0dd26
|
||||||
repository: ["https://github.com/snowball-tools-platform/test-progressive-web-app"]
|
repository: ["https://github.com/snowball-tools/test-progressive-web-app"]
|
||||||
app_type: webapp
|
app_type: webapp
|
||||||
name: deployment-test-app
|
name: deployment-test-app
|
||||||
app_version: 0.1.24
|
app_version: 0.1.24
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Repository URL
|
# Repository URL
|
||||||
REPO_URL="https://github.com/snowball-tools-platform/test-progressive-web-app"
|
REPO_URL="https://github.com/snowball-tools/test-progressive-web-app"
|
||||||
|
|
||||||
# Get the latest commit hash from the repository
|
# Get the latest commit hash from the repository
|
||||||
LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}')
|
LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}')
|
||||||
@@ -22,7 +22,7 @@ REGISTRY_BOND_ID="99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be
|
|||||||
APP_NAME=deployment-test-app
|
APP_NAME=deployment-test-app
|
||||||
|
|
||||||
# Get latest version from registry and increment application-record version
|
# Get latest version from registry and increment application-record version
|
||||||
NEW_APPLICATION_VERSION=$(yarn --silent laconic -c $CONFIG_FILE cns record list --type ApplicationRecord --all --name "$APP_NAME" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
NEW_APPLICATION_VERSION=$(yarn --silent laconic -c $CONFIG_FILE registry record list --type ApplicationRecord --all --name "$APP_NAME" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
||||||
|
|
||||||
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
|
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
|
||||||
# Set application-record version if no previous records were found
|
# Set application-record version if no previous records were found
|
||||||
@@ -51,7 +51,7 @@ record:
|
|||||||
type: ApplicationDeploymentRequest
|
type: ApplicationDeploymentRequest
|
||||||
version: '1.0.0'
|
version: '1.0.0'
|
||||||
name: $APP_NAME@$PACKAGE_VERSION
|
name: $APP_NAME@$PACKAGE_VERSION
|
||||||
application: crn://snowballtools/applications/$APP_NAME@$PACKAGE_VERSION
|
application: lrn://snowballtools/applications/$APP_NAME@$PACKAGE_VERSION
|
||||||
dns: deployment-ci-test
|
dns: deployment-ci-test
|
||||||
config:
|
config:
|
||||||
env:
|
env:
|
||||||
@@ -67,31 +67,31 @@ EOF
|
|||||||
echo "Record files generated successfully."
|
echo "Record files generated successfully."
|
||||||
|
|
||||||
# Publish ApplicationRecord
|
# Publish ApplicationRecord
|
||||||
RECORD_ID=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $RECORD_FILE | jq -r '.id')
|
RECORD_ID=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $RECORD_FILE | jq -r '.id')
|
||||||
echo "ApplicationRecord published"
|
echo "ApplicationRecord published"
|
||||||
echo $RECORD_ID
|
echo $RECORD_ID
|
||||||
|
|
||||||
# Set name to record
|
# Set name to record
|
||||||
REGISTRY_APP_CRN="crn://snowballtools/applications/$APP_NAME"
|
REGISTRY_APP_LRN="lrn://snowballtools/applications/$APP_NAME"
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN@${PACKAGE_VERSION}" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${PACKAGE_VERSION}" "$RECORD_ID"
|
||||||
sleep 2
|
sleep 2
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN@${LATEST_HASH}" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${LATEST_HASH}" "$RECORD_ID"
|
||||||
sleep 2
|
sleep 2
|
||||||
# Set name if latest release
|
# Set name if latest release
|
||||||
yarn --silent laconic -c $CONFIG_FILE cns name set "$REGISTRY_APP_CRN" "$RECORD_ID"
|
yarn --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN" "$RECORD_ID"
|
||||||
echo "$REGISTRY_APP_CRN set for ApplicationRecord"
|
echo "$REGISTRY_APP_LRN set for ApplicationRecord"
|
||||||
|
|
||||||
# Check if record exists for REGISTRY_APP_CRN
|
# Check if record exists for REGISTRY_APP_LRN
|
||||||
APP_RECORD=$(yarn --silent laconic -c $CONFIG_FILE cns name resolve "$REGISTRY_APP_CRN" | jq '.[0]')
|
APP_RECORD=$(yarn --silent laconic -c $CONFIG_FILE registry name resolve "$REGISTRY_APP_LRN" | jq '.[0]')
|
||||||
if [ -z "$APP_RECORD" ] || [ "null" == "$APP_RECORD" ]; then
|
if [ -z "$APP_RECORD" ] || [ "null" == "$APP_RECORD" ]; then
|
||||||
echo "No record found for $REGISTRY_APP_CRN."
|
echo "No record found for $REGISTRY_APP_LRN."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
DEPLOYMENT_REQUEST_ID=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $REQUEST_RECORD_FILE | jq -r '.id')
|
DEPLOYMENT_REQUEST_ID=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $REQUEST_RECORD_FILE | jq -r '.id')
|
||||||
echo "ApplicationDeploymentRequest published"
|
echo "ApplicationDeploymentRequest published"
|
||||||
echo $DEPLOYMENT_REQUEST_ID
|
echo $DEPLOYMENT_REQUEST_ID
|
||||||
|
|
||||||
@@ -102,7 +102,7 @@ MAX_RETRIES=20
|
|||||||
# Check that a ApplicationDeploymentRecord is published
|
# Check that a ApplicationDeploymentRecord is published
|
||||||
retry_count=0
|
retry_count=0
|
||||||
while true; do
|
while true; do
|
||||||
deployment_records_response=$(yarn --silent laconic -c $CONFIG_FILE cns record list --type ApplicationDeploymentRecord --all --name "$APP_NAME" request $DEPLOYMENT_REQUEST_ID)
|
deployment_records_response=$(yarn --silent laconic -c $CONFIG_FILE registry record list --type ApplicationDeploymentRecord --all --name "$APP_NAME" request $DEPLOYMENT_REQUEST_ID)
|
||||||
len_deployment_records=$(echo $deployment_records_response | jq 'length')
|
len_deployment_records=$(echo $deployment_records_response | jq 'length')
|
||||||
|
|
||||||
# Check if number of records returned is 0
|
# Check if number of records returned is 0
|
||||||
@@ -140,7 +140,7 @@ fetched_url=$(echo $deployment_records_response | jq -r '.[0].attributes.url')
|
|||||||
|
|
||||||
retry_count=0
|
retry_count=0
|
||||||
max_retries=10
|
max_retries=10
|
||||||
retry_interval=5
|
retry_interval=10
|
||||||
while true; do
|
while true; do
|
||||||
url_response=$(curl -s -o /dev/null -I -w "%{http_code}" $fetched_url)
|
url_response=$(curl -s -o /dev/null -I -w "%{http_code}" $fetched_url)
|
||||||
if [ "$url_response" = "200" ]; then
|
if [ "$url_response" = "200" ]; then
|
||||||
@@ -170,14 +170,14 @@ record:
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
REMOVAL_REQUEST_ID=$(yarn --silent laconic -c $CONFIG_FILE cns record publish --filename $REMOVAL_REQUEST_RECORD_FILE | jq -r '.id')
|
REMOVAL_REQUEST_ID=$(yarn --silent laconic -c $CONFIG_FILE registry record publish --filename $REMOVAL_REQUEST_RECORD_FILE | jq -r '.id')
|
||||||
echo "ApplicationDeploymentRemovalRequest published"
|
echo "ApplicationDeploymentRemovalRequest published"
|
||||||
echo $REMOVAL_REQUEST_ID
|
echo $REMOVAL_REQUEST_ID
|
||||||
|
|
||||||
# Check that an ApplicationDeploymentRemovalRecord is published
|
# Check that an ApplicationDeploymentRemovalRecord is published
|
||||||
retry_count=0
|
retry_count=0
|
||||||
while true; do
|
while true; do
|
||||||
removal_records_response=$(yarn --silent laconic -c $CONFIG_FILE cns record list --type ApplicationDeploymentRemovalRecord --all request $REMOVAL_REQUEST_ID)
|
removal_records_response=$(yarn --silent laconic -c $CONFIG_FILE registry record list --type ApplicationDeploymentRemovalRecord --all request $REMOVAL_REQUEST_ID)
|
||||||
len_removal_records=$(echo $removal_records_response | jq 'length')
|
len_removal_records=$(echo $removal_records_response | jq 'length')
|
||||||
|
|
||||||
# Check if number of records returned is 0
|
# Check if number of records returned is 0
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { join, dirname } from 'path';
|
|||||||
function getAbsolutePath(value: string): any {
|
function getAbsolutePath(value: string): any {
|
||||||
return dirname(require.resolve(join(value, 'package.json')));
|
return dirname(require.resolve(join(value, 'package.json')));
|
||||||
}
|
}
|
||||||
|
|
||||||
const config: StorybookConfig = {
|
const config: StorybookConfig = {
|
||||||
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
|
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
|
||||||
addons: [
|
addons: [
|
||||||
@@ -26,6 +27,7 @@ const config: StorybookConfig = {
|
|||||||
docs: {
|
docs: {
|
||||||
autodocs: 'tag',
|
autodocs: 'tag',
|
||||||
},
|
},
|
||||||
|
staticDirs: ['../public'],
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export default config;
|
||||||
|
|||||||
+56
-23
@@ -1,30 +1,63 @@
|
|||||||
# React + TypeScript + Vite
|
# frontend
|
||||||
|
|
||||||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
This is a [vite](https://vitejs.dev/) [react](https://reactjs.org/) [nextjs](https://nextjs.org/) project in a [yarn workspace](https://yarnpkg.com/features/workspaces).
|
||||||
|
|
||||||
Currently, two official plugins are available:
|
## Getting Started
|
||||||
|
|
||||||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
### Install dependencies
|
||||||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
||||||
|
|
||||||
## Expanding the ESLint configuration
|
In the root of the project, run:
|
||||||
|
|
||||||
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
|
```zsh
|
||||||
|
yarn
|
||||||
- Configure the top-level `parserOptions` property like this:
|
|
||||||
|
|
||||||
```js
|
|
||||||
export default {
|
|
||||||
// other rules...
|
|
||||||
parserOptions: {
|
|
||||||
ecmaVersion: 'latest',
|
|
||||||
sourceType: 'module',
|
|
||||||
project: ['./tsconfig.json', './tsconfig.node.json'],
|
|
||||||
tsconfigRootDir: __dirname,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
|
### Build backend
|
||||||
- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
|
|
||||||
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list
|
```zsh
|
||||||
|
yarn build --ignore frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment variables
|
||||||
|
|
||||||
|
#### Local
|
||||||
|
|
||||||
|
Copy the `.env.example` file to `.env`:
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Staging environment variables
|
||||||
|
|
||||||
|
Change in [deployer/deploy-frontend.staging.sh](/packages/deployer/deploy-frontend.staging.sh)
|
||||||
|
|
||||||
|
#### Production environment variables
|
||||||
|
|
||||||
|
Change in [deployer/deploy-frontend.sh](/packages/deployer/deploy-frontend.sh)
|
||||||
|
|
||||||
|
### Run development server
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
From the root of the project,
|
||||||
|
|
||||||
|
### Staging
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
cd packages/deployer && ./deploy-frontend.staging.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
cd packages/deployer && ./deploy-frontend.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deployment status
|
||||||
|
|
||||||
|
Check the status of the deployment [here](https://webapp-deployer.apps.snowballtools.com)
|
||||||
|
|||||||
@@ -16,8 +16,11 @@
|
|||||||
"@bugsnag/browser-performance": "^2.4.1",
|
"@bugsnag/browser-performance": "^2.4.1",
|
||||||
"@bugsnag/js": "^7.22.7",
|
"@bugsnag/js": "^7.22.7",
|
||||||
"@bugsnag/plugin-react": "^7.22.7",
|
"@bugsnag/plugin-react": "^7.22.7",
|
||||||
|
"@emotion/react": "^11.13.3",
|
||||||
|
"@emotion/styled": "^11.13.0",
|
||||||
"@fontsource-variable/jetbrains-mono": "^5.0.19",
|
"@fontsource-variable/jetbrains-mono": "^5.0.19",
|
||||||
"@fontsource/inter": "^5.0.16",
|
"@fontsource/inter": "^5.0.16",
|
||||||
|
"@mui/material": "^6.1.3",
|
||||||
"@radix-ui/react-avatar": "^1.0.4",
|
"@radix-ui/react-avatar": "^1.0.4",
|
||||||
"@radix-ui/react-checkbox": "^1.0.4",
|
"@radix-ui/react-checkbox": "^1.0.4",
|
||||||
"@radix-ui/react-dialog": "^1.0.5",
|
"@radix-ui/react-dialog": "^1.0.5",
|
||||||
@@ -62,7 +65,6 @@
|
|||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-dropdown": "^1.11.0",
|
"react-dropdown": "^1.11.0",
|
||||||
"react-hook-form": "^7.49.0",
|
"react-hook-form": "^7.49.0",
|
||||||
"react-hot-toast": "^2.4.1",
|
|
||||||
"react-oauth-popup": "^1.0.5",
|
"react-oauth-popup": "^1.0.5",
|
||||||
"react-router-dom": "^6.20.1",
|
"react-router-dom": "^6.20.1",
|
||||||
"react-timer-hook": "^3.0.7",
|
"react-timer-hook": "^3.0.7",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useCallback, useEffect, useState } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { useCombobox } from 'downshift';
|
import { useCombobox } from 'downshift';
|
||||||
import { Project } from 'gql-client';
|
import { Project } from 'gql-client';
|
||||||
import { useDebounce } from 'usehooks-ts';
|
import { useDebounceValue } from 'usehooks-ts';
|
||||||
|
|
||||||
import SearchBar from 'components/SearchBar';
|
import SearchBar from 'components/SearchBar';
|
||||||
import { useGQLClient } from 'context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
@@ -42,7 +42,7 @@ export const ProjectSearchBar = ({ onChange }: ProjectSearchBarProps) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const debouncedInputValue = useDebounce<string>(inputValue, 300);
|
const [debouncedInputValue, _] = useDebounceValue<string>(inputValue, 300);
|
||||||
|
|
||||||
const fetchProjects = useCallback(
|
const fetchProjects = useCallback(
|
||||||
async (inputValue: string) => {
|
async (inputValue: string) => {
|
||||||
@@ -62,7 +62,7 @@ export const ProjectSearchBar = ({ onChange }: ProjectSearchBarProps) => {
|
|||||||
<div className="relative w-full lg:w-fit">
|
<div className="relative w-full lg:w-fit">
|
||||||
<SearchBar {...getInputProps()} />
|
<SearchBar {...getInputProps()} />
|
||||||
<div
|
<div
|
||||||
{...getMenuProps()}
|
{...getMenuProps({}, { suppressRefError: true })}
|
||||||
className={cn(
|
className={cn(
|
||||||
'flex flex-col shadow-dropdown rounded-xl bg-surface-card absolute w-[459px] max-h-52 overflow-y-auto px-2 py-2 gap-1 z-50',
|
'flex flex-col shadow-dropdown rounded-xl bg-surface-card absolute w-[459px] max-h-52 overflow-y-auto px-2 py-2 gap-1 z-50',
|
||||||
{ hidden: !inputValue || !isOpen },
|
{ hidden: !inputValue || !isOpen },
|
||||||
|
|||||||
+25
-10
@@ -5,7 +5,7 @@ import { CrossIcon, SearchIcon } from 'components/shared/CustomIcon';
|
|||||||
import { Input } from 'components/shared/Input';
|
import { Input } from 'components/shared/Input';
|
||||||
import { useGQLClient } from 'context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
import { Project } from 'gql-client';
|
import { Project } from 'gql-client';
|
||||||
import { useDebounce } from 'usehooks-ts';
|
import { useDebounceValue } from 'usehooks-ts';
|
||||||
import { ProjectSearchBarItem } from './ProjectSearchBarItem';
|
import { ProjectSearchBarItem } from './ProjectSearchBarItem';
|
||||||
import { ProjectSearchBarEmpty } from './ProjectSearchBarEmpty';
|
import { ProjectSearchBarEmpty } from './ProjectSearchBarEmpty';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
@@ -27,8 +27,13 @@ export const ProjectSearchBarDialog = ({
|
|||||||
const client = useGQLClient();
|
const client = useGQLClient();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const { getInputProps, getItemProps, inputValue, setInputValue } =
|
const {
|
||||||
useCombobox({
|
getInputProps,
|
||||||
|
getItemProps,
|
||||||
|
getMenuProps,
|
||||||
|
inputValue,
|
||||||
|
setInputValue,
|
||||||
|
} = useCombobox({
|
||||||
items,
|
items,
|
||||||
itemToString(item) {
|
itemToString(item) {
|
||||||
return item ? item.name : '';
|
return item ? item.name : '';
|
||||||
@@ -45,7 +50,7 @@ export const ProjectSearchBarDialog = ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const debouncedInputValue = useDebounce<string>(inputValue, 300);
|
const [debouncedInputValue, _] = useDebounceValue<string>(inputValue, 300);
|
||||||
|
|
||||||
const fetchProjects = useCallback(
|
const fetchProjects = useCallback(
|
||||||
async (inputValue: string) => {
|
async (inputValue: string) => {
|
||||||
@@ -75,7 +80,7 @@ export const ProjectSearchBarDialog = ({
|
|||||||
<div className="h-full flex flex-col fixed top-0 inset-0">
|
<div className="h-full flex flex-col fixed top-0 inset-0">
|
||||||
<div className="py-2.5 px-4 flex items-center justify-between border-b border-border-separator/[0.06]">
|
<div className="py-2.5 px-4 flex items-center justify-between border-b border-border-separator/[0.06]">
|
||||||
<Input
|
<Input
|
||||||
{...getInputProps()}
|
{...getInputProps({}, { suppressRefError: true })}
|
||||||
leftIcon={<SearchIcon />}
|
leftIcon={<SearchIcon />}
|
||||||
placeholder="Search"
|
placeholder="Search"
|
||||||
appearance="borderless"
|
appearance="borderless"
|
||||||
@@ -86,23 +91,33 @@ export const ProjectSearchBarDialog = ({
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
{/* Content */}
|
{/* Content */}
|
||||||
<div className="flex flex-col gap-1 px-2 py-2">
|
<div
|
||||||
{items.length > 0
|
className="flex flex-col gap-1 px-2 py-2"
|
||||||
? items.map((item, index) => (
|
{...getMenuProps(
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
suppressRefError: true,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{items.length > 0 ? (
|
||||||
<>
|
<>
|
||||||
<div className="px-2 py-2">
|
<div className="px-2 py-2">
|
||||||
<p className="text-elements-mid-em text-xs font-medium">
|
<p className="text-elements-mid-em text-xs font-medium">
|
||||||
Suggestions
|
Suggestions
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
{items.map((item, index) => (
|
||||||
<ProjectSearchBarItem
|
<ProjectSearchBarItem
|
||||||
key={item.id}
|
key={item.id}
|
||||||
item={item}
|
item={item}
|
||||||
{...getItemProps({ item, index })}
|
{...getItemProps({ item, index })}
|
||||||
/>
|
/>
|
||||||
|
))}
|
||||||
</>
|
</>
|
||||||
))
|
) : (
|
||||||
: inputValue && <ProjectSearchBarEmpty />}
|
inputValue && <ProjectSearchBarEmpty />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Dialog.Content>
|
</Dialog.Content>
|
||||||
|
|||||||
@@ -0,0 +1,236 @@
|
|||||||
|
import { useCallback, useState } from 'react';
|
||||||
|
import { useForm, Controller, SubmitHandler } from 'react-hook-form';
|
||||||
|
import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';
|
||||||
|
import { useMediaQuery } from 'usehooks-ts';
|
||||||
|
import { AuctionData } from 'gql-client';
|
||||||
|
|
||||||
|
import {
|
||||||
|
ArrowRightCircleFilledIcon,
|
||||||
|
LoadingIcon,
|
||||||
|
} from 'components/shared/CustomIcon';
|
||||||
|
import { Heading } from '../../shared/Heading';
|
||||||
|
import { Button } from '../../shared/Button';
|
||||||
|
import { Select, SelectOption } from 'components/shared/Select';
|
||||||
|
import { Input } from 'components/shared/Input';
|
||||||
|
import { useToast } from 'components/shared/Toast';
|
||||||
|
import { useGQLClient } from '../../../context/GQLClientContext';
|
||||||
|
|
||||||
|
type ConfigureFormValues = {
|
||||||
|
option: string;
|
||||||
|
lrn?: string;
|
||||||
|
numProviders?: number;
|
||||||
|
maxPrice?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Configure = () => {
|
||||||
|
const [searchParams] = useSearchParams();
|
||||||
|
const templateId = searchParams.get('templateId');
|
||||||
|
const location = useLocation();
|
||||||
|
const { templateOwner, templateRepo, owner, name, isPrivate, orgSlug, repository } = location.state || {};
|
||||||
|
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const { toast, dismiss } = useToast();
|
||||||
|
const client = useGQLClient();
|
||||||
|
|
||||||
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
|
const { handleSubmit, control, watch } = useForm<ConfigureFormValues>({
|
||||||
|
defaultValues: { option: 'LRN' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectedOption = watch('option');
|
||||||
|
|
||||||
|
const isTabletView = useMediaQuery('(min-width: 720px)'); // md:
|
||||||
|
const buttonSize = isTabletView ? { size: 'lg' as const } : {};
|
||||||
|
|
||||||
|
const onSubmit: SubmitHandler<ConfigureFormValues> = useCallback(
|
||||||
|
async (data) => {
|
||||||
|
setIsLoading(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
let lrn: string | undefined;
|
||||||
|
let auctionData: AuctionData | undefined;
|
||||||
|
|
||||||
|
if (data.option === 'LRN') {
|
||||||
|
lrn = data.lrn;
|
||||||
|
} else if (data.option === 'Auction') {
|
||||||
|
auctionData = {
|
||||||
|
numProviders: Number(data.numProviders!),
|
||||||
|
maxPrice: (data.maxPrice!).toString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (templateId) {
|
||||||
|
// Template-based project creation
|
||||||
|
const projectData: any = {
|
||||||
|
templateOwner,
|
||||||
|
templateRepo,
|
||||||
|
owner,
|
||||||
|
name,
|
||||||
|
isPrivate,
|
||||||
|
};
|
||||||
|
|
||||||
|
const { addProjectFromTemplate } = await client.addProjectFromTemplate(
|
||||||
|
orgSlug,
|
||||||
|
projectData,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
);
|
||||||
|
|
||||||
|
data.option === 'Auction'
|
||||||
|
? navigate(
|
||||||
|
`/${orgSlug}/projects/create/success/${addProjectFromTemplate.id}`,
|
||||||
|
{ state: { isAuction: true } }
|
||||||
|
)
|
||||||
|
: navigate(
|
||||||
|
`/${orgSlug}/projects/create/template/deploy?projectId=${addProjectFromTemplate.id}&templateId=${templateId}`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
const { addProject } = await client.addProject(
|
||||||
|
orgSlug,
|
||||||
|
{
|
||||||
|
name: repository.fullName,
|
||||||
|
prodBranch: repository.defaultBranch,
|
||||||
|
repository: repository.fullName,
|
||||||
|
template: 'webapp',
|
||||||
|
},
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
);
|
||||||
|
|
||||||
|
data.option === 'Auction'
|
||||||
|
? navigate(
|
||||||
|
`/${orgSlug}/projects/create/success/${addProject.id}`,
|
||||||
|
{ state: { isAuction: true } }
|
||||||
|
)
|
||||||
|
: navigate(
|
||||||
|
`/${orgSlug}/projects/create/deploy?projectId=${addProject.id}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error creating project:', error);
|
||||||
|
toast({
|
||||||
|
id: 'error-creating-project',
|
||||||
|
title: 'Error creating project',
|
||||||
|
variant: 'error',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[client, isPrivate, templateId, navigate, dismiss, toast]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="space-y-7">
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<div className="space-y-1.5">
|
||||||
|
<Heading as="h4" className="md:text-lg font-medium">
|
||||||
|
Configure deployment
|
||||||
|
</Heading>
|
||||||
|
<Heading as="h5" className="text-sm font-sans text-elements-low-em">
|
||||||
|
The app can be deployed by setting the deployer LRN for a single
|
||||||
|
deployment or by creating a deployer auction for multiple
|
||||||
|
deployments
|
||||||
|
</Heading>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form onSubmit={handleSubmit(onSubmit)}>
|
||||||
|
<div className="flex flex-col gap-4 lg:gap-7 w-full">
|
||||||
|
<div className="flex flex-col justify-start gap-3">
|
||||||
|
<Controller
|
||||||
|
name="option"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { value, onChange } }) => (
|
||||||
|
<Select
|
||||||
|
label="Configuration Options"
|
||||||
|
value={
|
||||||
|
{
|
||||||
|
value: value || 'LRN',
|
||||||
|
label: value === 'Auction' ? 'Create Auction' : 'Deployer LRN',
|
||||||
|
} as SelectOption
|
||||||
|
}
|
||||||
|
onChange={(value) => onChange((value as SelectOption).value)}
|
||||||
|
options={[
|
||||||
|
{ value: 'LRN', label: 'Deployer LRN' },
|
||||||
|
{ value: 'Auction', label: 'Create Auction' },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{selectedOption === 'LRN' && (
|
||||||
|
<div className="flex flex-col justify-start gap-3">
|
||||||
|
<Heading as="h5" className="text-sm font-sans text-elements-low-em">
|
||||||
|
The app will be deployed by the configured deployer
|
||||||
|
</Heading>
|
||||||
|
<span className="text-sm text-elements-high-em">
|
||||||
|
Enter LRN for deployer
|
||||||
|
</span>
|
||||||
|
<Controller
|
||||||
|
name="lrn"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { value, onChange } }) => (
|
||||||
|
<Input value={value} onChange={onChange} />
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{selectedOption === 'Auction' && (
|
||||||
|
<>
|
||||||
|
<div className="flex flex-col justify-start gap-3">
|
||||||
|
<Heading as="h5" className="text-sm font-sans text-elements-low-em">
|
||||||
|
Set the number of deployers and maximum price for each deployment
|
||||||
|
</Heading>
|
||||||
|
<span className="text-sm text-elements-high-em">
|
||||||
|
Number of Deployers
|
||||||
|
</span>
|
||||||
|
<Controller
|
||||||
|
name="numProviders"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { value, onChange } }) => (
|
||||||
|
<Input type="number" value={value} onChange={onChange} />
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col justify-start gap-3">
|
||||||
|
<span className="text-sm text-elements-high-em">
|
||||||
|
Maximum Price (alnt)
|
||||||
|
</span>
|
||||||
|
<Controller
|
||||||
|
name="maxPrice"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { value, onChange } }) => (
|
||||||
|
<Input type="number" value={value} onChange={onChange} />
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<Button
|
||||||
|
{...buttonSize}
|
||||||
|
type="submit"
|
||||||
|
disabled={isLoading}
|
||||||
|
rightIcon={
|
||||||
|
isLoading ? (
|
||||||
|
<LoadingIcon className="animate-spin" />
|
||||||
|
) : (
|
||||||
|
<ArrowRightCircleFilledIcon />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{isLoading ? 'Deploying repo' : 'Deploy repo'}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Configure;
|
||||||
+12
-29
@@ -38,36 +38,19 @@ export const ProjectRepoCard: React.FC<ProjectRepoCardProps> = ({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
navigate(`configure`,
|
||||||
setIsLoading(true);
|
{
|
||||||
const { addProject } = await client.addProject(orgSlug, {
|
state: {
|
||||||
name: `${repository.owner?.login}-${repository.name}`,
|
repository: {
|
||||||
prodBranch: repository.default_branch as string,
|
owner: repository.owner?.login,
|
||||||
repository: repository.full_name,
|
name: repository.name,
|
||||||
// TODO: Compute template from repo
|
defaultBranch: repository.default_branch,
|
||||||
template: 'webapp',
|
fullName: repository.full_name,
|
||||||
});
|
},
|
||||||
if (addProject) {
|
orgSlug,
|
||||||
navigate(`import?projectId=${addProject.id}`);
|
},
|
||||||
} else {
|
|
||||||
toast({
|
|
||||||
id: 'failed-to-create-project',
|
|
||||||
title: 'Failed to create project',
|
|
||||||
variant: 'error',
|
|
||||||
onDismiss: dismiss,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error((error as Error).message);
|
|
||||||
toast({
|
|
||||||
id: 'failed-to-create-project',
|
|
||||||
title: 'Failed to create project',
|
|
||||||
variant: 'error',
|
|
||||||
onDismiss: dismiss,
|
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
setIsLoading(false);
|
|
||||||
}
|
}
|
||||||
|
);
|
||||||
}, [client, repository, orgSlug, setIsLoading, navigate, toast]);
|
}, [client, repository, orgSlug, setIsLoading, navigate, toast]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
+7
-2
@@ -83,7 +83,7 @@ const DeploymentDetailsCard = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex md:flex-row flex-col gap-6 py-4 px-3 pb-6 mb-2 last:mb-0 last:pb-4 border-b border-border-separator last:border-b-transparent relative">
|
<div className="flex md:flex-row flex-col gap-6 py-4 px-3 pb-6 mb-2 last:mb-0 last:pb-4 border-b border-border-separator last:border-b-transparent relative">
|
||||||
<div className="flex-1 flex justify-between w-full md:max-w-[25%] lg:max-w-[28%]">
|
<div className="flex-1 flex justify-between w-full md:max-w-[30%] lg:max-w-[33%]">
|
||||||
<div className="flex-1 w-full space-y-2 max-w-[90%] sm:max-w-full">
|
<div className="flex-1 w-full space-y-2 max-w-[90%] sm:max-w-full">
|
||||||
{/* DEPLOYMENT URL */}
|
{/* DEPLOYMENT URL */}
|
||||||
{deployment.url && (
|
{deployment.url && (
|
||||||
@@ -96,7 +96,12 @@ const DeploymentDetailsCard = ({
|
|||||||
</OverflownText>
|
</OverflownText>
|
||||||
</Heading>
|
</Heading>
|
||||||
)}
|
)}
|
||||||
<span className="text-sm text-elements-low-em tracking-tight">
|
{deployment.deployerLrn && (
|
||||||
|
<span className="text-sm text-elements-low-em tracking-tight block mt-2">
|
||||||
|
Deployer LRN: {deployment.deployerLrn}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
<span className="text-sm text-elements-low-em tracking-tight block">
|
||||||
{deployment.environment === Environment.Production
|
{deployment.environment === Environment.Production
|
||||||
? `Production ${deployment.isCurrent ? '(Current)' : ''}`
|
? `Production ${deployment.isCurrent ? '(Current)' : ''}`
|
||||||
: 'Preview'}
|
: 'Preview'}
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
|
import { Auction, Project } from 'gql-client';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Dialog,
|
||||||
|
DialogTitle,
|
||||||
|
DialogContent,
|
||||||
|
DialogActions,
|
||||||
|
} from '@mui/material';
|
||||||
|
|
||||||
|
import { CheckRoundFilledIcon, LoadingIcon } from 'components/shared/CustomIcon';
|
||||||
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
|
import { Button, Heading, Tag } from 'components/shared';
|
||||||
|
|
||||||
|
const WAIT_DURATION = 5000;
|
||||||
|
|
||||||
|
export const AuctionCard = ({ project }: { project: Project }) => {
|
||||||
|
const [auctionStatus, setAuctionStatus] = useState<string>('');
|
||||||
|
const [deployerLrns, setDeployerLrns] = useState<string[]>([]);
|
||||||
|
const [auctionDetails, setAuctionDetails] = useState<Auction | null>(null);
|
||||||
|
const [openDialog, setOpenDialog] = useState<boolean>(false);
|
||||||
|
const client = useGQLClient();
|
||||||
|
|
||||||
|
const getIconByAuctionStatus = (status: string) =>
|
||||||
|
status === 'completed' ? <CheckRoundFilledIcon /> : <LoadingIcon className="animate-spin" />;
|
||||||
|
|
||||||
|
const checkAuctionStatus = useCallback(async () => {
|
||||||
|
const result = await client.getAuctionData(project.auctionId);
|
||||||
|
setAuctionStatus(result.status);
|
||||||
|
setAuctionDetails(result);
|
||||||
|
setDeployerLrns(project.deployerLrns);
|
||||||
|
}, [client, project.auctionId, project.deployerLrns]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchUpdatedProject = async () => {
|
||||||
|
if (auctionStatus === 'completed') {
|
||||||
|
// Wait for 5 secs since the project is not immediately updated with deployer LRNs
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, WAIT_DURATION));
|
||||||
|
|
||||||
|
const updatedProject = await client.getProject(project.id);
|
||||||
|
setDeployerLrns(updatedProject.project!.deployerLrns || []);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (auctionStatus !== 'completed') {
|
||||||
|
const intervalId = setInterval(checkAuctionStatus, WAIT_DURATION);
|
||||||
|
checkAuctionStatus();
|
||||||
|
|
||||||
|
return () => clearInterval(intervalId);
|
||||||
|
} else {
|
||||||
|
fetchUpdatedProject();
|
||||||
|
}
|
||||||
|
}, [auctionStatus, checkAuctionStatus, client]);
|
||||||
|
|
||||||
|
const renderAuctionStatus = useCallback(
|
||||||
|
() => (
|
||||||
|
<Tag
|
||||||
|
leftIcon={getIconByAuctionStatus(auctionStatus)}
|
||||||
|
size="xs"
|
||||||
|
type={auctionStatus === 'completed' ? 'positive' : 'emphasized'}
|
||||||
|
>
|
||||||
|
{auctionStatus.toUpperCase()}
|
||||||
|
</Tag>
|
||||||
|
),
|
||||||
|
[auctionStatus]
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleOpenDialog = () => setOpenDialog(true);
|
||||||
|
const handleCloseDialog = () => setOpenDialog(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="p-3 gap-2 rounded-xl border border-gray-200 transition-colors hover:bg-base-bg-alternate flex flex-col mt-8">
|
||||||
|
<div className="flex justify-between items-center">
|
||||||
|
<Heading className="text-lg leading-6 font-medium">Auction details</Heading>
|
||||||
|
<Button onClick={handleOpenDialog} variant="tertiary" size="sm">
|
||||||
|
View details
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex justify-between items-center mt-1">
|
||||||
|
<span className="text-elements-high-em text-sm font-medium tracking-tight">Auction Status</span>
|
||||||
|
<div className="ml-2">{renderAuctionStatus()}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex justify-between items-center mt-2">
|
||||||
|
<span className="text-elements-high-em text-sm font-medium tracking-tight">Auction Id</span>
|
||||||
|
<span className="text-elements-mid-em text-sm text-right">
|
||||||
|
{project.auctionId}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{deployerLrns?.length > 0 && (
|
||||||
|
<div className="mt-3">
|
||||||
|
<span className="text-elements-high-em text-sm font-medium tracking-tight">Deployer LRNs</span>
|
||||||
|
{deployerLrns.map((lrn, index) => (
|
||||||
|
<p key={index} className="text-elements-mid-em text-sm">
|
||||||
|
{'\u2022'} {lrn}
|
||||||
|
</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Dialog open={openDialog} onClose={handleCloseDialog} fullWidth maxWidth="md">
|
||||||
|
<DialogTitle>Auction Details</DialogTitle>
|
||||||
|
<DialogContent>
|
||||||
|
{auctionDetails && <pre>{JSON.stringify(auctionDetails, null, 2)}</pre>}
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={handleCloseDialog}>Close</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</Dialog>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -60,8 +60,8 @@ const DeleteProjectDialog = ({
|
|||||||
<Modal.Body>
|
<Modal.Body>
|
||||||
<Input
|
<Input
|
||||||
label={
|
label={
|
||||||
"Deleting your project is irreversible. Enter your project's name " +
|
"Deleting your project is irreversible. Enter your project's name " + '"' +
|
||||||
project.name +
|
project.name + '"' +
|
||||||
' below to confirm you want to permanently delete it:'
|
' below to confirm you want to permanently delete it:'
|
||||||
}
|
}
|
||||||
id="input"
|
id="input"
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { useState } from 'react';
|
|||||||
import { Domain, DomainStatus, Project } from 'gql-client';
|
import { Domain, DomainStatus, Project } from 'gql-client';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Chip,
|
|
||||||
Typography,
|
Typography,
|
||||||
Menu,
|
Menu,
|
||||||
MenuHandler,
|
MenuHandler,
|
||||||
@@ -15,6 +14,15 @@ import EditDomainDialog from './EditDomainDialog';
|
|||||||
import { useGQLClient } from 'context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
import { DeleteDomainDialog } from 'components/projects/Dialog/DeleteDomainDialog';
|
import { DeleteDomainDialog } from 'components/projects/Dialog/DeleteDomainDialog';
|
||||||
import { useToast } from 'components/shared/Toast';
|
import { useToast } from 'components/shared/Toast';
|
||||||
|
import { Tag } from 'components/shared/Tag';
|
||||||
|
import {
|
||||||
|
CheckIcon,
|
||||||
|
CrossIcon,
|
||||||
|
GearIcon,
|
||||||
|
LoadingIcon,
|
||||||
|
} from 'components/shared/CustomIcon';
|
||||||
|
import { Heading } from 'components/shared/Heading';
|
||||||
|
import { Button } from 'components/shared/Button';
|
||||||
|
|
||||||
enum RefreshStatus {
|
enum RefreshStatus {
|
||||||
IDLE,
|
IDLE,
|
||||||
@@ -79,22 +87,29 @@ const DomainCard = ({
|
|||||||
<>
|
<>
|
||||||
<div className="flex justify-between py-3">
|
<div className="flex justify-between py-3">
|
||||||
<div className="flex justify-start gap-1">
|
<div className="flex justify-start gap-1">
|
||||||
<Typography variant="h6">
|
<Heading as="h6" className="flex-col">
|
||||||
<i>^</i> {domain.name}
|
{domain.name}{' '}
|
||||||
</Typography>
|
<Tag
|
||||||
<Chip
|
type={
|
||||||
className="w-fit capitalize"
|
domain.status === DomainStatus.Live ? 'positive' : 'negative'
|
||||||
value={domain.status}
|
}
|
||||||
color={domain.status === DomainStatus.Live ? 'green' : 'orange'}
|
leftIcon={
|
||||||
variant="ghost"
|
domain.status === DomainStatus.Live ? (
|
||||||
icon={<i>^</i>}
|
<CheckIcon />
|
||||||
/>
|
) : (
|
||||||
|
<CrossIcon />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{domain.status}
|
||||||
|
</Tag>
|
||||||
|
</Heading>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-start gap-1">
|
<div className="flex justify-start gap-1">
|
||||||
<i
|
<i
|
||||||
id="refresh"
|
id="refresh"
|
||||||
className="cursor-pointer w-8 h-8"
|
className="cursor-pointer"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
SetRefreshStatus(RefreshStatus.CHECKING);
|
SetRefreshStatus(RefreshStatus.CHECKING);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -102,11 +117,17 @@ const DomainCard = ({
|
|||||||
}, CHECK_FAIL_TIMEOUT);
|
}, CHECK_FAIL_TIMEOUT);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{refreshStatus === RefreshStatus.CHECKING ? 'L' : 'R'}
|
{refreshStatus === RefreshStatus.CHECKING ? (
|
||||||
|
<LoadingIcon className="animate-spin" />
|
||||||
|
) : (
|
||||||
|
'L'
|
||||||
|
)}
|
||||||
</i>
|
</i>
|
||||||
<Menu placement="bottom-end">
|
<Menu placement="bottom-end">
|
||||||
<MenuHandler>
|
<MenuHandler>
|
||||||
<button className="border-2 rounded-full w-8 h-8">...</button>
|
<Button iconOnly>
|
||||||
|
<GearIcon />
|
||||||
|
</Button>
|
||||||
</MenuHandler>
|
</MenuHandler>
|
||||||
<MenuList>
|
<MenuList>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
@@ -143,13 +164,13 @@ const DomainCard = ({
|
|||||||
{domain.status === DomainStatus.Pending && (
|
{domain.status === DomainStatus.Pending && (
|
||||||
<Card className="bg-slate-100 p-4 text-sm">
|
<Card className="bg-slate-100 p-4 text-sm">
|
||||||
{refreshStatus === RefreshStatus.IDLE ? (
|
{refreshStatus === RefreshStatus.IDLE ? (
|
||||||
<Typography variant="small">
|
<Heading>
|
||||||
^ Add these records to your domain and refresh to check
|
^ Add these records to your domain and refresh to check
|
||||||
</Typography>
|
</Heading>
|
||||||
) : refreshStatus === RefreshStatus.CHECKING ? (
|
) : refreshStatus === RefreshStatus.CHECKING ? (
|
||||||
<Typography variant="small" className="text-blue-500">
|
<Heading className="text-blue-500">
|
||||||
^ Checking records for {domain.name}
|
^ Checking records for {domain.name}
|
||||||
</Typography>
|
</Heading>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex gap-2 text-red-500 mb-2">
|
<div className="flex gap-2 text-red-500 mb-2">
|
||||||
<div className="grow">
|
<div className="grow">
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { useCallback, useEffect, useMemo } from 'react';
|
import { useCallback, useEffect, useMemo } from 'react';
|
||||||
import { Controller, useForm, SubmitHandler } from 'react-hook-form';
|
import { Controller, useForm, SubmitHandler } from 'react-hook-form';
|
||||||
import toast from 'react-hot-toast';
|
|
||||||
import { Domain } from 'gql-client';
|
import { Domain } from 'gql-client';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -9,10 +8,11 @@ import {
|
|||||||
Option,
|
Option,
|
||||||
} from '@snowballtools/material-tailwind-react-fork';
|
} from '@snowballtools/material-tailwind-react-fork';
|
||||||
|
|
||||||
import { useGQLClient } from '../../../../context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
import { Modal } from 'components/shared/Modal';
|
import { Modal } from 'components/shared/Modal';
|
||||||
import { Button } from 'components/shared/Button';
|
import { Button } from 'components/shared/Button';
|
||||||
import { Input } from 'components/shared/Input';
|
import { Input } from 'components/shared/Input';
|
||||||
|
import { useToast } from 'components/shared/Toast';
|
||||||
|
|
||||||
const DEFAULT_REDIRECT_OPTIONS = ['none'];
|
const DEFAULT_REDIRECT_OPTIONS = ['none'];
|
||||||
|
|
||||||
@@ -40,6 +40,7 @@ const EditDomainDialog = ({
|
|||||||
onUpdate,
|
onUpdate,
|
||||||
}: EditDomainDialogProp) => {
|
}: EditDomainDialogProp) => {
|
||||||
const client = useGQLClient();
|
const client = useGQLClient();
|
||||||
|
const { toast, dismiss } = useToast();
|
||||||
|
|
||||||
const getRedirectUrl = (domain: Domain) => {
|
const getRedirectUrl = (domain: Domain) => {
|
||||||
const redirectDomain = domain.redirectTo;
|
const redirectDomain = domain.redirectTo;
|
||||||
@@ -99,10 +100,20 @@ const EditDomainDialog = ({
|
|||||||
|
|
||||||
if (updateDomain) {
|
if (updateDomain) {
|
||||||
await onUpdate();
|
await onUpdate();
|
||||||
toast.success(`Domain ${domain.name} has been updated`);
|
toast({
|
||||||
|
id: 'domain_id_updated',
|
||||||
|
title: `Domain ${domain.name} has been updated`,
|
||||||
|
variant: 'success',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
reset();
|
reset();
|
||||||
toast.error(`Error updating domain ${domain.name}`);
|
toast({
|
||||||
|
id: 'domain_id_error_update',
|
||||||
|
title: `Error updating domain ${domain.name}`,
|
||||||
|
variant: 'error',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleOpen();
|
handleOpen();
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import { useState } from 'react';
|
|||||||
import { DeleteWebhookDialog } from 'components/projects/Dialog/DeleteWebhookDialog';
|
import { DeleteWebhookDialog } from 'components/projects/Dialog/DeleteWebhookDialog';
|
||||||
import { Button } from 'components/shared/Button';
|
import { Button } from 'components/shared/Button';
|
||||||
import { useToast } from 'components/shared/Toast';
|
import { useToast } from 'components/shared/Toast';
|
||||||
|
import { Input } from 'components/shared/Input';
|
||||||
|
import { CopyIcon, TrashIcon } from 'components/shared/CustomIcon';
|
||||||
|
|
||||||
interface WebhookCardProps {
|
interface WebhookCardProps {
|
||||||
webhookUrl: string;
|
webhookUrl: string;
|
||||||
@@ -14,11 +16,12 @@ const WebhookCard = ({ webhookUrl, onDelete }: WebhookCardProps) => {
|
|||||||
|
|
||||||
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
|
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
|
||||||
return (
|
return (
|
||||||
<div className="flex justify-between w-full mb-3">
|
<div className="flex justify-between w-full mb-3 gap-3">
|
||||||
{webhookUrl}
|
<Input value={webhookUrl} disabled />
|
||||||
<div className="flex gap-3">
|
<div className="flex gap-3">
|
||||||
<Button
|
<Button
|
||||||
size="sm"
|
iconOnly
|
||||||
|
size="md"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigator.clipboard.writeText(webhookUrl);
|
navigator.clipboard.writeText(webhookUrl);
|
||||||
toast({
|
toast({
|
||||||
@@ -29,16 +32,17 @@ const WebhookCard = ({ webhookUrl, onDelete }: WebhookCardProps) => {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Copy
|
<CopyIcon />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
size="sm"
|
iconOnly
|
||||||
|
size="md"
|
||||||
variant="danger"
|
variant="danger"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setDeleteDialogOpen(true);
|
setDeleteDialogOpen(true);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
X
|
<TrashIcon />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<DeleteWebhookDialog
|
<DeleteWebhookDialog
|
||||||
|
|||||||
@@ -0,0 +1,117 @@
|
|||||||
|
import { useEffect, useRef } from 'react';
|
||||||
|
import { Input } from '../Input';
|
||||||
|
|
||||||
|
export interface VerifyCodeInputProps {
|
||||||
|
code: string;
|
||||||
|
setCode: (code: string) => void;
|
||||||
|
submitCode: () => void;
|
||||||
|
loading: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const VerifyCodeInput = ({
|
||||||
|
code,
|
||||||
|
setCode,
|
||||||
|
submitCode,
|
||||||
|
loading,
|
||||||
|
}: VerifyCodeInputProps) => {
|
||||||
|
const inputRefs = useRef<(HTMLInputElement | null)[]>([]);
|
||||||
|
|
||||||
|
const handlePaste = (
|
||||||
|
e: React.ClipboardEvent<HTMLInputElement>,
|
||||||
|
i: number,
|
||||||
|
) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const pasteData = e.clipboardData.getData('text').replace(/\D/g, ''); // Only digits
|
||||||
|
if (pasteData.length > 0) {
|
||||||
|
let newCodeArray = code.split('');
|
||||||
|
for (let j = 0; j < pasteData.length && i + j < 6; j++) {
|
||||||
|
newCodeArray[i + j] = pasteData[j];
|
||||||
|
}
|
||||||
|
const newCode = newCodeArray.join('');
|
||||||
|
setCode(newCode);
|
||||||
|
const nextIndex = Math.min(i + pasteData.length, 5);
|
||||||
|
const nextInput = inputRefs.current[nextIndex];
|
||||||
|
if (nextInput) nextInput.focus();
|
||||||
|
if (!newCode.includes(' ')) {
|
||||||
|
submitCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleKeyDown = (
|
||||||
|
e: React.KeyboardEvent<HTMLInputElement>,
|
||||||
|
i: number,
|
||||||
|
) => {
|
||||||
|
if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
|
||||||
|
|
||||||
|
if (e.key === 'Backspace') {
|
||||||
|
e.preventDefault();
|
||||||
|
const isEmpty = code[i] === ' ';
|
||||||
|
const newCode = !isEmpty
|
||||||
|
? code.slice(0, i) + ' ' + code.slice(i + 1, 6)
|
||||||
|
: code.slice(0, i - 1) + ' ' + code.slice(i, 6);
|
||||||
|
|
||||||
|
setCode(newCode.slice(0, 6));
|
||||||
|
|
||||||
|
if (i === 0 || !isEmpty) return;
|
||||||
|
const prev = inputRefs.current[i - 1];
|
||||||
|
if (prev) prev.focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e.key.match(/[0-9]/)) return;
|
||||||
|
|
||||||
|
e.preventDefault(); // Prevent the default event to avoid duplicate input
|
||||||
|
|
||||||
|
const newCode = code.slice(0, i) + e.key + code.slice(i + 1, 6);
|
||||||
|
setCode(newCode);
|
||||||
|
|
||||||
|
if (i === 5) {
|
||||||
|
submitCode();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const next = inputRefs.current[i + 1];
|
||||||
|
if (next) next.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement>, i: number) => {
|
||||||
|
const value = e.target.value.slice(-1);
|
||||||
|
if (!value.match(/[0-9]/)) return;
|
||||||
|
|
||||||
|
const newCode = code.slice(0, i) + value + code.slice(i + 1, 6);
|
||||||
|
setCode(newCode);
|
||||||
|
|
||||||
|
if (i < 5) {
|
||||||
|
const next = inputRefs.current[i + 1];
|
||||||
|
if (next) next.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newCode.includes(' ')) {
|
||||||
|
submitCode();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (inputRefs.current[0]) {
|
||||||
|
inputRefs.current[0].focus();
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex gap-2">
|
||||||
|
{code.split('').map((char, i) => (
|
||||||
|
<Input
|
||||||
|
key={i}
|
||||||
|
value={char === ' ' ? '' : char}
|
||||||
|
ref={(el) => (inputRefs.current[i] = el)}
|
||||||
|
onChange={(e) => handleChange(e, i)}
|
||||||
|
onPaste={(e) => handlePaste(e, i)}
|
||||||
|
onKeyDown={(e) => handleKeyDown(e, i)}
|
||||||
|
disabled={!!loading}
|
||||||
|
style={{ textAlign: 'center' }} // Add this line to center text
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { VerifyCodeInput } from './VerifyCodeInput';
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
export { Avatar } from './Avatar';
|
||||||
|
export { Badge } from './Badge';
|
||||||
|
export { Button } from './Button';
|
||||||
|
export { Calendar } from './Calendar';
|
||||||
|
export { Checkbox } from './Checkbox';
|
||||||
|
export { DatePicker } from './DatePicker';
|
||||||
|
export { DotBorder } from './DotBorder';
|
||||||
|
export { Heading } from './Heading';
|
||||||
|
export { IconWithFrame } from './IconWithFrame';
|
||||||
|
export { InlineNotification } from './InlineNotification';
|
||||||
|
export { Input } from './Input';
|
||||||
|
export { Modal } from './Modal';
|
||||||
|
export { OverflownText } from './OverflownText';
|
||||||
|
export { Radio } from './Radio';
|
||||||
|
export { SegmentedControls } from './SegmentedControls';
|
||||||
|
export { Select } from './Select';
|
||||||
|
export { Sidebar } from './Sidebar';
|
||||||
|
export { Step } from './Steps';
|
||||||
|
export { Switch } from './Switch';
|
||||||
|
export { Table } from './Table';
|
||||||
|
export { Tabs } from './Tabs';
|
||||||
|
export { Tag } from './Tag';
|
||||||
|
export { useToast } from './Toast';
|
||||||
|
export { Tooltip } from './Tooltip';
|
||||||
|
export { UserSelect } from './UserSelect';
|
||||||
|
export { VerifyCodeInput } from './VerifyCodeInput';
|
||||||
|
export { WavyBorder } from './WavyBorder';
|
||||||
@@ -16,8 +16,7 @@ import { Toaster } from 'components/shared/Toast';
|
|||||||
import { LogErrorBoundary } from 'utils/log-error';
|
import { LogErrorBoundary } from 'utils/log-error';
|
||||||
import { baseUrl } from 'utils/constants';
|
import { baseUrl } from 'utils/constants';
|
||||||
|
|
||||||
// @ts-ignore
|
console.log(`v-0.0.9`);
|
||||||
console.log(`v-${__VERSION__}`);
|
|
||||||
|
|
||||||
const root = ReactDOM.createRoot(
|
const root = ReactDOM.createRoot(
|
||||||
document.getElementById('root') as HTMLElement,
|
document.getElementById('root') as HTMLElement,
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const ProjectSearch = () => {
|
|||||||
return (
|
return (
|
||||||
<section className="h-full flex flex-col">
|
<section className="h-full flex flex-col">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="sticky hidden lg:block top-0 border-b bg-base-bg border-border-separator/[0.06] z-30">
|
<div className="sticky hidden lg:block top-0 border-b bg-base-bg border-border-separator/[0.06] hover:z-30">
|
||||||
<div className="flex pr-6 pl-2 py-2 items-center">
|
<div className="flex pr-6 pl-2 py-2 items-center">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<ProjectSearchBar
|
<ProjectSearchBar
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
LoaderIcon,
|
LoaderIcon,
|
||||||
} from 'components/shared/CustomIcon';
|
} from 'components/shared/CustomIcon';
|
||||||
import { WavyBorder } from 'components/shared/WavyBorder';
|
import { WavyBorder } from 'components/shared/WavyBorder';
|
||||||
import { Input } from 'components/shared/Input';
|
import { VerifyCodeInput } from 'components/shared/VerifyCodeInput';
|
||||||
import { verifyAccessCode } from 'utils/accessCode';
|
import { verifyAccessCode } from 'utils/accessCode';
|
||||||
|
|
||||||
type AccessMethod = 'accesscode' | 'passkey';
|
type AccessMethod = 'accesscode' | 'passkey';
|
||||||
@@ -28,6 +28,9 @@ export const AccessCode: React.FC<AccessCodeProps> = ({
|
|||||||
setAccessMethod('accesscode');
|
setAccessMethod('accesscode');
|
||||||
try {
|
try {
|
||||||
const isValidAccessCode = await verifyAccessCode(accessCode);
|
const isValidAccessCode = await verifyAccessCode(accessCode);
|
||||||
|
|
||||||
|
// add a pause for ux
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
||||||
if (isValidAccessCode) {
|
if (isValidAccessCode) {
|
||||||
localStorage.setItem('accessCode', accessCode);
|
localStorage.setItem('accessCode', accessCode);
|
||||||
onCorrectAccessCode();
|
onCorrectAccessCode();
|
||||||
@@ -43,7 +46,7 @@ export const AccessCode: React.FC<AccessCodeProps> = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const loading = accessMethod;
|
const loading = accessMethod;
|
||||||
const isValidAccessCodeLength = accessCode.length === 6;
|
const isValidAccessCodeLength = accessCode.trim().length === 5;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@@ -56,10 +59,11 @@ export const AccessCode: React.FC<AccessCodeProps> = ({
|
|||||||
<div className="self-stretch p-4 xs:p-6 flex-col justify-center items-center gap-8 flex">
|
<div className="self-stretch p-4 xs:p-6 flex-col justify-center items-center gap-8 flex">
|
||||||
<div className="self-stretch flex-col gap-8 flex">
|
<div className="self-stretch flex-col gap-8 flex">
|
||||||
<div className="flex-col justify-start items-start gap-2 inline-flex">
|
<div className="flex-col justify-start items-start gap-2 inline-flex">
|
||||||
<Input
|
<VerifyCodeInput
|
||||||
value={accessCode}
|
loading={!!loading}
|
||||||
onChange={(e) => setAccessCode(e.target.value)}
|
code={accessCode}
|
||||||
disabled={!!loading}
|
setCode={setAccessCode}
|
||||||
|
submitCode={validateAccessCode}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
@@ -70,9 +74,7 @@ export const AccessCode: React.FC<AccessCodeProps> = ({
|
|||||||
<ArrowRightCircleFilledIcon height="16" />
|
<ArrowRightCircleFilledIcon height="16" />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
onClick={() => {
|
onClick={validateAccessCode}
|
||||||
validateAccessCode();
|
|
||||||
}}
|
|
||||||
variant={'secondary'}
|
variant={'secondary'}
|
||||||
disabled={!accessCode || !isValidAccessCodeLength || !!loading}
|
disabled={!accessCode || !isValidAccessCodeLength || !!loading}
|
||||||
>
|
>
|
||||||
@@ -82,7 +84,10 @@ export const AccessCode: React.FC<AccessCodeProps> = ({
|
|||||||
<div className="flex flex-col gap-3">
|
<div className="flex flex-col gap-3">
|
||||||
<div className="justify-center items-center gap-2 inline-flex">
|
<div className="justify-center items-center gap-2 inline-flex">
|
||||||
<div className="text-red-500 text-sm">
|
<div className="text-red-500 text-sm">
|
||||||
Error: {error.message}
|
Error: {error.message}.{' '}
|
||||||
|
<a href="/signup" className="underline">
|
||||||
|
Try again?
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ const deployment: Deployment = {
|
|||||||
url: 'https://deploy1.example.com',
|
url: 'https://deploy1.example.com',
|
||||||
environment: Environment.Production,
|
environment: Environment.Production,
|
||||||
isCurrent: true,
|
isCurrent: true,
|
||||||
|
deployerLrn: 'lrn://deepstack-test4/deployers/webapp-deployer-api.test4.wireitin.com',
|
||||||
status: DeploymentStatus.Ready,
|
status: DeploymentStatus.Ready,
|
||||||
createdBy: {
|
createdBy: {
|
||||||
id: 'user1',
|
id: 'user1',
|
||||||
|
|||||||
@@ -1,5 +1,19 @@
|
|||||||
const Settings = () => {
|
import { Heading } from 'components/shared/Heading';
|
||||||
return <div className="p-5">Settings page</div>;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const Settings = () => {
|
||||||
|
return (
|
||||||
|
<section className="px-4 md:px-6 py-6 flex flex-col gap-6">
|
||||||
|
{/* Header */}
|
||||||
|
<div className="flex items-center">
|
||||||
|
<div className="grow">
|
||||||
|
<div className="flex gap-4 items-center">
|
||||||
|
<Heading as="h2" className="text-[24px]">
|
||||||
|
Settings
|
||||||
|
</Heading>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
export default Settings;
|
export default Settings;
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import { useCallback, useEffect, useState } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { Link, useParams } from 'react-router-dom';
|
import { Link, useParams } from 'react-router-dom';
|
||||||
import { Project } from 'gql-client';
|
|
||||||
import { Button } from 'components/shared/Button';
|
|
||||||
|
|
||||||
import { PlusIcon } from 'components/shared/CustomIcon';
|
|
||||||
import { ProjectCard } from 'components/projects/ProjectCard';
|
import { ProjectCard } from 'components/projects/ProjectCard';
|
||||||
import { Heading } from 'components/shared/Heading';
|
import { Heading, Badge, Button } from 'components/shared';
|
||||||
import { Badge } from 'components/shared/Badge';
|
import { PlusIcon } from 'components/shared/CustomIcon';
|
||||||
import { useGQLClient } from 'context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
|
import { Project } from 'gql-client';
|
||||||
|
|
||||||
const Projects = () => {
|
const Projects = () => {
|
||||||
const client = useGQLClient();
|
const client = useGQLClient();
|
||||||
@@ -28,6 +26,7 @@ const Projects = () => {
|
|||||||
return (
|
return (
|
||||||
<section className="px-4 md:px-6 py-6 flex flex-col gap-6">
|
<section className="px-4 md:px-6 py-6 flex flex-col gap-6">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
|
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<div className="grow">
|
<div className="grow">
|
||||||
<div className="flex gap-4 items-center">
|
<div className="flex gap-4 items-center">
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ const CreateWithTemplate = () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
step: 2,
|
step: 2,
|
||||||
|
route: `/${orgSlug}/projects/create/template/configure`,
|
||||||
|
label: 'Configure',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
step: 3,
|
||||||
route: `/${orgSlug}/projects/create/template/deploy`,
|
route: `/${orgSlug}/projects/create/template/deploy`,
|
||||||
label: 'Deploy',
|
label: 'Deploy',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ import NewProject from './index';
|
|||||||
import CreateWithTemplate from './Template';
|
import CreateWithTemplate from './Template';
|
||||||
import { templateRoutes } from './template/routes';
|
import { templateRoutes } from './template/routes';
|
||||||
import Id from './success/Id';
|
import Id from './success/Id';
|
||||||
import Import from './Import';
|
import Configure from 'components/projects/create/Configure';
|
||||||
|
import Deploy from 'components/projects/create/Deploy';
|
||||||
|
|
||||||
export const createProjectRoutes = [
|
export const createProjectRoutes = [
|
||||||
{
|
{
|
||||||
@@ -19,7 +20,11 @@ export const createProjectRoutes = [
|
|||||||
element: <Id />,
|
element: <Id />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'import',
|
path: 'configure',
|
||||||
element: <Import />,
|
element: <Configure />,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'deploy',
|
||||||
|
element: <Deploy />,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -1,24 +1,48 @@
|
|||||||
import { Link, useParams } from 'react-router-dom';
|
import { Link, useLocation, useParams } from 'react-router-dom';
|
||||||
import Lottie from 'lottie-react';
|
import Lottie from 'lottie-react';
|
||||||
|
|
||||||
import { Badge } from 'components/shared/Badge';
|
import { Badge } from 'components/shared/Badge';
|
||||||
import { Button } from 'components/shared/Button';
|
import { Button } from 'components/shared/Button';
|
||||||
import {
|
import {
|
||||||
ArrowLeftCircleFilledIcon,
|
ArrowLeftCircleFilledIcon,
|
||||||
LinkChainIcon,
|
|
||||||
QuestionMarkRoundFilledIcon,
|
QuestionMarkRoundFilledIcon,
|
||||||
} from 'components/shared/CustomIcon';
|
} from 'components/shared/CustomIcon';
|
||||||
import { Heading } from 'components/shared/Heading';
|
import { Heading } from 'components/shared/Heading';
|
||||||
|
|
||||||
import logoAnimation from 'components/../../public/lottie/logo.json';
|
import logoAnimation from 'components/../../public/lottie/logo.json';
|
||||||
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
|
import { Project } from 'gql-client';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
const Id = () => {
|
const Id = () => {
|
||||||
const { id, orgSlug } = useParams();
|
const { id, orgSlug } = useParams();
|
||||||
|
const client = useGQLClient();
|
||||||
|
const [project, setProject] = useState<Project | null>(null);
|
||||||
|
const location = useLocation();
|
||||||
|
const { isAuction } = location.state || {};
|
||||||
|
|
||||||
const handleSetupDomain = () => {
|
const handleSetupDomain = async () => {
|
||||||
//TODO: Implement this
|
if (id) {
|
||||||
|
// console.log('id', id);
|
||||||
|
// console.log('getting project for id', id);
|
||||||
|
const project = await client.getProject(id);
|
||||||
|
// console.log('project found:', project);
|
||||||
|
if (project && project.project) {
|
||||||
|
// console.log('project:', project.project);
|
||||||
|
setProject(project.project);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
window.location.href = '/';
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
handleSetupDomain();
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
{project ? (
|
||||||
<div className="flex flex-col gap-8 lg:gap-11 max-w-[522px] mx-auto py-6 lg:py-12">
|
<div className="flex flex-col gap-8 lg:gap-11 max-w-[522px] mx-auto py-6 lg:py-12">
|
||||||
{/* Icon */}
|
{/* Icon */}
|
||||||
<div className="flex justify-center">
|
<div className="flex justify-center">
|
||||||
@@ -28,23 +52,8 @@ const Id = () => {
|
|||||||
{/* Heading */}
|
{/* Heading */}
|
||||||
<div className="flex flex-col items-center gap-1.5">
|
<div className="flex flex-col items-center gap-1.5">
|
||||||
<Heading as="h3" className="font-medium text-xl">
|
<Heading as="h3" className="font-medium text-xl">
|
||||||
Project deployed successfully.
|
{isAuction? 'Auction created successfully.' : 'Project deployment created successfully.'}
|
||||||
</Heading>
|
</Heading>
|
||||||
<p className="flex flex-col items-center lg:flex-row font-sans gap-0.5 lg:gap-2 text-sm text-elements-high-em">
|
|
||||||
Your project has been deployed at{' '}
|
|
||||||
<Button
|
|
||||||
className="no-underline text-elements-link"
|
|
||||||
// TODO: use dynamic value
|
|
||||||
href="https://www.iglootools.snowballtools.xyz"
|
|
||||||
as="a"
|
|
||||||
variant="link-emphasized"
|
|
||||||
external
|
|
||||||
leftIcon={<LinkChainIcon />}
|
|
||||||
>
|
|
||||||
{/* // TODO: use dynamic value */}
|
|
||||||
www.iglootools.snowballtools.xyz
|
|
||||||
</Button>
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Card */}
|
{/* Card */}
|
||||||
@@ -73,7 +82,11 @@ const Id = () => {
|
|||||||
custom domain.
|
custom domain.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Button onClick={handleSetupDomain} variant="tertiary" size="sm">
|
<Button
|
||||||
|
onClick={handleSetupDomain}
|
||||||
|
variant="tertiary"
|
||||||
|
size="sm"
|
||||||
|
>
|
||||||
Setup domain
|
Setup domain
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
@@ -103,6 +116,10 @@ const Id = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
) : (
|
||||||
|
<></>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import ConfigureComponent from '../../../../../components/projects/create/Configure';
|
||||||
|
|
||||||
|
const Configure = () => {
|
||||||
|
return <ConfigureComponent />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Configure;
|
||||||
@@ -6,12 +6,14 @@ import { useMediaQuery } from 'usehooks-ts';
|
|||||||
import { RequestError } from 'octokit';
|
import { RequestError } from 'octokit';
|
||||||
|
|
||||||
import { useOctokit } from '../../../../../context/OctokitContext';
|
import { useOctokit } from '../../../../../context/OctokitContext';
|
||||||
import { useGQLClient } from '../../../../../context/GQLClientContext';
|
|
||||||
import { Template } from '../../../../../types/types';
|
import { Template } from '../../../../../types/types';
|
||||||
import { Heading } from 'components/shared/Heading';
|
import { Heading } from 'components/shared/Heading';
|
||||||
import { Input } from 'components/shared/Input';
|
import { Input } from 'components/shared/Input';
|
||||||
import { Select, SelectOption } from 'components/shared/Select';
|
import { Select, SelectOption } from 'components/shared/Select';
|
||||||
import { ArrowRightCircleFilledIcon } from 'components/shared/CustomIcon';
|
import {
|
||||||
|
ArrowRightCircleFilledIcon,
|
||||||
|
LoadingIcon,
|
||||||
|
} from 'components/shared/CustomIcon';
|
||||||
import { Checkbox } from 'components/shared/Checkbox';
|
import { Checkbox } from 'components/shared/Checkbox';
|
||||||
import { Button } from 'components/shared/Button';
|
import { Button } from 'components/shared/Button';
|
||||||
import { useToast } from 'components/shared/Toast';
|
import { useToast } from 'components/shared/Toast';
|
||||||
@@ -28,7 +30,6 @@ type SubmitRepoValues = {
|
|||||||
const CreateRepo = () => {
|
const CreateRepo = () => {
|
||||||
const { octokit, isAuth } = useOctokit();
|
const { octokit, isAuth } = useOctokit();
|
||||||
const { template } = useOutletContext<{ template: Template }>();
|
const { template } = useOutletContext<{ template: Template }>();
|
||||||
const client = useGQLClient();
|
|
||||||
|
|
||||||
const { orgSlug } = useParams();
|
const { orgSlug } = useParams();
|
||||||
const { toast, dismiss } = useToast();
|
const { toast, dismiss } = useToast();
|
||||||
@@ -50,36 +51,21 @@ const CreateRepo = () => {
|
|||||||
assert(template.repoFullName, 'Template URL not provided');
|
assert(template.repoFullName, 'Template URL not provided');
|
||||||
const [owner, repo] = template.repoFullName.split('/');
|
const [owner, repo] = template.repoFullName.split('/');
|
||||||
|
|
||||||
// TODO: Handle this functionality in backend
|
setIsLoading(true);
|
||||||
const gitRepo = await octokit?.rest.repos.createUsingTemplate({
|
|
||||||
template_owner: owner,
|
navigate(
|
||||||
template_repo: repo,
|
`configure?templateId=${template.id}`,
|
||||||
|
{
|
||||||
|
state: {
|
||||||
|
templateOwner: owner,
|
||||||
|
templateRepo: repo,
|
||||||
owner: data.account,
|
owner: data.account,
|
||||||
name: data.repoName,
|
name: data.repoName,
|
||||||
include_all_branches: false,
|
isPrivate: false,
|
||||||
private: data.isPrivate,
|
orgSlug
|
||||||
});
|
},
|
||||||
|
|
||||||
if (!gitRepo) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
);
|
||||||
// Refetch to always get correct default branch
|
|
||||||
const templateRepo = await octokit.rest.repos.get({
|
|
||||||
owner: template.repoFullName.split('/')[0],
|
|
||||||
repo: template.repoFullName.split('/')[1],
|
|
||||||
});
|
|
||||||
const prodBranch = templateRepo.data.default_branch ?? 'main';
|
|
||||||
|
|
||||||
const { addProject } = await client.addProject(orgSlug!, {
|
|
||||||
name: `${gitRepo.data.owner!.login}-${gitRepo.data.name}`,
|
|
||||||
prodBranch,
|
|
||||||
repository: gitRepo.data.full_name,
|
|
||||||
// TODO: Set selected template
|
|
||||||
template: 'webapp',
|
|
||||||
});
|
|
||||||
|
|
||||||
navigate(`deploy?projectId=${addProject.id}&templateId=${template.id}`);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
|
|
||||||
@@ -206,9 +192,15 @@ const CreateRepo = () => {
|
|||||||
{...buttonSize}
|
{...buttonSize}
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={!Boolean(template.repoFullName) || isLoading}
|
disabled={!Boolean(template.repoFullName) || isLoading}
|
||||||
rightIcon={<ArrowRightCircleFilledIcon />}
|
rightIcon={
|
||||||
|
isLoading ? (
|
||||||
|
<LoadingIcon className="animate-spin" />
|
||||||
|
) : (
|
||||||
|
<ArrowRightCircleFilledIcon />
|
||||||
|
)
|
||||||
|
}
|
||||||
>
|
>
|
||||||
Deploy
|
Next
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import CreateRepo from './index';
|
import CreateRepo from './index';
|
||||||
|
import Configure from './Configure';
|
||||||
import Deploy from './Deploy';
|
import Deploy from './Deploy';
|
||||||
|
|
||||||
export const templateRoutes = [
|
export const templateRoutes = [
|
||||||
@@ -6,6 +7,10 @@ export const templateRoutes = [
|
|||||||
index: true,
|
index: true,
|
||||||
element: <CreateRepo />,
|
element: <CreateRepo />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'configure',
|
||||||
|
element: <Configure />,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'deploy',
|
path: 'deploy',
|
||||||
element: <Deploy />,
|
element: <Deploy />,
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Domain, DomainStatus } from 'gql-client';
|
|
||||||
import { Link, useNavigate, useOutletContext } from 'react-router-dom';
|
import { Link, useNavigate, useOutletContext } from 'react-router-dom';
|
||||||
import { RequestError } from 'octokit';
|
import { RequestError } from 'octokit';
|
||||||
|
|
||||||
import { useOctokit } from '../../../../context/OctokitContext';
|
import { useOctokit } from 'context/OctokitContext';
|
||||||
import { GitCommitWithBranch, OutletContextType } from '../../../../types';
|
import { GitCommitWithBranch, OutletContextType } from '../../../../types';
|
||||||
import { useGQLClient } from '../../../../context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
import { Button } from 'components/shared/Button';
|
import { Button, Heading, Avatar, Tag } from 'components/shared';
|
||||||
import { Heading } from 'components/shared/Heading';
|
|
||||||
import { Avatar } from 'components/shared/Avatar';
|
|
||||||
import { getInitials } from 'utils/geInitials';
|
import { getInitials } from 'utils/geInitials';
|
||||||
import {
|
import {
|
||||||
BranchStrokeIcon,
|
BranchStrokeIcon,
|
||||||
@@ -18,12 +15,13 @@ import {
|
|||||||
GithubStrokeIcon,
|
GithubStrokeIcon,
|
||||||
GlobeIcon,
|
GlobeIcon,
|
||||||
LinkIcon,
|
LinkIcon,
|
||||||
|
CalendarDaysIcon,
|
||||||
} from 'components/shared/CustomIcon';
|
} from 'components/shared/CustomIcon';
|
||||||
import { Tag } from 'components/shared/Tag';
|
|
||||||
import { Activity } from 'components/projects/project/overview/Activity';
|
import { Activity } from 'components/projects/project/overview/Activity';
|
||||||
import { OverviewInfo } from 'components/projects/project/overview/OverviewInfo';
|
import { OverviewInfo } from 'components/projects/project/overview/OverviewInfo';
|
||||||
import { CalendarDaysIcon } from 'components/shared/CustomIcon/CalendarDaysIcon';
|
|
||||||
import { relativeTimeMs } from 'utils/time';
|
import { relativeTimeMs } from 'utils/time';
|
||||||
|
import { Domain, DomainStatus } from 'gql-client';
|
||||||
|
import { AuctionCard } from 'components/projects/project/overview/Activity/AuctionCard';
|
||||||
|
|
||||||
const COMMITS_PER_PAGE = 4;
|
const COMMITS_PER_PAGE = 4;
|
||||||
|
|
||||||
@@ -131,9 +129,15 @@ const OverviewTabPanel = () => {
|
|||||||
<Heading className="text-lg leading-6 font-medium truncate">
|
<Heading className="text-lg leading-6 font-medium truncate">
|
||||||
{project.name}
|
{project.name}
|
||||||
</Heading>
|
</Heading>
|
||||||
<p className="text-sm text-elements-low-em tracking-tight truncate">
|
{project.baseDomains && project.baseDomains.length > 0 && project.baseDomains.map((baseDomain, index) => (
|
||||||
{project.subDomain}
|
<a
|
||||||
</p>
|
key={index}
|
||||||
|
href={`https://${project.name}.${baseDomain}`}
|
||||||
|
className="text-sm text-elements-low-em tracking-tight truncate"
|
||||||
|
>
|
||||||
|
{baseDomain}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<OverviewInfo label="Domain" icon={<GlobeIcon />}>
|
<OverviewInfo label="Domain" icon={<GlobeIcon />}>
|
||||||
@@ -205,6 +209,7 @@ const OverviewTabPanel = () => {
|
|||||||
No current deployment found.
|
No current deployment found.
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
{project.auctionId && <AuctionCard project={project}/>}
|
||||||
</div>
|
</div>
|
||||||
<Activity activities={activities} isLoading={fetchingActivities} />
|
<Activity activities={activities} isLoading={fetchingActivities} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
import { useFieldArray, useForm } from 'react-hook-form';
|
import { useFieldArray, useForm } from 'react-hook-form';
|
||||||
import toast from 'react-hot-toast';
|
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
import { Environment, EnvironmentVariable } from 'gql-client';
|
|
||||||
|
|
||||||
import { Collapse } from '@snowballtools/material-tailwind-react-fork';
|
import { Collapse } from '@snowballtools/material-tailwind-react-fork';
|
||||||
|
|
||||||
import AddEnvironmentVariableRow from 'components/projects/project/settings/AddEnvironmentVariableRow';
|
import AddEnvironmentVariableRow from 'components/projects/project/settings/AddEnvironmentVariableRow';
|
||||||
import DisplayEnvironmentVariables from 'components/projects/project/settings/DisplayEnvironmentVariables';
|
import DisplayEnvironmentVariables from 'components/projects/project/settings/DisplayEnvironmentVariables';
|
||||||
import { useGQLClient } from '../../../../../context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
import { EnvironmentVariablesFormValues } from '../../../../../types';
|
import { EnvironmentVariablesFormValues } from '../../../../../types';
|
||||||
import HorizontalLine from 'components/HorizontalLine';
|
import HorizontalLine from 'components/HorizontalLine';
|
||||||
import { Heading } from 'components/shared/Heading';
|
import { Heading } from 'components/shared/Heading';
|
||||||
@@ -17,10 +15,13 @@ import { Checkbox } from 'components/shared/Checkbox';
|
|||||||
import { PlusIcon } from 'components/shared/CustomIcon';
|
import { PlusIcon } from 'components/shared/CustomIcon';
|
||||||
import { InlineNotification } from 'components/shared/InlineNotification';
|
import { InlineNotification } from 'components/shared/InlineNotification';
|
||||||
import { ProjectSettingContainer } from 'components/projects/project/settings/ProjectSettingContainer';
|
import { ProjectSettingContainer } from 'components/projects/project/settings/ProjectSettingContainer';
|
||||||
|
import { useToast } from 'components/shared/Toast';
|
||||||
|
import { Environment, EnvironmentVariable } from 'gql-client';
|
||||||
|
|
||||||
export const EnvironmentVariablesTabPanel = () => {
|
export const EnvironmentVariablesTabPanel = () => {
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
const client = useGQLClient();
|
const client = useGQLClient();
|
||||||
|
const { toast, dismiss } = useToast();
|
||||||
|
|
||||||
const [environmentVariables, setEnvironmentVariables] = useState<
|
const [environmentVariables, setEnvironmentVariables] = useState<
|
||||||
EnvironmentVariable[]
|
EnvironmentVariable[]
|
||||||
@@ -118,13 +119,25 @@ export const EnvironmentVariablesTabPanel = () => {
|
|||||||
|
|
||||||
fetchEnvironmentVariables(id);
|
fetchEnvironmentVariables(id);
|
||||||
|
|
||||||
toast.success(
|
toast({
|
||||||
|
id:
|
||||||
|
createFormData.variables.length > 1
|
||||||
|
? 'env_variable_added'
|
||||||
|
: 'env_variables_added',
|
||||||
|
title:
|
||||||
createFormData.variables.length > 1
|
createFormData.variables.length > 1
|
||||||
? `${createFormData.variables.length} variables added`
|
? `${createFormData.variables.length} variables added`
|
||||||
: `Variable added`,
|
: `Variable added`,
|
||||||
);
|
variant: 'success',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
toast.error('Environment variables not added');
|
toast({
|
||||||
|
id: 'env_variables_not_added',
|
||||||
|
title: 'Environment variables not added',
|
||||||
|
variant: 'error',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[id, client],
|
[id, client],
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import toast from 'react-hot-toast';
|
|
||||||
import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
|
import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
|
||||||
|
|
||||||
import { useGQLClient } from '../../../../../../../context/GQLClientContext';
|
import { useGQLClient } from 'context/GQLClientContext';
|
||||||
import { Table } from 'components/shared/Table';
|
import { Table } from 'components/shared/Table';
|
||||||
import { Button } from 'components/shared/Button';
|
import { Button } from 'components/shared/Button';
|
||||||
import { InlineNotification } from 'components/shared/InlineNotification';
|
import { InlineNotification } from 'components/shared/InlineNotification';
|
||||||
import { ArrowRightCircleIcon } from 'components/shared/CustomIcon';
|
import { ArrowRightCircleIcon } from 'components/shared/CustomIcon';
|
||||||
import { ProjectSettingContainer } from 'components/projects/project/settings/ProjectSettingContainer';
|
import { ProjectSettingContainer } from 'components/projects/project/settings/ProjectSettingContainer';
|
||||||
|
import { useToast } from 'components/shared/Toast';
|
||||||
|
|
||||||
const Config = () => {
|
const Config = () => {
|
||||||
const { id, orgSlug } = useParams();
|
const { id, orgSlug } = useParams();
|
||||||
@@ -14,15 +14,26 @@ const Config = () => {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
const primaryDomainName = searchParams.get('name');
|
const primaryDomainName = searchParams.get('name');
|
||||||
|
const { toast, dismiss } = useToast();
|
||||||
|
|
||||||
const handleSubmitDomain = async () => {
|
const handleSubmitDomain = async () => {
|
||||||
if (primaryDomainName === null) {
|
if (primaryDomainName === null) {
|
||||||
toast.error('Cannot resolve domain name');
|
toast({
|
||||||
|
id: 'unresolvable_domain_name',
|
||||||
|
title: 'Cannot resolve domain name',
|
||||||
|
variant: 'error',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id === undefined) {
|
if (id === undefined) {
|
||||||
toast.error('Cannot find project');
|
toast({
|
||||||
|
id: 'domain_cannot_find_project',
|
||||||
|
title: 'Cannot find project',
|
||||||
|
variant: 'error',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,10 +42,20 @@ const Config = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (isAdded) {
|
if (isAdded) {
|
||||||
toast.success('Domain added successfully');
|
toast({
|
||||||
|
id: 'domain_added_successfully',
|
||||||
|
title: 'Domain added successfully',
|
||||||
|
variant: 'success',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
navigate(`/${orgSlug}/projects/${id}/settings/domains`);
|
navigate(`/${orgSlug}/projects/${id}/settings/domains`);
|
||||||
} else {
|
} else {
|
||||||
toast.error('Error adding domain');
|
toast({
|
||||||
|
id: 'generic_error_adding_domain',
|
||||||
|
title: 'Error adding domaint',
|
||||||
|
variant: 'error',
|
||||||
|
onDismiss: dismiss,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,13 @@ const meta: Meta<typeof ChevronDownSmallIcon> = {
|
|||||||
title: 'Icons/ChevronDownSmallIcon',
|
title: 'Icons/ChevronDownSmallIcon',
|
||||||
component: ChevronDownSmallIcon,
|
component: ChevronDownSmallIcon,
|
||||||
tags: ['autodocs'],
|
tags: ['autodocs'],
|
||||||
args: {
|
argTypes: {
|
||||||
size: 'string | number' as unknown as any,
|
size: {
|
||||||
name: 'string',
|
control: 'text',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
control: 'text',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,13 @@ const meta: Meta<typeof ChevronRight> = {
|
|||||||
title: 'Icons/ChevronRight',
|
title: 'Icons/ChevronRight',
|
||||||
component: ChevronRight,
|
component: ChevronRight,
|
||||||
tags: ['autodocs'],
|
tags: ['autodocs'],
|
||||||
args: {
|
argTypes: {
|
||||||
size: 'string | number' as unknown as any,
|
size: {
|
||||||
name: 'string',
|
control: 'text',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
control: 'text',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,13 @@ const meta: Meta<typeof ChevronUpDown> = {
|
|||||||
title: 'Icons/ChevronUpDown',
|
title: 'Icons/ChevronUpDown',
|
||||||
component: ChevronUpDown,
|
component: ChevronUpDown,
|
||||||
tags: ['autodocs'],
|
tags: ['autodocs'],
|
||||||
args: {
|
argTypes: {
|
||||||
size: 'string | number' as unknown as any,
|
size: {
|
||||||
name: 'string',
|
control: 'text',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
control: 'text',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ import { Meta, StoryObj } from '@storybook/react';
|
|||||||
import { ChevronUpSmallIcon } from 'components/shared/CustomIcon';
|
import { ChevronUpSmallIcon } from 'components/shared/CustomIcon';
|
||||||
|
|
||||||
const meta: Meta<typeof ChevronUpSmallIcon> = {
|
const meta: Meta<typeof ChevronUpSmallIcon> = {
|
||||||
title: 'Components/ChevronUpSmallIcon',
|
title: 'Icons/ChevronUpSmallIcon',
|
||||||
component: ChevronUpSmallIcon,
|
component: ChevronUpSmallIcon,
|
||||||
tags: ['autodocs'],
|
tags: ['autodocs'],
|
||||||
args: {
|
argTypes: {
|
||||||
size: 'string | number' as unknown as any,
|
size: {
|
||||||
name: 'string',
|
control: 'text',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
control: 'text',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Meta, StoryObj } from '@storybook/react';
|
|||||||
import { CollaboratorsIcon } from 'components/shared/CustomIcon';
|
import { CollaboratorsIcon } from 'components/shared/CustomIcon';
|
||||||
|
|
||||||
const meta: Meta<typeof CollaboratorsIcon> = {
|
const meta: Meta<typeof CollaboratorsIcon> = {
|
||||||
title: 'Components/CollaboratorsIcon',
|
title: 'Icons/CollaboratorsIcon',
|
||||||
component: CollaboratorsIcon,
|
component: CollaboratorsIcon,
|
||||||
tags: ['autodocs'],
|
tags: ['autodocs'],
|
||||||
argTypes: {
|
argTypes: {
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { StoryObj, Meta } from '@storybook/react';
|
||||||
|
|
||||||
|
import { ProjectSearchBar } from 'components/projects/ProjectSearchBar';
|
||||||
|
|
||||||
|
const meta: Meta<typeof ProjectSearchBar> = {
|
||||||
|
title: 'Components/ProjectSearchBar',
|
||||||
|
component: ProjectSearchBar,
|
||||||
|
tags: ['autodocs'],
|
||||||
|
argTypes: {
|
||||||
|
onChange: {
|
||||||
|
action: 'change',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
|
||||||
|
type Story = StoryObj<typeof ProjectSearchBar>;
|
||||||
|
|
||||||
|
export const Default: Story = {};
|
||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
DomainStatus,
|
DomainStatus,
|
||||||
Domain,
|
Domain,
|
||||||
Environment,
|
Environment,
|
||||||
|
Permission,
|
||||||
} from 'gql-client';
|
} from 'gql-client';
|
||||||
|
|
||||||
export const user: User = {
|
export const user: User = {
|
||||||
@@ -44,7 +45,7 @@ export const organization: Organization = {
|
|||||||
export const member: ProjectMember = {
|
export const member: ProjectMember = {
|
||||||
id: '1',
|
id: '1',
|
||||||
member: user,
|
member: user,
|
||||||
permissions: [],
|
permissions: [Permission.Edit],
|
||||||
isPending: false,
|
isPending: false,
|
||||||
createdAt: '2021-08-01T00:00:00.000Z',
|
createdAt: '2021-08-01T00:00:00.000Z',
|
||||||
updatedAt: '2021-08-01T00:00:00.000Z',
|
updatedAt: '2021-08-01T00:00:00.000Z',
|
||||||
@@ -70,7 +71,7 @@ export const environmentVariable1: EnvironmentVariable = {
|
|||||||
|
|
||||||
export const domain0: Domain = {
|
export const domain0: Domain = {
|
||||||
id: '1',
|
id: '1',
|
||||||
name: 'Domain',
|
name: 'domain.com',
|
||||||
createdAt: '2021-08-01T00:00:00.000Z',
|
createdAt: '2021-08-01T00:00:00.000Z',
|
||||||
updatedAt: '2021-08-01T00:00:00.000Z',
|
updatedAt: '2021-08-01T00:00:00.000Z',
|
||||||
branch: 'Branch',
|
branch: 'Branch',
|
||||||
@@ -78,6 +79,16 @@ export const domain0: Domain = {
|
|||||||
redirectTo: null,
|
redirectTo: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const domain1: Domain = {
|
||||||
|
id: '2',
|
||||||
|
name: 'www.domain.com',
|
||||||
|
createdAt: '2021-08-01T00:00:00.000Z',
|
||||||
|
updatedAt: '2021-08-01T00:00:00.000Z',
|
||||||
|
branch: 'Branch',
|
||||||
|
status: DomainStatus.Live,
|
||||||
|
redirectTo: domain0,
|
||||||
|
};
|
||||||
|
|
||||||
export const deployment0: Deployment = {
|
export const deployment0: Deployment = {
|
||||||
id: '1',
|
id: '1',
|
||||||
url: 'https://deployment.com',
|
url: 'https://deployment.com',
|
||||||
@@ -91,6 +102,7 @@ export const deployment0: Deployment = {
|
|||||||
domain: domain0,
|
domain: domain0,
|
||||||
commitMessage: 'Commit Message',
|
commitMessage: 'Commit Message',
|
||||||
createdBy: user,
|
createdBy: user,
|
||||||
|
deployerLrn: 'lrn://deployer.apps.snowballtools.com ',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const project: Project = {
|
export const project: Project = {
|
||||||
@@ -108,7 +120,9 @@ export const project: Project = {
|
|||||||
organization: organization,
|
organization: organization,
|
||||||
template: 'Template',
|
template: 'Template',
|
||||||
members: [member],
|
members: [member],
|
||||||
|
auctionId: '7553538436710373822151221341b43f577e07b0525d083cc9b2de98890138a1',
|
||||||
|
deployerLrns: ['lrn://deployer.apps.snowballtools.com '],
|
||||||
webhooks: ['beepboop'],
|
webhooks: ['beepboop'],
|
||||||
icon: 'Icon',
|
icon: 'Icon',
|
||||||
subDomain: 'SubDomain',
|
baseDomains: ['baseDomain'],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import { StoryObj, Meta } from '@storybook/react';
|
||||||
|
|
||||||
|
import DomainCard from 'components/projects/project/settings/DomainCard';
|
||||||
|
import { domain0, domain1, project } from '../../MockStoriesData';
|
||||||
|
|
||||||
|
const meta: Meta<typeof DomainCard> = {
|
||||||
|
title: 'Project/Settings/DomainCard',
|
||||||
|
component: DomainCard,
|
||||||
|
tags: ['autodocs'],
|
||||||
|
argTypes: {
|
||||||
|
domains: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
domain: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
branches: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
project: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
onUpdate: {
|
||||||
|
action: 'update',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
|
||||||
|
type Story = StoryObj<typeof DomainCard>;
|
||||||
|
|
||||||
|
export const Default: Story = {
|
||||||
|
args: {
|
||||||
|
domains: [domain0, domain1],
|
||||||
|
domain: domain0,
|
||||||
|
branches: ['main'],
|
||||||
|
project: project,
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import { StoryObj, Meta } from '@storybook/react';
|
||||||
|
|
||||||
|
import EditDomainDialog from 'components/projects/project/settings/EditDomainDialog';
|
||||||
|
|
||||||
|
const meta: Meta<typeof EditDomainDialog> = {
|
||||||
|
title: 'Components/EditDomainDialog',
|
||||||
|
component: EditDomainDialog,
|
||||||
|
tags: ['autodocs'],
|
||||||
|
argTypes: {
|
||||||
|
domains: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
open: {
|
||||||
|
control: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
handleOpen: {
|
||||||
|
action: 'open',
|
||||||
|
},
|
||||||
|
domain: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
branches: {
|
||||||
|
control: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
onUpdate: {
|
||||||
|
action: 'update',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
|
||||||
|
type Story = StoryObj<typeof EditDomainDialog>;
|
||||||
|
|
||||||
|
export const Default: Story = {};
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import WebhookCard from 'components/projects/project/settings/WebhookCard';
|
||||||
|
|
||||||
|
const meta: Meta<typeof WebhookCard> = {
|
||||||
|
title: 'Project/Settings/WebhookCard',
|
||||||
|
component: WebhookCard,
|
||||||
|
tags: ['autodocs'],
|
||||||
|
argTypes: {
|
||||||
|
webhookUrl: {
|
||||||
|
control: {
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
onDelete: {
|
||||||
|
action: 'delete',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
|
||||||
|
type Story = StoryObj<typeof WebhookCard>;
|
||||||
|
|
||||||
|
export const Default: Story = {
|
||||||
|
args: {
|
||||||
|
webhookUrl: 'https://api.retool.com',
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -13,7 +13,6 @@ export default defineConfig({
|
|||||||
context: '/src/context',
|
context: '/src/context',
|
||||||
components: '/src/components',
|
components: '/src/components',
|
||||||
pages: '/src/pages',
|
pages: '/src/pages',
|
||||||
types: '/src/types',
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
define: {
|
define: {
|
||||||
|
|||||||
Vendored
+59
-3
@@ -18,6 +18,42 @@ declare enum DeploymentStatus {
|
|||||||
Error = "Error",
|
Error = "Error",
|
||||||
Deleting = "Deleting"
|
Deleting = "Deleting"
|
||||||
}
|
}
|
||||||
|
declare enum AuctionStatus {
|
||||||
|
AuctionStatusCommitPhase = "commit",
|
||||||
|
AuctionStatusRevealPhase = "reveal",
|
||||||
|
AuctionStatusExpired = "expired",
|
||||||
|
AuctionStatusCompleted = "completed"
|
||||||
|
}
|
||||||
|
type Bid = {
|
||||||
|
auctionId: string;
|
||||||
|
bidderAddress: string;
|
||||||
|
status: string;
|
||||||
|
commitHash: string;
|
||||||
|
commitTime?: Date;
|
||||||
|
commitFee?: string;
|
||||||
|
revealTime?: Date;
|
||||||
|
revealFee?: string;
|
||||||
|
bidAmount?: string;
|
||||||
|
};
|
||||||
|
type Auction = {
|
||||||
|
id: string;
|
||||||
|
kind: string;
|
||||||
|
status: string;
|
||||||
|
ownerAddress: string;
|
||||||
|
createTime?: Date;
|
||||||
|
commitsEndTime?: Date;
|
||||||
|
revealsEndTime?: Date;
|
||||||
|
commitFee?: string;
|
||||||
|
revealFee?: string;
|
||||||
|
minimumBid?: string;
|
||||||
|
winnerAddresses: string[];
|
||||||
|
winnerBids?: string[];
|
||||||
|
winnerPrice?: string;
|
||||||
|
maxPrice?: string;
|
||||||
|
numProviders: number;
|
||||||
|
fundsReleased: boolean;
|
||||||
|
bids: Bid[];
|
||||||
|
};
|
||||||
declare enum DomainStatus {
|
declare enum DomainStatus {
|
||||||
Live = "Live",
|
Live = "Live",
|
||||||
Pending = "Pending"
|
Pending = "Pending"
|
||||||
@@ -55,8 +91,10 @@ type Deployment = {
|
|||||||
commitHash: string;
|
commitHash: string;
|
||||||
commitMessage: string;
|
commitMessage: string;
|
||||||
url?: string;
|
url?: string;
|
||||||
|
deployerLrn: string;
|
||||||
environment: Environment;
|
environment: Environment;
|
||||||
isCurrent: boolean;
|
isCurrent: boolean;
|
||||||
|
baseDomain?: string;
|
||||||
status: DeploymentStatus;
|
status: DeploymentStatus;
|
||||||
createdBy: User;
|
createdBy: User;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
@@ -112,6 +150,8 @@ type Project = {
|
|||||||
description: string;
|
description: string;
|
||||||
template: string;
|
template: string;
|
||||||
framework: string;
|
framework: string;
|
||||||
|
deployerLrns: string[];
|
||||||
|
auctionId: string;
|
||||||
webhooks: string[];
|
webhooks: string[];
|
||||||
members: ProjectMember[];
|
members: ProjectMember[];
|
||||||
environmentVariables: EnvironmentVariable[];
|
environmentVariables: EnvironmentVariable[];
|
||||||
@@ -119,7 +159,7 @@ type Project = {
|
|||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
organization: Organization;
|
organization: Organization;
|
||||||
icon: string;
|
icon: string;
|
||||||
subDomain: string;
|
baseDomains?: string[] | null;
|
||||||
};
|
};
|
||||||
type GetProjectMembersResponse = {
|
type GetProjectMembersResponse = {
|
||||||
projectMembers: ProjectMember[];
|
projectMembers: ProjectMember[];
|
||||||
@@ -185,6 +225,9 @@ type RemoveEnvironmentVariableResponse = {
|
|||||||
type UpdateDeploymentToProdResponse = {
|
type UpdateDeploymentToProdResponse = {
|
||||||
updateDeploymentToProd: boolean;
|
updateDeploymentToProd: boolean;
|
||||||
};
|
};
|
||||||
|
type AddProjectFromTemplateResponse = {
|
||||||
|
addProjectFromTemplate: Project;
|
||||||
|
};
|
||||||
type AddProjectResponse = {
|
type AddProjectResponse = {
|
||||||
addProject: Project;
|
addProject: Project;
|
||||||
};
|
};
|
||||||
@@ -200,6 +243,13 @@ type DeleteProjectResponse = {
|
|||||||
type DeleteDomainResponse = {
|
type DeleteDomainResponse = {
|
||||||
deleteDomain: boolean;
|
deleteDomain: boolean;
|
||||||
};
|
};
|
||||||
|
type AddProjectFromTemplateInput = {
|
||||||
|
templateOwner: string;
|
||||||
|
templateRepo: string;
|
||||||
|
owner: string;
|
||||||
|
name: string;
|
||||||
|
isPrivate: boolean;
|
||||||
|
};
|
||||||
type AddProjectInput = {
|
type AddProjectInput = {
|
||||||
name: string;
|
name: string;
|
||||||
repository: string;
|
repository: string;
|
||||||
@@ -245,6 +295,10 @@ type AuthenticateGitHubResponse = {
|
|||||||
type UnauthenticateGitHubResponse = {
|
type UnauthenticateGitHubResponse = {
|
||||||
unauthenticateGitHub: boolean;
|
unauthenticateGitHub: boolean;
|
||||||
};
|
};
|
||||||
|
type AuctionData = {
|
||||||
|
maxPrice: string;
|
||||||
|
numProviders: number;
|
||||||
|
};
|
||||||
|
|
||||||
interface GraphQLConfig {
|
interface GraphQLConfig {
|
||||||
gqlEndpoint: string;
|
gqlEndpoint: string;
|
||||||
@@ -267,7 +321,8 @@ declare class GQLClient {
|
|||||||
updateEnvironmentVariable(environmentVariableId: string, data: UpdateEnvironmentVariableInput): Promise<UpdateEnvironmentVariableResponse>;
|
updateEnvironmentVariable(environmentVariableId: string, data: UpdateEnvironmentVariableInput): Promise<UpdateEnvironmentVariableResponse>;
|
||||||
removeEnvironmentVariable(environmentVariableId: string): Promise<RemoveEnvironmentVariableResponse>;
|
removeEnvironmentVariable(environmentVariableId: string): Promise<RemoveEnvironmentVariableResponse>;
|
||||||
updateDeploymentToProd(deploymentId: string): Promise<UpdateDeploymentToProdResponse>;
|
updateDeploymentToProd(deploymentId: string): Promise<UpdateDeploymentToProdResponse>;
|
||||||
addProject(organizationSlug: string, data: AddProjectInput): Promise<AddProjectResponse>;
|
addProjectFromTemplate(organizationSlug: string, data: AddProjectFromTemplateInput, lrn?: string, auctionData?: AuctionData): Promise<AddProjectFromTemplateResponse>;
|
||||||
|
addProject(organizationSlug: string, data: AddProjectInput, lrn?: string, auctionData?: AuctionData): Promise<AddProjectResponse>;
|
||||||
updateProject(projectId: string, data: UpdateProjectInput): Promise<UpdateProjectResponse>;
|
updateProject(projectId: string, data: UpdateProjectInput): Promise<UpdateProjectResponse>;
|
||||||
updateDomain(domainId: string, data: UpdateDomainInput): Promise<UpdateDomainResponse>;
|
updateDomain(domainId: string, data: UpdateDomainInput): Promise<UpdateDomainResponse>;
|
||||||
redeployToProd(deploymentId: string): Promise<RedeployToProdResponse>;
|
redeployToProd(deploymentId: string): Promise<RedeployToProdResponse>;
|
||||||
@@ -279,6 +334,7 @@ declare class GQLClient {
|
|||||||
getDomains(projectId: string, filter?: FilterDomainInput): Promise<GetDomainsResponse>;
|
getDomains(projectId: string, filter?: FilterDomainInput): Promise<GetDomainsResponse>;
|
||||||
authenticateGitHub(code: string): Promise<AuthenticateGitHubResponse>;
|
authenticateGitHub(code: string): Promise<AuthenticateGitHubResponse>;
|
||||||
unauthenticateGithub(): Promise<UnauthenticateGitHubResponse>;
|
unauthenticateGithub(): Promise<UnauthenticateGitHubResponse>;
|
||||||
|
getAuctionData(auctionId: string): Promise<Auction>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { type AddDomainInput, type AddDomainResponse, type AddEnvironmentVariableInput, type AddEnvironmentVariablesResponse, type AddProjectInput, type AddProjectMemberInput, type AddProjectMemberResponse, type AddProjectResponse, type AuthenticateGitHubResponse, type DeleteDeploymentResponse, type DeleteDomainResponse, type DeleteProjectResponse, type Deployment, DeploymentStatus, type Domain, DomainStatus, Environment, type EnvironmentVariable, type FilterDomainInput, GQLClient, type GetDeploymentsResponse, type GetDomainsResponse, type GetEnvironmentVariablesResponse, type GetOrganizationsResponse, type GetProjectMembersResponse, type GetProjectResponse, type GetProjectsInOrganizationResponse, type GetUserResponse, type GraphQLConfig, type Organization, type OrganizationMember, type OrganizationProject, Permission, type Project, type ProjectMember, type RedeployToProdResponse, type RemoveEnvironmentVariableResponse, type RemoveProjectMemberResponse, Role, type RollbackDeploymentResponse, type SearchProjectsResponse, type UnauthenticateGitHubResponse, type UpdateDeploymentToProdResponse, type UpdateDomainInput, type UpdateDomainResponse, type UpdateEnvironmentVariableInput, type UpdateEnvironmentVariableResponse, type UpdateProjectInput, type UpdateProjectMemberInput, type UpdateProjectMemberResponse, type UpdateProjectResponse, type User };
|
export { type AddDomainInput, type AddDomainResponse, type AddEnvironmentVariableInput, type AddEnvironmentVariablesResponse, type AddProjectFromTemplateInput, type AddProjectFromTemplateResponse, type AddProjectInput, type AddProjectMemberInput, type AddProjectMemberResponse, type AddProjectResponse, type Auction, type AuctionData, AuctionStatus, type AuthenticateGitHubResponse, type Bid, type DeleteDeploymentResponse, type DeleteDomainResponse, type DeleteProjectResponse, type Deployment, DeploymentStatus, type Domain, DomainStatus, Environment, type EnvironmentVariable, type FilterDomainInput, GQLClient, type GetDeploymentsResponse, type GetDomainsResponse, type GetEnvironmentVariablesResponse, type GetOrganizationsResponse, type GetProjectMembersResponse, type GetProjectResponse, type GetProjectsInOrganizationResponse, type GetUserResponse, type GraphQLConfig, type Organization, type OrganizationMember, type OrganizationProject, Permission, type Project, type ProjectMember, type RedeployToProdResponse, type RemoveEnvironmentVariableResponse, type RemoveProjectMemberResponse, Role, type RollbackDeploymentResponse, type SearchProjectsResponse, type UnauthenticateGitHubResponse, type UpdateDeploymentToProdResponse, type UpdateDomainInput, type UpdateDomainResponse, type UpdateEnvironmentVariableInput, type UpdateEnvironmentVariableResponse, type UpdateProjectInput, type UpdateProjectMemberInput, type UpdateProjectMemberResponse, type UpdateProjectResponse, type User };
|
||||||
|
|||||||
Vendored
+59
-3
@@ -18,6 +18,42 @@ declare enum DeploymentStatus {
|
|||||||
Error = "Error",
|
Error = "Error",
|
||||||
Deleting = "Deleting"
|
Deleting = "Deleting"
|
||||||
}
|
}
|
||||||
|
declare enum AuctionStatus {
|
||||||
|
AuctionStatusCommitPhase = "commit",
|
||||||
|
AuctionStatusRevealPhase = "reveal",
|
||||||
|
AuctionStatusExpired = "expired",
|
||||||
|
AuctionStatusCompleted = "completed"
|
||||||
|
}
|
||||||
|
type Bid = {
|
||||||
|
auctionId: string;
|
||||||
|
bidderAddress: string;
|
||||||
|
status: string;
|
||||||
|
commitHash: string;
|
||||||
|
commitTime?: Date;
|
||||||
|
commitFee?: string;
|
||||||
|
revealTime?: Date;
|
||||||
|
revealFee?: string;
|
||||||
|
bidAmount?: string;
|
||||||
|
};
|
||||||
|
type Auction = {
|
||||||
|
id: string;
|
||||||
|
kind: string;
|
||||||
|
status: string;
|
||||||
|
ownerAddress: string;
|
||||||
|
createTime?: Date;
|
||||||
|
commitsEndTime?: Date;
|
||||||
|
revealsEndTime?: Date;
|
||||||
|
commitFee?: string;
|
||||||
|
revealFee?: string;
|
||||||
|
minimumBid?: string;
|
||||||
|
winnerAddresses: string[];
|
||||||
|
winnerBids?: string[];
|
||||||
|
winnerPrice?: string;
|
||||||
|
maxPrice?: string;
|
||||||
|
numProviders: number;
|
||||||
|
fundsReleased: boolean;
|
||||||
|
bids: Bid[];
|
||||||
|
};
|
||||||
declare enum DomainStatus {
|
declare enum DomainStatus {
|
||||||
Live = "Live",
|
Live = "Live",
|
||||||
Pending = "Pending"
|
Pending = "Pending"
|
||||||
@@ -55,8 +91,10 @@ type Deployment = {
|
|||||||
commitHash: string;
|
commitHash: string;
|
||||||
commitMessage: string;
|
commitMessage: string;
|
||||||
url?: string;
|
url?: string;
|
||||||
|
deployerLrn: string;
|
||||||
environment: Environment;
|
environment: Environment;
|
||||||
isCurrent: boolean;
|
isCurrent: boolean;
|
||||||
|
baseDomain?: string;
|
||||||
status: DeploymentStatus;
|
status: DeploymentStatus;
|
||||||
createdBy: User;
|
createdBy: User;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
@@ -112,6 +150,8 @@ type Project = {
|
|||||||
description: string;
|
description: string;
|
||||||
template: string;
|
template: string;
|
||||||
framework: string;
|
framework: string;
|
||||||
|
deployerLrns: string[];
|
||||||
|
auctionId: string;
|
||||||
webhooks: string[];
|
webhooks: string[];
|
||||||
members: ProjectMember[];
|
members: ProjectMember[];
|
||||||
environmentVariables: EnvironmentVariable[];
|
environmentVariables: EnvironmentVariable[];
|
||||||
@@ -119,7 +159,7 @@ type Project = {
|
|||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
organization: Organization;
|
organization: Organization;
|
||||||
icon: string;
|
icon: string;
|
||||||
subDomain: string;
|
baseDomains?: string[] | null;
|
||||||
};
|
};
|
||||||
type GetProjectMembersResponse = {
|
type GetProjectMembersResponse = {
|
||||||
projectMembers: ProjectMember[];
|
projectMembers: ProjectMember[];
|
||||||
@@ -185,6 +225,9 @@ type RemoveEnvironmentVariableResponse = {
|
|||||||
type UpdateDeploymentToProdResponse = {
|
type UpdateDeploymentToProdResponse = {
|
||||||
updateDeploymentToProd: boolean;
|
updateDeploymentToProd: boolean;
|
||||||
};
|
};
|
||||||
|
type AddProjectFromTemplateResponse = {
|
||||||
|
addProjectFromTemplate: Project;
|
||||||
|
};
|
||||||
type AddProjectResponse = {
|
type AddProjectResponse = {
|
||||||
addProject: Project;
|
addProject: Project;
|
||||||
};
|
};
|
||||||
@@ -200,6 +243,13 @@ type DeleteProjectResponse = {
|
|||||||
type DeleteDomainResponse = {
|
type DeleteDomainResponse = {
|
||||||
deleteDomain: boolean;
|
deleteDomain: boolean;
|
||||||
};
|
};
|
||||||
|
type AddProjectFromTemplateInput = {
|
||||||
|
templateOwner: string;
|
||||||
|
templateRepo: string;
|
||||||
|
owner: string;
|
||||||
|
name: string;
|
||||||
|
isPrivate: boolean;
|
||||||
|
};
|
||||||
type AddProjectInput = {
|
type AddProjectInput = {
|
||||||
name: string;
|
name: string;
|
||||||
repository: string;
|
repository: string;
|
||||||
@@ -245,6 +295,10 @@ type AuthenticateGitHubResponse = {
|
|||||||
type UnauthenticateGitHubResponse = {
|
type UnauthenticateGitHubResponse = {
|
||||||
unauthenticateGitHub: boolean;
|
unauthenticateGitHub: boolean;
|
||||||
};
|
};
|
||||||
|
type AuctionData = {
|
||||||
|
maxPrice: string;
|
||||||
|
numProviders: number;
|
||||||
|
};
|
||||||
|
|
||||||
interface GraphQLConfig {
|
interface GraphQLConfig {
|
||||||
gqlEndpoint: string;
|
gqlEndpoint: string;
|
||||||
@@ -267,7 +321,8 @@ declare class GQLClient {
|
|||||||
updateEnvironmentVariable(environmentVariableId: string, data: UpdateEnvironmentVariableInput): Promise<UpdateEnvironmentVariableResponse>;
|
updateEnvironmentVariable(environmentVariableId: string, data: UpdateEnvironmentVariableInput): Promise<UpdateEnvironmentVariableResponse>;
|
||||||
removeEnvironmentVariable(environmentVariableId: string): Promise<RemoveEnvironmentVariableResponse>;
|
removeEnvironmentVariable(environmentVariableId: string): Promise<RemoveEnvironmentVariableResponse>;
|
||||||
updateDeploymentToProd(deploymentId: string): Promise<UpdateDeploymentToProdResponse>;
|
updateDeploymentToProd(deploymentId: string): Promise<UpdateDeploymentToProdResponse>;
|
||||||
addProject(organizationSlug: string, data: AddProjectInput): Promise<AddProjectResponse>;
|
addProjectFromTemplate(organizationSlug: string, data: AddProjectFromTemplateInput, lrn?: string, auctionData?: AuctionData): Promise<AddProjectFromTemplateResponse>;
|
||||||
|
addProject(organizationSlug: string, data: AddProjectInput, lrn?: string, auctionData?: AuctionData): Promise<AddProjectResponse>;
|
||||||
updateProject(projectId: string, data: UpdateProjectInput): Promise<UpdateProjectResponse>;
|
updateProject(projectId: string, data: UpdateProjectInput): Promise<UpdateProjectResponse>;
|
||||||
updateDomain(domainId: string, data: UpdateDomainInput): Promise<UpdateDomainResponse>;
|
updateDomain(domainId: string, data: UpdateDomainInput): Promise<UpdateDomainResponse>;
|
||||||
redeployToProd(deploymentId: string): Promise<RedeployToProdResponse>;
|
redeployToProd(deploymentId: string): Promise<RedeployToProdResponse>;
|
||||||
@@ -279,6 +334,7 @@ declare class GQLClient {
|
|||||||
getDomains(projectId: string, filter?: FilterDomainInput): Promise<GetDomainsResponse>;
|
getDomains(projectId: string, filter?: FilterDomainInput): Promise<GetDomainsResponse>;
|
||||||
authenticateGitHub(code: string): Promise<AuthenticateGitHubResponse>;
|
authenticateGitHub(code: string): Promise<AuthenticateGitHubResponse>;
|
||||||
unauthenticateGithub(): Promise<UnauthenticateGitHubResponse>;
|
unauthenticateGithub(): Promise<UnauthenticateGitHubResponse>;
|
||||||
|
getAuctionData(auctionId: string): Promise<Auction>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { type AddDomainInput, type AddDomainResponse, type AddEnvironmentVariableInput, type AddEnvironmentVariablesResponse, type AddProjectInput, type AddProjectMemberInput, type AddProjectMemberResponse, type AddProjectResponse, type AuthenticateGitHubResponse, type DeleteDeploymentResponse, type DeleteDomainResponse, type DeleteProjectResponse, type Deployment, DeploymentStatus, type Domain, DomainStatus, Environment, type EnvironmentVariable, type FilterDomainInput, GQLClient, type GetDeploymentsResponse, type GetDomainsResponse, type GetEnvironmentVariablesResponse, type GetOrganizationsResponse, type GetProjectMembersResponse, type GetProjectResponse, type GetProjectsInOrganizationResponse, type GetUserResponse, type GraphQLConfig, type Organization, type OrganizationMember, type OrganizationProject, Permission, type Project, type ProjectMember, type RedeployToProdResponse, type RemoveEnvironmentVariableResponse, type RemoveProjectMemberResponse, Role, type RollbackDeploymentResponse, type SearchProjectsResponse, type UnauthenticateGitHubResponse, type UpdateDeploymentToProdResponse, type UpdateDomainInput, type UpdateDomainResponse, type UpdateEnvironmentVariableInput, type UpdateEnvironmentVariableResponse, type UpdateProjectInput, type UpdateProjectMemberInput, type UpdateProjectMemberResponse, type UpdateProjectResponse, type User };
|
export { type AddDomainInput, type AddDomainResponse, type AddEnvironmentVariableInput, type AddEnvironmentVariablesResponse, type AddProjectFromTemplateInput, type AddProjectFromTemplateResponse, type AddProjectInput, type AddProjectMemberInput, type AddProjectMemberResponse, type AddProjectResponse, type Auction, type AuctionData, AuctionStatus, type AuthenticateGitHubResponse, type Bid, type DeleteDeploymentResponse, type DeleteDomainResponse, type DeleteProjectResponse, type Deployment, DeploymentStatus, type Domain, DomainStatus, Environment, type EnvironmentVariable, type FilterDomainInput, GQLClient, type GetDeploymentsResponse, type GetDomainsResponse, type GetEnvironmentVariablesResponse, type GetOrganizationsResponse, type GetProjectMembersResponse, type GetProjectResponse, type GetProjectsInOrganizationResponse, type GetUserResponse, type GraphQLConfig, type Organization, type OrganizationMember, type OrganizationProject, Permission, type Project, type ProjectMember, type RedeployToProdResponse, type RemoveEnvironmentVariableResponse, type RemoveProjectMemberResponse, Role, type RollbackDeploymentResponse, type SearchProjectsResponse, type UnauthenticateGitHubResponse, type UpdateDeploymentToProdResponse, type UpdateDomainInput, type UpdateDomainResponse, type UpdateEnvironmentVariableInput, type UpdateEnvironmentVariableResponse, type UpdateProjectInput, type UpdateProjectMemberInput, type UpdateProjectMemberResponse, type UpdateProjectResponse, type User };
|
||||||
|
|||||||
Vendored
+139
-15
@@ -40,6 +40,7 @@ var __async = (__this, __arguments, generator) => {
|
|||||||
// src/index.ts
|
// src/index.ts
|
||||||
var src_exports = {};
|
var src_exports = {};
|
||||||
__export(src_exports, {
|
__export(src_exports, {
|
||||||
|
AuctionStatus: () => AuctionStatus,
|
||||||
DeploymentStatus: () => DeploymentStatus,
|
DeploymentStatus: () => DeploymentStatus,
|
||||||
DomainStatus: () => DomainStatus,
|
DomainStatus: () => DomainStatus,
|
||||||
Environment: () => Environment,
|
Environment: () => Environment,
|
||||||
@@ -76,11 +77,13 @@ query ($projectId: String!) {
|
|||||||
template
|
template
|
||||||
updatedAt
|
updatedAt
|
||||||
prodBranch
|
prodBranch
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
framework
|
framework
|
||||||
repository
|
repository
|
||||||
webhooks
|
webhooks
|
||||||
icon
|
icon
|
||||||
subDomain
|
baseDomains
|
||||||
organization {
|
organization {
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
@@ -94,6 +97,7 @@ query ($projectId: String!) {
|
|||||||
id
|
id
|
||||||
branch
|
branch
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
updatedAt
|
updatedAt
|
||||||
commitHash
|
commitHash
|
||||||
@@ -123,16 +127,19 @@ query ($organizationSlug: String!) {
|
|||||||
createdAt
|
createdAt
|
||||||
description
|
description
|
||||||
framework
|
framework
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
prodBranch
|
prodBranch
|
||||||
webhooks
|
webhooks
|
||||||
repository
|
repository
|
||||||
updatedAt
|
updatedAt
|
||||||
icon
|
icon
|
||||||
subDomain
|
baseDomains
|
||||||
deployments {
|
deployments {
|
||||||
id
|
id
|
||||||
branch
|
branch
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
updatedAt
|
updatedAt
|
||||||
commitHash
|
commitHash
|
||||||
@@ -178,8 +185,10 @@ query ($projectId: String!) {
|
|||||||
commitHash
|
commitHash
|
||||||
commitMessage
|
commitMessage
|
||||||
url
|
url
|
||||||
|
deployerLrn
|
||||||
environment
|
environment
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
@@ -230,6 +239,8 @@ query ($searchText: String!) {
|
|||||||
createdAt
|
createdAt
|
||||||
description
|
description
|
||||||
framework
|
framework
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
prodBranch
|
prodBranch
|
||||||
webhooks
|
webhooks
|
||||||
updatedAt
|
updatedAt
|
||||||
@@ -263,6 +274,65 @@ query ($projectId: String!, $filter: FilterDomainsInput) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
var getAuctionData = import_client.gql`
|
||||||
|
query ($auctionId: String!) {
|
||||||
|
getAuctionData(auctionId: $auctionId){
|
||||||
|
id
|
||||||
|
kind
|
||||||
|
status
|
||||||
|
ownerAddress
|
||||||
|
createTime
|
||||||
|
commitsEndTime
|
||||||
|
revealsEndTime
|
||||||
|
commitFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
revealFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
minimumBid {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
winnerAddresses
|
||||||
|
winnerBids {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
winnerPrice {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
maxPrice {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
numProviders
|
||||||
|
fundsReleased
|
||||||
|
bids {
|
||||||
|
bidderAddress
|
||||||
|
status
|
||||||
|
commitHash
|
||||||
|
commitTime
|
||||||
|
revealTime
|
||||||
|
commitFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
revealFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
bidAmount {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
// src/mutations.ts
|
// src/mutations.ts
|
||||||
var import_client2 = require("@apollo/client");
|
var import_client2 = require("@apollo/client");
|
||||||
@@ -287,8 +357,14 @@ mutation ($projectId: String!, $data: [AddEnvironmentVariableInput!]) {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
var updateEnvironmentVariable = import_client2.gql`
|
var updateEnvironmentVariable = import_client2.gql`
|
||||||
mutation ($environmentVariableId: String!, $data: UpdateEnvironmentVariableInput!) {
|
mutation (
|
||||||
updateEnvironmentVariable(environmentVariableId: $environmentVariableId, data: $data)
|
$environmentVariableId: String!
|
||||||
|
$data: UpdateEnvironmentVariableInput!
|
||||||
|
) {
|
||||||
|
updateEnvironmentVariable(
|
||||||
|
environmentVariableId: $environmentVariableId
|
||||||
|
data: $data
|
||||||
|
)
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
var removeEnvironmentVariable = import_client2.gql`
|
var removeEnvironmentVariable = import_client2.gql`
|
||||||
@@ -301,20 +377,30 @@ mutation ($deploymentId: String!) {
|
|||||||
updateDeploymentToProd(deploymentId: $deploymentId)
|
updateDeploymentToProd(deploymentId: $deploymentId)
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
var addProject = import_client2.gql`
|
var addProjectFromTemplate = import_client2.gql`
|
||||||
mutation ($organizationSlug: String!, $data: AddProjectInput) {
|
mutation ($organizationSlug: String!, $data: AddProjectFromTemplateInput, $lrn: String, $auctionData: AuctionData) {
|
||||||
addProject(organizationSlug: $organizationSlug, data: $data) {
|
addProjectFromTemplate(organizationSlug: $organizationSlug, data: $data, lrn: $lrn, auctionData: $auctionData) {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
var addProject = import_client2.gql`
|
||||||
|
mutation ($organizationSlug: String!, $data: AddProjectInput!, $lrn: String, $auctionData: AuctionData) {
|
||||||
|
addProject(organizationSlug: $organizationSlug, data: $data, lrn: $lrn, auctionData: $auctionData) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
var updateProjectMutation = import_client2.gql`
|
var updateProjectMutation = import_client2.gql`
|
||||||
mutation ($projectId: String!, $data: UpdateProjectInput) {
|
mutation ($projectId: String!, $data: UpdateProjectInput) {
|
||||||
updateProject(projectId: $projectId, data: $data)
|
updateProject(projectId: $projectId, data: $data)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var updateDomainMutation = import_client2.gql`
|
var updateDomainMutation = import_client2.gql`
|
||||||
mutation ($domainId: String!, $data: UpdateDomainInput!) {
|
mutation ($domainId: String!, $data: UpdateDomainInput!) {
|
||||||
updateDomain(domainId: $domainId, data: $data)
|
updateDomain(domainId: $domainId, data: $data)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var redeployToProd = import_client2.gql`
|
var redeployToProd = import_client2.gql`
|
||||||
mutation ($deploymentId: String!) {
|
mutation ($deploymentId: String!) {
|
||||||
redeployToProd(deploymentId: $deploymentId)
|
redeployToProd(deploymentId: $deploymentId)
|
||||||
@@ -328,7 +414,8 @@ mutation ($projectId: String!) {
|
|||||||
var deleteDomain = import_client2.gql`
|
var deleteDomain = import_client2.gql`
|
||||||
mutation ($domainId: String!) {
|
mutation ($domainId: String!) {
|
||||||
deleteDomain(domainId: $domainId)
|
deleteDomain(domainId: $domainId)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var rollbackDeployment = import_client2.gql`
|
var rollbackDeployment = import_client2.gql`
|
||||||
mutation ($projectId: String!, $deploymentId: String!) {
|
mutation ($projectId: String!, $deploymentId: String!) {
|
||||||
rollbackDeployment(projectId: $projectId, deploymentId: $deploymentId)
|
rollbackDeployment(projectId: $projectId, deploymentId: $deploymentId)
|
||||||
@@ -349,11 +436,13 @@ mutation ($code: String!) {
|
|||||||
authenticateGitHub(code: $code) {
|
authenticateGitHub(code: $code) {
|
||||||
token
|
token
|
||||||
}
|
}
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var unauthenticateGitHub = import_client2.gql`
|
var unauthenticateGitHub = import_client2.gql`
|
||||||
mutation {
|
mutation {
|
||||||
unauthenticateGitHub
|
unauthenticateGitHub
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
// src/client.ts
|
// src/client.ts
|
||||||
var defaultOptions = {
|
var defaultOptions = {
|
||||||
@@ -538,13 +627,29 @@ var GQLClient = class {
|
|||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
addProject(organizationSlug, data) {
|
addProjectFromTemplate(organizationSlug, data, lrn, auctionData) {
|
||||||
|
return __async(this, null, function* () {
|
||||||
|
const result = yield this.client.mutate({
|
||||||
|
mutation: addProjectFromTemplate,
|
||||||
|
variables: {
|
||||||
|
organizationSlug,
|
||||||
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
addProject(organizationSlug, data, lrn, auctionData) {
|
||||||
return __async(this, null, function* () {
|
return __async(this, null, function* () {
|
||||||
const result = yield this.client.mutate({
|
const result = yield this.client.mutate({
|
||||||
mutation: addProject,
|
mutation: addProject,
|
||||||
variables: {
|
variables: {
|
||||||
organizationSlug,
|
organizationSlug,
|
||||||
data
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return result.data;
|
return result.data;
|
||||||
@@ -673,6 +778,17 @@ var GQLClient = class {
|
|||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
getAuctionData(auctionId) {
|
||||||
|
return __async(this, null, function* () {
|
||||||
|
const { data } = yield this.client.query({
|
||||||
|
query: getAuctionData,
|
||||||
|
variables: {
|
||||||
|
auctionId
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return data.getAuctionData;
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/types.ts
|
// src/types.ts
|
||||||
@@ -700,6 +816,13 @@ var DeploymentStatus = /* @__PURE__ */ ((DeploymentStatus2) => {
|
|||||||
DeploymentStatus2["Deleting"] = "Deleting";
|
DeploymentStatus2["Deleting"] = "Deleting";
|
||||||
return DeploymentStatus2;
|
return DeploymentStatus2;
|
||||||
})(DeploymentStatus || {});
|
})(DeploymentStatus || {});
|
||||||
|
var AuctionStatus = /* @__PURE__ */ ((AuctionStatus2) => {
|
||||||
|
AuctionStatus2["AuctionStatusCommitPhase"] = "commit";
|
||||||
|
AuctionStatus2["AuctionStatusRevealPhase"] = "reveal";
|
||||||
|
AuctionStatus2["AuctionStatusExpired"] = "expired";
|
||||||
|
AuctionStatus2["AuctionStatusCompleted"] = "completed";
|
||||||
|
return AuctionStatus2;
|
||||||
|
})(AuctionStatus || {});
|
||||||
var DomainStatus = /* @__PURE__ */ ((DomainStatus2) => {
|
var DomainStatus = /* @__PURE__ */ ((DomainStatus2) => {
|
||||||
DomainStatus2["Live"] = "Live";
|
DomainStatus2["Live"] = "Live";
|
||||||
DomainStatus2["Pending"] = "Pending";
|
DomainStatus2["Pending"] = "Pending";
|
||||||
@@ -707,6 +830,7 @@ var DomainStatus = /* @__PURE__ */ ((DomainStatus2) => {
|
|||||||
})(DomainStatus || {});
|
})(DomainStatus || {});
|
||||||
// Annotate the CommonJS export names for ESM import in node:
|
// Annotate the CommonJS export names for ESM import in node:
|
||||||
0 && (module.exports = {
|
0 && (module.exports = {
|
||||||
|
AuctionStatus,
|
||||||
DeploymentStatus,
|
DeploymentStatus,
|
||||||
DomainStatus,
|
DomainStatus,
|
||||||
Environment,
|
Environment,
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+138
-15
@@ -49,11 +49,13 @@ query ($projectId: String!) {
|
|||||||
template
|
template
|
||||||
updatedAt
|
updatedAt
|
||||||
prodBranch
|
prodBranch
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
framework
|
framework
|
||||||
repository
|
repository
|
||||||
webhooks
|
webhooks
|
||||||
icon
|
icon
|
||||||
subDomain
|
baseDomains
|
||||||
organization {
|
organization {
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
@@ -67,6 +69,7 @@ query ($projectId: String!) {
|
|||||||
id
|
id
|
||||||
branch
|
branch
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
updatedAt
|
updatedAt
|
||||||
commitHash
|
commitHash
|
||||||
@@ -96,16 +99,19 @@ query ($organizationSlug: String!) {
|
|||||||
createdAt
|
createdAt
|
||||||
description
|
description
|
||||||
framework
|
framework
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
prodBranch
|
prodBranch
|
||||||
webhooks
|
webhooks
|
||||||
repository
|
repository
|
||||||
updatedAt
|
updatedAt
|
||||||
icon
|
icon
|
||||||
subDomain
|
baseDomains
|
||||||
deployments {
|
deployments {
|
||||||
id
|
id
|
||||||
branch
|
branch
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
updatedAt
|
updatedAt
|
||||||
commitHash
|
commitHash
|
||||||
@@ -151,8 +157,10 @@ query ($projectId: String!) {
|
|||||||
commitHash
|
commitHash
|
||||||
commitMessage
|
commitMessage
|
||||||
url
|
url
|
||||||
|
deployerLrn
|
||||||
environment
|
environment
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
@@ -203,6 +211,8 @@ query ($searchText: String!) {
|
|||||||
createdAt
|
createdAt
|
||||||
description
|
description
|
||||||
framework
|
framework
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
prodBranch
|
prodBranch
|
||||||
webhooks
|
webhooks
|
||||||
updatedAt
|
updatedAt
|
||||||
@@ -236,6 +246,65 @@ query ($projectId: String!, $filter: FilterDomainsInput) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
var getAuctionData = gql`
|
||||||
|
query ($auctionId: String!) {
|
||||||
|
getAuctionData(auctionId: $auctionId){
|
||||||
|
id
|
||||||
|
kind
|
||||||
|
status
|
||||||
|
ownerAddress
|
||||||
|
createTime
|
||||||
|
commitsEndTime
|
||||||
|
revealsEndTime
|
||||||
|
commitFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
revealFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
minimumBid {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
winnerAddresses
|
||||||
|
winnerBids {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
winnerPrice {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
maxPrice {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
numProviders
|
||||||
|
fundsReleased
|
||||||
|
bids {
|
||||||
|
bidderAddress
|
||||||
|
status
|
||||||
|
commitHash
|
||||||
|
commitTime
|
||||||
|
revealTime
|
||||||
|
commitFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
revealFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
bidAmount {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
// src/mutations.ts
|
// src/mutations.ts
|
||||||
import { gql as gql2 } from "@apollo/client";
|
import { gql as gql2 } from "@apollo/client";
|
||||||
@@ -260,8 +329,14 @@ mutation ($projectId: String!, $data: [AddEnvironmentVariableInput!]) {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
var updateEnvironmentVariable = gql2`
|
var updateEnvironmentVariable = gql2`
|
||||||
mutation ($environmentVariableId: String!, $data: UpdateEnvironmentVariableInput!) {
|
mutation (
|
||||||
updateEnvironmentVariable(environmentVariableId: $environmentVariableId, data: $data)
|
$environmentVariableId: String!
|
||||||
|
$data: UpdateEnvironmentVariableInput!
|
||||||
|
) {
|
||||||
|
updateEnvironmentVariable(
|
||||||
|
environmentVariableId: $environmentVariableId
|
||||||
|
data: $data
|
||||||
|
)
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
var removeEnvironmentVariable = gql2`
|
var removeEnvironmentVariable = gql2`
|
||||||
@@ -274,20 +349,30 @@ mutation ($deploymentId: String!) {
|
|||||||
updateDeploymentToProd(deploymentId: $deploymentId)
|
updateDeploymentToProd(deploymentId: $deploymentId)
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
var addProject = gql2`
|
var addProjectFromTemplate = gql2`
|
||||||
mutation ($organizationSlug: String!, $data: AddProjectInput) {
|
mutation ($organizationSlug: String!, $data: AddProjectFromTemplateInput, $lrn: String, $auctionData: AuctionData) {
|
||||||
addProject(organizationSlug: $organizationSlug, data: $data) {
|
addProjectFromTemplate(organizationSlug: $organizationSlug, data: $data, lrn: $lrn, auctionData: $auctionData) {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
var addProject = gql2`
|
||||||
|
mutation ($organizationSlug: String!, $data: AddProjectInput!, $lrn: String, $auctionData: AuctionData) {
|
||||||
|
addProject(organizationSlug: $organizationSlug, data: $data, lrn: $lrn, auctionData: $auctionData) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
var updateProjectMutation = gql2`
|
var updateProjectMutation = gql2`
|
||||||
mutation ($projectId: String!, $data: UpdateProjectInput) {
|
mutation ($projectId: String!, $data: UpdateProjectInput) {
|
||||||
updateProject(projectId: $projectId, data: $data)
|
updateProject(projectId: $projectId, data: $data)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var updateDomainMutation = gql2`
|
var updateDomainMutation = gql2`
|
||||||
mutation ($domainId: String!, $data: UpdateDomainInput!) {
|
mutation ($domainId: String!, $data: UpdateDomainInput!) {
|
||||||
updateDomain(domainId: $domainId, data: $data)
|
updateDomain(domainId: $domainId, data: $data)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var redeployToProd = gql2`
|
var redeployToProd = gql2`
|
||||||
mutation ($deploymentId: String!) {
|
mutation ($deploymentId: String!) {
|
||||||
redeployToProd(deploymentId: $deploymentId)
|
redeployToProd(deploymentId: $deploymentId)
|
||||||
@@ -301,7 +386,8 @@ mutation ($projectId: String!) {
|
|||||||
var deleteDomain = gql2`
|
var deleteDomain = gql2`
|
||||||
mutation ($domainId: String!) {
|
mutation ($domainId: String!) {
|
||||||
deleteDomain(domainId: $domainId)
|
deleteDomain(domainId: $domainId)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var rollbackDeployment = gql2`
|
var rollbackDeployment = gql2`
|
||||||
mutation ($projectId: String!, $deploymentId: String!) {
|
mutation ($projectId: String!, $deploymentId: String!) {
|
||||||
rollbackDeployment(projectId: $projectId, deploymentId: $deploymentId)
|
rollbackDeployment(projectId: $projectId, deploymentId: $deploymentId)
|
||||||
@@ -322,11 +408,13 @@ mutation ($code: String!) {
|
|||||||
authenticateGitHub(code: $code) {
|
authenticateGitHub(code: $code) {
|
||||||
token
|
token
|
||||||
}
|
}
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
var unauthenticateGitHub = gql2`
|
var unauthenticateGitHub = gql2`
|
||||||
mutation {
|
mutation {
|
||||||
unauthenticateGitHub
|
unauthenticateGitHub
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
// src/client.ts
|
// src/client.ts
|
||||||
var defaultOptions = {
|
var defaultOptions = {
|
||||||
@@ -511,13 +599,29 @@ var GQLClient = class {
|
|||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
addProject(organizationSlug, data) {
|
addProjectFromTemplate(organizationSlug, data, lrn, auctionData) {
|
||||||
|
return __async(this, null, function* () {
|
||||||
|
const result = yield this.client.mutate({
|
||||||
|
mutation: addProjectFromTemplate,
|
||||||
|
variables: {
|
||||||
|
organizationSlug,
|
||||||
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
addProject(organizationSlug, data, lrn, auctionData) {
|
||||||
return __async(this, null, function* () {
|
return __async(this, null, function* () {
|
||||||
const result = yield this.client.mutate({
|
const result = yield this.client.mutate({
|
||||||
mutation: addProject,
|
mutation: addProject,
|
||||||
variables: {
|
variables: {
|
||||||
organizationSlug,
|
organizationSlug,
|
||||||
data
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return result.data;
|
return result.data;
|
||||||
@@ -646,6 +750,17 @@ var GQLClient = class {
|
|||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
getAuctionData(auctionId) {
|
||||||
|
return __async(this, null, function* () {
|
||||||
|
const { data } = yield this.client.query({
|
||||||
|
query: getAuctionData,
|
||||||
|
variables: {
|
||||||
|
auctionId
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return data.getAuctionData;
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/types.ts
|
// src/types.ts
|
||||||
@@ -673,12 +788,20 @@ var DeploymentStatus = /* @__PURE__ */ ((DeploymentStatus2) => {
|
|||||||
DeploymentStatus2["Deleting"] = "Deleting";
|
DeploymentStatus2["Deleting"] = "Deleting";
|
||||||
return DeploymentStatus2;
|
return DeploymentStatus2;
|
||||||
})(DeploymentStatus || {});
|
})(DeploymentStatus || {});
|
||||||
|
var AuctionStatus = /* @__PURE__ */ ((AuctionStatus2) => {
|
||||||
|
AuctionStatus2["AuctionStatusCommitPhase"] = "commit";
|
||||||
|
AuctionStatus2["AuctionStatusRevealPhase"] = "reveal";
|
||||||
|
AuctionStatus2["AuctionStatusExpired"] = "expired";
|
||||||
|
AuctionStatus2["AuctionStatusCompleted"] = "completed";
|
||||||
|
return AuctionStatus2;
|
||||||
|
})(AuctionStatus || {});
|
||||||
var DomainStatus = /* @__PURE__ */ ((DomainStatus2) => {
|
var DomainStatus = /* @__PURE__ */ ((DomainStatus2) => {
|
||||||
DomainStatus2["Live"] = "Live";
|
DomainStatus2["Live"] = "Live";
|
||||||
DomainStatus2["Pending"] = "Pending";
|
DomainStatus2["Pending"] = "Pending";
|
||||||
return DomainStatus2;
|
return DomainStatus2;
|
||||||
})(DomainStatus || {});
|
})(DomainStatus || {});
|
||||||
export {
|
export {
|
||||||
|
AuctionStatus,
|
||||||
DeploymentStatus,
|
DeploymentStatus,
|
||||||
DomainStatus,
|
DomainStatus,
|
||||||
Environment,
|
Environment,
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -228,15 +228,38 @@ export class GQLClient {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async addProjectFromTemplate(
|
||||||
|
organizationSlug: string,
|
||||||
|
data: types.AddProjectFromTemplateInput,
|
||||||
|
lrn?: string,
|
||||||
|
auctionData?: types.AuctionData,
|
||||||
|
): Promise<types.AddProjectFromTemplateResponse> {
|
||||||
|
const result = await this.client.mutate({
|
||||||
|
mutation: mutations.addProjectFromTemplate,
|
||||||
|
variables: {
|
||||||
|
organizationSlug,
|
||||||
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return result.data;
|
||||||
|
}
|
||||||
|
|
||||||
async addProject(
|
async addProject(
|
||||||
organizationSlug: string,
|
organizationSlug: string,
|
||||||
data: types.AddProjectInput
|
data: types.AddProjectInput,
|
||||||
|
lrn?: string,
|
||||||
|
auctionData?: types.AuctionData,
|
||||||
): Promise<types.AddProjectResponse> {
|
): Promise<types.AddProjectResponse> {
|
||||||
const result = await this.client.mutate({
|
const result = await this.client.mutate({
|
||||||
mutation: mutations.addProject,
|
mutation: mutations.addProject,
|
||||||
variables: {
|
variables: {
|
||||||
organizationSlug,
|
organizationSlug,
|
||||||
data,
|
data,
|
||||||
|
lrn,
|
||||||
|
auctionData
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -386,4 +409,15 @@ export class GQLClient {
|
|||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getAuctionData(auctionId: string): Promise<types.Auction> {
|
||||||
|
const { data } = await this.client.query({
|
||||||
|
query: queries.getAuctionData,
|
||||||
|
variables: {
|
||||||
|
auctionId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return data.getAuctionData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from "@apollo/client";
|
||||||
|
|
||||||
export const removeProjectMember = gql`
|
export const removeProjectMember = gql`
|
||||||
mutation ($projectMemberId: String!) {
|
mutation ($projectMemberId: String!) {
|
||||||
@@ -25,8 +25,14 @@ mutation ($projectId: String!, $data: [AddEnvironmentVariableInput!]) {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
export const updateEnvironmentVariable = gql`
|
export const updateEnvironmentVariable = gql`
|
||||||
mutation ($environmentVariableId: String!, $data: UpdateEnvironmentVariableInput!) {
|
mutation (
|
||||||
updateEnvironmentVariable(environmentVariableId: $environmentVariableId, data: $data)
|
$environmentVariableId: String!
|
||||||
|
$data: UpdateEnvironmentVariableInput!
|
||||||
|
) {
|
||||||
|
updateEnvironmentVariable(
|
||||||
|
environmentVariableId: $environmentVariableId
|
||||||
|
data: $data
|
||||||
|
)
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@@ -42,22 +48,33 @@ mutation ($deploymentId: String!) {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const addProject = gql`
|
export const addProjectFromTemplate = gql`
|
||||||
mutation ($organizationSlug: String!, $data: AddProjectInput) {
|
mutation ($organizationSlug: String!, $data: AddProjectFromTemplateInput, $lrn: String, $auctionData: AuctionData) {
|
||||||
addProject(organizationSlug: $organizationSlug, data: $data) {
|
addProjectFromTemplate(organizationSlug: $organizationSlug, data: $data, lrn: $lrn, auctionData: $auctionData) {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const addProject = gql`
|
||||||
|
mutation ($organizationSlug: String!, $data: AddProjectInput!, $lrn: String, $auctionData: AuctionData) {
|
||||||
|
addProject(organizationSlug: $organizationSlug, data: $data, lrn: $lrn, auctionData: $auctionData) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const updateProjectMutation = gql`
|
export const updateProjectMutation = gql`
|
||||||
mutation ($projectId: String!, $data: UpdateProjectInput) {
|
mutation ($projectId: String!, $data: UpdateProjectInput) {
|
||||||
updateProject(projectId: $projectId, data: $data)
|
updateProject(projectId: $projectId, data: $data)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const updateDomainMutation = gql`
|
export const updateDomainMutation = gql`
|
||||||
mutation ($domainId: String!, $data: UpdateDomainInput!) {
|
mutation ($domainId: String!, $data: UpdateDomainInput!) {
|
||||||
updateDomain(domainId: $domainId, data: $data)
|
updateDomain(domainId: $domainId, data: $data)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const redeployToProd = gql`
|
export const redeployToProd = gql`
|
||||||
mutation ($deploymentId: String!) {
|
mutation ($deploymentId: String!) {
|
||||||
@@ -74,7 +91,8 @@ mutation ($projectId: String!) {
|
|||||||
export const deleteDomain = gql`
|
export const deleteDomain = gql`
|
||||||
mutation ($domainId: String!) {
|
mutation ($domainId: String!) {
|
||||||
deleteDomain(domainId: $domainId)
|
deleteDomain(domainId: $domainId)
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const rollbackDeployment = gql`
|
export const rollbackDeployment = gql`
|
||||||
mutation ($projectId: String!, $deploymentId: String!) {
|
mutation ($projectId: String!, $deploymentId: String!) {
|
||||||
@@ -99,9 +117,11 @@ mutation ($code: String!) {
|
|||||||
authenticateGitHub(code: $code) {
|
authenticateGitHub(code: $code) {
|
||||||
token
|
token
|
||||||
}
|
}
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const unauthenticateGitHub = gql`
|
export const unauthenticateGitHub = gql`
|
||||||
mutation {
|
mutation {
|
||||||
unauthenticateGitHub
|
unauthenticateGitHub
|
||||||
}`;
|
}
|
||||||
|
`;
|
||||||
|
|||||||
@@ -23,11 +23,13 @@ query ($projectId: String!) {
|
|||||||
template
|
template
|
||||||
updatedAt
|
updatedAt
|
||||||
prodBranch
|
prodBranch
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
framework
|
framework
|
||||||
repository
|
repository
|
||||||
webhooks
|
webhooks
|
||||||
icon
|
icon
|
||||||
subDomain
|
baseDomains
|
||||||
organization {
|
organization {
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
@@ -41,6 +43,7 @@ query ($projectId: String!) {
|
|||||||
id
|
id
|
||||||
branch
|
branch
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
updatedAt
|
updatedAt
|
||||||
commitHash
|
commitHash
|
||||||
@@ -71,16 +74,19 @@ query ($organizationSlug: String!) {
|
|||||||
createdAt
|
createdAt
|
||||||
description
|
description
|
||||||
framework
|
framework
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
prodBranch
|
prodBranch
|
||||||
webhooks
|
webhooks
|
||||||
repository
|
repository
|
||||||
updatedAt
|
updatedAt
|
||||||
icon
|
icon
|
||||||
subDomain
|
baseDomains
|
||||||
deployments {
|
deployments {
|
||||||
id
|
id
|
||||||
branch
|
branch
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
updatedAt
|
updatedAt
|
||||||
commitHash
|
commitHash
|
||||||
@@ -128,8 +134,10 @@ query ($projectId: String!) {
|
|||||||
commitHash
|
commitHash
|
||||||
commitMessage
|
commitMessage
|
||||||
url
|
url
|
||||||
|
deployerLrn
|
||||||
environment
|
environment
|
||||||
isCurrent
|
isCurrent
|
||||||
|
baseDomain
|
||||||
status
|
status
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
@@ -183,6 +191,8 @@ query ($searchText: String!) {
|
|||||||
createdAt
|
createdAt
|
||||||
description
|
description
|
||||||
framework
|
framework
|
||||||
|
auctionId
|
||||||
|
deployerLrns
|
||||||
prodBranch
|
prodBranch
|
||||||
webhooks
|
webhooks
|
||||||
updatedAt
|
updatedAt
|
||||||
@@ -217,3 +227,63 @@ query ($projectId: String!, $filter: FilterDomainsInput) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const getAuctionData = gql`
|
||||||
|
query ($auctionId: String!) {
|
||||||
|
getAuctionData(auctionId: $auctionId){
|
||||||
|
id
|
||||||
|
kind
|
||||||
|
status
|
||||||
|
ownerAddress
|
||||||
|
createTime
|
||||||
|
commitsEndTime
|
||||||
|
revealsEndTime
|
||||||
|
commitFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
revealFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
minimumBid {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
winnerAddresses
|
||||||
|
winnerBids {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
winnerPrice {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
maxPrice {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
numProviders
|
||||||
|
fundsReleased
|
||||||
|
bids {
|
||||||
|
bidderAddress
|
||||||
|
status
|
||||||
|
commitHash
|
||||||
|
commitTime
|
||||||
|
revealTime
|
||||||
|
commitFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
revealFee {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
bidAmount {
|
||||||
|
type
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|||||||
+228
-167
@@ -1,298 +1,359 @@
|
|||||||
|
import { addProjectFromTemplate } from "./mutations";
|
||||||
// Note: equivalent to types present in GQL schema
|
// Note: equivalent to types present in GQL schema
|
||||||
|
|
||||||
export enum Role {
|
export enum Role {
|
||||||
Owner = 'Owner',
|
Owner = "Owner",
|
||||||
Maintainer = 'Maintainer',
|
Maintainer = "Maintainer",
|
||||||
Reader = 'Reader',
|
Reader = "Reader",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum Permission {
|
export enum Permission {
|
||||||
View = 'View',
|
View = "View",
|
||||||
Edit = 'Edit',
|
Edit = "Edit",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum Environment {
|
export enum Environment {
|
||||||
Production = 'Production',
|
Production = "Production",
|
||||||
Preview = 'Preview',
|
Preview = "Preview",
|
||||||
Development = 'Development',
|
Development = "Development",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DeploymentStatus {
|
export enum DeploymentStatus {
|
||||||
Building = 'Building',
|
Building = "Building",
|
||||||
Ready = 'Ready',
|
Ready = "Ready",
|
||||||
Error = 'Error',
|
Error = "Error",
|
||||||
Deleting = 'Deleting'
|
Deleting = "Deleting",
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum AuctionStatus {
|
||||||
|
AuctionStatusCommitPhase = "commit",
|
||||||
|
AuctionStatusRevealPhase = "reveal",
|
||||||
|
AuctionStatusExpired = "expired",
|
||||||
|
AuctionStatusCompleted = "completed",
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Bid = {
|
||||||
|
auctionId: string;
|
||||||
|
bidderAddress: string;
|
||||||
|
status: string;
|
||||||
|
commitHash: string;
|
||||||
|
commitTime?: Date;
|
||||||
|
commitFee?: string;
|
||||||
|
revealTime?: Date;
|
||||||
|
revealFee?: string;
|
||||||
|
bidAmount?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Auction = {
|
||||||
|
id: string;
|
||||||
|
kind: string;
|
||||||
|
status: string;
|
||||||
|
ownerAddress: string;
|
||||||
|
createTime?: Date;
|
||||||
|
commitsEndTime?: Date;
|
||||||
|
revealsEndTime?: Date;
|
||||||
|
commitFee?: string;
|
||||||
|
revealFee?: string;
|
||||||
|
minimumBid?: string;
|
||||||
|
winnerAddresses: string[];
|
||||||
|
winnerBids?: string[];
|
||||||
|
winnerPrice?: string;
|
||||||
|
maxPrice?: string;
|
||||||
|
numProviders: number;
|
||||||
|
fundsReleased: boolean;
|
||||||
|
bids: Bid[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DomainStatus {
|
export enum DomainStatus {
|
||||||
Live = 'Live',
|
Live = "Live",
|
||||||
Pending = 'Pending',
|
Pending = "Pending",
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EnvironmentVariable = {
|
export type EnvironmentVariable = {
|
||||||
id: string
|
id: string;
|
||||||
environment: Environment
|
environment: Environment;
|
||||||
key: string
|
key: string;
|
||||||
value: string
|
value: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type Domain = {
|
export type Domain = {
|
||||||
id: string
|
id: string;
|
||||||
branch: string
|
branch: string;
|
||||||
name: string
|
name: string;
|
||||||
status: DomainStatus
|
status: DomainStatus;
|
||||||
redirectTo: Domain | null
|
redirectTo: Domain | null;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type User = {
|
export type User = {
|
||||||
id: string
|
id: string;
|
||||||
name: string | null
|
name: string | null;
|
||||||
email: string
|
email: string;
|
||||||
isVerified: boolean
|
isVerified: boolean;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
gitHubToken: string | null
|
gitHubToken: string | null;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type Deployment = {
|
export type Deployment = {
|
||||||
id: string
|
id: string;
|
||||||
domain: Domain
|
domain: Domain;
|
||||||
branch: string
|
branch: string;
|
||||||
commitHash: string
|
commitHash: string;
|
||||||
commitMessage: string
|
commitMessage: string;
|
||||||
url?: string
|
url?: string;
|
||||||
environment: Environment
|
deployerLrn: string;
|
||||||
isCurrent: boolean
|
environment: Environment;
|
||||||
status: DeploymentStatus
|
isCurrent: boolean;
|
||||||
createdBy: User
|
baseDomain?: string;
|
||||||
createdAt: string
|
status: DeploymentStatus;
|
||||||
updatedAt: string
|
createdBy: User;
|
||||||
}
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type OrganizationMember = {
|
export type OrganizationMember = {
|
||||||
id: string
|
id: string;
|
||||||
member: User
|
member: User;
|
||||||
role: Role
|
role: Role;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type ProjectMember = {
|
export type ProjectMember = {
|
||||||
id: string
|
id: string;
|
||||||
member: User
|
member: User;
|
||||||
permissions: Permission[]
|
permissions: Permission[];
|
||||||
isPending: boolean
|
isPending: boolean;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type OrganizationProject = {
|
export type OrganizationProject = {
|
||||||
id: string
|
id: string;
|
||||||
owner: User
|
owner: User;
|
||||||
deployments: Deployment[]
|
deployments: Deployment[];
|
||||||
name: string
|
name: string;
|
||||||
repository: string
|
repository: string;
|
||||||
prodBranch: string
|
prodBranch: string;
|
||||||
description: string
|
description: string;
|
||||||
template: string
|
template: string;
|
||||||
framework: string
|
framework: string;
|
||||||
webhooks: string[]
|
webhooks: string[];
|
||||||
members: ProjectMember[]
|
members: ProjectMember[];
|
||||||
environmentVariables: EnvironmentVariable[]
|
environmentVariables: EnvironmentVariable[];
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type Organization = {
|
export type Organization = {
|
||||||
id: string
|
id: string;
|
||||||
name: string
|
name: string;
|
||||||
slug: string
|
slug: string;
|
||||||
projects: OrganizationProject[]
|
projects: OrganizationProject[];
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
members: OrganizationMember[]
|
members: OrganizationMember[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type Project = {
|
export type Project = {
|
||||||
id: string
|
id: string;
|
||||||
owner: User
|
owner: User;
|
||||||
deployments: Deployment[]
|
deployments: Deployment[];
|
||||||
name: string
|
name: string;
|
||||||
repository: string
|
repository: string;
|
||||||
prodBranch: string
|
prodBranch: string;
|
||||||
description: string
|
description: string;
|
||||||
template: string
|
template: string;
|
||||||
framework: string
|
framework: string;
|
||||||
webhooks: string[]
|
deployerLrns: string[];
|
||||||
members: ProjectMember[]
|
auctionId: string;
|
||||||
environmentVariables: EnvironmentVariable[]
|
webhooks: string[];
|
||||||
createdAt: string
|
members: ProjectMember[];
|
||||||
updatedAt: string
|
environmentVariables: EnvironmentVariable[];
|
||||||
organization: Organization
|
createdAt: string;
|
||||||
icon: string
|
updatedAt: string;
|
||||||
subDomain: string
|
organization: Organization;
|
||||||
}
|
icon: string;
|
||||||
|
baseDomains?: string[] | null;
|
||||||
|
};
|
||||||
|
|
||||||
export type GetProjectMembersResponse = {
|
export type GetProjectMembersResponse = {
|
||||||
projectMembers: ProjectMember[]
|
projectMembers: ProjectMember[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AddProjectMemberResponse = {
|
export type AddProjectMemberResponse = {
|
||||||
addProjectMember: boolean
|
addProjectMember: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type RemoveProjectMemberResponse = {
|
export type RemoveProjectMemberResponse = {
|
||||||
removeProjectMember: boolean;
|
removeProjectMember: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateProjectMemberResponse = {
|
export type UpdateProjectMemberResponse = {
|
||||||
updateProjectMember: boolean;
|
updateProjectMember: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetDeploymentsResponse = {
|
export type GetDeploymentsResponse = {
|
||||||
deployments: Deployment[]
|
deployments: Deployment[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetEnvironmentVariablesResponse = {
|
export type GetEnvironmentVariablesResponse = {
|
||||||
environmentVariables: EnvironmentVariable[]
|
environmentVariables: EnvironmentVariable[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetOrganizationsResponse = {
|
export type GetOrganizationsResponse = {
|
||||||
organizations: Organization[]
|
organizations: Organization[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetUserResponse = {
|
export type GetUserResponse = {
|
||||||
user: User
|
user: User;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetProjectResponse = {
|
export type GetProjectResponse = {
|
||||||
project: Project | null
|
project: Project | null;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetProjectsInOrganizationResponse = {
|
export type GetProjectsInOrganizationResponse = {
|
||||||
projectsInOrganization: Project[]
|
projectsInOrganization: Project[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type GetDomainsResponse = {
|
export type GetDomainsResponse = {
|
||||||
domains: Domain[]
|
domains: Domain[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type SearchProjectsResponse = {
|
export type SearchProjectsResponse = {
|
||||||
searchProjects: Project[]
|
searchProjects: Project[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AddEnvironmentVariablesResponse = {
|
export type AddEnvironmentVariablesResponse = {
|
||||||
addEnvironmentVariables: boolean;
|
addEnvironmentVariables: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AddEnvironmentVariableInput = {
|
export type AddEnvironmentVariableInput = {
|
||||||
environments: string[];
|
environments: string[];
|
||||||
key: string;
|
key: string;
|
||||||
value: string;
|
value: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateEnvironmentVariableInput = {
|
export type UpdateEnvironmentVariableInput = {
|
||||||
key: string;
|
key: string;
|
||||||
value: string;
|
value: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateProjectMemberInput = {
|
export type UpdateProjectMemberInput = {
|
||||||
permissions: Permission[];
|
permissions: Permission[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AddProjectMemberInput = {
|
export type AddProjectMemberInput = {
|
||||||
email: string;
|
email: string;
|
||||||
permissions: Permission[]
|
permissions: Permission[];
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateEnvironmentVariableResponse = {
|
export type UpdateEnvironmentVariableResponse = {
|
||||||
updateEnvironmentVariable: boolean;
|
updateEnvironmentVariable: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type RemoveEnvironmentVariableResponse = {
|
export type RemoveEnvironmentVariableResponse = {
|
||||||
removeEnvironmentVariable: boolean;
|
removeEnvironmentVariable: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateDeploymentToProdResponse = {
|
export type UpdateDeploymentToProdResponse = {
|
||||||
updateDeploymentToProd: boolean;
|
updateDeploymentToProd: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export type AddProjectFromTemplateResponse = {
|
||||||
|
addProjectFromTemplate: Project;
|
||||||
|
};
|
||||||
|
|
||||||
export type AddProjectResponse = {
|
export type AddProjectResponse = {
|
||||||
addProject: Project
|
addProject: Project;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateProjectResponse = {
|
export type UpdateProjectResponse = {
|
||||||
updateProject: boolean;
|
updateProject: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateDomainResponse = {
|
export type UpdateDomainResponse = {
|
||||||
updateDomain: boolean;
|
updateDomain: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type DeleteProjectResponse = {
|
export type DeleteProjectResponse = {
|
||||||
deleteProject: boolean;
|
deleteProject: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type DeleteDomainResponse = {
|
export type DeleteDomainResponse = {
|
||||||
deleteDomain: boolean;
|
deleteDomain: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export type AddProjectFromTemplateInput = {
|
||||||
|
templateOwner: string;
|
||||||
|
templateRepo: string;
|
||||||
|
owner: string;
|
||||||
|
name: string;
|
||||||
|
isPrivate: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
export type AddProjectInput = {
|
export type AddProjectInput = {
|
||||||
name: string;
|
name: string;
|
||||||
repository: string;
|
repository: string;
|
||||||
prodBranch: string;
|
prodBranch: string;
|
||||||
template?: string;
|
template?: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateProjectInput = {
|
export type UpdateProjectInput = {
|
||||||
name?: string
|
name?: string;
|
||||||
description?: string
|
description?: string;
|
||||||
prodBranch?: string
|
prodBranch?: string;
|
||||||
webhooks?: string[]
|
webhooks?: string[];
|
||||||
organizationId?: string
|
organizationId?: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UpdateDomainInput = {
|
export type UpdateDomainInput = {
|
||||||
name?: string;
|
name?: string;
|
||||||
branch?: string;
|
branch?: string;
|
||||||
redirectToId?: string | null;
|
redirectToId?: string | null;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type RedeployToProdResponse = {
|
export type RedeployToProdResponse = {
|
||||||
redeployToProd: boolean
|
redeployToProd: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type RollbackDeploymentResponse = {
|
export type RollbackDeploymentResponse = {
|
||||||
rollbackDeployment: boolean
|
rollbackDeployment: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type DeleteDeploymentResponse = {
|
export type DeleteDeploymentResponse = {
|
||||||
deleteDeployment: boolean
|
deleteDeployment: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AddDomainInput = {
|
export type AddDomainInput = {
|
||||||
name: string
|
name: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type FilterDomainInput = {
|
export type FilterDomainInput = {
|
||||||
branch?: string
|
branch?: string;
|
||||||
status?: DomainStatus
|
status?: DomainStatus;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AddDomainResponse = {
|
export type AddDomainResponse = {
|
||||||
addDomain: true
|
addDomain: true;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type AuthenticateGitHubResponse = {
|
export type AuthenticateGitHubResponse = {
|
||||||
authenticateGitHub: {
|
authenticateGitHub: {
|
||||||
token: string
|
token: string;
|
||||||
}
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
export type UnauthenticateGitHubResponse = {
|
export type UnauthenticateGitHubResponse = {
|
||||||
unauthenticateGitHub: boolean
|
unauthenticateGitHub: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export type AuctionData = {
|
||||||
|
maxPrice: string;
|
||||||
|
numProviders: number;
|
||||||
|
};
|
||||||
|
|||||||
@@ -213,6 +213,14 @@
|
|||||||
"@babel/highlight" "^7.24.2"
|
"@babel/highlight" "^7.24.2"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
|
|
||||||
|
"@babel/code-frame@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7"
|
||||||
|
integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
|
||||||
|
dependencies:
|
||||||
|
"@babel/highlight" "^7.25.7"
|
||||||
|
picocolors "^1.0.0"
|
||||||
|
|
||||||
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4":
|
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4":
|
||||||
version "7.24.4"
|
version "7.24.4"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
|
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
|
||||||
@@ -280,6 +288,16 @@
|
|||||||
"@jridgewell/trace-mapping" "^0.3.25"
|
"@jridgewell/trace-mapping" "^0.3.25"
|
||||||
jsesc "^2.5.1"
|
jsesc "^2.5.1"
|
||||||
|
|
||||||
|
"@babel/generator@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56"
|
||||||
|
integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/types" "^7.25.7"
|
||||||
|
"@jridgewell/gen-mapping" "^0.3.5"
|
||||||
|
"@jridgewell/trace-mapping" "^0.3.25"
|
||||||
|
jsesc "^3.0.2"
|
||||||
|
|
||||||
"@babel/helper-annotate-as-pure@^7.22.5":
|
"@babel/helper-annotate-as-pure@^7.22.5":
|
||||||
version "7.22.5"
|
version "7.22.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
|
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
|
||||||
@@ -367,6 +385,14 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/types" "^7.24.5"
|
"@babel/types" "^7.24.5"
|
||||||
|
|
||||||
|
"@babel/helper-module-imports@^7.16.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472"
|
||||||
|
integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/traverse" "^7.25.7"
|
||||||
|
"@babel/types" "^7.25.7"
|
||||||
|
|
||||||
"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3":
|
"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3":
|
||||||
version "7.24.3"
|
version "7.24.3"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
|
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
|
||||||
@@ -471,6 +497,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
|
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
|
||||||
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
|
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
|
||||||
|
|
||||||
|
"@babel/helper-string-parser@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54"
|
||||||
|
integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
|
||||||
|
|
||||||
"@babel/helper-validator-identifier@^7.22.20":
|
"@babel/helper-validator-identifier@^7.22.20":
|
||||||
version "7.22.20"
|
version "7.22.20"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
|
||||||
@@ -481,6 +512,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
|
||||||
integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
|
integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
|
||||||
|
|
||||||
|
"@babel/helper-validator-identifier@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
|
||||||
|
integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
|
||||||
|
|
||||||
"@babel/helper-validator-option@^7.23.5":
|
"@babel/helper-validator-option@^7.23.5":
|
||||||
version "7.23.5"
|
version "7.23.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
|
||||||
@@ -523,6 +559,16 @@
|
|||||||
js-tokens "^4.0.0"
|
js-tokens "^4.0.0"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
|
|
||||||
|
"@babel/highlight@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5"
|
||||||
|
integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-validator-identifier" "^7.25.7"
|
||||||
|
chalk "^2.4.2"
|
||||||
|
js-tokens "^4.0.0"
|
||||||
|
picocolors "^1.0.0"
|
||||||
|
|
||||||
"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
|
"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
|
||||||
version "7.24.4"
|
version "7.24.4"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
|
||||||
@@ -533,6 +579,13 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
|
||||||
integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
|
integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
|
||||||
|
|
||||||
|
"@babel/parser@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.7.tgz#99b927720f4ddbfeb8cd195a363ed4532f87c590"
|
||||||
|
integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/types" "^7.25.7"
|
||||||
|
|
||||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5":
|
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5":
|
||||||
version "7.24.5"
|
version "7.24.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895"
|
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895"
|
||||||
@@ -1283,6 +1336,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.14.0"
|
regenerator-runtime "^0.14.0"
|
||||||
|
|
||||||
|
"@babel/runtime@^7.18.3", "@babel/runtime@^7.25.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6"
|
||||||
|
integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.14.0"
|
||||||
|
|
||||||
"@babel/template@^7.22.15", "@babel/template@^7.24.0":
|
"@babel/template@^7.22.15", "@babel/template@^7.24.0":
|
||||||
version "7.24.0"
|
version "7.24.0"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
|
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
|
||||||
@@ -1292,6 +1352,15 @@
|
|||||||
"@babel/parser" "^7.24.0"
|
"@babel/parser" "^7.24.0"
|
||||||
"@babel/types" "^7.24.0"
|
"@babel/types" "^7.24.0"
|
||||||
|
|
||||||
|
"@babel/template@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769"
|
||||||
|
integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/code-frame" "^7.25.7"
|
||||||
|
"@babel/parser" "^7.25.7"
|
||||||
|
"@babel/types" "^7.25.7"
|
||||||
|
|
||||||
"@babel/traverse@^7.18.9", "@babel/traverse@^7.24.5":
|
"@babel/traverse@^7.18.9", "@babel/traverse@^7.24.5":
|
||||||
version "7.24.5"
|
version "7.24.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8"
|
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8"
|
||||||
@@ -1324,6 +1393,19 @@
|
|||||||
debug "^4.3.1"
|
debug "^4.3.1"
|
||||||
globals "^11.1.0"
|
globals "^11.1.0"
|
||||||
|
|
||||||
|
"@babel/traverse@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8"
|
||||||
|
integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/code-frame" "^7.25.7"
|
||||||
|
"@babel/generator" "^7.25.7"
|
||||||
|
"@babel/parser" "^7.25.7"
|
||||||
|
"@babel/template" "^7.25.7"
|
||||||
|
"@babel/types" "^7.25.7"
|
||||||
|
debug "^4.3.1"
|
||||||
|
globals "^11.1.0"
|
||||||
|
|
||||||
"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0":
|
"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0":
|
||||||
version "7.24.0"
|
version "7.24.0"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
|
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
|
||||||
@@ -1342,6 +1424,15 @@
|
|||||||
"@babel/helper-validator-identifier" "^7.24.5"
|
"@babel/helper-validator-identifier" "^7.24.5"
|
||||||
to-fast-properties "^2.0.0"
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
|
"@babel/types@^7.25.7":
|
||||||
|
version "7.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.7.tgz#1b7725c1d3a59f328cb700ce704c46371e6eef9b"
|
||||||
|
integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-string-parser" "^7.25.7"
|
||||||
|
"@babel/helper-validator-identifier" "^7.25.7"
|
||||||
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
"@base2/pretty-print-object@1.0.1":
|
"@base2/pretty-print-object@1.0.1":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4"
|
resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4"
|
||||||
@@ -1431,6 +1522,41 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz#22abdcd83e008c369902976730c34c150148a758"
|
resolved "https://registry.yarnpkg.com/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz#22abdcd83e008c369902976730c34c150148a758"
|
||||||
integrity sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==
|
integrity sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==
|
||||||
|
|
||||||
|
"@cerc-io/registry-sdk@^0.2.11":
|
||||||
|
version "0.2.11"
|
||||||
|
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fregistry-sdk/-/0.2.11/registry-sdk-0.2.11.tgz#019b792c68f440f2cfca5af2f49e1205bb33ba72"
|
||||||
|
integrity sha512-IipqJzaBQEXMNH6yWFG2E/o0U6IAXw35PBMHx6QIboVu/sMNLIsWy1P8MmR8C8xYsmHOhgXLsC4hYSeFMXrqFw==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/amino" "^0.28.1"
|
||||||
|
"@cosmjs/crypto" "^0.28.1"
|
||||||
|
"@cosmjs/encoding" "^0.28.1"
|
||||||
|
"@cosmjs/launchpad" "^0.27.1"
|
||||||
|
"@cosmjs/proto-signing" "^0.32.2"
|
||||||
|
"@cosmjs/stargate" "^0.32.2"
|
||||||
|
"@cosmjs/tendermint-rpc" "^0.32.2"
|
||||||
|
"@ipld/dag-cbor" "^7.0.1"
|
||||||
|
"@ipld/dag-json" "^8.0.9"
|
||||||
|
"@metamask/eth-sig-util" "^4.0.0"
|
||||||
|
"@tharsis/address-converter" "^0.1.7"
|
||||||
|
"@tharsis/eip712" "^0.2.1"
|
||||||
|
"@tharsis/proto" "^0.1.16"
|
||||||
|
"@tharsis/provider" "^0.2.4"
|
||||||
|
"@tharsis/transactions" "^0.2.2"
|
||||||
|
axios "^0.26.1"
|
||||||
|
bip32 "3.0.1"
|
||||||
|
bip39 "^3.0.4"
|
||||||
|
canonical-json "^0.0.4"
|
||||||
|
ethers "^5.6.2"
|
||||||
|
graphql.js "^0.6.8"
|
||||||
|
js-sha256 "^0.9.0"
|
||||||
|
js-yaml "^3.14.1"
|
||||||
|
lodash "^4.17.21"
|
||||||
|
multiformats "^9.5.4"
|
||||||
|
node-yaml "^4.0.1"
|
||||||
|
secp256k1 "^4.0.1"
|
||||||
|
semver "^7.3.5"
|
||||||
|
tiny-secp256k1 "^1.1.6"
|
||||||
|
|
||||||
"@chromatic-com/storybook@^1.3.3":
|
"@chromatic-com/storybook@^1.3.3":
|
||||||
version "1.3.3"
|
version "1.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/@chromatic-com/storybook/-/storybook-1.3.3.tgz#102d173d7e67cbc7f974648eaa459aa3d3d53f91"
|
resolved "https://registry.yarnpkg.com/@chromatic-com/storybook/-/storybook-1.3.3.tgz#102d173d7e67cbc7f974648eaa459aa3d3d53f91"
|
||||||
@@ -1455,6 +1581,16 @@
|
|||||||
"@noble/hashes" "^1.0.0"
|
"@noble/hashes" "^1.0.0"
|
||||||
protobufjs "^6.8.8"
|
protobufjs "^6.8.8"
|
||||||
|
|
||||||
|
"@cosmjs/amino@0.27.1":
|
||||||
|
version "0.27.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.27.1.tgz#0910256b5aecd794420bb5f7319d98fc63252fa1"
|
||||||
|
integrity sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/crypto" "0.27.1"
|
||||||
|
"@cosmjs/encoding" "0.27.1"
|
||||||
|
"@cosmjs/math" "0.27.1"
|
||||||
|
"@cosmjs/utils" "0.27.1"
|
||||||
|
|
||||||
"@cosmjs/amino@0.28.13", "@cosmjs/amino@^0.28.1":
|
"@cosmjs/amino@0.28.13", "@cosmjs/amino@^0.28.1":
|
||||||
version "0.28.13"
|
version "0.28.13"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.13.tgz#b51417a23c1ff8ef8b85a6862eba8492c6c44f38"
|
resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.13.tgz#b51417a23c1ff8ef8b85a6862eba8492c6c44f38"
|
||||||
@@ -1475,6 +1611,32 @@
|
|||||||
"@cosmjs/math" "^0.30.1"
|
"@cosmjs/math" "^0.30.1"
|
||||||
"@cosmjs/utils" "^0.30.1"
|
"@cosmjs/utils" "^0.30.1"
|
||||||
|
|
||||||
|
"@cosmjs/amino@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.4.tgz#3908946c0394e6d431694c8992c5147079a1c860"
|
||||||
|
integrity sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/crypto" "^0.32.4"
|
||||||
|
"@cosmjs/encoding" "^0.32.4"
|
||||||
|
"@cosmjs/math" "^0.32.4"
|
||||||
|
"@cosmjs/utils" "^0.32.4"
|
||||||
|
|
||||||
|
"@cosmjs/crypto@0.27.1":
|
||||||
|
version "0.27.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.27.1.tgz#271c853089a3baf3acd6cf0b2122fd49f8815743"
|
||||||
|
integrity sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/encoding" "0.27.1"
|
||||||
|
"@cosmjs/math" "0.27.1"
|
||||||
|
"@cosmjs/utils" "0.27.1"
|
||||||
|
bip39 "^3.0.2"
|
||||||
|
bn.js "^5.2.0"
|
||||||
|
elliptic "^6.5.3"
|
||||||
|
js-sha3 "^0.8.0"
|
||||||
|
libsodium-wrappers "^0.7.6"
|
||||||
|
ripemd160 "^2.0.2"
|
||||||
|
sha.js "^2.4.11"
|
||||||
|
|
||||||
"@cosmjs/crypto@0.28.13", "@cosmjs/crypto@^0.28.1":
|
"@cosmjs/crypto@0.28.13", "@cosmjs/crypto@^0.28.1":
|
||||||
version "0.28.13"
|
version "0.28.13"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.13.tgz#541b6a36f616b2da5a568ead46d4e83841ceb412"
|
resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.13.tgz#541b6a36f616b2da5a568ead46d4e83841ceb412"
|
||||||
@@ -1501,6 +1663,28 @@
|
|||||||
elliptic "^6.5.4"
|
elliptic "^6.5.4"
|
||||||
libsodium-wrappers "^0.7.6"
|
libsodium-wrappers "^0.7.6"
|
||||||
|
|
||||||
|
"@cosmjs/crypto@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.32.4.tgz#5d29633b661eaf092ddb3e7ea6299cfd6f4507a2"
|
||||||
|
integrity sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/encoding" "^0.32.4"
|
||||||
|
"@cosmjs/math" "^0.32.4"
|
||||||
|
"@cosmjs/utils" "^0.32.4"
|
||||||
|
"@noble/hashes" "^1"
|
||||||
|
bn.js "^5.2.0"
|
||||||
|
elliptic "^6.5.4"
|
||||||
|
libsodium-wrappers-sumo "^0.7.11"
|
||||||
|
|
||||||
|
"@cosmjs/encoding@0.27.1":
|
||||||
|
version "0.27.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.27.1.tgz#3cd5bc0af743485eb2578cdb08cfa84c86d610e1"
|
||||||
|
integrity sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==
|
||||||
|
dependencies:
|
||||||
|
base64-js "^1.3.0"
|
||||||
|
bech32 "^1.1.4"
|
||||||
|
readonly-date "^1.0.0"
|
||||||
|
|
||||||
"@cosmjs/encoding@0.28.13", "@cosmjs/encoding@^0.28.1":
|
"@cosmjs/encoding@0.28.13", "@cosmjs/encoding@^0.28.1":
|
||||||
version "0.28.13"
|
version "0.28.13"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b"
|
resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b"
|
||||||
@@ -1519,6 +1703,15 @@
|
|||||||
bech32 "^1.1.4"
|
bech32 "^1.1.4"
|
||||||
readonly-date "^1.0.0"
|
readonly-date "^1.0.0"
|
||||||
|
|
||||||
|
"@cosmjs/encoding@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.4.tgz#646e0e809f7f4f1414d8fa991fb0ffe6c633aede"
|
||||||
|
integrity sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==
|
||||||
|
dependencies:
|
||||||
|
base64-js "^1.3.0"
|
||||||
|
bech32 "^1.1.4"
|
||||||
|
readonly-date "^1.0.0"
|
||||||
|
|
||||||
"@cosmjs/json-rpc@^0.30.1":
|
"@cosmjs/json-rpc@^0.30.1":
|
||||||
version "0.30.1"
|
version "0.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc"
|
resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc"
|
||||||
@@ -1527,6 +1720,34 @@
|
|||||||
"@cosmjs/stream" "^0.30.1"
|
"@cosmjs/stream" "^0.30.1"
|
||||||
xstream "^11.14.0"
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/json-rpc@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.32.4.tgz#be91eb89ea78bd5dc02d0a9fa184dd6790790f0b"
|
||||||
|
integrity sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/stream" "^0.32.4"
|
||||||
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/launchpad@^0.27.1":
|
||||||
|
version "0.27.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/launchpad/-/launchpad-0.27.1.tgz#b6f1995748be96560f5f01e84d3ff907477dda77"
|
||||||
|
integrity sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/amino" "0.27.1"
|
||||||
|
"@cosmjs/crypto" "0.27.1"
|
||||||
|
"@cosmjs/encoding" "0.27.1"
|
||||||
|
"@cosmjs/math" "0.27.1"
|
||||||
|
"@cosmjs/utils" "0.27.1"
|
||||||
|
axios "^0.21.2"
|
||||||
|
fast-deep-equal "^3.1.3"
|
||||||
|
|
||||||
|
"@cosmjs/math@0.27.1":
|
||||||
|
version "0.27.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.27.1.tgz#be78857b008ffc6b1ed6fecaa1c4cd5bc38c07d7"
|
||||||
|
integrity sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ==
|
||||||
|
dependencies:
|
||||||
|
bn.js "^5.2.0"
|
||||||
|
|
||||||
"@cosmjs/math@0.28.13":
|
"@cosmjs/math@0.28.13":
|
||||||
version "0.28.13"
|
version "0.28.13"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.13.tgz#50c05bc67007a04216f7f5e0c93f57270f8cc077"
|
resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.13.tgz#50c05bc67007a04216f7f5e0c93f57270f8cc077"
|
||||||
@@ -1541,6 +1762,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
bn.js "^5.2.0"
|
bn.js "^5.2.0"
|
||||||
|
|
||||||
|
"@cosmjs/math@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.4.tgz#87ac9eadc06696e30a30bdb562a495974bfd0a1a"
|
||||||
|
integrity sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==
|
||||||
|
dependencies:
|
||||||
|
bn.js "^5.2.0"
|
||||||
|
|
||||||
"@cosmjs/proto-signing@^0.28.13":
|
"@cosmjs/proto-signing@^0.28.13":
|
||||||
version "0.28.13"
|
version "0.28.13"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61"
|
resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61"
|
||||||
@@ -1567,6 +1795,18 @@
|
|||||||
cosmjs-types "^0.7.1"
|
cosmjs-types "^0.7.1"
|
||||||
long "^4.0.0"
|
long "^4.0.0"
|
||||||
|
|
||||||
|
"@cosmjs/proto-signing@^0.32.2", "@cosmjs/proto-signing@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz#5a06e087c6d677439c8c9b25b5223d5e72c4cd93"
|
||||||
|
integrity sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/amino" "^0.32.4"
|
||||||
|
"@cosmjs/crypto" "^0.32.4"
|
||||||
|
"@cosmjs/encoding" "^0.32.4"
|
||||||
|
"@cosmjs/math" "^0.32.4"
|
||||||
|
"@cosmjs/utils" "^0.32.4"
|
||||||
|
cosmjs-types "^0.9.0"
|
||||||
|
|
||||||
"@cosmjs/socket@^0.30.1":
|
"@cosmjs/socket@^0.30.1":
|
||||||
version "0.30.1"
|
version "0.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.30.1.tgz#00b22f4b5e2ab01f4d82ccdb7b2e59536bfe5ce0"
|
resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.30.1.tgz#00b22f4b5e2ab01f4d82ccdb7b2e59536bfe5ce0"
|
||||||
@@ -1577,6 +1817,16 @@
|
|||||||
ws "^7"
|
ws "^7"
|
||||||
xstream "^11.14.0"
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/socket@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.32.4.tgz#86ab6adf3a442314774c0810b7a7cfcddf4f2082"
|
||||||
|
integrity sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/stream" "^0.32.4"
|
||||||
|
isomorphic-ws "^4.0.1"
|
||||||
|
ws "^7"
|
||||||
|
xstream "^11.14.0"
|
||||||
|
|
||||||
"@cosmjs/stargate@^0.30.1":
|
"@cosmjs/stargate@^0.30.1":
|
||||||
version "0.30.1"
|
version "0.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.30.1.tgz#e1b22e1226cffc6e93914a410755f1f61057ba04"
|
resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.30.1.tgz#e1b22e1226cffc6e93914a410755f1f61057ba04"
|
||||||
@@ -1595,6 +1845,22 @@
|
|||||||
protobufjs "~6.11.3"
|
protobufjs "~6.11.3"
|
||||||
xstream "^11.14.0"
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/stargate@^0.32.2":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.4.tgz#bd0e4d3bf613b629addbf5f875d3d3b50f640af1"
|
||||||
|
integrity sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==
|
||||||
|
dependencies:
|
||||||
|
"@confio/ics23" "^0.6.8"
|
||||||
|
"@cosmjs/amino" "^0.32.4"
|
||||||
|
"@cosmjs/encoding" "^0.32.4"
|
||||||
|
"@cosmjs/math" "^0.32.4"
|
||||||
|
"@cosmjs/proto-signing" "^0.32.4"
|
||||||
|
"@cosmjs/stream" "^0.32.4"
|
||||||
|
"@cosmjs/tendermint-rpc" "^0.32.4"
|
||||||
|
"@cosmjs/utils" "^0.32.4"
|
||||||
|
cosmjs-types "^0.9.0"
|
||||||
|
xstream "^11.14.0"
|
||||||
|
|
||||||
"@cosmjs/stream@^0.30.1":
|
"@cosmjs/stream@^0.30.1":
|
||||||
version "0.30.1"
|
version "0.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a"
|
resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a"
|
||||||
@@ -1602,6 +1868,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
xstream "^11.14.0"
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/stream@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.4.tgz#83e1f2285807467c56d9ea0e1113f79d9fa63802"
|
||||||
|
integrity sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==
|
||||||
|
dependencies:
|
||||||
|
xstream "^11.14.0"
|
||||||
|
|
||||||
"@cosmjs/tendermint-rpc@^0.30.1":
|
"@cosmjs/tendermint-rpc@^0.30.1":
|
||||||
version "0.30.1"
|
version "0.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.30.1.tgz#c16378892ba1ac63f72803fdf7567eab9d4f0aa0"
|
resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.30.1.tgz#c16378892ba1ac63f72803fdf7567eab9d4f0aa0"
|
||||||
@@ -1618,6 +1891,27 @@
|
|||||||
readonly-date "^1.0.0"
|
readonly-date "^1.0.0"
|
||||||
xstream "^11.14.0"
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/tendermint-rpc@^0.32.2", "@cosmjs/tendermint-rpc@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.4.tgz#b36f9ec657498e42c97e21bb7368798ef6279752"
|
||||||
|
integrity sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==
|
||||||
|
dependencies:
|
||||||
|
"@cosmjs/crypto" "^0.32.4"
|
||||||
|
"@cosmjs/encoding" "^0.32.4"
|
||||||
|
"@cosmjs/json-rpc" "^0.32.4"
|
||||||
|
"@cosmjs/math" "^0.32.4"
|
||||||
|
"@cosmjs/socket" "^0.32.4"
|
||||||
|
"@cosmjs/stream" "^0.32.4"
|
||||||
|
"@cosmjs/utils" "^0.32.4"
|
||||||
|
axios "^1.6.0"
|
||||||
|
readonly-date "^1.0.0"
|
||||||
|
xstream "^11.14.0"
|
||||||
|
|
||||||
|
"@cosmjs/utils@0.27.1":
|
||||||
|
version "0.27.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.27.1.tgz#1c8efde17256346ef142a3bd15158ee4055470e2"
|
||||||
|
integrity sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==
|
||||||
|
|
||||||
"@cosmjs/utils@0.28.13":
|
"@cosmjs/utils@0.28.13":
|
||||||
version "0.28.13"
|
version "0.28.13"
|
||||||
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.13.tgz#2fd2844ec832d7833811e2ae1691305d09791a08"
|
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.13.tgz#2fd2844ec832d7833811e2ae1691305d09791a08"
|
||||||
@@ -1628,6 +1922,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb"
|
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb"
|
||||||
integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==
|
integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==
|
||||||
|
|
||||||
|
"@cosmjs/utils@^0.32.4":
|
||||||
|
version "0.32.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.4.tgz#a9a717c9fd7b1984d9cefdd0ef6c6f254060c671"
|
||||||
|
integrity sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==
|
||||||
|
|
||||||
"@cspotcode/source-map-support@^0.8.0":
|
"@cspotcode/source-map-support@^0.8.0":
|
||||||
version "0.8.1"
|
version "0.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
|
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
|
||||||
@@ -1640,6 +1939,39 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
|
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
|
||||||
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
|
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
|
||||||
|
|
||||||
|
"@emotion/babel-plugin@^11.12.0":
|
||||||
|
version "11.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
|
||||||
|
integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-module-imports" "^7.16.7"
|
||||||
|
"@babel/runtime" "^7.18.3"
|
||||||
|
"@emotion/hash" "^0.9.2"
|
||||||
|
"@emotion/memoize" "^0.9.0"
|
||||||
|
"@emotion/serialize" "^1.2.0"
|
||||||
|
babel-plugin-macros "^3.1.0"
|
||||||
|
convert-source-map "^1.5.0"
|
||||||
|
escape-string-regexp "^4.0.0"
|
||||||
|
find-root "^1.1.0"
|
||||||
|
source-map "^0.5.7"
|
||||||
|
stylis "4.2.0"
|
||||||
|
|
||||||
|
"@emotion/cache@^11.13.0", "@emotion/cache@^11.13.1":
|
||||||
|
version "11.13.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.1.tgz#fecfc54d51810beebf05bf2a161271a1a91895d7"
|
||||||
|
integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==
|
||||||
|
dependencies:
|
||||||
|
"@emotion/memoize" "^0.9.0"
|
||||||
|
"@emotion/sheet" "^1.4.0"
|
||||||
|
"@emotion/utils" "^1.4.0"
|
||||||
|
"@emotion/weak-memoize" "^0.4.0"
|
||||||
|
stylis "4.2.0"
|
||||||
|
|
||||||
|
"@emotion/hash@^0.9.2":
|
||||||
|
version "0.9.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b"
|
||||||
|
integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
|
||||||
|
|
||||||
"@emotion/is-prop-valid@1.2.1":
|
"@emotion/is-prop-valid@1.2.1":
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc"
|
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc"
|
||||||
@@ -1654,6 +1986,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@emotion/memoize" "0.7.4"
|
"@emotion/memoize" "0.7.4"
|
||||||
|
|
||||||
|
"@emotion/is-prop-valid@^1.3.0":
|
||||||
|
version "1.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240"
|
||||||
|
integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==
|
||||||
|
dependencies:
|
||||||
|
"@emotion/memoize" "^0.9.0"
|
||||||
|
|
||||||
"@emotion/memoize@0.7.4":
|
"@emotion/memoize@0.7.4":
|
||||||
version "0.7.4"
|
version "0.7.4"
|
||||||
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
|
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
|
||||||
@@ -1664,16 +2003,83 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
|
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
|
||||||
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
|
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
|
||||||
|
|
||||||
|
"@emotion/memoize@^0.9.0":
|
||||||
|
version "0.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102"
|
||||||
|
integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
|
||||||
|
|
||||||
|
"@emotion/react@^11.13.3":
|
||||||
|
version "11.13.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.3.tgz#a69d0de2a23f5b48e0acf210416638010e4bd2e4"
|
||||||
|
integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.18.3"
|
||||||
|
"@emotion/babel-plugin" "^11.12.0"
|
||||||
|
"@emotion/cache" "^11.13.0"
|
||||||
|
"@emotion/serialize" "^1.3.1"
|
||||||
|
"@emotion/use-insertion-effect-with-fallbacks" "^1.1.0"
|
||||||
|
"@emotion/utils" "^1.4.0"
|
||||||
|
"@emotion/weak-memoize" "^0.4.0"
|
||||||
|
hoist-non-react-statics "^3.3.1"
|
||||||
|
|
||||||
|
"@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.0", "@emotion/serialize@^1.3.1", "@emotion/serialize@^1.3.2":
|
||||||
|
version "1.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a"
|
||||||
|
integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==
|
||||||
|
dependencies:
|
||||||
|
"@emotion/hash" "^0.9.2"
|
||||||
|
"@emotion/memoize" "^0.9.0"
|
||||||
|
"@emotion/unitless" "^0.10.0"
|
||||||
|
"@emotion/utils" "^1.4.1"
|
||||||
|
csstype "^3.0.2"
|
||||||
|
|
||||||
|
"@emotion/sheet@^1.4.0":
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c"
|
||||||
|
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
|
||||||
|
|
||||||
|
"@emotion/styled@^11.13.0":
|
||||||
|
version "11.13.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.13.0.tgz#633fd700db701472c7a5dbef54d6f9834e9fb190"
|
||||||
|
integrity sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.18.3"
|
||||||
|
"@emotion/babel-plugin" "^11.12.0"
|
||||||
|
"@emotion/is-prop-valid" "^1.3.0"
|
||||||
|
"@emotion/serialize" "^1.3.0"
|
||||||
|
"@emotion/use-insertion-effect-with-fallbacks" "^1.1.0"
|
||||||
|
"@emotion/utils" "^1.4.0"
|
||||||
|
|
||||||
"@emotion/unitless@0.8.0":
|
"@emotion/unitless@0.8.0":
|
||||||
version "0.8.0"
|
version "0.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db"
|
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db"
|
||||||
integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
|
integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
|
||||||
|
|
||||||
|
"@emotion/unitless@^0.10.0":
|
||||||
|
version "0.10.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745"
|
||||||
|
integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
|
||||||
|
|
||||||
"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
|
"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
|
resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
|
||||||
integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
|
integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
|
||||||
|
|
||||||
|
"@emotion/use-insertion-effect-with-fallbacks@^1.1.0":
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf"
|
||||||
|
integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==
|
||||||
|
|
||||||
|
"@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1":
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad"
|
||||||
|
integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==
|
||||||
|
|
||||||
|
"@emotion/weak-memoize@^0.4.0":
|
||||||
|
version "0.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6"
|
||||||
|
integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
|
||||||
|
|
||||||
"@esbuild/aix-ppc64@0.19.12":
|
"@esbuild/aix-ppc64@0.19.12":
|
||||||
version "0.19.12"
|
version "0.19.12"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f"
|
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f"
|
||||||
@@ -3899,6 +4305,81 @@
|
|||||||
"@motionone/dom" "^10.16.4"
|
"@motionone/dom" "^10.16.4"
|
||||||
tslib "^2.3.1"
|
tslib "^2.3.1"
|
||||||
|
|
||||||
|
"@mui/core-downloads-tracker@^6.1.3":
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.3.tgz#54e22bf569a7764dff36697778cc0ae4591c7ec9"
|
||||||
|
integrity sha512-ajMUgdfhTb++rwqj134Cq9f4SRN8oXUqMRnY72YBnXiXai3olJLLqETheRlq3MM8wCKrbq7g6j7iWL1VvP44VQ==
|
||||||
|
|
||||||
|
"@mui/material@^6.1.3":
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.1.3.tgz#1d17bb2a6aedfa78a1a7a7f3a3a2d0023427a996"
|
||||||
|
integrity sha512-loV5MBoMKLrK80JeWINmQ1A4eWoLv51O2dBPLJ260IAhupkB3Wol8lEQTEvvR2vO3o6xRHuXe1WaQEP6N3riqg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.25.6"
|
||||||
|
"@mui/core-downloads-tracker" "^6.1.3"
|
||||||
|
"@mui/system" "^6.1.3"
|
||||||
|
"@mui/types" "^7.2.18"
|
||||||
|
"@mui/utils" "^6.1.3"
|
||||||
|
"@popperjs/core" "^2.11.8"
|
||||||
|
"@types/react-transition-group" "^4.4.11"
|
||||||
|
clsx "^2.1.1"
|
||||||
|
csstype "^3.1.3"
|
||||||
|
prop-types "^15.8.1"
|
||||||
|
react-is "^18.3.1"
|
||||||
|
react-transition-group "^4.4.5"
|
||||||
|
|
||||||
|
"@mui/private-theming@^6.1.3":
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.1.3.tgz#ec225ec2814e89a1ce9a194809d607116885020f"
|
||||||
|
integrity sha512-XK5OYCM0x7gxWb/WBEySstBmn+dE3YKX7U7jeBRLm6vHU5fGUd7GiJWRirpivHjOK9mRH6E1MPIVd+ze5vguKQ==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.25.6"
|
||||||
|
"@mui/utils" "^6.1.3"
|
||||||
|
prop-types "^15.8.1"
|
||||||
|
|
||||||
|
"@mui/styled-engine@^6.1.3":
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.1.3.tgz#f5e655f59836a5f9fce7b96cd889eee9804d277d"
|
||||||
|
integrity sha512-i4yh9m+eMZE3cNERpDhVr6Wn73Yz6C7MH0eE2zZvw8d7EFkIJlCQNZd1xxGZqarD2DDq2qWHcjIOucWGhxACtA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.25.6"
|
||||||
|
"@emotion/cache" "^11.13.1"
|
||||||
|
"@emotion/serialize" "^1.3.2"
|
||||||
|
"@emotion/sheet" "^1.4.0"
|
||||||
|
csstype "^3.1.3"
|
||||||
|
prop-types "^15.8.1"
|
||||||
|
|
||||||
|
"@mui/system@^6.1.3":
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.1.3.tgz#64158d2feefb2e470d36c20fd144ac0a140a35fb"
|
||||||
|
integrity sha512-ILaD9UsLTBLjMcep3OumJMXh1PYr7aqnkHm/L47bH46+YmSL1zWAX6tWG8swEQROzW2GvYluEMp5FreoxOOC6w==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.25.6"
|
||||||
|
"@mui/private-theming" "^6.1.3"
|
||||||
|
"@mui/styled-engine" "^6.1.3"
|
||||||
|
"@mui/types" "^7.2.18"
|
||||||
|
"@mui/utils" "^6.1.3"
|
||||||
|
clsx "^2.1.1"
|
||||||
|
csstype "^3.1.3"
|
||||||
|
prop-types "^15.8.1"
|
||||||
|
|
||||||
|
"@mui/types@^7.2.18":
|
||||||
|
version "7.2.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.18.tgz#4b6385ed2f7828ef344113cdc339d6fdf8e4bc23"
|
||||||
|
integrity sha512-uvK9dWeyCJl/3ocVnTOS6nlji/Knj8/tVqVX03UVTpdmTJYu/s4jtDd9Kvv0nRGE0CUSNW1UYAci7PYypjealg==
|
||||||
|
|
||||||
|
"@mui/utils@^6.1.3":
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.3.tgz#edb63cbd18fea2341efc6d4d087dd48075fc9dba"
|
||||||
|
integrity sha512-4JBpLkjprlKjN10DGb1aiy/ii9TKbQ601uSHtAmYFAS879QZgAD7vRnv/YBE4iBbc7NXzFgbQMCOFrupXWekIA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.25.6"
|
||||||
|
"@mui/types" "^7.2.18"
|
||||||
|
"@types/prop-types" "^15.7.13"
|
||||||
|
clsx "^2.1.1"
|
||||||
|
prop-types "^15.8.1"
|
||||||
|
react-is "^18.3.1"
|
||||||
|
|
||||||
"@multiformats/murmur3@^2.0.0":
|
"@multiformats/murmur3@^2.0.0":
|
||||||
version "2.1.8"
|
version "2.1.8"
|
||||||
resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-2.1.8.tgz#81c1c15b6391109f3febfca4b3205196615a04e9"
|
resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-2.1.8.tgz#81c1c15b6391109f3febfca4b3205196615a04e9"
|
||||||
@@ -4607,6 +5088,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
|
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
|
||||||
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
|
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
|
||||||
|
|
||||||
|
"@popperjs/core@^2.11.8":
|
||||||
|
version "2.11.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
|
||||||
|
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
|
||||||
|
|
||||||
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
|
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
|
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
|
||||||
@@ -6935,6 +7421,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
|
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
|
||||||
integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
|
integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
|
||||||
|
|
||||||
|
"@types/prop-types@^15.7.13":
|
||||||
|
version "15.7.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
|
||||||
|
integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
|
||||||
|
|
||||||
"@types/qs@*", "@types/qs@^6.9.5":
|
"@types/qs@*", "@types/qs@^6.9.5":
|
||||||
version "6.9.15"
|
version "6.9.15"
|
||||||
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce"
|
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce"
|
||||||
@@ -6952,6 +7443,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/react" "*"
|
"@types/react" "*"
|
||||||
|
|
||||||
|
"@types/react-transition-group@^4.4.11":
|
||||||
|
version "4.4.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5"
|
||||||
|
integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==
|
||||||
|
dependencies:
|
||||||
|
"@types/react" "*"
|
||||||
|
|
||||||
"@types/react@*", "@types/react@^18.2.66":
|
"@types/react@*", "@types/react@^18.2.66":
|
||||||
version "18.2.79"
|
version "18.2.79"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865"
|
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865"
|
||||||
@@ -8276,6 +8774,15 @@ babel-core@^7.0.0-bridge.0:
|
|||||||
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
|
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
|
||||||
integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
|
integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
|
||||||
|
|
||||||
|
babel-plugin-macros@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
|
||||||
|
integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.12.5"
|
||||||
|
cosmiconfig "^7.0.0"
|
||||||
|
resolve "^1.19.0"
|
||||||
|
|
||||||
babel-plugin-polyfill-corejs2@^0.4.10:
|
babel-plugin-polyfill-corejs2@^0.4.10:
|
||||||
version "0.4.11"
|
version "0.4.11"
|
||||||
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
|
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
|
||||||
@@ -8401,7 +8908,7 @@ bip32@3.0.1:
|
|||||||
typeforce "^1.11.5"
|
typeforce "^1.11.5"
|
||||||
wif "^2.0.6"
|
wif "^2.0.6"
|
||||||
|
|
||||||
bip39@^3.0.4:
|
bip39@^3.0.2, bip39@^3.0.4:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3"
|
resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3"
|
||||||
integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==
|
integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==
|
||||||
@@ -9035,7 +9542,7 @@ clone@^1.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
|
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
|
||||||
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
|
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
|
||||||
|
|
||||||
clsx@^2.0.0, clsx@^2.1.0:
|
clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
|
resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
|
||||||
integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
|
integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
|
||||||
@@ -9272,6 +9779,11 @@ conventional-recommended-bump@7.0.1:
|
|||||||
git-semver-tags "^5.0.0"
|
git-semver-tags "^5.0.0"
|
||||||
meow "^8.1.2"
|
meow "^8.1.2"
|
||||||
|
|
||||||
|
convert-source-map@^1.5.0:
|
||||||
|
version "1.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
|
||||||
|
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
|
||||||
|
|
||||||
convert-source-map@^2.0.0:
|
convert-source-map@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
|
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
|
||||||
@@ -9348,7 +9860,7 @@ cors@^2.8.5:
|
|||||||
object-assign "^4"
|
object-assign "^4"
|
||||||
vary "^1"
|
vary "^1"
|
||||||
|
|
||||||
cosmiconfig@^7.1.0:
|
cosmiconfig@^7.0.0, cosmiconfig@^7.1.0:
|
||||||
version "7.1.0"
|
version "7.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
|
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
|
||||||
integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
|
integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
|
||||||
@@ -9393,6 +9905,11 @@ cosmjs-types@^0.7.1:
|
|||||||
long "^4.0.0"
|
long "^4.0.0"
|
||||||
protobufjs "~6.11.2"
|
protobufjs "~6.11.2"
|
||||||
|
|
||||||
|
cosmjs-types@^0.9.0:
|
||||||
|
version "0.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.9.0.tgz#c3bc482d28c7dfa25d1445093fdb2d9da1f6cfcc"
|
||||||
|
integrity sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==
|
||||||
|
|
||||||
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
|
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
|
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
|
||||||
@@ -9515,7 +10032,7 @@ csstype@3.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
|
||||||
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
|
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
|
||||||
|
|
||||||
csstype@^3.0.2:
|
csstype@^3.0.2, csstype@^3.1.3:
|
||||||
version "3.1.3"
|
version "3.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
||||||
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
||||||
@@ -9892,6 +10409,14 @@ dom-accessibility-api@^0.6.3:
|
|||||||
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8"
|
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8"
|
||||||
integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==
|
integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==
|
||||||
|
|
||||||
|
dom-helpers@^5.0.1:
|
||||||
|
version "5.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
|
||||||
|
integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.8.7"
|
||||||
|
csstype "^3.0.2"
|
||||||
|
|
||||||
dot-prop@^5.1.0:
|
dot-prop@^5.1.0:
|
||||||
version "5.3.0"
|
version "5.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
|
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
|
||||||
@@ -10251,6 +10776,11 @@ escape-string-regexp@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
|
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
|
||||||
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
|
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
|
||||||
|
|
||||||
|
escape-string-regexp@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
|
||||||
|
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
|
||||||
|
|
||||||
escodegen@^2.1.0:
|
escodegen@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
|
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
|
||||||
@@ -10772,6 +11302,11 @@ find-cache-dir@^3.0.0:
|
|||||||
make-dir "^3.0.2"
|
make-dir "^3.0.2"
|
||||||
pkg-dir "^4.1.0"
|
pkg-dir "^4.1.0"
|
||||||
|
|
||||||
|
find-root@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
|
||||||
|
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
|
||||||
|
|
||||||
find-up@^2.0.0:
|
find-up@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
|
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
|
||||||
@@ -11264,11 +11799,6 @@ globby@11.1.0, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0:
|
|||||||
merge2 "^1.4.1"
|
merge2 "^1.4.1"
|
||||||
slash "^3.0.0"
|
slash "^3.0.0"
|
||||||
|
|
||||||
goober@^2.1.10:
|
|
||||||
version "2.1.14"
|
|
||||||
resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd"
|
|
||||||
integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==
|
|
||||||
|
|
||||||
google-protobuf@^3.19.4:
|
google-protobuf@^3.19.4:
|
||||||
version "3.21.2"
|
version "3.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4"
|
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4"
|
||||||
@@ -11480,7 +12010,7 @@ hmac-drbg@^1.0.1:
|
|||||||
minimalistic-assert "^1.0.0"
|
minimalistic-assert "^1.0.0"
|
||||||
minimalistic-crypto-utils "^1.0.1"
|
minimalistic-crypto-utils "^1.0.1"
|
||||||
|
|
||||||
hoist-non-react-statics@^3.3.2:
|
hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
|
||||||
version "3.3.2"
|
version "3.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
|
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
|
||||||
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
|
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
|
||||||
@@ -12542,7 +13072,7 @@ js-sha256@^0.9.0:
|
|||||||
resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
|
resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
|
||||||
integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==
|
integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==
|
||||||
|
|
||||||
js-sha3@0.8.0:
|
js-sha3@0.8.0, js-sha3@^0.8.0:
|
||||||
version "0.8.0"
|
version "0.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
|
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
|
||||||
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
|
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
|
||||||
@@ -12603,6 +13133,11 @@ jsesc@^2.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
|
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
|
||||||
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
|
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
|
||||||
|
|
||||||
|
jsesc@^3.0.2:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
|
||||||
|
integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
|
||||||
|
|
||||||
jsesc@~0.5.0:
|
jsesc@~0.5.0:
|
||||||
version "0.5.0"
|
version "0.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
|
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
|
||||||
@@ -12879,6 +13414,18 @@ libnpmpublish@7.3.0:
|
|||||||
sigstore "^1.4.0"
|
sigstore "^1.4.0"
|
||||||
ssri "^10.0.1"
|
ssri "^10.0.1"
|
||||||
|
|
||||||
|
libsodium-sumo@^0.7.15:
|
||||||
|
version "0.7.15"
|
||||||
|
resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz#91c1d863fe3fbce6d6b9db1aadaa622733a1d007"
|
||||||
|
integrity sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==
|
||||||
|
|
||||||
|
libsodium-wrappers-sumo@^0.7.11:
|
||||||
|
version "0.7.15"
|
||||||
|
resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz#0ef2a99b4b17e8385aa7e6850593660dbaf5fb40"
|
||||||
|
integrity sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==
|
||||||
|
dependencies:
|
||||||
|
libsodium-sumo "^0.7.15"
|
||||||
|
|
||||||
libsodium-wrappers@^0.7.6:
|
libsodium-wrappers@^0.7.6:
|
||||||
version "0.7.13"
|
version "0.7.13"
|
||||||
resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3"
|
resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3"
|
||||||
@@ -15018,7 +15565,7 @@ promzard@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
read "^3.0.1"
|
read "^3.0.1"
|
||||||
|
|
||||||
prop-types@15.8.1, prop-types@^15.6.0, prop-types@^15.7.2, prop-types@^15.8.1:
|
prop-types@15.8.1, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
|
||||||
version "15.8.1"
|
version "15.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
|
||||||
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
||||||
@@ -15328,13 +15875,6 @@ react-hook-form@^7.49.0:
|
|||||||
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.3.tgz#7486dd2d52280b6b28048c099a98d2545931cab3"
|
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.3.tgz#7486dd2d52280b6b28048c099a98d2545931cab3"
|
||||||
integrity sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==
|
integrity sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==
|
||||||
|
|
||||||
react-hot-toast@^2.4.1:
|
|
||||||
version "2.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994"
|
|
||||||
integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==
|
|
||||||
dependencies:
|
|
||||||
goober "^2.1.10"
|
|
||||||
|
|
||||||
react-inspector@6.0.2:
|
react-inspector@6.0.2:
|
||||||
version "6.0.2"
|
version "6.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-6.0.2.tgz#aa3028803550cb6dbd7344816d5c80bf39d07e9d"
|
resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-6.0.2.tgz#aa3028803550cb6dbd7344816d5c80bf39d07e9d"
|
||||||
@@ -15360,6 +15900,11 @@ react-is@^18.0.0, react-is@^18.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
|
||||||
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
|
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
|
||||||
|
|
||||||
|
react-is@^18.3.1:
|
||||||
|
version "18.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
|
||||||
|
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
|
||||||
|
|
||||||
react-native-fetch-api@^3.0.0:
|
react-native-fetch-api@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5"
|
resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5"
|
||||||
@@ -15436,6 +15981,16 @@ react-timer-hook@^3.0.7:
|
|||||||
resolved "https://registry.yarnpkg.com/react-timer-hook/-/react-timer-hook-3.0.7.tgz#ac42c43d0034b873cbf97b44eb34ccb2b11fe5e0"
|
resolved "https://registry.yarnpkg.com/react-timer-hook/-/react-timer-hook-3.0.7.tgz#ac42c43d0034b873cbf97b44eb34ccb2b11fe5e0"
|
||||||
integrity sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==
|
integrity sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==
|
||||||
|
|
||||||
|
react-transition-group@^4.4.5:
|
||||||
|
version "4.4.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
|
||||||
|
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.5.5"
|
||||||
|
dom-helpers "^5.0.1"
|
||||||
|
loose-envify "^1.4.0"
|
||||||
|
prop-types "^15.6.2"
|
||||||
|
|
||||||
react@18.2.0, react@^18.2.0:
|
react@18.2.0, react@^18.2.0:
|
||||||
version "18.2.0"
|
version "18.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
||||||
@@ -15767,7 +16322,7 @@ resolve-from@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
||||||
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
||||||
|
|
||||||
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.3, resolve@^1.22.8:
|
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.3, resolve@^1.22.8:
|
||||||
version "1.22.8"
|
version "1.22.8"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
|
||||||
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
|
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
|
||||||
@@ -15842,7 +16397,7 @@ ripemd160-min@0.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62"
|
resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62"
|
||||||
integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==
|
integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==
|
||||||
|
|
||||||
ripemd160@^2.0.0, ripemd160@^2.0.1:
|
ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
|
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
|
||||||
integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
|
integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
|
||||||
@@ -16273,6 +16828,11 @@ source-map@0.8.0-beta.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
whatwg-url "^7.0.0"
|
whatwg-url "^7.0.0"
|
||||||
|
|
||||||
|
source-map@^0.5.7:
|
||||||
|
version "0.5.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||||
|
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
|
||||||
|
|
||||||
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
|
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
@@ -16440,7 +17000,16 @@ strict-uri-encode@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
|
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
|
||||||
integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
|
integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
|
||||||
|
|
||||||
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
"string-width-cjs@npm:string-width@^4.2.0":
|
||||||
|
version "4.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
|
dependencies:
|
||||||
|
emoji-regex "^8.0.0"
|
||||||
|
is-fullwidth-code-point "^3.0.0"
|
||||||
|
strip-ansi "^6.0.1"
|
||||||
|
|
||||||
|
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
@@ -16477,7 +17046,14 @@ string_decoder@~1.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||||
|
version "6.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^5.0.1"
|
||||||
|
|
||||||
|
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
@@ -16579,6 +17155,11 @@ styled-components@^6.1.0:
|
|||||||
stylis "4.3.1"
|
stylis "4.3.1"
|
||||||
tslib "2.5.0"
|
tslib "2.5.0"
|
||||||
|
|
||||||
|
stylis@4.2.0:
|
||||||
|
version "4.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
|
||||||
|
integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
|
||||||
|
|
||||||
stylis@4.3.1:
|
stylis@4.3.1:
|
||||||
version "4.3.1"
|
version "4.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb"
|
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb"
|
||||||
@@ -17717,7 +18298,7 @@ workspace@^0.0.1-preview.1:
|
|||||||
resolved "https://registry.yarnpkg.com/workspace/-/workspace-0.0.1-preview.1.tgz#0ba0a6b92b3dbc7f1502dd12bc27a37b1eec9083"
|
resolved "https://registry.yarnpkg.com/workspace/-/workspace-0.0.1-preview.1.tgz#0ba0a6b92b3dbc7f1502dd12bc27a37b1eec9083"
|
||||||
integrity sha512-oPpEvU7NIQ0MW7ReL+EigMUI2JPNp05kmqzWS6zXVUaSq5KxuQzfgxGd8wuurBulBkTaOnEcGge+2rriyDVHkw==
|
integrity sha512-oPpEvU7NIQ0MW7ReL+EigMUI2JPNp05kmqzWS6zXVUaSq5KxuQzfgxGd8wuurBulBkTaOnEcGge+2rriyDVHkw==
|
||||||
|
|
||||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
@@ -17735,6 +18316,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0:
|
|||||||
string-width "^4.1.0"
|
string-width "^4.1.0"
|
||||||
strip-ansi "^6.0.0"
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
|
wrap-ansi@^7.0.0:
|
||||||
|
version "7.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
|
dependencies:
|
||||||
|
ansi-styles "^4.0.0"
|
||||||
|
string-width "^4.1.0"
|
||||||
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
wrap-ansi@^8.1.0:
|
wrap-ansi@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
||||||
|
|||||||
Reference in New Issue
Block a user