Merge branch 'usebruno:main' into feature/proxy-global-and-collection

This commit is contained in:
mirkogolze 2023-10-14 10:26:09 +02:00 committed by GitHub
commit 97a300fbfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 658 additions and 38 deletions

428
package-lock.json generated
View File

@ -21,6 +21,7 @@
"@faker-js/faker": "^7.6.0", "@faker-js/faker": "^7.6.0",
"@jest/globals": "^29.2.0", "@jest/globals": "^29.2.0",
"@playwright/test": "^1.27.1", "@playwright/test": "^1.27.1",
"fs-extra": "^11.1.1",
"husky": "^8.0.3", "husky": "^8.0.3",
"jest": "^29.2.0", "jest": "^29.2.0",
"pretty-quick": "^3.1.3", "pretty-quick": "^3.1.3",
@ -5243,6 +5244,20 @@
"dev": true, "dev": true,
"license": "Python-2.0" "license": "Python-2.0"
}, },
"node_modules/app-builder-lib/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/app-builder-lib/node_modules/js-yaml": { "node_modules/app-builder-lib/node_modules/js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"dev": true, "dev": true,
@ -5524,6 +5539,75 @@
"node": ">=10.12.0" "node": ">=10.12.0"
} }
}, },
"node_modules/autoprefixer": {
"version": "10.4.16",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
"integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"dependencies": {
"browserslist": "^4.21.10",
"caniuse-lite": "^1.0.30001538",
"fraction.js": "^4.3.6",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
},
"bin": {
"autoprefixer": "bin/autoprefixer"
},
"engines": {
"node": "^10 || ^12 || >=14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/autoprefixer/node_modules/browserslist": {
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
"integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001541",
"electron-to-chromium": "^1.4.535",
"node-releases": "^2.0.13",
"update-browserslist-db": "^1.0.13"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/aws-sign2": { "node_modules/aws-sign2": {
"version": "0.7.0", "version": "0.7.0",
"dev": true, "dev": true,
@ -5919,7 +6003,6 @@
}, },
"node_modules/browserslist": { "node_modules/browserslist": {
"version": "4.21.4", "version": "4.21.4",
"dev": true,
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -6080,6 +6163,20 @@
"dev": true, "dev": true,
"license": "Python-2.0" "license": "Python-2.0"
}, },
"node_modules/builder-util/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/builder-util/node_modules/js-yaml": { "node_modules/builder-util/node_modules/js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"dev": true, "dev": true,
@ -6240,7 +6337,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001445", "version": "1.0.30001547",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz",
"integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -6249,9 +6348,12 @@
{ {
"type": "tidelift", "type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite" "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
} }
], ]
"license": "CC-BY-4.0"
}, },
"node_modules/caseless": { "node_modules/caseless": {
"version": "0.12.0", "version": "0.12.0",
@ -7421,6 +7523,20 @@
"dev": true, "dev": true,
"license": "Python-2.0" "license": "Python-2.0"
}, },
"node_modules/dmg-builder/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/dmg-builder/node_modules/iconv-lite": { "node_modules/dmg-builder/node_modules/iconv-lite": {
"version": "0.6.3", "version": "0.6.3",
"dev": true, "dev": true,
@ -7645,6 +7761,20 @@
"node": ">=14.0.0" "node": ">=14.0.0"
} }
}, },
"node_modules/electron-builder/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/electron-icon-maker": { "node_modules/electron-icon-maker": {
"version": "0.0.5", "version": "0.0.5",
"dev": true, "dev": true,
@ -7756,6 +7886,20 @@
"mime": "^2.5.2" "mime": "^2.5.2"
} }
}, },
"node_modules/electron-publish/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/electron-store": { "node_modules/electron-store": {
"version": "8.1.0", "version": "8.1.0",
"license": "MIT", "license": "MIT",
@ -7778,9 +7922,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.284", "version": "1.4.554",
"dev": true, "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz",
"license": "ISC" "integrity": "sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ=="
}, },
"node_modules/electron-util": { "node_modules/electron-util": {
"version": "0.17.2", "version": "0.17.2",
@ -8525,6 +8669,19 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"peer": true,
"engines": {
"node": "*"
},
"funding": {
"type": "patreon",
"url": "https://github.com/sponsors/rawify"
}
},
"node_modules/fresh": { "node_modules/fresh": {
"version": "0.5.2", "version": "0.5.2",
"license": "MIT", "license": "MIT",
@ -8537,15 +8694,17 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/fs-extra": { "node_modules/fs-extra": {
"version": "10.1.0", "version": "11.1.1",
"license": "MIT", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
"integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
"dev": true,
"dependencies": { "dependencies": {
"graceful-fs": "^4.2.0", "graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1", "jsonfile": "^6.0.1",
"universalify": "^2.0.0" "universalify": "^2.0.0"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=14.14"
} }
}, },
"node_modules/fs.realpath": { "node_modules/fs.realpath": {
@ -11700,9 +11859,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.8", "version": "2.0.13",
"dev": true, "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
"license": "MIT" "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
}, },
"node_modules/normalize-package-data": { "node_modules/normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
@ -11735,6 +11894,15 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-url": { "node_modules/normalize-url": {
"version": "6.1.0", "version": "6.1.0",
"dev": true, "dev": true,
@ -15122,6 +15290,19 @@
"postcss": "^8.0.9" "postcss": "^8.0.9"
} }
}, },
"node_modules/tailwindcss/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/tailwindcss/node_modules/glob-parent": { "node_modules/tailwindcss/node_modules/glob-parent": {
"version": "6.0.2", "version": "6.0.2",
"license": "ISC", "license": "ISC",
@ -15149,6 +15330,20 @@
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
} }
}, },
"node_modules/temp-file/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/terser": { "node_modules/terser": {
"version": "5.16.1", "version": "5.16.1",
"dev": true, "dev": true,
@ -15658,8 +15853,9 @@
} }
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.0.10", "version": "1.0.13",
"dev": true, "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -15668,15 +15864,18 @@
{ {
"type": "tidelift", "type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist" "url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
} }
], ],
"license": "MIT",
"dependencies": { "dependencies": {
"escalade": "^3.1.1", "escalade": "^3.1.1",
"picocolors": "^1.0.0" "picocolors": "^1.0.0"
}, },
"bin": { "bin": {
"browserslist-lint": "cli.js" "update-browserslist-db": "cli.js"
}, },
"peerDependencies": { "peerDependencies": {
"browserslist": ">= 4.21.0" "browserslist": ">= 4.21.0"
@ -16494,6 +16693,19 @@
"node": ">=8" "node": ">=8"
} }
}, },
"packages/bruno-cli/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"packages/bruno-cli/node_modules/http-proxy-agent": { "packages/bruno-cli/node_modules/http-proxy-agent": {
"version": "7.0.0", "version": "7.0.0",
"license": "MIT", "license": "MIT",
@ -16518,7 +16730,7 @@
}, },
"packages/bruno-electron": { "packages/bruno-electron": {
"name": "bruno", "name": "bruno",
"version": "v0.23.0", "version": "v0.24.0",
"dependencies": { "dependencies": {
"@aws-sdk/credential-providers": "^3.425.0", "@aws-sdk/credential-providers": "^3.425.0",
"@usebruno/js": "0.8.0", "@usebruno/js": "0.8.0",
@ -16645,6 +16857,19 @@
"@types/yauzl": "^2.9.1" "@types/yauzl": "^2.9.1"
} }
}, },
"packages/bruno-electron/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"packages/bruno-electron/node_modules/get-stream": { "packages/bruno-electron/node_modules/get-stream": {
"version": "5.2.0", "version": "5.2.0",
"dev": true, "dev": true,
@ -20494,6 +20719,16 @@
"supports-color": "^7.1.0" "supports-color": "^7.1.0"
} }
}, },
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"http-proxy-agent": { "http-proxy-agent": {
"version": "7.0.0", "version": "7.0.0",
"requires": { "requires": {
@ -20911,6 +21146,17 @@
"version": "2.0.1", "version": "2.0.1",
"dev": true "dev": true
}, },
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"js-yaml": { "js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"dev": true, "dev": true,
@ -21080,6 +21326,34 @@
"atomically": { "atomically": {
"version": "1.7.0" "version": "1.7.0"
}, },
"autoprefixer": {
"version": "10.4.16",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
"integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
"peer": true,
"requires": {
"browserslist": "^4.21.10",
"caniuse-lite": "^1.0.30001538",
"fraction.js": "^4.3.6",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
},
"dependencies": {
"browserslist": {
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
"integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
"peer": true,
"requires": {
"caniuse-lite": "^1.0.30001541",
"electron-to-chromium": "^1.4.535",
"node-releases": "^2.0.13",
"update-browserslist-db": "^1.0.13"
}
}
}
},
"aws-sign2": { "aws-sign2": {
"version": "0.7.0", "version": "0.7.0",
"dev": true "dev": true
@ -21341,7 +21615,6 @@
}, },
"browserslist": { "browserslist": {
"version": "4.21.4", "version": "4.21.4",
"dev": true,
"requires": { "requires": {
"caniuse-lite": "^1.0.30001400", "caniuse-lite": "^1.0.30001400",
"electron-to-chromium": "^1.4.251", "electron-to-chromium": "^1.4.251",
@ -21440,6 +21713,16 @@
"yauzl": "^2.10.0" "yauzl": "^2.10.0"
} }
}, },
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"get-stream": { "get-stream": {
"version": "5.2.0", "version": "5.2.0",
"dev": true, "dev": true,
@ -21545,6 +21828,17 @@
"version": "2.0.1", "version": "2.0.1",
"dev": true "dev": true
}, },
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"js-yaml": { "js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"dev": true, "dev": true,
@ -21658,7 +21952,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001445" "version": "1.0.30001547",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz",
"integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA=="
}, },
"caseless": { "caseless": {
"version": "0.12.0", "version": "0.12.0",
@ -22385,6 +22681,17 @@
"version": "2.0.1", "version": "2.0.1",
"dev": true "dev": true
}, },
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"iconv-lite": { "iconv-lite": {
"version": "0.6.3", "version": "0.6.3",
"dev": true, "dev": true,
@ -22535,6 +22842,19 @@
"read-config-file": "6.2.0", "read-config-file": "6.2.0",
"update-notifier": "^5.1.0", "update-notifier": "^5.1.0",
"yargs": "^17.0.1" "yargs": "^17.0.1"
},
"dependencies": {
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
}
} }
}, },
"electron-icon-maker": { "electron-icon-maker": {
@ -22618,6 +22938,19 @@
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"lazy-val": "^1.0.5", "lazy-val": "^1.0.5",
"mime": "^2.5.2" "mime": "^2.5.2"
},
"dependencies": {
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
}
} }
}, },
"electron-store": { "electron-store": {
@ -22633,8 +22966,9 @@
} }
}, },
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.4.284", "version": "1.4.554",
"dev": true "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz",
"integrity": "sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ=="
}, },
"electron-util": { "electron-util": {
"version": "0.17.2", "version": "0.17.2",
@ -23115,6 +23449,12 @@
"forwarded": { "forwarded": {
"version": "0.2.0" "version": "0.2.0"
}, },
"fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"peer": true
},
"fresh": { "fresh": {
"version": "0.5.2" "version": "0.5.2"
}, },
@ -23122,7 +23462,10 @@
"version": "0.1.7" "version": "0.1.7"
}, },
"fs-extra": { "fs-extra": {
"version": "10.1.0", "version": "11.1.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
"integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
"dev": true,
"requires": { "requires": {
"graceful-fs": "^4.2.0", "graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1", "jsonfile": "^6.0.1",
@ -25118,8 +25461,9 @@
"version": "1.1.12" "version": "1.1.12"
}, },
"node-releases": { "node-releases": {
"version": "2.0.8", "version": "2.0.13",
"dev": true "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
"integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
}, },
"normalize-package-data": { "normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
@ -25144,6 +25488,12 @@
"normalize-path": { "normalize-path": {
"version": "3.0.0" "version": "3.0.0"
}, },
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"peer": true
},
"normalize-url": { "normalize-url": {
"version": "6.1.0", "version": "6.1.0",
"dev": true "dev": true
@ -27252,6 +27602,16 @@
"tmp": "^0.2.1" "tmp": "^0.2.1"
}, },
"dependencies": { "dependencies": {
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"glob-parent": { "glob-parent": {
"version": "6.0.2", "version": "6.0.2",
"requires": { "requires": {
@ -27270,6 +27630,19 @@
"requires": { "requires": {
"async-exit-hook": "^2.0.1", "async-exit-hook": "^2.0.1",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
},
"dependencies": {
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
}
} }
}, },
"terser": { "terser": {
@ -27572,8 +27945,9 @@
"version": "1.0.0" "version": "1.0.0"
}, },
"update-browserslist-db": { "update-browserslist-db": {
"version": "1.0.10", "version": "1.0.13",
"dev": true, "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"requires": { "requires": {
"escalade": "^3.1.1", "escalade": "^3.1.1",
"picocolors": "^1.0.0" "picocolors": "^1.0.0"

View File

@ -22,7 +22,8 @@
"jest": "^29.2.0", "jest": "^29.2.0",
"pretty-quick": "^3.1.3", "pretty-quick": "^3.1.3",
"randomstring": "^1.2.2", "randomstring": "^1.2.2",
"ts-jest": "^29.0.5" "ts-jest": "^29.0.5",
"fs-extra": "^11.1.1"
}, },
"scripts": { "scripts": {
"dev:web": "npm run dev --workspace=packages/bruno-app", "dev:web": "npm run dev --workspace=packages/bruno-app",
@ -31,6 +32,12 @@
"dev:electron": "npm run dev --workspace=packages/bruno-electron", "dev:electron": "npm run dev --workspace=packages/bruno-electron",
"build:bruno-query": "npm run build --workspace=packages/bruno-query", "build:bruno-query": "npm run build --workspace=packages/bruno-query",
"build:graphql-docs": "npm run build --workspace=packages/bruno-graphql-docs", "build:graphql-docs": "npm run build --workspace=packages/bruno-graphql-docs",
"build:electron": "node ./scripts/build-electron.js",
"build:electron:mac": "./scripts/build-electron.sh mac",
"build:electron:win": "./scripts/build-electron.sh win",
"build:electron:linux": "./scripts/build-electron.sh linux",
"build:electron:deb": "./scripts/build-electron.sh deb",
"build:electron:rpm": "./scripts/build-electron.sh rpm",
"build:electron:snap": "./scripts/build-electron.sh snap", "build:electron:snap": "./scripts/build-electron.sh snap",
"test:e2e": "npx playwright test", "test:e2e": "npx playwright test",
"test:report": "npx playwright show-report", "test:report": "npx playwright show-report",

View File

@ -0,0 +1,18 @@
import styled from 'styled-components';
const StyledWrapper = styled.div`
div.CodeMirror {
/* todo: find a better way */
height: calc(100vh - 240px);
.CodeMirror-scroll {
padding-bottom: 0px;
}
}
.editing-mode {
cursor: pointer;
color: ${(props) => props.theme.colors.text.yellow};
}
`;
export default StyledWrapper;

View File

@ -0,0 +1,55 @@
import 'github-markdown-css/github-markdown.css';
import get from 'lodash/get';
import { updateCollectionDocs } from 'providers/ReduxStore/slices/collections';
import { useTheme } from 'providers/Theme/index';
import { useState } from 'react';
import { useDispatch } from 'react-redux';
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
import Markdown from 'components/MarkDown';
import CodeEditor from 'components/CodeEditor';
import StyledWrapper from './StyledWrapper';
const Docs = ({ collection }) => {
const dispatch = useDispatch();
const { storedTheme } = useTheme();
const [isEditing, setIsEditing] = useState(false);
const docs = get(collection, 'root.docs', '');
const toggleViewMode = () => {
setIsEditing((prev) => !prev);
};
const onEdit = (value) => {
dispatch(
updateCollectionDocs({
collectionUid: collection.uid,
docs: value
})
);
};
const onSave = () => dispatch(saveCollectionRoot(collection.uid));
return (
<StyledWrapper className="mt-1 h-full w-full relative">
<div className="editing-mode mb-2" role="tab" onClick={toggleViewMode}>
{isEditing ? 'Preview' : 'Edit'}
</div>
{isEditing ? (
<CodeEditor
collection={collection}
theme={storedTheme}
value={docs || ''}
onEdit={onEdit}
onSave={onSave}
mode="application/text"
/>
) : (
<Markdown onDoubleClick={toggleViewMode} content={docs} />
)}
</StyledWrapper>
);
};
export default Docs;

View File

@ -11,6 +11,7 @@ import Headers from './Headers';
import Auth from './Auth'; import Auth from './Auth';
import Script from './Script'; import Script from './Script';
import Test from './Tests'; import Test from './Tests';
import Docs from './Docs';
import StyledWrapper from './StyledWrapper'; import StyledWrapper from './StyledWrapper';
const CollectionSettings = ({ collection }) => { const CollectionSettings = ({ collection }) => {
@ -54,6 +55,9 @@ const CollectionSettings = ({ collection }) => {
case 'proxy': { case 'proxy': {
return <ProxySettings proxyConfig={proxyConfig} onUpdate={onProxySettingsUpdate} />; return <ProxySettings proxyConfig={proxyConfig} onUpdate={onProxySettingsUpdate} />;
} }
case 'docs': {
return <Docs collection={collection} />;
}
} }
}; };
@ -81,8 +85,11 @@ const CollectionSettings = ({ collection }) => {
<div className={getTabClassname('proxy')} role="tab" onClick={() => setTab('proxy')}> <div className={getTabClassname('proxy')} role="tab" onClick={() => setTab('proxy')}>
Proxy Proxy
</div> </div>
<div className={getTabClassname('docs')} role="tab" onClick={() => setTab('docs')}>
Docs
</div> </div>
<section className={`flex ${['auth', 'script'].includes(tab) ? '' : 'mt-4'}`}>{getTabPanel(tab)}</section> </div>
<section className={`flex ${['auth', 'script', 'docs'].includes(tab) ? '' : 'mt-4'}`}>{getTabPanel(tab)}</section>
</StyledWrapper> </StyledWrapper>
); );
}; };

View File

@ -1,4 +1,7 @@
import React from 'react'; import React from 'react';
import { useTheme } from 'providers/Theme/index';
import darkTheme from 'themes/dark';
import lightTheme from 'themes/light';
/** /**
* Assertion operators * Assertion operators
@ -76,10 +79,16 @@ const AssertionOperator = ({ operator, onChange }) => {
} }
}; };
const { storedTheme } = useTheme();
return ( return (
<select value={operator} onChange={handleChange} className="mousetrap"> <select value={operator} onChange={handleChange} className="mousetrap">
{operators.map((operator) => ( {operators.map((operator) => (
<option key={operator} value={operator}> <option
style={{ backgroundColor: storedTheme === 'dark' ? darkTheme.bg : lightTheme.bg }}
key={operator}
value={operator}
>
{getLabel(operator)} {getLabel(operator)}
</option> </option>
))} ))}

View File

@ -17,7 +17,7 @@ const ResponseLoadingOverlay = ({ item, collection }) => {
<div className="overlay"> <div className="overlay">
<div style={{ marginBottom: 15, fontSize: 26 }}> <div style={{ marginBottom: 15, fontSize: 26 }}>
<div style={{ display: 'inline-block', fontSize: 20, marginLeft: 5, marginRight: 5 }}> <div style={{ display: 'inline-block', fontSize: 20, marginLeft: 5, marginRight: 5 }}>
<StopWatch /> <StopWatch requestTimestamp={item?.requestSent?.timestamp} />
</div> </div>
</div> </div>
<IconRefresh size={24} className="loading-icon" /> <IconRefresh size={24} className="loading-icon" />

View File

@ -6,6 +6,7 @@ const Wrapper = styled.div`
align-self: stretch; align-self: stretch;
align-items: center; align-items: center;
min-width: 34px; min-width: 34px;
flex-shrink: 0;
span { span {
position: relative; position: relative;

View File

@ -12,6 +12,10 @@ const Wrapper = styled.div`
fill: rgb(140, 140, 140); fill: rgb(140, 140, 140);
} }
} }
span.close-icon {
color: ${(props) => props.theme.colors.text.muted};
}
`; `;
export default Wrapper; export default Wrapper;

View File

@ -5,7 +5,8 @@ import {
IconFolders, IconFolders,
IconArrowsSort, IconArrowsSort,
IconSortAscendingLetters, IconSortAscendingLetters,
IconSortDescendingLetters IconSortDescendingLetters,
IconX
} from '@tabler/icons'; } from '@tabler/icons';
import Collection from '../Collections/Collection'; import Collection from '../Collections/Collection';
import CreateCollection from '../CreateCollection'; import CreateCollection from '../CreateCollection';
@ -97,8 +98,21 @@ const Collections = () => {
spellCheck="false" spellCheck="false"
className="block w-full pl-7 py-1 sm:text-sm" className="block w-full pl-7 py-1 sm:text-sm"
placeholder="search" placeholder="search"
value={searchText}
onChange={(e) => setSearchText(e.target.value.toLowerCase())} onChange={(e) => setSearchText(e.target.value.toLowerCase())}
/> />
{searchText !== '' && (
<div className="absolute inset-y-0 right-0 pr-4 flex items-center">
<span
className="close-icon"
onClick={() => {
setSearchText('');
}}
>
<IconX size={16} strokeWidth={1.5} className="cursor-pointer" />
</span>
</div>
)}
</div> </div>
<div className="mt-4 flex flex-col overflow-y-auto absolute top-32 bottom-10 left-0 right-0"> <div className="mt-4 flex flex-col overflow-y-auto absolute top-32 bottom-10 left-0 right-0">

View File

@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
const StopWatch = () => { const StopWatch = ({ requestTimestamp }) => {
const [milliseconds, setMilliseconds] = useState(0); const [milliseconds, setMilliseconds] = useState(0);
const tickInterval = 200; const tickInterval = 200;
@ -15,6 +15,10 @@ const StopWatch = () => {
}; };
}); });
useEffect(() => {
setMilliseconds(Date.now() - requestTimestamp);
}, [requestTimestamp]);
if (milliseconds < 1000) { if (milliseconds < 1000) {
return 'Loading...'; return 'Loading...';
} }

View File

@ -996,7 +996,6 @@ export const collectionsSlice = createSlice({
set(collection, 'root.request.script.res', action.payload.script); set(collection, 'root.request.script.res', action.payload.script);
} }
}, },
updateCollectionTests: (state, action) => { updateCollectionTests: (state, action) => {
const collection = findCollectionByUid(state.collections, action.payload.collectionUid); const collection = findCollectionByUid(state.collections, action.payload.collectionUid);
@ -1004,6 +1003,13 @@ export const collectionsSlice = createSlice({
set(collection, 'root.request.tests', action.payload.tests); set(collection, 'root.request.tests', action.payload.tests);
} }
}, },
updateCollectionDocs: (state, action) => {
const collection = findCollectionByUid(state.collections, action.payload.collectionUid);
if (collection) {
set(collection, 'root.docs', action.payload.docs);
}
},
addCollectionHeader: (state, action) => { addCollectionHeader: (state, action) => {
const collection = findCollectionByUid(state.collections, action.payload.collectionUid); const collection = findCollectionByUid(state.collections, action.payload.collectionUid);
@ -1417,6 +1423,7 @@ export const {
updateCollectionRequestScript, updateCollectionRequestScript,
updateCollectionResponseScript, updateCollectionResponseScript,
updateCollectionTests, updateCollectionTests,
updateCollectionDocs,
collectionAddFileEvent, collectionAddFileEvent,
collectionAddDirectoryEvent, collectionAddDirectoryEvent,
collectionChangeFileEvent, collectionChangeFileEvent,

View File

@ -9,7 +9,11 @@
"scripts": { "scripts": {
"clean": "rimraf dist", "clean": "rimraf dist",
"dev": "electron .", "dev": "electron .",
"dist": "electron-builder --mac --config electron-builder-config.js", "dist:mac": "electron-builder --mac --config electron-builder-config.js",
"dist:win": "electron-builder --win --config electron-builder-config.js",
"dist:linux": "electron-builder --linux AppImage --config electron-builder-config.js",
"dist:deb": "electron-builder --linux deb --config electron-builder-config.js",
"dist:rpm": "electron-builder --linux rpm --config electron-builder-config.js",
"dist:snap": "electron-builder --linux snap --config electron-builder-config.js", "dist:snap": "electron-builder --linux snap --config electron-builder-config.js",
"pack": "electron-builder --dir", "pack": "electron-builder --dir",
"test": "jest" "test": "jest"

View File

@ -20,7 +20,8 @@ const collectionBruToJson = (bru) => {
script: _.get(json, 'script', {}), script: _.get(json, 'script', {}),
vars: _.get(json, 'vars', {}), vars: _.get(json, 'vars', {}),
tests: _.get(json, 'tests', '') tests: _.get(json, 'tests', '')
} },
docs: _.get(json, 'docs', '')
}; };
return transformedJson; return transformedJson;
@ -43,7 +44,8 @@ const jsonToCollectionBru = (json) => {
req: _.get(json, 'request.vars.req', []), req: _.get(json, 'request.vars.req', []),
res: _.get(json, 'request.vars.req', []) res: _.get(json, 'request.vars.req', [])
}, },
tests: _.get(json, 'request.tests', '') tests: _.get(json, 'request.tests', ''),
docs: _.get(json, 'docs', '')
}; };
return _jsonToCollectionBru(collectionBruJson); return _jsonToCollectionBru(collectionBruJson);

View File

@ -195,7 +195,8 @@ const registerNetworkIpc = (mainWindow) => {
url: request.url, url: request.url,
method: request.method, method: request.method,
headers: request.headers, headers: request.headers,
data: safeParseJSON(safeStringifyJSON(request.data)) data: safeParseJSON(safeStringifyJSON(request.data)),
timestamp: Date.now()
}, },
collectionUid, collectionUid,
itemUid: item.uid, itemUid: item.uid,

98
scripts/build-electron.js Normal file
View File

@ -0,0 +1,98 @@
const os = require('os');
const fs = require('fs-extra');
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function deleteFileIfExists(filePath) {
try {
const exists = await fs.pathExists(filePath);
if (exists) {
await fs.remove(filePath);
console.log(`${filePath} has been successfully deleted.`);
} else {
console.log(`${filePath} does not exist.`);
}
} catch (err) {
console.error(`Error while checking the existence of ${filePath}: ${err}`);
}
}
async function copyFolderIfExists(srcPath, destPath) {
try {
const exists = await fs.pathExists(srcPath);
if (exists) {
await fs.copy(srcPath, destPath);
console.log(`${srcPath} has been successfully copied.`);
} else {
console.log(`${srcPath} was not copied as it does not exist.`);
}
} catch (err) {
console.error(`Error while checking the existence of ${srcPath}: ${err}`);
}
}
async function removeSourceMapFiles(directory) {
try {
const files = await fs.readdir(directory);
for (const file of files) {
if (file.endsWith('.map')) {
const filePath = path.join(directory, file);
await fs.remove(filePath);
console.log(`${filePath} has been successfully deleted.`);
}
}
} catch (error) {
console.error(`Error while deleting .map files: ${error}`);
}
}
async function main() {
try {
// Remove out directory
await deleteFileIfExists('packages/bruno-electron/out');
// Remove web directory
await deleteFileIfExists('packages/bruno-electron/web');
// Create a new web directory
await fs.ensureDir('packages/bruno-electron/web');
console.log('The directory has been created successfully!');
// Copy build
await copyFolderIfExists('packages/bruno-app/out', 'packages/bruno-electron/web');
// Change paths in next
const files = await fs.readdir('packages/bruno-electron/web');
for (const file of files) {
if (file.endsWith('.html')) {
let content = await fs.readFile(`packages/bruno-electron/web/${file}`, 'utf8');
content = content.replace(/\/_next\//g, '/_next/');
await fs.writeFile(`packages/bruno-electron/web/${file}`, content);
}
}
// Remove sourcemaps
await removeSourceMapFiles('packages/bruno-electron/web')
// Run npm dist command
console.log('Building the Electron distribution');
// Determine the OS and set the appropriate argument
let osArg;
if (os.platform() === 'win32') {
osArg = 'win';
} else if (os.platform() === 'darwin') {
osArg = 'mac';
} else {
osArg = 'linux';
}
await exec(`npm run dist-${osArg} --workspace=packages/bruno-electron`);
} catch (error) {
console.error('An error occurred:', error);
}
}
main();

View File

@ -22,6 +22,21 @@ find packages/bruno-electron/web -name '*.map' -type f -delete
if [ "$1" == "snap" ]; then if [ "$1" == "snap" ]; then
echo "Building snap distribution" echo "Building snap distribution"
npm run dist:snap --workspace=packages/bruno-electron npm run dist:snap --workspace=packages/bruno-electron
elif [ "$1" == "mac" ]; then
echo "Building mac distribution"
npm run dist:mac --workspace=packages/bruno-electron
elif [ "$1" == "win" ]; then
echo "Building windows distribution"
npm run dist:win --workspace=packages/bruno-electron
elif [ "$1" == "deb" ]; then
echo "Building debian distribution"
npm run dist:deb --workspace=packages/bruno-electron
elif [ "$1" == "rpm" ]; then
echo "Building rpm distribution"
npm run dist:rpm --workspace=packages/bruno-electron
elif [ "$1" == "linux" ]; then
echo "Building linux distribution"
npm run dist:linux --workspace=packages/bruno-electron
else else
echo "Please pass a build distribution type" echo "Please pass a build distribution type"
fi fi